生成一系列整数 -- "out of local stack" [初学者]

generate a range of ints -- "out of local stack" [beginner]

gen(N,R):

R 是 0 到 N-1 之间的值,按顺序排列。 N非零正整数。 N 总会给的。

例如:?- genN(2,R)。给出 R=0;R=1. 我是这样实现的,但它有 "out of local static error":

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?

结果:

 ?- genN2(3,R).  
    R = 0 ;
    R = 1 ;
    R = 2 ;
    ERROR: Out of local stack

要了解您的程序为何不终止,请使用 。为此,我们将插入一些额外的目标 false,以帮助理解为什么您添加的目标不相关。如果此结果片段没有终止,那么您的原始程序也不会终止。如您所见,那部分没有发生太多事情。事实上你的程序将终止 never.

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).