3

gen(N,R)

R是 0 到 N-1 之间的值,按顺序。 N非零正整数。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?

结果:

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

1 回答 1

3

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

gen(_X,0) :-。
基因(X,R):-
  gen(X,R1), false ,
   R 是 R1+1 ,
   R<X ,
   R>=0

(还有一些问题:对于gen(-1,0)可能不是您想要的目标,您的定义也是正确的。)

一次解决这个问题的最好方法是使用而不是更复杂的处理(is)/2或简单地使用between/3

gen(N0, R) :-
   N1 is N0-1,
   between(0, N1, R).
于 2015-07-16T21:18:30.863 回答