Поиск в глубину или ширину (SWI Prolog)
Формулировка задачи:
Помогите решить задачу!
Найти все пути из Москвы в Новосибирск, проходящие через Пермь.
Нужно использовать SWI Prolog.
Граф имеет вид:
Листинг программы
- 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).
Решение задачи: «Поиск в глубину или ширину (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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д