我想创建一个由N
元素组成的列表。我写了以下代码:
DOMAINS
list = integer*
PREDICATES
create(integer, integer, list)
CLAUSES
create(_, 0, []).
create(Start, End, [Start|T]):-
Start < End + 1,!,
Counter = Start + 1,
create(Counter, End, T).
GOAL
create(1, 5, L).
但它返回给我No Solution
。
另一方面,如果我像这样改变Counter
的方向:
DOMAINS
list = integer*
PREDICATES
create(integer,list)
CLAUSES
create(0,[]).
create(N,[N|T]):-
N > 0,
NN = N - 1,
create(NN,T).
GOAL
create(5,L).
它返回给我1个解决方案:L=[5,4,3,2,1]
。它运行良好,但不按顺序。我的第一个代码变体出了什么问题?
您需要对程序进行一些调整:
- stop子句从不统一,因为您不会递减期末
- 计数器需要计算为表达式Start+1,因此请使用is/2运算符
- 你不需要削减第二个条款,但需要削减第一个条款
程序:
create(X, X, [X]):- !.
create(Start, End, [Start|T]):-
Start == End,
Counter is Start + 1,
create(Counter, End, T).
咨询(您需要实例化列表,所以使用变量而不是空列表)
?- create(1,5, L).
L = [1, 2, 3, 4, 5].
在第一个变体中,基本情况是错误的:
create(_, 0, []).
这里的End
参数是0,但您的非基本规则永远不会修改End
,它在Start
上运行。因此,只要Start
等于End
:,您的基本情况就应该匹配
create(E, E, []).