174 16.3. Пересечения и объединения
16.3. Пересечения и объединения
Проверка типов выражений с несолькими возможными результатами, скажем, условных выражений
или case, в языке с наследованием требует некоторых дополнительных хитростей. Вспомним, например,
декларативное правило типизации для условных выражений:
Γ t
1
: Bool Γ t
2
: T Γ t
3
: T
Γ if t
1
then t
2
else t
3
: T
(T-If)
Правило требует, чтобы тип обеих ветвей был одинаков, и присваивает этот тип условному выражению
в целом. Однако когда в системе имеется правило включения, может быть много способов дать обеим
ветвям один и тот же тип. Например,
if true then {x= true ,y = false } else { x = false , z= true }
имеет тип {x:Bool}, поскольку ветвь then имеет минимальный тип {x:Bool,y:Bool}, который можно
поднять до {x:Bool} с помощью T-Sub, а ветвь else подобным же образом имеет минимальный тип
{x:Bool,z:Bool}, поднимаемый также до {x:Bool}. Тот же самый терм имеет и типы {x:Top} и {}
— в сущности, любой тип, одновременно являющийся надтипом {x:Bool,y:Bool} и {x:Bool,z:Bool}.
Следовательно, минимальным типом всего условного выражения является минимальный общий надтип
{x:Bool,y:Bool} и {x:Bool,z:Bool} — т. е., {x:Bool}. В общем случае, чтобы вычислить минимальный
тип произвольного условного выражения, мы должны найти минимальные типы его ветвей then и else,
а затем найти их минимальный общий надтип. Такой тип часто называется объединением типов ветвей,
поскольку он соответствует обычному объединению (точной верхней грани) двух элементов в частичном
порядке.
Определение 16.3.1 Тип J называется объединением пары типов S и T, что записывается S T J,
если S <: J, T <: J, и для всех типов U, если S <: U и T <: U, то J <: U. Подобным образом, тип M
называется пересечением S и T, что обозначается S T M, если M <: S, M <: T, и для всякого типа
L, если L <: S и L <: T, то L <: M.
В зависимости от того, как в конкретном языке с наследованием определено отношение наследова-
ния, может быть или не быть верно, что для всякой пары типов существует объединение. Говорят, что
отношение наследования обладает объединениями, если для всяких S и T существует некоторый тип J,
являющийся объединением S и T. Подобным образом, отношение наследования обладает пересечениями
если для каждого S и T имеется некоторый M — пересечение S и T.
Отношение наследования, рассматриваемое нами в этом разделе,
1
обладает объединениями, но не
пересечениями. Например, у типов {} и Top Top вообще нет общих подтипов, так что нет и наибольше-
го общего подтипа. Однако выполняется несколько более слабое условие. Мы говорим, что пара типов
S и T ограничена снизу, если имеется какой-либо тип L, такой, что L <: S и L <: T. Отношение насле-
дования обладает ограниченными пересечениями, если для каждой пары ограниченных снизу типов S
и T имеется M — пересечение S и T.
Объединения и пересечения не обязательно уникальны. Например, {x:Top,y:Top} и {y:Top,x:Top}
оба являются объединениями пары типов {x:Top,y:Top,z:Top} и {x:Top,y:Top,w:Top}. Однако два
раличных объединения (или пересечения) одной и той же пары типов всегда являются подтипами друг
друга.
Утверждение 16.3.2 1. Для каждой пары типов S и T имеется тип J, такой что S T J.
2. Для каждой пары типов S и T, имеющих общий подтип, имеется тип M, такой, что S T M.
Доказательство: Упражнение Рекомендуется, .
С помощью операции объединения мы можем задать алгоритмическое правило для выражений if
в системе с наследованием:
Γ t
1
: T
1
T
1
Bool Γ t
2
: T
2
Γ t
3
: T
3
T
2
T
3
T
Γ if t
1
the t
2
else t
3
: T
(TA-If)
1
А именно, отношение, определенное на Рис. 15.1 и 15.3, и расширенное типом Bool. В отношении наследования Bool
ведет себя просто: в декларативное отношение наследования никаких связанных с ним правил не добавляется, так что
его единственным надтипом является Top.
rev. 104