2017-11-22 20 views
0

私はフライトに関する事実のリストを持っていますが、ある都市からリストの都市へ順番にすべてのルートを返す予測を書くにはどうすればいいですか?例えば、romeから[moscow, amsterdam]までのすべてのルート。Prolog:ある都市から収集都市へのルートを見つける

flight(london,dublin). 
flight(rome,london). 
flight(rome,paris). 
flight(paris,dublin). 
flight(berlin,moscow). 
flight(paris,amsterdam). 
flight(berlin,dublin). 
flight(london,newyork). 
flight(dublin,newyork). 
flight(dublin,cork). 
flight(dublin,rome). 
flight(dublin,chicago). 
flight(amsterdam,hongkong). 
flight(london,hongkong). 
flight(dublin,amsterdam). 
+0

これまでに何を試しましたか?ここではヒントがあります: 'A'から' B'へのルートは、 'A'から' B'への直接飛行、 'A'から' C'への直接飛行、 'C'から' B '。 – lurker

+0

私はtrip(rome、london)が[rome、london]、[rome、paris、london]などを返すなど、都市から都市へのすべてのルートを返す予測を作成しましたが、書く方法はわかりませんある都市からすべての可能なルートを都市リストに返すと予測します。 – Davidw

+0

「A」から「B」までのすべてのルートで成功する述語が必要です。次に、 'findall':' findall(Dest、route(A、Dest)、AllDestinations) 'を使います。 – lurker

答えて

0

があり、いくつかの直行便がある場合は、パスを存在:

route(X,Y,L):- 
    route(X,Y,L,[X]). 

route(X,Y,L,K):- 
    flight(X,Y), 
    reverse([Y|K],L). 

または接続されているZXあるとZYに接続されているいくつかのZように存在する場合。あなたは1つのリスト内のすべてのパスを検索したい場合は

route(X,Y,L,E):- 
    flight(X,Z), 
    \+ member(Z,E), 
    route(Z,Y,L,[Z|E]). 

その後、プロローグ事前に定義された述語からfindall/3を使用しています。

関連する問題