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