2013-12-16 78 views
3

我是Prolog新手,遇到問題。當我對下面的數據詢問?-grandfather(daniel,george)時,我得到了錯誤的答案。我不明白爲什麼我的查詢不起作用。我還收到一條警告消息,指出[C,D]是單身變量。此警告不再發生。再次,我不確定爲什麼。prolog查詢中的單例變量

mother(jules,mary). 
mother(jules,martha). 
mother(jules,andy). 
mother(mary,annie). 
mother(mary,george). 
mother(martha,jesse). 
mother(martha,june). 
mother(june,camile). 
father(daniel,mary). 
father(daniel,martha). 
father(daniel,andy). 
father(adrian,annie). 
father(adrian,george). 
father(carlo,camile). 

brothers(A,B):-father(C,A),father(C,B);mother(D,A),mother(D,B). 

grandfather(E,W):-father(E,father(C,W));father(E,mother(D,W)). 

回答

1

您可以更簡單地寫你的祖父查詢:

grandfather(E,W):-father(E,A),father(A,W). 
grandfather(E,W):-father(E,A),mother(A,W). 

grandfather(E,W):-father(E,A),father(A,W);father(E,A),mother(A,W). 

現在:

6 ?- grandfather(daniel,george). 
true . 
7 ?- grandfather(daniel,annie). 
true . 

在這裏,我們要問的Prolog找到孫子E其中:E是A的父親,A是th e父親/母親W.

或更具體地說,檢查丹尼爾是否有一個名爲喬治的孫子。 Prolog檢查:丹尼爾有一個女兒瑪麗和瑪麗有一個兒子喬治。所以它會返回true。如果你trace呢,你看:

[trace] 3 ?- grandfather(daniel,george). 
    Call: (6) grandfather(daniel, george) ? creep 
    Call: (7) father(daniel, _G1931) ? creep 
    Exit: (7) father(daniel, mary) ? creep 
    Call: (7) father(mary, george) ? creep 
    Fail: (7) father(mary, george) ? creep 
    Redo: (7) father(daniel, _G1931) ? creep 
    Exit: (7) father(daniel, martha) ? creep 
    Call: (7) father(martha, george) ? creep 
    Fail: (7) father(martha, george) ? creep 
    Redo: (7) father(daniel, _G1931) ? creep 
    Exit: (7) father(daniel, andy) ? creep 
    Call: (7) father(andy, george) ? creep 
    Fail: (7) father(andy, george) ? creep 
    Redo: (6) grandfather(daniel, george) ? creep 
    Call: (7) father(daniel, _G1931) ? creep 
    Exit: (7) father(daniel, mary) ? creep 
    Call: (7) mother(mary, george) ? creep 
    Exit: (7) mother(mary, george) ? creep 
    Exit: (6) grandfather(daniel, george) ? creep 
true . 

[C,D] are singleton variables表明有是隻出現一次的子句中的一個或多個變量。這不影響程序,你仍然可以運行你的查詢。

Singleton Variables on SWI Documentation

0

感謝您的回答,最後一個問題,我試圖做一個規則表兄弟這樣

堂兄弟(X,Y): - 媽媽(A,X),母親(B,Y),母親(d,A),母親(d,B),父親(C,A),父親(C,B)。它指出如果X的母親和Y的母親有相同的母親和父親X,Y是堂兄弟。但是當我問查詢 - ?堂兄弟(安妮,喬治·)序言回答是,它不應該是這樣,因爲安妮和喬治是兄弟,所以我想必須有一個合乎邏輯的錯誤

A和B (X和Y的母親)可以是平等的,這就是爲什麼它給兄弟是。

你應該指定他們沒有相同的母親和父親(A \ = B)。


關問題:

使用 「父母」 可以減少這類問題(家譜)的編碼。

mother(A,B) :- parent(A,B). 

甚至:

mother(A,B) :- parent(A,B), female(A). 

這樣你就不需要申請表弟問題(或任何這樣的,像兄弟)的母親和父親。

在兄弟你有:

brothers(A,B):-father(C,A),father(C,B);mother(D,A),mother(D,B). 

這可能是:

brothers(A,B):-parent(X,A),parent(X,B).