Изменения

Перейти к: навигация, поиск

Datalog и рекурсия

3718 байт добавлено, 19:22, 4 сентября 2022
м
rollbackEdits.php mass rollback
Аналог конструкции условия принадлежности из исчисления доменов.
Есть два вида:
* Кортеж принадлежит отношению удовлетворяет атому <code>R(x1, x2, ..., xn)</code>тогда и только тогда, когда принадлежит отношению R.* Кортеж не принадлежит отношению удовлетворяет атому <code>¬R(x1, x2, ..., xn)</code>тогда и только тогда, когда такого кортежа нет в отношении R.
Заметим, что в Datalog нет имён атрибутов, атрибуты различаются только по своей позиции.
===Идентификаторы и фамилии всех Иванов===
Рассмотрим такой запрос на языке исчисления доменов
Id, LastName <font color=blue>where</font> Students<font color=red>{</font>Id = Id, FirstName = FirstName, LastName = LastName<font color=redgreen>}'Иван'</font> $\wedge$ FirstName , LastName = LastName<font color=greenred>'Иван'}</font>
Его можно переписать на Datalog так:
Ivans(Id, LastName) :-
Students(Id, FirstName, LastName), FirstName = <font color=green>'Иван'</font>, LastName).
Или ещё проще:
Ivans(Id, LastName) :-
Students(Id, <font color=green>'Иван'</font>, LastName).
===Имена родителей===
Пусть есть таблица <code>Person(Id, Name, MotherId, FatherId)</code>
====Получить имена обоих родителей каждого человека (Name, Father, Mother)====
Атомы в Datalog находятся в неявной конъюнкции, поэтому чтобы записать утверждение Запишем конъюнкцию атомов: "FId FatherId - отец NName", а MId "MotherId - мать NName", "Имя FatherId - FatherName", запишем их через запятую"Имя MotherId - MotherName": Parents(NName, FNFatherName, MNMotherName) :- Person(_, NName, FIdFatherId, MIdMotherId), Person(FIdFatherId, FatherName, _, FN, _), Person(MIdMotherId, MNMotherName, _, _). 
====Получить для каждого человека всех его родителей (Name, Parent)====
Воспользуемся тем, что в Datalog при определении отношений дважды, они объёдиняются:
Parents(NName, FNFatherName) :- Person(_, NName, FIdFatherId, _), Person(FIdFatherId, FNFatherName, _, _). Parents(NName, MNMotherName) :- Person(_, NName, _, MIdMotherId), Person(MIdMotherId, MNMotherName, _, _).====Идентификаторы студентов не сдавших курс с CId=10====На языке исчисления доменов этот запрос можно записать так: SId <font color=blue>where</font> ¬∃Points (Points ≥ 60 ∧ Points<font color=red>{</font>SId = SId, Points = Points, CId = 10<font color=red>}</font>) Перепишем его на язык Datalog. Так как в Datalog нет явных кванторов, то мы вынуждены пользоваться неявным квантором существования, который в Datalog связывает все свободные переменные цели. Над ним невозможно поставить отрицание, поэтому запишем вспомогательное отношение, в котором есть те и только те студенты, которые '''сдали курс''', затем построим отрицание. Graded(SId) :- Points(SId, Points, 10), Points >= 60. Failed(SId) :- Points(SId, _, _), ¬Graded(SId).
==Ограничение отношений==
'''Каждая переменная должна входить в неотрицательный реляционный атом'''
 
==Реляционная полнота==
{{Утверждение
|statement=Язык Datalog реляционно полон
|proof=
Выразим базис реляционной алгебры на языке Datalog:
 
'''Проекция $\pi_{A_1, ..., A_n}(R)$''' Цели удовлетворяют те и только те кортежи, для которых в исходном отношении есть кортеж, совпадающий с ними по первым n атрибутам
Q(A1, ..., An) :- R(A1, ..., An, _, ..., _).
'''Фильтр $σ_θ(R)$''' Цели удовлетворяют те и только те кортежи, которые есть в исходном отношении и удовлетворяют условию θ
Q(A1, ..., An) :- R(A1, ..., An), θ.
'''Объединение $R_1 ∪ R_2$''' Отношение содержит кортежи, которые удовлетворяют хотя бы одной из целей, а значит принадлежит хотя бы одному из исходных отношений.
Q(A1, ..., An) :- R1(A1, ..., An).
Q(A1, ..., An) :- R2(A1, ..., An).
'''Разность $R_1 ∖ R_2$''' Цели удовлетворяют только такие кортежи, которые есть в $R_1$, но не в $R_2$.
Q(A1, ..., An) :- R1(A1, ..., An), ¬R2(A1, ..., An).
'''Декартово произведение $R_1 × R_2$''' Цели удовлетворяют такие кортежи, что первые $n$ значений атрибутов взяты из первого отношения, а следующие $m$ - из второго
Q(A1, ..., An, B1, ..., Bm) :-
R1(A1, ..., An), R2(B1, ..., Bm).
 
'''Естественное соединение $R_1 ⋈ R_2$''' Почти как декартово произведение, но теперь переменные $B_1 \ldots B_m$ - атрибуты, по которым идёт соединение - используются сразу в двух атомах.
Q(A1, ..., An, B1, ..., Bm, C1, ..., Cl) :-
R1(A1, ..., An, B1, ..., Bm), R2(B1, ..., Bm, C1, ..., Cl).
'''Переименовывание''' Заметим что в Datalog нет имён атрибутов, роль имён здесь играют позиции. Поэтому переименовывание не нужно, вместо этого можно сделать перестановку атрибутов.
 
<div></div>
}}
==Рекурсивные запросы==
1632
правки

Навигация