这非常有效:
%connection(Num,Ori,Dest,Distance,RoadNumber)
connection(1,cityA,cityB,20,235).
connection(2,cityB,cityC,23,235).
connection(3,cityB,cityD,30,272).
%road(num,speedlimit)
road(235,50).
road(272,90).
road(273,120).
dest(Z):-
A = mystartcity,
route(A,[Z],0,Path,Cost).
route(A,[A|Path1],Cost1, [A|Path1], Cost1).
route(A,[Y|Path1], Cost1,Path, Cost):-
connection(_,X,Y,Dist,N,E),
roadtype(N,Vmed,_),
CostXY is Dist/Vmed,
Cost2 is Cost1 + CostXY,
route(A,[X,Y|Path1],Cost2, Path, Cost).
我的问题是我想避开某些道路(例如:如果道路因事故而无法使用),我无法弄明白道路。
我想我需要一些东西,允许我改变可用的道路的“状态”,当它不可用时,路线功能应该避免并选择另一种方式。但我无法解决这个问题,我正在努力。
答案 0 :(得分:0)
您可以按ID创建已关闭道路的列表,并使用不可证明的运算符,如下所示:
closed(2).
closed(5).
available(X) :- \+ closed(X).
route(A,[Y|Path1], Cost1,Path, Cost):-
connection(ID,X,Y,Dist,N,E),
available(ID),
...
答案 1 :(得分:0)
或者,您可以将参数作为参数传递给dest/2
谓词您的原始参数+包含要避免的道路数量的列表。有了这个,在\+ member(ID, ListOfNumsToAvoid)
调用之后写一个简单的connection/6
应该这样做。当然,route/5
必须成为route/6
。
然后,编码后,你可以通过调用带有空列表的通用版本作为“回避列表”参数来提出1参数版本。