如何在序言中正确表达不等式?

par*_*ent 5 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).
Run Code Online (Sandbox Code Playgroud)

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

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

| ?- sibling(a, b).

true ? a

true

true

yes
Run Code Online (Sandbox Code Playgroud)

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

| ?- sibling(a, a).

no
Run Code Online (Sandbox Code Playgroud)

我认为这意味着a并且a不是兄弟姐妹。

| ?- sibling(a, X).

X = a ? a

X = b

X = a

X = b

X = a

X = b

X = a

X = b

(15 ms) yes
Run Code Online (Sandbox Code Playgroud)

这就是我卡住的地方:它说X = a,这意味着sibling(a,a)是真的,但sibling(a,a) 失败了在上一个查询中了!

我觉得我不明白什么 \==Prolog 中的实际作用。

发生了什么,我该如何解决?

leo*_*oxs 2

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

sibling(X,Y):- children(X, A), children(X, B),
               children(Y, A), children(Y, B),
               X \== Y, A \== B.
Run Code Online (Sandbox Code Playgroud)

  • 我认为序言中的顺序并不重要,但事实证明它确实重要。谢谢你! (2认同)