如何在prolog中正确表达不平等?

时间:2015-10-31 04:44:35

标签: prolog prolog-dif

TL; DR: sibling(a,X)成功回答X = a,但sibling(a,a)失败。

我有以下Prolog文件:

children(a, c).
children(a, d).
children(b, c).
children(b, d).

sibling(X, Y) :-
   X \== Y, A \== B,
   children(X, A), children(X, B),
   children(Y, A), children(Y, B).

对我来说似乎很清楚,如果他们的父母是一样的话,两个人都是兄弟姐妹。此外,一个人不是他们自己的兄弟。

但是当我尝试在GNU Prolog上运行一些查询时,我得到了一些奇怪的结果:

| ?- sibling(a, b).

true ? a

true

true

yes

这是预期的行为。 ab是兄弟姐妹。有三个结果,有点奇怪,但我认为Prolog绑定A = c, B = dA = d, B = c

| ?- sibling(a, a).

no

我认为这意味着aa不是兄弟姐妹。

| ?- sibling(a, X).

X = a ? a

X = b

X = a

X = b

X = a

X = b

X = a

X = b

(15 ms) yes

这就是我遇到的问题:它显示X = a,表示sibling(a,a)为真,但sibling(a,a) 在上一次查询中失败

我觉得我不理解\==在Prolog中实际做了什么。

发生了什么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

TL; DR:使用 - 或iso_dif/2(在符合的符合的系统上)!

好问题,+ 1!

事实上,这是我问自己的问题,答案与有关:逻辑纯度是什么的核心方面 使Prolog成为一种如此特殊的语言,因为它使您能够:

  • describe-not prescribe
  • 编写关系代码 - 而不仅仅是功能
  • 在问题/解决方案方面思考 - 而不是搜索过程本身的各个步骤
  • 在更高层次上运作 - 不会迷失在细节之中

与许多其他编程语言不同,Prolog程序具有过程语义(定义执行步骤及其顺序)和声明性语义(允许您声明应该保持的关系,并且让Prolog处理器找到正确的执行方式本身)。

但是,要注意: Prolog有一些功能,使用时, ruin 声明性语义。为了防止这种情况,请尝试将您的应用程序分为两部分:不纯的shell 用于处理副作用(输入/输出) 逻辑纯碱< / strong>包含纯粹的单调Prolog代码。

答案 1 :(得分:2)

尝试将不等式移到谓词的末尾。也许它给你真实,因为它还没有实例化。

sibling(X,Y):- children(X, A), children(X, B),
               children(Y, A), children(Y, B),
               X \== Y, A \== B.