Объясните программу нахождения эйлерова цикла в неориентированном графе - Prolog

Узнай цену своей работы

Формулировка задачи:

Помогите объяснить программу. Программу взяла с форума. Необходимо найти эйлеровый цикл в неориентированном графе
Листинг программы
  1. DOMAINS
  2. s=symbol sl=s*
  3. CONSTANTS
  4. graf1=[a,b, b,c, d,c, d,f, f,c, a,c]
  5. graf2=[a,b, b,c, c,d, d,b, d,a]
  6. PREDICATES
  7. rp(s,s,sl,sl)
  8. cycle(s,s,sl,sl)
  9. ifEyler(sl,sl)
  10. CLAUSES
  11. ifEyler(Graf,Way):- Graf=[Start|_], cycle(Start,Start,Graf,Way), !.
  12. cycle(A,A,[],[A]):- !.
  13. cycle(A,F,Gr,[A|B]):- rp(A,C,Gr,GrN), cycle(C,F,GrN,B).
  14. rp(A,B,[A,B|C],C).
  15. rp(A,B,[B,A|C],C).
  16. rp(A,B,[C,X|D],[C,X|F]):- rp(A,B,D,F).

Решение задачи: «Объясните программу нахождения эйлерова цикла в неориентированном графе»

textual
Листинг программы
  1. % ---- Поиск Эйлерова цикла в графе
  2. ifEyler(Graf,Way) :-
  3.     Graf=[Start|_],              % выбираем первую вершину графа
  4.     cycle(Start,Start,Graf,Way), % ищем путь от вершины Start до нее же по всему графу
  5.     !.                           % вероятно, автор не хочет искать остальные варианты цикла
  6.  
  7. % ---- Поиск пути через все ребра из одной вершины до другой
  8. cycle(A,A,[],[A]):- !.       % когда граф опустел, а начальная вершина совпадает с конечной - выход
  9. cycle(A,F,Gr,[A|B])  :-      % иначе переносим начальную вершину в путь,
  10.     rp(A,C,Gr,GrN),          % выбираем ребро от этой вершины и удаляем его из графа
  11.     cycle(C,F,GrN,B).        % рекурсивно продолжаем искать путь из конца этого ребра по остатку графа
  12.  
  13. % ---- Исключение ребра из графа
  14. rp(A,B,[A,B|C],C).           % если ребро первое в графе, просто исключаем его
  15. rp(A,B,[B,A|C],C).           % то же самое, если ребро запмсано в обратном порядке
  16. rp(A,B,[C,X|D],[C,X|F]) :-   % иначе переносим первое ребро в новый граф
  17.       rp(A,B,D,F).           % и рекурсивно обрабатываем остатки

Объяснение кода листинга программы

  1. Программа находит эйлеров цикл в неориентированном графе.
  2. Начало работы программы: входные данные — граф, выходные данные — путь в графе, проходящий через каждую вершину ровно один раз.
  3. Переменная «Start» обозначает начальную вершину графа.
  4. Переменная «Way» — путь, который проходит через каждую вершину графа ровно один раз.
  5. Переменная «Graf» — граф, в котором нужно найти эйлеров цикл.
  6. Переменная «GrN» — граф, полученный после удаления из него одного ребра.
  7. Переменная «C» — вершина графа, которая достигается после удаления из него одного ребра.
  8. Переменная «B» — путь, который проходит через каждую вершину графа, кроме начальной, ровно один раз.
  9. Переменная «F» — конечная вершина графа.
  10. Если граф пуст и начальная вершина совпадает с конечной, то программа заканчивает работу.
  11. Иначе начальная вершина переносится в путь, и программа ищет путь из конца этого ребра по остатку графа.
  12. Если ребро первое в графе, то оно просто исключается из него.
  13. То же самое происходит, если ребро запмсано в обратном порядке.
  14. Иначе первое ребро переносится в новый граф, и рекурсивно обрабатывается остаток графа.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы