根据航班费用计划时间表

时间:2014-12-10 15:18:23

标签: prolog

假设有一个如下定义的飞机列表:

plane(rome,berlin).
plane(berlin,london).
plane(london,lisboa).
plane(london,dublin).
plane(dublin,paris).
plane(rome,paris).
plane(berlin,paris).

我将通过以下方式解决问题,找到两个城市之间的所有路线:

route(Dep, Arr, [Dep, Arr]) :- plane(Dep, Arr).
route(Dep, Arr, [Dep|C]) :- plane(Dep, Z), route(Z, Arr, C).

例如

?- route(rome,paris,P).

我获得:

P = [rome, paris] 

P = [rome, berlin, paris] 

P = [rome, berlin, london, dublin, paris] 

假。

如果我添加价格,就会出现问题,例如,

plane(rome,berlin,20).
plane(berlin,london,14).
plane(london,lisboa,44).
plane(london,dublin,99).
plane(dublin,paris,44).
plane(rome,paris,4).
plane(berlin,paris,6).

我有两个问题:

  • 最后一个虚假代表什么?
  • 如何获得总价格和价格便宜的所有路线清单?

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,false意味着找不到更多解决方案。

要获得成本,您需要将开头的成本作为累加器参数添加到谓词中:

route(Dep, Arr, Route, Cost) :-
    route(Dep, Arr, Route, 0, Cost).
route(Dep, Arr, [Dep, Arr], AccCost, FinalCost) :-
    plane(Dep, Arr, Cost),
    FinalCost is AccCost + Cost.
route(Dep, Arr, [Dep|C], AccCost, FinalCost) :-
    plane(Dep, Z, Cost),
    NewCost is AccCost + Cost,
    route(Z, Arr, C, NewCost, FinalCost).

然后,route(Dep, Arr, Route, Cost)将依次生成每条路线。如果您希望将它们列在列表中,则可以使用setof/3

执行此操作
list_of_routes(Dep, Arr, Routes) :-
    setof(C-R, route(Dep, Arr, R, C), Routes).

这将生成一个看起来像Cost-Route的元素列表,按升序Cost排序。

要获得最便宜的路线,请拉出该列表的第一个元素:

cheapest_route(Dep, Arr, Route, Cost) :-
    setof(C-R, route(Dep, Arr, R, C), [Cost-Route|_]).