2

私が Prolog で書いているプログラムの一部は、開始位置から終了位置までのすべての可能なパス オプションを見つけることに関係しています。

これが私がこれまでに持っているものです:

findAllRoutes(Start, End, Path) :-
     findAllRoutes(Start, _, End, Path),
     print('Successful route: '), print(Route).

findAllRoutes(End, _, End, [End]). %route was successfully finished

 findAllRoutes(Start, Temp, End, [Start|Rest_of_List]) :-
     path(Start, Temp),
     findAllRoutes(Temp, _, End, Rest).

読み込むデータは次のとおりです。

%path(Start, End).
path(1, 4). %find all the possible paths from location 1 to location 4.

%paths_in_place[[Start, End, Distance]].
paths_in_place[[1, 2, 250], [2, 4, 250], [1, 3, 400], [3, 4, 300]].

私の質問は、これはpaths_in_place開始場所から終了場所までの途中で到達したポイントの順序を保存しながら、循環する正確な方法ですか?

また、フィールドについて言及せずに が呼び出されDistanceた場合はどうなりますか? フィールドにあるにもかかわらず、Prologでパラメーターを渡すことは合法ですか?findAllRoutesDistanceStart, End, Routepaths_in_placeStart, End, Distance

どんな助けでも大歓迎です。何か明確にする必要がある場合はお知らせください。

4

1 に答える 1

1

Prolog データはシンボリックです。メートル単位の通過距離を、フィート単位の距離として扱うことができます。火星ミッションの 1 つが別の言語を使用していたにも関わらず、このようにして墜落しました。ですから、最終的にはあなた次第です。

あなたのコードに関しては、

findAllRoutes(Start, End, Path) :-
     findAllRoutes(Start, _, End, Path),
     print('Successful route: '), print(Route).

Route? 何Route?インスタンス化されていない「シングルトン」変数です。SWI Prolog は、その旨を警告しています。おそらくあなたが意味しPathた。

findAllRoutes(End, _, End, [End]).  % route was successfully finished

findAllRoutes(Start, Temp, End, [Start|Rest_of_List]) :-
     path(Start, Temp),
     findAllRoutes(Temp, _, End, Rest).

繰り返しますがRest_of_ListRestおそらく同じ名前を持つ必要があります(同じ論理変数である必要があります)。

それ以外の場合は、その名前を除いて問題ないように見えます。各呼び出し/バックトラッキングで、「AllRoutes」ではなく 1 つのパスを見つけます。「AllRoutes」という名前は、それらをすべて見つけて結果引数に返すことを示唆しています。そうではありません。

次に、データが来て、コードと同期していません:

%path(Start, End).
path(1, 4). %find all the possible paths from location 1 to location 4.

%paths_in_place[[Start, End, Distance]].
paths_in_place([[1, 2, 250], [2, 4, 250], [1, 3, 400], [3, 4, 300]]).
  % ! must be in parentheses !

コード内のpath(Start, Temp)呼び出しTempは、 の直後の後継者であることを示唆していますStart。これらのデータによると、そうではありません。さらに、path/2定義がありません。ただし、データを定義するリストの代わりに、一連のファクトを使用することもできます。

于 2013-10-26T07:41:07.407 に答える