首页 文章

我对Prolog中的平等和统一缺少什么?

提问于
浏览
3

我正在通过Clocksin和Mellish努力尝试最终超越仅仅涉及Prolog . FWIW,我正在运行SWI-Prolog:

适用于x86_64-linux的SWI-Prolog版本7.2.3

无论如何,我实现了diff / 2谓词作为练习1.4的一部分 . 谓词很简单:

diff(X,Y) :- X \== Y.

它在sister_of谓词中使用时有效,如下所示:

sister_of(X,Y) :- 
    female(X),
    diff(X,Y),
    parents(X, Mum, Dad ),
    parents(Y, Mum, Dad ).

在此,假设必要的额外事实,这样做:

?- sister_of(alice,alice).

按预期返回false . 但这就是问题所在 . 如果我这样做:

?- sister_of(alice, Who).

(再次,鉴于必要的额外事实)我得到

谁=爱德华;谁=爱丽丝;假

尽管已经如上所示,姐妹的谓词并没有将爱丽丝视为自己的妹妹 .

另一方面,如果我使用SWI提供的dif / 2谓词,那么一切都按我天真的预期方式工作 .

任何人都可以解释为什么会发生这种情况,以及为什么我的差异实现不能按照我期望的方式工作,在我要求查询的其他统一的情况下?

我正在使用的整个源文件可以找到here

任何帮助深表感谢 .

1 回答

  • 1

    如你所知,问题源于平等(或更确切地说,不平等)与统一之间的相互作用 . 请注意,在 sister_of 的定义中,首先找到 X 的候选值,然后尝试将 Y 约束为不同,但 Y 仍然是未实例化的逻辑变量,并且检查总是会成功,如 diff(alice, Y) 将 . 以下约束,包括给出 Y 具体值的最后一个约束,来得太晚了 .

    通常,您需要做的是确保在进行不等式检查时,所有变量都会被实例化 . 否定是Prolog的一个非逻辑特征,因此有潜在危险,但检查两个基本术语是否不相等是安全的 .

相关问题