292 lines
11 KiB
TeX
292 lines
11 KiB
TeX
|
\section{Implementation}
|
||
|
This implementation formalizes the following concepts:
|
||
|
%
|
||
|
\begin{itemize}
|
||
|
\item Core categorical concepts
|
||
|
\subitem Categories
|
||
|
\subitem Functors
|
||
|
\subitem Products
|
||
|
\subitem Exponentials
|
||
|
\subitem Cartesian closed categories
|
||
|
\subitem Natural transformations
|
||
|
\subitem Yoneda embedding
|
||
|
\subitem Monads
|
||
|
\subsubitem Monoidal monads
|
||
|
\subsubitem Kleisli monads
|
||
|
\subsubitem Voevodsky's construction
|
||
|
\item Category of \ldots
|
||
|
\subitem Homotopy sets
|
||
|
\subitem Categories
|
||
|
\subitem Relations
|
||
|
\subitem Functors
|
||
|
\subitem Free category
|
||
|
\end{itemize}
|
||
|
%
|
||
|
Since it is useful to distinguish between types with more or less (homotopical)
|
||
|
structure I have followed the following design-principle: I have split concepts
|
||
|
up into things that represent ``data'' and ``laws'' about this data. The idea is
|
||
|
that we can provide a proof that the laws are mere propositions. As an example a
|
||
|
category is defined to have two members: `raw` which is a collection of the data
|
||
|
and `isCategory` which asserts some laws about that data.
|
||
|
|
||
|
This allows me to reason about things in a more mathematical way, where one can
|
||
|
reason about two categories by simply focusing on the data. This is acheived by
|
||
|
creating a function embodying the ``equality principle'' for a given type.
|
||
|
|
||
|
\subsubsection{Categories}
|
||
|
The data for a category consist of objects, morphisms (or arrows as I will refer
|
||
|
to them henceforth), the identity arrow and composition of arrows.
|
||
|
|
||
|
Another record encapsulates some laws about this data: associativity of
|
||
|
composition, identity law for the identity morphism. These are standard
|
||
|
requirements for being a category as can be found in standard mathematical
|
||
|
expositions 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. We could
|
||
|
relax this requirement, this would give us the notion of higher categorier
|
||
|
(\cite[p. 307]{hott-2013}). For the purpose of this project, however, this
|
||
|
report will restrict itself to 1-categories.
|
||
|
|
||
|
Raw categories satisfying these properties are called a pre-categories.
|
||
|
|
||
|
As a further requirement to be a proper category we require it to be univalent.
|
||
|
This requirement is quite similiar to univalence for types, but we let
|
||
|
isomorphism of objects play the role of equivalence of types. The univalence
|
||
|
criterion is:
|
||
|
%
|
||
|
$$
|
||
|
\isEquiv\ (A \cong B)\ (A \equiv B)\ \idToIso_{A\ B}
|
||
|
$$
|
||
|
%
|
||
|
Note that this is a stronger requirement than:
|
||
|
%
|
||
|
$$
|
||
|
(A \cong B) \simeq (A \equiv B)
|
||
|
$$
|
||
|
%
|
||
|
Which is permissable simply by ``forgetting'' that $\idToIso_{A\ B}$ plays the
|
||
|
role of the equivalence.
|
||
|
|
||
|
With all this in place it is now possible to prove that all the laws are indeed
|
||
|
mere propositions. Most of the proofs simply use the fact that the type of
|
||
|
arrows are sets. This is because most of the laws are a collection of equations
|
||
|
between arrows in the category. And since such a proof does not have any
|
||
|
content, two witnesses must be the same. All the proofs are really quite
|
||
|
mechanical. Lets have a look at one of them: The identity law states that:
|
||
|
%
|
||
|
$$
|
||
|
\prod_{A\ B \tp \Object} \prod_{f \tp A \to B} \id \comp f \equiv f \x f \id \equiv f
|
||
|
$$
|
||
|
%
|
||
|
There are multiple ways to prove this. Perhaps one of the more intuitive proofs
|
||
|
is by way of the following `combinators':
|
||
|
%
|
||
|
$$
|
||
|
\mathit{propPi} \tp \left(\prod_{a \tp A} \isProp\ (P\ a)\right) \to \isProp\ \left(\prod_{a \tp A} P\ a\right)
|
||
|
$$
|
||
|
%
|
||
|
I.e.; pi-types preserve propositionality when the co-domain is always a
|
||
|
proposition.
|
||
|
%
|
||
|
$$
|
||
|
\mathit{propSig} \tp \isProp\ A \to \left(\prod_{a : A} \isProp\ (P\ a)\right) \to \isProp\ \left(\sum_{a \tp A} P\ a\right)
|
||
|
$$
|
||
|
%
|
||
|
I.e.; sigma-types preserve propositionality whenever it's first component is a
|
||
|
proposition, and it's second component is always a proposition for all points of
|
||
|
in the left type.
|
||
|
|
||
|
Defines the basic notion of a category. This definition
|
||
|
closely follows that of [HoTT]: That is, the standard definition of a category
|
||
|
(data; objects, arrows, composition and identity, laws; preservation of identity
|
||
|
and composition) plus the extra condition that it is univalent - namely that you
|
||
|
can get an equality of two objects from an isomorphism.
|
||
|
|
||
|
\subsubsection{Functors}
|
||
|
Defines the notion of a functor - also split up into data and laws.
|
||
|
|
||
|
Propositionality for being a functor.
|
||
|
|
||
|
Composition of functors and the identity functor.
|
||
|
|
||
|
\subsubsection{Products}
|
||
|
Definition of what it means for an object to be a product in a given category.
|
||
|
|
||
|
Definition of what it means for a category to have all products.
|
||
|
|
||
|
\WIP{} Prove propositionality for being a product and having products.
|
||
|
|
||
|
\subsubsection{Exponentials}
|
||
|
Definition of what it means to be an exponential object.
|
||
|
|
||
|
Definition of what it means for a category to have all exponential objects.
|
||
|
|
||
|
\subsubsection{Cartesian closed categories}
|
||
|
Definition of what it means for a category to be cartesian closed; namely that
|
||
|
it has all products and all exponentials.
|
||
|
|
||
|
\subsubsection{Natural transformations}
|
||
|
Definition of transformations\footnote{Maybe this is a name I made up for a
|
||
|
family of morphisms} and the naturality condition for these.
|
||
|
|
||
|
Proof that naturality is a mere proposition and the accompanying equality
|
||
|
principle. Proof that natural transformations are homotopic sets.
|
||
|
|
||
|
The identity natural transformation.
|
||
|
|
||
|
\subsubsection{Yoneda embedding}
|
||
|
|
||
|
The yoneda embedding is typically presented in terms of the category of
|
||
|
categories (cf. Awodey) \emph however this is not stricly needed - all we need
|
||
|
is what would be the exponential object in that category - this happens to be
|
||
|
functors and so this is how we define the yoneda embedding.
|
||
|
|
||
|
\subsubsection{Monads}
|
||
|
|
||
|
Defines an equivalence between these two formulations of a monad:
|
||
|
|
||
|
\subsubsubsection{Monoidal monads}
|
||
|
|
||
|
Defines the standard monoidal representation of a monad:
|
||
|
|
||
|
An endofunctor with two natural transformations (called ``pure'' and ``join'')
|
||
|
and some laws about these natural transformations.
|
||
|
|
||
|
Propositionality proofs and equality principle is provided.
|
||
|
|
||
|
\subsubsubsection{Kleisli monads}
|
||
|
|
||
|
A presentation of monads perhaps more familiar to a functional programer:
|
||
|
|
||
|
A map on objects and two maps on morphisms (called ``pure'' and ``bind'') and
|
||
|
some laws about these maps.
|
||
|
|
||
|
Propositionality proofs and equality principle is provided.
|
||
|
|
||
|
\subsubsubsection{Voevodsky's construction}
|
||
|
|
||
|
Provides construction 2.3 as presented in an unpublished paper by Vladimir
|
||
|
Voevodsky. This construction is similiar to the equivalence provided for the two
|
||
|
preceding formulations
|
||
|
\footnote{ TODO: I would like to include in the thesis some motivation for why
|
||
|
this construction is particularly interesting.}
|
||
|
|
||
|
\subsubsection{Homotopy sets}
|
||
|
The typical category of sets where the objects are modelled by an Agda set
|
||
|
(henceforth ``$\Type$'') at a given level is not a valid category in this cubical
|
||
|
settings, we need to restrict the types to be those that are homotopy sets. Thus
|
||
|
the objects of this category are:
|
||
|
%
|
||
|
$$\hSet_\ell \defeq \sum_{A \tp \MCU_\ell} \isSet\ A$$
|
||
|
%
|
||
|
The definition of univalence for categories I have defined is:
|
||
|
%
|
||
|
$$\isEquiv\ (\hA \equiv \hB)\ (\hA \cong \hB)\ \idToIso$$
|
||
|
%
|
||
|
Where $\hA and \hB$ denote objects in the category. Note that this is stronger
|
||
|
than
|
||
|
%
|
||
|
$$(\hA \equiv \hB) \simeq (\hA \cong \hB)$$
|
||
|
%
|
||
|
Because we require that the equivalence is constructed from the witness to:
|
||
|
%
|
||
|
$$\id \comp f \equiv f \x f \comp \id \equiv f$$
|
||
|
%
|
||
|
And indeed univalence does not follow immediately from univalence for types:
|
||
|
%
|
||
|
$$(A \equiv B) \simeq (A \simeq B)$$
|
||
|
%
|
||
|
Because $A\ B \tp \Type$ whereas $\hA\ \hB \tp \hSet$.
|
||
|
|
||
|
For this reason I have shown that this category satisfies the following
|
||
|
equivalent formulation of being univalent:
|
||
|
%
|
||
|
$$\prod_{A \tp hSet} \isContr \left( \sum_{X \tp hSet} A \cong X \right)$$
|
||
|
%
|
||
|
But I have not shown that it is indeed equivalent to my former definition.
|
||
|
\subsubsection{Categories}
|
||
|
Note that this category does in fact not exist. In stead I provide the
|
||
|
definition of the ``raw'' category as well as some of the laws.
|
||
|
|
||
|
Furthermore I provide some helpful lemmas about this raw category. For instance
|
||
|
I have shown what would be the exponential object in such a category.
|
||
|
|
||
|
These lemmas can be used to provide the actual exponential object in a context
|
||
|
where we have a witness to this being a category. This is useful if this library
|
||
|
is later extended to talk about higher categories.
|
||
|
|
||
|
\subsubsection{Functors}
|
||
|
The category of functors and natural transformations. An immediate corrolary is
|
||
|
the set of presheaf categories.
|
||
|
|
||
|
\WIP{} I have not shown that the category of functors is univalent.
|
||
|
|
||
|
\subsubsection{Relations}
|
||
|
The category of relations. \WIP{} I have not shown that this category is
|
||
|
univalent. Not sure I intend to do so either.
|
||
|
|
||
|
\subsubsection{Free category}
|
||
|
The free category of a category. \WIP{} I have not shown that this category is
|
||
|
univalent.
|
||
|
|
||
|
\subsection{Current Challenges}
|
||
|
Besides the items marked \WIP{} above I still feel a bit unsure about what to
|
||
|
include in my report. Most of my work so far has been specifically about
|
||
|
developing this library. Some ideas:
|
||
|
%
|
||
|
\begin{itemize}
|
||
|
\item
|
||
|
Modularity properties
|
||
|
\item
|
||
|
Compare with setoid-approach to solve similiar problems.
|
||
|
\item
|
||
|
How to structure an implementation to best deal with types that have no
|
||
|
structure (propositions) and those that do (sets and everything above)
|
||
|
\end{itemize}
|
||
|
%
|
||
|
\subsection{Ideas for future developments}
|
||
|
\subsubsection{Higher categories}
|
||
|
I only have a notion of (1-)categories. Perhaps it would be nice to also
|
||
|
formalize higher categories.
|
||
|
|
||
|
\subsubsection{Hierarchy of concepts related to monads}
|
||
|
In Haskell the type-class Monad sits in a hierarchy atop the notion of a functor
|
||
|
and applicative functors. There's probably a similiar notion in the
|
||
|
category-theoretic approach to developing this.
|
||
|
|
||
|
As I have already defined monads from these two perspectives, it would be
|
||
|
interesting to take this idea even further and actually show how monads are
|
||
|
related to applicative functors and functors. I'm not entirely sure how this
|
||
|
would look in Agda though.
|
||
|
|
||
|
\subsubsection{Use formulation on the standard library}
|
||
|
I also thought it would be interesting to use this library to show certain
|
||
|
properties about functors, applicative functors and monads used in the Agda
|
||
|
Standard library. So I went ahead and tried to show that agda's standard
|
||
|
library's notion of a functor (along with suitable laws) is equivalent to my
|
||
|
formulation (in the category of homotopic sets). I ran into two problems here,
|
||
|
however; the first one is that the standard library's notion of a functor is
|
||
|
indexed by the object map:
|
||
|
%
|
||
|
$$
|
||
|
\Functor \tp (\Type \to \Type) \to \Type
|
||
|
$$
|
||
|
%
|
||
|
Where $\Functor\ F$ has the member:
|
||
|
%
|
||
|
$$
|
||
|
\fmap \tp (A \to B) \to F A \to F B
|
||
|
$$
|
||
|
%
|
||
|
Whereas the object map in my definition is existentially quantified:
|
||
|
%
|
||
|
$$
|
||
|
\Functor \tp \Type
|
||
|
$$
|
||
|
%
|
||
|
And $\Functor$ has these members:
|
||
|
\begin{align*}
|
||
|
F & \tp \Type \to \Type \\
|
||
|
\fmap & \tp (A \to B) \to F A \to F B\}
|
||
|
\end{align*}
|
||
|
%
|