2015-12-21 104 views
2
woman(lisa). 
woman(maggie). 

parents(lisa , homer, marge). 
parents(maggie, homer, marge). 

sister(X, Y) :- 
    X \= Y, 
    woman(X), 
    parents(X, P, M), 
    parents(Y, P, M). 

當我跑了下面的查詢,我沒有想到失敗(但得到它)。爲什麼這個prolog程序返回false?

?- sister(lisa, X). 
false.       % expected result: X = maggie 

爲什麼我看到這種行爲?

+0

'(\ =)/ 2'不是純邏輯關係。改爲使用純謂詞'dif/2'。 '(\ =)/ 2'的問題簡而言之:'? - X \ = Y,X = a,Y = b.'產生** false **,但是'X = a,Y = b,X \ = Y' **成功**。 – mat

回答

1

假設sister(X,Y)YX一個妹妹,你要woman(Y),不woman(X)

重新排列規則,使得它的工作(demo):

sister(X, Y):- 
    woman(Y), 
    parents(X, P, M), 
    parents(Y, P, M), 
    X \= Y. 

在這種重新安排重要的是,X \= Y項移動到一個點都XY後一直 - X作爲輸入被賦予規則,並且Y通過參與woman(Y)而被約束。

+0

@ManuelW。它不一定是最後一個,它可能是第二個(在[女性(Y)' - [demo](http://ideone.com/P8v8Lg))之後。重要的是,在不平等檢查之前,'Y'必須*綁定*。 – dasblinkenlight