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?
答案 0 :(得分:3)
要了解您的程序未终止的原因,请使用failure-slice。为此,我们将添加一些额外的目标 false
,这有助于了解您添加的目标无关紧要的原因。如果此结果片段未终止,则原始程序也不会终止。如你所见,那部分没有太多发生。事实上,您的计划将终止从不。
gen(_X,0) :- false. gen(X,R) :- gen(X,R1), false,R is R1+1,R<X,R>=0.
(还有一些问题:对于像gen(-1,0)
这样的目标,你的定义也是如此,这可能不是你想要的。)
一次性解决此问题的最佳方法是使用clpfd而不是更复杂的方法来处理(is)/2
或仅使用between/3
:
gen(N0, R) :-
N1 is N0-1,
between(0, N1, R).