Логические языки запросов. Мотивировка: 1. Логические правила расширяются более естественно, чем реляционная алгебра, на рекурсивные запросы, которые невозможны в обычном SQL. Используются в рекурсивном SQL. 2. Логические правила формируют основу для многих интегрированных информационных систем и приложений. Пример на языке логических запросов Datalog. Likes(drinker, beer) Sells(bar, beer, price) Frequents(drinker, bar) Happy(d) <Frequents(d,bar) AND Likes(d,beer) AND Sells(bar,beer,p) Это - правило. Левая часть - заголовок правила. Правая часть – тело правило (цель) = логическое произведение(AND) подцелей. Заголовок правила и подцели являются атомами. Атом = предикат с аргументами Предикат = имя отношения или арифметический предикат, например ‘<’, ’>’ и т.д. Аргументами могут быть переменные или константы Подцели (но не заголовок) могут иметь перед собой отрицание Содержательный смысл правил. Заголовок имеет значение «истина» для своих аргументов, если существуют значения локальных переменных (в теле правила, но не в заголовке), для которых все подцели будут иметь значение «истина». Если в теле нет отрицаний и арифметических сравнений, то заголовок правила может рассматриваться как проекция соединения подцелей на множество аттрибутов заголовка. Пример. Вышеприведенное правило эквивааалентно Happy(d) = drinker (Frequents Likes Sells) Исчисление правил (высказываний). Два двойственных подхода: 1. Основан на переменных: Рассмотреть всевозможные комбинации значений переменных. Если все подцели обращаются в «истину» - добавить заголовок к отношению результата. 2. Основан на кортежах: Рассмотреть всевозможные назначения кортежей подцелям, делающие все подцели «истиной». Если при этом значения котртежей совместимы(соединимы) – добаыить заголовок к результату. Пример. Назначение переменных S(x,y) <- R(x,z) AND R(z,y) AND NOT R(x,y) A B 1 2 2 3 R = Назначения, обращаюшие в «истину» первую подцель: 1. x -> 1, z -> 2. 2. x -> 2, z -> 3. В случае (1), y -> 3 обращает вторую подцель в «истину», поскольку (1; 3) не принадлежит R, третья подцель – также обрашается в «истину». Следовательно, добавляем (x; y) =(1; 3) к отношению S. В случае (2), никакие значения “y” не обращают в “истину» вторую подцель. Следовательно, A B 1 3 S= Пример. Тот же пример с назначением кортежей. Начнем с подцелей не имеющих перед собой отрицания Четыре возможных назначения кортежей подцелям: R(x; z) R(z; y) (1; 2) (1; 2) (2; 3) (2; 3) (1; 2) (2; 3) (1; 2) (2; 3) Только второе из них дает для z совместимое значение. Оно также бращает в «истину» третью подцель NOT R(x,y). Следовательно, единственный кортеж для заголовка - (1; 3). Безопасность(Safety). Правило может быть бессмысленным если переменные используются в произвольном виде. Примеры. S(x) <- R(y), S(x) <- NOT R(x), S(x) <- R(y) AND x < y. В каждом из этих случаев, результат бесконечен, даже если отношение R конечно. Для того, чтобы переменная ‘x’ имела смысл для операций с базой данных, потребуем, чтобы выполнялось условие (условие безопасности). Если ‘x’ появляется в одном из элементов правила: 1. Заголовке, 2. Отрицаемой подцели (подцели с предшествующим NOT) 3. Арифметическом сравнении, то ‘x’ должна также присутствовать в неотрицаемой обычной(в виде отношения) подцели в теле правилаю В дальнейшем будем требовать, чтобы правила были безопасными. Программы на Datalog. Множество правил задают программу на Datalog. Предикаты/отношения делятся на два класса: Экстенсиональная база данных, ЭБД, = отношения, хранимые в базе данных. Интенсиональная БД , ИБД = отношения, определенные при помощи одного или нескольких правил. Предикат может быть либо ЭБД, либо ИБД, но не одновременно ИБД предикат может появиться в теле или заголовке правила, ЭБД – только в теле. Пример. Преобразовать следующее SQL предложение (найти производителей сортов пива, продаваемых Joe): Beers(name, manf) Sells(bar, beer, price) SELECT manf FROM Beers WHERE name IN ( SELECT beer FROM Sells WHERE bar = 'Joe''s Bar' ); в программу на Datalog. JoeSells(b) <- Sells('Joe''s Bar', b, p) Answer(m) <- JoeSells(b) AND Beers(b,m) Замечание: Beers, Sells - ЭДБ; JoeSells, Answer - ИДБ. Выразительная мошность Datalog. Нерекурсивный Datalog подобен (классической) реляционной алгебре. Подробнее см. в книге. Datalog имеет те же фозможности, как SQL оператор selectfrom-where без аггрегирования и группирования Рекурсивный Datalog может использовать запросы, которые не могут быть выражены в стандартном SQL. Но ни один из этих языков является полным в выразительном смысле (полнота по Тьюрингу - Turing completeness). Рекурсия. ИБД предикат P завасит от предиката Q, если имеется правило с P в заголовке и Q в подцели. Нарисуем граф с вершинами – ИБД предикатами, дуга P -> Q означает, что P зависит от Q. Программа рекурсивна тогда и только тогда когда граф имеет циклы. Рекурсивный пример. Sib(x,y) <- Par(x,p) AND Par(y,p) ANDx <> y Cousin(x,y) <- Sib(x,y) Cousin(x,y) <- Par(x,xp) AND Par(y,yp) AND Cousin(xp,yp) Исчисление рекурсивных правил. Start ИБД = O Применить правила к ЭБД, ИБД да Измен. в ИБД? нет конец Пример. ЭБД Par = a d b f j c g e h k i Замечание. В силу симметрии Sib и Cousin факты присутствуют парами, поэтому будем упоминать (x; y), подразумевая (x; y) и (y; x). Начальное состояние Sib Cousin О О Добавлено (b; c), (c; e) после шага 1: (g; h), (j; k) О Добаслено после шага 2: (b; c); (c; e) (g; h); (j; k) Добавлено после шага 3: (f; g); (f; h) (g; i); (h; i) (i; k) Добавлено после шага 4: (k; k) (i; j) Стратифицированное отрицание. Отрицание, заключенное внутрь рекурсии, не имеет смысла. Даже когда отрицание и рекурсия разделены, возможна неясность относительно смысла правил, и какое-либо одно трактование должно быть выбрано. Стратифицированное отрицание является дополнительным ограничением на рекурсивные правила (подобно «безопасности»), которое решает обе проблемы: 1. Оно не позволяет отрицание внутри рекурсии. 2. Когда отрицание отделено от рекурсии, оно выражает интуитивно правильный смысл правила (стратифицированная модель). Проблема рекурсивного отрицания. Рассмотрим: P(x) <- Q(x) AND NOT P(x) Q = EDB = {1; 2}. Вычислить ИБД P итеративно? Инициализация, P = О. Шаг 1: P = {1; 2}. Шаг 2: P = O, и т.д. Страты. Интуитивный смысл страты ИБД предиката = максимальное число отрицаний, через которое вы можете пройти по дороге к ЭБД предикату. Должно равняться 1 в «стратифицированных» правилах. Определим граф, определяющий страты: Вершины графа = ИБД предикаты. Дуга P -> Q, если Q присутствует в теле правила с заголовком P. Отметим эту дугу знаком ‘-‘, если Q стоит в подцели с отрицанием. P (x) <- Q(x) AND NOT P(x) P _ Пример. Какие вершины из множества целей не достижимы ни с какой исходной вершины. Reach(x) <- Source(x) Reach(x) <- Reach(y) AND Arc(y,x) NoReach(x) <- Target(x) AND NOT Reach(x) NoReach Reach Вычисление страт. Страта ИБД предиката А = максимальное число, отмеченных ‘-‘ на любом пути ведущем из А. Примеры. Для первого примера страта предиката Р = оо Для второго примера страта Reach =0, страта NoReach=1. Стратифицированное отрицание. Datalog программа с рекурсией и отрицанием является стратифицированной, если каждый ИБД предикат имеет конечную страту. Стратифицированная модель. Если Datalog программа стратифицирована, мы можем вычислить отношения для ИБД предикатов по фозрастанию страт, начиная с самой маленькой. Пример. Reach(x) <- Source(x) Reach(x) <- Reach(y) AND Arc(y,x) NoReach(x) <- Target(x) AND NOT Reach(x) ЭБД: Source = {1}. Arc = {(1; 2); (3; 4); (4; 3)}. Target = {2; 3}. 1 source 2 target 3 target 4 Сначала вычисляем Reach = {1; 2} (страта 0). Затем - NoReach = {3}. Явлется ли стратифицированное решение очевидным? На самом деле - нет. Имеется другая модлеь, обращающая правила в «истину» независимо от того, какие значения будут подставлены для переменных: Reach = {1; 2; 3; 4}, NoReach = O. Единственный способ обратить Datalog правило в «ложь», это когда тело имеет значение «истина», а заголовок – «ложь». Для этой модели заголовки правил для Reach «истинны» для всех значений, что обеспечивает в правиле для NoReach значение «ложь» для подцели NOT Reach(x) и всего тела правила. Следовательно, все правило NoReach – «истинно».