Writing prolog with recursive rules? "ERROR: Out of local stack"

Writing prolog with recursive rules? "ERROR: Out of local stack"

鉴于以下事实:

编写一个递归程序,确定 Jake 的比 Dik 的聪明。

我的解决方案是:

smarter(jake, nik).
smarter(nik, wes).
smarter(wes, dik).
smarter(X, Y) :-
    smarter(X, Z),
    smarter(Z, Y).

输出:

?- smarter(jake, dik).
True

但是当我交换它时:

?- smarter(dik, jake)

输出将显示"ERROR: Out of local stack" 我需要输出显示 "False"。我如何解决它?

谢谢

你的代码可以证明

        ?- smarter(jake, dik).

因为使用 X = jake, Y = dik 它找到了一个 Z=nik 这样 smarter(jake,nik) (这是事实)然后 smarter(nik,dik),(考虑到 X1= 证明了这一点nik, Y1=dik, Z1=wes).

不过,为了证明

       ?- smarter(dik, jake).

X =dik, Y=jake, prolog 需要一个 Z 使得 smarter(dik, Z)。然而,没有事实更聪明(dik,Z)。然后,再次应用该规则...并且您有循环。

修复(至少这个特定示例)的想法是区分事实和规则:

isSmarter(jake, nik).
isSmarter(nik, wes).
isSmarter(wes, dik).

smarter(X, Y) :- isSmarter(X,Y).

smarter(X, Y) :-
    isSmarter(X, Z),
    smarter(Z, Y).

这应该有效。