更改谓词更改中的参数顺序

时间:2015-10-19 15:39:24

标签: prolog

您好我是Prolog的新手,有些事情让我很困惑。

所以我有这个事实清单和一个预测:

    parent(gerlinde,mark).
    parent(gerlinde,lena).
    .
    .
    (and so on)
    female(gerlinde).
    .
    .
    (and so on)
    male(mark).

    sister(S,X) :- parent(F,S),parent(F,X),male(F),
                   parent(M,S),parent(M,X),female(M),female(S),S\==X.

所以,如果我这样做? - 分析(S,X)。我得到的答案是肯定的,没有答案S是她自己的姐妹(S = X)。但是,如果我改变了这样的顺序:

    sister(S,X) :- S\==X,parent(F,S),parent(F,X),male(F),
                   parent(M,S),parent(M,X),female(M),female(S).

或者那样:

    sister(S,X) :- parent(F,S),S\==X,parent(F,X),male(F),
                   parent(M,S),parent(M,X),female(M),female(S).
然后我突然得到答案S = X.那为什么会这样呢?根据我的理解,两个谓词之间应该没有区别。

1 个答案:

答案 0 :(得分:0)

这是因为X\==S\+X == S相同,而\+T表示“T”无法证明'。所以,在你的第二个谓词中:

 sister(S,X) :- S\==X,parent(F,S),parent(F,X),male(F),
                parent(M,S),parent(M,X),female(M),female(S).

调用S\==X时, S X 都是变量。因此,它无法被证明'那个S == X并且这个目标成功了。

然后,当继续评估谓词时,parent(F,S)S - 在您的情况下,markparent(F,X)。 然后,Xmark - 再次发送到S!并且永远不再需要XS = X = mark不同。当然,使用mark谓词失败,因为female(S)不是女性(lena失败)。但不是def match_first_letter(G, F): for i in F: if i.F[0] == G: return F ;她确实会成为她自己的妹妹。