【发布时间】:2015-10-31 04:44:34
【问题描述】:
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
这是预期的行为。 a 和 b 是兄弟姐妹。有三个结果,这有点奇怪,但我假设 Prolog 正在绑定 A = c, B = d 和 A = d, B = c。
| ?- sibling(a, a).
no
我认为这意味着 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
这就是我卡住的地方:它说X = a,这意味着sibling(a,a) 是真的,但是sibling(a,a) 在上一个查询中失败!
我觉得我不明白 \== 在 Prolog 中的实际作用。
发生了什么,我该如何解决?
【问题讨论】:
-
见this answer。如果您使用 GNU,请使用 that definition of
dif/2。
标签: prolog prolog-dif