2012-04-23 134 views
2

我有一個數據庫看起來像;SWI-Prolog列表和遞歸

airport(ist, 90). 
airport(saw, 45). 
airport(esb, 60). 
airport(adb, 60). 
airport(erz, 30). 
airport(ayt, 90). 
airport(mlx, 30). 
airport(tzx, 30). 

airplane(f1, ist, [esb,tzx,saw]). 
airplane(f2, ist, [mlx,esb,erz,esb]). 
airplane(f3, ist, [esb,ist,esb,ist]). 
airplane(f4, saw, [ayt,saw,ayt,saw]). 
airplane(f5, erz, [esb,erz,esb]). 
airplane(f6, mlx, [ist,esb,tzx,saw]). 

,我有一個名爲「測試」謂詞需要兩個列表作爲參數。所以,如果你寫測試([ist],X)。你應該得到X = [esb,mlx]。我寫了這段代碼。

testing([],[]). 

testing([D|D1],[L|L1]) :- 
    airport(D,_), 
    airplane(_,D,[L|_]), 
    testing(D1,L1). 

這工作,輸出是:

[8] 60 ?- listConnections([ist],X). 
X = [esb] ; 
X = [mlx] ; 
X = [esb]. 

但是,這不是我想要的。所以第一個問題是我需要一個單行答案,如X = [esb,mlx]。第二個問題是不應該在列表中重複元素。我希望我的問題清楚。任何幫助將不勝感激。

回答

3

您可以使用setof/3

testing_set(List, Result) :- 
    setof(L, testing(List, L), Result). 

您可能感興趣的是this SWI-Prolog documentation page的頁面。

請注意,它不會返回[esb,mlx],但[[esb], [mlx]],它很容易修復。

+0

感謝莫格,它的工作! (: – bleda 2012-04-23 15:53:04