Задача с графом - 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).
Объяснение кода листинга программы
- Домен il представляет собой последовательность целых чисел.
- Предикат rebro(A,C) означает, что A и C связаны ребром.
- Предикат cikle(Stek,Cikle) описывает цикл в графе, где вершины представлены в порядке их появления в стеке Stek, а Cikle - это конечный результат.
- Предикат duga(A,C) означает, что между A и C есть ребро.
- Предикат prtnadlezhit(A,Stek) проверяет, является ли A частью стека.
- Предикат prefics(A,Stek,Cikle) описывает, что A является последним элементом в стеке Stek, а Cikle - это конечный результат.
- В первой части цикла проверяется, является ли текущий элемент стека (A) равным следующему элементу (C). Если это так, то цикл прерывается.
- Во второй части цикла проверяется, является ли текущий элемент стека (A) последним элементом. Если это так, то цикл прерывается.
- Если текущий элемент стека (A) не является последним, то проверяется, является ли он частью стека. Если это так, то цикл прерывается.
- Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в конец стека.
- Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в начало стека.
- Целью является наличие ребра между A и C и наличие цикла в графе, представленного в порядке их появления в стеке.
- В первой части цикла проверяется, является ли текущий элемент стека (A) равным следующему элементу (C). Если это так, то цикл прерывается.
- Во второй части цикла проверяется, является ли текущий элемент стека (A) последним элементом. Если это так, то цикл прерывается.
- Если текущий элемент стека (A) не является последним, то проверяется, является ли он частью стека. Если это так, то цикл прерывается.
- Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в конец стека.
- Если текущий элемент стека (A) не является последним и не является частью стека, то он помещается в начало стека.
- Целью является наличие ребра между A и C и наличие цикла в графе, представленного в порядке их появления в стеке.
- В первой части цикла проверяется, является ли текущий элемент стека (A) равным следующему элементу (C). Если это так, то цикл прерывается.
- Во второй части цикла проверяется, является ли текущий элемент стека (A) последним элементом. Если это так, то цикл прерывается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д