Поиск в глубину или ширину (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).

Оцени полезность:

14   голосов , оценка 4.286 из 5