2011-12-06 50 views
1
% facts 
mother(john, dana). 
father(john, david). 
mother(chelsea, dana). 
father(chelsea, david). 
mother(jared, dana). 
father(jared, david). 
% queries 
father(X,Y) :- father(X,Y), write(Y). 
mother(X,Y) :- mother(X,Y), write(Y). 
parent(X,Y) :- father(X,Y);mother(X,Y). 
sibling(X,Y) :- parent(X,Z), parent(Y,Z), write(Y). 

我有麻煩這些查詢工作。當我輸入父命令時,它會告訴我是或否,但不會執行寫入命令(與母親一樣)。 「父母」根本不工作(因爲兄弟姐妹也不是)。另外,如果我輸入兄弟(X,Y)。我需要得到所有的兄弟姐妹...例如,兄弟姐妹(約翰,切爾西)。我需要輸出所有可能的兄弟姐妹(jared)。讓我知道我出錯的地方,我真的在這裏看不到我的邏輯問題。謝謝!Prolog的家譜查詢發出

回答

1

基本上你可以刪除你的母親和父親謂詞不是事實。它們是無限循環。由於父母使用他們和兄弟姐妹使用父母,所有的謂詞是無限循環。

要看看會發生什麼,你可以這樣做:

?- trace, father(john, X). 

,並觀察序言如何處理查詢。你很快就會看到,而不是解決的父親,他需要解決的父親,而解決的父親,他需要解決的父親,而且它永遠不會停止......

當這兩個問題被刪除,我獲得正確行爲:

?- father(john, X). 
X = david. 

?- parent(john, X). 
X = david ; 
X = dana. 

?- sibling(john, X). 
john 
X = john ; 
chelsea 
X = chelsea ; 
jared 
X = jared ; 
john 
X = john ; 
chelsea 
X = chelsea ; 
jared 
X = jared. 

現在,讓你的兄弟姐妹謂語更好的,你可以說某人是不是自己的兄弟姐妹的,如果你有一個共同的父它足夠(它會刪除重複項): 兄弟( X,Y): - 父親(Y,Z),父親(X,Z),X = \ = Y.

+0

感謝莫古。沒有意識到我必須接受問題,我認爲這是基於投票。從現在開始,我肯定會爲這個特定問題做到這一點。我明白你在說什麼。這是我的第一個PROLOG計劃,所以我爲我的問題的簡單性而道歉。我擺脫了父親和母親的疑問。家長似乎現在工作確定。但是,我的父母條款似乎還沒有起作用,並且你沒有提到我在最後提出的兄弟問題。你能幫助我嗎?由於 – gibsonfirebird12

+0

我編輯了一下我的回答,我建議你身邊的母親和父親玩的查詢開始,通過免費和綁定變量(X或約翰爲例),讓你看到序言中如何使用謂詞要求。不要猶豫,詢問是否有什麼不清楚的地方。 – m09

+0

非常感謝。這非常有幫助。 – gibsonfirebird12