序言分配给一个变量整数(Prolog Assigning integer to a variable

2019-10-20 00:06发布

我是新来的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 ...

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

Answer 1:

它应该是:

set(N,T):- N2 is N-1, set(N2,T1), append(T1,[N],T).

算术运算是通过使用执行is/2N-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



Answer 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



文章来源: Prolog Assigning integer to a variable
标签: prolog