Nivel 6 · El CIC y Lean

Prop, Type y universos

Las páginas anteriores usaron las sorts Set\text{Set}, Prop\text{Prop} y Type\text{Type} con una explicación mínima. Esta página las presenta con precisión: qué es una sort, cómo se especifica el CoC como sistema de tipos puro, y por qué la distinción entre Prop\text{Prop} y Type\text{Type} es la decisión de diseño que separa las proposiciones de los datos.

Sorts: los tipos de los tipos

Una sort es un «tipo de tipos»: la categoría a la que pertenece un tipo, así como un número pertenece a N\mathbb{N}. Un Sistema de Tipos Generalizado (GTS, o PTS) se especifica con tres datos: las sorts S\mathcal{S}, los axiomas A\mathcal{A} (qué sort habita cada sort) y las reglas R\mathcal{R} (qué dependencias de producto están permitidas) (Barendregt, 1991) .

Definición (CoC como GTS)

Para el Cálculo de Construcciones puro se toman dos sorts:

S={Set, TypeS},A={ Set:TypeS },R=S×S.\mathcal{S} = \lbrace \text{Set},\ \text{Type}_S \rbrace, \qquad \mathcal{A} = \lbrace\ \text{Set} : \text{Type}_S\ \rbrace, \qquad \mathcal{R} = \mathcal{S} \times \mathcal{S}.

A\mathcal{A} fija que Set\text{Set} vive en TypeS\text{Type}_S (análogo al axioma :* : \square del cubo lambda), y R=S×S\mathcal{R} = \mathcal{S} \times \mathcal{S} indica que están permitidas todas las reglas de producto (s1,s2)(s_1, s_2) del cubo; el sort resultante es s2s_2. Este vértice, con las ocho reglas activas, es el sistema λC\lambda C del módulo anterior.

El diccionario con la notación del cubo lambda es directo: Πx:A.B(x:A)B\Pi x{:}A.\,B \leftrightarrow (x{:}A)\,B, λx:A.t[x:A]t\lambda x{:}A.\,t \leftrightarrow [x{:}A]\,t, * (tipos habitables) Set\leftrightarrow \text{Set}, y \square (kinds) TypeS\leftrightarrow \text{Type}_S.

La jerarquía de universos

Detenerse en dos sorts genera una incomodidad: si Set:TypeS\text{Set} : \text{Type}_S, ¿en qué vive TypeS\text{Type}_S? Postular TypeS:TypeS\text{Type}_S : \text{Type}_S conduce a inconsistencia (la paradoja de Girard, análoga en teoría de tipos a la paradoja de Russell). La solución de Coq y Lean es una jerarquía infinita y predicativa de universos:

Type0:Type1:Type2:con Typei:Typei+1.\text{Type}_0 : \text{Type}_1 : \text{Type}_2 : \cdots \qquad \text{con } \text{Type}_i : \text{Type}_{i+1}.

Predicativa significa que un producto (x:A)B(x{:}A)\,B cuantificando sobre un universo Typei\text{Type}_i aterriza en un universo estrictamente mayor: no se puede definir un habitante de Typei\text{Type}_i cuantificando sobre todo Typei\text{Type}_i. En Lean, Type u abrevia Sort (u+1) y la jerarquía completa es Sort 0, Sort 1, Sort 2, ..., con Prop = Sort 0 y Type = Type 0 = Sort 1.

La sort Prop\text{Prop}, en cambio, es impredicativa: el producto (A:Prop)AAA(A{:}\,\text{Prop})\,A \to A \to A cuantifica sobre todas las proposiciones y, sin embargo, es él mismo una proposición (habita Prop\text{Prop}). Esta es exactamente la capacidad que las codificaciones impredicativas de la primera página explotan. La impredicatividad es consistente en Prop\text{Prop} precisamente porque sus habitantes se tratan como proposiciones sin contenido computacional relevante y su eliminación está restringida, como se vio en la nota sobre restricciones de eliminación.

Nota 10.3 (Las sorts Prop y Set)

El sistema completo de Coq (y, con variantes, el de Lean) enriquece la jerarquía del CoC con una sort impredicativa Prop\text{Prop} junto a Set\text{Set}, de modo que S={Prop,Set,Type,TypeS}\mathcal{S} = \lbrace \text{Prop}, \text{Set}, \text{Type}, \text{Type}_S \rbrace (Paulin-Mohring, 1993) . La distinción es metodológica: Prop\text{Prop} alberga las proposiciones, cuyas pruebas son irrelevantes para el cómputo y pueden descartarse, mientras que Set\text{Set} y Type\text{Type} albergan los datos. Esa separación es la que, en el módulo sobre el teorema de completitud, permite declarar la relación de derivabilidad como un predicado inductivo en Prop\text{Prop} mientras la sintaxis de las fórmulas vive en Type\text{Type}.

Proposiciones borrables frente a datos

La consecuencia práctica de la nota anterior merece desarrollarse, porque gobierna el diseño de toda formalización en Lean.

  • Un dato en Type\text{Type} importa por su valor. Dos habitantes distintos de N\mathbb{N} son objetos matemáticos distintos: 353 \neq 5. Al compilar un programa, los datos deben conservarse.
  • Una prueba en Prop\text{Prop} importa solo por su existencia. Si h1h_1 y h2h_2 son dos pruebas de la misma proposición φ\varphi, ningún cómputo puede distinguirlas: las restricciones de eliminación garantizan que ningún dato en Type\text{Type} puede depender del contenido de una prueba en Prop\text{Prop} (salvo la eliminación singleton). Por eso el compilador puede borrarlas: en el código ejecutable las pruebas desaparecen sin alterar ningún resultado.

Este es el sentido preciso de la irrelevancia de pruebas. Y explica la decisión de diseño que el lector verá en el módulo 07: el tipo Formula de las fórmulas proposicionales vive en Type, porque una fórmula es un dato sobre el que se computa (se evalúa una valuación , se mide su tamaño, se recorre su árbol sintáctico); la relación de derivabilidad vive en Prop, porque de una derivación solo interesa que exista. Ambos son tipos inductivos , pero habitan sorts distintas por razones matemáticas precisas.

inductive Formula : Type where -- dato: se computa con él
| bot : Formula
| var : Nat → Formula
| impl : Formula → Formula → Formula
inductive ND : List Formula → Formula → Prop where -- proposición: solo importa su existencia
| ax : φ ∈ Γ → ND Γ φ
-- ... (una regla de inferencia por constructor)
Nota (Tres torniquetes distintos)

El símbolo \vdash aparece en este material con tres significados que conviene no confundir:

  1. El torniquete de tipado del CIC: Γt:A\Gamma \vdash t : A se lee «en el contexto Γ\Gamma, el término tt tiene tipo AA». Es el juicio de las reglas (Ind), (Constr), (Nodep) y (Dep).
  2. El torniquete de derivabilidad de la lógica: Γφ\Gamma \vdash \varphi afirma que la fórmula φ\varphi se deriva de las hipótesis Γ\Gamma en deducción natural . Al formalizarse en Lean se convierte en el predicado inductivo ND Γ φ.
  3. La meta de las tácticas de Lean: en la interfaz interactiva, «φ\vdash \varphi» denota el objetivo pendiente de demostrar, como se verá en la página siguiente.

El primero pertenece a la metateoría del CIC; el segundo es un objeto dentro del CIC; el tercero es notación de la interfaz de usuario.