Пролог избегай дороги, город - PullRequest
1 голос
/ 14 января 2012

Это прекрасно работает:

%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 голосов
/ 14 января 2012

альтернативно, вы можете передать в качестве параметров предикат dest/2 вашего исходного параметра + список, содержащий номера дорог, которых следует избегать.Имея это, следует написать простую \+ member(ID, ListOfNumsToAvoid) после вызова connection/6.Конечно, route/5 должен был бы стать route/6.

Затем, закодировав это, вы могли бы предложить версию с 1 параметром, просто вызвав общую версию с пустым списком в качестве параметра «списка избегания».

0 голосов
/ 14 января 2012

Вы можете создать список закрытых дорог по 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),
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...