Los tipos inductivos son tipos libremente generados por sus términos canónicos (constructores). Para definir una función (dependiente) a partir de un tipo inductivo, basta definirla en sus elementos canónicos.
Ideas generales
Los formadores de tipos son las reglas que definen Π, →, ∧/×, los tipos inductivos, etc. Cuando estudiamos teoría de tipos, elegimos cuáles formadores incluir. Cuando se habla de HoTT, generalmente se refiere a una teoría de tipos con formadores particulares (los de este curso) más un axioma (univalencia).
Comparado con ZF: en la teoría de conjuntos, productos, funciones, etc. deben ser codificados dentro de ZF. En la teoría de tipos, postulamos que productos, funciones, etc. existen directamente. Así, la matemática cotidiana está más cerca de los fundamentos en teoría de tipos.
Los booleanos
Definición 1 — bool
bool es generado por dos términos canónicos: true y false.
Formación:
⊢booltype
Introducción:
⊢true:bool⊢false:bool
Eliminación: Dados:
Γ,x:bool⊢Dtype
Γ⊢a:D[true/x]
Γ⊢b:D[false/x]
Entonces: Γ,x:bool⊢ind-boola,b:D
Es decir: para construir algo de tipo D para cualquier booleano, basta dar un valor para el caso true y otro para el caso false.
Definimos la negación como not:=λx.ind-boolfalse,true:bool→bool.
En la derivación, usamos la regla de formación debilitada de bool (en un contexto x:bool), y los hechos de que false:bool≐bool[true/x] y true:bool≐bool[false/x].
Coproductos
Definición 2 — Coproducto P+Q
Formación: Si Γ⊢Ptype y Γ⊢Qtype, entonces Γ⊢P+Qtype.
Introducción: Si Γ⊢p:P, entonces Γ⊢inl(p):P+Q. Si Γ⊢q:Q, entonces Γ⊢inr(q):P+Q.
Eliminación: Dados:
Γ,x:P+Q⊢Dtype
Γ,p:P⊢a:D[inl(p)/x]
Γ,q:Q⊢b:D[inr(q)/x]
Entonces: Γ,x:P+Q⊢ind-+a,b:D
Es decir: para construir algo a partir de P+Q, basta manejar el caso en que viene de P (vía inl) y el caso en que viene de Q (vía inr).
Interpretación lógica: Podemos probar (producir un término de) P+Q si podemos probar P o probar Q. Para probar algo a partir de P+Q hacemos una prueba por casos. Así, + se comporta como la disyunción (o).
Ejemplo 2 — A×B+A×C→A×(B+C)
Para cualesquiera tipos A,B,C, existe una función A×B+A×C→A×(B+C).
Luego por eliminación del coproducto obtenemos la función deseada.
Pares dependientes (Σ-tipos)
Definición 3 — Σ-tipos
Formación: Si Γ,x:P⊢Qtype, entonces Γ⊢∑x:PQtype.
Introducción: Si Γ⊢p:P y Γ⊢q:Q[p/x], entonces Γ⊢pair(p,q):∑x:PQ.
Eliminación: Dados:
Γ,y:∑x:PQ⊢Dtype
Γ,x:P,z:Q⊢a:D[pair(x,z)/y]
Entonces: Γ,y:∑x:PQ⊢indΣ(a,y):D
Es decir: para construir algo a partir de un par dependiente, basta decir qué hacer dado el primer componente x:P y el segundo z:Q.
Computación:indΣ(a,pair(x,z))≐a:D[pair(x,z)/y].
Interpretación lógica: Para probar ∑x:PQ (pensando en P como un conjunto y Q como un predicado sobre P), necesitamos producir un término p:P y probar Q[p/x]. Así, se comporta como el cuantificador existencial ∃x:PQ(x).
Interpretación conjuntista: Los términos canónicos son pares (p,q). Se comporta como la unión disjunta ⨆x:PQ(x).
Ejemplo 3 — Función de proyección
Para cualquier tipo dependiente x:P⊢Q, existe una función de proyección π:∑x:PQ→P definida por π(pair(x,z))=x.
Ejemplo 4 — ∑n:NVect(n)
Si Vect(n) denota el tipo de vectores de longitud n, entonces ∑n:NVect(n) es el tipo de todos los vectores (de cualquier longitud). La proyección ∑n:NVect(n)→N retorna la longitud del vector.
Los números naturales
Definición 4 — N
Formación:⊢Ntype.
Introducción:⊢0:N, y si Γ⊢n:N, entonces Γ⊢Sn:N.
Eliminación (inducción): Dados:
Γ,x:N⊢Dtype
Γ⊢a:D[0/x]
Γ,x:N,y:D⊢b:D[Sx/x]
Entonces: Γ,x:N⊢indN(a,b,x):D
Es decir: para construir algo para todo natural, basta dar el caso base (0) y el paso inductivo (de x a Sx). Esto es el principio de inducción.
Computación:
indN(a,b,0)≐a:D[0/x]indN(a,b,Sx)≐b:D[Sx/x]
Ejemplo 5 — add:N→N→N
Definimos la suma por recursión en el segundo argumento:
add(x,0)≐xadd(x,Sy)≐S(add(x,y))
Es decir, add:=λx.λy.indN(x,λz.Sz,y).
Análogamente, mult:=λx.λy.indN(0,λz.add(x,z),y).
El tipo identidad
Igualdad judgmental vs proposicional
Tenemos una noción de igualdad judgmental (≐) que surge de las reglas de computación. Por ejemplo:
add(x,0)≐xadd(x,Sy)≐Sadd(x,y)
Pero no todas las igualdades que queremos son judgmentales. Por ejemplo, add(0,x)≐x no se obtiene directamente — necesitamos inducción. La igualdad proposicional internaliza la igualdad como un tipo.
Definición 5 — Tipo identidad =
Formación: Si Γ⊢Atype, Γ⊢a:A y Γ⊢b:A, entonces Γ⊢a=Abtype.
Introducción (reflexividad): Si Γ⊢a:A, entonces Γ⊢ra:a=Aa.
Eliminación (inducción de caminos): Dados:
x:A,y:A,z:x=Ay⊢D(x,y,z)type
x:A⊢d:D(x,x,rx)
Entonces: x:A,y:A,z:x=Ay⊢ind=(d,x,y,z):D(x,y,z)
Es decir: para demostrar algo sobre cualquier igualdad z:x=Ay, basta demostrarlo para el caso reflexivo rx:x=Ax. El resto se propaga por inducción.
Computación:x:A⊢ind=(d,x,x,rx)≐d:D(x,x,rx).
La reflexividad (r) convierte igualdades judgmentales en proposicionales: si a≐b:A, entonces (a=Ab)≐(a=Aa), y ra:a=Ab.
Los constructores de tipos internalizan estructura
Los constructores de tipos frecuentemente internalizan nociones externas:
bool, N, ∅, 1 internalizan nociones externas como la elección, la recursión, la falsedad y la verdad trivial.
El tipo universoU internaliza el juicio "Atype".
El tipo identidad internaliza la igualdad judgmental a≐b:A.