
- •Глава 2 Программирование баз данных
- •2.1. Простые базы данных
- •2.2. Структурированные и абстрактные данные
- •2.3. Рекурсивные правила
- •2.4. Логические программы и модель реляционной базы данных
- •2.5. Дополнительные сведения
- •Глава 3 Рекурсивное программирование
- •3.1. Арифметика
- •X, y и z натуральные числа, такие, что z равно произведению х и y.
- •3.2. Списки
- •3.3. Построение рекурсивных программ
- •3.4. Бинарные деревья
- •3.5. Работа с символьными выражениями
- •3.6. Дополнительные сведения
2.3. Рекурсивные правила
До сих пор описывались правила, определяющие новые отношения в терминах существующих отношений. Важным расширением множества подобных правил являются рекурсивные определения, в которых отношения определяются в терминах этих же отношений. Один из способов перехода к рекурсивным правилам состоит в обобщении множества нерекурсивных правил.
Рассмотрим правила, описывающие прародителей, прапрародителей и т.д.:
прародитель(Предок, Потомок)
родитель (Предок, Человек),
родитель (Человек, Потомок).
прапрародитель (Предок, Потомок)
родитель(Предок, Человек),
прародитель (Человек, Потомок)
прапрапрародитель (Предок, Потомок)
родитель(Предок, Человек)
прапрародитель(Человек, Потомок).
Можно заметить простую схему, которую мы опишем в правиле, задающем отношение предок (Предок, Потомок):
предок (Предок, Потомок)
родитель(Предок, Человек), предок (Человек, Потомок).
Это правило представляет собой обобщение введенных ранее правил.
Логическая программа для отношения предок требует также и нерекурсивного правила, выбор которого влияет на значение программы. Если использовать факт предок (Х,Х),приводящий к рефлексии отношения предок, то каждый человек будет своим собственным предком. Это не соответствует интуитивному пониманию слова предок. Программа 2.5 является логической программой, определяющей отношение предок, в ней родители считаются предками.
предок (Предок. Потомок)
Предок является предком субъекта Потомок.
предок(Предок,Потомок)
родитель(Предок,Потомок).
предок(Предок,Потомок)
родитель(Предок,Человек),предок(Человек,Потомок).
Программа 2.5. Отношение предок.
Отношение предок является транзитивным замыканием отношения родитель. В общем случае благодаря использованию рекурсивных правил в логической программе легко строится транзитивное замыкание любого отношения.
Рассмотрим программу проверки связности в ориентированном графе. Ориентированный граф может быть задан в виде логической программы с помощью набора фактов. Факт edge (Nodel,Node2) входит в программу, если в графе существует ребро, ведущее из вершины Node1 в вершину Node2. На рис. 2.4 изображен некоторый граф, а программа 2.6 дает его представление в виде логической программы
Рис. 2.4. Простой граф.
edge(a,b). edge(a,c). edge(b,d).
edge(c,d). edge(d,e). edge(f,g).
Программа 2.6. Ориентированный граф.
Две вершины графа связаны, если существует последовательность ребер, ведущая из первой вершины во вторую. Таким образом ,отношение connected(Node1,Node2),являющееся истинным, если вершины Node1 и Node2 связаны, есть транзитивное замыкание отношения edge.Например, в графе на рис.2.4 вершины а и е связаны, а b и f – нет. Программа 2.7 описывает требуемое отношение. Значение программы совпадает с множеством целей вида connected(X,Y),где X и Y – связанные вершины. Заметим, что ввиду выбора исходного факта connected является транзитивным рефлексивным отношением
connected(N ode 1,Node2)
вершина Nodel связна с вершиной Node2 в графе, заданном отношением edge/2.
connected(Node,Node).
соnnected(Nodel,Node2)
edge(Nodel,Lirfk), connected(Link,Node2).
Программа 2.7.Транзитивное замыкание отношения edge.
Упражнения к разд. 2.3
1. Башня из кубиков может быть описана совокупностью фактов вида на(Кубик1,Кубик2), которые истинны, если Кубик1 поставлен на Кубик2. Определите предикат выше (Кубик1,Ку6ик2), который истинен, если Кубик1 расположен в башне выше, чем Кубик1. (Указание: выше является транзитивным замыканием на).