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

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


операции должен быть ellipse. Таким образом, и для операции объединения в результирующем отношении объявленный тип атрибута А также должен быть ellipse (но об этом частном случае, в отличие от операций join, intersect и minus, вряд ли можно сказать, что он интуитивно непредсказуем). Теперь сформулируем общее правило.

Пусть гх и гу - отношения с общим атрибутом А, и пусть объявленные типы атрибута А в отношениях гх и гу - соответственно dt(Ax) и dt(Ay). Рассмотрим соединение отношений гх и гу (обязательно по атрибуту А или по крайней мере с его участием). Объявленный тип dt(Ax) должен быть подтипом типа dt(Ay) или наоборот, в противном случае выполнение соединения будет недопустимо (проверяется во время компиляции). Если соединение допустимо, можно считать, не теряя общности, что dt(Ay) - это подтип dt(Ax). Тогда объявленный тип атрибута А в результирующем отношении операции будет dt(Ах).

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

Операторы проверки типа

в предыдущем разделе был приведен фрагмент кода, в котором применялись операторы вида is square, is circle и т.д., используемые для проверки, относится ли указанное значение к определенному типу. Рассмотрим эти операторы подробнее. Прежде всего, будем считать, что определение некоторого типа т приводит к автоматическому определению оператора следующего вида.

is t ( x )

Здесь x- скалярное выражение, такое, что dt(x) является супертипом типа т (проверяется при компиляции). Вычисление выражения в целом дает значение истина, если выражение x принадлежит типу т, и значение ложь - в противном случае. Отметим, что объявленный тип указанного аргумента x должен быть супертипом указанного типа т. Поэтому, например, если с - переменная объявленного типа circle, то приведенное ниже выражение будет недопустимым (ошибка типа будет обнаружена при компиляции).

is square ( с )

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

is circle ( с )

is ellipse ( с )



Наконец, если Е - переменная объявленного типа ELLIPSE, но конкретный тип ее текущего значения - некоторый подтип типа CIRCLE, то результат приведенного ниже выражения также будет иcтинoй.

IS CIRCLE ( Е )

Мы также подразумеваем, что определение некоторого типа Т приводит к автоматическому определению оператора следующего вида.

IS MS T ( X )

Здесь X - скалярное выражение, а DT(X) - супертип типа Т (опять же, это проверяется при компиляции). Вычисление выражения в целом дает значение истина, если выражение X принадлежит типу Т, и значение ложь - в противном случае.

Замечание. Обратите внимание, что в то время как, например, оператор IS ELLIPSE на естественном языке можно лучще всего сформулировать как является эллипсом , то оператор IS MS ELLIPSE на естественном языке лучще всего сформулировать как является конкретно эллипсом .

Ниже приводится пример, включающий типы прямоугольника, квадрата и оператор IS MS RECTANGLE.

VAR R RECTANGLE ;

IF IS MS RECTANGLE ( R )

THEN CALL ROTATE ( R ) ; END IF ;

Интуитивно ясно, что оператор ROTATE (Вращать) - это оператор, с помощью которого заданный в качестве аргумента прямоугольник поворачивается на 90° вокруг центра, и что в подобном вращении нет никакого смысла, если рассматриваемый прямоугольник является квадратом.

Проверка типа также важна для реляционных операторов. Рассмотрим следующий пример. Пусть переменная-отнощение R имеет атрибут А объявленного типа ELLIPSE, и допустим, что требуется получить такие кортежи переменной-отнощения R, в которых значение атрибута А в действительности является окружностью с радиусом, большим 2. Можно попытаться решить эту задачу следующим образом.

R WHERE THE R ( А ) > LENGTH ( 2.0 )

Однако это выражение будет квалифицировано как ошибочное при компиляции, поскольку для оператора THE R требуется, чтобы аргумент имел тип CIRCLE, а атрибут А имеет объявленный тип ELLIPSE, а не CIRCLE. (Если бы проверка при компиляции не выполнялась, то ошибка была бы, конечно, обнаружена во время выполнения, причем это произошло бы при обработке первого же из кортежей, который является просто эллипсом, а не окружностью.)

В [3.3] определяются обобщенные формы всех операторов проверки типов , которые представлены в этом подразделе. Например, обобщенная форма оператора IS Т проверяет, относится ли один операнд к тому же типу, что и другой. Она может использоваться вместо оператора, просто проверяющего, принадлежит ли переменная некоторому явно указанному типу.



Очевидно, что необходимо как-то отсеять кортежи, в которых значение атрибута А является просто эллипсом, и только после этого проверить условие, что радиус должен быть больше 2. Рассмотрим теперь другую формулировку возможного решения.

R : IS CIRCLE ( А ) WHERE THE R ( А ) > LENGTH ( 2.0 )

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

1. Оно имеет тот же заголовок, что и переменная-отношение R, но объявленный тип атрибута А в нем - CIRCLE, а не ELLIPSE.

2. Его тело содержит те кортежи из переменной-отношения R, в которых значение атрибута А будет иметь тип CIRCLE, т.е. будет окружностью и радиус этой окружности будет больше 2.

Другими словами, то, что мы только что рассмотрели, - это новый реляционный оператор следующего вида.

R : IS T ( А )

Здесь R - реляционное выражение, а А - атрибут отношения (скажем, г), обозначаемого этим выражением. Объявленный тип DT(A) атрибута А должен быть супертипом типа Т (проверяется при компиляции). Значение данного выражения в целом определяет отношение со следующими свойствами.

1. Оно имеет тот же заголовок, что и отношение г, но объявленный тип атрибута А в этом заголовке - Т.

2. Его тело содержит кортежи г, в которых атрибут А имеет значение типа Т, и, кроме того, объявленный тип атрибута А в каждом из таких кортежей будет Т.

Аналогично определяется другой новый реляционный оператор следующего вида. R : IS MS T ( А )

19.7. Операторы, версии и сигнатуры

Как утверждалось в разделе 19.3, любой заданный оператор может иметь много различных скрытых версий реализации (что известно также как явная специализация). Это означает, что по мере продвижения в иерархии типов от некоторого супертипа Т к некоторому подтипу Т необходимо, чтобы по крайней мере существовала возможность переписать реализацию (по разным соображениям) операторов типа Т для типа Т. В качестве примера рассмотрим следующий оператор MOVE.

OPERATOR MOVE ( Е ELLIPSE, R RECTANGLE ) RETURNS ( ELLIPSE ) VERSION ER MOVE ;

RETURN ( ELLIPSE ( THE A ( E ), THE B ( E ), R CTR ( R ) ) ; END OPERATOR ;



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

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