==Рекурсивные запросы==
===Смысл===
Пусть есть некоторое отношение "потомок-родитель"
Parent(Id, ParentId)
ДопустимХотим найти его транзитивное замыкание, у нас есть отношениепо определению: Ancestor(Id, PId) :- Parent(Id, PId). Ancestor(Id, GId) :- Parent(Id, ParentIdGId), Ancestor(PId, GId).
Хотим найти транзитивное замыкание, запишем определение транзитивного замыкания:Ancestor(Id, PId) :Пусть $P$ - Parent(Idмножество всех людей, PId)у которых есть хотя бы один родитель.Ancestor(Id, GId) :- Parent(Id, GId)Очевидно, Ancestor(PIdчто $P \times P$ есть неподвижная точка, GId)но найденное отношение не является транзитивным замыканием.
Пусть P - множество всех людейПоэтому, у которых есть хотя бы один родитель.Очевидноследует уточнить, что PxP подходит под записанные уравнения, но не является транзитивным замыканиеммы ищем '''минимальную по включению неподвижную точку'''.
Это ===Алгоритм поиска минимальной неподвижной точки=== Проинициализируем отношения из нерекурсивных определений Пока не то, что мы хотим, поэтому будем искать минимальное по включению решение.Сначала наполним выполним нерекурсивные правила, затем будем выполнять рекурсивные до достижения достигли неподвижной точки. Пополняем отношения из рекурсивных определений ===Циклы и отрицание===
Запретим отрицание в циклах, чтобы избежать парадокса брадобрея. 'стратифицированное отрицание'