У меня есть задание написать программу Prolog, в которой перечислены пути между двумя подземными станциями (метро), но она должна благоприятствовать путям с меньшими изменениями строки (она должна оставаться как можно дольше в той же строке до коммутационные линии).Prolog Pathfinding с приоритетом
Я придумал макет сценария и этот код, в то время как он правильно перечисляет некоторые пути (я знаю, что мне все еще нужно закодировать обнаружение цикла), не расставляет приоритеты в сегментах с одинаковой линией, как следовало бы.
Мой маршрутизатор:
route(X,Y,[drive(X,Y,L)],_) :- road(X,Y,L).
%route(From, To, Directions, Lines_Visited).
route(X,Y,[drive(X,Z,L)|R],Ls) :-
take(Ls,L,_), %prioritise same-line paths
road(X,Z,L),
route(Z,Y,R,Ls), !.
route(X,Y,[drive(X,Z,L)|R],Ls) :-
road(X,Z,L), %if no same-line pathes exist, try different line
route(Z,Y,R,[Ls|L]).
Где взять/3 является
take([H|T], H, T).
Один тестовый сценарий будет:
road(a,b,x).
road(b,c,x).
road(c,d,x).
road(d,e,x).
road(e,f,x).
road(b,f,y).
road(f,g,x).
%a - b - c - d - e - f - g
% |_______________|
Если я пытаюсь маршрут (а, е, X). Я бы получил путь a -> b -> f, который меняет строки один раз, а THEN - однострочный путь a-> b-> c-> d-> e-> f.
По-видимому, моя приоритизация не работает, и я не могу придумать другой способ сделать это. Может кто-то пролить некоторый свет и указать мне на направление, чтобы решить эту проблему более эффективно?