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