生成一系列整数 -- "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
要了解您的程序为何不终止,请使用 failure-slice。为此,我们将插入一些额外的目标 false
,以帮助理解为什么您添加的目标不相关。如果此结果片段没有终止,那么您的原始程序也不会终止。如您所见,那部分没有发生太多事情。事实上你的程序将终止 never.
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).
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
要了解您的程序为何不终止,请使用 failure-slice。为此,我们将插入一些额外的目标 false
,以帮助理解为什么您添加的目标不相关。如果此结果片段没有终止,那么您的原始程序也不会终止。如您所见,那部分没有发生太多事情。事实上你的程序将终止 never.
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).