在对PROLOG编程语言进行了多年的禁欲之后,我正试图重新进入它。很快,就有什么东西把我弄糊涂了。
(我使用的是SWI序言6.4.1。在windows上)
考虑以下定义:
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).
现在,如果我"问"口译员:兄弟姐妹(clara,sophie)
true就是答案。
但是,如果我试图得到例如clara的兄弟姐妹:兄弟姐妹(clara,X)
答案只是错误。正如findall(X,同级(clara,X),L)
返回一个空列表。
为什么?
要证明sibling(clara, X)
,首先需要证明clara = x
。但这不起作用,因为它被简化为+ clara = X
,如果+
是臭名昭著的否定失败:Prolog试图证明clara = X
,它成功了,并得出结论,因此clara = X
一定是假的。
您应该重新排序程序以最后而不是第一次执行=
检查,或者使用dif(clara, X)
。