Обход в ширину - Prolog
Формулировка задачи:
Помогите ребята переделать эту код !
Обход дерева «в ширину» и вывод пути в виде последовательности элементов.
Это обход дерева "сначала вглубь"
Решение задачи: «Обход в ширину»
textual
Листинг программы
domains treetype = tree (integer, treetype, treetype); empty treelist = treetype* predicates print_all_elements (treetype) print_list (treelist) append(treelist, treelist, treelist) clauses print_all_elements (Tree) :- print_list([Tree]). print_list([]). print_list([empty | Tail]) :- print_list(Tail). print_list([tree (X, Y, Z) | Tail]) :- write (X), nl, append(Tail, [Y, Z], New), print_list(New). append([H | T1], L2, [H | T]) :- append(T1, L2, T). append([], L, L).
Объяснение кода листинга программы
В представленном коде используется язык программирования Prolog. Всего в коде 20 элементов, которые можно разделить на следующие группы:
- domains - определения типов данных. В данном случае определен тип данных
treetype
и тип данныхtreelist
. - predicates - определения функций. В данном случае определены три функции:
print_all_elements
,print_list
иappend
. - clauses - определения правил вывода. Здесь определены правила вывода для функций
print_all_elements
иprint_list
. Рассмотрим подробнее каждое из определений: - domains
- treetype = tree (integer, treetype, treetype) - здесь определен тип данных
treetype
, который может принимать значенияtree
, гдеinteger
- это целочисленное значение, аtreetype
- это еще один экземпляр типа данныхtreetype
. - empty - это пустое значение типа данных
treetype
.
- treetype = tree (integer, treetype, treetype) - здесь определен тип данных
- predicates
- print_all_elements (treetype) - эта функция выводит все элементы, которые соответствуют типу данных
treetype
. - print_list (treelist) - эта функция выводит список, который соответствует типу данных
treelist
. - append(treelist, treelist, treelist) - эта функция добавляет один список к другому.
- print_all_elements (treetype) - эта функция выводит все элементы, которые соответствуют типу данных
- clauses
- print_all_elements (Tree) :- print_list([Tree]). - это правило вывода для функции
print_all_elements
. Здесь предполагается, что если передается экземпляр типа данныхtreetype
, то это означает, что нужно вывести список, содержащий этот экземпляр. - print_list([]). - это правило вывода для функции
print_list
. Если передается пустой список, то он просто выводится. - print_list([empty | Tail]) :- print_list(Tail). - если в списке есть экземпляр типа данных
treetype
со значениемempty
, то он удаляется, и функция вызывается рекурсивно для оставшейся части списка. - print_list([tree (X, Y, Z) | Tail]) :- write (X), nl, append(Tail, [Y, Z], New), print_list(New). - если в списке есть экземпляр типа данных
treetype
с целочисленным значениемX
, то это значение выводится, а затем вызывается функцияappend
для объединения оставшейся части списка с новым списком, содержащим значенияY
иZ
. - append([H | T1], L2, [H | T]) :- append(T1, L2, T). - это правило вывода для функции
append
. Если первый элемент спискаT1
совпадает с первым элементом спискаL2
, то он добавляется в новый список, а затем вызывается функцияappend
для объединения оставшейся части спискаT1
с новым списком. - append([], L, L). - если первый список пустой, то он просто заменяется вторым списком.
- print_all_elements (Tree) :- print_list([Tree]). - это правило вывода для функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д