- •Глава 2 арифметика и структуры данных
- •2. 1. Арифметика
- •Арифметические выражения
- •Предикат "is"
- •Предикаты, выполняющие сравнение
- •Виды связи аргументов
- •2. 2. Структуры данных Типы термов
- •Примеры составных термов
- •Рекурсивные структуры
- •Процедура, которая строит рекурсивную структуру
- •2. 3. Списки Представление списков при помощи структуры "./2"
- •Другая форма представления списка, в которой употребляются квадратные скобки
- •Представление списков произвольной длины
- •Список произвольной длины при использовании формы записи с квадратными скобками
- •Унификация списков
- •Сравнение списков и простых структур
- •2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков
- •Выполнение запроса к процедуре "печатать—элементы"
- •Печать списка в обратном порядке
- •Форма записи аргументов в заголовке правила
- •Примеры процедур, предназначенных для обработки списков
- •2. 5. Способы представления базы данных Пять способов представления
- •1) Представление целостных информационных элементов в виде фактов
- •2) Представление атрибутов в виде фактов
- •3) Представление в виде списка структур
- •4) Представление в виде рекурсивной структуры
- •5) Представление в виде двоичного дерева
- •Сравнение разных видов представления базы данных
- •Библиографические заметки
- •Упражнения
Сравнение разных видов представления базы данных
Наиболее важным различием между описанными выше формами представления базы данных является то, что для доступа к данным в каждом случае требуется свой алгоритм. Говоря конкретно, при представлении базы данных в виде целостных информационных элементов, являющихся фактами, или при представлении атрибутов в виде фактов доступ к базе данных должен осуществляться при помощи алгоритма поиска с возвратом (backtracking algorithm), а при использовании рекурсивных структур данных (в том числе, списков и двоичных деревьев) доступ должен реализовываться рекурсивным алгоритмом. Правила и запросы, приведенные в настоящем разделе, служат простыми примерами этих алгоритмов. Представление в виде двоичного дерева имеет то преимущество, что время поиска конкретной записи будет обычно меньшим, чем при иных представлениях. Ввиду того, что древовидная структура содержит данные в отсортированном виде, при поиске интересующей записи процедуре выборки понадобится просмотреть меньшее количество записей.
Библиографические заметки
Трактовка базы данных как потока записей, который может быть представлен рекурсивной структурой, была предложена в работе [58].
Упражнения
1. Напишите составной запрос, в котором конкретизируется переменная X, получая значение 10, а затем конкретизируется переменная Y, которой присваивается значение, получаемое в результате умножения Х на 3.
Напишите заново тот же составной запрос, добавив в него третью подцель, в которой проверяется, равно ли значение переменной Y числу 300. Как Вы можете объяснить результаты выполнения этих двух запросов?
2. Напишите правило, позволяющее вычислить площадь прямоугольника. У этого правила должны быть три аргумента: основание, высота и площадь прямоугольника. Напишите несколько запросов к этому правилу, используя в качестве каждого аргумента и числа, и переменные.
Является ли данная программа обратимой (т. е. являются ли аргументы двунаправленными)?
3. Напишите запрос к процедуре "присоединить", в котором два существующих. списка объединяются в один — третий список. Запишите еще один запрос, генерирующий все возможные комбинации подсписков, которые могут быть сформированы из списка, содержащего 10 элементов.
4. Составьте новую версию процедуры "найти_слово", в которой будет подсчитываться, сколько раз заданное слово встречается в списке.
5. Напишите новую версию процедуры "длина", в которой при подсчете количества элементов списка не учитывается слово "пусто". К примеру, для списка
[а, b, с, d, e]
новая версия процедуры должна сообщать, что длина списка равна пяти, а для списка
[а, пусто, с, d, пусто]
эта процедура должна давать длину, равную трем.
6. Можно ли переопределить процедуру "можно_путешествовать5" так, чтобы она стала симметричной?
7. Пусть имеется список структур "кл":
[кл (а, 29. 3), кл (b, 29, 6), кл (с, 40, 2)]
Первым аргументом каждой структуры служит имя клиента, вторым — суточный тариф, а третьим — количество дней, на которое взята автомашина. Напишите правило, позволяющее вычислить итоговую сумму оплаты, объединяющую выплаты всех клиентов, данные о которых содержатся в списке.
8. Напишите новую версию процедуры "предок", которая вырабатывает список представителей всех промежуточных поколений, располагающихся между предком и потомком. Предположим, например, что Генри является отцом Джека, Джек - отцом Ричарда, Ричард - отцом Чарльза, а Чарльз - отцом Джейн. При запросе о том, является ли Генри предком Джейн, должен выдаваться список, характеризующий родственную связь этих людей, конкретно:
[джек, ричард, чарльз]
9. Напишите новую версию процедуры "можно—путешествовать", которая должна стыковаться с программой "советник по транспорту", написанной Вами в качестве упражнения к гл. 1. Добавьте к этой процедуре аргумент, через который будет выдаваться список всех городов, через которые прошел маршрут путешествия от исходного пункта к месту назначения.
10. Напишите рекурсивную процедуру, которая будет преобразовывать базу данных, заданную в виде двоичного дерева, в список записей.
11. Сравните процедуру "нпредок" (см. разд. 1. 6) с процедурой "обр_печать" (см. разд. 2. 4). Обе процедуры леворекурсивны. Почему процедура "обр_печать" работает нормально, а процедура "нпредок" работает некорректно? (Указание: посмотрите, как в заголовках фраз обеих процедур специфицируются аргументы.)