Здесь действительно есть тонкость, хотя в случае проверки типов все работает хорошо. Я напишу эту проблему здесь, поскольку она, похоже, возникает во многих связанных потоках, и попытаюсь объяснить, почему все работает хорошо при проверке типов в «стандартной» теории зависимых типов (я буду намеренно расплывчатым, так как эти проблемы имеют тенденцию возникать независимо):
DΓ⊢t:AD′Γ⊢A:ssu≤tBΔD′′Δ⊢u:B
Этот приятный факт несколько трудно доказать, и он компенсируется довольно неприятным контрафактом:
Факт 2: В общем, и не являются под-производными от !D′D′′ DD
Это немного зависит от точной формулировки вашей системы типов, но большинство «операционных» систем, реализованных на практике, удовлетворяют Факту 2.
Это означает, что вы не можете «переходить к подсловам», рассуждая по индукции о деривациях, или делать вывод, что индуктивное утверждение верно в отношении типа термина, о котором вы пытаетесь что-то доказать.
Этот факт довольно сильно кусает вас, когда вы пытаетесь доказать кажущиеся невинными утверждения, например, что системы с типизированным преобразованием эквивалентны системам с нетипизированным преобразованием.
Тем не менее , в случае вывода типа, вы можете задать алгоритм вывода типа одновременного типа и типа (тип типа) путем наведения на структуру термина, которая может включать алгоритм, ориентированный на тип, как предлагает Андрей. Для данного термина (и контекста вы либо не справляетесь, либо находите такие, что и . Вам не нужно использовать индуктивную гипотезу, чтобы найти последнее деривация, и, в частности, вы избегаете проблемы, описанной выше.tΓA,sΓ⊢t:AΓ⊢A:s
Ключевой случай (и единственный случай, который действительно требует преобразования) - это приложение:
infer(t u):
type_t, sort_t <- infer(t)
type_t' <- normalize(type_t)
type_u, sort_u <- infer(u)
type_u' <- normalize(type_u)
if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
return B, sort_t (or the appropriate sort)
else fail
Каждый вызов нормализации был сделан на хорошо типизированных терминах, так как это инвариант infer
успеха России.
Между прочим, поскольку это реализовано, Coq не имеет разрешимой проверки типов, поскольку он нормализует тело fix
операторов перед попыткой проверки типов.
Во всяком случае, границы нормальных форм хорошо типизированных терминов настолько астрономичны, что теорема о разрешимости в этом случае в основном академическая. На практике вы запускаете алгоритм проверки типов до тех пор, пока у вас есть терпение, и пробуете другой маршрут, если он еще не закончился.