我試圖找到一個人的所有的兄弟。我已經創建了以下規則..序言查找全部謂詞
find_all_brothers(Z):- findall(X,brother(X,Z),X0),write(X0).
然而這工作,如果一個人有一個以上兄弟,然後它會只找到一個兄弟..我假設我不得不使用遞歸方式,但我有點卡住了!
我試圖找到一個人的所有的兄弟。我已經創建了以下規則..序言查找全部謂詞
find_all_brothers(Z):- findall(X,brother(X,Z),X0),write(X0).
然而這工作,如果一個人有一個以上兄弟,然後它會只找到一個兄弟..我假設我不得不使用遞歸方式,但我有點卡住了!
如果你有這樣的關係:
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).
啊,這就解決了!謝謝! :) – bdavies6086
而是'setof/3' ... – false
@false是的,我考慮過'setof'。我不確定在這種情況下是否有必要根據OP的事實和規則是如何建立的。 'setof'當然更安全。 – lurker
'findall'會發現所有這些。你能說出你的序言事實是什麼樣子的嗎? – lurker
會嗎?哦,親愛的哈哈!好吧,我現在把它們加起來,謝謝! :) – bdavies6086
那麼,取決於...看到我的答案。 :) – lurker