409
Вариант T-New: t new D(t) fields D D f Γ, x:B t : C C <: D
По предположению индукции, Γ x s t : E для некоторых E, причем E <: C. Имеем E <: D по
транзитивности <:. Следовательно, пр правилу T-New, Γ new D( x s t) : D.
Вариант T-UCast: t (D)t
0
Γ, x:B t
0
: C C <: D
По предположению индукции, существует такой E, что Γ x s t
0
: E и E <: C. Имеем E <: D
по транзитивности <:, что дает нам Γ (D)( x s t
0
) : D по правилу T-UCast.
Вариант T-DCast: t (D)t
0
Γ, x:B t
0
: C D <: C D C
По предположению индукции, существует такой E, что Γ x s t
0
: E и E <: C. Если E <: D или
D <: E, то Γ (D)( x s t
0
) : D, соответственно, по T-UCast или T-DCast. С другой стороны,
если D : E и E : D, то Γ (D)( x s t
0
) : D (c предупреждением о глупости) по правилу T-SCast.
Вариант T-SCast: t (D)t
0
Γ, x:B t
0
: C D : C C : D
По предположению индукции, существует такой E, что Γ x s t
0
: E и E <: C. Это означает,
что E : D. (Чтобы увидеть это, заметим, что у каждого класса в FJ есть только один надкласс.
Отсюда следует, что, если E <: C и E <: D, то либо C <: D, либо D <: C.) Таким образом, Γ
(D)( x s t
0
) : D (c предупреждением о глупости) по правилу T-SCast.
Лемма A.0.15 Ослабление : Если Γ t : C, то Γ, x:D t : C.
Доказательство: Прямолинейная индукция.
Лемма A.0.16 Если mtype m, C
0
D D, а mbody m, C
0
x, t , то для некоторого D
0
и некоторого C
<: D выполняется C
0
<: D
0
и x:D, this:D
0
t : C.
Доказательство: Индукция по дереву вывода mbody m, C
0
. Базовый случай (когда m определен внутри
C
0
) доказывается просто, поскольку m определен в CT C
0
, и из корректности таблицы классов прямо
следует, что мы уже вывели x:D, this:D
0
t : C по правилу T-Method. Шаг индукции также не
представляет труда.
Теперь мы готовы дать доказательство теоремы о типовой безопасности.
Доказательство Теоремы 19.5.1: Индукция по дереву вывода t t , с разбором вариантов по-
следнего правила. Обратите внимание, как в подварианте T-DCast (предпоследнем) порождаются
предупреждения о глупости.
Вариант E-ProjNew: t new C
0
(v).f
i
t v
i
fields C
0
D f
По форме t мы можем определить, что последнее правило в выводе Γ t : C было T-Field, с предпо-
сылкой Γ new C
0
(v) : D
0
, для некоторого D
0
, и что C D
i
. Подобным образом, последним правилом
в выводе Γ new C
0
(v) : D
0
должно быть T-New, с предпосылками Γ v : C при C <: D и D
0
C
0
.
В частности, Γ v
i
: C
i
, что завершает рассмотрение данного варианта, поскольку C
i
<: D
i
.
Вариант E-InvkNew: t (new C
0
(v)).m(u) t u x, new C
0
(v)/this t
0
mbody m, C
0
x, t
0
Последними правилами при выводе Γ t : C должны быть T-Invk и T-New, с предпосылками
Γ new C
0
(v) : C
0
Γ u : C C <: D mtype m, C
0
D C
По Лемме A.0.16, имеем x:D, this:D
0
t
0
: B для некоторых D
0
и B, причем C
0
<: D
0
и B <: C. По
Лемме A.0.15, Γ, x:D, this:D
0
t
0
: B. Отсюда, по Лемме A.0.14, Γ x u, this new C
0
(v) t
0
: E
для некоторого E <: B. По транзитивности <:, получаем E <: C. Теперь достаточно принять C’ E.
Вариант E-CastNew: t (D)(new C
0
(v)) C
0
<: D t new C
0
(v)
Вывод Γ (D)(new C
0
(v)) : C должен завершаться правилом T-UCast, поскольку, если бы он конча-
ся на T-SCast или T-DCast, получалось бы противоречие с предположением C
0
<: D. Предпосылки
T-UCast дают нам Γ new C
0
(v) : C
0
и D C, что завершает рассмотрение этого варианта.
Варианты с правилами соответствия не представляют труда. Мы рассмотрим только одно:
Вариант RC-Cast: t (D)t
0
t (D)t
0
t
0
t
0
Существует три подварианта, в зависимости от того, каково было последнее использованное правило
типизации.
Подвариант T-UCast: Γ t
0
: C
0
C
0
<: D D C
По предположению индукции, Γ t
0
: C
0
для некоторого C
0
<: C
0
. По транзитивности <:, C
0
<: C.
Следовательно, по правилу T-UCast, Γ (C)t
0
: C (без дополнительного предупреждения о глупо-
сти).
rev. 104