Сравнение разных видов представления базы данных

Наиболее важным различием между описанными выше формами представления базы данных является то, что для доступа к данным в каждом случае требуется свой алгоритм. Говоря конкретно, при представлении базы данных в виде целостных информационных элементов, являющихся фактами, или при представлении атрибутов в виде фактов доступ к базе данных должен осуществляться при помощи алгоритма поиска с возвратом (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). Обе процедуры леворекурсивны. Почему процедура "обр_печать" работает нормально, а процедура "нпредок" работает некорректно? (Указание: посмотрите, как в заголовках фраз обеих процедур специфицируются аргументы.)

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие