400
2. Индукция по деревьям вывода. Снова рассматривая правила наследования, убеждаемся, что
последним правилом в выводе S <: {l
i
:T
i
i 1..n
} может быть S-Refl, S-Trans, S-RcdWidth,
S-RcdDepth либо S-RcdPerm. Вариант S-Refl тривиален. В вариантах S-RcdWidth, S-
RcdDepth и S-RcdPerm требуемое утверждение следует непосредственно.
Если последнее правило S-Trans, у нас должны быть подвыводы с заключениями S <: U и U <:
{l
i
:T
i
i 1..n
} для некоторого типа U. Применяя предположение индукции ко второму подвыводу,
мы видим, что U имеет вид {u
a
:U
a
a 1..o
}, причем {l
i
i 1..n
} {u
a 1..o
a
} и U
a
<: T
i
для каждого
l
i
= u
a
. Поскольку теперь мы знаем, что U — тип записей, мы можем применить предположение
индукции к первому подвыводу и получить S = {k
j
:S
j
j 1..m
}, причем {u
a
a 1..o
} {k
j
j 1..m
} и S
j
<: U
a
для каждого u
a
=k
j
. Переупорядочивая эти утверждения, получаем {l
i
i 1..n
} {k
j
j 1..m
}
по транзитивности отношения «подмножество», и S
j
<: T
i
по S-Trans для каждого l
i
= k
j
, по-
скольку каждая метка в типе T должна также присутствовать в U (т. е., l
i
должно равняться u
a
для некоторого a), и тогда нам известно, что S
j
<: U
a
и U
a
<: T
i
. (Странные имена метаперемен-
ных в этом доказательстве неизбежны: иначе просто не хватает латинских букв.)
15.3.6. Решение: Обе части доказываются индукцией по деревьям вывода типов. Мы приводим дока-
зательство только первой части.
Рассматривая правила типизации, мы видим, что последним правилом при выводе v : T
1
T
2
может быть только T-Abs или T-Sub. Если это T-Abs, то необходимый нам результат непосредственно
следует из предпосылки правила. Предположим тогда, что последнее правило T-Sub.
Из предпосылок T-Sub имеем v : S и S <: T
1
T
2
. По лемме об обращении (15.3.2), S имеет вид
S
1
S
2
. Теперь результат следует из предположения индукции.
16.1.2. Решение: Часть (1) доказывается путем прямолинейной индукции по структуре S.
Доказывая часть (2), заметим сначала, что, если существует какой-либо вывод S <: T, то, согласно
части (1), существует вывод без использования рефлексивности. Мы можем доказать наше утвержде-
ние индукцией по размеру дерева вывода S <: T, не использующего рефлексивность. Заметим, что
мы строим индукцию по размеру дерева, а не по его структуре, как обычно делали до сих пор. Это
необходимо потому, что в случаях функциональных типов и типов-записей мы применяем индуктивное
предположение к заново построенным деревьям вывода, которые не являются поддеревьями исходного
вывода.
Если последнее правило вывода не является экземпляром S-Trans, результат прямо следует из
индуктивного предположения (т. е., по предположению индукции, все подвыводы последнего правила
можно заменить выводами без использования транзитивности; поскольку последнее правило также не
использует транзитивность, весь вывод оказывается от нее свободен). Предположим тогда, что послед-
нее правило в выводе — S-Trans, т. е., что у нас есть подвыводы с заключениями S <: U и U <: T,
для некоторого U. Рассмотрим варианты пар последних правил в обоих подвыводах.
Вариант Что угодно/ S-Top: T Top
Если правое поддерево заканчивается на S-Top, то результат следует немедленно, поскольку S <: Top
можно вывести независимо от формы S.
Вариант S-Top/ Что угодно: U Top
Если левое поддерево заканчивается на S-Top, мы замечаем, что, согласно предположению индукции,
можно предположить, что правое поддерево свободно от транзитивности. Рассмотрев правила наследо-
вания, мы видим, что последним правилом в этом поддереве всегда будет S-Top (мы уже исключили
случай рефлексивности, а все остальные правила требуют, чтобы U был либо функциональным типом,
либо типом записей). Нужный нам результат следует по S-Top.
Вариант S-Arrow/S-Arrow: S S
1
S
2
U U
1
U
2
T T
1
T
2
U
1
<: S
1
S
2
<: U
2
T
1
<: U
1
U
2
<: T
2
Используя S-Trans, мы можем построить выводы T
1
<: S
1
и S
2
<: T
2
, исходя из данных нам подвыво-
дов. Более того, эти выводы строго короче исходного вывода, так что мы можем применить индуктивное
предположение и получить выводы T
1
<: S
1
и S
2
<: T
2
без использования транзитивности. Сочетая
их с правилом S-Arrow, получаем вывод S
1
S
2
<: T
1
T
2
без транзитивности.
Вариант S-Rcd/ S-Rcd:
Подобным же образом.
rev. 104