我正在尝试创建一个具有以下规范的程序:
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.
当我运行第一个fill语句时,我有以下代码让我“摆脱本地堆栈错误”。是什么导致了它?
fill(0,_,[]).
fill(N,X,R) :- N1 is N-1, fill(N1,X,R), append(R,[X], R).
答案 0 :(得分:2)
原因是:即使N = 0,也使用第二个claused。
这会导致一系列调用fill(0,...)=> fill(-1,....)=> fill(-2,....)=> ....
补救措施:在第一个条款中添加一个剪切应该避免这种情况。