假设有一个如下定义的飞机列表:
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).
我有两个问题:
答案 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|_]).