Поиск в глубину или ширину (SWI Prolog)
Формулировка задачи:
Помогите решить задачу!
Найти все пути из Москвы в Новосибирск, проходящие через Пермь.
Нужно использовать SWI Prolog.
Граф имеет вид:
Решение задачи: «Поиск в глубину или ширину (SWI Prolog)»
textual
Листинг программы
:- if(current_predicate(use_rendering/1)).
:- use_rendering(table, [header(go('откуда', 'куда'))]).
:- endif.
/** <examples>
?- find_way(moskva, novosib, perm, Way).
*/
edge(moskva, nnovgorod).
edge(moskva, samara).
edge(nnovgorod, perm).
edge(nnovgorod, ekaterinburg).
edge(perm, ekaterinburg).
edge(ekaterinburg, samara).
edge(samara,ekaterinburg).
edge(ekaterinburg, novosib).
edge(samara, novosib).
find_way(From, To, Across, Way) :-
find_way(From, To, Across, no, [], Way0),
reverse(Way0, Way).
find_way(Point, To, _, yes, Track, [go(Point, To) | Track]) :-
edge(Point, To).
find_way(From, To, Across, IsAcross, Track, Way) :-
edge(From, Point),
not( member(go(From, Point), Track) ),
( Point = Across, IsAcross1 = yes ; Point \= Across, IsAcross1 = IsAcross ),
find_way(Point, To, Across, IsAcross1, [go(From, Point) | Track], Way).