Nivel 6 · El CIC y Lean
El CoC puro y sus límites
El módulo anterior culminó con la correspondencia de Curry–Howard , que identifica las pruebas formales con programas. Este paradigma necesita un sistema formal que sirva de base tanto para la lógica como para la computación. El Cálculo de Construcciones puro es un candidato, pero impone un «camino difícil»: los conceptos matemáticos más elementales (los números naturales, las listas e incluso los conectivos lógicos) deben construirse mediante codificaciones impredicativas. Esta página recorre ese camino, exhibe sus tres problemas prácticos y prepara la solución del módulo: el CIC .
CIC = CoC + tipos inductivos. Se parte del Cálculo de Construcciones (productos dependientes y abstracción) y se añade un solo mecanismo: declarar un tipo enumerando sus constructores. A partir de esa única declaración el sistema genera automáticamente cuatro cosas: (i) los constructores como reglas de introducción; (ii) un eliminador o recursor ; (iii) el principio de inducción del tipo; y (iv) las reglas de -reducción que hacen el cómputo efectivo. El resto del módulo no es más que el desarrollo cuidadoso de esta frase.
La semántica de Heyting y las pruebas-como-objetos
El diseño del CoC no es arbitrario: su arquitectura responde a la necesidad de formalizar la semántica de Heyting para la lógica intuicionista de orden superior. Heyting no propone un lenguaje de programación sino un estándar de verdad: bajo su interpretación (el formalismo BHK), una proposición no es verdadera porque «no pueda ser falsa», sino únicamente si se puede construir evidencia explícita de ella. Como explican Coquand y Huet en su motivación informal, el sistema se aleja de la noción clásica de verdad (basada en tablas de verdad) para adoptar el paradigma de «pruebas-como-objetos» (proofs-as-objects) (Coquand y Huet, 1988) .
Bajo esta perspectiva, una proposición no se define por un valor de verdad sino por el tipo de sus pruebas:
- A cada proposición se le asocia un tipo, denotado , que representa el conjunto de todas las construcciones matemáticas que validan .
- Una proposición es verdadera si y solo si su tipo de pruebas está habitado: existe al menos un término tal que la derivación es válida.
La innovación central del CoC es cómo captura la semántica de Heyting para la cuantificación universal mediante funciones. Según la definición fundacional:
«Si es un tipo y es una función proposicional sobre … dar una prueba de la proposición es dar una función tal que para cualquier objeto de tipo , es una prueba de .» (Coquand y Huet, 1988) (traducción del autor)
Esto justifica estructuralmente por qué debe ser isomorfo al producto dependiente . No es una coincidencia sintáctica: es la formalización directa de la intuición constructivista de que «probar un universal es poseer un método» para transformar entradas en evidencia.
Las codificaciones impredicativas
En el CoC puro no existen conceptos predefinidos: todo debe construirse desde la abstracción () y el producto dependiente (). En lugar de declarar una estructura de datos, se usa una codificación impredicativa: se define un objeto por su capacidad de ser eliminado (usado) en cualquier contexto. La siguiente tabla presenta las definiciones originales tal como aparecen en la especificación del Cálculo de Construcciones (Coquand y Huet, 1988) , junto a su notación moderna.
| Concepto | Notación original (Coquand) | Notación moderna (Lean/Coq) |
|---|---|---|
| Falsedad () | ||
| Booleano () | ||
| Naturales () | ||
| Igualdad () | ||
| Par () | ||
| Definición | ||
| Aplicación | (estilo funcional) | (yuxtaposición) |
Como se observa, el tipo de los naturales es el tipo de un iterador. Un número no es un dato, sino una función que toma un tipo , un valor base y una función , y aplica sobre exactamente veces.
Bertot y Castéran presentan en Coq’Art la definición impredicativa de la igualdad de Leibniz: dos términos y son iguales si toda propiedad que se cumple para también se cumple para . Nótese que la dirección de la implicación es la opuesta a la de la tabla anterior; ambas definiciones son demostrablemente equivalentes: aplicando una de ellas al predicado se obtiene la otra.
Definition leibniz (A:Set) (a b:A) : Prop := forall P : A -> Prop, P a -> P b.La idea es describir los objetos no por su estructura interna, sino por cómo pueden ser usados:
- una prueba de «» es simplemente una función que transforma pruebas sobre en pruebas sobre ;
- una prueba de «» es un mecanismo que, dado un método para probar desde y otro desde , produce una prueba de .
Los autores comparan este enfoque explícitamente con el estilo de paso de continuaciones (CPS) de la programación funcional: «Este enfoque es similar al estilo de paso de continuaciones, donde las funciones reciben como argumento otra función que describe cómo debe utilizarse el resultado del cómputo» (Bertot y Castéran, 2013) (traducción del autor).
Los tres problemas del camino difícil
Aunque las codificaciones impredicativas demuestran la potencia teórica de los productos dependientes, presentan tres problemas prácticos para la ingeniería de la demostración verificada:
- Anti-intuitivo. Los datos se representan como funciones de orden superior (iteradores), lo cual oscurece su significado semántico: un número natural «es» un esquema de iteración, no un objeto.
- Inducción no derivable. El principio de inducción matemática no es un axioma ni una regla del sistema y, de hecho, no puede derivarse en el CoC puro para las codificaciones impredicativas: la codificación solo proporciona la recursión (iteración), no el principio de inducción dependiente (Geuvers, 2001) . Este es el defecto decisivo: un sistema en el que no se puede razonar por inducción sobre los naturales es inutilizable para la matemática ordinaria.
- Ineficiencia computacional. Operaciones triviales, como calcular el predecesor de un número en codificación de Church, tienen una complejidad prohibitiva ( en el mejor caso, o peor según la estrategia de reducción).
El resultado de Geuvers (Geuvers, 2001) muestra que el problema no es de habilidad sino de principio: por más ingenio que se invierta, la inducción dependiente sobre la codificación impredicativa de no es un teorema del CoC. Por eso el sistema Coq (y, por extensión, Lean) abandona este enfoque en favor de las definiciones inductivas: el «camino fácil» no solo es más eficiente computacionalmente, sino que proporciona principios de inducción más robustos y regulares, generados junto con cada tipo. Ese camino es el tema de la página siguiente.