Teoría Homotópica de Tipos

Tipos Inductivos Superiores

La teoría homotópica de tipos (HoTT) se define como:

HoTT=MLTT+UA+tipos inductivos superiores\text{HoTT} = \text{MLTT} + \text{UA} + \text{tipos inductivos superiores}

donde MLTT es la teoría de tipos de Martin-Löf (con los formadores de tipos vistos hasta ahora), UA es el axioma de univalencia, y los tipos inductivos superiores (HITs) son una extensión de los tipos inductivos que permite constructores no solo para términos, sino también para igualdades y igualdades entre igualdades.

De tipos inductivos a tipos inductivos superiores

Recordemos que los tipos inductivos ordinarios son generados por sus constructores (términos canónicos). Ahora, dado que consideramos los tipos como teniendo:

  • Términos
  • Igualdades
  • Igualdades entre igualdades
  • ...

podemos considerar tipos inductivos superiores, cuyos constructores pueden ser términos, igualdades, igualdades entre igualdades, etc.

Ejemplo 1 — S0boolS^0 \cong \text{bool}

S0:boolS^0 :\equiv \text{bool} tiene dos constructores de términos:

  • true:bool\text{true} : \text{bool}
  • false:bool\text{false} : \text{bool}

El intervalo

Definición 1 — Intervalo D1D^1

El intervalo D1D^1 es el tipo inductivo superior con tres constructores:

  • true:D1\text{true} : D^1 (punto)
  • false:D1\text{false} : D^1 (punto)
  • p:true=D1falsep : \text{true} =_{D^1} \text{false} (camino)

Reglas:

Eliminación: Dado d:D1d : D^1, un tipo E(d)E(d), términos t:E(true)t : E(\text{true}), f:E(false)f : E(\text{false}) y un camino π:pt=f:E(false)\pi : p_* t = f : E(\text{false}), existe:

indD1,t,f,π(d):E(d)\text{ind}_{D^1, t, f, \pi}(d) : E(d)

Computación:

  • indD1,t,f,π(true)t:E(true)\text{ind}_{D^1, t, f, \pi}(\text{true}) \doteq t : E(\text{true})
  • indD1,t,f,π(false)f:E(false)\text{ind}_{D^1, t, f, \pi}(\text{false}) \doteq f : E(\text{false})
  • indD1,t,f,π(p)π:pt=f:E(false)\text{ind}_{D^1, t, f, \pi}(p) \doteq \pi : p_* t = f : E(\text{false})

El círculo

Definición 2 — Círculo S1S^1

El círculo S1S^1 es el tipo inductivo superior con dos constructores:

  • base:S1\text{base} : S^1 (un punto)
  • loop:base=base\text{loop} : \text{base} = \text{base} (un camino del punto base a sí mismo)
Teorema 2 — π1(S1)=Z\pi_1(S^1) = \mathbb{Z}

El grupo fundamental del círculo es Z\mathbb{Z}.

Truncaciones

A veces queremos que un tipo sea un conjunto, o una proposición. Las truncaciones son HITs que "colapsan" la estructura superior de un tipo.

Truncación proposicional

Definición 3 — Truncación proposicional T1\| T \|_1

Dado un tipo TT, su truncación proposicional T1\| T \|_1 es el HIT con constructores:

  • 1:TT1|-|_1 : T \to \| T \|_1
  • x,y:T1x1=y1\prod_{x,y:\| T \|_1} |x|_1 = |y|_1

La segunda condición fuerza que T1\| T \|_1 sea una proposición.

Ejemplo 3 — T1\| T \|_1 es una proposición

Para cualquier tipo TT, T1\| T \|_1 es una proposición (h-level 1).

Lógica proposicional con HITs:

Teorema 4 — Proposiciones cerradas bajo \land, \to, \forall

Si P,Q:PropP, Q : \text{Prop}, entonces P×Q:PropP \times Q : \text{Prop} (análogo a PQP \land Q).

Si P:PropP : \text{Prop} y E:PPropE : P \to \text{Prop}, entonces p:PE(p)\sum_{p:P} E(p) y p:PE(p)\prod_{p:P} E(p) están en Prop\text{Prop}.

Sin embargo, P+QP + Q no es una proposición en general (tiene dos constructores distinguibles). Para obtener la disyunción proposicional usamos la truncación:

Definición 4 — Disyunción proposicional

Para P,Q:PropP, Q : \text{Prop}:

PQ:P+Q1P \lor Q :\equiv \| P + Q \|_1

Ejemplo 5 — Factorización por truncación

Para cualquier tipo TT y proposición PP, las funciones (TP)(T1P)(T \to P) \simeq (\| T \|_1 \to P).

Truncación como conjunto

Definición 5 — Truncación como conjunto T2\| T \|_2

Dado un tipo TT, su truncación como conjunto T2\| T \|_2 es el HIT con constructores:

  • 2:TT2|-|_2 : T \to \| T \|_2
  • x,y:T2p,q:x=yp2=q2\prod_{x,y:\| T \|_2} \prod_{p,q : x = y} |p|_2 = |q|_2
Ejemplo 6 — T2\| T \|_2 es un conjunto

Para cualquier tipo TT, T2\| T \|_2 es un conjunto (h-level 2).

Definición 6 — Grupo fundamental π1\pi_1

π1:USet\pi_1 : \mathcal{U} \to \text{Set} π1(T):λT.S1T2\pi_1(T) :\equiv \lambda T.\, \| S^1 \to T \|_2

π1(S1)=Z\pi_1(S^1) = \mathbb{Z}.

Interfaces y la completación de Rezk

El resultado de Coquand-Danielsson dice que, para tipos con estructura algebraica, la univalencia implica que la igualdad coincide con el isomorfismo:

(A=algB)(AB)(A =_{\text{alg}} B) \simeq (A \cong B)

Por lo tanto, no se puede decir nada que distinga estructuras isomorfas.

Independencia de representación

Definición 7 — Interfaces (Ahrens, North, Shulman, Tsementzis)

Supongamos que especificamos un lenguaje/interfaz limitada para hablar sobre una estructura algebraica.

Por ejemplo, para una estructura U\mathcal{U}: pU:T:UTPropp\mathcal{U} :\equiv \sum_{T:\mathcal{U}} T \to \text{Prop}.

Dados (T,p):pU(T, p) : p\mathcal{U}, pensamos en pp como el lenguaje o interfaz que usamos para razonar sobre TT. Solo podemos distinguir s,t:Ts, t : T si podemos distinguir p(s)p(s) y p(t)p(t).

Decimos que s,ts, t son indiscernibles si:

(st):(p(s)=p(t))(s \asymp t) :\equiv (p(s) = p(t))

Podemos tomar el cociente T/T/\asymp, que es un HIT con constructores:

  • i:TT/i : T \to T/\asymp
  • j:s,t:Tsti(s)=i(t)j : \prod_{s,t:T} s \asymp t \to i(s) = i(t)

Ejemplo: Colas (Angiuli, Cavallo, Mörtberg, Zeuner)

Ejemplo 7 — Independencia de representación para colas

Consideremos la interfaz de colas:

Queues(A):Q:UQ×(AQQ)×(QMaybe(Q×A))\text{Queues}(A) :\equiv \sum_{Q:\mathcal{U}} Q \times (A \to Q \to Q) \times (Q \to \mathrm{Maybe}(Q \times A))

Es decir, un record con: un tipo QQ, una constante empty:Q\text{empty} : Q, una función enqueue:AQQ\text{enqueue} : A \to Q \to Q y una función dequeue:QMaybe(Q×A)\text{dequeue} : Q \to \mathrm{Maybe}(Q \times A).

La implementación simple usa List(A)\text{List}(A):

(List(A),empty,enqueue,dequeue):Queues(A)(\text{List}(A), \text{empty}, \text{enqueue}, \text{dequeue}) : \text{Queues}(A)

Pero hay implementaciones más eficientes, como BatchedList:

BatchedList(A):List(A)×List(A)\text{BatchedList}(A) :\equiv \text{List}(A) \times \text{List}(A)

con enqueue\text{enqueue} en O(1)O(1) (agrega al final de la segunda lista).

Existe una surección s:BatchedList(A)List(A)s : \text{BatchedList}(A) \to \text{List}(A) que respeta las operaciones de la interfaz. Podemos tomar el cociente:

(bc):(s(b)=s(c))(b \sim c) :\equiv (s(b) = s(c))

Entonces, al nivel del computador (\doteq), nada cambia — seguimos usando la representación eficiente. Al nivel humano (==), tenemos BatchedList(A)/  =List(A)\text{BatchedList}(A)/\sim \;= \text{List}(A).

Así, las pruebas de correctitud sobre programas que usan List(A)\text{List}(A) se pueden aplicar a BatchedList(A)\text{BatchedList}(A).

Nota importante: Cuando tomamos cocientes de tipos así, estamos agregando cosas a los tipos (caminos nuevos). Esto contrasta con los cocientes en la teoría de conjuntos, que resultan en menos cosas (clases de equivalencia). Los cocientes en la teoría de tipos son mucho más fáciles de manejar formalmente. Esta idea ha sido importada exitosamente a lenguajes funcionales como Haskell.

Podemos entonces definir Q\mathbb{Q} como un cociente de N×N\mathbb{N} \times \mathbb{N}, R\mathbb{R} como un cociente de sucesiones de Q\mathbb{Q}, etc. Los lenguajes de programación también son cocientes (complicados) de tipos inductivos, por lo que mucha investigación actual se enfoca en entender y justificar estos cocientes para poder razonar formalmente sobre lenguajes de programación.