我有以下序言代码段:
num(0).
num(X) :- num(X1), X is X1 + 1.
fact(0,1) :-!.
fact(X,Y) :- X1 is X-1, fact(X1,Y1), !, Y is Y1 * X.
fact(X) :- num(Y), fact(Y,X).
有人可以解释为什么以下命令导致堆栈溢出吗?提前致谢。
fact(6).
最佳答案
首先,看一下规则
num(0).
num(X) :- num(X1), X is X1 + 1.
谓词
num(Y)
将立即对Y = 0
有效。因此,规则
fact(X) :- num(Y), fact(Y,X).
可以简化为
fact(X) :- fact(0,X).
将会找到
fact(0,1)
的匹配项。对于X = 6
,发生的是,因为没有规则为fact(0,6)
定义谓词,所以搜索从fact(-1,V1)
开始,然后是fact(-2,V2)
等...直到匹配fact(-value, Var)
,其中本地结果将是Var。这不可能发生,并且无限循环会消耗整个堆栈,直到触发错误为止。
关于prolog - 为什么此命令会导致序言中的堆栈溢出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4836146/