2012-04-23 22 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]). 

と "testing"という述語は、パラメータとして2つのリストをとります。だから、あなたがテスト([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]のように1行の答えが必要なことです。第2の問題は、リスト内の要素を複製すべきでないということです。私は私の問題がはっきりしていることを願うどんな助けでも大歓迎です。

答えて

3

あなたはsetof/3を使用することができます。

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

あなたが興味かもしれないページがthis SWI-Prolog documentation pageです。

[esb,mlx]ではなく[[esb], [mlx]]が返されますが、簡単に修正できます。

+0

ありがとうございました。 (: – bleda