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