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