Merge branch 'dev'
This commit is contained in:
commit
513d91ae4f
16
README.md
16
README.md
|
@ -7,6 +7,12 @@ This project aims to formalize some parts of category theory using cubical agda
|
||||||
This project draws a lot of inspiration from [the
|
This project draws a lot of inspiration from [the
|
||||||
HoTT-book](https://homotopytypetheory.org/book/).
|
HoTT-book](https://homotopytypetheory.org/book/).
|
||||||
|
|
||||||
|
If you want more information about this project, then you're in luck. This is my
|
||||||
|
masters thesis. Go ahead and read it:
|
||||||
|
|
||||||
|
cd doc/
|
||||||
|
make read
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
============
|
============
|
||||||
|
|
||||||
|
@ -18,7 +24,8 @@ To succesfully compile the following is needed:
|
||||||
* [Agda Standard Library](https://github.com/agda/agda-stdlib)
|
* [Agda Standard Library](https://github.com/agda/agda-stdlib)
|
||||||
* [Cubical](https://github.com/Saizan/cubical-demo/)
|
* [Cubical](https://github.com/Saizan/cubical-demo/)
|
||||||
|
|
||||||
[^1]: At least version >= [`707ce6042b6a3bdb26521f3fe8dfe5d8a8470a43`](https://github.com/agda/agda/commit/707ce6042b6a3bdb26521f3fe8dfe5d8a8470a43)
|
[^1]: At least version >=
|
||||||
|
[`707ce6042`](https://github.com/agda/agda/commit/707ce6042b6a3bdb26521f3fe8dfe5d8a8470a43)
|
||||||
|
|
||||||
The version of the libraries that this depends on can be shown by
|
The version of the libraries that this depends on can be shown by
|
||||||
executing the following command in the root directory of the project:
|
executing the following command in the root directory of the project:
|
||||||
|
@ -31,13 +38,6 @@ versions of these libraries that are compatible with this
|
||||||
project. Since this information is only provided as documentation it
|
project. Since this information is only provided as documentation it
|
||||||
may also noot be up-to-date so beware.
|
may also noot be up-to-date so beware.
|
||||||
|
|
||||||
It's important to have the right version of these - but which one is the right
|
|
||||||
is in constant flux. It's most likely the newest one.
|
|
||||||
|
|
||||||
I've used git submodules to manage dependencies. Unfortunately Agda does not
|
|
||||||
allow specifying libraries to be used only as local dependencies. So the
|
|
||||||
submodules are mostly used for documentation.
|
|
||||||
|
|
||||||
You can let Agda know about these libraries by appending them to your global
|
You can let Agda know about these libraries by appending them to your global
|
||||||
libraries file like so: (NB!: There is a good reason this is not in a
|
libraries file like so: (NB!: There is a good reason this is not in a
|
||||||
makefile. So please verify that you know what you are doing, you probably
|
makefile. So please verify that you know what you are doing, you probably
|
||||||
|
|
3
doc/.gitignore
vendored
3
doc/.gitignore
vendored
|
@ -7,3 +7,6 @@
|
||||||
*.bbl
|
*.bbl
|
||||||
*.blg
|
*.blg
|
||||||
*.toc
|
*.toc
|
||||||
|
*.idx
|
||||||
|
*.ilg
|
||||||
|
*.ind
|
||||||
|
|
|
@ -48,3 +48,6 @@ cleanall:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
latexmk -c
|
latexmk -c
|
||||||
|
|
||||||
|
read: all
|
||||||
|
xdg-open $(PROJNAME).pdf
|
||||||
|
|
21
doc/abstract.tex
Normal file
21
doc/abstract.tex
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
\chapter*{Abstract}
|
||||||
|
The usual notion of propositional equality in intensional type-theory is
|
||||||
|
restrictive. For instance it does not admit functional extensionality or
|
||||||
|
univalence. This poses a severe limitation on both what is \emph{provable} and
|
||||||
|
the \emph{re-usability} of proofs. Recent developments have, however, resulted
|
||||||
|
in cubical type theory which permits a constructive proof of these two important
|
||||||
|
notions. The programming language Agda has been extended with capabilities for
|
||||||
|
working in such a cubical setting. This thesis will explore the usefulness of
|
||||||
|
this extension in the context of category theory.
|
||||||
|
|
||||||
|
The thesis will motivate and explain why propositional equality in cubical Agda
|
||||||
|
is more expressive than in standard Agda. Alternative approaches to Cubical Agda
|
||||||
|
will be presented and their pros and cons will be explained. It will emphasize
|
||||||
|
why it is useful to have a constructive interpretation of univalence. As an
|
||||||
|
example of this two formulations of monads will be presented: Namely monaeds in
|
||||||
|
the monoidal form an monads in the Kleisli form.
|
||||||
|
|
||||||
|
Finally the thesis will explain the challenges that a developer will face when
|
||||||
|
working with cubical Agda and give some techniques to overcome these
|
||||||
|
difficulties. It will also try to suggest how furhter work can help allievate
|
||||||
|
some of these challenges.
|
|
@ -40,11 +40,11 @@
|
||||||
\newcommand*{\subtitle}[1]{\gdef\@subtitle{#1}}
|
\newcommand*{\subtitle}[1]{\gdef\@subtitle{#1}}
|
||||||
%% FRONTMATTER
|
%% FRONTMATTER
|
||||||
\newcommand*{\myfrontmatter}{%
|
\newcommand*{\myfrontmatter}{%
|
||||||
\newgeometry{top=3cm, bottom=3cm,left=2.25 cm, right=2.25cm}
|
%% \newgeometry{top=3cm, bottom=3cm,left=2.25 cm, right=2.25cm}
|
||||||
\begingroup
|
\begingroup
|
||||||
\thispagestyle{empty}
|
\thispagestyle{empty}
|
||||||
{\Huge\@title}\\[.5cm]
|
{\Huge\@title}\\[.5cm]
|
||||||
{\Large A formalization of category theory in Cubical Agda}\\[2.5cm]
|
{\Large A formalization of category theory in Cubical Agda}\\[6cm]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=\linewidth,keepaspectratio]{isomorphism.png}
|
\includegraphics[width=\linewidth,keepaspectratio]{isomorphism.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
@ -66,7 +66,7 @@ Master's thesis in Computer Science
|
||||||
}
|
}
|
||||||
|
|
||||||
\renewcommand*{\maketitle}{%
|
\renewcommand*{\maketitle}{%
|
||||||
\begin{titlepage}
|
%% \begin{titlepage}
|
||||||
|
|
||||||
% TITLE PAGE
|
% TITLE PAGE
|
||||||
\newpage
|
\newpage
|
||||||
|
@ -131,5 +131,6 @@ Telephone +46 31 772 1000 \setlength{\parskip}{0.5cm}\\
|
||||||
%Printed by [Name of printing company]\\
|
%Printed by [Name of printing company]\\
|
||||||
Gothenburg, Sweden \the\year
|
Gothenburg, Sweden \the\year
|
||||||
|
|
||||||
\restoregeometry
|
%% \restoregeometry
|
||||||
\end{titlepage}}
|
%% \end{titlepage}
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,55 @@
|
||||||
\chapter{Conclusion}
|
\chapter{Conclusion}
|
||||||
|
This thesis highlighted some issues with the standard inductive definition of
|
||||||
|
propositional equality used in Agda. Functional extensionality and univalence
|
||||||
|
are examples of two propositions not admissible in Intensional Type Theory
|
||||||
|
(ITT). This has a big impact on what is provable and the reusability of proofs.
|
||||||
|
This issue is overcome with an extension to Agda's type system called Cubical
|
||||||
|
Agda. With Cubical Agda both functional extensionality and univalence are
|
||||||
|
admissible. Cubical Agda is more expressive, but there are certain issues that
|
||||||
|
arise that are not present in standard Agda. For one thing ITT and standard Agda
|
||||||
|
enjoys Uniqueness of Identity Proofs (UIP). This is not the case in Cubical
|
||||||
|
Agda. In stead there exists a hierarchy of types with increasing
|
||||||
|
\nomen{homotopical structure}. It turns out to be useful to built the
|
||||||
|
formalization with this hierarchy in mind as it can simplify proofs
|
||||||
|
considerably. Another issue one must overcome in Cubical Agda is when a type has
|
||||||
|
a field whose type depends on a previous field. In this case paths between such
|
||||||
|
types will be heterogeneous paths. This problem is related to Cubical Agda not
|
||||||
|
having the K-rule \TODO{Not mentioned anywhere in the report}. In practice it
|
||||||
|
turns out to be considerably more difficult to work heterogeneous paths than
|
||||||
|
with homogeneous paths. The thesis demonstrated some techniques to overcome
|
||||||
|
these difficulties, such as based path-induction.
|
||||||
|
|
||||||
\TODO{\ldots}
|
This thesis formalized some of the core concepts from category theory including;
|
||||||
|
categories, functors, products, exponentials, Cartesian closed categories,
|
||||||
|
natural transformations, the yoneda embedding, monads and more. Category theory
|
||||||
|
is an interesting case-study for the application of Cubical Agda for two reasons
|
||||||
|
in particular: Because category theory is the study of abstract algebra of
|
||||||
|
functions, meaning that functional extensionality is particularly relevant.
|
||||||
|
Another reason is that in category theory it is commonplace to identify
|
||||||
|
isomorphic structures and univalence allows for making this notion precise. This
|
||||||
|
thesis also demonstrated another technique that is common in category theory;
|
||||||
|
namely to define categories to prove properties of other structures.
|
||||||
|
Specifically a category was defined to demonstrate that any two product objects
|
||||||
|
in a category are isomorphic. Furthermore the thesis showed two formulations of
|
||||||
|
monads and proved that they indeed are equivalent: Namely monads in the
|
||||||
|
monoidal- and Kleisli- form. The monoidal formulation is more typical to
|
||||||
|
category theoretic formulations and the Kleisli formulation will be more
|
||||||
|
familiar to functional programmers. In the formulation we also saw how paths can
|
||||||
|
be used to extract functions. A path between two types induce an isomorphism
|
||||||
|
between the two types. This e.g. permits developers to write a monad instance
|
||||||
|
for a given type using the Kleisli formulation. By transporting along the path
|
||||||
|
between the monoidal- and Kleisli- formulation one can reuse all the operations
|
||||||
|
and results shown for monoidal- monads in the context of kleisli monads.
|
||||||
|
%%
|
||||||
|
%% problem with inductive type
|
||||||
|
%% overcome with cubical
|
||||||
|
%% the path type
|
||||||
|
%% homotopy levels
|
||||||
|
%% depdendent paths
|
||||||
|
%%
|
||||||
|
%% category theory
|
||||||
|
%% algebra of functions ~ funExt
|
||||||
|
%% identify isomorphic types ~ univalence
|
||||||
|
%% using categories to prove properties
|
||||||
|
%% computational properties
|
||||||
|
%% reusability, compositional
|
||||||
|
|
152
doc/cubical.tex
152
doc/cubical.tex
|
@ -1,17 +1,18 @@
|
||||||
\chapter{Cubical Agda}
|
\chapter{Cubical Agda}
|
||||||
\section{Propositional equality}
|
\section{Propositional equality}
|
||||||
In Agda judgmental equality is a feature of the type-system. It's a property of
|
Judgmental equality in Agda is a feature of the type-system. Its something that
|
||||||
types that can be checked by computational means. In the example from the
|
can be checked automatically by the type-checker: In the example from the
|
||||||
introduction $n + 0$ can be judged to be equal to $n$ simply by expanding the
|
introduction $n + 0$ can be judged to be equal to $n$ simply by expanding the
|
||||||
definition of $+$.
|
definition of $+$.
|
||||||
|
|
||||||
Propositional equality on the other hand is defined within the language itself.
|
On the other hand, propositional equality is something defined within the
|
||||||
Cubical Agda extends the underlying type system (\TODO{Cite someone smarter than
|
language itself. Propositional equality cannot be derived automatically. The
|
||||||
me with a good resource on this}) but introduces a data-type within the
|
normal definition of judgmental equality is an inductive data-type. Cubical Agda
|
||||||
languages.
|
discards this type in favor of a new primitives that has certain computational
|
||||||
|
properties exclusive to it.
|
||||||
|
|
||||||
Exceprts of the source code relevant to this section can be found in appendix
|
Exceprts of the source code relevant to this section can be found in appendix
|
||||||
\ref{sec:app-cubical}.
|
\S\ref{sec:app-cubical}.
|
||||||
|
|
||||||
\subsection{The equality type}
|
\subsection{The equality type}
|
||||||
The usual notion of judgmental equality says that given a type $A \tp \MCU$ and
|
The usual notion of judgmental equality says that given a type $A \tp \MCU$ and
|
||||||
|
@ -21,7 +22,8 @@ two points of $A$; $a_0, a_1 \tp A$ we can form the type:
|
||||||
a_0 \equiv a_1 \tp \MCU
|
a_0 \equiv a_1 \tp \MCU
|
||||||
\end{align}
|
\end{align}
|
||||||
%
|
%
|
||||||
In Agda this is defined as an inductive data-type with the single constructor:
|
In Agda this is defined as an inductive data-type with the single constructor
|
||||||
|
for any $a \tp A$:
|
||||||
%
|
%
|
||||||
\begin{align}
|
\begin{align}
|
||||||
\refl \tp a \equiv a
|
\refl \tp a \equiv a
|
||||||
|
@ -29,7 +31,7 @@ In Agda this is defined as an inductive data-type with the single constructor:
|
||||||
%
|
%
|
||||||
For any $a \tp A$.
|
For any $a \tp A$.
|
||||||
|
|
||||||
There also exist a related notion of \emph{heterogeneous} equality where allows
|
There also exist a related notion of \emph{heterogeneous} equality which allows
|
||||||
for equating points of different types. In this case given two types $A, B \tp
|
for equating points of different types. In this case given two types $A, B \tp
|
||||||
\MCU$ and two points $a \tp A$, $b \tp B$ we can construct the type:
|
\MCU$ and two points $a \tp A$, $b \tp B$ we can construct the type:
|
||||||
%
|
%
|
||||||
|
@ -37,7 +39,8 @@ for equating points of different types. In this case given two types $A, B \tp
|
||||||
a \cong b \tp \MCU
|
a \cong b \tp \MCU
|
||||||
\end{align}
|
\end{align}
|
||||||
%
|
%
|
||||||
This is likewise defined as an inductive data-type with a single constructors:
|
This is likewise defined as an inductive data-type with a single constructors
|
||||||
|
for any $a \tp A$:
|
||||||
%
|
%
|
||||||
\begin{align}
|
\begin{align}
|
||||||
\refl \tp a \cong a
|
\refl \tp a \cong a
|
||||||
|
@ -47,11 +50,11 @@ In Cubical Agda these two notions are paralleled with homogeneous- and
|
||||||
heterogeneous paths respectively.
|
heterogeneous paths respectively.
|
||||||
%
|
%
|
||||||
\subsection{The path type}
|
\subsection{The path type}
|
||||||
In Cubical Agda judgmental equality is encapsulated with the type:
|
Judgmental equality in Cubical Agda is encapsulated with the type:
|
||||||
%
|
%
|
||||||
$$
|
\begin{equation}
|
||||||
\Path \tp (P \tp I → \MCU) → P\ 0 → P\ 1 → \MCU
|
\Path \tp (P \tp I → \MCU) → P\ 0 → P\ 1 → \MCU
|
||||||
$$
|
\end{equation}
|
||||||
%
|
%
|
||||||
$I$ is a special data-type (\TODO{that also has special computational properties
|
$I$ is a special data-type (\TODO{that also has special computational properties
|
||||||
AFAIK}) called the index set. $I$ can be thought of simply as the interval on
|
AFAIK}) called the index set. $I$ can be thought of simply as the interval on
|
||||||
|
@ -62,11 +65,11 @@ left-endpoint and $P\ 1$ as the type at the right-endpoint. The type is called
|
||||||
$\Path$ because it is connected with paths in homotopy theory. The intuition
|
$\Path$ because it is connected with paths in homotopy theory. The intuition
|
||||||
behind this is that $\Path$ describes paths in $\MCU$ -- i.e. between types. For
|
behind this is that $\Path$ describes paths in $\MCU$ -- i.e. between types. For
|
||||||
a path $p$ for the point $p\ i$ the index $i$ describes how far along the path
|
a path $p$ for the point $p\ i$ the index $i$ describes how far along the path
|
||||||
one has moved. An inhabitant of $\Path\ P\ a_0\ a_1$ is a (dependent-)
|
one has moved. An inhabitant of $\Path\ P\ a_0\ a_1$ is a (dependent-) function,
|
||||||
function, $p$, from the index-space to the path-space:
|
$p$, from the index-space to the path-space:
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
p \tp I \to P\ i
|
p \tp \prod_{i \tp I} P\ i
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
Which must satisfy being judgmentally equal to $a_0$ (respectively $a_1$) at the
|
Which must satisfy being judgmentally equal to $a_0$ (respectively $a_1$) at the
|
||||||
|
@ -77,16 +80,16 @@ endpoints. I.e.:
|
||||||
p\ 1 & = a_1
|
p\ 1 & = a_1
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
The notion of ``homogeneous equalities'' can be recovered by not letting the
|
The notion of ``homogeneous equalities'' is recovered when $P$ does not depend
|
||||||
path-space $P$ depend on it's argument:
|
on its argument:
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
a_0 \equiv a_1 \defeq \Path\ (\lambda i \to A)\ a_0\ a_1
|
a_0 \equiv a_1 \defeq \Path\ (\lambda i \to A)\ a_0\ a_1
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
For $A \tp \MCU$, $a_0, a_1 \tp A$. I will generally prefer to use the notation
|
For $A \tp \MCU$, $a_0, a_1 \tp A$. I will generally prefer to use the notation
|
||||||
$a_0 \equiv a_1$ when talking about non-dependent paths and use the notation
|
$a \equiv b$ when talking about non-dependent paths and use the notation
|
||||||
$\Path\ (\lambda i \to A)\ a_0\ a_1$ when the path-space is of particular
|
$\Path\ (\lambda i \to P\ i)\ a\ b$ when the path-space is of particular
|
||||||
interest.
|
interest.
|
||||||
|
|
||||||
With this definition we can also recover reflexivity. That is, for any $A \tp
|
With this definition we can also recover reflexivity. That is, for any $A \tp
|
||||||
|
@ -99,23 +102,58 @@ With this definition we can also recover reflexivity. That is, for any $A \tp
|
||||||
\end{aligned}
|
\end{aligned}
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
Or, in other terms; reflexivity is the path in $A$ that is $a$ at the left
|
Here the path-space is $P \defeq \lambda i \to A$ and it satsifies $P\ i = A$
|
||||||
endpoint as well as at the right endpoint. It is inhabited by the path which
|
definitionally. So to inhabit it, is to give a path $I \to A$ which is
|
||||||
stays constantly at $a$ at any index $i$.
|
judgmentally $a$ at either endpoint. This is satisfied by the constant path;
|
||||||
|
i.e. the path that stays at $a$ at any index $i$.
|
||||||
|
|
||||||
Paths have some other important properties, but they are not the focus of this
|
It is also surpisingly easy to show functional extensionality with which we can
|
||||||
thesis. \TODO{Refer the reader somewhere for more info.}
|
construct a path between $f$ and $g$ -- the function defined in the introduction
|
||||||
|
(section \S\ref{sec:functional-extensionality}).
|
||||||
|
%% module _ {ℓa ℓb} {A : Set ℓa} {B : A → Set ℓb} where
|
||||||
|
%% funExt : {f g : (x : A) → B x} → ((x : A) → f x ≡ g x) → f ≡ g
|
||||||
|
Functional extensionality is the proposition, given a type $A \tp \MCU$, a
|
||||||
|
family of types $B \tp A \to \MCU$ and functions $f, g \tp \prod_{a \tp A}
|
||||||
|
B\ a$:
|
||||||
%
|
%
|
||||||
|
\begin{equation}
|
||||||
|
\label{eq:funExt}
|
||||||
|
\funExt \tp \prod_{a \tp A} f\ a \equiv g\ a \to f \equiv g
|
||||||
|
\end{equation}
|
||||||
|
%
|
||||||
|
%% p = λ i a → p a i
|
||||||
|
So given $p \tp \prod_{a \tp A} f\ a \equiv g\ a$ we must give a path $f \equiv
|
||||||
|
g$. That is a function $I \to \prod_{a \tp A} B\ a$. So let $i \tp I$ be given.
|
||||||
|
We must now give an expression $\phi \tp \prod_{a \tp A} B\ a$ satisfying
|
||||||
|
$\phi\ 0 \equiv f\ a$ and $\phi\ 1 \equiv g\ a$. This neccesitates that the
|
||||||
|
expression must be a lambda-abstraction, so let $a \tp A$ be given. Now we can
|
||||||
|
apply $a$ to $p$ and get the path $p\ a \tp f\ a \equiv g\ a$. And this exactly
|
||||||
|
satisfied the conditions for $\phi$. In conclustion \ref{eq:funExt} is inhabited
|
||||||
|
by the term:
|
||||||
|
%
|
||||||
|
\begin{equation}
|
||||||
|
\label{eq:funExt}
|
||||||
|
\funExt\ p \defeq λ i\ a → p\ a\ i
|
||||||
|
\end{equation}
|
||||||
|
%
|
||||||
|
With this we can now prove the desired equality $f \equiv g$ from section
|
||||||
|
\S\ref{sec:functional-extensionality}:
|
||||||
|
%
|
||||||
|
\begin{align*}
|
||||||
|
p & \tp f \equiv g \\
|
||||||
|
p & \defeq \funExt\ \lambda n \to \refl
|
||||||
|
\end{align*}
|
||||||
|
%
|
||||||
|
Paths have some other important properties, but they are not the focus of
|
||||||
|
this thesis. \TODO{Refer the reader somewhere for more info.}
|
||||||
\section{Homotopy levels}
|
\section{Homotopy levels}
|
||||||
In ITT all equality proofs are identical (in a closed context). This means that,
|
In ITT all equality proofs are identical (in a closed context). This means that,
|
||||||
in some sense, any two inhabitants of $a \equiv b$ are ``equally good'' -- they
|
in some sense, any two inhabitants of $a \equiv b$ are ``equally good'' -- they
|
||||||
don't have any interesting structure. This is referred to as uniqueness of
|
do not have any interesting structure. This is referred to as Uniqueness of
|
||||||
identity proofs. Unfortunately this is orthogonal to univalence that only makes
|
Identity Proofs (UIP). Unfortunately it is not possible to have a type-theory
|
||||||
sense in the absence of UIP.
|
with both univalence and UIP. In stead we have a hierarchy of types with an
|
||||||
|
increasing amount of homotopic structure. At the bottom of this hierarchy we
|
||||||
In homotopy type theory we have a hierarchy of types based on their ``internal
|
have the set of contractible types:
|
||||||
structure''. At the bottom of this hierarchy we have the set of contractible
|
|
||||||
types:
|
|
||||||
%
|
%
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\begin{aligned}
|
\begin{aligned}
|
||||||
|
@ -128,8 +166,14 @@ types:
|
||||||
%
|
%
|
||||||
The first component of $\isContr\ A$ is called ``the center of contraction''.
|
The first component of $\isContr\ A$ is called ``the center of contraction''.
|
||||||
Under the propositions-as-types interpretation of type-theory $\isContr\ A$ can
|
Under the propositions-as-types interpretation of type-theory $\isContr\ A$ can
|
||||||
be thought of as ``the true proposition $A$''. It is a theorem that if a type is
|
be thought of as ``the true proposition $A$''. And indeed $\top$ is
|
||||||
contractible, then it is isomorphic to the unit-type $\top$.
|
contractible:
|
||||||
|
\begin{equation*}
|
||||||
|
\var{tt} , \lambda x \to \refl \tp \isContr\ \top
|
||||||
|
\end{equation*}
|
||||||
|
%
|
||||||
|
It is a theorem that if a type is contractible, then it is isomorphic to the
|
||||||
|
unit-type.
|
||||||
|
|
||||||
The next step in the hierarchy is the set of mere propositions:
|
The next step in the hierarchy is the set of mere propositions:
|
||||||
%
|
%
|
||||||
|
@ -140,10 +184,18 @@ The next step in the hierarchy is the set of mere propositions:
|
||||||
\end{aligned}
|
\end{aligned}
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
$\isProp\ A$ can be thought of as the set of true and false propositions. It is
|
$\isProp\ A$ can be thought of as the set of true and false propositions. And
|
||||||
a result that if a mere proposition $A$ is inhabited, then so is it
|
indeed both $\top$ and $\bot$ are propositions:
|
||||||
contractible. If it is not inhabited it is equivalent to the empty-type (or
|
%
|
||||||
false proposition).\TODO{Cite!!}
|
\begin{align*}
|
||||||
|
λ \var{tt}\ \var{tt} → refl & \tp \isProp\ ⊤ \\
|
||||||
|
λ\varnothing\ \varnothing & \tp \isProp\ ⊥
|
||||||
|
\end{align*}
|
||||||
|
%
|
||||||
|
$\varnothing$ is used here to denote an impossible pattern. It is a theorem that
|
||||||
|
if a mere proposition $A$ is inhabited, then so is it contractible. If it is not
|
||||||
|
inhabited it is equivalent to the empty-type (or false
|
||||||
|
proposition).\TODO{Cite!!}
|
||||||
|
|
||||||
I will refer to a type $A \tp \MCU$ as a \emph{mere} proposition if I want to
|
I will refer to a type $A \tp \MCU$ as a \emph{mere} proposition if I want to
|
||||||
stress that we have $\isProp\ A$.
|
stress that we have $\isProp\ A$.
|
||||||
|
@ -157,12 +209,15 @@ Then comes the set of homotopical sets:
|
||||||
\end{aligned}
|
\end{aligned}
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
At this point it should be noted that the term ``set'' is somewhat conflated;
|
I will not give an example of a set at this point. It turns out that proving
|
||||||
there is the notion of sets from set-theory, in Agda types are denoted
|
e.g. $\isProp\ \bN$ is not so straight-forward (see \cite[\S3.1.4]{hott-2013}).
|
||||||
\texttt{Set}. I will use it consistently to refer to a type $A$ as a set exactly
|
There will be examples of sets later in this report. At this point it should be
|
||||||
if $\isSet\ A$ is inhabited.
|
noted that the term ``set'' is somewhat conflated; there is the notion of sets
|
||||||
|
from set-theory, in Agda types are denoted \texttt{Set}. I will use it
|
||||||
|
consistently to refer to a type $A$ as a set exactly if $\isSet\ A$ is a
|
||||||
|
proposition.
|
||||||
|
|
||||||
The next step in the hierarchy is, as the reader might've guessed, the type:
|
As the reader may have guessed the next step in the hierarchy is the type:
|
||||||
%
|
%
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\begin{aligned}
|
\begin{aligned}
|
||||||
|
@ -219,10 +274,13 @@ $$
|
||||||
%
|
%
|
||||||
We have the function:
|
We have the function:
|
||||||
%
|
%
|
||||||
$$
|
\begin{equation}
|
||||||
\pathJ\ P\ p \tp \prod_{a' \tp A} \prod_{p \tp a ≡ a'} P\ a\ p
|
\pathJ\ P\ p \tp \prod_{a' \tp A} \prod_{p \tp a ≡ a'} P\ a\ p
|
||||||
$$
|
\end{equation}
|
||||||
%
|
%
|
||||||
|
I will not give an example of using $\pathJ$ here. An application can be found
|
||||||
|
later in \ref{eq:pathJ-example}.
|
||||||
|
|
||||||
\subsection{Paths over propositions}
|
\subsection{Paths over propositions}
|
||||||
\label{sec:lemPropF}
|
\label{sec:lemPropF}
|
||||||
Another very useful combinator is $\lemPropF$:
|
Another very useful combinator is $\lemPropF$:
|
||||||
|
@ -277,8 +335,8 @@ $$
|
||||||
\subsection{Pairs over propositions}
|
\subsection{Pairs over propositions}
|
||||||
\label{sec:propSig}
|
\label{sec:propSig}
|
||||||
%
|
%
|
||||||
$\sum$-types preserve propositionality whenever it's first component is a
|
$\sum$-types preserve propositionality whenever its first component is a
|
||||||
proposition, and it's second component is a proposition for all points of in the
|
proposition, and its second component is a proposition for all points of in the
|
||||||
left type.
|
left type.
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
|
|
|
@ -7,9 +7,9 @@ to very complicated goals. One technique for alleviating this was to prove that
|
||||||
certain types are mere propositions.
|
certain types are mere propositions.
|
||||||
|
|
||||||
\subsection{Computational properties}
|
\subsection{Computational properties}
|
||||||
Another aspect (\TODO{That I actually didn't highlight very well in the previous
|
Another aspect (\TODO{That I actually did not highlight very well in the
|
||||||
chapter}) is the computational nature of paths. Say we have formalized this
|
previous chapter}) is the computational nature of paths. Say we have
|
||||||
common result about monads:
|
formalized this common result about monads:
|
||||||
|
|
||||||
\TODO{Some equation\ldots}
|
\TODO{Some equation\ldots}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ disparate areas: The category-theoretic study of monads; and monads as in
|
||||||
functional programming. Univalence thus allows one to reuse proofs. You could
|
functional programming. Univalence thus allows one to reuse proofs. You could
|
||||||
say that univalence gives the developer two proofs for the price of one.
|
say that univalence gives the developer two proofs for the price of one.
|
||||||
|
|
||||||
The introduction (section \ref{sec:context}) mentioned an often
|
The introduction (section \S\ref{sec:context}) mentioned an often
|
||||||
employed-technique for enabling extensional equalities is to use the
|
employed-technique for enabling extensional equalities is to use the
|
||||||
setoid-interpretation. Nowhere in this formalization has this been necessary,
|
setoid-interpretation. Nowhere in this formalization has this been necessary,
|
||||||
$\Path$ has been used globally in the project as propositional equality. One
|
$\Path$ has been used globally in the project as propositional equality. One
|
||||||
|
|
|
@ -53,9 +53,15 @@ given type.
|
||||||
For the rest of this chapter I will present some of these results. For didactic
|
For the rest of this chapter I will present some of these results. For didactic
|
||||||
reasons no source-code has been included in this chapter. To see the formal
|
reasons no source-code has been included in this chapter. To see the formal
|
||||||
definitions excerpts of the implementation have been included in appendix
|
definitions excerpts of the implementation have been included in appendix
|
||||||
\ref{ch:app-sources}.
|
\S\ref{ch:app-sources}:
|
||||||
|
Appendix
|
||||||
|
\S\ref{sec:app-categories} corresponds to section \S\ref{sec:categories},
|
||||||
|
appendix \S\ref{sec:app-products} to section \S\ref{sec:products}
|
||||||
|
and appendix \S\ref{sec:app-monads} to section \S\ref{sec:monads}.
|
||||||
|
|
||||||
|
|
||||||
\section{Categories}
|
\section{Categories}
|
||||||
|
\label{sec:categories}
|
||||||
The data for a category consist of a type for the sort of objects; a type for
|
The data for a category consist of a type for the sort of objects; a type for
|
||||||
the sort of arrows; an identity arrow and a composition operation for arrows.
|
the sort of arrows; an identity arrow and a composition operation for arrows.
|
||||||
Another record encapsulates some laws about this data: associativity of
|
Another record encapsulates some laws about this data: associativity of
|
||||||
|
@ -64,7 +70,7 @@ constituents of a category and can be found in typical mathematical expositions
|
||||||
on the topic. We, however, impose one further requirement on what it means to be
|
on the topic. We, however, impose one further requirement on what it means to be
|
||||||
a category, namely that the type of arrows form a set.
|
a category, namely that the type of arrows form a set.
|
||||||
|
|
||||||
Such categories are called \nomen{1-categories}. It's possible to relax this
|
Such categories are called \nomen{1-categories}. It is possible to relax this
|
||||||
requirement. This would lead to the notion of higher categories (\cite[p.
|
requirement. This would lead to the notion of higher categories (\cite[p.
|
||||||
307]{hott-2013}). For the purpose of this project, however, this report will
|
307]{hott-2013}). For the purpose of this project, however, this report will
|
||||||
restrict itself to 1-categories. Making based on higher categories would be a
|
restrict itself to 1-categories. Making based on higher categories would be a
|
||||||
|
@ -82,15 +88,15 @@ definitions: If we let $p$ be a witness to the identity law, which formally is:
|
||||||
\id \comp f \equiv f \x f \comp \id \equiv f
|
\id \comp f \equiv f \x f \comp \id \equiv f
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
Then we can construct the identity isomorphism $\var{idIso} \tp \identity,
|
Then we can construct the identity isomorphism $\idIso \tp \identity,
|
||||||
\identity, p \tp A \approxeq A$ for any object $A$. Here $\approxeq$ denotes
|
\identity, p \tp A \approxeq A$ for any object $A$. Here $\approxeq$ denotes
|
||||||
isomorphism on objects (whereas $\cong$ denotes isomorphism of types). This will
|
isomorphism on objects (whereas $\cong$ denotes isomorphism of types). This will
|
||||||
be elaborated further on in sections \ref{sec:equiv} and \ref{sec:univalence}.
|
be elaborated further on in sections \S\ref{sec:equiv} and
|
||||||
Moreover, due to substitution for paths we can construct an isomorphism from
|
\S\ref{sec:univalence}. Moreover, due to substitution for paths we can construct
|
||||||
\emph{any} path:
|
an isomorphism from \emph{any} path:
|
||||||
%
|
%
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\var{idToIso} \tp A ≡ B → A ≊ B
|
\idToIso \tp A ≡ B → A ≊ B
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
The univalence criterion for categories states that this map must be an
|
The univalence criterion for categories states that this map must be an
|
||||||
|
@ -106,14 +112,14 @@ Note that \ref{eq:cat-univ} is \emph{not} the same as:
|
||||||
%
|
%
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\label{eq:cat-univalence}
|
\label{eq:cat-univalence}
|
||||||
\tag{Univalence, category}
|
%% \tag{Univalence, category}
|
||||||
(A \equiv B) \simeq (A \approxeq B)
|
(A \equiv B) \simeq (A \approxeq B)
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
However the two are logically equivalent: One can construct the latter from the
|
However the two are logically equivalent: One can construct the latter from the
|
||||||
former simply by ``forgetting'' that $\idToIso$ plays the role of the
|
former simply by ``forgetting'' that $\idToIso$ plays the role of the
|
||||||
equivalence. The other direction is more involved and will be discussed in
|
equivalence. The other direction is more involved and will be discussed in
|
||||||
section \ref{sec:univalence}.
|
section \S\ref{sec:univalence}.
|
||||||
|
|
||||||
In summary, the definition of a category is the following collection of data:
|
In summary, the definition of a category is the following collection of data:
|
||||||
%
|
%
|
||||||
|
@ -127,14 +133,14 @@ In summary, the definition of a category is the following collection of data:
|
||||||
And laws:
|
And laws:
|
||||||
%
|
%
|
||||||
\begin{align}
|
\begin{align}
|
||||||
\tag{associativity}
|
%% \tag{associativity}
|
||||||
h \lll (g \lll f) ≡ (h \lll g) \lll f \\
|
h \lll (g \lll f) ≡ (h \lll g) \lll f \\
|
||||||
\tag{identity}
|
%% \tag{identity}
|
||||||
\identity \lll f ≡ f \x
|
\identity \lll f ≡ f \x
|
||||||
f \lll \identity ≡ f
|
f \lll \identity ≡ f
|
||||||
\\
|
\\
|
||||||
\label{eq:arrows-are-sets}
|
\label{eq:arrows-are-sets}
|
||||||
\tag{arrows are sets}
|
%% \tag{arrows are sets}
|
||||||
\isSet\ (\Arrow\ A\ B)\\
|
\isSet\ (\Arrow\ A\ B)\\
|
||||||
\tag{\ref{eq:cat-univ}}
|
\tag{\ref{eq:cat-univ}}
|
||||||
\isEquiv\ (A \equiv B)\ (A \approxeq B)\ \idToIso
|
\isEquiv\ (A \equiv B)\ (A \approxeq B)\ \idToIso
|
||||||
|
@ -159,12 +165,12 @@ Proving that \ref{eq:identity} is a mere proposition:
|
||||||
%
|
%
|
||||||
There are multiple ways to prove this. Perhaps one of the more intuitive proofs
|
There are multiple ways to prove this. Perhaps one of the more intuitive proofs
|
||||||
is by way of the `combinators' $\propPi$ and $\propSig$ presented in sections
|
is by way of the `combinators' $\propPi$ and $\propSig$ presented in sections
|
||||||
\ref{sec:propPi} and \ref{sec:propSig}:
|
\S\ref{sec:propPi} and \S\ref{sec:propSig}:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\var{propPi} & \tp \left(\prod_{a \tp A} \isProp\ (P\ a)\right) \to \isProp\ \left(\prod_{a \tp A} P\ a\right)
|
\propPi & \tp \left(\prod_{a \tp A} \isProp\ (P\ a)\right) \to \isProp\ \left(\prod_{a \tp A} P\ a\right)
|
||||||
\\
|
\\
|
||||||
\var{propSig} & \tp \isProp\ A \to \left(\prod_{a \tp A} \isProp\ (P\ a)\right) \to \isProp\ \left(\sum_{a \tp A} P\ a\right)
|
\propSig & \tp \isProp\ A \to \left(\prod_{a \tp A} \isProp\ (P\ a)\right) \to \isProp\ \left(\sum_{a \tp A} P\ a\right)
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
So the proof goes like this: We `eliminate' the 3 function abstractions by
|
So the proof goes like this: We `eliminate' the 3 function abstractions by
|
||||||
|
@ -180,11 +186,11 @@ us the two obligations: $\isProp\ (\id \comp f \equiv f)$ and $\isProp\ (f \comp
|
||||||
set.
|
set.
|
||||||
|
|
||||||
This example illustrates nicely how we can use these combinators to reason about
|
This example illustrates nicely how we can use these combinators to reason about
|
||||||
`canonical' types like $\sum$ and $\prod$. Similar combinators can be defined
|
`canonical' types like $\sum$ and $\prod$. Similar combinators can be defined at
|
||||||
at the other homotopic levels. These combinators are however not applicable in
|
the other homotopic levels. These combinators are however not applicable in
|
||||||
situations where we want to reason about other types - e.g. types we've defined
|
situations where we want to reason about other types - e.g. types we have
|
||||||
ourselves. For instance, after we've proven that all the projections of
|
defined ourselves. For instance, after we have proven that all the projections
|
||||||
pre-categories are propositions, then we would like to bundle this up to show
|
of pre-categories are propositions, then we would like to bundle this up to show
|
||||||
that the type of pre-categories is also a proposition. Formally:
|
that the type of pre-categories is also a proposition. Formally:
|
||||||
%
|
%
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
|
@ -196,14 +202,13 @@ Where The definition of $\IsPreCategory$ is the triple:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\var{isAssociative} & \tp \var{IsAssociative}\\
|
\var{isAssociative} & \tp \var{IsAssociative}\\
|
||||||
\var{isIdentity} & \tp \var{IsIdentity}\\
|
\isIdentity & \tp \var{IsIdentity}\\
|
||||||
\var{arrowsAreSets} & \tp \var{ArrowsAreSets}
|
\var{arrowsAreSets} & \tp \var{ArrowsAreSets}
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
Each corresponding to the first three laws for categories. Note that since
|
Each corresponding to the first three laws for categories. Note that since
|
||||||
$\IsPreCategory$ is not formulated with a chain of sigma-types we wont have any
|
$\IsPreCategory$ is not formulated with a chain of sigma-types we wont have any
|
||||||
combinators available to help us here. In stead we'll have to use the path-type
|
combinators available to help us here. In stead the paths must be used directly.
|
||||||
directly.
|
|
||||||
|
|
||||||
\ref{eq:propIsPreCategory} is judgmentally the same as
|
\ref{eq:propIsPreCategory} is judgmentally the same as
|
||||||
%
|
%
|
||||||
|
@ -239,21 +244,21 @@ $i$ becomes the triple:
|
||||||
\begin{aligned}
|
\begin{aligned}
|
||||||
& \var{propIsAssociative} && a.\var{isAssociative}\
|
& \var{propIsAssociative} && a.\var{isAssociative}\
|
||||||
&& b.\var{isAssociative} && i \\
|
&& b.\var{isAssociative} && i \\
|
||||||
& \var{propIsIdentity} && a.\var{isIdentity}\
|
& \propIsIdentity && a.\isIdentity\
|
||||||
&& b.\var{isIdentity} && i \\
|
&& b.\isIdentity && i \\
|
||||||
& \var{propArrowsAreSets} && a.\var{arrowsAreSets}\
|
& \var{propArrowsAreSets} && a.\var{arrowsAreSets}\
|
||||||
&& b.\var{arrowsAreSets} && i
|
&& b.\var{arrowsAreSets} && i
|
||||||
\end{aligned}
|
\end{aligned}
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
I've found this to be a general pattern when proving things in homotopy type
|
I have found this to be a general pattern when proving things in homotopy type
|
||||||
theory, namely that you have to wrap and unwrap equalities at different levels.
|
theory, namely that you have to wrap and unwrap equalities at different levels.
|
||||||
It is worth noting that proving this theorem with the regular inductive equality
|
It is worth noting that proving this theorem with the regular inductive equality
|
||||||
type would already not be possible, since we at least need extensionality (the
|
type would already not be possible, since we at least need extensionality (the
|
||||||
projections are all $\prod$-types). Assuming we had functional extensionality
|
projections are all $\prod$-types). Assuming we had functional extensionality
|
||||||
available to us as an axiom, we would use functional extensionality (in
|
available to us as an axiom, we would use functional extensionality (in
|
||||||
reverse?) to retrieve the equalities in $a$ and $b$, pattern-match on them to
|
reverse?) to retrieve the equalities in $a$ and $b$, pattern-match on them to
|
||||||
see that they are both $\var{refl}$ and then close the proof with $\var{refl}$.
|
see that they are both $\refl$ and then close the proof with $\refl$.
|
||||||
Of course this theorem is not so interesting in the setting of ITT since we know
|
Of course this theorem is not so interesting in the setting of ITT since we know
|
||||||
a priori that equality proofs are unique.
|
a priori that equality proofs are unique.
|
||||||
|
|
||||||
|
@ -279,16 +284,16 @@ we have shown, $\IsPreCategory$ is a proposition. However, even though
|
||||||
$\Univalent$ is also a proposition, we cannot use this directly to show the
|
$\Univalent$ is also a proposition, we cannot use this directly to show the
|
||||||
latter. This is because $\isProp$ talks about non-dependent paths. So we need to
|
latter. This is because $\isProp$ talks about non-dependent paths. So we need to
|
||||||
'promote' the result that univalence is a proposition to a heterogeneous path.
|
'promote' the result that univalence is a proposition to a heterogeneous path.
|
||||||
To this end we can use $\lemPropF$, which was introduced in \ref{sec:lemPropF}.
|
To this end we can use $\lemPropF$, which was introduced in \S\ref{sec:lemPropF}.
|
||||||
|
|
||||||
In this case $A = \var{IsIdentity}\ \identity$ and $B = \var{Univalent}$. We've
|
In this case $A = \var{IsIdentity}\ \identity$ and $B = \Univalent$. We have
|
||||||
shown that being a category is a proposition, a result that holds for any choice
|
shown that being a category is a proposition, a result that holds for any choice
|
||||||
of identity proof. Finally we must provide a proof that the identity proofs at
|
of identity proof. Finally we must provide a proof that the identity proofs at
|
||||||
$a$ and $b$ are indeed the same, this we can extract from $p$ by applying
|
$a$ and $b$ are indeed the same, this we can extract from $p$ by applying
|
||||||
congruence of paths:
|
congruence of paths:
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
\congruence\ \var{isIdentity}\ p
|
\congruence\ \isIdentity\ p
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
And this finishes the proof that being-a-category is a mere proposition
|
And this finishes the proof that being-a-category is a mere proposition
|
||||||
|
@ -361,7 +366,7 @@ $$
|
||||||
\fiber\ f\ b \defeq \sum_{a \tp A} \left( b \equiv f\ a \right)
|
\fiber\ f\ b \defeq \sum_{a \tp A} \left( b \equiv f\ a \right)
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
I give it's definition here mainly for completeness, because as I stated we can
|
I give its definition here mainly for completeness, because as I stated we can
|
||||||
move away from this specific instantiation and think about it more abstractly
|
move away from this specific instantiation and think about it more abstractly
|
||||||
once we have shown that this definition actually works as an equivalence.
|
once we have shown that this definition actually works as an equivalence.
|
||||||
|
|
||||||
|
@ -414,7 +419,7 @@ $$
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
That is, we must demonstrate that there is an isomorphism (on types) between
|
That is, we must demonstrate that there is an isomorphism (on types) between
|
||||||
equalities and isomorphisms (on arrows). It's worthwhile to dwell on this for a
|
equalities and isomorphisms (on arrows). It is worthwhile to dwell on this for a
|
||||||
few seconds. This type looks very similar to univalence for types and is
|
few seconds. This type looks very similar to univalence for types and is
|
||||||
therefore perhaps a bit more intuitive to grasp the implications of. Of course
|
therefore perhaps a bit more intuitive to grasp the implications of. Of course
|
||||||
univalence for types (which is a proposition -- i.e. provable) does not imply
|
univalence for types (which is a proposition -- i.e. provable) does not imply
|
||||||
|
@ -441,8 +446,8 @@ an isomorphism $A \approxeq B$ in some category $\bC$ be given. Name the
|
||||||
isomorphism $\iota \tp A \to B$ and its inverse $\inv{\iota} \tp B \to A$.
|
isomorphism $\iota \tp A \to B$ and its inverse $\inv{\iota} \tp B \to A$.
|
||||||
Since $\bC$ is a category (and therefore univalent) the isomorphism induces a
|
Since $\bC$ is a category (and therefore univalent) the isomorphism induces a
|
||||||
path $p \tp A \equiv B$. From this equality we can get two further paths:
|
path $p \tp A \equiv B$. From this equality we can get two further paths:
|
||||||
$p_{\var{dom}} \tp \var{Arrow}\ A\ X \equiv \var{Arrow}\ B\ X$ and
|
$p_{\var{dom}} \tp \Arrow\ A\ X \equiv \Arrow\ B\ X$ and
|
||||||
$p_{\var{cod}} \tp \var{Arrow}\ X\ A \equiv \var{Arrow}\ X\ B$. We
|
$p_{\var{cod}} \tp \Arrow\ X\ A \equiv \Arrow\ X\ B$. We
|
||||||
then have the following two theorems:
|
then have the following two theorems:
|
||||||
%
|
%
|
||||||
\begin{align}
|
\begin{align}
|
||||||
|
@ -459,58 +464,68 @@ I will give the proof of the first theorem here, the second one is analogous.
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\var{coe}\ p_{\var{dom}}\ f
|
\var{coe}\ p_{\var{dom}}\ f
|
||||||
& \equiv f \lll \inv{(\var{idToIso}\ p)} && \text{lemma} \\
|
& \equiv f \lll \inv{(\idToIso\ p)} && \text{lemma} \\
|
||||||
& \equiv f \lll \inv{\iota}
|
& \equiv f \lll \inv{\iota}
|
||||||
&& \text{$\var{idToIso}$ and $\var{isoToId}$ are inverses}\\
|
&& \text{$\idToIso$ and $\isoToId$ are inverses}\\
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
In the second step we use the fact that $p$ is constructed from the isomorphism
|
In the second step we use the fact that $p$ is constructed from the isomorphism
|
||||||
$\iota$ -- $\inv{(\var{idToIso}\ p)}$ denotes the map $B \to A$ induced by the
|
$\iota$ -- $\inv{(\idToIso\ p)}$ denotes the map $B \to A$ induced by the
|
||||||
isomorphism $\var{idToIso}\ p \tp A \cong B$. The helper-lemma is similar to
|
isomorphism $\idToIso\ p \tp A \cong B$. The helper-lemma is similar to
|
||||||
what we're trying to prove but talks about paths rather than isomorphisms:
|
what we are trying to prove but talks about paths rather than isomorphisms:
|
||||||
%
|
%
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\label{eq:coeDomIso}
|
\label{eq:coeDomIso}
|
||||||
\prod_{f \tp \var{Arrow}\ A\ B} \prod_{p \tp A \equiv B}
|
\prod_{f \tp \Arrow\ A\ B} \prod_{p \tp A \equiv B}
|
||||||
\var{coe}\ p_{\var{dom}}\ f \equiv f \lll \inv{(\var{idToIso}\ p)}
|
\var{coe}\ p_{\var{dom}}\ f \equiv f \lll \inv{(\idToIso\ p)}
|
||||||
\end{equation}
|
\end{equation}
|
||||||
%
|
%
|
||||||
Again $p_{\var{dom}}$ denotes the path $\var{Arrow}\ A\ X \equiv
|
Again $p_{\var{dom}}$ denotes the path $\Arrow\ A\ X \equiv
|
||||||
\var{Arrow}\ B\ X$ induced by $p$. To prove this statement I let $f$ and $p$
|
\Arrow\ B\ X$ induced by $p$. To prove this statement I let $f$ and $p$ be
|
||||||
be given and then invoke based-path-induction. The induction will be based at $A
|
given and then invoke based-path-induction. The induction will be based at $A
|
||||||
\tp \var{Object}$, so let $\widetilde{B} \tp \Object$ and $\widetilde{p} \tp
|
\tp \Object$ Let $\widetilde{B} \tp \Object$ and $\widetilde{p} \tp A
|
||||||
A \equiv \widetilde{B}$ be given. The family that we perform induction over will
|
\equiv \widetilde{B}$ be given. The family that we perform induction over will
|
||||||
be:
|
be:
|
||||||
%
|
%
|
||||||
$$
|
\begin{align}
|
||||||
|
D\ \widetilde{B}\ \widetilde{p} \defeq
|
||||||
|
%% \prod_{\widetilde{B} \tp \Object}
|
||||||
|
%% \prod_{\widetilde{p} \tp A \equiv \widetilde{B}}
|
||||||
\var{coe}\ {\widetilde{p}}^*\ f
|
\var{coe}\ {\widetilde{p}}^*\ f
|
||||||
\equiv
|
\equiv
|
||||||
f \lll \inv{(\var{idToIso}\ \widetilde{p})}
|
f \lll \inv{(\idToIso\ \widetilde{p})}
|
||||||
$$
|
\end{align}
|
||||||
The base-case therefore becomes:
|
The base-case therefore becomes
|
||||||
|
$d \tp \var{coe}\ \refl^*\ f \equiv f \lll \inv{(\idToIso\ \refl)}$
|
||||||
|
and is inhabited by:
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\var{coe}\ {\widetilde{\refl}}^*\ f
|
\var{coe}\ \refl^*\ f
|
||||||
& \equiv f \\
|
& \equiv f
|
||||||
& \equiv f \lll \var{identity} \\
|
&& \text{$\refl$ is a neutral element for $\var{coe}$}\\
|
||||||
& \equiv f \lll \inv{(\var{idToIso}\ \widetilde{\refl})}
|
& \equiv f \lll \identity \\
|
||||||
|
& \equiv f \lll \var{subst}\ \refl\ \identity
|
||||||
|
&& \text{$\refl$ is a neutral element for $\var{subst}$}\\
|
||||||
|
& \equiv f \lll \inv{(\idToIso\ \refl)}
|
||||||
|
&& \text{By definition of $\idToIso$}\\
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
The first step follows because reflexivity is a neutral element for coercion.
|
To close the based-path-induction we must supply the value ``at the other''. In
|
||||||
The second step is the identity law in the category. The last step has to do
|
this case this is simply $B \tp \Object$ and $p \tp A \equiv B$ which we have.
|
||||||
with the fact that $\var{idToIso}$ is constructed by substituting according to
|
In summary the proof of \ref{eq:coeDomIso} is the term:
|
||||||
the supplied path and since reflexivity is also the neutral element for
|
%
|
||||||
substitutions we arrive at the desired expression. To close the
|
\begin{equation}
|
||||||
based-path-induction we must supply the value ``at the other''. In this case
|
\label{eq:pathJ-example}
|
||||||
this is simply $B \tp \Object$ and $p \tp A \equiv B$ which we have.
|
\pathJ\ D\ d\ B\ p
|
||||||
|
\end{equation}
|
||||||
|
%
|
||||||
And this finishes the proof of \ref{eq:coeDomIso} and thus \ref{eq:coeDom}.
|
And this finishes the proof of \ref{eq:coeDomIso} and thus \ref{eq:coeDom}.
|
||||||
%
|
%
|
||||||
\section{Categories}
|
\section{Categories}
|
||||||
\subsection{Opposite category}
|
\subsection{Opposite category}
|
||||||
\label{op-cat}
|
\label{op-cat}
|
||||||
The first category I'll present is a pure construction on categories. Given some
|
The first category I will present is a pure construction on categories. Given
|
||||||
category we can construct it's dual, called the opposite category. Starting with
|
some category we can construct its dual, called the opposite category. Starting
|
||||||
a simple example allows us to focus on how we work with equivalences and
|
with a simple example allows us to focus on how we work with equivalences and
|
||||||
univalence in a very simple category where the structure of the category is
|
univalence in a very simple category where the structure of the category is
|
||||||
rather simple.
|
rather simple.
|
||||||
|
|
||||||
|
@ -521,7 +536,7 @@ an arrow from $B$ to $A$ in the underlying category. The identity arrow is the
|
||||||
same as the one in the underlying category (they have the same type). Function
|
same as the one in the underlying category (they have the same type). Function
|
||||||
composition will be reverse function composition from the underlying category.
|
composition will be reverse function composition from the underlying category.
|
||||||
|
|
||||||
I'll refer to things in terms of the underlying category, unless they have an
|
I will refer to things in terms of the underlying category, unless they have an
|
||||||
over-bar. So e.g. $\idToIso$ is a function in the underlying category and the
|
over-bar. So e.g. $\idToIso$ is a function in the underlying category and the
|
||||||
corresponding thing is denoted $\wideoverbar{\idToIso}$ in the opposite
|
corresponding thing is denoted $\wideoverbar{\idToIso}$ in the opposite
|
||||||
category.
|
category.
|
||||||
|
@ -536,7 +551,7 @@ Since $\rrr$ is reverse function composition this is just the symmetric version
|
||||||
of associativity.
|
of associativity.
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
\var{identity} \rrr f \equiv f \x f \rrr identity \equiv f
|
\identity \rrr f \equiv f \x f \rrr identity \equiv f
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
This is just the swapped version of identity.
|
This is just the swapped version of identity.
|
||||||
|
@ -546,38 +561,38 @@ arguments. Or in other words; since $\Arrow\ A\ B$ is a set for all $A\;B \tp
|
||||||
\Object$ then so is $Arrow\ B\ A$.
|
\Object$ then so is $Arrow\ B\ A$.
|
||||||
|
|
||||||
Now, to show that this category is univalent is not as straight-forward. Luckily
|
Now, to show that this category is univalent is not as straight-forward. Luckily
|
||||||
section \ref{sec:equiv} gave us some tools to work with equivalences. We saw
|
section \S\ref{sec:equiv} gave us some tools to work with equivalences. We saw
|
||||||
that we can prove this category univalent by giving an inverse to
|
that we can prove this category univalent by giving an inverse to
|
||||||
$\wideoverbar{\idToIso} \tp (A \equiv B) \to (A \wideoverbar{\approxeq} B)$.
|
$\wideoverbar{\idToIso} \tp (A \equiv B) \to (A \wideoverbar{\approxeq} B)$.
|
||||||
From the original category we have that $\idToIso \tp (A \equiv B) \to (A \cong
|
From the original category we have that $\idToIso \tp (A \equiv B) \to (A \cong
|
||||||
B)$ is an isomorphism. Let us denote it's inverse with $\isoToId \tp (A
|
B)$ is an isomorphism. Let us denote its inverse with $\isoToId \tp (A
|
||||||
\approxeq B) \to (A \equiv B)$. If we squint we can see what we need is a way to
|
\approxeq B) \to (A \equiv B)$. If we squint we can see what we need is a way to
|
||||||
go between $\wideoverbar{\approxeq}$ and $\approxeq$.
|
go between $\wideoverbar{\approxeq}$ and $\approxeq$.
|
||||||
|
|
||||||
An inhabitant of $A \approxeq B$ is simply an arrow $f \tp \var{Arrow}\ A\ B$
|
An inhabitant of $A \approxeq B$ is simply an arrow $f \tp \Arrow\ A\ B$
|
||||||
and it's inverse $g \tp \var{Arrow}\ B\ A$. In the opposite category $g$ will
|
and its inverse $g \tp \Arrow\ B\ A$. In the opposite category $g$ will
|
||||||
play the role of the isomorphism and $f$ will be the inverse. Similarly we can
|
play the role of the isomorphism and $f$ will be the inverse. Similarly we can
|
||||||
go in the opposite direction. I name these maps $\var{shuffle} \tp (A \approxeq
|
go in the opposite direction. I name these maps $\shuffle \tp (A \approxeq
|
||||||
B) \to (A \wideoverbar{\approxeq} B)$ and $\var{shuffle}^{-1} \tp (A
|
B) \to (A \wideoverbar{\approxeq} B)$ and $\shuffle^{-1} \tp (A
|
||||||
\wideoverbar{\approxeq} B) \to (A \approxeq B)$ respectively.
|
\wideoverbar{\approxeq} B) \to (A \approxeq B)$ respectively.
|
||||||
|
|
||||||
As the inverse of $\wideoverbar{\idToIso}$ I will pick $\wideoverbar{\isoToId}
|
As the inverse of $\wideoverbar{\idToIso}$ I will pick $\wideoverbar{\isoToId}
|
||||||
\defeq \isoToId \comp \var{shuffle}$. The proof that they are inverses go as
|
\defeq \isoToId \comp \shuffle$. The proof that they are inverses go as
|
||||||
follows:
|
follows:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\wideoverbar{\isoToId} \comp \wideoverbar{\idToIso} & =
|
\wideoverbar{\isoToId} \comp \wideoverbar{\idToIso} & =
|
||||||
\isoToId \comp \var{shuffle} \comp \wideoverbar{\idToIso}
|
\isoToId \comp \shuffle \comp \wideoverbar{\idToIso}
|
||||||
\\
|
\\
|
||||||
%% ≡⟨ cong (λ φ → φ x) (cong (λ φ → η ⊙ shuffle ⊙ φ) (funExt lem)) ⟩ \\
|
%% ≡⟨ cong (λ φ → φ x) (cong (λ φ → η ⊙ shuffle ⊙ φ) (funExt lem)) ⟩ \\
|
||||||
%
|
%
|
||||||
& \equiv
|
& \equiv
|
||||||
\isoToId \comp \var{shuffle} \comp \inv{\var{shuffle}} \comp \idToIso
|
\isoToId \comp \shuffle \comp \inv{\shuffle} \comp \idToIso
|
||||||
&& \text{lemma} \\
|
&& \text{lemma} \\
|
||||||
%% ≡⟨⟩ \\
|
%% ≡⟨⟩ \\
|
||||||
& \equiv
|
& \equiv
|
||||||
\isoToId \comp \idToIso
|
\isoToId \comp \idToIso
|
||||||
&& \text{$\var{shuffle}$ is an isomorphism} \\
|
&& \text{$\shuffle$ is an isomorphism} \\
|
||||||
& \equiv
|
& \equiv
|
||||||
\identity
|
\identity
|
||||||
&& \text{$\isoToId$ is an isomorphism}
|
&& \text{$\isoToId$ is an isomorphism}
|
||||||
|
@ -586,7 +601,7 @@ follows:
|
||||||
The other direction is analogous.
|
The other direction is analogous.
|
||||||
|
|
||||||
The lemma used in step 2 of this proof states that $\wideoverbar{idToIso} \equiv
|
The lemma used in step 2 of this proof states that $\wideoverbar{idToIso} \equiv
|
||||||
\inv{\var{shuffle}} \comp \idToIso$. This is a rather straight-forward proof
|
\inv{\shuffle} \comp \idToIso$. This is a rather straight-forward proof
|
||||||
since being-an-inverse-of is a proposition, so it suffices to show that their
|
since being-an-inverse-of is a proposition, so it suffices to show that their
|
||||||
first components are equal, but this holds judgmentally.
|
first components are equal, but this holds judgmentally.
|
||||||
|
|
||||||
|
@ -594,12 +609,12 @@ This finished the proof that the opposite category is in fact a category. Now,
|
||||||
to prove that that opposite-of is an involution we must show:
|
to prove that that opposite-of is an involution we must show:
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
\prod_{\bC \tp \var{Category}} \left(\bC^{\var{Op}}\right)^{\var{Op}} \equiv \bC
|
\prod_{\bC \tp \Category} \left(\bC^{\var{Op}}\right)^{\var{Op}} \equiv \bC
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
As we've seen the laws in $\left(\bC^{\var{Op}}\right)^{\var{Op}}$ get quite
|
As we have seen the laws in $\left(\bC^{\var{Op}}\right)^{\var{Op}}$ get quite
|
||||||
involved.\footnote{We haven't even seen the full story because we've used this
|
involved.\footnote{We have not even seen the full story because we have used
|
||||||
`interface' for equivalences.} Luckily since being-a-category is a mere
|
this `interface' for equivalences.} Luckily since being-a-category is a mere
|
||||||
proposition, we need not concern ourselves with this bit when proving the above.
|
proposition, we need not concern ourselves with this bit when proving the above.
|
||||||
We can use the equality principle for categories that let us prove an equality
|
We can use the equality principle for categories that let us prove an equality
|
||||||
just by giving an equality on the data-part. So, given a category $\bC$ all we
|
just by giving an equality on the data-part. So, given a category $\bC$ all we
|
||||||
|
@ -635,7 +650,7 @@ $$
|
||||||
(\var{hA} \equiv \var{hB}) \simeq (\var{hA} \approxeq \var{hB})
|
(\var{hA} \equiv \var{hB}) \simeq (\var{hA} \approxeq \var{hB})
|
||||||
$$
|
$$
|
||||||
%
|
%
|
||||||
Which, as we saw in section \ref{sec:univalence}, is sufficient to show that the
|
Which, as we saw in section \S\ref{sec:univalence}, is sufficient to show that the
|
||||||
category is univalent. The way that I have shown this is with a three-step
|
category is univalent. The way that I have shown this is with a three-step
|
||||||
process. For objects $(A, s_A)\; (B, s_B) \tp \Set$ I show the following chain
|
process. For objects $(A, s_A)\; (B, s_B) \tp \Set$ I show the following chain
|
||||||
of equivalences:
|
of equivalences:
|
||||||
|
@ -669,11 +684,11 @@ lemma:
|
||||||
Which says that if two type-families are equivalent at all points, then pairs
|
Which says that if two type-families are equivalent at all points, then pairs
|
||||||
with identical first components and these families as second components will
|
with identical first components and these families as second components will
|
||||||
also be equivalent. For our purposes $P \defeq \isEquiv\ A\ B$ and $Q \defeq
|
also be equivalent. For our purposes $P \defeq \isEquiv\ A\ B$ and $Q \defeq
|
||||||
\var{Isomorphism}$. So we must finally prove:
|
\Isomorphism$. So we must finally prove:
|
||||||
%
|
%
|
||||||
\begin{align}
|
\begin{align}
|
||||||
\label{eq:equivIso}
|
\label{eq:equivIso}
|
||||||
\prod_{f \tp A \to B} \left( \isEquiv\ A\ B\ f \simeq \var{Isomorphism}\ f \right)
|
\prod_{f \tp A \to B} \left( \isEquiv\ A\ B\ f \simeq \Isomorphism\ f \right)
|
||||||
\end{align}
|
\end{align}
|
||||||
|
|
||||||
First, lets prove \ref{eq:equivPropSig}: Let $propP \tp \prod_{a \tp A} \isProp (P\ a)$ and $x\;y \tp \sum_{a \tp A} P\ a$ be given. Because
|
First, lets prove \ref{eq:equivPropSig}: Let $propP \tp \prod_{a \tp A} \isProp (P\ a)$ and $x\;y \tp \sum_{a \tp A} P\ a$ be given. Because
|
||||||
|
@ -716,12 +731,12 @@ choose:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\var{toIso}
|
\var{toIso}
|
||||||
& \tp \isEquiv\ f \to \var{Isomorphism}\ f \\
|
& \tp \isEquiv\ f \to \Isomorphism\ f \\
|
||||||
\var{fromIso}
|
\var{fromIso}
|
||||||
& \tp \var{Isomorphism}\ f \to \isEquiv\ f
|
& \tp \Isomorphism\ f \to \isEquiv\ f
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
As mentioned in section \ref{sec:equiv}. These maps are not in general inverses
|
As mentioned in section \S\ref{sec:equiv}. These maps are not in general inverses
|
||||||
of each other. In stead, we will use the fact that $A$ and $B$ are sets. The first thing we must prove is:
|
of each other. In stead, we will use the fact that $A$ and $B$ are sets. The first thing we must prove is:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
|
@ -732,11 +747,11 @@ For this we can use the fact that being-an-equivalence is a mere proposition.
|
||||||
For the other direction:
|
For the other direction:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\var{toIso} \comp \var{fromIso} \equiv \identity_{\var{Isomorphism}\ f}
|
\var{toIso} \comp \var{fromIso} \equiv \identity_{\Isomorphism\ f}
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
We will show that $\var{Isomorphism}\ f$ is also a mere proposition. To this
|
We will show that $\Isomorphism\ f$ is also a mere proposition. To this
|
||||||
end, let $X\;Y \tp \var{Isomorphism}\ f$ be given. Name the maps $x\;y \tp B
|
end, let $X\;Y \tp \Isomorphism\ f$ be given. Name the maps $x\;y \tp B
|
||||||
\to A$ respectively. Now, the proof that $X$ and $Y$ are the same is a pair of
|
\to A$ respectively. Now, the proof that $X$ and $Y$ are the same is a pair of
|
||||||
paths: $p \tp x \equiv y$ and $\Path\ (\lambda\; i \to
|
paths: $p \tp x \equiv y$ and $\Path\ (\lambda\; i \to
|
||||||
\var{AreInverses}\ f\ (p\ i))\ \mathcal{X}\ \mathcal{Y}$ where $\mathcal{X}$
|
\var{AreInverses}\ f\ (p\ i))\ \mathcal{X}\ \mathcal{Y}$ where $\mathcal{X}$
|
||||||
|
@ -777,8 +792,10 @@ where we have a witness to this being a category. This is useful if this library
|
||||||
is later extended to talk about higher categories.
|
is later extended to talk about higher categories.
|
||||||
|
|
||||||
\section{Products}
|
\section{Products}
|
||||||
In the following I'll demonstrate a technique for using categories to prove
|
\label{sec:products}
|
||||||
properties. The goal in this section is to show that products are propositions:
|
In the following a technique for using categories to prove properties will be
|
||||||
|
demonstrated. The goal in this section is to show that products are
|
||||||
|
propositions:
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
\prod_{\bC \tp \Category} \prod_{A\;B \tp \Object} \isProp\ (\var{Product}\ \bC\ A\ B)
|
\prod_{\bC \tp \Category} \prod_{A\;B \tp \Object} \isProp\ (\var{Product}\ \bC\ A\ B)
|
||||||
|
@ -789,7 +806,7 @@ and $B$ in the category $\bC$. I do this by constructing a category whose
|
||||||
terminal objects are equivalent to products in $\bC$, and since terminal objects
|
terminal objects are equivalent to products in $\bC$, and since terminal objects
|
||||||
are propositional in a proper category and equivalences preserve homotopy level,
|
are propositional in a proper category and equivalences preserve homotopy level,
|
||||||
then we know that products also are propositions. But before we get to that,
|
then we know that products also are propositions. But before we get to that,
|
||||||
let's recall the definition of products.
|
we recall the definition of products.
|
||||||
|
|
||||||
\subsection{Definition of products}
|
\subsection{Definition of products}
|
||||||
Given a category $\bC$ and two objects $A$ and $B$ in $\bC$ we define the
|
Given a category $\bC$ and two objects $A$ and $B$ in $\bC$ we define the
|
||||||
|
@ -815,7 +832,7 @@ $\pi$ is called the product (arrow) of $f$ and $g$.
|
||||||
\newcommand\pairB{\mathcal{B}}
|
\newcommand\pairB{\mathcal{B}}
|
||||||
Given a base category $\bC$ and two objects in this category $\pairA$ and
|
Given a base category $\bC$ and two objects in this category $\pairA$ and
|
||||||
$\pairB$ we can construct the ``pair category'': \TODO{This is a working title,
|
$\pairB$ we can construct the ``pair category'': \TODO{This is a working title,
|
||||||
it's nice to have a name for this thing to refer back to}
|
it is nice to have a name for this thing to refer back to}
|
||||||
|
|
||||||
The type of objects in this category will be an object in the underlying
|
The type of objects in this category will be an object in the underlying
|
||||||
category, $X$, and two arrows (also from the underlying category)
|
category, $X$, and two arrows (also from the underlying category)
|
||||||
|
@ -991,7 +1008,7 @@ isomorphism, and create a path from this:
|
||||||
\end{split}
|
\end{split}
|
||||||
\end{align}
|
\end{align}
|
||||||
%
|
%
|
||||||
Where $\widetilde{p} \defeq \var{isoToId}\ \var{iso} \tp X \equiv Y$.
|
Where $\widetilde{p} \defeq \isoToId\ \var{iso} \tp X \equiv Y$.
|
||||||
|
|
||||||
Finally we have the type:
|
Finally we have the type:
|
||||||
%
|
%
|
||||||
|
@ -1063,8 +1080,8 @@ equality principle for arrows in this category (\ref{eq:productEqPrinc}) gives
|
||||||
us that it suffices to show that $f$ and $\inv{f}$, this is exactly
|
us that it suffices to show that $f$ and $\inv{f}$, this is exactly
|
||||||
$\var{inv}_f$.
|
$\var{inv}_f$.
|
||||||
|
|
||||||
This concludes the first direction of the isomorphism that we're constructing.
|
This concludes the first direction of the isomorphism that we are constructing.
|
||||||
For the other direction we're given just given the isomorphism
|
For the other direction we are given the isomorphism:
|
||||||
%
|
%
|
||||||
$$
|
$$
|
||||||
(f, \inv{f}, \var{inv}_f)
|
(f, \inv{f}, \var{inv}_f)
|
||||||
|
@ -1134,7 +1151,7 @@ gory details.
|
||||||
%
|
%
|
||||||
\subsection{Propositionality of products}
|
\subsection{Propositionality of products}
|
||||||
%
|
%
|
||||||
Now that we've constructed the ``pair category'' I'll demonstrate how to use
|
Now that we have constructed the ``pair category'' I will demonstrate how to use
|
||||||
this to prove that products are propositional. I will do this by showing that
|
this to prove that products are propositional. I will do this by showing that
|
||||||
terminal objects in this category are equivalent to products:
|
terminal objects in this category are equivalent to products:
|
||||||
%
|
%
|
||||||
|
@ -1145,7 +1162,7 @@ terminal objects in this category are equivalent to products:
|
||||||
And as always we do this by constructing an isomorphism:
|
And as always we do this by constructing an isomorphism:
|
||||||
%
|
%
|
||||||
In the direction $\var{Terminal} → \var{Product}\ ℂ\ \mathcal{A}\ \mathcal{B}$
|
In the direction $\var{Terminal} → \var{Product}\ ℂ\ \mathcal{A}\ \mathcal{B}$
|
||||||
we're given a terminal object $X, x_𝒜, x_ℬ$. $X$ Will be the product-object and
|
we are given a terminal object $X, x_𝒜, x_ℬ$. $X$ Will be the product-object and
|
||||||
$x_𝒜, x_ℬ$ will be the product arrows, so it just remains to verify that this is
|
$x_𝒜, x_ℬ$ will be the product arrows, so it just remains to verify that this is
|
||||||
indeed a product. That is, for an object $Y$ and two arrows $y_𝒜 \tp
|
indeed a product. That is, for an object $Y$ and two arrows $y_𝒜 \tp
|
||||||
\Arrow\ Y\ 𝒜$, $y_ℬ\ \Arrow\ Y\ ℬ$ we must find a unique arrow $f \tp
|
\Arrow\ Y\ 𝒜$, $y_ℬ\ \Arrow\ Y\ ℬ$ we must find a unique arrow $f \tp
|
||||||
|
@ -1214,6 +1231,7 @@ That in any category:
|
||||||
\end{align}
|
\end{align}
|
||||||
%
|
%
|
||||||
\section{Monads}
|
\section{Monads}
|
||||||
|
\label{sec:monads}
|
||||||
In this section I present two formulations of monads. The two representations
|
In this section I present two formulations of monads. The two representations
|
||||||
are referred to as the monoidal- and Kleisli- representation respectively or
|
are referred to as the monoidal- and Kleisli- representation respectively or
|
||||||
simply monoidal monads and Kleisli monads for short. We then show that the two
|
simply monoidal monads and Kleisli monads for short. We then show that the two
|
||||||
|
@ -1230,8 +1248,8 @@ The monoidal formulation of monads consists of the following data:
|
||||||
\label{eq:monad-monoidal-data}
|
\label{eq:monad-monoidal-data}
|
||||||
\begin{split}
|
\begin{split}
|
||||||
\EndoR & \tp \Endo ℂ \\
|
\EndoR & \tp \Endo ℂ \\
|
||||||
\var{pure} & \tp \NT{\EndoR^0}{\EndoR} \\
|
\pure & \tp \NT{\EndoR^0}{\EndoR} \\
|
||||||
\var{join} & \tp \NT{\EndoR^2}{\EndoR}
|
\join & \tp \NT{\EndoR^2}{\EndoR}
|
||||||
\end{split}
|
\end{split}
|
||||||
\end{align}
|
\end{align}
|
||||||
%
|
%
|
||||||
|
@ -1246,10 +1264,10 @@ following laws:
|
||||||
\begin{align}
|
\begin{align}
|
||||||
\label{eq:monad-monoidal-laws}
|
\label{eq:monad-monoidal-laws}
|
||||||
\begin{split}
|
\begin{split}
|
||||||
\var{join} \lll \fmap\ \var{join}
|
\join \lll \fmap\ \join
|
||||||
& ≡ \var{join} \lll \var{join}\ \fmap \\
|
& ≡ \join \lll \join\ \fmap \\
|
||||||
\var{join} \lll \var{pure}\ \fmap & ≡ \identity \\
|
\join \lll \pure\ \fmap & ≡ \identity \\
|
||||||
\var{join} \lll \fmap\ \var{pure} & ≡ \identity
|
\join \lll \fmap\ \pure & ≡ \identity
|
||||||
\end{split}
|
\end{split}
|
||||||
\end{align}
|
\end{align}
|
||||||
%
|
%
|
||||||
|
@ -1273,7 +1291,7 @@ The Kleisli-formulation consists of the following data:
|
||||||
%
|
%
|
||||||
The objects $X$ and $Y$ are implicitly universally quantified.
|
The objects $X$ and $Y$ are implicitly universally quantified.
|
||||||
|
|
||||||
It's interesting to note here that this formulation does not talk about natural
|
It is interesting to note here that this formulation does not talk about natural
|
||||||
transformations or other such constructs from category theory. All we have here
|
transformations or other such constructs from category theory. All we have here
|
||||||
is a regular maps on objects and a pair of arrows.
|
is a regular maps on objects and a pair of arrows.
|
||||||
%
|
%
|
||||||
|
|
|
@ -1,30 +1,20 @@
|
||||||
\chapter{Introduction}
|
\chapter{Introduction}
|
||||||
Functional extensionality and univalence is not expressible in
|
|
||||||
\nomen{Intensional Martin Löf Type Theory} (ITT). This poses a severe limitation
|
|
||||||
on both i. what is \emph{provable} and ii. the \emph{re-usability} of proofs.
|
|
||||||
Recent developments have, however, resulted in \nomen{Cubical Type Theory} (CTT)
|
|
||||||
which permits a constructive proof of these two important notions.
|
|
||||||
|
|
||||||
Furthermore an extension has been implemented for the proof assistant Agda
|
|
||||||
(\cite{agda}, \cite{cubical-agda}) that allows us to work in such a ``cubical
|
|
||||||
setting''. This thesis will explore the usefulness of this extension in the
|
|
||||||
context of category theory.
|
|
||||||
%
|
|
||||||
\section{Motivating examples}
|
\section{Motivating examples}
|
||||||
%
|
%
|
||||||
In the following two sections I present two examples that illustrate some
|
In the following two sections I present two examples that illustrate some
|
||||||
limitations inherent in ITT and -- by extension -- Agda.
|
limitations inherent in ITT and -- by extension -- Agda.
|
||||||
%
|
%
|
||||||
\subsection{Functional extensionality}
|
\subsection{Functional extensionality}
|
||||||
|
\label{sec:functional-extensionality}%
|
||||||
Consider the functions:
|
Consider the functions:
|
||||||
%
|
%
|
||||||
\begin{multicols}{2}
|
\begin{multicols}{2}
|
||||||
\noindent
|
\noindent
|
||||||
\begin{equation*}
|
\begin{equation*}
|
||||||
f \defeq (n \tp \bN) \mapsto (0 + n \tp \bN)
|
f \defeq (n \tp \bN) \mto (0 + n \tp \bN)
|
||||||
\end{equation*}
|
\end{equation*}
|
||||||
\begin{equation*}
|
\begin{equation*}
|
||||||
g \defeq (n \tp \bN) \mapsto (n + 0 \tp \bN)
|
g \defeq (n \tp \bN) \mto (n + 0 \tp \bN)
|
||||||
\end{equation*}
|
\end{equation*}
|
||||||
\end{multicols}
|
\end{multicols}
|
||||||
%
|
%
|
||||||
|
@ -33,7 +23,6 @@ This is also called \nomen{judgmental} equality. We call it definitional
|
||||||
equality because the \emph{equality} arises from the \emph{definition} of $+$
|
equality because the \emph{equality} arises from the \emph{definition} of $+$
|
||||||
which is:
|
which is:
|
||||||
%
|
%
|
||||||
\newcommand{\suc}[1]{\mathit{suc}\ #1}
|
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
+ & \tp \bN \to \bN \to \bN \\
|
+ & \tp \bN \to \bN \to \bN \\
|
||||||
n + 0 & \defeq n \\
|
n + 0 & \defeq n \\
|
||||||
|
@ -55,21 +44,21 @@ equivalence of $f$ and $g$ -- even though we can prove them equal for all
|
||||||
points. This is exactly the notion of equality of functions that we are
|
points. This is exactly the notion of equality of functions that we are
|
||||||
interested in; that they are equal for all inputs. We call this
|
interested in; that they are equal for all inputs. We call this
|
||||||
\nomen{point-wise equality}, where the \emph{points} of a function refers
|
\nomen{point-wise equality}, where the \emph{points} of a function refers
|
||||||
to it's arguments.
|
to its arguments.
|
||||||
|
|
||||||
In the context of category theory functional extensionality is e.g. needed to
|
In the context of category theory functional extensionality is e.g. needed to
|
||||||
show that representable functors are indeed functors. The representable functor
|
show that representable functors are indeed functors. The representable functor
|
||||||
for a category $\bC$ and a fixed object in $A \in \bC$ is defined to be:
|
for a category $\bC$ and a fixed object in $A \in \bC$ is defined to be:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\fmap \defeq X \mapsto \Hom_{\bC}(A, X)
|
\fmap \defeq X \mto \Hom_{\bC}(A, X)
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
The proof obligation that this satisfies the identity law of functors
|
The proof obligation that this satisfies the identity law of functors
|
||||||
($\fmap\ \idFun \equiv \idFun$) thus becomes:
|
($\fmap\ \idFun \equiv \idFun$) thus becomes:
|
||||||
%
|
%
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
\Hom(A, \idFun_{\bX}) = (g \mapsto \idFun \comp g) \equiv \idFun_{\Sets}
|
\Hom(A, \idFun_{\bX}) = (g \mto \idFun \comp g) \equiv \idFun_{\Sets}
|
||||||
\end{align*}
|
\end{align*}
|
||||||
%
|
%
|
||||||
One needs functional extensionality to ``go under'' the function arrow and apply
|
One needs functional extensionality to ``go under'' the function arrow and apply
|
||||||
|
@ -92,7 +81,7 @@ be performed in ITT.
|
||||||
|
|
||||||
More specifically what we are interested in is a way of identifying
|
More specifically what we are interested in is a way of identifying
|
||||||
\nomen{equivalent} types. I will return to the definition of equivalence later
|
\nomen{equivalent} types. I will return to the definition of equivalence later
|
||||||
in section \ref{sec:equiv}, but for now it is sufficient to think of an
|
in section \S\ref{sec:equiv}, but for now it is sufficient to think of an
|
||||||
equivalence as a one-to-one correspondence. We write $A \simeq B$ to assert that
|
equivalence as a one-to-one correspondence. We write $A \simeq B$ to assert that
|
||||||
$A$ and $B$ are equivalent types. The principle of univalence says that:
|
$A$ and $B$ are equivalent types. The principle of univalence says that:
|
||||||
%
|
%
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 344 KiB After Width: | Height: | Size: 266 KiB |
102
doc/macros.tex
102
doc/macros.tex
|
@ -12,7 +12,8 @@
|
||||||
\newcommand{\bC}{\mathbb{C}}
|
\newcommand{\bC}{\mathbb{C}}
|
||||||
\newcommand{\bX}{\mathbb{X}}
|
\newcommand{\bX}{\mathbb{X}}
|
||||||
% \newcommand{\to}{\rightarrow}
|
% \newcommand{\to}{\rightarrow}
|
||||||
\newcommand{\mto}{\mapsto}
|
%% \newcommand{\mto}{\mapsto}
|
||||||
|
\newcommand{\mto}{\rightarrow}
|
||||||
\newcommand{\UU}{\ensuremath{\mathcal{U}}\xspace}
|
\newcommand{\UU}{\ensuremath{\mathcal{U}}\xspace}
|
||||||
\let\type\UU
|
\let\type\UU
|
||||||
\newcommand{\MCU}{\UU}
|
\newcommand{\MCU}{\UU}
|
||||||
|
@ -32,57 +33,62 @@
|
||||||
}
|
}
|
||||||
\makeatother
|
\makeatother
|
||||||
\newcommand{\var}[1]{\ensuremath{\mathit{#1}}}
|
\newcommand{\var}[1]{\ensuremath{\mathit{#1}}}
|
||||||
\newcommand{\Hom}{\var{Hom}}
|
\newcommand{\varindex}[1]{\ensuremath{\mathit{#1}}\index{#1}}
|
||||||
\newcommand{\fmap}{\var{fmap}}
|
|
||||||
\newcommand{\bind}{\var{bind}}
|
\newcommand{\Hom}{\varindex{Hom}}
|
||||||
\newcommand{\join}{\var{join}}
|
\newcommand{\fmap}{\varindex{fmap}}
|
||||||
\newcommand{\omap}{\var{omap}}
|
\newcommand{\bind}{\varindex{bind}}
|
||||||
\newcommand{\pure}{\var{pure}}
|
\newcommand{\join}{\varindex{join}}
|
||||||
\newcommand{\idFun}{\var{id}}
|
\newcommand{\omap}{\varindex{omap}}
|
||||||
\newcommand{\Sets}{\var{Sets}}
|
\newcommand{\pure}{\varindex{pure}}
|
||||||
\newcommand{\Set}{\var{Set}}
|
\newcommand{\idFun}{\varindex{id}}
|
||||||
\newcommand{\hSet}{\var{hSet}}
|
\newcommand{\Sets}{\varindex{Sets}}
|
||||||
\newcommand{\id}{\var{id}}
|
\newcommand{\Set}{\varindex{Set}}
|
||||||
\newcommand{\isEquiv}{\var{isEquiv}}
|
\newcommand{\hSet}{\varindex{hSet}}
|
||||||
\newcommand{\idToIso}{\var{idToIso}}
|
\newcommand{\id}{\varindex{id}}
|
||||||
\newcommand{\isSet}{\var{isSet}}
|
\newcommand{\isEquiv}{\varindex{isEquiv}}
|
||||||
\newcommand{\isContr}{\var{isContr}}
|
\newcommand{\idToIso}{\varindex{idToIso}}
|
||||||
\newcommand{\isGroupoid}{\var{isGroupoid}}
|
\newcommand{\idIso}{\varindex{idIso}}
|
||||||
\newcommand{\pathJ}{\var{pathJ}}
|
\newcommand{\isSet}{\varindex{isSet}}
|
||||||
\newcommand\Object{\var{Object}}
|
\newcommand{\isContr}{\varindex{isContr}}
|
||||||
\newcommand\Functor{\var{Functor}}
|
\newcommand{\isGroupoid}{\varindex{isGroupoid}}
|
||||||
\newcommand\isProp{\var{isProp}}
|
\newcommand{\pathJ}{\varindex{pathJ}}
|
||||||
\newcommand\propPi{\var{propPi}}
|
\newcommand\Object{\varindex{Object}}
|
||||||
\newcommand\propSig{\var{propSig}}
|
\newcommand\Functor{\varindex{Functor}}
|
||||||
\newcommand\PreCategory{\var{PreCategory}}
|
\newcommand\isProp{\varindex{isProp}}
|
||||||
\newcommand\IsPreCategory{\var{IsPreCategory}}
|
\newcommand\propPi{\varindex{propPi}}
|
||||||
\newcommand\isIdentity{\var{isIdentity}}
|
\newcommand\propSig{\varindex{propSig}}
|
||||||
\newcommand\propIsIdentity{\var{propIsIdentity}}
|
\newcommand\PreCategory{\varindex{PreCategory}}
|
||||||
\newcommand\IsCategory{\var{IsCategory}}
|
\newcommand\IsPreCategory{\varindex{IsPreCategory}}
|
||||||
\newcommand\Gl{\var{\lambda}}
|
\newcommand\isIdentity{\varindex{isIdentity}}
|
||||||
\newcommand\lemPropF{\var{lemPropF}}
|
\newcommand\propIsIdentity{\varindex{propIsIdentity}}
|
||||||
\newcommand\isPreCategory{\var{isPreCategory}}
|
\newcommand\IsCategory{\varindex{IsCategory}}
|
||||||
\newcommand\congruence{\var{cong}}
|
\newcommand\Gl{\varindex{\lambda}}
|
||||||
\newcommand\identity{\var{identity}}
|
\newcommand\lemPropF{\varindex{lemPropF}}
|
||||||
\newcommand\isequiv{\var{isequiv}}
|
\newcommand\isPreCategory{\varindex{isPreCategory}}
|
||||||
\newcommand\qinv{\var{qinv}}
|
\newcommand\congruence{\varindex{cong}}
|
||||||
\newcommand\fiber{\var{fiber}}
|
\newcommand\identity{\varindex{identity}}
|
||||||
\newcommand\shuffle{\var{shuffle}}
|
\newcommand\isequiv{\varindex{isequiv}}
|
||||||
\newcommand\Univalent{\var{Univalent}}
|
\newcommand\qinv{\varindex{qinv}}
|
||||||
\newcommand\refl{\var{refl}}
|
\newcommand\fiber{\varindex{fiber}}
|
||||||
\newcommand\isoToId{\var{isoToId}}
|
\newcommand\shuffle{\varindex{shuffle}}
|
||||||
\newcommand\Isomorphism{\var{Isomorphism}}
|
\newcommand\Univalent{\varindex{Univalent}}
|
||||||
|
\newcommand\refl{\varindex{refl}}
|
||||||
|
\newcommand\isoToId{\varindex{isoToId}}
|
||||||
|
\newcommand\Isomorphism{\varindex{Isomorphism}}
|
||||||
\newcommand\rrr{\ggg}
|
\newcommand\rrr{\ggg}
|
||||||
\newcommand\fish{\mathrel{\wideoverbar{\rrr}}}
|
\newcommand\fish{\mathrel{\wideoverbar{\rrr}}}
|
||||||
\newcommand\fst{\var{fst}}
|
\newcommand\fst{\varindex{fst}}
|
||||||
\newcommand\snd{\var{snd}}
|
\newcommand\snd{\varindex{snd}}
|
||||||
\newcommand\Path{\var{Path}}
|
\newcommand\Path{\varindex{Path}}
|
||||||
\newcommand\Category{\var{Category}}
|
\newcommand\Category{\varindex{Category}}
|
||||||
\newcommand\TODO[1]{TODO: \emph{#1}}
|
\newcommand\TODO[1]{TODO: \emph{#1}}
|
||||||
\newcommand*{\QED}{\hfill\ensuremath{\square}}%
|
\newcommand*{\QED}{\hfill\ensuremath{\square}}%
|
||||||
\newcommand\uexists{\exists!}
|
\newcommand\uexists{\exists!}
|
||||||
\newcommand\Arrow{\var{Arrow}}
|
\newcommand\Arrow{\varindex{Arrow}}
|
||||||
\newcommand\NTsym{\var{NT}}
|
\newcommand\NTsym{\varindex{NT}}
|
||||||
\newcommand\NT[2]{\NTsym\ #1\ #2}
|
\newcommand\NT[2]{\NTsym\ #1\ #2}
|
||||||
\newcommand\Endo[1]{\var{Endo}\ #1}
|
\newcommand\Endo[1]{\varindex{Endo}\ #1}
|
||||||
\newcommand\EndoR{\mathcal{R}}
|
\newcommand\EndoR{\mathcal{R}}
|
||||||
|
\newcommand\funExt{\varindex{funExt}}
|
||||||
|
\newcommand{\suc}[1]{\mathit{suc}\ #1}
|
||||||
|
|
13
doc/main.tex
13
doc/main.tex
|
@ -42,19 +42,15 @@
|
||||||
\institution{\chalmers}
|
\institution{\chalmers}
|
||||||
\department{Department of Computer Science and Engineering}
|
\department{Department of Computer Science and Engineering}
|
||||||
\researchgroup{Programming Logic Group}
|
\researchgroup{Programming Logic Group}
|
||||||
\bibliographystyle{plain}
|
|
||||||
|
|
||||||
%% \newtheorem{prop}{Proposition}
|
|
||||||
\makeatletter
|
|
||||||
\newcommand*{\rom}[1]{\expandafter\@slowroman\romannumeral #1@}
|
|
||||||
\makeatother
|
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
|
||||||
|
\frontmatter
|
||||||
\myfrontmatter
|
\myfrontmatter
|
||||||
\pagenumbering{roman}
|
|
||||||
\maketitle
|
\maketitle
|
||||||
\addtocontents{toc}{\protect\thispagestyle{empty}}
|
\input{abstract.tex}
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
\pagenumbering{arabic}
|
\mainmatter
|
||||||
%
|
%
|
||||||
\input{introduction.tex}
|
\input{introduction.tex}
|
||||||
\input{cubical.tex}
|
\input{cubical.tex}
|
||||||
|
@ -73,4 +69,5 @@
|
||||||
%% \input{planning.tex}
|
%% \input{planning.tex}
|
||||||
%% \input{halftime.tex}
|
%% \input{halftime.tex}
|
||||||
\end{appendices}
|
\end{appendices}
|
||||||
|
\printindex
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
\usepackage[utf8]{inputenc}
|
\usepackage[utf8]{inputenc}
|
||||||
|
|
||||||
\usepackage{natbib}
|
\usepackage{natbib}
|
||||||
|
\bibliographystyle{plain}
|
||||||
|
|
||||||
\usepackage[
|
\usepackage[
|
||||||
hidelinks,
|
hidelinks,
|
||||||
pdfusetitle,
|
pdfusetitle,
|
||||||
|
@ -15,8 +17,9 @@
|
||||||
\usepackage{amssymb,amsmath,amsthm,stmaryrd,mathrsfs,wasysym}
|
\usepackage{amssymb,amsmath,amsthm,stmaryrd,mathrsfs,wasysym}
|
||||||
\usepackage[toc,page]{appendix}
|
\usepackage[toc,page]{appendix}
|
||||||
\usepackage{xspace}
|
\usepackage{xspace}
|
||||||
\usepackage[a4paper]{geometry}
|
\usepackage[a4paper,top=3cm,bottom=3cm]{geometry}
|
||||||
|
\usepackage{makeidx}
|
||||||
|
\makeindex
|
||||||
% \setlength{\parskip}{10pt}
|
% \setlength{\parskip}{10pt}
|
||||||
|
|
||||||
% \usepackage{tikz}
|
% \usepackage{tikz}
|
||||||
|
@ -85,3 +88,28 @@
|
||||||
\newunicodechar{𝒜}{\textfallback{?}}
|
\newunicodechar{𝒜}{\textfallback{?}}
|
||||||
\newunicodechar{ℬ}{\textfallback{?}}
|
\newunicodechar{ℬ}{\textfallback{?}}
|
||||||
%% \newunicodechar{≊}{\textfallback{≊}}
|
%% \newunicodechar{≊}{\textfallback{≊}}
|
||||||
|
\makeatletter
|
||||||
|
\newcommand*{\rom}[1]{\expandafter\@slowroman\romannumeral #1@}
|
||||||
|
\makeatother
|
||||||
|
\makeatletter
|
||||||
|
|
||||||
|
\newcommand\frontmatter{%
|
||||||
|
\cleardoublepage
|
||||||
|
%\@mainmatterfalse
|
||||||
|
\pagenumbering{roman}}
|
||||||
|
|
||||||
|
\newcommand\mainmatter{%
|
||||||
|
\cleardoublepage
|
||||||
|
% \@mainmattertrue
|
||||||
|
\pagenumbering{arabic}}
|
||||||
|
|
||||||
|
\newcommand\backmatter{%
|
||||||
|
\if@openright
|
||||||
|
\cleardoublepage
|
||||||
|
\else
|
||||||
|
\clearpage
|
||||||
|
\fi
|
||||||
|
% \@mainmatterfalse
|
||||||
|
}
|
||||||
|
|
||||||
|
\makeatother
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
\chapter{Source code}
|
\chapter{Source code excerpts}
|
||||||
\label{ch:app-sources}
|
\label{ch:app-sources}
|
||||||
In the following a few of the definitions mentioned in the report are included.
|
In the following a few of the definitions mentioned in the report are included.
|
||||||
The following is \emph{not} a verbatim copy of individual modules from the
|
The following is \emph{not} a verbatim copy of individual modules from the
|
||||||
implementation. Rather, this is a redacted and pre-formatted designed for
|
implementation. Rather, this is a redacted and pre-formatted designed for
|
||||||
presentation purposes. It's provided here as a convenience. The actual sources
|
presentation purposes. Its provided here as a convenience. The actual sources
|
||||||
are the only authoritative source. Is something is not clear, please refer to
|
are the only authoritative source. Is something is not clear, please refer to
|
||||||
those.
|
those.
|
||||||
\clearpage
|
|
||||||
\section{Cubical}
|
\section{Cubical}
|
||||||
\label{sec:app-cubical}
|
\label{sec:app-cubical}
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
|
\label{fig:path}
|
||||||
\begin{Verbatim}
|
\begin{Verbatim}
|
||||||
postulate
|
postulate
|
||||||
PathP : ∀ {ℓ} (A : I → Set ℓ) → A i0 → A i1 → Set ℓ
|
PathP : ∀ {ℓ} (A : I → Set ℓ) → A i0 → A i1 → Set ℓ
|
||||||
|
@ -23,6 +23,7 @@ module _ {ℓ} {A : Set ℓ} where
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
\caption{Excerpt from the cubical library. Definition of the path-type.}
|
\caption{Excerpt from the cubical library. Definition of the path-type.}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
\clearpage
|
||||||
%
|
%
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\begin{Verbatim}
|
\begin{Verbatim}
|
||||||
|
|
Loading…
Reference in a new issue