我有几个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 回答
似乎
CostList
的意图是记录不同路线的成本,然后选择成本最低的路线 . 但是,您将CostList
初始化为[]
,并且在递归构建CostList
时,您不提供在递归返回时将其传回的方法 . 一种可能的解决方案是添加一个新参数FinalCostList
,该参数只是通过递归传递到终止子句 . 或者,您可以使用差异列表 .为了说明这一点,请考虑以下示例:
与一些互斥
go
和stop
. 计算所需的结果(q
,所有a
只要go
)但不返回 . 一个更好的解决方案是如上所述,也可以使用差异列表 .