1

鉴于以下事实:

  • 杰克比尼克聪明
  • 尼克比韦斯聪明
  • 韦斯比迪克聪明

编写一个递归程序,确定 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)

输出将显示“错误:超出本地堆栈”我需要输出显示“假”。我如何解决它?

谢谢

4

1 回答 1

0

你的代码可以证明

        ?- 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).

这应该有效。

于 2015-02-26T13:16:49.657 回答