经过多年对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)。
返回一个空列表。
为什么?
答案 0 :(得分:3)
要证明sibling(clara, X)
,首先需要证明clara \= x
。但这不起作用,因为它减少到\+ clara = X
,\+
是臭名昭着的negation as failure:Prolog试图证明clara = X
成功,并得出结论{{1因此必须是假的。
您应该重新安排程序以进行clara \= X
检查,而不是先检查,或使用\=
。