prolog - 超出本地堆栈错误

prolog - out of local stack error

我正在尝试创建一个具有以下规格的程序:

N=int
X=int
R=list containing N copies of X
• R=[] if N=0
• N will always be given
• Either X or R will be given

示例结果:

?- fill(4,2,R). 
R=[2,2,2,2].
?- fill(4,X,[2,2,2,2]). 
X=2.

当我 运行 第一个填充语句时,我有以下代码给我 'out of local stack error' 。是什么原因造成的?

fill(0,_,[]).
fill(N,X,R) :- N1 is N-1, fill(N1,X,R), append(R,[X], R).

原因是:即使N=0也使用第二个子句。

这导致调用链 fill(0,...) => fill(-1,....) => fill(-2, ....) => ....

补救措施:在第一个子句中添加一个 cut 应该可以避免这种情况。