En el cálculo lambda sin constantes con el sistema de tipos Hindley-Milner, no puede obtener ninguno de esos tipos donde el resultado de una función es una variable de tipo no resuelta. Todas las variables de tipo tienen que tener un "origen" en alguna parte. Por ejemplo, no existe un término de tipo , pero hay un término de tipo ∀ α .∀ α , β.α → β (la función de identidad λ x . x ).∀ α .α → αλ x . X
Intuitivamente, un término de tipo requiere poder construir una expresión de tipo β desde el aire. Es fácil ver que no hay ningúnvalorque tenga ese tipo. Más precisamente, si la variable de tipo β no aparece en el tipo de cualquier variable de término en el entorno, entonces no existe un término de tipo β que esté en forma normal de la cabeza. Puede probar esto por inducción estructural en el término: o la variable en la cabeza tendría que tener el tipo β , o uno de los argumentos tendría que tener un tipo principal que involucre β , es decir, habría un término adecuado más pequeño.∀ α , β.α → ββββββ
El hecho de que no haya un valor de cierto tipo no significa que no haya un término de ese tipo: podría haber un término sin valor, es decir, un término sin terminación (precisamente, un término sin forma normal). La razón por la cual no existe un término lambda con tales tipos es que todos los términos HM bien tipados se están normalizando fuertemente. Esta es una generalización del resultado que establece que el cálculo lambda simplemente tipado se está normalizando fuertemente. Es una consecuencia del hecho de que el Sistema F se está normalizando fuertemente: el Sistema F es como HM, pero permite cuantificadores de tipo en todas partes en tipos, no solo en el nivel superior. Por ejemplo, en el Sistema F, tiene el tipo ( ∀ α . α ) → ( ∀ α . α ) - pero ΔΔ = λ x . XX( ∀ α . Α ) → ( ∀ α . Α ) no está bien escrito.ΔΔ
HM y System F son ejemplos de sistemas de tipos que tienen una correspondencia de Curry-Howard : los términos bien tipados corresponden a pruebas en una lógica determinada, y los tipos corresponden a fórmulas. Si un sistema de tipos corresponde a una teoría consistente, entonces esa teoría no permite probar teoremas como ; por lo tanto, no hay término del tipo correspondiente ∀ α , β .∀ A , ∀ B , A ⇒ B . El sistema de tipos permite deducir "teoremas gratis" sobre funciones sobre estructuras de datos.∀ α , β.α → β
Este resultado se descompone tan pronto como agrega ciertas constantes al cálculo. Por ejemplo, si permite un combinador de punto fijo general como , es posible construir términos de tipo arbitrario: Y ( λ x . X ) tiene el tipo ∀ α . α . El equivalente de un combinador de punto de fijación general en la correspondencia de Curry-Howard es un axioma que establece ∀ A , ∀ B , A ⇒ B , lo que hace que la lógica sea obviamente poco sólida.YY( λ x . x )∀ α . α∀ A , ∀ B , A ⇒ B
Encontrar la línea fina entre los sistemas de tipos que aseguran una fuerte normalización y los sistemas de tipos que no lo son es un problema difícil e interesante. Es un problema importante porque determina qué lógicas son sólidas, en otras palabras, qué programas incorporan pruebas de teoremas. Puede ir mucho más allá del Sistema F, pero las reglas se vuelven más complejas. Por ejemplo, el cálculo de las construcciones inductivas, que es la base del asistente de prueba Coq , se está normalizando fuertemente pero es capaz de describir estructuras de datos inductivos y algoritmos comunes sobre ellos, y más.
Tan pronto como llegue a los lenguajes de programación reales, la correspondencia se rompe. Los lenguajes de programación reales tienen características como funciones recursivas generales (que pueden no terminar), excepciones (una expresión que siempre genera una excepción nunca devuelve un valor y, por lo tanto, puede tener cualquier tipo en la mayoría de los sistemas de tipos), tipos recursivos (que permiten la no terminación para colarse), etc.