русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Представление бинарных деревьев


Дата добавления: 2013-12-23; просмотров: 2262; Нарушение авторских прав


Преобразование данных в Прологе

Для преобразования данных из одного типа в другой Пролог имеет следующие встроенные предикаты:

upper_lower;

str_char;

str_int;

str_real;

char_int.

Все предикаты преобразования данных имеют два терма. Все предикаты имеют два направления преобразования данных в зависимости от того, какой терм является свободной или связанной переменной.

Пример 63:

upper_lower («STARS», S2).

upper_lower (S1,«stars»).

str_char («T», C).

str_char (S, ’T’).

str_int («123», N).

str_int (S, 123).

str_real («12.3», R).

str_real (S, 12.3).

char_int (‘A’, N).

char_int (C, 61).

В Прологе нет встроенных предикатов для преобразования действительных чисел в целые и наоборот, или строк в символы. На самом деле, правила преобразования данных типов очень просты и могут быть заданы в программе самими программистом.

Пример 64:

predicates

conv_real_int (real, integer)

conv_int_real (integer, real)

conv_str_symb (string, symbol)

clauses

conv_real_int (R, N):- R=N.

conv_int_real (N, R):- N=R.

conv_str_symb (S, Sb):- S=Sb.

goal

conv_real_int (5432.765, N). (N= 5432).

conv_int_real (1234, R). (R=1234).

conv_str_symb («Visual Prolog», Sb). (Sb=Visual Prolog).

Пример 65: преобразование строки в список символов с использованием предиката frontchar.

domains

list=char*

predicates

convert (string, list)

clauses

convert («», []).

convert (Str, [H\T]):- frontchar(Str, H, Str1),

convert(Str1, T).

Одной из областей применения списков является представление множества объектов. Недостатком представления множества в виде списка является неэффективная процедура проверки принадлежности элемента множеству. Используемый для этой цели предикат member неэффективен при использовании больших списков.



Для представления множеств могут использоваться различные древовидные структуры, которые обеспечивают более эффективную реализацию проверки принадлежности элемента множеству, в частности, в данном разделе для этой цели рассматриваются бинарные деревья.

Представление бинарных деревьев основано на определении рекурсивной структуры данных, использующей функцию типа tree (Top, Left, Right) или tree (Left, Top, Right), где Top - вершина дерева, Left и Right - соответственно левое и правое поддерево. Пустое дерево обозначим термом nil. Объявить бинарное дерево можно следующим образом:

Пример 66:

domains

treetype1=tree(symbol, treetype1, treetype1);nil

treetype2=tree(treetype2, symbol, treetype2);nil

Пример 67:

Пусть дано дерево следующего вида:

a

b c

d e

 

Такое дерево может быть задано следующим образом:

1. левое поддерево: tree (b, tree (d, nil, nil), tree (e, nil, nil)).

2. правое поддерево: tree (c, nil, nil).

3. все дерево: tree (a, tree (b, tree (d, nil, nil), tree (e, nil, nil)), tree (c, nil, nil)).

Пример 69: написать программу проверки принадлежности вершины бинарному дереву.

domains

treetype = tree(symbol, treetype, treetype);nil()

predicates

in(symbol, treetype)

clauses

in(X, tree(X,_,_).

in(X, tree(_,L,_):-in(X, L).

in(X, tree(_,_,R):-in(X, R).

goal

in(d,tree(a, tree(b, tree(d, nil, nil),

tree(e, nil, nil)),

tree(c, nil, nil))).

Поиск вершины в неупорядоченном дереве также неэффективен, как и поиск элемента в списке. Если ввести отношение упорядочения между элементами множества, то процедура поиска элемента становится гораздо эффективнее. Можно ввести отношение упорядочения слева направо непустого дерева tree(X, Left, Right) следующим образом:

1. Все узлы в левом поддереве Left меньше X.

2. Все узлы в правом поддереве Right больше X.

3. Оба поддерева также являются упорядоченными.

Преимуществом упорядочивания является то, что для поиска любого узла в дереве достаточно провести поиск не более, чем в одном поддереве. В результате сравнения узла и корня дерева из рассмотрения исключается одно из поддеревьев.

Пример 70: написать программу проверки принадлежности вершины упорядоченному слева направо бинарному дереву.

domains

treetype = tree(byte, treetype, treetype);nil()

predicates

in(byte, treetype)

clauses

in(X, tree(X,_,_).

in(X, tree(Root,L,R):-Root>X,in(X, L).

in(X, tree(Root,L,R):-Root<X,in(X, R).

goal

in(6,tree(4, tree(2, nil, tree(3, nil, nil)),

tree(5,tree(1,nil,nil),nil)),tree(8,tree(7,nil,nil),tree(9,nil,tree(10,nil,nil)))).

Пример 71: написать программу печати вершин бинарного дерева, начиная от корневой и следуя правилу левого обхода дерева.

domains

treetype = tree(symbol, treetype, treetype);nil()

predicates

print_all_elements(treetype)

clauses

print_all_elements(nil).

print_all_elements(tree(X, Y, Z)) :-

write(X), nl, print_all_elements(Y),

print_all_elements(Z).

goal

print_all_elements(tree(a, tree(b, tree(d, nil, nil),

tree(e, nil, nil)),

tree(c, nil, nil))).

Пример 72: написать программу проверки изоморфности двух бинарных деревьев.

domains

treetype = tree(symbol, treetype, treetype);nil

predicates

isotree (treetype, treetype)

clauses

isotree (T, T).

isotree (tree (X, L1, R1), tree (X, L2, R2)):- isotree (L1, L2), isotree (R1, R2).

isotree (tree (X, L1, R1), tree (X, L2, R2)):- isotree (L1, R2), isotree (L2, R1).

Пример 73: написать предикаты создания бинарного дерева из одного узла и вставки одного дерева в качестве левого или правого поддерева в другое дерево.

domains

treetype = tree(symbol, treetype, treetype);nil

predicates

create_tree(symbol, tree)

insert_left(tree, tree, tree)

insert_rigth(tree, tree, tree)

clauses

create_tree(N, tree(N,nil,nil)).

insert_left(X, tree(A,_,B), tree(A,X,B)).

insert_rigth(X,tree(A,B,_), tree(A,B,X)).

goal

create_tree(a, T1)), insert_left(tree(b, nil, nil), tree(c, nil, nil), T2),

insert_rigth(tree(d, nil, nil), tree(e, nil, nil), T3).

В результате: T1=tree(a, nil, nil), T2=tree(c, tree(b, nil, nil), nil), T3=tree(d, nil, tree(e, nil, nil)).



<== предыдущая лекция | следующая лекция ==>
Использование строк в Прологе. | Представление графов в языке Пролог


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.01 сек.