的所有解決方案謂語像findall/3
可能做的伎倆:
list_parents(P, L) :-
findall(Parent, parent(Parent, P), L).
簡單put findall/3
找到Parent
在'backtrack-able'目標parent(Parent, P)
中的所有綁定,並將Parent
的所有綁定放入列表L
。請注意,這不會刪除重複項,但您可以在將它返回到創建集之前執行sort/2
至L
。執行此:
?- list_parents(bob, L).
L = [pam, george].
如果沒有findall/3
在PROLOG實現呢,你可以手工做這樣的:
list_parents(P, L) :-
list_parents(P, [], L).
list_parents(P, Acc, L) :-
parent(Parent, P),
\+ member(Parent, Acc), !,
list_parents(P, [Parent|Acc], L).
list_parents(_, L, L).
這個版本發送到list_parents/2
接聽的儲液器的版本, list_parents/3
。後者試圖收集Parent
綁定,只要我們之前沒有看到它們(因此\+ member
檢查),並且返回沒有找到新的Parent
綁定到Acc
列表中的列表。執行這給了我們同樣的結果作爲第一個選項:
?- list_parents(bob, L).
L = [pam, george].
我貼的後續問題你的回答就「解決方案」謂:https://stackoverflow.com/questions/47233986/higher-order-解決方案 - 謂詞 – mrsteve 2017-11-11 03:44:57