Я написал несколько строк кода, чтобы помочь вам, но как https://stackoverflow.com/users/812818/daniel-lyons сказал, это лучше, чем ты выучил что-то более легкое раньше.
Чтобы решить вашу проблему, я советую вам прочитать, по крайней мере, первые 3 главы этой книги: http://www.learnprolognow.org/lpnpage.php?pageid=online и проведите практическое занятие по пункту 3.4.
Затем вы можете взглянуть на мой код (вы можете найти его объяснение здесь: Ошибка вне локального стека в планировщике маршрутов Prolog.
Вот код
way(madrid, barcelona, 4).
way(barcelona, paris, 5).
way(madrid, londres, 3).
way(londres,paris,1).
shortway(From, To):- findall(Journey, travel(From, To, Journey, _) , Travels_list),
findall(Total_distance, travel(From, To, _, Total_distance) , Distances_list),
min_member(Y, Distances_list), find_minimum_index(Y, Distance_list, 1, Distance_index),
find_journey(Distance_index, Travels_list, 0, Shortest_path),
format('The shortest path is ~w', [Shortest_path]).
travel(From, To, Journey, Total_distance) :- dif(From, To),
AccDistance is 0,
path(From, To, [From], Journey, AccDistance, Total_distance).
path(From, To, Passed_cities, go(From, To), AccDistance, Total_distance) :- way(From, To, Way_distance),
Total_distance is AccDistance + Way_distance.
path(From, To, Passed_cities, go(From, Intermediate, GO), AccDistance, Total_distance) :- way(From, Intermediate, Way_distance),
dif(Intermediate, To),
\+ member(Intermediate, Passed_cities),
NewAccDistance is AccDistance + Way_distance,
path(Intermediate, To, [Intermediate|Passed_cities], GO, NewAccDistance, Total_distance).
min_member(Min, [H|T]) :- min_member_(T, H, Min).
min_member_([], Min, Min).
min_member_([H|T], Min0, Min) :-
( H >= Min0
-> min_member_(T, Min0, Min)
; min_member_(T, H, Min)
).
find_minimum_index(X, [], N, I) :- fail.
find_minimum_index(X, [X|T], N, I) :- I is N, !.
find_minimum_index(X, [H|T], N, I) :- H \= X, increment(N, N1), find_minimum_index(X, T, N1, I).
find_journey(I, [H|T], N, Elemento) :- N = I, Elemento = H, !.
find_journey(I, [H|T], N, Elemento) :- N \= I, increment(N, N1), find_journey(I, T, N1, Elemento).
increment(X, X1) :- X1 is X+1.
Тогда вы звоните, например
?: - шортвей (мадрид, париж).
и он вернется
"The shortest path is go(madrid, londres, go(londres,paris))"
какое расстояние, 4, а не
go(madrid, barcelona, go(barcelona, madrid)
расстояние 9.
Подводя итог: вызывая shortway / 2, с предикатами findall / 3 вы найдете списки всех возможных путей и их относительные расстояния, соответственно, затем вы просмотрите список расстояний, чтобы найти индекс минимального элемента и, таким образом, используя его, чтобы найти кратчайший путь из списка всех ранее найденных путей.
person
s.dallapalma
schedule
14.12.2015