在递归工作时,我可以跟踪其他变量中的值吗?

时间:2011-11-27 09:02:51

标签: prolog visual-prolog

predicates
          pathdistance(symbol,symbol,integer).
          solve(symbol,symbol,integer).

clauses
   pathdistance(a,b,10). 
   pathdistance(b,c,20).
   pathdistance(c,d,5).
   pathdistance(d,e,15). 
   pathdistance(a,d,5).
   pathdistance(c,e,10).

solve(X,Z,C):-
     pathdistance(X,Z,C).

solve(X,Z,C):-
     pathdistance(X,Y,Cost),
     solve(Y,Z,C),
     Cost is Cost+C.

goal
    solve(a,d,Cost).

我想要的费用答案是a和d之间所有C(总距离)的总和。上面的代码不起作用,它不允许我采取新的变量,可以请有人在上面的代码中进行了更改,以便我可以在Cost中获得总距离。请记住,我是prolog的新手,谢谢!

1 个答案:

答案 0 :(得分:1)

您需要使用累加器(求解谓词中的另一个变量):

pathdistance(a,b,10). 
pathdistance(b,c,20).
pathdistance(c,d,5).
pathdistance(d,e,15). 
pathdistance(a,d,5).
pathdistance(c,e,10).

solve(Start, End, Result):-
    solve(Start, End, 0, Result).

在这里,您将介绍累加器并将其初始化为0。

solve(Start, End, TotalCost, Result) :-
    pathdistance(Start, End, Cost),
    Result is TotalCost + Cost.

如果此步骤是最后一步,则结果是累加器的值(此处名为TotalCost)+最后一步。

solve(Start, End, TotalCost, Result):-
    pathdistance(Start, Waypoint, Cost),
    NewTotalCost is TotalCost + Cost,
    solve(Waypoint, End, NewTotalCost, Result).

如果这不是最后一步,您只需按成本增加累加器值。

希望这有帮助。

你应该已经标记了这个作业,因为由于当天早些时候的问题,这个问题已经收到很多事。虽然这次你清楚地表明你尝试过这样的东西。请询问您是否需要其他信息。