Nivel 1 · El cálculo lambda
Hacia los tipos
El cálculo lambda no tipado, junto con el Teorema de Church-Rosser, ofrece un modelo robusto de computación. Sin embargo, no establece restricciones específicas sobre qué puede aplicarse a qué, lo que permite construir términos como el combinador , que no se normaliza y produce bucles infinitos de cómputo (Ejemplo 7.36). Peor aún: si se intenta usar el sistema sin tipos como base para la lógica, admite paradojas, como la de Kleene-Rosser, que vuelve el sistema contradictorio; el fenómeno se discute en Sørensen y Urzyczyn (2006) . Debido a esto se introduce una restricción fundamental: los tipos.
El remedio: tipos simples
El cálculo lambda simplemente tipado nace de esta necesidad. Al asignar un tipo a cada término se prohíben las construcciones mal formadas como , y con ello se garantiza que todo término bien formado termina (la propiedad de normalización fuerte, Definición 7.35). Este es el primer paso para transformar el cálculo lambda de un modelo teórico de computabilidad en una base sólida para la lógica, siguiendo a Nederpelt y Geuvers (2014) .
Sea un conjunto infinito de variables de tipo. El conjunto de tipos simples se define recursivamente:
- (Variable de tipo) Si , entonces .
- (Tipo flecha) Si , entonces .
- Las letras griegas representan variables de tipo en .
- Los símbolos denotan tipos simples arbitrarios.
- Los paréntesis externos pueden omitirse.
- El conector de tipos flecha se agrupa por la derecha: el tipo se interpreta como .
La interpretación es la esperada: las variables de tipo representan tipos básicos (como los números naturales), y un tipo flecha representa las funciones que reciben un argumento de tipo y devuelven un resultado de tipo . El enunciado se lee «el término tiene el tipo », y para los términos compuestos rigen dos requisitos:
- Aplicación: si y , entonces .
- Abstracción: si y , entonces .
Un término es tipable si existe un tipo tal que .
- . La función identidad devuelve un resultado del mismo tipo que su argumento.
- . Aplicar una función de tipo a un término de tipo produce un resultado de tipo .
- no es tipable: se exigiría que tuviera simultáneamente los tipos (como función) y (como argumento), lo que implica la ecuación imposible en el sistema de tipos simples.
- La asociatividad derecha de los tipos flecha y la asociatividad izquierda de la aplicación permiten escribir:
El punto 3 es la moraleja de todo el módulo: la autoaplicación , el ingrediente con el que se construyó , queda prohibida por el sistema de tipos. En el término ni siquiera puede escribirse, y la amenaza de la no terminación desaparece por completo.
Anticipo: el juicio de tipado
¿Cómo se demuestra que un término tiene un tipo? La afirmación central de es el juicio de tipado, cuya forma se define ya con precisión; las reglas para derivarlo se estudian en el nivel 2 del sitio (próximamente).
El conjunto de λ-términos pre-tipados se define por:
adaptando las condiciones de la Definición 7.1: ahora cada abstracción anota el tipo de su variable de enlace, como en .
Considérense las siguientes definiciones:
- Un enunciado tiene la forma , donde y . En este enunciado, se llama el sujeto y el tipo.
- Una declaración es un enunciado con una variable como sujeto.
- Un contexto es una lista de declaraciones con sujetos distintos.
- Un juicio tiene la forma , con un contexto y un enunciado.
Un ejemplo concreto de juicio, tomado de la tesis:
Se lee así: «asumiendo que la variable tiene tipo y la variable tiene tipo (el contexto), se demuestra que el término resulta en una función de tipo ». El símbolo separa las suposiciones de la afirmación demostrada. Las tres reglas de derivación que generan todos los juicios válidos (variable, aplicación y abstracción) son el corazón de la teoría de tipos y se presentan en el nivel 2.
Anticipo: proposiciones como tipos
Hay una segunda lectura del juicio , y es la razón de ser de esta tesis. Obsérvese el término constante del ejemplo anterior, sin anotaciones: , de tipo . Si se leen las variables de tipo como proposiciones y la flecha como implicación, ese tipo es el esquema , un conocido axioma de la lógica proposicional. La interpretación PAT (propositions as types, proofs as terms) establece que los tipos corresponden a proposiciones y que los términos que habitan un tipo corresponden a pruebas de la proposición; por ejemplo,
Esta es la correspondencia de Curry–Howard , sobre la que se construyen los asistentes de pruebas como Lean: demostrar un teorema es, literalmente, construir un término del tipo correspondiente. Dos panoramas excelentes son Sørensen y Urzyczyn (2006) y Wadler (2015) .
El otro lado del puente: la lógica
Para que la consigna «tipos = proposiciones, términos = pruebas» tenga contenido matemático hace falta el otro extremo del puente: una presentación rigurosa de la lógica que se pretende capturar. Por eso el sitio no salta todavía a la teoría de tipos completa: el nivel 3 desarrolla primero la lógica proposicional con sus dos nociones de consecuencia, la sintáctica (deducibilidad mediante deducción natural ) y la semántica (verdad en toda valuación ), junto con los dos teoremas que las conectan: solidez y completitud , siguiendo a Huth y Ryan (2004) . La demostración de completitud que la tesis formaliza en Lean pasa por el lema de Kalmár , debido a Kalmár (1935) . Solo con ambos lados en su lugar (el cálculo con tipos de este módulo y la lógica del nivel 3) puede apreciarse el puente que los identifica.