PROLOG - 子句为常量返回 true,但找不到变量的解决方案?



在对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)

最新更新