Вот кодПрологе рекурсия делает бесконечный цикл
flight(roc,syr,25).
flight(roc,jfk,55).
flight(jfk,bos,65).
flight(bos,syr,40).
flight(jfk,syr,50).
flight(bos,roc,50).
layover(roc,25).
layover(jfk,55).
layover(syr,30).
layover(bos,40).
route(X,Y,R,D) :-
flight(X,Y,L),
D is L,
R = [X,Y].
route(X,Y,R,D) :-
flight(X,Z,L),
route(Z,Y,P,M),
R = [X|P],
layover(Z,T),
D is M+L+T,
\+ member(X,P).
Вот что происходит. Второй пункт
route(X,Y,R,D) :-
flight(X,Z,L),
route(Z,Y,P,M),
R = [X|P],
layover(Z,T),
D is M+L+T,
\+ member(X,P).
Входит в бесконечный цикл. Он отображает ответы, которые я хочу, а затем продолжает находить больше ответов (поскольку вы можете просто продолжать цикл вокруг остановок в принципе) и делает бесконечный цикл, пока он не остановится. Предполагается, что программа найдет все возможные маршруты полета, которые не будут проходить вокруг остановок. Я знаю, почему это происходит, но я понятия не имею, как изменить свой код, чтобы исправить это. Пожалуйста помоги.
Вот одно решение
?- route(roc, syr, Routing, Duration).
Routing = [roc, syr],
Duration = 25 ;
Routing = [roc, jfk, syr],
Duration = 160 ;
Routing = [roc, jfk, bos, syr],
Duration = 255 ;
false.
Угадайте, я не объяснил все переменные. R - маршрут, D - расстояние (нужно рассчитывать при прокладке). R и D - ответы, поэтому я не помещаю их, когда я вызываю правило. Не уверен, правильно ли вы предложили. В случае маршрута, который вы дали, откуда происходят H и T, и D никогда не определяется. –
? - route (roc, syr, Routing, Duration). Маршрутизация = [roc, syr], Продолжительность = 25; Маршрутизация = [roc, jfk, syr], Продолжительность = 160; Маршрутизация = [roc, jfk, bos, syr], Продолжительность = 255; false. –