Prolog将变量分配给变量

时间:2014-04-24 06:27:01

标签: prolog

我是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 ...

任何人都可以告诉我如何解决这个问题? 谢谢。

2 个答案:

答案 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-1is(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明确给出或生成的。