Тут справді є тонкість, хоча у випадку перевірки типу все добре виходить. Я напишу тут питання, оскільки воно, схоже, з’являється у багатьох пов’язаних темах, і спробую пояснити, чому все виходить добре, коли перевірка типу використовується в «стандартній» теорії залежного типу (я буду свідомо розпливчастою, оскільки ці проблеми, як правило, виникають незалежно):
DΓ ⊢ t : AD'Γ ⊢ А : ссu ≤ tБΔD′ ′Δ ⊢ u : B
Цей приємний факт дещо важко довести і компенсувати досить неприємним протилежним фактом:
Факт 2: Загалом, і не є підпохідними !D'D′ ′ DD
Це трохи залежить від точного формулювання системи вашого типу, але більшість "оперативних" систем, реалізованих на практиці, задовольняють Факт 2.
Це означає, що ви не можете "перейти до підрядів", коли міркуєте індукцією на похідні, або не зробите висновок, що індуктивне твердження вірно щодо типу терміна, про який ви намагаєтесь щось довести.
Цей факт кусає вас досить різко, намагаючись довести начебто невинні твердження, наприклад, що системи з типовим перетворенням еквівалентні системам з нетипізованим перетворенням.
Однак у випадку умовиводу типу можна одночасно надати алгоритм виводу типу і сортування (тип типу) шляхом індукції на структуру терміна, який може включати алгоритм, керований типом, як пропонує Андрій. Для даного терміна (і контексту ви або не вдається, або знайдете таким, що і . Для пошуку останнього не потрібно використовувати індуктивну гіпотезу виведення, і, зокрема, ви уникаєте проблеми, поясненої вище.тΓА , сΓ ⊢ t : AΓ ⊢ А : с
Найважливіший випадок (і єдиний випадок, який дійсно вимагає конверсії) - це застосування:
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
висловлювань, перш ніж намагатися їх перевірити.
У будь-якому випадку, межі нормальних форм чітко набраних термінів настільки астрономічні, що теорема про визначення в будь-якому разі в основному є академічною. На практиці ви запускаєте алгоритм перевірки типу стільки, скільки маєте терпіння, і спробуйте інший маршрут, якщо він до цього часу не закінчився.