您好我是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.那为什么会这样呢?根据我的理解,两个谓词之间应该没有区别。
答案 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
- 在您的情况下,mark
。parent(F,X)
。
然后,X
将mark
- 再次发送到S
!并且永远不再需要X
与S = X = mark
不同。当然,使用mark
谓词失败,因为female(S)
不是女性(lena
失败)。但不是def match_first_letter(G, F):
for i in F:
if i.F[0] == G:
return F
;她确实会成为她自己的妹妹。