您可以更簡單地寫你的祖父查詢:
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