用递归规则编写prolog? "错误:超出本地堆栈"

时间:2015-02-26 11:01:54

标签: recursion prolog transitive-closure

鉴于以下事实:

  • 杰克比尼克聪明。
  • Nik比Wes聪明
  • Wes比聪明 DIK

写一个递归程序,确定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:超出本地堆栈" 我需要输出显示" False"。我如何解决它?

由于

1 个答案:

答案 0 :(得分:0)

您的代码可以证明

        ?- smarter(jake, dik).

因为使用X = jake,Y = dik它发现Z = nik更聪明(jake,nik)(这是一个事实)然后更聪明(nik,dik),(这被证明考虑X1 = nik, Y1 = dik,Z1 = wes)。

然而,为了证明

       ?- smarter(dik, jake).

X = dik,Y = jake,prolog需要Z这样聪明(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).

这应该有用。