Memang ada kehalusan di sini, meskipun hal-hal bekerja dengan baik dalam hal pemeriksaan tipe. Saya akan menuliskan masalahnya di sini, karena tampaknya muncul di banyak utas terkait, dan mencoba menjelaskan mengapa semuanya beres ketika mengetikkan teori tipe ketergantungan "standar" (saya akan sengaja tidak jelas, karena masalah ini cenderung muncul terlepas):
Fakta 1: Jika adalah derivasi dari , maka ada derivasi dari untuk beberapa jenis , dan untuk setiap subterm , ada beberapa jenis , konteks dan derivasi dari .DΓ⊢t:AD′Γ⊢A:ssu≤tBΔD′′Δ⊢u:B
Fakta yang baik ini agak sulit untuk dibuktikan, dan diimbangi dengan fakta yang cukup buruk:
Fakta 2: Secara umum, dan bukan merupakan turunan dari !D′D′′ D
Ini sedikit tergantung pada formulasi yang tepat dari sistem tipe Anda, tetapi sebagian besar sistem "operasional" yang diterapkan dalam praktik memuaskan Fakta 2.
Ini berarti bahwa Anda tidak dapat "beralih ke sub-istilah" ketika bernalar dengan induksi pada derivasi, atau menyimpulkan bahwa pernyataan induktif benar tentang jenis istilah yang Anda coba buktikan.
Fakta ini menggigit Anda dengan keras ketika mencoba untuk membuktikan pernyataan yang tampaknya tidak bersalah, misalnya bahwa sistem dengan konversi yang diketik sama dengan yang memiliki konversi yang tidak diketik.
Namun , dalam kasus inferensi tipe, Anda dapat memberikan algoritme inferensi tipe dan sortir (tipe tipe) secara simultan dengan menginduksi pada struktur istilah, yang mungkin melibatkan algoritma tipe-terarah seperti yang disarankan Andrej. Untuk istilah tertentu (dan konteks , Anda gagal atau menemukan sehingga dan . Anda tidak perlu menggunakan hipotesis induktif untuk menemukan yang terakhir derivasi, dan khususnya Anda menghindari masalah yang dijelaskan di atas.tΓA,sΓ⊢t:AΓ⊢A:s
Kasus penting (dan satu-satunya kasus yang benar-benar membutuhkan konversi) adalah aplikasi:
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
Setiap panggilan untuk menormalkan dilakukan pada istilah yang diketik dengan baik, karena ini adalah invarian untuk infer
kesuksesan.
Omong-omong, seperti yang diterapkan, Coq tidak memiliki pengecekan tipe yang dapat didekati, karena akan menormalkan isi fix
pernyataan sebelum mencoba mengetikkan memeriksanya.
Bagaimanapun, batas-batas pada bentuk normal dari istilah-istilah yang diketik dengan baik begitu astronomis, sehingga teorema desidabilitas kebanyakan bersifat akademis pada titik ini. Dalam praktiknya, Anda menjalankan algoritme pengecekan tipe selama Anda memiliki kesabaran, dan mencoba rute yang berbeda jika belum selesai saat itu.