La PizarraMatemática.

Máster y doctorado

Teorías de tipos y fundamentos constructivos

Un tipo indica qué clase de objeto podemos construir y qué operaciones están permitidas. En la lectura de proposiciones como tipos, demostrar también será construir: una función para una implicación, dos evidencias para una conjunción y un testigo para una existencia. Escribiremos cada entrada y cada salida antes de combinar términos. Hay distintas teorías de tipos; indicaremos cuándo una distinción depende del sistema concreto.

1. El contexto dice qué podemos usar y el juicio dice qué hemos construido

Γ⊢t: A se lee: bajo las hipótesis del contexto Γ, t tiene tipo A.

El contexto puede contener x: A y f: A→B.

No basta escribir un nombre de variable para tener un término cerrado: una hipótesis es una entrada que se supone disponible.

Primero se comprueba que los tipos y las dependencias tengan sentido; después que el término siga sus reglas. Usaremos notación matemática de funciones, productos y tipos dependientes, no una sintaxis que se prometa idéntica en todos los asistentes.

Una hipótesis no es una construcción sin entradas

Contexto Γ contiene x: A.

  1. Lo disponible

    Podemos derivar Γ⊢x: A: la variable declarada proporciona un término bajo esa hipótesis.

  2. Lo que no se hizo

    No se ha construido un objeto de A sin contexto. Si A fuera vacío, no existiría ninguna entrada real para suministrar a esa variable.

  3. Resultado cerrado

    Sí podemos construir una función que, dada una entrada de A, la devuelva. Su tipo será A→A, sin exigir antes un habitante cerrado de A.

Resultado

Se conserva la diferencia entre suponer una entrada y producirla.

Lo comprobamos

La identidad existe incluso cuando A es vacío; en ese caso no hay entradas a las que aplicarla.

Aplicar una regla exige que coincidan los tipos

Γ contiene n: N y f: N→Bool, con Bool de dos constructores.

  1. Entrada válida

    f(n) tiene tipo Bool porque n tiene el tipo que recibe f.

  2. Salida disponible

    El resultado será un booleano, no un natural solo por haber empezado con uno.

  3. Entrada incorrecta

    f(true) no está justificada por esos datos: true tiene tipo Bool, y no se ha dado una conversión de Bool a N.

Resultado

Los tipos controlan qué composiciones están permitidas.

Lo comprobamos

Tener dos nombres de tipos no autoriza a identificarlos aunque se puedan codificar sus valores.

2. Una función introduce una entrada y construye una salida

Para obtener λx. t: A→B, suponemos x: A y construimos t: B.
Para usar f: A→B necesitamos a: A; entonces f(a): B.

La primera regla introduce una función y la segunda la elimina mediante aplicación.

Como interpretación lógica, una prueba de A→B transforma cualquier evidencia de A en evidencia de B. No exige disponer previamente de una prueba cerrada de A. La hipótesis queda expresada en la entrada de la función.

La identidad devuelve exactamente lo recibido

Construir A→A.

  1. Suponer entrada

    Introducir x: A en el contexto.

  2. Construir salida

    El propio x ya tiene tipo A. No hace falta inventar otra evidencia.

  3. Abstraer

    Cerrar la entrada produce λx. x: A→A.

    Al aplicarla a a: A, el resultado es a.

Resultado

La demostración de A→A no presupone una prueba sin hipótesis de A.

Lo comprobamos

Si se borra λx pero se deja x libre, ya no se ha dado el término cerrado anunciado.

Una segunda entrada puede ignorarse de forma legítima

Construir A→(B→A).

  1. Primera entrada

    Tomar a: A.

  2. Segunda entrada

    Tomar b: B; el a anterior sigue disponible. Elegir a como salida de tipo A.

  3. Cerrar ambas

    λa. λb. a tiene el tipo solicitado. Recibe dos entradas, aunque use solo la primera.

Resultado

No toda entrada tiene que intervenir en el cálculo de una función.

Lo comprobamos

Para A→B sin una entrada o regla que produzca B no bastaría devolver a, cuyo tipo es A.

3. Un producto necesita dos componentes y permite extraerlas

Para construir A×B se dan a: A y b: B y se forma (a, b). Si p: A×B, sus proyecciones p.1 y p.2 tienen tipos A y B. Las posiciones están tipadas: intercambiarlas cambia el producto de destino.

Intercambiar un par cambia el orden de sus tipos
p: A×Bp.1: Ap.2: Bp.2: Bp.1: A(p.2, p.1): B×Aλp.(p.2, p.1)Cada componente conserva su tipo.
De una entrada p de tipo A por B se extraen p punto uno de tipo A y p punto dos de tipo B. La salida coloca primero la evidencia de B y después la de A, por lo que tiene tipo B por A. Las líneas cruzadas indican el cambio de posición y no una conversión del tipo A en B.

En la lectura lógica abstracta, el producto representa conjunción. En un sistema como Lean, el producto de datos y la conjunción de proposiciones son construcciones distintas con reglas análogas: no se sustituye literalmente Prod por And en cualquier expresión.

Intercambiar un par conserva los tipos de sus piezas

p: A×B; producir B×A.

  1. Extraer

    p.1: A y p.2: B.

  2. Orden nuevo

    El producto destino pide primero B y después A. Formar (p.2, p.1).

  3. Función

    λp.(p.2, p.1): A×B→B×A.

    Ninguna componente se convirtió en otra; solo cambió de posición.

Resultado

Dos intercambios recuperan el par en la igualdad apropiada del sistema.

Lo comprobamos

(p.1, p.1) tendría tipo A×A y no sirve en general para B×A.

Una proyección puede descartar información, pero no inventarla

Entrada (3, true): N×Bool.

  1. Primera proyección

    Su primera componente es tres, de tipo N.

  2. Segunda proyección

    Su segunda componente es true, de tipo Bool.

  3. Reconstrucción

    Con ambas se recupera el par. Con solo el natural tres no se puede saber si el booleano original era true o false.

Resultado

Introducir el producto requiere más datos que extraer una componente.

Lo comprobamos

El descarte es permitido por estas reglas usuales; no se supone aquí una teoría lineal que exija usar cada entrada exactamente una vez.

4. Una suma marca qué alternativa se ha construido

A+B tiene dos constructores: inl(a) con a: A e inr(b) con b: B. La etiqueta izquierda o derecha distingue las alternativas incluso si A y B son el mismo tipo. Para obtener C de A+B hay que explicar qué hacer en los dos casos.

En la lectura proposicional corresponde a una disyunción con evidencia de una rama. No se obtiene una transformación de A+B a C dando únicamente el caso izquierdo y suponiendo que nunca llegará el derecho.

El mismo número puede entrar por dos ramas distintas

Tipo N+N y número tres.

  1. Izquierda

    inl(3) lleva la etiqueta izquierda.

  2. Derecha

    inr(3) lleva la etiqueta derecha; no es el mismo constructor aunque el dato numérico coincida.

  3. Eliminar

    Definir una función que devuelva cero en la rama izquierda y uno en la derecha distingue ambos términos.

Resultado

Las marcas son parte de la información del tipo suma.

Lo comprobamos

No se identifica una suma disjunta con una unión que borre la procedencia.

Para llegar a C se necesita un plan para cada rama

Disponemos de f: A→C y g: B→C.

  1. Caso izquierdo

    Si la entrada es inl(a), devolver f(a): C.

  2. Caso derecho

    Si es inr(b), devolver g(b): C.

  3. Función total

    El análisis de casos cubre todos los constructores de A+B.

    Así se construye A+B→C.
Resultado

La eliminación de una disyunción exige las dos transformaciones.

Lo comprobamos

Si falta g, todavía no se ha justificado qué devolver ante una entrada derecha.

5. Negar A es transformar cualquier evidencia de A en una contradicción

El tipo vacío, que escribiremos Empty o 𝟘, no tiene constructores. No es el natural cero. Su regla de eliminación permite construir un término de cualquier tipo a partir de una entrada de Empty: no hay ningún caso constructor que pueda quedar sin resolver.

La negación ¬A se interpreta como A→Empty.

Si se tienen a: A y h:¬A, la aplicación h(a) produce contradicción. Esto explica qué datos hacen falta para usar una negación.

Una contradicción disponible cierra cualquier objetivo

Contexto a: A y h: A→Empty; objetivo B.

  1. Aplicar

    h(a) tiene tipo Empty por la regla de función.

  2. Eliminar vacío

    El eliminador de Empty produce un término de B a partir de esa contradicción.

  3. Alcance

    No se construyó un habitante de B sin hipótesis. Se mostró que de esas dos hipótesis incompatibles se deriva B.

Resultado

El principio de explosión usa una contradicción real en el contexto.

Lo comprobamos

Escribir la palabra falso sin una evidencia de Empty no permite esta regla.

De una prueba de A se construye su doble negación

Entrada a: A; objetivo ¬¬A.

  1. Desplegar tipos

    ¬¬A significa (A→Empty)→Empty.
  2. Introducir

    Suponer h: A→Empty y aplicar h a la evidencia a.
  3. Abstraer

    λh. h(a) tiene tipo ¬¬A. Esta dirección es constructiva; no se ha usado tercero excluido.

Resultado

A→¬¬A tiene una construcción directa.

Lo comprobamos

La dirección ¬¬A→A no se obtiene en general invirtiendo mecánicamente esta función.

6. Un tipo dependiente decide el tipo de salida a partir de la entrada

Una familia B(x) asigna un tipo a cada x: A. El producto dependiente Π(x: A)B(x) contiene funciones que, para cada entrada, entregan una salida del tipo correspondiente.

Cuando B es constante, se recupera A→B.

Ejemplo: Vec(Bool, n) es el tipo de vectores booleanos de longitud n. El índice n forma parte del tipo, no es una etiqueta informal. La cuantificación universal se interpreta mediante una función que entrega evidencia para cualquier entrada.

La longitud prometida cambia con el natural de entrada

Construir ceros: Π(n: N)Vec(Bool, n).

  1. Base

    Para cero, devolver el vector vacío de longitud cero.

  2. Paso

    Para n+1, colocar false delante del vector ceros(n), obteniendo longitud n+1.

  3. Control

    ceros(2) tiene longitud dos y ceros(3) longitud tres. La recursión usa un natural menor y el resultado respeta el índice de cada entrada.

Resultado

Un único término puede tener tipos de salida que varían con n.

Lo comprobamos

Devolver siempre el vector vacío no cumpliría el tipo para n positivo.

Un universal requiere un argumento arbitrario, no unas muestras

Construir Π(n: N) una prueba de n=n.

  1. Entrada arbitraria

    Introducir n: N sin fijar un numeral concreto.

  2. Evidencia

    La reflexividad de igualdad proporciona una prueba de n=n para ese n.

  3. Universal

    Abstraer n da una función que suministra esa prueba para cualquier natural. No se depende de haber revisado cero, uno y dos.

Resultado

La entrada arbitraria conserva la generalidad del enunciado.

Lo comprobamos

Para un dominio finito conocido sí podría bastar un análisis exhaustivo de sus constructores.

7. Una existencia constructiva vincula un testigo con su evidencia

En la notación constructiva abstracta, Σ(x: A)B(x) contiene pares (a, b) donde a: A y b: B(a). Al elegir a también elegimos la obligación exacta de la segunda componente. No vale adjuntar evidencia sobre otro testigo sin una igualdad que permita transportarla.

Un par dependiente vincula el testigo y su evidencia
Σ(n: N) (n²=4)Elegimos n=2La segunda componente pide:2²=4(2, prueba de 4=4)Con n=3 pediría 9=4.El testigo cambia la obligación.No basta escribir una variable n.
En notación matemática constructiva, el tipo suma dependiente pide un natural y una prueba de que su cuadrado vale cuatro. Con testigo dos, la obligación se calcula hasta cuatro igual cuatro. Si se cambiara el testigo por tres, habría que probar nueve igual cuatro y la evidencia anterior ya no tendría el tipo requerido. No se identifica esta notación abstracta con Sigma y Exists de Lean.

Los sistemas concretos distinguen construcciones. En Lean, una existencia proposicional Exists vive en Prop; Sigma agrupa datos dependientes en Type y Subtype agrupa un dato con una propiedad. Las restricciones de eliminación impiden tratarlos todos como una misma caja de datos.

Elegir un testigo transforma la propiedad en una obligación concreta

En notación matemática, Σ(n: N)(n²=4).

  1. Testigo

    Elegir n=2.
  2. Calcular obligación

    La segunda componente debe probar 2²=4.

    Ambos lados calculan hasta cuatro y sirve reflexividad.

  3. Par

    El par formado por dos y esa evidencia pertenece al tipo dependiente. Si cambiáramos el testigo a tres, pediría 9=4 y la prueba anterior no serviría.

Resultado

No basta decir que algún n funciona: se da uno y se verifica.

Lo comprobamos

El dibujo usa la lectura abstracta de proposiciones como tipos, no la sintaxis literal de Sigma en Lean.

Extraer la segunda componente conserva la referencia a la primera

p: Σ(n: N)Vec(Bool, n).

  1. Testigo extraído

    p.1 es un natural, por ejemplo dos.

  2. Dato dependiente

    p.2 tiene tipo Vec(Bool, p.1). Si el primero es dos, su longitud es dos.

  3. Cambio indebido

    Sustituir la primera componente por tres y dejar el mismo vector no produce un par del tipo anunciado. Se necesitaría construir un nuevo vector de longitud tres.

Resultado

Dato y tipo dependiente se mantienen ligados.

Lo comprobamos

Una existencia en Prop no ofrece sin más una función computable que extraiga datos hacia Type; se respetan las reglas del asistente utilizado.

8. Reducir un término calcula; demostrar una igualdad puede requerir más

La reducción beta transforma (λx. t)(a) en t con a sustituido por x, evitando capturar variables libres. Las proyecciones de un par se reducen a sus componentes. La igualdad definicional reconoce expresiones que coinciden mediante las reglas de cálculo del sistema.

Una igualdad proposicional es un tipo con términos de prueba; no toda prueba de igualdad convierte sus lados en expresiones definicionalmente idénticas. Las teorías constructivas puras con normalización controlan sus términos; no se transfiere esa garantía a recursión ilimitada ni a cualquier extensión por axiomas.

Calcular una función y después una proyección

Término (λp. p.2)((3, true)).

  1. Aplicar

    Sustituir el par por p produce (3, true).2.

  2. Proyectar

    La segunda proyección del par reduce a true.

  3. Tipo

    La función original tenía tipo N×Bool→Bool y el resultado es Bool. Cada paso preservó el tipo.

Resultado

El resultado se obtuvo por cálculo, sin un teorema externo.

Lo comprobamos

La primera proyección daría tres y tendría otro tipo.

Sustituir debe evitar capturar una variable libre

En un contexto con y: A, aplicar (λx. λy. x) a ese y libre; los tipos de entrada se toman iguales para simplificar.

  1. Conflicto de nombres

    La y ligada interior tiene el mismo nombre que la entrada libre. Sustituir sin cuidado convertiría una función constante en la identidad.

  2. Renombrar

    Renombrar la variable ligada interior como z: λx. λz. x.

  3. Reducir

    La aplicación da λz. y, que devuelve la y del contexto para cualquier z. No da λy. y.

Resultado

Los nombres ligados se pueden cambiar sin alterar el significado.

Lo comprobamos

La notación con ámbitos o índices de variables ayuda a controlar esta obligación.

9. Las identidades y los universos añaden reglas que hay que declarar

El tipo de identidad a=b contiene evidencia de igualdad.

Su eliminación permite transportar datos de B(a) a B(b). No cambia un índice porque se parezca al otro: utiliza una igualdad disponible.

Los universos organizan tipos de tipos. En sistemas predicativos habituales, Type u pertenece a un nivel superior, no a sí mismo. Las reglas exactas, la extensionalidad y principios como univalencia dependen de la teoría; no se incorporan sin indicarlo.

Una igualdad permite transportar una longitud

h: n=m y v: Vec(Bool, n).

  1. Situación

    v tiene longitud indexada por n. El objetivo pide un vector indexado por m.

  2. Usar h

    La eliminación de igualdad transporta v en la familia k↦Vec(Bool, k), obteniendo un término de Vec(Bool, m).

  3. Reflexividad

    Si h es la evidencia reflexiva n=n, el transporte calcula hasta el mismo vector en las reglas habituales.

Resultado

Un cambio de índice necesita cálculo definicional o evidencia de igualdad.

Lo comprobamos

No se afirma que dos naturales distintos sean iguales solo para adaptar la longitud.

Un universo de tipos no es automáticamente uno de sus propios elementos

Trabajar con una jerarquía predicativa Type₀, Type₁,… .

  1. Tipos pequeños

    N y Bool pueden vivir en Type₀, y sus términos viven en esos tipos.

  2. Tipo del universo

    Type₀ vive en Type₁. La regla no proporciona Type₀: Type₀.

  3. Alcance

    La jerarquía controla qué formaciones se permiten. No se deducen de esta explicación todas las propiedades de Prop impredicativo o de otras teorías con reglas diferentes.

Resultado

Se distingue un término, su tipo y el universo de ese tipo.

Lo comprobamos

Introducir un universo sin restricciones puede alterar la consistencia; las reglas forman parte del sistema elegido.

10. Lo clásico añade principios; lo decidible ya permite elegir casos concretos

Tercero excluido afirma A∨¬A para toda proposición. La lógica constructiva no lo ofrece como regla general sin una construcción que elija una rama. Sí permite demostrarlo para propiedades decidibles mediante un procedimiento que devuelve evidencia de una alternativa.

Agregar principios clásicos puede facilitar pruebas de existencia sin entregar automáticamente un testigo calculable. No significa que toda prueba clásica sea errónea: significa que se declara el sistema y se distingue demostrar una proposición de calcular datos.

La igualdad de booleanos es decidible por sus cuatro casos

Comparar b y c de tipo Bool, con constructores false y true.

  1. Iguales

    false con false y true con true dan una prueba de igualdad por reflexividad.

  2. Diferentes

    false con true y true con false dan evidencia de desigualdad por disjunción de constructores.

  3. Totalidad

    Los cuatro casos cubren todas las entradas. Para cada pareja obtenemos igualdad o su negación de manera constructiva.

Resultado

Una propiedad concreta puede ser decidible sin tercero excluido general.

Lo comprobamos

No se infiere de cuatro casos de Bool una decisión para toda proposición matemática.

Negar la doble negación no la convierte por sí sola en un dato

Tenemos h:¬¬A y queremos construir a: A.

  1. Qué ofrece h

    h recibe una negación de A y devuelve contradicción. No recibe un número ni entrega directamente a: A.

  2. Información adicional

    Si disponemos de una decisión A+¬A, analizamos casos: la rama A aporta evidencia; la otra contradice h y permite eliminar vacío.

  3. Frontera general

    Sin tal decisión o un principio clásico adicional, esa construcción no da ¬¬A→A para A arbitraria.

Resultado

Se ve exactamente dónde entra la elección de alternativas.

Lo comprobamos

Las bibliotecas pueden aportar principios clásicos; su uso debe quedar identificado en las dependencias de la prueba.

Ahora lo resolvemos de principio a fin.

EJEMPLO RESUELTO 1

Intercambiar un par

Construye una prueba de A∧B→B∧A.

  1. Interpretación

    En la lectura proposicional usamos las reglas de conjunción, análogas a las de un producto.

  2. Entrada

    Suponer p: A∧B.

  3. Extraer A

    La primera proyección p.1 es evidencia de A.

  4. Extraer B

    La segunda proyección p.2 es evidencia de B.

  5. Construir destino

    Formar (p.2, p.1), evidencia de B∧A con el orden requerido.

  6. Cerrar

    λp.(p.2, p.1) prueba A∧B→B∧A.

    En un asistente concreto se usan los constructores de conjunción correspondientes.

Resultado

λp.(p.2,p.1).

Lo comprobamos

La primera componente tiene tipo B y la segunda A.

EJEMPLO RESUELTO 2

Composición

Dados f:A→B y g:B→C, construye A→C.

  1. Datos

    f: A→B y g: B→C están disponibles.
  2. Entrada

    Introducir x: A arbitrario.

  3. Primera aplicación

    f(x): B porque coincide el tipo de entrada.

  4. Segunda aplicación

    g(f(x)): C porque g recibe precisamente un B.

  5. Abstraer

    λx. g(f(x)): A→C es la composición g∘f.
  6. Comprobar

    El tipo intermedio B coincide en salida y entrada. Invertir las funciones pediría otros tipos y no está justificado en general.

Resultado

g∘f=λx.g(f(x)).

Lo comprobamos

La salida intermedia B coincide con la entrada de g.

Los símbolos que hemos usado

a:A
Juicio: el término a tiene tipo A en el contexto considerado.
Γ
Contexto ordenado de variables con tipos e hipótesis disponibles.
A→B
Tipo de funciones que reciben un término de A y producen uno de B.
A×B
Tipo de pares con primera componente de A y segunda de B.
λx.t
Función que, dada una entrada x, devuelve el término t.
Π(x:A) B(x)
Tipo de funciones dependientes: para cada x:A producen un elemento de B(x).
Σ(x:A) B(x)
Tipo de pares dependientes (a,b) con a:A y b:B(a).
0
Tipo vacío, sin constructores, que representa falsedad en la interpretación elegida.

Ahora te toca a ti.

Tienes cinco ejercicios. Inténtalos; las pistas te ayudan si te atascas.

Practicar este tema →

Para ampliar