2017-02-21 84 views
2

我想在我的序言程序中列出特定人的所有表親,但似乎無法得到它的工作。我檢查了我的代碼,它似乎是正確的,但我沒有得到我想要的輸出。序言系列樹,表親問題

father(john, johnny). 
father(john, peter). 
father(josh, william). 
father(simone, betty). 

mother(mary, johnny). 
mother(mary, peter). 
mother(catherine, william). 
mother(kate, betty). 

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

siblings(B,G) :- parent(P,B), parent(P,G), B\=G. 
cousins(X,Y) :- parent(A,X), parent(B,Y), siblings(A,B), X\=Y. 

我想,當我查詢cousins(X, william).返回2個堂兄弟,但我只獲得虛假的回報。我究竟做錯了什麼?

編輯:繼承人什麼我現在,卻只能拿到1個表妹顯示

father(grandpa1, mary). 
 
father(grandpa1, catherine). 
 
father(grandpa2, john). 
 
father(grandpa2, simone). 
 
father(john, johnny). 
 
father(john, peter). 
 
father(josh, william). 
 
father(simone, betty). 
 

 
mother(grandma1, mary). 
 
mother(grandma1, catherine). 
 
mother(grandma2, john). 
 
mother(grandma2, simone). 
 
mother(mary, johnny). 
 
mother(mary, peter). 
 
mother(catherine, william). 
 
mother(kate, betty). 
 

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

 
siblings(B,G) :- parent(P,B), parent(P,G), B\=G. 
 
cousins(X,Y) :- parent(A,X), parent(B,Y), siblings(A,B), X\=Y.

+1

只是一個小評論。 Prolog永遠不會返回任何東西,所以你永遠不會返回'false'。目標/謂詞要麼成功要麼失敗,就是這樣。 – Enigmativity

回答

7

這是你的數據庫

enter image description here

的圖片說表明沒有表親,只是因爲父母之間沒有關係。讓我們添加一個未知數,但共享,祖父母:

enter image description here

?- forall(cousins(X,william),writeln(X)). 
johnny 
peter 
betty 

如果你有興趣,可以從這個github repo獲得圖形表示,這個最小的「膠水」代碼:

parent_child(P,C) :- parent(P,C). 
+1

我已經添加了一些額外的未知父母,但我仍然沒有得到理想的結果,這裏是我補充說的(父母不知道的父親和母親): 父親(uk1f,瑪麗)。 父親(uk1f,凱瑟琳)。 父親(uk2f,約翰)。 父親(uk2f,simone)。母親(uk1m,瑪麗) 。 母親(uk1m,凱瑟琳)。母親(uk2f,約翰) 。母親(uk2f,simone) 。 我現在每個查詢只得到一個表親,而不是2個表兄弟(S,johnny)。只返回貝蒂,我查詢錯了嗎?感謝你目前的幫助 – lucyb