2014-02-22 121 views
0

我試圖找到一個人的所有的兄弟。我已經創建了以下規則..序言查找全部謂詞

find_all_brothers(Z):- findall(X,brother(X,Z),X0),write(X0). 

然而這工作,如果一個人有一個以上兄弟,然後它會只找到一個兄弟..我假設我不得不使用遞歸方式,但我有點卡住了!

+0

'findall'會發現所有這些。你能說出你的序言事實是什麼樣子的嗎? – lurker

+0

會嗎?哦,親愛的哈哈!好吧,我現在把它們加起來,謝謝! :) – bdavies6086

+0

那麼,取決於...看到我的答案。 :) – lurker

回答

0

如果你有這樣的關係:

brother(sam, bill). 
brother(bill, fred). 

而且要找到所有的法案的兄弟,你需要做的更多一點:

find_all_brothers(Z) :- 
    findall(X, (brother(X, Z) ; brother(Z, X)), X0), write(X0). 

爲了避免任何多餘的成員的名單,setof將排序,並提供唯一的成員:

find_all_brothers(Z) :- 
    setof(X, (brother(X, Z) ; brother(Z, X)), X0), write(X0). 
+0

啊,這就解決了!謝謝! :) – bdavies6086

+0

而是'setof/3' ... – false

+0

@false是的,我考慮過'setof'。我不確定在這種情況下是否有必要根據OP的事實和規則是如何建立的。 'setof'當然更安全。 – lurker