De hecho, hay una sutileza aquí, aunque las cosas funcionan bien en el caso de la verificación de tipos. Escribiré el problema aquí, ya que parece aparecer en muchos hilos relacionados, y trataré de explicar por qué las cosas funcionan bien cuando se verifica en una teoría de tipo dependiente "estándar" (seré deliberadamente vago, ya que estos problemas tienden a surgir independientemente):
DΓ⊢t:AD′Γ⊢A:ssu≤tBΔD′′Δ⊢u:B
Este buen hecho es algo difícil de demostrar, y se compensa con un hecho bastante desagradable:
Hecho 2: ¡En general, y no son sub-derivaciones de !D′D′′ DD
Esto depende un poco de la formulación precisa de su sistema de tipos, pero la mayoría de los sistemas "operativos" implementados en la práctica satisfacen el Hecho 2.
Esto significa que no puede "pasar a sub-términos" cuando razona por inducción en derivaciones, o concluye que la afirmación inductiva es verdadera sobre el tipo de término sobre el que está tratando de probar algo.
Este hecho lo muerde con bastante dureza cuando intenta demostrar declaraciones aparentemente inocentes, por ejemplo, que los sistemas con conversión con tipo son equivalentes a aquellos con conversión sin tipo.
Sin embargo , en el caso de la inferencia de tipos, puede proporcionar un algoritmo de inferencia simultáneo de tipo y clasificación (el tipo del tipo) mediante inducción en la estructura del término, que puede implicar un algoritmo dirigido por tipo como sugiere Andrej. Para un término dado (y contexto , usted falla o encuentra tal que y . No necesita usar la hipótesis inductiva para encontrar el último derivación, y así, en particular, evita el problema explicado anteriormente.tΓA,sΓ⊢t:AΓ⊢A:s
El caso crucial (y el único caso que realmente requiere conversión) es la aplicación:
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
Cada llamado a la normalización se realizó en términos bien escritos, ya que este es el invariante para infer
el éxito.
Por cierto, a medida que se implementa, Coq no tiene una verificación de tipos decidible, ya que normaliza el cuerpo de las fix
declaraciones antes de intentar escribirlas.
En cualquier caso, los límites de las formas normales de términos bien tipados son tan astronómicos que, de todos modos, el teorema de la capacidad de decisión es principalmente académico en este punto. En la práctica, ejecuta el algoritmo de verificación de tipos durante el tiempo que tenga paciencia e intenta una ruta diferente si aún no ha finalizado.