【发布时间】:2014-01-24 01:16:50
【问题描述】:
我有一些序言谓词来计算给定城市的成本。该过程以如下命令开始: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中的trace函数,我发现一旦路由谓词-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]).
【问题讨论】:
-
通读
best_route和begin_routing,似乎在第一次调用route时,Cities被实例化为[std, lhr, bud, dse],Costing被实例化为[]。对length(Costing, Stop)的调用变为length([], 4)并失败。它以析取(;)终止,因此route不会在此时失败,而是继续[Origin, Dest|_] = Cities实例化Origin和Dest,然后调用flights。由于您没有显示flights的作用,因此不清楚它从那里做了什么。 -
@mbratch:请查看已编辑的问题,我省略了部分代码,因为它们相当不必要且冗长。希望这能让它更清楚。
-
@Namit: min_list(CostList, Cost) 失败或需要更多评估?要强制终止,请添加一个愚蠢的替代方案:( min_list(CostList, Cost) ; true )
-
@mbratch:它失败了,因为
CostList没有在递归期间进行。添加true也没有太大区别。 -
@Namit,我在说明为什么它没有立即回到
min_list
标签: prolog