0

Prolog で次の問題が発生しています。たとえば、ナレッジ ベースにいくつかの事実があります。

flight(rome,london,ba,1500,150,400).
flight(london,newyork,airfrance,600,60,200).
flight(rome,paris,airfrance,1200,120,500).  
flight(paris,newyork,airfrance,600,60,200).
flight(newyork,london,ba,1500,240,300).

X から Y までのすべての可能なルートのリストを取得することにのみ関心があります。再帰ルールを使用する必要があり、訪問した場所をリストに追加して、飛行経路として繰り返し実行されるサイクルを停止する必要があることを理解しています。知識ベースにはいくつかのサイクルがあります。

私がこれまでに持っているものは次のとおりです。

flight_route(X,Y):-
   flight(X,Y,A,B,C,D).

trip(X,X,[]).
trip(X,Z,T) :-
   flight_route(Y,Z),
   not(member(Y,T)),
   trip(X,Y,[Y|T]).

何らかの理由で、トレースを見ると、not(member(Y,T)) をチェックしようとするとルールが失敗しますが、なぜそうなるのか理解できません。

4

2 に答える 2

0

問題は、trip/3述語の定義にあります。試す:

trip(X, X, _).
trip(X, Z, T) :-
   flight_route(X, Y),
   \+ member(Y, T),
   trip(Y, Z, [Y| T]).

最初の句では、目的地にいるときは、どのようにそこにたどり着いたかは問題ではありません。したがって、3 番目の引数の (匿名) 変数です。また、目的地よりも出発地から始まるパスを見つける方が効率的である可能性があります。trip/3考えられる問題は、述語の呼び出し方法にもある可能性があります。必ず、3 番目の引数に空のリストを渡して呼び出してください ( Ground を指定しないTと、呼び出し\+ member(Y, T)は常に失敗します)。または、trip/2その実装の詳細を抽象化する引数を定義します。

trip(X, Y) :-
    trip(X, Y, []).
于 2014-11-02T14:37:46.833 に答える