我有以下一系列事实:
flight(kul,syd,495,2205).
flight(jhb,kul,45,321).
flight(pen,kul,55,346).
flight(lgk,kul,65,381).
flight(lgk,pen,35,215).
flight(kul,sin,65,760).
flight(lgk,sin,90,1058).
flight(sin,bki,150,1492).
flight(kul,bki,155,526).
flight(kul,lbu,145,436).
flight(lbu,bki,30,127).
flight(bki,per,340,1835).
flight(kul,per,330,1835).
flight(myy,bki,55,167).
flight(kul,myy,130,511).
flight(lbu,myy,45,108).
flight(sin,per,310,2289).
flight(sin,syd,475,3118).
是flight(FROM,TO,EST,PRICE).
现在我需要创建一个规则来查找两个城市之间最便宜的票价。如果有人可以帮助我,这将意味着世界。
提前致谢。
答案 0 :(得分:2)
graph :-
forall(flight(From,To,_,_), writeln(From -> To)).
显示拓扑,我们可以欣赏图形是非循环的:
OT:显示边缘信息:
graph_dist_cost :-
forall(flight(From,To,Dist,Cost),
format('~q [label="~w\\n~w"];~n', [From -> To, d=Dist,c=Cost])).
现在,因为它是非循环的,我们可以说:
path(To,To,[]).
path(From,To,[Step|Rest]) :-
Step = flight(From,ToTemp,_Dist,_Cost),
call(Step),
path(ToTemp,To,Rest).
我们得到:
?- path(jhb,myy,P).
P = [flight(jhb, kul, 45, 321), flight(kul, lbu, 145, 436), flight(lbu, myy, 45, 108)] ;
P = [flight(jhb, kul, 45, 321), flight(kul, myy, 130, 511)] ;
false.
现在,很容易获得数值
path_cost(P, C) :-
aggregate_all(sum(Cost), member(flight(_,_,_,Cost), P), C).
?- path(jhb,myy,P),path_cost(P,C).
P = [flight(jhb, kul, 45, 321), flight(kul, lbu, 145, 436), flight(lbu, myy, 45, 108)],
C = 865 ;
P = [flight(jhb, kul, 45, 321), flight(kul, myy, 130, 511)],
C = 832 ;
false.
然后,最低限度:
path_min_cost(From, To, Min, Path) :-
aggregate(min(C,P), (path(From,To,P),path_cost(P,C)), min(Min,Path)).
?- path_min_cost(jhb,myy,P,MC).
P = 832,
MC = [flight(jhb, kul, 45, 321), flight(kul, myy, 130, 511)].
如您所见,此类查询非常简单......
答案 1 :(得分:0)
如果您想确定最便宜的票价,那么距离字段就变得无关紧要了。策略是找到从A到C然后到B的停留点C比直接从A到B便宜。你找不到最便宜的票价,然后,没有以某种方式'检查'所有可能性。
您可以通过将数据组织到哈希表的哈希表中来有效地执行此操作,并在两个城市A和B之间找到最便宜的票价:
在相应地安排您的数据后,任何最便宜的总PRICE的查找都将处于不变的时间。