Задача с графом - Prolog

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

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

Здравствуйте! помогите написать программу на прологе, задание такое: Напишите программу, которая определяет, является ли данный граф свободным деревом. Свободное дерево – это связный граф, не имеющий циклов. Буду очень благодарен)

Решение задачи: «Задача с графом»

textual
Листинг программы
domains il=integer*
predicates
nondeterm rebro(integer,integer)
nondeterm cikle(il,il)
nondeterm duga(integer,integer)
prtnadlezhit(integer,il)
prefics(integer,il,il)
 
clauses 
duga(1,2).  duga(2,3).  duga(2,4).
duga(3,4).  
rebro(A,C):-duga(A,C);duga(C,A).
 
cikle([C,A|Stek],[B|Cikle]):-rebro(C,B),B<>A,
   prtnadlezhit(B,Stek),prefics(B,[C,A|Stek],Cikle),!.
cikle([C,A|Stek],Cikle):-rebro(C,B),B<>A,
   not(prtnadlezhit(B,Stek)),cikle([B,C,A|Stek],Cikle).
 
prtnadlezhit(A,[A|_]):-!.
prtnadlezhit(A,[_|Stek]):-prtnadlezhit(A,Stek).
 
prefics(A,[A|_],[A]):-!.
prefics(A,[C|Stek],[C|Cikle]):-prefics(A,Stek,Cikle).
goal 
duga(A,C),
cikle([C,A],Cikle).

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

  1. Домен il представляет собой последовательность целых чисел.
  2. Предикат rebro(A,C) означает, что A и C связаны ребром.
  3. Предикат cikle(Stek,Cikle) описывает цикл в графе, где вершины представлены в порядке их появления в стеке Stek, а Cikle - это конечный результат.
  4. Предикат duga(A,C) означает, что между A и C есть ребро.
  5. Предикат prtnadlezhit(A,Stek) проверяет, является ли A частью стека.
  6. Предикат prefics(A,Stek,Cikle) описывает, что A является последним элементом в стеке Stek, а Cikle - это конечный результат.
  7. В первой части цикла проверяется, является ли текущий элемент стека (A) равным следующему элементу (C). Если это так, то цикл прерывается.
  8. Во второй части цикла проверяется, является ли текущий элемент стека (A) последним элементом. Если это так, то цикл прерывается.
  9. Если текущий элемент стека (A) не является последним, то проверяется, является ли он частью стека. Если это так, то цикл прерывается.
  10. Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в конец стека.
  11. Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в начало стека.
  12. Целью является наличие ребра между A и C и наличие цикла в графе, представленного в порядке их появления в стеке.
  13. В первой части цикла проверяется, является ли текущий элемент стека (A) равным следующему элементу (C). Если это так, то цикл прерывается.
  14. Во второй части цикла проверяется, является ли текущий элемент стека (A) последним элементом. Если это так, то цикл прерывается.
  15. Если текущий элемент стека (A) не является последним, то проверяется, является ли он частью стека. Если это так, то цикл прерывается.
  16. Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в конец стека.
  17. Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в начало стека.
  18. Целью является наличие ребра между A и C и наличие цикла в графе, представленного в порядке их появления в стеке.
  19. В первой части цикла проверяется, является ли текущий элемент стека (A) равным следующему элементу (C). Если это так, то цикл прерывается.
  20. Во второй части цикла проверяется, является ли текущий элемент стека (A) последним элементом. Если это так, то цикл прерывается.

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


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

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

15   голосов , оценка 3.8 из 5