2

私は次のようなデータベースを持っています。

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]).

そして、私は「テスト」と呼ばれる述語を持っており、パラメータとして2つのリストを取ります。したがって、testing([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番目の問題は、リストに重複する要素があってはならないということです。私の問題が明確であることを願っています。どんな助けでも大歓迎です。

4

1 に答える 1

3

使用できますsetof/3

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

興味のあるページは、この SWI-Prolog ドキュメント ページです。

戻りません[esb,mlx][[esb], [mlx]]、簡単に修正できることに注意してください。

于 2012-04-23T15:48:23.463 に答える