【发布时间】:2019-03-15 12:36:27
【问题描述】:
我在 prolog 中有这个数据库,我想计算一下:
1) flightTime(Start, Destination, Time, Path) 计算所有可能路径的飞行时间。
2) pathLength(Path, Length) 计算给定路径的长度(路径将是一个列表)。
3) shortestPath(Start, Destination) 打印两个机场之间的最短路径。
flightPath(fco,jfk,10,4321).
flightPath(fco,sin,12,5671).
flightPath(sin,nrt,8,3467).
flightPath(lju,fco,4,2521).
flightPath(lju,cdg,9,8653).
flightPath(cdg,fco,3,1989).
flightPath(cdg,jfk,8,5461).
flightPath(cdg,lax,17,9321).
flightPath(jfk,lax,6,4141).
flightPath(lax,nrt,6,5743).
transferTime(fco,2).
transferTime(sin,1).
transferTime(lju,3).
transferTime(cdg,1).
transferTime(jfk,4).
transferTime(lax,4).
transferTime(nrt,1).
connection(X,Y) :- flightPath(X,Y,_,_);(flightPath(X,Z,_,_),connection(Z,Y)).
我设法获得了直飞和仅一站的间接航班的飞行时间,但我再次需要所有可能的路径。
flightTime(X,Y,T,P) :-
flightPath(X,Y,T,_),
P = Y; ( flightPath(X,Z,T1,_),
flightPath(Z,Y,T2,_),
transferTime(Z,T3),
T is T1+T2+T3, P = Z
).
为了简单起见,我制作了一个图表来显示所有可能的路径:
【问题讨论】:
-
;操作符有一些副作用,写两条规则会更简单,一个基本情况和一个递归情况。你能推理出的最简单的路径是什么?这些应该成为基本情况。给定一条路径P花费时间T,你如何计算一条路径P1的时间,多停一站?这将是flightTime(F1,D1,P1,T2) :- ... , flightTime(F,D,P,T)形式的递归规则。 -
问题3中的最短路径是什么意思??最短路径是指最短时间或最少中间站的路径??
-
我建议查看
flightTime/4只是因为它是唯一一个 Michel 试图解决它的问题。此外,混合多个问题会导致混淆。 -
@coder 最短路径就最少中间站而言。很抱歉没有解决这个问题。
-
我认为这会更容易(您也可以链接问题)。无论如何,您一次只能解决一个问题:-)
标签: prolog shortest-path