Prolog避开道路,城市

时间:2012-01-14 03:52:27

标签: prolog

这非常有效:

%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).

我的问题是我想避开某些道路(例如:如果道路因事故而无法使用),我无法弄明白道路。

我想我需要一些东西,允许我改变可用的道路的“状态”,当它不可用时,路线功能应该避免并选择另一种方式。但我无法解决这个问题,我正在努力。

2 个答案:

答案 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参数版本。