生成一系列的整数 - “超出本地堆栈”[初学者]

时间:2015-07-16 21:00:28

标签: prolog failure-slice

gen(N,R)

R按顺序为0到N-1之间的值。 N非零正int。 <{1}}永远都会被给予。

例如:N。给?- genN(2,R)我实现了这样,但它有“超出局部静态错误”:

R=0;R=1.

结果:

gen(X,0).
gen(X,R) :-
  gen(X,R1),
  R is R1+1,
  R<X,       % why this line
  R>=0.      % and this line can't keep the range successfully?

1 个答案:

答案 0 :(得分:3)

要了解您的程序未终止的原因,请使用。为此,我们将添加一些额外的目标 false ,这有助于了解您添加的目标无关紧要的原因。如果此结果片段未终止,则原始程序也不会终止。如你所见,那部分没有太多发生。事实上,您的计划将终止从不

gen(_X,0) :- false.
gen(X,R) :-
  gen(X,R1), false,
  R is R1+1,
  R<X,
  R>=0.

(还有一些问题:对于像gen(-1,0)这样的目标,你的定义也是如此,这可能不是你想要的。)

一次性解决此问题的最佳方法是使用而不是更复杂的方法来处理(is)/2或仅使用between/3

gen(N0, R) :-
   N1 is N0-1,
   between(0, N1, R).