Программирование >>  Хронологические базы данных 

1 ... 235 236 237 [ 238 ] 239 240 241 ... 348


Теперь переменная Е содержит эллипс с полуосями а = 5 и b = 4 (как и предыдущий) и ее тип MST(E) снова становится ELLIPSE. Этот эффект мы называем обобщением по ограничениям.

Замечание. Предположим (как и в конце раздела 19.4), что тип CIRCLE имеет собственный подтип 0 CIRCLE (где к типу 0 CIRCLE относятся окружности, центр которых расположен в начале координат).

TYPE 0 CIRCLE POSSREP ( R LENGTH ) SUBTYPE OF ( CIRCLE )

CONSTRAINT ( THE CTR ( 0 CIRCLE ) = POINT ( 0.0, 0.0 ) ) ;

Тогда текущее значение переменной Е в данное время может иметь конкретный тип 0 CIRCLE, а не просто CIRCLE. Предположим, что это так, и рассмотрим приведенную ниже последовательность операций присвоения:

ТНЕ А ( Е ) := LENGTH ( 7.0 ) ; ТНЕ В ( Е ) := LENGTH ( 7.0 ) ;

В результате применения обобщения по офаничениям переменная Е после первой операции присвоения будет содержать просто эллипс . Однако после второй операции присвоения она снова будет содержать окружность. Но будет ли это окружность класса О или просто окружность ? Очевидно, нам бы хотелось, чтобы это была именно окружность класса О . На самом деле так оно и есть, потому что удовлетворяются офаничения для типа 0 CIRCLE (включая ограничения, наследуемые этим типом от типа CIRCLE).

Горизонтальное изменение типов

Снова будем полагать, что переменная Е относится к объявленному типу ELLIPSE. Мы уже знаем, как можно изменить тип переменной Е, понизив его (например, если конкретный тип переменной - ELLIPSE, то нам известно, как следует изменить значение переменной, чтобы ее текущий конкретный тип стал CIRCLE). Мы также знаем, как можно повысить тип переменной Е (например, если ее текущий конкретный тип - CIRCLE, то нам известно, как следует изменить значение переменной, чтобы ее текущий конкретный тип стал ELLIPSE). Но как быть, если требуемое изменение типа оказывается горизонтальным ? Предположим, что мы расширили пример таким образом, что тип ELLIPSE имеет два непосредственных подтипа, CIRCLE (Окружность) и NONCIRCLE (Не окружность). Если не слишком вдаваться в детали, то ясно следующее.

Если текущее значение переменной Е принадлежит типу CIRCLE (т.е. а = Ь), то изменение Е, после которого а > Ь, приведет к тому, что MST (Е) станет равным NONCIRCLE.

Если текущее значение переменной Е принадлежит типу NONCIRCLE (т.е. а > Ь), то изменение Е, после которого а = Ь, приведет к тому, что М8Т(Е) станет равным CIRCLE.

Таким образом, специализация по офаничениям учитывает также горизонтальное изменение типа.

Как указывалось в главе 8, в [3.3] предложена множественная форма операции присвоения, которая могла бы позволить выполнять последовательность операторов присвоения, как одну операцию. * В результате тип ELLIPSE становится фиктивным типом (см. раздел 19.7).



Замечание. Пусть вас не удивляет отсутствие случая изменения переменной Е, в результате которого а < Ь; такое изменение невозможно, поскольку оно нарушает ограничение для типа ELLIPSE.

19.6. Операции сравнения

Предположим, имеются две обычные переменные, Е и С, с объявленными типами ELLIPSE и CIRCLE соответственно. Предположим также, что текушее значение переменной С присваивается переменной Е.

Е := С ;

Тогда совершенно ясно, что если выполнить сравнение значений этих переменных, то в результате должно быть получено значение истина.

Е = С

В обшем виде соответствующее правило можно сформулировать так. Рассмотрим операцию сравнения X = Y, где X и Y- скалярные выражения. Объявленный тип DT(X) должен быть подтипом объявленного типа DT(Y) или наоборот, в противном случае сравнение будет просто недопустимым (проверяется при компиляции). При допустимом сравнении в результате получим значение истина, если конкретный тип MST(X) равен конкретному типу MST(Y) и значение v(X) равно значению v(Y), в противном случае результатом будет значение ложь. Отметим, в частности, что два значения нельзя сравнить на равенство , если их конкретные типы различны.

Сравнения в реляционной алгебре

Сравнения на равенство явно или неявно используются во многих операциях реляционной алгебры. И в случае поддержки механизма супертипов и подтипов, на первый взгляд, может показаться, что некоторые из этих операций будут выполняться в противоречии со здравым смыслом. Рассмотрим отношения RX и RY, представленные на рис. 19.2. Обратите внимание, что единственный атрибут А в отношении RX имеет объявленный тип ELLIPSE, а атрибут А в отношении RY имеет объявленный тип CIRCLE. Примем, что значения вида Ei - это эллипсы, не являющиеся окружностями, а значения Ci - это окружности. Конкретные типы для каждого значения выделены на рисунке строчными буквами и курсивом.

! ELLIPSE

! CIRCLE

! ellipse

circle

, circle

, circle

Puc. 19.2. Отношения RX и RY

A теперь рассмотрим результат операции соединения отношений RX и RY. Назовем это отношение RJ (рис. 19.3). Очевидно, что каждое значение А в отношении RJ обязательно будет иметь тип CIRCLE (поскольку любое значение А в отношении RX, конкретным ти-



пом которого является ELLIPSE, не может сравниваться с любым значением А в отношении RY). Поэтому можно подумать, что атрибут А в отношении RJ должен быть объявлен с типом CIRCLE, а не с типом ELLIPSE. Но рассмотрим следующие рассуждения.

I ELLIPSE

; circle

Рис. 19.3. Соединение RJ отношений RXu RY

Поскольку в отношениях RX и RY только один атрибут А, выражение RX JOIN RY упрощается до RX INTERSECT RY. Поэтому в данных условиях правило относительно объявленного типа результирующего атрибута в операции JOIN должно быть сведено к аналогичному правилу для операции INTERSECT.

Выражение RX INTERSECT RY, в свою очередь, логически эквивалентно выражению RX MINUS (RX MINUS RY). Пусть результатом второй операции, т.е. RX MINUS RY, будет RZ. Тогда очевидно следующее.

а) В общем случае второй операнд, т.е. RZ, будет включать некоторые значения А, имеющие конкретный тип ELLIPSE, и поэтому объявленный тип атрибута А в RZ должен быть ELLIPSE.

б) Таким образом, исходное выражение преобразуется в RX MINUS RZ, где объявленный тип атрибута А в обоих отношениях, RX и RZ, - ELLIPSE. Поэтому получаем окончательный результат, в котором объявленный тип атрибута А в RZ также должен быть, очевидно, ELLIPSE.

Отсюда следует, что объявленный тип атрибута результата для операции INTERSECT (а значит, и для JOIN) должен быть ELLIPSE, а не CIRCLE несмотря на то, что каждое значение этого атрибута фактически должно иметь тип CIRCLE!

Теперь обратимся к реляционному оператору разности MINUS и прежде всего рассмотрим выражение RX MINUS RY. Очевидно, что некоторые значения атрибута А в результате этой операции будут иметь тип ELLIPSE, а не CIRCLE, и поэтому объявленный тип А в таком результате должен быть ELLIPSE. А какой тип должна иметь разность RY MINUS RX? Ясно, что каждое значение в результате этой операции будет иметь тип CIRCLE, и поэтому можно было бы предположить, что объявленный тип результата этой операции должен быть CIRCLE, а не ELLIPSE. Однако обратите внимание, что выражение RX INTERSECT RY логически эквивалентно не только выражению RX MINUS (RX MINUS RY), как было сказано выше, но и выражению RY MINUS (RY MINUS RX). Исходя из этого легко понять, что если считать, что в результате операции RY MINUS RX объявленный тип атрибута А будет CIRCLE, то мы придем к противоречию. Отсюда следует, что объявленный тип атрибута А для операции MINUS также должен быть ELLIPSE, а не CIRCLE, причем даже в случае операции RY MINUS RX, где каждое значение должно иметь тип CIRCLE.

И наконец рассмотрим операцию объединения RX UNION RY. В данном случае ее результат будет включать некоторые значения атрибута А, в общем случае - конкретного типа ELLIPSE, и поэтому объявленный тип атрибута А в результирующем отношении этой



1 ... 235 236 237 [ 238 ] 239 240 241 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика