type-theory/thesis/main.typ

230 lines
7.5 KiB
Text

#import "./style.typ": *
#import "@preview/prooftrees:0.1.0": *
#import "@preview/cetz:0.3.1" as cetz: canvas, draw
#show: doc => template(
title: "THESISge",
doc,
)
= Introduction
This work extends Floris van Doorn's PhD dissertation @van_doorn_formalization_2018.
In that work, the mechanization of the proof was done in Lean 2's HoTT mode.
This mode has been removed from Lean's later versions, and as of the time of writing, Lean has no support for doing full homotopy type theory.
== Computer formalization
One of the benefits of using a computationally-friendly system of proof is that we can use computer programs to verify the correctness of our proofs.
== Cubical Agda
The results in this paper have been formalized using Cubical Agda @vezzosi_cubical_2021, an extension to the Agda proof assistant that implements cubical type theory.
= Martin-Löf type theory
Martin-Löf type theory @martin-lof_intuitionistic_1975
== Types as propositions
=== Definitional vs. propositional equality <defVsProp>
Because of the computational nature of the theory, we distinguish these equalities:
- $a$ and $b$ are *definitionally* (or judgmentally) equal, denoted $defEq(a, b)$, if they reduce to exactly the same term through reduction rules
- $a$ and $b$ are *propositionally* equal, denoted $propEq(a, b)$, if there exists any term in the #link(<identityType>)[identity type] $propEq(a, b)$ (will be introduced in a later section).
== Basic types
=== Unit type ($unitType$) <unitType>
The unit type $unitType$ is the type with only a single inhabitant, $isTyp(tt, unitType)$.
=== Boolean type ($boolType$)
Similar to the unit type, the boolean type $boolType$ is the
=== Empty type ($emptyType$)
The empty type $emptyType$ is the type with no inhabitants.
Logically, this corresponds to falsehood.
A function $arro(A, emptyType)$ represents a proof of the negation of $A$, since as a consequence $A$ implies false.
The empty type eliminator is hence the principle of #link("https://en.wikipedia.org/wiki/Principle_of_explosion")[_ex falso quodlibet_]:
$ isTyp(ind_emptyType, #[$forall (isTyp(A, typ)), arro(emptyType, A)$]) $
== Functions ($Pi$)
== Pairs ($Sigma$)
== Identity type ($propEqSym$) <identityType>
= Homotopy type theory
== Equivalences
== Univalence axiom <univalence>
One of the key observations of homotopy type theory is that the equivalence type $eqv(A, B)$ internally reflects an underlying equality between $A$ and $B$.
The *univalence axiom* realizes this idea by giving a way to "upgrade" our equivalence into a propositional equality:
#axiom("Univalence")[
$ isTyp(ua, arro((eqv(A, B)), (propEq(A, B)))) $
] <univalenceAxiom>
#axiom("Univalence equivalence")[
$ isTyp(uaEqv, isEquiv(ua)) $
] <univalenceEqvAxiom>
This property is not expressible with book HoTT.
== Pointed types
== Higher inductive types
=== Circle ($S1$) <circle>
The circle is a simple yet rich space that demonstrates a lot of interesting properties.
Analytically, the circle could be defined as the set of points $isTyp((x, y), RR times RR)$ such that:
$ x^2 + y^2 = 1 $
#align(center, canvas({
import draw: *
grid((-3, -3), (3, 3), stroke: luma(90%))
circle((0, 0), radius: 2)
}))
In synthetic homotopy theory, we distill the circle to its only distinguishing property: that it cannot be contracted into a point, due to the hole in the middle.
We call this type $S1$, where the 1 indicates that it is a 1-dimensional sphere.
For some arbitrary choice of base point, denoted $isTyp(base, S1)$, we can imagine the circle as a path going from the base to itself.
We call this path $isTyp(loop, propEq(base, base))$.
#align(center, canvas({
import draw: *
circle((0, 2), radius: 2)
content((0, 4.5), $loop$)
circle((0, 0), radius: 0.05, stroke: (paint: red, thickness: 3pt))
content((0, 0.5), text($base$, stroke: red))
}))
=== Suspensions ($Sigma$)
== Homotopy levels <hlevels>
#footnote[
Homotopy levels are also known under a different name, homotopy $n$-types.
Although the name is the same, the numbers are offset by 2, such that sets are $0$-types, mere props are $(-1)$-types, and contractible types are $(-2)$-types.
This may introduce a lot of confusion, so for the purposes of this paper I will stick to homotopy levels since it makes more sense to begin induction on homotopy levels from 0.
]
= Cubical type theory <cubicaltt>
Cubical type theory @cohen_cubical_2016
== Cubical interval
== $sans(#[hcomp])$ and $sans(#[hfill])$
== $sans(#[Glue])$ and $sans(#[glue])$
= Algebra
== Groups
#definition("Group")[
A group ($G$, $dot$) is a type ($G$) equipped with a binary operation ($dot$) that satisfies a few axioms.
- Associativity: for any #isTyp($a, b, c$, $G$),
- Identity: #TODO[identity]
- Inverse: #TODO[inverse]
] <group>
The mechanized definition of this can be found in #agdaCubicalLink("Cubical.Algebra.Group.Base").
#definition("Abelian group")[] <abelianGroup>
== Images and kernels
For any function $isTyp(f, arro(A, B))$, we can define the image of $f$, denoted $imOf(f)$ to be all of the elements in $B$ such that are mapped to from $A$. This differs from the _codomain_ of $f$, which is the entire set $B$ including points that cannot be mapped to.
#definition("Image")[
For types $A$ and $B$, and a function $isTyp(f, arro(A, B))$, define:
$ defEq(imOf(f), sum_(isTyp(b, B)) (sum_(isTyp(a, A)) propEq(f(a), b))) $
#TODO[This needs to be mere existence, but I need to figure out how to write that]
] <image>
#align(center, canvas({
import draw: *
content((0, 2.5), $A$)
circle((0, 0), radius: (1, 2))
content((5, 2.5), $B$)
circle((5, 0), radius: (1, 2))
circle((5, 0), radius: (0.75, 1.25), stroke: none, fill: luma(80%))
circle((0, 1.5), stroke: 3pt, radius: 0.05)
circle((0, 0.75), stroke: 3pt, radius: 0.05)
circle((0, 0), stroke: 3pt, radius: 0.05)
circle((0, -0.75), stroke: 3pt, radius: 0.05)
circle((0, -1.5), stroke: 3pt, radius: 0.05)
circle((5, 1.5), stroke: 3pt, radius: 0.05)
circle((5, 0.75), stroke: 3pt, radius: 0.05)
circle((5, 0), stroke: 3pt, radius: 0.05)
circle((5, -0.75), stroke: 3pt, radius: 0.05)
circle((5, -1.5), stroke: 3pt, radius: 0.05)
bezier((0, 1.5), (5, 0.75), (3, 1.5), (2, 0.75), mark: (end: ">"))
line((0, 0), (5, 0), mark: (end: ">"))
line((0, 0.75), (5, 0.75), mark: (end: ">"))
bezier((0, -0.75), (5, 0), (3, -0.75), (2, 0), mark: (end: ">"))
bezier((0, -1.5), (5, -0.75), (3, -1.5), (2, -0.75), mark: (end: ">"))
line((6.25, 0), (5.5, 0), stroke: luma(80%))
content((7, 0), text($imOf(f)$, fill: luma(50%)))
}))
== Modules
== Grading
== Exactness <exactness>
= Algebraic topology
== Basic spaces
== Eilenberg-MacLane spaces
#agdaCubicalLink("Cubical.Homotopy.EilenbergMacLane.Base")
== Chain complexes
#definition("Chain complex")[
A *chain complex* is a sequence of #link(<abelianGroup>)[abelian groups] $isTyp(C_n, AbGroup)$ ("chains") along with homomorphisms between consecutive groups $isTyp(d_n, hom(C_n, C_(n-1)))$ ("boundaries"), such that for any $n$, the proposition $propEq(homComp(d_(n-1), d_n), 0_(C_(n-2)))$ is inhabited.
] <chainComplex>
Another way to word this is that for consecutive homomorphisms $d_n$ and $d_(n-1)$, the #link(<image>)[image] of $d_n$ is a subgroup of the kernel of $d_(n-1)$.
#definition("Exact sequence")[
An *exact sequence* is a chain complex where all consecutive homomorphisms are #link(<exactness>)[exact].
] <exactSequence>
== Homology and cohomology
== Long exact sequence of homotopy groups
= Spectral sequences
== Definition
== Exact couples
== Serre spectral sequence
= Applications
= Conclusion