(Нет, это не один из тех вопросов, которые переводят SQL в RA ;-) У меня есть формула в логике первого порядка, которую я хочу выразить в RA.Это должно быть легко: подход Кодда 1972 года в в документе «Реляционная полнота» состоит в том, чтобы показать, что каждый оператор FOL может быть эквивалентно выражен в RA.
При заданном соотношении SP
:
- Заголовок
{S# CHAR, P# CHAR, QTY INT}
- Ключ
{S#, P#}
- Характеристический предикат SP ( s, p, q ) = 'Поставщик s поставляет Деталь p в количестве q . '
Экспресс: «Поставщик« S1 »и Поставщик« S2 »поставляют одинаковый набор деталей (без учетаколичества). '
Формула:
∀p. (∃q1. SP('S1', p, q1) ) ⇔ (∃q2. SP('S2', p, q2) )
Обратите внимание: если S1
вообще не поставляет детали, эта формула верна на тот случай, если S2
также не поставляет детали.
Это вопрос «да / нет» (в формуле нет свободных переменных);поэтому я бы ожидал выражение RA должно приводить к отношению без атрибутов, возвращая пустое отношение, если два Поставщика не предоставляют одинаковый набор Частей (формула оценивается как Ложь);в противном случае непустое отношение без атрибутов (формула оценивается как True).
Чтобы пояснить немного подробнее: обычно запросы возвращают список чего-либо - например, список частей, предоставленный S1
, игнорируяколичество: SP WHERE (S# = 'S1') {P#}
(или по-гречески π<sub>{P#}</sub>(σ<sub>S# = 'S1'</sub>(SP))
).Для вопроса «да / нет» нас интересует только то, возвращает ли запрос что-то или ничего, например, Поставщик S1
поставляет деталь P456
?: SP WHERE (S# = 'S1' AND P# ='P456') {}
(π<sub>{}</sub>(σ<sub>S# = 'S1'</sub>(σ<sub>P# = 'P456'</sub>(SP)))
).
ВыЗаметьте, что я использую вариант RA: Tutorial D от Date & Darwen .Это легче читать и набирать, чем оригинальный RA Кодда (я также включил греческие символы и форму подписки).Я ограничусь операторами Tutorial D , которые соответствуют RA Кодда.
Я могу сделать обратный запрос, который хочу: «Есть ли какие-то детали, поставляемые S1
, но нена S2
или наоборот? '
Во-первых, пара сокращений для общих подвыражений
WITH S1P := SP WHERE (S# = 'S1'){P#},
S2P := SP WHERE (S# = 'S2'){P#} :
( S1P MINUS S2P )
UNION
( S2P MINUS S1P );
Для тех, кто предпочитает греческий:
S1P := π<sub>{P#}</sub>(σ<sub>S# = 'S1'</sub>(SP))<br>
S2P := π<sub>{P#}</sub>(σ<sub>S# = 'S2'</sub>(SP))<br>
(S1P \ S2P) ∪ (S2P \ S1P)
Это вернет пустой результат на тот случай, если два Поставщика предоставят одинаковый набор Частей.Таким образом, все, что остается сделать, - это проект, в результате которого не будет атрибутов, и перевернуть пустой результат в непустой, и наоборот.Но в RA Кодда нет способа выразить этот переворот, AFAICT.
При применении метода Codd 1972 года к формуле самая внешняя операция - это полный квантификатор, поэтому преобразуйте это в отрицание экзистенциального:
¬∃p. ¬( (∃q1. SP('S1', p, q1) ) ⇔ (∃q2. SP('S2', p, q2) ) )
Но теперь самой внешней операцией является отрицание.Метод Кодда только позволяет отрицанию выглядеть вложенным внутри соединения.
Я застрял.Есть идеи?