1

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

现在,如果我“询问”解释器: 兄弟(克拉拉,苏菲)。

答案是真的

但是,如果我尝试获取例如 clara 的兄弟姐妹: 兄弟(clara,X)。

答案是错误的。就像 findall( X, 兄弟 (clara, X ), L )。

返回一个空列表。

为什么?

4

1 回答 1

3

要证明sibling(clara, X),首先需要证明clara \= x。但这不起作用,因为它归结为\+ clara = X, were\+是臭名昭著的否定失败:Prolog 试图证明clara = X,它成功了,并得出结论clara \= X一定是假的。

您应该重新排序程序以\=最后而不是首先进行检查,或者使用dif(clara, X).

于 2013-08-24T21:11:44.260 回答