0

特定の都市のコストを計算するプロローグ述語がいくつかあります。プロセスは次のようなコマンドで始まります。best_route([std, lhr, bud, dse], 2013-5-5, X).

best_route(Cities, StartDate, Cost):-
    begin_routing(Cities, StartDate, Cost, []).

begin_routing(Cities, StartDate, Cost, CostList):-
    route(Cities, StartDate, CostList),
    min_list(CostList, Cost).

route(Cities, StartDate, Costing):-
    % stop if all cities have been covered once.
    length(Cities, Stop),
    length(Costing, Stop);

    [Origin, Dest|_] = Cities,
    flights(Origin, Dest, StartDate, Costing, Cities, [Cities, Origin, StartDate]).

SWI-Prolog のトレース機能を使用して、ルート述語 -length(Costing, Stop)が満たされると、つまり Costing List の長さが Stop に等しいことがわかりました。そこで停止する代わりに Prolog を実行して に進みmin_list(CostList, Cost)CostLost がすべての値を再び失うまで後戻りします。min_listそれが終わったら、リストが のときにに行き[]ます。

なぜこれが起こっているのかわかりません。どんな助けでも大歓迎です。

編集:

flights(..):-
    % Code omitted.
    get_next_date(OriginalDate, NextDate),
    route(Cities, NextDate, [DayCost|Costing]).
    % where DayCost is a simple integer calculated before this is added to the current Costing list

最後に向かって、最後の正しい呼び出しはroute([std, lhr, bud, dse], 2013-5-6, [329, 499, 323, 311]).

4

1 に答える 1

0

の意図はCostList、さまざまなルートのコストを記録してから、コストが最小のものを選択することです。ただし、として初期化CostList[]、再帰が構築されている間、再帰がCostList戻ったときにそれを伝える手段を提供しません。FinalCostList考えられる解決策は、終了句まで再帰を介して単純に渡される新しい引数を追加することです。または、差分リストを使用できます。

この点を説明するために、次の例を検討してください。

p :- q([]).
q(X) :- go(X), !, q([a|X]).
q(X) :- stop(X).

いくつかの相互に排他的なgostop. 目的の結果 (qすべてas である限りgo) は計算されますが、返されません。より良い解決策は

p(Y) :- q([],Y).
q(X,Y) :- go(X), !, q([a|X],Y).
q(X,X) :- stop(X).

上記のように、差分リストも使用できます。

于 2013-07-08T19:19:38.050 に答える