我是新来的Prolog,并使用GNU Prolog的,所以不允许有CLP(FD)。 我正在试图做的是对于给定的整数N,生成具有1〜N.所以设置(3,T)元素的列表。 将输出T = [1,2,3]。 这是我到目前为止有:
set(0,[]).
set(N,T):-set(N-1,T1),append(T1,[N],T).
当我尝试设置(2,T),它崩溃。 我调试与跟踪,并发现它不是评估N-1,而是做的N- 1-1-1 ...
任何人都可以告诉我怎么解决这个问题? 谢谢。
我是新来的Prolog,并使用GNU Prolog的,所以不允许有CLP(FD)。 我正在试图做的是对于给定的整数N,生成具有1〜N.所以设置(3,T)元素的列表。 将输出T = [1,2,3]。 这是我到目前为止有:
set(0,[]).
set(N,T):-set(N-1,T1),append(T1,[N],T).
当我尝试设置(2,T),它崩溃。 我调试与跟踪,并发现它不是评估N-1,而是做的N- 1-1-1 ...
任何人都可以告诉我怎么解决这个问题? 谢谢。
它应该是:
set(N,T):- N2 is N-1, set(N2,T1), append(T1,[N],T).
算术运算是通过使用执行is/2
。 N-1
是一个速记-(N,1)
就像N2 is N-1
是简写is(N2, N-1)
所以你刚刚创造无限的树-(-(-(-(...),1),1,1,1)
小教育笔记:
如果你想set/2
是正确的关系,所以它可以回答这样的疑问set(3,X)
set(X, [1,2,3])
和set(X,Y)
没有错误,那么你应该写这个谓词那样:
set(0, []).
set(Value, List) :-
length(List, Value),
append(ShorterList, [Value], List),
ValueMinusOne is Value - 1,
set(ValueMinusOne, ShorterList).
算术运算的这样的结果是始终可以得到由于输入值(列表的lenght)要么明确给出或从生成的length/1
。
n_ups(N, Xs) :-
length(Xs, N),
numbered_from(Xs, 1).
numbered_from([], _).
numbered_from([I0|Is], I0) :-
I1 is I0+1,
numbered_from(Is, I1).
事实上,复杂性被隐藏在length/2
。