Prolog将整数赋值给变量

Prolog将整数赋值给变量,prolog,Prolog,我不熟悉Prolog,并且使用GNUProlog,所以不允许使用clp(fd)。我要做的是,对于一个给定的整数N,生成一个元素为1~N的列表。将输出T=[1,2,3]。 以下是我到目前为止的情况: set(0,[]). set(N,T):-set(N-1,T1),append(T1,[N],T). 当我尝试set(2,T)时,它崩溃了。我用trace进行了调试,发现它不是在评估N-1,而是在做N-1-1-1 谁能告诉我怎么解决这个问题? 谢谢。应该是: set(N,T):- N2 is N-1

我不熟悉Prolog,并且使用GNUProlog,所以不允许使用clp(fd)。我要做的是,对于一个给定的整数N,生成一个元素为1~N的列表。将输出T=[1,2,3]。 以下是我到目前为止的情况:

set(0,[]).
set(N,T):-set(N-1,T1),append(T1,[N],T).
当我尝试set(2,T)时,它崩溃了。我用trace进行了调试,发现它不是在评估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是N-1
is(N2,N-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).
这样,算术运算的结果总是可能得到的,因为输入值(列表的长度)要么是显式给定的,要么是从
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