23.6. Стирание, типизируемость и реконструкция типов 277
универсальные кванторы. Таким образом, сужается разрыв между ML и более мощными импреди-
кативными системами. Преимуществом этого семейства подходов является относительная простота и
изящная интеграция с полиморфизмом языка ML.
Прагматический подход к частичной реконструкции типов для систем, включающих одновременно
наследование и импредикативный полиморфизм, называемый локальный вывод типов (или локальная
реконструкция типов), был предложен Пирсом и Тёрнером (Pierce and Turner 1998; см. также Pierce
and Turner 1997; Hosoya and Pierce 1999). Локальный вывод типов присутствует также в некоторых
современных языковых проектах, включая GJ (Bracha, Odersky, Stoutamire and Wadler 1998) и Funnel
(Odersky and Zenger 2001). Последний из них вводит более мощную форму вывода, называемую окра-
шенный локальный вывод типов (Odersky, Zenger and Zenger 2001).
Более простой, но менее предсказуемый алгоритм жадного вывода типов был предложен Карделли
(Cardelli 1993); подобные алгоритмы также используются в программах проверки доказательств для
теорий с зависимыми типами, например, NuPrl (Howe 1988) и Lego (Pollack 1990). Здеь идея состоит
в том, что любая аннотация типа может быть опущена программистом: для каждого такого случая
процедура синтаксического разбора порождает новую переменную унификации X. При проверке типов
алгоритму проверки наследования можно задать вопрос, является ли некоторый тип S подтипом T,
причем как S, так и T могут содержать переменные унификации. Проверка наследования ведется как
обычно, пока не возникает подцель вида X <: T или T <: X. В таком месте X оъявляется совпадающей
с T, и текущее ограничение удовлетворяется простейшим из возможных способов. Однако присваивание
переменной X значения T может не быть наилучшим решением, и это может привести к дальнейшим
неудачным проверкам наследования для типов, включающих X, в то время как другой выбор мог бы
привести к успеху. Однако использование этого алгоритма на практике в реализации Карделли и в
ранней версии языка Pict (Pierce and Turner 2000) показывает, что жадный выбор алгоритма почти
всегда правилен. Однако в случаях, когда выбор оказывается неверным, поведение жадного алгоритма
может сильно удивлять программистов и приводить к таинственным сообщениям об ошибках далеко
от того места, где была сделана неоптимальная конкретизация.
Упражнение 23.6.3 : Из свойства нормализации следует, что бестиповый терм omega =
(λx. x x) (λy. y y) не может быть типизирован в Системе F, поскольку редукция omega никогда
не достигает нормальной формы. Однако можно получить и более прямое, «комбинаторное» доказа-
тельство этого утверждения, рассматривая только правила, определяющие отношение типизации.
1. Назовем терм Системы F незащищенным, если это переменная, абстракция λx:T.t или при-
менение t s (т. е., если терм не является абстракцией λX.t или применением типа t [S]).
Покажем, что если терм t правильно типизирован (в некотором контексте) и erase t m,
то существует некоторый незащищенный терм s, такой, что erase s m и s правильно
типизирован; возможно, в другом контексте).
2. Будем использовать запись λX.t в качестве сокращения для последовательности абстракций
типа вида λX
1
...λX
n
.t. Подобным образом, будем писать t [A], обозначая таким образом вло-
женную последовательность применений типа ((t [A
1
])...[A
n 1
]) [A
n
] и X.T для вложен-
ной последовательности полиморфных типов X
1
... X
n
.T. Учтите, что последовательность
может быть пустой. Например, если X — пустая последовательность типовых переменных,
то X.T — просто T.
Покажем, что, если erase t m и Γ t : T, то существует некоторый терм s вида λX. (u
[A]) для некоторой последовательности типовых перееменных X, некоторой последовательно-
сти типов A и некоторого незщищенного терма u, так что erase s m и Γ s : T.
3. Покажем, что, если t — незащищенный терм типа T (в контексте Γ) и erase t m n, то t
имеет вид s u для некоторых термов s и u, таких, что erase s m и erase u n, и при этом
Γ s : U T и Γ u : U.
4. Допустим, x:T Γ. Покажем, что если Γ u : U и erase u x x, то либо
(a) T X.X
i
, где X
i
X, либо
rev. 104