Объясните программу нахождения эйлерова цикла в неориентированном графе - Prolog
Формулировка задачи:
Помогите объяснить программу. Программу взяла с форума. Необходимо найти эйлеровый цикл в неориентированном графе
Листинг программы
- DOMAINS
- s=symbol sl=s*
- CONSTANTS
- graf1=[a,b, b,c, d,c, d,f, f,c, a,c]
- graf2=[a,b, b,c, c,d, d,b, d,a]
- PREDICATES
- rp(s,s,sl,sl)
- cycle(s,s,sl,sl)
- ifEyler(sl,sl)
- CLAUSES
- ifEyler(Graf,Way):- Graf=[Start|_], cycle(Start,Start,Graf,Way), !.
- cycle(A,A,[],[A]):- !.
- cycle(A,F,Gr,[A|B]):- rp(A,C,Gr,GrN), cycle(C,F,GrN,B).
- rp(A,B,[A,B|C],C).
- rp(A,B,[B,A|C],C).
- rp(A,B,[C,X|D],[C,X|F]):- rp(A,B,D,F).
Решение задачи: «Объясните программу нахождения эйлерова цикла в неориентированном графе»
textual
Листинг программы
- % ---- Поиск Эйлерова цикла в графе
- ifEyler(Graf,Way) :-
- Graf=[Start|_], % выбираем первую вершину графа
- cycle(Start,Start,Graf,Way), % ищем путь от вершины Start до нее же по всему графу
- !. % вероятно, автор не хочет искать остальные варианты цикла
- % ---- Поиск пути через все ребра из одной вершины до другой
- cycle(A,A,[],[A]):- !. % когда граф опустел, а начальная вершина совпадает с конечной - выход
- cycle(A,F,Gr,[A|B]) :- % иначе переносим начальную вершину в путь,
- rp(A,C,Gr,GrN), % выбираем ребро от этой вершины и удаляем его из графа
- cycle(C,F,GrN,B). % рекурсивно продолжаем искать путь из конца этого ребра по остатку графа
- % ---- Исключение ребра из графа
- rp(A,B,[A,B|C],C). % если ребро первое в графе, просто исключаем его
- rp(A,B,[B,A|C],C). % то же самое, если ребро запмсано в обратном порядке
- rp(A,B,[C,X|D],[C,X|F]) :- % иначе переносим первое ребро в новый граф
- rp(A,B,D,F). % и рекурсивно обрабатываем остатки
Объяснение кода листинга программы
- Программа находит эйлеров цикл в неориентированном графе.
- Начало работы программы: входные данные — граф, выходные данные — путь в графе, проходящий через каждую вершину ровно один раз.
- Переменная «Start» обозначает начальную вершину графа.
- Переменная «Way» — путь, который проходит через каждую вершину графа ровно один раз.
- Переменная «Graf» — граф, в котором нужно найти эйлеров цикл.
- Переменная «GrN» — граф, полученный после удаления из него одного ребра.
- Переменная «C» — вершина графа, которая достигается после удаления из него одного ребра.
- Переменная «B» — путь, который проходит через каждую вершину графа, кроме начальной, ровно один раз.
- Переменная «F» — конечная вершина графа.
- Если граф пуст и начальная вершина совпадает с конечной, то программа заканчивает работу.
- Иначе начальная вершина переносится в путь, и программа ищет путь из конца этого ребра по остатку графа.
- Если ребро первое в графе, то оно просто исключается из него.
- То же самое происходит, если ребро запмсано в обратном порядке.
- Иначе первое ребро переносится в новый граф, и рекурсивно обрабатывается остаток графа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д