我是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).
当我尝试set(2,T)时,它会崩溃。我用跟踪调试,发现它没有评估N-1,而是做N-1-1-1 ...
任何人都可以告诉我如何解决这个问题? 谢谢。
答案 0 :(得分:2)
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
内。
答案 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)
之类的查询,那么您应该以这样的方式编写此谓词:< / p>
set(0, []).
set(Value, List) :-
length(List, Value),
append(ShorterList, [Value], List),
ValueMinusOne is Value - 1,
set(ValueMinusOne, ShorterList).
这样就可以获得算术运算的结果,因为输入值(列表的长度)是从length/1
明确给出或生成的。