Final touch-up on report and acknowledgments
This commit is contained in:
parent
b992d5a7f2
commit
37a675a84f
1
doc/acknowledgement.tex
Normal file
1
doc/acknowledgement.tex
Normal file
|
@ -0,0 +1 @@
|
||||||
|
\chapter*{Acknowledgements}
|
|
@ -1,53 +1,53 @@
|
||||||
\chapter{Conclusion}
|
\chapter{Conclusion}
|
||||||
This thesis highlighted some issues with the standard inductive
|
This thesis highlighted some issues with the standard inductive
|
||||||
definition of propositional equality used in Agda. Functional
|
definition of propositional equality used in Agda. Functional
|
||||||
extensionality and univalence are examples of two propositions not
|
extensionality and univalence are examples of two propositions not
|
||||||
admissible in Intensional Type Theory (ITT). This has a big impact on
|
admissible in Intensional Type Theory (ITT). This has a big impact on
|
||||||
what is provable and the reusability of proofs. This issue is overcome
|
what is provable and the reusability of proofs. This issue is
|
||||||
with an extension to Agda's type system called Cubical Agda. With
|
overcome with an extension to Agda's type system called Cubical Agda.
|
||||||
Cubical Agda both functional extensionality and univalence are
|
With Cubical Agda both functional extensionality and univalence are
|
||||||
admissible. Cubical Agda is more expressive, but there are certain
|
admissible. Cubical Agda is more expressive, but there are certain
|
||||||
issues that arise that are not present in standard Agda. For one thing
|
issues that arise that are not present in standard Agda. For one
|
||||||
Agda enjoys Uniqueness of Identity Proofs (UIP) though a flag exists
|
thing Agda enjoys Uniqueness of Identity Proofs (UIP) though a flag
|
||||||
to turn this off, which is the case in Cubical Agda. In stead
|
exists to turn this off. This feature is not present in Cubical Agda.
|
||||||
there exists a hierarchy of types with increasing \nomen{homotopical
|
Rather than having unique identity proofs cubical Agda gives rise to a
|
||||||
|
hierarchy of types with increasing \nomen{homotopical
|
||||||
structure}{homotopy levels}. It turns out to be useful to built the
|
structure}{homotopy levels}. It turns out to be useful to built the
|
||||||
formalization with this hierarchy in mind as it can simplify proofs
|
formalization with this hierarchy in mind as it can simplify proofs
|
||||||
considerably. Another issue one must overcome in Cubical Agda is when
|
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
|
a type has a field whose type depends on a previous field. In this
|
||||||
case paths between such types will be heterogeneous paths. This
|
case paths between such types will be heterogeneous paths. In
|
||||||
problem is related to Cubical Agda not having the K-rule. In practice
|
practice it turns out to be considerably more difficult to work with
|
||||||
it turns out to be considerably more difficult to work heterogeneous
|
heterogeneous paths than with homogeneous paths. The thesis
|
||||||
paths than with homogeneous paths. The thesis demonstrated some
|
demonstrated the application of some techniques to overcome these
|
||||||
techniques to overcome these difficulties, such as based
|
difficulties, such as based path induction.
|
||||||
path-induction.
|
|
||||||
|
|
||||||
This thesis formalized some of the core concepts from category theory
|
This thesis formalizes some of the core concepts from category theory
|
||||||
including; categories, functors, products, exponentials, Cartesian
|
including; categories, functors, products, exponentials, Cartesian
|
||||||
closed categories, natural transformations, the yoneda embedding,
|
closed categories, natural transformations, the yoneda embedding,
|
||||||
monads and more. Category theory is an interesting case-study for the
|
monads and more. Category theory is an interesting case study for the
|
||||||
application of Cubical Agda for two reasons in particular: Because
|
application of cubical Agda for two reasons in particular: Because
|
||||||
category theory is the study of abstract algebra of functions, meaning
|
category theory is the study of abstract algebra of functions, meaning
|
||||||
that functional extensionality is particularly relevant. Another
|
that functional extensionality is particularly relevant. Another
|
||||||
reason is that in category theory it is commonplace to identify
|
reason is that in category theory it is commonplace to identify
|
||||||
isomorphic structures and univalence allows for making this notion
|
isomorphic structures. Univalence allows for making this notion
|
||||||
precise. This thesis also demonstrated another technique that is
|
precise. This thesis also demonstrated another technique that is
|
||||||
common in category theory; namely to define categories to prove
|
common in category theory; namely to define categories to prove
|
||||||
properties of other structures. Specifically a category was defined
|
properties of other structures. Specifically a category was defined
|
||||||
to demonstrate that any two product objects in a category are
|
to demonstrate that any two product objects in a category are
|
||||||
isomorphic. Furthermore the thesis showed two formulations of monads
|
isomorphic. Furthermore the thesis showed two formulations of monads
|
||||||
and proved that they indeed are equivalent: Namely monads in the
|
and proved that they indeed are equivalent: Namely monads in the
|
||||||
monoidal- and Kleisli- form. The monoidal formulation is more typical
|
monoidal- and Kleisli- form. The monoidal formulation is more typical
|
||||||
to category theoretic formulations and the Kleisli formulation will be
|
to category theoretic formulations and the Kleisli formulation will be
|
||||||
more familiar to functional programmers. It would have been very
|
more familiar to functional programmers. It would have been very
|
||||||
difficult to make a similar proof with setoids. In the formulation we
|
difficult to make a similar proof with setoids and the proof would be
|
||||||
also saw how paths can be used to extract functions. A path between
|
very difficult to read. In the formulation we also saw how paths can
|
||||||
two types induce an isomorphism between the two types. This
|
be used to extract functions. A path between two types induce an
|
||||||
e.g. permits developers to write a monad instance for a given type
|
isomorphism between the two types. This e.g.\ permits developers to
|
||||||
using the Kleisli formulation. By transporting along the path between
|
write a monad instance for a given type using the Kleisli formulation.
|
||||||
the monoidal- and Kleisli- formulation one can reuse all the
|
By transporting along the path between the monoidal- and Kleisli-
|
||||||
operations and results shown for monoidal- monads in the context of
|
formulation one can reuse all the operations and results shown for
|
||||||
kleisli monads.
|
monoidal- monads in the context of kleisli monads.
|
||||||
%%
|
%%
|
||||||
%% problem with inductive type
|
%% problem with inductive type
|
||||||
%% overcome with cubical
|
%% overcome with cubical
|
||||||
|
|
|
@ -1,113 +1,113 @@
|
||||||
\chapter{Perspectives}
|
\chapter{Perspectives}
|
||||||
\section{Discussion}
|
\section{Discussion}
|
||||||
In the previous chapter the practical aspects of proving things in
|
In the previous chapter the practical aspects of proving things in
|
||||||
Cubical Agda were highlighted. I also demonstrated the usefulness of
|
Cubical Agda were highlighted. I also demonstrated the usefulness of
|
||||||
separating ``laws'' from ``data''. One of the reasons for this is that
|
separating ``laws'' from ``data''. One of the reasons for this is that
|
||||||
dependencies within types can lead to very complicated goals. One
|
dependencies within types can lead to very complicated goals. One
|
||||||
technique for alleviating this was to prove that certain types are
|
technique for alleviating this was to prove that certain types are
|
||||||
mere propositions.
|
mere propositions.
|
||||||
|
|
||||||
\subsection{Computational properties}
|
\subsection{Computational properties}
|
||||||
The new contribution of cubical Agda is that it has a constructive
|
The new contribution of cubical Agda is that it has a constructive
|
||||||
proof of functional extensionality\index{functional extensionality}
|
proof of functional extensionality\index{functional extensionality}
|
||||||
and univalence\index{univalence}. This means that in particular that
|
and univalence\index{univalence}. This means that in particular that
|
||||||
the type checker can reduce terms defined with these theorems. So one
|
the type checker can reduce terms defined with these theorems. So one
|
||||||
interesting result of this development is how much this influenced the
|
interesting result of this development is how much this influenced the
|
||||||
development. In particular having a functional extensionality that
|
development. In particular having a functional extensionality that
|
||||||
``computes'' should simplify some proofs.
|
``computes'' should simplify some proofs.
|
||||||
|
|
||||||
I have tested this theory by using a feature of Agda where one can
|
I have tested this by using a feature of Agda where one can mark
|
||||||
mark certain bindings as being \emph{abstract}. This means that the
|
certain bindings as being \emph{abstract}. This means that the
|
||||||
type-checker will not try to reduce that term further when
|
type-checker will not try to reduce that term further during type
|
||||||
type-checking is performed. I tried making univalence and functional
|
checking. I tried making univalence and functional extensionality
|
||||||
extensionality abstract. It turns out that the conversion behaviour of
|
abstract. It turns out that the conversion behaviour of univalence is
|
||||||
univalence is not used anywhere. For functional extensionality there
|
not used anywhere. For functional extensionality there are two places
|
||||||
are two places in the whole solution where the reduction behaviour is
|
in the whole solution where the reduction behaviour is used to
|
||||||
used to simplify some proofs. This is in showing that the maps between
|
simplify some proofs. This is in showing that the maps between the
|
||||||
the two formulations of monads are inverses. See the notes in this
|
two formulations of monads are inverses. See the notes in this
|
||||||
module:
|
module:
|
||||||
%
|
%
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\sourcelink{Cat.Category.Monad.Voevodsky}
|
\sourcelink{Cat.Category.Monad.Voevodsky}
|
||||||
\end{center}
|
\end{center}
|
||||||
%
|
%
|
||||||
I've also put this in a source listing in \ref{app:abstract-funext}. I
|
|
||||||
will not reproduce it in full here as the type is quite involved. The
|
|
||||||
method used to find in what places the computational behaviour of
|
|
||||||
these proofs are needed has the caveat of only working for places that
|
|
||||||
directly or transitively uses these two proofs. Fortunately though the
|
|
||||||
code is structured in such a way that this should be the case.
|
|
||||||
Nonetheless it is quite surprising that this computational behaviours
|
|
||||||
is not used more widely in the formalization.
|
|
||||||
|
|
||||||
Barring this, however, the computational behaviour of paths can still
|
I will not reproduce it in full here as the type is quite involved. In
|
||||||
be useful. E.g. if a programmer want's to reuse functions that operate
|
stead I have put this in a source listing in \ref{app:abstract-funext}.
|
||||||
on a monoidal monads to work with a monad in the Kleisli form that
|
The method used to find in what places the computational behaviour of
|
||||||
this programmer has specified. To make this idea concrete, say we are
|
these proofs are needed has the caveat of only working for places that
|
||||||
|
directly or transitively uses these two proofs. Fortunately though
|
||||||
|
the code is structured in such a way that this is the case. So in
|
||||||
|
conclusion the way I have structured these proofs means that the
|
||||||
|
computational behaviour of functional extensionality and univalence
|
||||||
|
has not been so relevant.
|
||||||
|
|
||||||
|
Barring this the computational behaviour of paths can still be useful.
|
||||||
|
E.g.\ if a programmer wants to reuse functions that operate on a
|
||||||
|
monoidal monads to work with a monad in the Kleisli form that the
|
||||||
|
programmer has specified. To make this idea concrete, say we are
|
||||||
given some function $f \tp \Kleisli \to T$ having a path between $p
|
given some function $f \tp \Kleisli \to T$ having a path between $p
|
||||||
\tp \Monoidal \equiv \Kleisli$ induces a map $\coe\ p \tp \Monoidal
|
\tp \Monoidal \equiv \Kleisli$ induces a map $\coe\ p \tp \Monoidal
|
||||||
\to \Kleisli$. We can compose $f$ with this map to get $f \comp
|
\to \Kleisli$. We can compose $f$ with this map to get $f \comp
|
||||||
\coe\ p \tp \Monoidal \to T$. Of course, since that map was
|
\coe\ p \tp \Monoidal \to T$. Of course, since that map was
|
||||||
constructed with an isomorphism these maps already exist and could be
|
constructed with an isomorphism these maps already exist and could be
|
||||||
used directly. So this is arguably only interesting when one wants to
|
used directly. So this is arguably only interesting when one also
|
||||||
prove properties of such functions.
|
wants to prove properties of applying such functions.
|
||||||
|
|
||||||
\subsection{Reusability of proofs}
|
\subsection{Reusability of proofs}
|
||||||
The previous example illustrate how univalence unifies two otherwise
|
The previous example illustrate how univalence unifies two otherwise
|
||||||
disparate areas: The category-theoretic study of monads; and monads as
|
disparate areas: The category-theoretic study of monads; and monads as
|
||||||
in functional programming. Univalence thus allows one to reuse proofs.
|
in functional programming. Univalence thus allows one to reuse proofs.
|
||||||
You could say that univalence gives the developer two proofs for the
|
You could say that univalence gives the developer two proofs for the
|
||||||
price of one. As an illustration of this I proved that monads are
|
price of one. As an illustration of this I proved that monads are
|
||||||
groupoids. I initially proved this for the Kleisli
|
groupoids. I initially proved this for the Kleisli
|
||||||
formulation\footnote{Actually doing this directly turned out to be
|
formulation\footnote{Actually doing this directly turned out to be
|
||||||
tricky as well, so I defined an equivalent formulation which was not
|
tricky as well, so I defined an equivalent formulation which was not
|
||||||
formulated with a record, but purely with $\sum$-types.}. Since the
|
formulated with a record, but purely with $\sum$-types.}. Since the
|
||||||
two formulations are equal under univalence, substitution directly
|
two formulations are equal under univalence, substitution directly
|
||||||
gives us that this also holds for the monoidal formulation. This of
|
gives us that this also holds for the monoidal formulation. This of
|
||||||
course generalizes to any family $P \tp 𝒰 → 𝒰$ where $P$ is inhabited
|
course generalizes to any family $P \tp 𝒰 → 𝒰$ where $P$ is inhabited
|
||||||
at either formulation (i.e.\ either $P\ \Monoidal$ or $P\ \Kleisli$
|
at either formulation (i.e.\ either $P\ \Monoidal$ or $P\ \Kleisli$
|
||||||
holds).
|
holds).
|
||||||
|
|
||||||
The introduction (section \S\ref{sec:context}) mentioned an often
|
The introduction (section \S\ref{sec:context}) mentioned that a
|
||||||
employed-technique for enabling extensional equalities is to use the
|
typical way of getting access to functional extensionality is to work
|
||||||
setoid-interpretation. Nowhere in this formalization has this been
|
with setoids. Nowhere in this formalization has this been necessary,
|
||||||
necessary, $\Path$ has been used globally in the project as
|
$\Path$ has been used globally in the project for propositional
|
||||||
propositional equality. One interesting place where this becomes
|
equality. One interesting place where this becomes apparent is in
|
||||||
apparent is in interfacing with the Agda standard library. Multiple
|
interfacing with the Agda standard library. Multiple definitions in
|
||||||
definitions in the Agda standard library have been designed with the
|
the Agda standard library have been designed with the
|
||||||
setoid-interpretation in mind. E.g. the notion of ``unique
|
setoid-interpretation in mind. E.g.\ the notion of \emph{unique
|
||||||
existential'' is indexed by a relation that should play the role of
|
existential} is indexed by a relation that should play the role of
|
||||||
propositional equality. Likewise for equivalence relations, they are
|
propositional equality. Equivalence relations are likewise indexed,
|
||||||
indexed, not only by the actual equivalence relation, but also by
|
not only by the actual equivalence relation but also by another
|
||||||
another relation that serve as propositional equality.
|
relation that serve as propositional equality.
|
||||||
%% Unfortunately we cannot use the definition of equivalences found in
|
%% Unfortunately we cannot use the definition of equivalences found in
|
||||||
%% the standard library to do equational reasoning directly. The
|
%% the standard library to do equational reasoning directly. The
|
||||||
%% reason for this is that the equivalence relation defined there must
|
%% reason for this is that the equivalence relation defined there must
|
||||||
%% be a homogenous relation, but paths are heterogeneous relations.
|
%% be a homogenous relation, but paths are heterogeneous relations.
|
||||||
|
|
||||||
In the formalization at present a significant amount of energy has
|
In the formalization at present a significant amount of energy has
|
||||||
been put towards proving things that would not have been needed in
|
been put towards proving things that would not have been needed in
|
||||||
classical Agda. The proofs that some given type is a proposition were
|
classical Agda. The proofs that some given type is a proposition were
|
||||||
provided as a strategy to simplify some otherwise very complicated
|
provided as a strategy to simplify some otherwise very complicated
|
||||||
proofs (e.g. \ref{eq:proof-prop-IsPreCategory}
|
proofs (e.g.\ \ref{eq:proof-prop-IsPreCategory}
|
||||||
and \ref{eq:productPath}). Often these proofs would not be this
|
and \ref{eq:productPath}). Often these proofs would not be this
|
||||||
complicated. If the J-rule holds definitionally the proof-assistant
|
complicated. If the J-rule holds definitionally the proof-assistant
|
||||||
can help simplify these goals considerably. The lack of the J-rule has
|
can help simplify these goals considerably. The lack of the J-rule has
|
||||||
a significant impact on the complexity of these kinds of proofs.
|
a significant impact on the complexity of these kinds of proofs.
|
||||||
|
|
||||||
\TODO{Universe levels.}
|
|
||||||
|
|
||||||
\subsection{Motifs}
|
\subsection{Motifs}
|
||||||
An oft-used technique in this development is using based path
|
An oft-used technique in this development is using based path
|
||||||
induction to prove certain properties. One particular challenge that
|
induction to prove certain properties. One particular challenge that
|
||||||
arises when doing so is that Agda is not able to automatically infer
|
arises when doing so is that Agda is not able to automatically infer
|
||||||
the family that one wants to do induction over. For instance in the
|
the family that one wants to do induction over. For instance in the
|
||||||
proof $\var{sym}\ (\var{sym}\ p) ≡ p$ from \ref{eq:sym-invol} the
|
proof $\var{sym}\ (\var{sym}\ p) ≡ p$ from \ref{eq:sym-invol} the
|
||||||
family that we chose to do induction over was $D\ b'\ p' \defeq
|
family that we chose to do induction over was $D\ b'\ p' \defeq
|
||||||
\var{sym}\ (\var{sym}\ p') ≡ p'$. However, if one interactively tries
|
\var{sym}\ (\var{sym}\ p') ≡ p'$. However, if one interactively tries
|
||||||
to give this hole, all the information that Agda can provide is that
|
to give this hole, all the information that Agda can provide is that
|
||||||
one must provide an element of $𝒰$. Agda could be more helpful in this
|
one must provide an element of $𝒰$. Agda could be more helpful in this
|
||||||
context, perhaps even infer this family in some situations. In this
|
context, perhaps even infer this family in some situations. In this
|
||||||
very simple example this is of course not a big problem, but there are
|
very simple example this is of course not a big problem, but there are
|
||||||
examples in the source code where this gets more involved.
|
examples in the source code where this gets more involved.
|
||||||
|
|
||||||
|
@ -115,26 +115,25 @@ examples in the source code where this gets more involved.
|
||||||
\subsection{Compiling Cubical Agda}
|
\subsection{Compiling Cubical Agda}
|
||||||
\label{sec:compiling-cubical-agda}
|
\label{sec:compiling-cubical-agda}
|
||||||
Compilation of program written in Cubical Agda is currently not
|
Compilation of program written in Cubical Agda is currently not
|
||||||
supported. One issue here is that the backends does not provide an
|
supported. One issue here is that the backends does not provide an
|
||||||
implementation for the cubical primitives (such as the path-type).
|
implementation for the cubical primitives (such as the path-type).
|
||||||
This means that even though the path-type gives us a computational
|
This means that even though the path-type gives us a computational
|
||||||
interpretation of functional extensionality, univalence, transport,
|
interpretation of functional extensionality, univalence, transport,
|
||||||
etc., we do not have a way of actually using this to compile our
|
etc., we do not have a way of actually using this to compile our
|
||||||
programs that use these primitives. It would be interesting to see
|
programs that use these primitives. It would be interesting to see
|
||||||
practical applications of this. The path between monads that this
|
practical applications of this.
|
||||||
library exposes could provide one particularly interesting case-study.
|
|
||||||
|
|
||||||
\subsection{Higher inductive types}
|
|
||||||
This library has not explored the usefulness of higher inductive types
|
|
||||||
in the context of Category Theory.
|
|
||||||
|
|
||||||
\subsection{Initiality conjecture}
|
|
||||||
A fellow student here at Chalmers, Andreas Källberg, is currently
|
|
||||||
working on proving the initiality conjecture\TODO{Citation}. He will
|
|
||||||
be using this library to do so.
|
|
||||||
|
|
||||||
\subsection{Proving laws of programs}
|
\subsection{Proving laws of programs}
|
||||||
Another interesting thing would be to use the Kleisli formulation of
|
Another interesting thing would be to use the Kleisli formulation of
|
||||||
monads to prove properties of functional programs. The existence of
|
monads to prove properties of functional programs. The existence of
|
||||||
univalence will make it possible to re-use proofs stated in terms of
|
univalence will make it possible to re-use proofs stated in terms of
|
||||||
the monoidal formulation in this setting.
|
the monoidal formulation in this setting.
|
||||||
|
|
||||||
|
%% \subsection{Higher inductive types}
|
||||||
|
%% This library has not explored the usefulness of higher inductive types
|
||||||
|
%% in the context of Category Theory.
|
||||||
|
|
||||||
|
\subsection{Initiality conjecture}
|
||||||
|
A fellow student at Chalmers, Andreas Källberg, is currently working
|
||||||
|
on proving the initiality conjecture. He will be using this library
|
||||||
|
to do so.
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -207,13 +207,13 @@ with \nomenindex{extensional sets} $(X, \sim)$. That is a type $X \tp
|
||||||
\MCU$ and an equivalence relation $\sim\ \tp X \to X \to \MCU$ on that
|
\MCU$ and an equivalence relation $\sim\ \tp X \to X \to \MCU$ on that
|
||||||
type. Under the setoid interpretation the equivalence relation serve
|
type. Under the setoid interpretation the equivalence relation serve
|
||||||
as a sort of ``local'' propositional equality. Since the developer
|
as a sort of ``local'' propositional equality. Since the developer
|
||||||
gets to pick this relation it is not a\~priori a congruence
|
gets to pick this relation it is not a~priori a congruence
|
||||||
relation. So this must be verified manually by the developer.
|
relation. So this must be verified manually by the developer.
|
||||||
Furthermore, functions between different setoids must be shown to be
|
Furthermore, functions between different setoids must be shown to be
|
||||||
setoid homomorphism, that is; they preserve the relation.
|
setoid homomorphism, that is; they preserve the relation.
|
||||||
|
|
||||||
This approach has other drawbacks; it does not satisfy all
|
This approach has other drawbacks; it does not satisfy all
|
||||||
propositional equalities of type theory a priori. That is, the
|
propositional equalities of type theory a\~priori. That is, the
|
||||||
developer must manually show that e.g.\ the relation is a congruence.
|
developer must manually show that e.g.\ the relation is a congruence.
|
||||||
Equational proofs $a \sim_{X} b$ are in some sense `local' to the
|
Equational proofs $a \sim_{X} b$ are in some sense `local' to the
|
||||||
extensional set $(X , \sim)$. To e.g.\ prove that $x ∼ y → f\ x ∼
|
extensional set $(X , \sim)$. To e.g.\ prove that $x ∼ y → f\ x ∼
|
||||||
|
|
Loading…
Reference in a new issue