2010-10-15 50 views
0

說我有下面的代碼:如何在Prolog回溯期間獲取值的列表?

edge(a, b). 
edge(a, c). 
edge(a, d). 

現在,當我做

neighbors(V, N) :- edge(V, N), writeln(N), fail. 

我可以打印到控制檯的鄰居列表。但是我怎樣才能得到它作爲結果列表?像

neighbors(V, Vs) :- 
    edge(V, N), 
    not(member(N, Vs)), 
    neighbors(V, [N|Vs]). 

東西(上面這段並未真正發揮應有的方式member的處理。任何建議嗎?

回答

1

您可以使用bagof/3創建您verticies滿足目標的列表, 「Vs爲所有N是V的邊緣」在你最喜歡的Prolog的執行手冊閱讀findallbagofsetof

neighbors(V, Vs) :- bagof(N, edge(V, N), Vs). 

neighbors(a, Vs). % Vs = [b, c, d]. 
3

,或者如部分「11 .2收集解決方案「Learn Prolog Now! (遺憾的是很難直接鏈接到這些資源。)