8.3. Безопасность = продвижение + сохранение 81
что t
1
t
1
. Если t
1
— значение, то, как следует из леммы о канонических формах, t
1
равняется
либо true, либо false, а следовательно, к t можно применить либо E-IfTrue, либо E-IfFalse. С
другой стороны, если t
1
t
1
, то, по правилу E-If, t if t
1
then t
2
else t
3
.
Вариант T-Succ: t succ t
1
t
1
: Nat
Согласно предположению индукции, либо t
1
является значением, либо существует какой-то t
1
, та-
кой, что t
1
t
1
. Если t
1
является значением, то, по лемме о канонических формах, это должно
быть числовое значение, а тогда t — тоже значение. С другой стороны, если t
1
t
1
, то, по правилу
E-Succ, succ t
1
succ t
1
.
Вариант T-Pred: t pred t
1
t
1
: Nat
Согласно предположению индукции, либо t
1
является значением, либо существует какой-то t
1
, та-
кой, что t
1
t
1
. Если t
1
является значением, то, по лемме о канонических формах, это должно
быть числовое значение, либо 0, либо succ nv
1
для некоторого nv
1
, и тогда к t применимо одно из
правил E-PredZero или E-PredSucc. Если, с другой стороны, t
1
t
1
, то, по правилу E-Pred,
pred t
1
pred t
1
.
Вариант T-IsZero: t iszero t
1
t
1
: Nat
Доказывается аналогичным образом.
Доказательство, что типы сохраняются при вычислении, в этой системе также не представляет
труда.
Теорема 8.3.3 Сохранение : Если t : T и t t , то t : T.
Доказательство: Индукция по дереву вывода t : T. На каждом шаге индукции мы предполагаем, что
требуемое свойство выполняется для всех поддеревьев (т. е., если s : S и s s , то s : S, когда s
: S доказано в поддереве текущего вывода), и рассматриваем варианты последнего правила в выводе
типа (мы демонстрируем лишь некоторые варианты; остальные устроены аналогично).
Вариант T-True: t true T Bool
Если последнее правило вывода T-True, то из формы этого правила нам известно, что t — кон-
станта true, а T — тип Bool. Но в таком случае, t является значением, невозможно, чтобы для
какого-либо t имелось t t , и требования теоремы просто не могут нарушаться.
Вариант T-If: t if t
1
then t
2
else t
3
t
1
: Bool t
2
: T t
3
: T
Если последнее правило в выводе типа было T-If, то из формы этого правила нам известно, что t
имеет вид if t
1
then t
2
else t
3
, для некоторых t
1
, t
2
и t
3
. Кроме того, должны существовать
деревья вывода с заключениями t
1
: Bool, t
2
: T и t
3
: T. При взгляде на правила вычисления, где
левая сторона представляет собой условное выражение, мы видим три правила, которые могут при-
вести к заключению t t : E-IfTrue, E-IfFalse и E-If. Рассмотрим их по отдельности (за выче-
том E-IfFalse, которое аналогично E-IfTrue):
Подвариант E-IfTrue: t
1
true t t
2
Если t t выводится по правилу E-IfTrue, то из формы этого правила мы видим, что
t
1
должен равняться true, а результат t должен равняться подвыражению t
2
. Следова-
тельно, требуемое утверждение доказано, так как нам известно (из предположений для
варианта T-If), что t
2
: T, чего нам и надо.
Подвариант E-If: t
1
t
1
t if t
1
then t
2
else t
3
Из предположений для варианта T-If нам известно, что в исходном дереве вывода есть
поддерево с заключением t
1
: Bool. К этому поддереву мы можем применить предпо-
ложение индукции и получить t
1
: Bool. В сочетании с известными нам (из предполо-
жений для варианта T-If) утверждениями, что t
2
: T и t
3
: T, это дает нам право
применить правило T-If и заключить, что if t
1
then t
2
else t
3
: T, или, что то же
самое, t : T.
Вариант T-Zero: t 0 T Nat
Невозможно (по тем же причинам, что и T-True).
Вариант T-Succ: t succ t
1
T Nat t
1
: Nat
Рассматривая правила вычисления на Рис. 3.2, мы видим, что есть только одно правило, E-Succ,
годное для вывода t t . Из формы этого правила ясно, что t
1
t
1
. Поскольку мы знаем, что
rev. 104