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)即成本计算列表的长度等于停止。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 回答