Помогите найти пути - PullRequest
       6

Помогите найти пути

0 голосов
/ 14 декабря 2010
% link(Origin,Destination,Speed,Length).
link(paris,milano,140,360).
link(paris,london,200,698).
link(berlin,atena,110,714).
link(atena,paris,90,370).

Мне нужно написать этот предикат маршрута, чтобы я получил Path из города X в город Y.

route(Origin,Destination,TrainType,Path,Length,Duration).

Я новичок в Прологе, поэтому я написал что-то вроде этогоЯ знаю, что это не правильно:

route(Origin,Destination,TrainType,Path,Legth,Duration) :-
    link(Origin,City,Len),
    City \= Origin,
    NewLen is Length + Len,
    route(City,Destination,TrainType,Path,NewLen,Duration).

1 Ответ

2 голосов
/ 14 декабря 2010

В вашем предикате отсутствует базовый случай , который указывает, когда следует остановиться. Прямо сейчас ваш предикат всегда будет вызывать сам себя, пока не выйдет из строя (или, что еще хуже, зациклится бесконечно, в зависимости от вашего предиката link). Следующее дает вам обратный путь:

route(Goal, Goal, Path, Path).  % base case
route(From, To, Path0, Path) :-
    direct_link(From, Via),
    route(Via, To, [From|Path0], Path).

где прямая ссылка означает, что вы можете добраться от А до Б; Я предполагаю, что железные дороги двунаправлены:

direct_link(A,B) :- link(A, B, _Speed, _Length).
direct_link(B,A) :- link(B, A, _Speed, _Length).

Вам нужно будет вызвать reverse на пути и добавить аргументы для отслеживания длины и продолжительности. Я оставлю это как упражнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...