PROLOG - 子句对常量返回true,但是找不到变量的解?

时间:2013-08-24 21:06:45

标签: prolog logic prolog-dif

经过多年对PROLOG编程语言的禁欲,我试图再次进入它。 并且在那里,有些事让我感到困惑。

(我在Windows上使用SWI prolog 6.4.1。)

考虑以下定义:

father(jack, clara).
father(jack, sophie).

mother(angela,clara).
mother(angela,sophie).

parent(A, B) :- father(A, B).
parent(A, B) :- mother(A, B).

sibling( A, B ) :-
    A \= B,
    parent(P, A),
    parent(P, B).

现在,如果我“问”翻译: 兄弟姐妹(克拉拉,索菲)。

true 就是答案。

但是如果我试图让兄弟姐妹得到例如克拉拉: 兄弟姐妹(克拉拉,X)。

答案只是 false 。 就像 findall(X,兄弟(克拉拉,X),L)。

返回一个空列表。

为什么?

1 个答案:

答案 0 :(得分:3)

要证明sibling(clara, X),首先需要证明clara \= x。但这不起作用,因为它减少到\+ clara = X\+是臭名昭着的negation as failure:Prolog试图证明clara = X成功,并得出结论{{1因此必须是假的。

您应该重新安排程序以进行clara \= X检查,而不是先检查,或使用\=