我有以下序言代码段:

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/

10-11 15:17