首页 文章

Prolog回溯并失去所有 Value 观

提问于
浏览
0

我有几个prolog谓词来计算给定城市的成本 . 该过程从以下命令开始: 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 .

我不知道为什么会发生这种情况 . 任何帮助表示赞赏 .

EDIT:

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]).

1 回答

  • 0

    似乎 CostList 的意图是记录不同路线的成本,然后选择成本最低的路线 . 但是,您将 CostList 初始化为 [] ,并且在递归构建 CostList 时,您不提供在递归返回时将其传回的方法 . 一种可能的解决方案是添加一个新参数 FinalCostList ,该参数只是通过递归传递到终止子句 . 或者,您可以使用差异列表 .

    为了说明这一点,请考虑以下示例:

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

    与一些互斥 gostop . 计算所需的结果( q ,所有 a 只要 go )但不返回 . 一个更好的解决方案是

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

    如上所述,也可以使用差异列表 .

相关问题