- •Глава 2 арифметика и структуры данных
- •2. 1. Арифметика
- •Арифметические выражения
- •Предикат "is"
- •Предикаты, выполняющие сравнение
- •Виды связи аргументов
- •2. 2. Структуры данных Типы термов
- •Примеры составных термов
- •Рекурсивные структуры
- •Процедура, которая строит рекурсивную структуру
- •2. 3. Списки Представление списков при помощи структуры "./2"
- •Другая форма представления списка, в которой употребляются квадратные скобки
- •Представление списков произвольной длины
- •Список произвольной длины при использовании формы записи с квадратными скобками
- •Унификация списков
- •Сравнение списков и простых структур
- •2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков
- •Выполнение запроса к процедуре "печатать—элементы"
- •Печать списка в обратном порядке
- •Форма записи аргументов в заголовке правила
- •Примеры процедур, предназначенных для обработки списков
- •2. 5. Способы представления базы данных Пять способов представления
- •1) Представление целостных информационных элементов в виде фактов
- •2) Представление атрибутов в виде фактов
- •3) Представление в виде списка структур
- •4) Представление в виде рекурсивной структуры
- •5) Представление в виде двоичного дерева
- •Сравнение разных видов представления базы данных
- •Библиографические заметки
- •Упражнения
5) Представление в виде двоичного дерева
Можно еще более усовершенствовать метод представления данных в виде рекурсивной структуры, если преобразовать структуру "рс" в двоичное дерево ("дд"). Это достигается путем введения одного дополнительного аргумента. Смысл использования двоичного дерева заключается в том, чтобы хранить базу данных в отсортированном виде.
В приводимом ниже примере база данных отсортирована по атрибуту, описывающему имя служащего.
Теперь в структуре будет шесть аргументов:
дд (Имя, ОтдДолж, Окл, Предыдущ, Последующ)
Переменная «Предыдущ» описывает ветвь дерева, содержащую все целостные информационные элементы, стоящие (в соответствии с алфавитным порядком) перед текущим элементом. Переменная «Последующ» представляет ветвь, охватывающую все целостные информационные элементы, расположенные, согласно алфавиту, после данного элемента. Предположим, что целостный информационный элемент, содержащий все сведения о Нэнси, является самым верхним узлом дерева. Тогда двоичное дерево, отсортированное в алфавитном порядке по именам служащих, примет вид, изображенный на рис. 2. 3. Это можно записать следующим образом:
дд (нэнси, 200,начальник, 71000,
дд (брайен. 100, onepaтop, 20000, end, end),
дд (paльф, 100, мeнeджep, 71500, end, end)
)
Версия процедуры "один_диэ" для представления данных в виде двоичного дерева будет иметь вид:
% игнорировать верхний уровень двоичного дерева; вызвать про-
%цедуру "один_циэ_дд" для получения следующего целостного
% информационного элемента в соответствии со значением переменной
% Предыдущ:
% - +
один_циэ_дд (сл (Имя, Отд, Долж, Окл), дд (_, _, _, _, Предыдущ,
Последующ))
: - один_циэ_дд (сл (Имя. Отд, Долж, Окл), Предыдущ).
% выдать целостный информационный элемент, расположенный на
% верхнем уровне двоичного дерева:
один_циэ_дд (сл (Имя, Отд, Долж, Окл), дд (Имя, Отд, Долж, Окл, _, _)).
% игнорировать верхний уровень двоичного дерева; вызвать про-
% цедуру "один_циэ_дд" для получения следующего целостного
% информационного элемента в соответствии со. значением переменной.
% Последующ:
один_циэ_дд (сл (Имя, Отд, Долж, Окл), дд (_, -, -, -, Предыдущ,
Последующ))
: - один_циэ_дд (сл (Имя, Отд, Долж, Окл), Последующ).
Теперь процедура "один_циэ_дд" определена, можно написать запрос, позволяющий найти всех служащих отдела 100. Вторым аргументом запроса является целиком вся база данных.
|? -один_циэ_дд (сл (Имя, 100,Долж, Окл),
дд (нэнси, 200, начальник, 71000,
дд (брайен, 100, оператор, 20000, end, еnd).
дд (ральф, 100, менеджер, 71500, end)
)
).
Имя = брайен
Долж = оператор
Окл = 20000;
Имя =ральф
Долж = менеджер
Окл = 71500;
нет
Свойства представления в виде двоичного дерева
Одним из интересных свойств представления в виде двоичного дерева является то, что процедура "один_циэ_дд" всегда будет выдавать целостные информационные элементы, образующие дерево, в отсортированном порядке. Это иллюстрирует запрос:
|? -один_циэ_дд (Запись,
дд (нэнси, 200, начальник, 71000,
дд (брайен, 100, onepaтоp, 20000, end, end),
дд (ральф, 100, менеджер, 71500, end, end)
)
).
Запись = сл (брайен, 100, оператор, 20000);
Запись = сл (нэнси, 200, начальник, 71000);
Запись = сл (ральф, 100, менеджер, 71500);
нет