This commit is contained in:
Michael Zhang 2025-01-14 14:41:33 -06:00
parent afd32b8c67
commit f30aa5751c
3 changed files with 62 additions and 14 deletions

View file

@ -320,4 +320,4 @@ The construction of the spectral sequences for cohomology is joint work with Jer
editor = {Martin-Löf, Per},
date = {1975},
file = {An-Intuitionistic-Theory-of-Types-1972.pdf:/Users/michael/Zotero/storage/ICVD458G/An-Intuitionistic-Theory-of-Types-1972.pdf:application/pdf;Snapshot:/Users/michael/Zotero/storage/JLETE5WU/MARAIT-27.html:text/html},
}
}

View file

@ -11,11 +11,23 @@
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.
This mode has been removed from Lean's later versions.
Cubical offers benefits such as higher inductive types.
== 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.
#TODO[Need to have this section at all?]
One of the benefits of using a computationally-friendly system of proof is that we can use computer programs (known as proof assistants) to verify the correctness of our proofs.
The primary proof assistant used in this work is Agda @agda_developers_agda_2025. Unlike many other popular general proof assistants, it doesn't use a tactic language to express the proofs. Instead, proofs are done by writing the proof term directly.
Despite this, Agda is still friendly to the interactive theorem proving process, with the holes feature.
Inserting a question mark in place of a proof term adds a hole, which acts as a placeholder.
Type-checking continues assuming a proof term will be placed there later.
Additionally, the context at the hole can be queried with editor extensions, and refined with functions or constructors to produce more specific expressions but with holes where the arguments would be.
This allows for a top-down interactive theorem proving experience.
== Cubical Agda
@ -25,6 +37,8 @@ The results in this paper have been formalized using Cubical Agda @vezzosi_cubic
Martin-Löf type theory @martin-lof_intuitionistic_1975
== Types as terms
== Types as propositions
=== Definitional vs. propositional equality <defVsProp>
@ -40,9 +54,13 @@ Because of the computational nature of the theory, we distinguish these equaliti
The unit type $unitType$ is the type with only a single inhabitant, $isTyp(tt, unitType)$.
=== Boolean type ($boolType$)
$ isTyp(ind_unitType,
product_isTyp(C, arro(unitType, typ))
arro((isTyp(c, product_isTyp(x, unitType) C(x))), (isTyp(y, unitType)) , C(y))) $
Similar to the unit type, the boolean type $boolType$ is the
=== Boolean type ($boolType$) <boolType>
Similar to the unit type, the boolean type $boolType$ is the type with only two inhabitants, which we will call $isTyp(bTrue, boolType)$ and $isTyp(bFalse, boolType)$.
=== Empty type ($emptyType$)
@ -52,14 +70,28 @@ A function $arro(A, emptyType)$ represents a proof of the negation of $A$, since
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)$]) $
$ isTyp(ind_emptyType, product_isTyp(A, typ) arro(emptyType, A)) $
== Functions ($Pi$)
== Pairs ($Sigma$)
== Type families
== Identity type ($propEqSym$) <identityType>
#definition($ap$)[
Function application preserve identities:
$
isTyp(ap,
product_(isTyp(#[$x, y$], A))
product_(isTyp(f, arro(A, B)))
arro((propEq(x, y)), propEq(f(x), f(y)))
)
$
]
= Homotopy type theory
== Equivalences
@ -114,6 +146,7 @@ We call this path $isTyp(loop, propEq(base, base))$.
== Homotopy levels <hlevels>
#agdaCubicalLink("Cubical.Foundations.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.
@ -190,7 +223,12 @@ For any function $isTyp(f, arro(A, B))$, we can define the image of $f$, denoted
== Grading
== Exactness <exactness>
== Exactness
#definition("Exactness")[
Two functions $isTyp(f, arro(A, B))$ and $isTyp(g, arro(B, C))$ are *exact* if the image of $f$ is isomorphic to the kernel of $g$.
$ eqv(imOf(f), kerOf(g)) $
] <exactness>
= Algebraic topology
@ -199,6 +237,8 @@ For any function $isTyp(f, arro(A, B))$, we can define the image of $f$, denoted
== Eilenberg-MacLane spaces
Eilenberg-MacLane spaces were defined in homotopy type theory by #cite(<licata_eilenberg-maclane_2014>, form: "author") @licata_eilenberg-maclane_2014.
#agdaCubicalLink("Cubical.Homotopy.EilenbergMacLane.Base")
== Chain complexes
@ -219,7 +259,7 @@ Another way to word this is that for consecutive homomorphisms $d_n$ and $d_(n-1
= Spectral sequences
== Definition
== Spectra
== Exact couples
@ -228,3 +268,7 @@ Another way to word this is that for consecutive homomorphisms $d_n$ and $d_(n-1
= Applications
= Conclusion
- #TODO[References @agda_developers_agda_2025 should probably have more info]
- #TODO[References @martin-lof_intuitionistic_1975 is this correct?]

View file

@ -11,8 +11,8 @@
)
set par(
// leading: 1.3em,
spacing: 2.4em,
first-line-indent: 1.8em,
// spacing: 2.4em,
// first-line-indent: 1.8em,
justify: true,
)
set heading(
@ -37,7 +37,7 @@
bibliography("main.bib", title: none)
}
#let TODO(c) = [#text(fill: red)[*TODO:*] #c]
#let TODO(c) = [#text(fill: red)[*TODO:* #c]]
#let agdaCubicalLink(s) = link("https://github.com/agda/cubical/blob/2f085f5675066c0e1708752587ae788c036ade87/" + s.split(".").join("/") + ".agda", raw(s))
// ctheorems
@ -55,7 +55,7 @@
// Notation
#let emptyType = $bot$
#let arro(a, b) = $#a op(arrow) #b$
#let arro(..a) = $#a.pos().join($op(arrow)$)$
#let judgCtx(a) = $#a sans("ctx")$
#let isTyp(a, b) = $#a op(:) #b$
#let judgTyp(G, a, A) = $#G tack.r isTyp(#a, #A)$
@ -65,7 +65,9 @@
#let defEq(a, b) = $#a := #b$
#let judgEqTyp(G, a, b, A) = $#G tack.r isTyp(#a equiv #b, #A)$
#let imOf(f) = $sans("Im")(#f)$
#let kerOf(f) = $sans("Ker")(#f)$
#let ind = $sans("ind")$
#let ap = $sans("ap")$
#let ua = $sans("ua")$
#let uaEqv = $sans("uaEqv")$
#let isEquiv = $sans("isEquiv")$
@ -76,9 +78,11 @@
#let unitType = link(<unitType>)[$bb(1)$]
#let tt = $sans("tt")$
#let boolType = $bb(2)$
#let boolType = link(<boolType>)[$bb(2)$]
#let bTrue = $sans("true")$
#let bFalse = $sans("false")$
#let S1 = $S^1$
#let S1 = link(<circle>)[$S^1$]
#let base = $sans("base")$
#let loop = $sans("loop")$