首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog回溯并丢失所有值

Prolog回溯并丢失所有值
EN

Stack Overflow用户
提问于 2013-07-08 17:20:35
回答 1查看 265关注 0票数 0

我有几个prolog谓词来计算给定城市的成本。该过程以如下命令开头:best_route([std, lhr, bud, dse], 2013-5-5, X).

代码语言:javascript
复制
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中的跟踪函数,我发现一旦满足路由谓词- length(Costing, Stop),即成本列表的长度等于停止。Prolog没有停止,而是继续使用min_list(CostList, Cost),而是返回,直到CostLost再次失去它的所有值。完成后,当列表为min_list时,它将转到[]

我不知道为什么会发生这种情况。任何帮助都是非常感谢的。

编辑:

代码语言:javascript
复制
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]).

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-08 19:19:38

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

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

代码语言:javascript
复制
p :- q([]).
q(X) :- go(X), !, q([a|X]).
q(X) :- stop(X).

一些相互排斥的gostop。所需的结果(只要q包含所有的a,只要是go)是计算出来的,但不返回。更好的解决办法是

代码语言:javascript
复制
p(Y) :- q([],Y).
q(X,Y) :- go(X), !, q([a|X],Y).
q(X,X) :- stop(X).

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17532469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档