Обход в ширину - 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]). - это правило вывода для функции