Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
% (find-angg "LATEX/2009dnc-in-coq.tex")
% (find-dn4ex "edrx08.sty")
% (find-angg ".emacs.templates" "s2008a")
% (defun c () (interactive) (find-zsh "cd ~/LATEX/ && ~/dednat4/dednat41 2009dnc-in-coq.tex && latex    2009dnc-in-coq.tex"))
% (defun c () (interactive) (find-zsh "cd ~/LATEX/ && ~/dednat4/dednat41 2009dnc-in-coq.tex && pdflatex 2009dnc-in-coq.tex"))
% (eev "cd ~/LATEX/ && Scp 2009dnc-in-coq.{dvi,pdf} edrx@angg.twu.net:slow_html/LATEX/")
% (defun d () (interactive) (find-dvipage "~/LATEX/2009dnc-in-coq.dvi"))
% (find-dvipage "~/LATEX/2009dnc-in-coq.dvi")
% (find-pspage  "~/LATEX/2009dnc-in-coq.pdf")
% (find-pspage  "~/LATEX/2009dnc-in-coq.ps")
% (find-zsh0 "cd ~/LATEX/ && dvips -D 300 -o 2009dnc-in-coq.ps 2009dnc-in-coq.dvi")
% (find-zsh0 "cd ~/LATEX/ && dvips -D 600 -P pk -o 2009dnc-in-coq.ps 2009dnc-in-coq.dvi && ps2pdf 2009dnc-in-coq.ps 2009dnc-in-coq.pdf")
% (find-zsh0 "cd ~/LATEX/ && dvips -D 300 -o tmp.ps tmp.dvi")
% (find-pspage  "~/LATEX/tmp.ps")
% (ee-cp "~/LATEX/2009dnc-in-coq.pdf" (ee-twupfile "LATEX/2009dnc-in-coq.pdf") 'over)
% (ee-cp "~/LATEX/2009dnc-in-coq.pdf" (ee-twusfile "LATEX/2009dnc-in-coq.pdf") 'over)
% (eev "Scp ~/LATEX/2009dnc-in-coq.pdf edrx@angg.twu.net:slow_html/LATEX/")

% «.convention»	(to "convention")
% «.yoneda»	(to "yoneda")


% \documentclass[oneside]{book}
% \documentclass[a4paper,12pt]{article}
\documentclass[a4paper]{article}
\usepackage{indentfirst}

\usepackage[latin1]{inputenc}
\usepackage{edrx08}       % (find-dn4ex "edrx08.sty")
%L process "edrx08.sty"  -- (find-dn4ex "edrx08.sty")
\input edrxheadfoot.tex   % (find-dn4ex "edrxheadfoot.tex")
\begin{document}

\input 2009dnc-in-coq.dnt

%*
% (eedn4-51-bounded)

%Index of the slides:
%\msk
% To update the list of slides uncomment this line:
%\makelos{tmp.los}
% then rerun LaTeX on this file, and insert the contents of "tmp.los"
% below, by hand (i.e., with "insert-file"):
% (find-fline "tmp.los")
% (insert-file "tmp.los")

\def\Cod{¦{Cod}}
\def\Dom{¦{Dom}}
\def\Cod{\operatorname{Cod}}
\def\Dom{\operatorname{Dom}}
\def\wit{Ðw}
\def\Wits{ÐW}
\def\welld{Ð{wd}}
\def\Proofs{Ð{Proofs}}
\def\squigto{\rightsquigarrow}
\def\squigbij{\leftrightsquigarrow}
\def\Sets{{Ð{Sets}}}
\def\Q{\mathbb{Q}}
\def\pded#1{\begin{pmatrix}\ded{#1}\end{pmatrix}}
\def\sm#1{\begin{smallmatrix}#1\end{smallmatrix}}

% (find-es "tex" "llangle-and-rrangle")
% (find-dn4ex "edrx08.sty" "ttchars")
% (find-symbolspage 54 "\\llangle")
% (find-symbolstext    "\\llangle")
% http://ubuntuforums.org/archive/index.php/t-722871.html
\def\llangle{\langle\!\langle}
\def\rrangle{\rangle\!\rangle}
\def\angg#1{\llangle#1\rrangle}
\def\myotherttchars{
  \def«{\ttchar{$\llangle$}}
  \def»{\ttchar{$\rrangle$}}
  }
\def\myttchars{\basicttchars\myotherttchars}

\widemtos


\section{Introduction}
\label{introduction}



How do we formalize a proof in Category Theory? What is the correct
level of detail? Which entities should we introduce first?

Well, this depends on our target audience; if we are speaking to a
Category Theorist then we may start by saying just, for example, ``let
$f$ be a morphism'', and it will be understood that we have two
objects, $\Dom f$ and $\Cod f$, belonging to the same category --- at
this point unnamed --- and that $f$ goes from $\Dom f$ to $\Cod f$; if
later we say $f: A \to B$ or $A \ton{f} B$ then we will be giving
better (and shorter) names for $\Dom f$ and $\Cod f$, but the category
where $A$ and $B$ live may remain unnamed for a while more...

% rather than to a human
% (find-es "coq" "email-about-7-uples")

If we are talking to a proof assistant --- Coq, say --- instead of to
a human then we are forced to declare our entities in a certain order,
and to name all of them. For example:
%
{% \myttchars
% \footnotesize
\begin{verbatim}
  Variable CatC : Categories.
  let (C_0, Hom_C, id_C, o_C, idL_C, idR_C, assoc_C) := CatC in
    Variable A B : C_0, f : Hom_C A B.
    ...
  end.
\end{verbatim}
}

In this note we will show how to formalize some constructions and
proofs in a proof assistant in a way that:

\msk

1) lets us choose just a very few names,

2) lets us use names that are very close to a certain graphical
notation,

3) lets us split our constructions and proofs in two layers, or parts:
a ``syntactical'' part, that must necessarily come first, and a
``logical'' part,

4) lets us build easily dictionaries between several standard
notations.

\msk

We will say that a construction (or proof) that has both its
syntactical part and its logical part is happening in the ``real
world''; by dropping its logical part and keeping just its syntactical
part we obtain a corresponding construction in the ``syntactical
world''. We will call this passage from the real world to the
syntactical world a ``projection'' --- as projections discard some
information (intuitively coordinates, or components) and forget some
distinctions. The opposite operation is a ``lifting'': we may start
with a syntactical construction or proof, and then try to lift that to
the real world. The ``projection'' direction is easy, and we can
always be done (section \ref{abcats}; explain abelian categories, and
which ``always'' is that); the ``lifting'' direction is hard, and I
don't even know how to characterize when a given lifting can be done;
see the list of problems in section \ref{future}.

The plan of this paper is as follows. In section \ref{cats-in-coq} we
define ``category'', ``protocategory'', ``isomorphism'',
``proto-isomorphism'', etc, in the right way (for our purposes!). In
section \ref{dnc-in-coq} we explain a trick to make Coq accept our
notation; in section \ref{yoneda} we present an example: a syntactical
proof of the Yoneda Lemma. In section \ref{nd-for-cats}. we present a
system of Natural Deduction for (proto-)categories, and in section
\ref{nd-for-dt} we sketch how it can be extended to a system of
Natural Deduction for dependent types. Section \ref{future} discusses
open problems and directions for future work.



\section{Downcasing Functors}
\label{downcasing-functors}

\begin{quote}
  {\sl Fix an object $A$ of $\Set$. Let $(A×)$ be the functor that takes
    each object $B$ to $A×B$.}
\end{quote}

Why do we say ``{\sl the}'' functor in the sentence above? A functor,
$F$, is composed of an action on objects, $F_0$, and an action on
morphisms, $F_1$ --- plus some ``assertions'', that we will discuss
soon (section \ref{downcasing-assertions}) ---; the description above
says only that $F_0$ is $B \mto A×B$, i.e., $ðB¨\Sets.A×B$. In a first
moment we only know that $F_1$ is ``obvious''. How do we deduce it?

Let's draw a diagram. For a morphism $f:B \to C$ in $\Set$ we have
%
%D diagram dncf1
%D 2Dx     100       +30     +25       +30    +25     +30
%D 2D          F_0 
%D 2D  100 B |-----> F_0B    {B} |---> A×B    b ====> a,b
%D 2D      |          -       |         |     -        -
%D 2D      |   |-->   |       |   |-->  |     |  |->   |
%D 2D      v          v       v         v     v        v
%D 2D  +30 C |-----> F_0C    {C} |---> A×C    c ====> a,c
%D 2D
%D (( B F_0B  C F_0C
%D    @ 0 @ 1 |-> .plabel= a F_0
%D    @ 0 @ 2  -> .plabel= l f
%D    @ 1 @ 3  -> .plabel= r F_0f
%D    @ 2 @ 3 |-> .plabel= b F_0
%D    @ 0 @ 3 harrownodes nil 20 nil |->
%D ))
%D (( {B} A×B  {C} A×C
%D    @ 0 @ 1 |-> .plabel= a (A×)_0
%D    @ 0 @ 2  -> .plabel= l f
%D    @ 1 @ 3  -> .plabel= r A×f
%D    @ 2 @ 3 |-> .plabel= b (A×)_0
%D    @ 0 @ 3 harrownodes nil 20 nil |->
%D ))
%D (( b a,b  c a,c
%D    @ 0 @ 1  =>
%D    @ 0 @ 2 |->
%D    @ 1 @ 3 |->
%D    @ 2 @ 3  =>
%D    @ 0 @ 3 harrownodes nil 20 nil |->
%D ))
%D enddiagram
%D
$$\diag{dncf1}$$

The square at the right is the downcased version of the middle square.
The morphism $f$, a function, takes each point of $B$, $b$, to a point
of $C$, $c := f(b)$.

The notation $b \mto c$ --- instead of $b \mto f(b)$ --- is an
extrapolation of the the convention used by physicists. Given a
trajectory, $q(t) = (x(t), y(t), z(t))$, and two instants, $t_0$ and
$t_1$, physicists define by default that $x_0 = x(t_0)$, $q_0 = (x_0,
y_0, z_0)$, and so on, and sometimes $x=x(t)$, $y=y(t)$, $z=z(t)$,
$q=(x,y,z)$. Instead of defining lots of rules for default meanings we
will do domething else.

Our input to Coq will be filtered through a simple preprocessor that
allows ``long names'' --- downcasings, plus much more (maybe {\sl too
  much} more). Let's see an example:

% (find-es "tex" "verbatimbox")
% (find-dn4ex "edrx08.sty" "ttchars")
% (find-gregsymbolspage 1)
% (find-texbookpage 1)
% (find-texbookpage (+ 11 469) "\\langle")
% (find-texbookpage (+ 11 146) "\\langle")

\bsk

{\myttchars
\begin{verbbox}
a := proj1 «a,b»
b := proj2 «a,b»
c := «b|->c» b
«a,c» := (a, c)
...
\end{verbbox}
%
$\begin{array}{ccc}
  \theverbbox[c] & \squigto & \mathtt{foo.v} \\
       \dnto \\
   \mathtt{foo.dnc} \\
   \text{in ascii} \\
  \end{array}
$
}

\bsk

The preprocessor first builds a listing of all the long names (the
$\angg{\ldots}$ things) that appear in a set of \texttt{.dnc} files,
then associates a Coq-friendly identifier of the form \texttt{dnc}{\sl
  nnn} to each of them, then translates all the \texttt{.dnc} files to
\texttt{.v} files.

A modification of that idea allows one to use Coq interactively from
Emacs with a similar kind of long name translation; but this is not
relevant here (see dnc-0.el for details).

For typesetting \texttt{.dnc} files, like in the lower rectangle
above, we use a different kind of translation. We borrow the idea of
``abbreviations'' from Dednat4. In the default abbrev table for
Dednat4, ``\texttt{|->}'' becomes ``\verb|\tnto |'', and
``\verb|\tnto |'' is \verb|\def|'d in the default \LaTeX\ preamble for
Dednat4 as

\begin{center}
\verb.\def\tnto{\overset{\bullet}{\to}}.
\end{center}

The expansion process considers the longest matching abbrev at any
point. So, as ``\verb.|-.'' expands to ``\verb|\vdash |'',
``\verb.P,Q,R|-S.'' expands to ``\verb.P,Q,R\vdash S.'', which
typesets as $P,Q,R\vdash S$; ``\verb.b|->c.'' typesets as $b \mto c$.


% (find-books "__cats/__cats.el" "lawvere")
% (find-lawverecmpage (+ 15  13) "internal diagram of a set")

A remark: downcasings correspond, {\sl very} loosely, to the
``internal view'' of a function (see LawCM, p.14). For example,


%D diagram internal-view
%D 2Dx      100      +50
%D 2D  100 \N -----> \R
%D 2D
%D 2D  +15
%D 2D  +8   0 |----> 0{}
%D 2D  +8   1 |----> 1{}
%D 2D  +8   2 |----> \sqrt{2}
%D 2D  +10  \vdots   \vdots{}
%D 2D  +10  49 |---> 7
%D 2D  +12  n |---> \sqrt{n}
%D 2D
%D (( \N \R -> .plabel= a Ð{sqrt}
%D    0 0{} |->
%D    1 1{} |->
%D    2 \sqrt{2} |->
%D    \vdots place   \vdots{} place
%D    49 7 |->
%D    n \sqrt{n} |->
%D ))
%D enddiagram
%D
$$\diag{internal-view}$$


We are free to use long names as we please. Coherence is desirable but
not mandatory, and we may leave to define what is coherent naming
afterwards --- or never. This, for me, is a charming way to state that
$ýn¨\N.\sqrt{4n}=2\sqrt{n}$:


%D diagram sqrt-4
%D 2Dx      100     +30    +30      +30    +30       +30
%D 2D  100  25 |--> 5      \N ----> \R     n |---> \sqrt{n}
%D 2D       -       -      |         |     -          -
%D 2D       |       |      |         |     |          |
%D 2D       |       |      |         |     |          v
%D 2D  +21  v       v      v         v     v       2\sqrt{n}
%D 2D  +09 100 |--> 10   {}\N ----> \R{}  4n |---> \sqrt{4n}
%D 2D
%D (( 25 5 100 10
%D    @ 0 @ 1 |-> @ 0 @ 2 |-> @ 1 @ 3 |-> @ 2 @ 3 |->
%D ))
%D (( \N \R {}\N \R{}  
%D    @ 0 @ 1 -> .plabel= a \sqrt{\;}
%D    @ 0 @ 2 -> .plabel= l 4·
%D    @ 1 @ 3 -> .plabel= r 2·
%D    @ 2 @ 3 -> .plabel= a \sqrt{\;}
%D ))
%D (( n \sqrt{n} 4n 2\sqrt{n} \sqrt{4n}
%D    @ 0 @ 1 |-> @ 0 @ 2 |-> @ 1 @ 3 |-> @ 2 @ 4 |->
%D ))
%D enddiagram
%D
$$\diag{sqrt-4}$$

In some contexts 25 is so big that $25 \mto 5$ ``can only be'' the
square root; similarly, $25 \to 100$ ``can only be'' multiplication by
4, and so on, and the commutativity of the square can be expressed as:

{\myttchars
\footnotesize
\begin{verbatim}
sqrt :=
  «25|->100» : N -> N = *4
  «100|->10» : N -> R = sqrt
  ...
  «\wd[25|->10]» : ...
\end{verbatim}
}

We will say that $\angg{25 \mto 5 \mto 10}$ and $\angg{25 \mto 100
  \mto 10}$ are two ``natural constructions'' for $\angg{25 \mto 10}$,
and we will use the last notation above, $\angg{welld{25 \mto 10}}$
--- that we pronounce as ``$25 \mto 10$ is well defined'' --- to mean
``all the most obvious natural constructions for $25 \mto 10$ yield
the same result''; these ``most obvious natural constructions'' will
usually be just two, only very rarely three, four, or more; in any
case, the Coq code will expand each $\angg{\welld[\ldots]}$ into an
explicit equality. Note that a $\angg{\welld[\aa]}$ is (usually) much
weaker than a coherence theorem (see \citation{Kromer}, p.\_\_) that
states that {\sl all} possible natural constructions for terms with
the same type as $\aa$ give the same result.

\section{Natural Deduction}
\label{natural-deduction}

\def\fourdicts{
  \begin{array}{rcl}
             a,b &:=& d \\
        b \mto c &:=& f \\
                        \\
               b &:=& '(a,b)       \\
               c &:=& (b \mto c)(b) \\
             a,c &:=& \ang{a,c}     \\
    a,b \mto a,c &:=& ð(a,b).(a,c)  \\
  \end{array}
  }

%:*&*\&*
%:*&**
%:*×*{×}*
%:*<*\langle *
%:*>*\rangle *
%:
%:     f¨B->C                 Q->R      
%:  =============(?)      ============(?)
%:  f^\#¨A×B->A×C         (P&Q)->(P&R)   
%:                                
%:  ^4-functional?        ^4-logical?   
%:  
%:           [P&Q]^1                    [d¨A×B]^1          
%:           -------                    ---------          
%:  [P&Q]^1     Q     Q⊃R   [d¨A×B]^1      'd¨B     f¨B->C 
%:  -------     ----------   ---------     ---------------- 
%:     P            R          d¨A           f('d)¨C      
%:     --------------          -----------------------      
%:         P&R                      <d,f('d)>¨A×C               
%:      ----------1          ------------------------------1
%:      (P&Q⊃P&R)              ðd¨A×B.<d,f('d)>:A×B->A×C
%:                                                         
%:      ^4-logical              ^4-functional                  
%:
$$\ded{4-logical} \qquad \ded{4-functional}$$

%:           [a,b]^1                  [A×B]^1              
%:           -------                  -------               a,b := d
%:   [a,b]^1    b     b|->c   [A×B]^1    B     B->C       b|->c := f
%:   -------    -----------   -------    ----------  
%:       a           c            A           C               a :=  (a,b)     
%:       -------------            -------------               b := '(a,b)     
%:           a,c                      A×C                     c := (b|->c)(b)  
%:         ---------                ---------               a,c := <a,c>       
%:         a,b|->a,c                A×B->A×C          a,b|->a,c := ð(a,b).(a,c)
%:
%:         ^4-dnc                   ^4-sets
%:
$$\cded{4-dnc} \qquad \cded{4-sets}$$

$$\fourdicts$$

The squiggly arrow going downwards is evidently a projection --- it
just drops the rules and the ``term:'' part of each ``term:Type''
declaration --- the upper dotted arrow is the Curry-Howard
isomorphism, and the lower dotted arrow is a downcasing (to the left)
and an uppercasing (to the right).

Amazingly, the ``term:Type'' tree at the upper right can be
reconstructed from the downcased tree at the lower left.

Each bar of the downcased tree can be read as: ``if we know the values
of the terms above the bar then we have a natural construction for the
term below the bar''. This induces a dictionary --- of a new kind, not
of abbrevs as in section \_\_ --- that defines all entries not in the
``leaves'' of the tree as terms:

{\myttchars
\footnotesize
\begin{verbatim}
«b» := proj2 «a,b» etc
\end{verbatim}
}

If we preceed this with declarations for the left names as variables
--- and if we handle the discharges correctly, and if we use
uppercasings to determine the types --- then the root of the tree
becomes a term, whose free variables are the names of the undischarged
leaves.

We will use the symbol `$\equiv$' to mean ``change of notation''. Now,
if we just give the right standard names --- coming from the
``term:Type'' tree in the upper left, in diagram \_\_, --- to the
[undischarged?] variables, we can reconstruct the ``term:Type'' tree,
{\sl exactly}, from the downcased tree.

Let's review what we have done. Natural deduction trees can be read as
terms:
%
$$\ded{4-dnc} \quad \squigto \angg{b} := \angg{b} ...$$
%
and if we add dictionary entries for the standard names for the
variables in a downcased tree,
%
$$\angg{a,b} \equiv p ...$$
%
then the downcased tree can be considered as a shorthand
representation for the full, standard ``term:Type'' tree.

We left a question pending in section \_\_ --- why the action of a
functor $(A×)$ on morphisms, $(A×)_1$, is ``obvious'', and how do we
obtain it?

In the diagram

%D diagram bleu
%D 2Dx     100    +30
%D 2D  100 b ===> a,b
%D 2D      -       -
%D 2D      |       |
%D 2D      v       v
%D 2D  +30 c ===> a,c
%D 2D
%D (( b a,b  c a,c
%D    @ 0 @ 1 => @ 0 @ 2 |-> @ 1 @ 3 |-> @ 2 @ 3 =>
%D    @ 0 @ 3 harrownodes nil 20 nil |->
%D ))
%D enddiagram
%D
$$\diag{bleu}$$

the problem was to obtain the middle arrow, $(b \mto c) \mto (a,b \mto
a,c)$. In (``logical'') Natural Deduction it is common to abbreviate a
series of steps with a double bar; we will do something similar with
our ``function'' derivations, and use the trees with double bars as
abbreviations for the expanded trees. So, ``take the obvious $(b \mto
c) \mto (a,b \mto a,c)$'' means ``find an expansion for {\tiny
  $\cded{4=dnc}$}'':
%
% (find-kopkadaly4text "\\scriptsize, which is smaller than")
%:
%:    b|->c
%:  =========
%:  a,b|->a,c
%:
%:   ^4=dnc
%:
$$\ded{4=dnc} \quad\squigto\quad \ded{4-dnc}$$
%
and so:
%
$$\begin{array}{rcl}
  (A×)_1 &\equiv& ðB¨\Sets.ðC¨\Sets. \\
               && ð\angg{b \mto c}:B×C. \\
               && ð\angg{a,b}: A×B.\ang{\angg{a,b},\angg{b \mto c}('\angg{a,b})} \\
 \end{array}
$$

Now that we have the downcased notation and the `wd' construct we
can/may express the other components of the functor $(A×)$ quite
easily. One of them, $\respids_{(A×)}$, asserts that the functor
$(A×)$ ``respects identities''. In our shorthand notation, this is
%
$$ýB¨\Sets.\welld[a,b \mto a,b]$$
%
that we can expand as
%:
%:      B                B    
%:    -----\id          ---(A×)_0  
%:    b|->b             A×B  
%:  ---------(A×)_1  ---------\id
%:  a,b|->a,b        a,b|->a,b
%:
%:  ^expa1            ^expa2
%:
$$ýB¨\Sets.(\pded{expa1} = \pded{expa2})$$
%
which becomes, in standard notation,
%
$$ýB¨\Sets.(\id(A×)_0B = (A×)_1(\id B).$$

The other component, $\respcomp_{(A×)}$, asserts that $(A×)$
``respects compositions''. This is
%
$$ýB,C,D¨\Sets.ý(b \mto c),(c \mto d). \welld[a,b \mto a,d]$$
%
where $\welld[a,b \mto a,d]$ is:
%:
%:    b|->c       c|->d       b|->c       c|->d     
%:  ---------   ---------     -----------------   
%:  a,b|->a,c   a,c|->a,d         b|->d   
%:  ---------------------       ---------   
%:        a,b|->a,d             a,b|->a,d      
%:                                                  
%:        ^expa3                 ^expa4               
%:
$$\ded{expa3} \quad = \quad \ded{expa4}$$

Note that we didn't need to say $(b \mto c):B \to C$, $(c \mto d):C
\to D$; the translation to Coq will need this, of course, but in the
shorthand notation the typings can be reconstructed by uppercasing.

[Categories, $(a \mto b) : \Hom_\catC\,A\,B$, pseudopoints]






\section{Downcasing Assertions}
\label{downcasing-assertions}




\section{Categories and protocategories in Coq}
\label{cats-in-coq}

We start with some definitions. In this paper, categories, functors,
etc will be dependent uples. In each of the definitions below one of
the separators is `;' instead of ','; this is a trick for defining at
the same time a ``category'' and a ``protocategory'', a ``functor''
and a ``proto-functor'', and so on, as we shall see soon. The typings
of the components of the uples will also be discussed soon.

Category $\catA$

Morphism $f$

Iso $f$

Functor $F$

Natural transformation $T$

Natural iso $T$

Preuniversal arrow

Universal arrow

Preuniversal element

Universal element

------------


A category $\catC$ is an 8-uple, $(\catC_0, \catC_1, \Hom_\catC,
\id_\catC, ¢_\catC; \idL_\catC, \idR_\catC, \assoc_\catC)$, where:

$\catC_0$ is where the objects live,

$\catC_1$ is where the hom-sets live,

if $A, B : \catC_0$ then $\Hom_C A B : \catC_1$,

if $A : \catC_0$ then $\id_C A : Hom_\catC A A$,

if $A, B, C : \catC_0$, $f: \Hom_\catC A B$, $g: \Hom_\catC B C$ then
$¢_\catC A B C g f : \Hom_\catC A C$,

if $A, B : \catC_0$ and $f: \Hom_\catC A B$ then

$\idL_\catC A B f$ asserts that $¢_\catC A A B f (\id_\catC A) = f$, and

$\idR_\catC A B f$ asserts that $¢_\catC A B B (\id_\catC B) f = f$,

if $A, B, C, D : \catC_0$, $f: \Hom_\catC A B$, $g: \Hom_\catC B C$,
$h: \Hom_\catC C D$ then $\assoc_\catC$...

The ';' separator...

The superscript `$·^-$'...

A protocategory $\catC^-$ is a 4-uple, $(\catC_0, \catC_1, \Hom_\catC,
\id_\catC, ¢_\catC)$,

\msk

A category $\catC$ is an 8-uple, $(\catC_0, \catC_1, \Hom_\catC,
\id_\catC, ¢_\catC; \idL_\catC, \idR_\catC, \assoc_\catC)$.

A morphism $f$ is a 4-uple $(\catC, A, B, f)$.

A functor $F$ is a 4-uple $(\catA, \catB, F_0, F_1; \respids_F, \respcomp_F)$.

A natural $T$ transformation is a 6-uple $(\catA, \catB, F, G, T; \sqcond_T)$.

An iso $f$ is a 6-uple $(\catA, A, B, f, f³; f_\supset, f_\subset)$.

A split monic $f$ is a 5-uple $(\catA, A, B, f, f³; f_\supset)$.

A split epi $f$ is a 5-uple $(\catA, A, B, f, f³; f_\subset)$.

A natural iso $T$ is a 6-uple $(\catA, \catB, F, G, T, T³; T_\supset, T_\subset)$.

An adjunction $L \dashv R$ is an 8-uple $(\catA, \catB, L, R, \flat, \sharp; \supset, \subset)$.

\msk

Given a morphism $f$, ``$f$ is an iso'' is a structure with the three
components that we need to add to $f$ to make it an iso; ``$f$ is an
iso'' is $(f³; f_\supset, f_\subset)$.








\section{Categories in DNC}
\label{cats-in-dnc}

\section{DNC in Coq}
\label{dnc-in-coq}

\section{Logic in DNC}
\label{logic}

If $P$ is a proposition, $\Proofs[P]$ is the set of all proofs of $P$,
and $\Wits[P]$ is the ``space of witnesses'' of $P$, that is a
singleton when $P$ is true and an empty set when $P$ is false;
intuitively, $\Wits[P]$ is $\Proofs[P]$ with all elements identified.

A witness for $P$, that we write as $\wit[P]$, is an element of
$\Wits[P]$. All the inference rules of logic can be regarded as
operations that produce witnesses from other witnesses. For example,
the inferences
%:
%:
%:  a=b  a'=b'    2=3  4-4=0
%:  ----------    -----------
%:   a·a'=b·b'    2·(4-4)=3·0
%:
%:   ^mul1        ^mul2
%:
$$\ded{mul1} \qquad \ded{mul2}$$
%
correspond to functions $\Wits[a=b]×\Wits[a=b'] \to \Wits[a·a'=b·b']$
and $\Wits[2=3]×\Wits[4-4=0] \to \Wits[2·(4-4)=3·0]$.

Rules with discharges are a bit harder; we will approach them in two
ways. The derivation at left below can be regarded as a function from
$\Wits[P∧Q]×\Wits[Q⊃R]$ to $\Wits[P∧Q]$:
%:
%:            P∧Q   
%:            ---   
%:   P∧Q        Q     Q⊃R    
%:   ---        ---------    
%:     P           R         P∧Q  Q⊃R
%:     -------------         ::::::::
%:         P∧R                 P⊃R   
%:                
%:         ^disch1             ^disch2
%:
$$\ded{disch1} \qquad \ded{disch2}$$

The $⊃$-introduction curries that function and produces a function
from $\Wits[Q⊃R]$ to $(\Wits[P∧Q] \to \Wits[P∧R]) = \Wits[P∧Q⊃P∧R]$.
%:
%:
%:           [P∧Q]^1
%:           -------
%:  [P∧Q]^1     Q     Q⊃R
%:  -------     ---------
%:     P           R          [P∧Q]^1  Q⊃R
%:     -------------          ::::::::::::
%:         P∧R                    P⊃R        Q⊃R
%:       -------1               -------1     :::
%:       P∧Q⊃P∧R                P∧Q⊃P∧R     P∧Q⊃P∧R
%:
%:       ^disch3                ^disch4     ^disch5
%:
$$\ded{disch3} \qquad \ded{disch4} \qquad \ded{disch5}$$


% «convention»  (to ".convention")
\section{Conventions on names}
\label{conventions}

I tend to use some conventions for names in DNC. For example, in an
adjunction $L \dashv R$ the functor $L$ is usually drawn going
leftwards, and $R$ is drawn going to the right:
%
%D diagram conventions-1
%D 2Dx      100     +30    +30     +30
%D 2D  100 LA <---| A     a^L <=== a
%D 2D       |       |      -       |
%D 2D       |  <->  |      |  <->  |
%D 2D       v       v      v       v
%D 2D  +30  B |---> RB     b ====> b^R
%D 2D
%D (( LA A B RB
%D    @ 0 @ 1 <-| @ 0 @ 2 -> @ 1 @ 3 -> @ 2 @ 3 |->
%D    @ 0 @ 3 harrownodes nil 20 nil <->
%D ))
%D (( a^L a b b^R
%D    @ 0 @ 1 <= @ 0 @ 2 |-> @ 1 @ 3 |-> @ 2 @ 3 =>
%D    @ 0 @ 3 harrownodes nil 20 nil <->
%D ))
%D enddiagram
%D
$$\diag{conventions-1}$$

The two categories are named $\catA$ and $\catB$.

The natural iso
%
$$\begin{array}{rcl}
  (A^\op,B) & \mto  & (\Hom_\catB(LA,B) \bij \Hom_\catA(A,RB) \\
  (a^\op;b) & \tnto & ((a^L \mto b) \bij (a \mto b^R)) \\
  \end{array}
$$
%

has two directions: one, $(a^L \mto b) \mto (a \mto b^R)$, shifts to
the right the position where the functor hits the object, and I call
that one `$\sharp$'; the other one, $(a^L \mto b) \mot (a \mto b^R)$,
shifts to the left the position where the functor hits the object, and
I call it `$\flat$'. So:
%
%D diagram conventions-2
%D 2Dx      100     +30    +30     +30
%D 2D  100 LA <---| A     a^L <=== a
%D 2D       |       |      -       |
%D 2D       |  <->  |      |  <->  |
%D 2D       v       v      v       v
%D 2D  +30  B |---> RB     b ====> b^R
%D 2D
%D (( LA A B RB
%D    @ 0 @ 1 <-| @ 0 @ 2 -> @ 1 @ 3 -> @ 2 @ 3 |->
%D    @ 0 @ 3 harrownodes nil 20 nil <-  sl^ .plabel= a \flat
%D    @ 0 @ 3 harrownodes nil 20 nil  -> sl_ .plabel= b \sharp
%D ))
%D (( a^L a b b^R
%D    @ 0 @ 1 <= @ 0 @ 2 |-> @ 1 @ 3 |-> @ 2 @ 3 =>
%D    @ 0 @ 3 harrownodes nil 20 nil <-| sl^ .plabel= a \flat
%D    @ 0 @ 3 harrownodes nil 20 nil |-> sl_ .plabel= b \sharp
%D ))
%D enddiagram
%D
$$\diag{conventions-2}$$

Each book on Category Theory uses its own notation and naming
conventions. The best way I found to show how to translate between DNC
and some other more standard notation is to do the translation in two
steps. For example,


%D diagram transla-1
%D 2Dx      100 +15 +15    +45 +15 +15    +45 +15 +15
%D 2D  100      --| x          --| A           /= a{}
%D 2D          /    -         /    -          //  -    
%D 2D         /     |        /     |         //   |    
%D 2D        v      v       v      v        \/    v    
%D 2D  +30 Fx |--> GFx    LA |--> RLA    a^L ==> a^{LR}
%D 2D       |       |      |       |      -       |    
%D 2D       |  <->  |      |  <->  |      |  <->  |    
%D 2D       v       v      v       v      v       v    
%D 2D  +30  a |---> Ga     B |---> RB     b ====> b^R  
%D 2D
%D 2D  +15  {A}     {X}  \catB   \catA
%D 2D
%D 2D  +15     X-`A           A-`B
%D 2D
%D 2D  +15                                    -`
%D 2D
%D (( x Fx GFx a Ga
%D    @ 0 @ 1 |->
%D    @ 0 @ 2  -> .plabel= r \eta_x
%D    @ 1 @ 2 |->
%D    @ 1 @ 3  -> .plabel= l f
%D    @ 2 @ 4  -> .plabel= r Gf
%D    @ 3 @ 4 |->
%D    @ 0 @ 4  -> .slide= 17pt .plabel= r \sm{\phi"f\;=\\"Gf¢\eta_x}
%D    @ 1 @ 4 harrownodes nil 20 nil |->
%D    {A} place {X} place
%D    X-`A .tex= \ang{F,G,\phi}:X\rightharpoonup"A place
%D ))
%D (( A LA RLA B RB
%D    @ 0 @ 1 |->
%D    @ 0 @ 2  -> .plabel= r \eta_A
%D    @ 1 @ 2 |->
%D    @ 1 @ 3  -> .plabel= l f
%D    @ 2 @ 4  -> .plabel= r Rf
%D    @ 3 @ 4 |->
%D    @ 0 @ 4  -> .slide= 17pt .plabel= r \sm{\phi"f\;=\\"Rf¢\eta_A}
%D    @ 1 @ 4 harrownodes nil 20 nil |->
%D    \catB place \catA place
%D    A-`B .tex= \ang{L,R,\phi}:\catA\rightharpoonup"\catB place
%D ))
%D (( a{} a^L a^{LR} b b^R
%D    @ 0 @ 1  =>
%D    @ 0 @ 2 |->
%D    @ 1 @ 2  =>
%D    @ 1 @ 3 |->
%D    @ 2 @ 4 |->
%D    @ 3 @ 4  =>
%D    @ 1 @ 4 harrownodes nil 20 nil |->
%D    -` .tex= \ang{L,R,(a^\op;b)-.>((a^L|->b)|->(a|->b^R))} place
%D ))
%D enddiagram
%D
$$\diag{transla-1}$$

In the first step we keep the symbols --- $\ang{\_,\_,\_}$,
$\rightharpoonup$, $\eta$, $\phi$, `$¢$' vs.\ `;' --- but we change
the names of the objects, functors, categories, and we obtain an
uppercase diagram with our favourite choices of letters, fonts, and
placing of the names; in the second step we downcase that.

The notation $\ang{F,G,\phi}: X\rightharpoonup A$ above is from CWM
(sec.\ IV.1). Slightly later the book introduces another notation for
adjunctions, $\ang{F,G,\eta,}: X\rightharpoonup A$; we downcase that
to $\ang{a\funto a^L, b\funto b^R, a \tnto (a \mto a^{LR}), b \tnto
  (b^{RL} \mto b)}$, or simply $\ang{L, R, a \tnto (a \mto a^{LR}), b
  \tnto (b^{RL} \mto b)}$.







% «yoneda»  (to ".yoneda")
\section{The Yoneda Lemma in DNC}
\label{yoneda}

Let's define a {\sl preuniversal} as a tuple $(\catA, \catB, R: \catB
\to A, A \in \catA_0, B \in \catB_0, f:A \to RB)$.

A {\sl universal} will be the same plus an extra component, that
asserts the ``universality'' of $f$; but we are only going to need
that later (sec.\ \_).

We will represent a preuniversal in DNC like this:

%D diagram pdown
%D 2Dx     100
%D 2D  100 #1
%D 2D
%D 2D  +20 #2
%D 2D
%D (( #1 #2 |->
%D ))
%D enddefpdiagram 2
%D
% $$\pdown ab$$

%D diagram pmetauniv
%D 2Dx     100    +20
%D 2D  100        #1
%D 2D             -
%D 2D           #4|
%D 2D             v
%D 2D  +20 #2 ==> #3
%D 2D
%D (( #1 #3 |-> .plabel= l #4
%D    #2 #3  =>
%D ))
%D enddefpdiagram 4
%
% $$\pmetauniv abcd$$

\def\ppreuniv#1#2#3{\pmetauniv{#1}{#2}{#3}{}}
\def\puniv#1#2#3{\pmetauniv{#1}{#2}{#3}{\text{univ}}}
\def\pdowneltnt#1#2#3#4{\big(
  #1 \tnto (\pdown{#2}{#3} \mto #4)
  \big)
  }
\def\pdownnt#1#2#3#4#5{\big(
  #1 \tnto (\pdown{#2}{#3} \mto \pdown{#4}{#5})
  \big)
  }

$$\ppreuniv{a}{b}{b^R}$$

There is a natural construction for a bijection between preuniversals
and natural transformations $T: \Hom_\catB(B,-) \to \Hom_\catA(A,-)$:
%
$$\ppreuniv{a}{b}{b^R} \;\bij\; \pdownnt{c}{b}{c}{a}{c^R}$$

The direction `$\mto$' of the bijection is obvious from the diagram:

(...)

For the other direction, we do:

%:
%:    B        B   c-.>((b|->c)|->(a|->c^R))
%:  -----\id   -----------------------------Ð{app}
%:  b|->b      (b|->b)|->(a|->b^R)
%:  ------------------------------Ð{app}
%:        a|->b^R
%:
%:        ^otherdir
%:
$$\ded{otherdir}$$

The Yoneda Lemma:
%
$$\begin{array}{ccc}
           b^R          &\diagxyto/<.>/<175>&  \pdowneltnt{c}{b}{c}{\;c^R\;} \\ \\
         \vbij          &                   &          \vbij            \\ \\
  \ppreuniv{*}{b}{b^R}  &\diagxyto/<->/<175>&  \pdownnt{c}{b}{c}{*}{c^R} \\
  \end{array}
$$

The corollary:
%
$$\begin{array}{ccc}
      \pdown{a}{b}           &\diagxyto/<.>/<175>&  \pdownnt{c}{b}{c}{a}{c} \\ \\
           \vbij             &                   &          \vbij            \\ \\
  \ppreuniv{*}{b}{a \mto b}  &\diagxyto/<->/<175>&  \pdownnt{c}{b}{c}{*}{a \mto c} \\
  \end{array}
$$


% $$\ppreuniv{*}{b}{a \mto b} \;\bij\; \pdownnt{c}{b}{c}{*}{a \mto c}$$


\bsk

(old stuff):

A functor $F: \catA \to \catB$ takes each object $A \in \catA_0$ to an
object $FA \in \catB_0$; we can write its action on objects as $A \mto
FA$. Its action on morphisms takes each morphism $f: A \to A'$ to a
morphism $Ff: FA \to A'$...

We downcase that to $a \funto a^F$.

An adjunction $L \dashv R$ between two functors, $L: \catA \to \catB$
and $R: \catB \to \catA$, gives, for any two objects $A:\catA_0$ and
$B:\catB_0$, a bijection between the hom-sets $\Hom_\catB(LA,B)$ and
$\Hom_\catA(A,RB)$; we will downcase this as







\section{A system of Natural Deduction for (proto-)\discretionary{}{}{}categories}
\label{nd-for-cats}

% (find-kopkadaly4text "\\discretionary{before}{after}{without}")

\section{Natural Deduction for dependent types}
\label{nd-for-dt}

\section{Abelian categories}
\label{abcats}

\section{Fibrations in DNC}
\label{fibrations}

%:*\s{*\pover{*
\def\pover#1#2{\begin{pmatrix} #2 \\ #1 \end{pmatrix}}
\def\cartmto{\mton{\Box}}
\def\pdiag#1{\!\left(\!\!\diag{#1}\right)\!}
\def\cartmto{\mton{\Box}}
\widemtos

A morphism $\pover{b}{Q} \mto \pover{c}{R}$ is {\sl cartesian}
(notation: $\pover{b}{Q} \cartmto \pover{c}{R}$) when the induced
natural transformation below (taking morphisms with the right codomain
to ``\,`V's over commutative triangles'') is a natural iso:

%D diagram cartmorph1
%D 2Dx         100     +20      +30
%D 2D  100 \s{a}{P}
%D 2D  +20          \s{b}{Q}  \s{c}{R}
%D 2D  +10     a
%D 2D  +20             b        c
%D (( \s{a}{P} \s{b}{Q} \s{c}{R}
%D       a       b       c
%D    @ 0 @ 2 |-> @ 1 @ 2 |->
%D    @ 3 @ 4 |-> @ 3 @ 5 |-> @ 4 @ 5 |->
%D ))
%D enddiagram

\msk
$\pover{a}{P}^\op \tnto \; ((\pover{a}{P} \mto \pover{b}{Q})
		            \two/|->`<-|/<200>^{\natural}_{(ñ)}
		            \pdiag{cartmorph1})
$


\section{Open problems and future work}
\label{future}




% http://en.wikipedia.org/wiki/BHK_interpretation




%*

\end{document}

% Local Variables:
% coding:           raw-text-unix
% ee-anchor-format: "«%s»"
% End: