% This file:
%   http://angg.twu.net/LATEX/2022Cats3.lagda.tex.html
%   http://angg.twu.net/LATEX/2022Cats3.lagda.tex
%           (find-angg "LATEX/2022Cats3.lagda.tex")
%   http://angg.twu.net/LATEX/2022Cats3.pdf
% Author: Eduardo Ochs <eduardoochs@gmail.com>
%
% (find-LATEX "2022Cats3.lagda.tex")
% (code-eec-LATEX "2022Cats3")
% (defun c  () (interactive) (eec-agdalatex-sh "2022Cats3" "-record" :end))
% (defun C  () (interactive) (eec-agdalatex-sh "2022Cats3" "" "Success!!!"))
% (defun D  () (interactive) (find-pdf-page      "~/LATEX/2022Cats3.pdf"))
% (defun d  () (interactive) (find-pdftools-page "~/LATEX/2022Cats3.pdf"))
% (defun e  () (interactive) (find-angg "LATEX/2022Cats3.lagda.tex"))
% (defun et () (interactive) (find-angg "LATEX/2022Cats3.tex"))
% (defun a  () (interactive) (find-angg  "AGDA/2022Cats3.agda"))
% (defun u  () (interactive) (find-latex-upload-links "2022Cats3"))
% (defun v  () (interactive) (find-2a '(e) '(d)))
% (defun v  () (interactive) (find-pdftoolsr-page "~/LATEX/2022Cats3.pdf"))
% (defun cv () (interactive) (C) (ee-kill-this-buffer) (v) (g))
% (defun d0 () (interactive) (find-ebuffer "2022Cats3.pdf"))
%
% (find-2a nil '(find-LATEX "2022template.lagda.tex"))
% (find-dired-re  "~/LATEX/" ".lagda.tex$")
% (find-agdalatex-links "2022Cats3")
% (find-agdafile-links  "2022Cats3")
% (find-lualatex-links  "2022Cats3")

\documentclass{article}
\usepackage[colorlinks,citecolor=DarkRed,urlcolor=DarkRed]{hyperref} % (find-es "tex" "hyperref")
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{pict2e}
\usepackage[x11names,svgnames]{xcolor} % (find-es "tex" "xcolor")
%
\usepackage{proof}   % For derivation trees ("%:" lines)
\input diagxy        % For 2D diagrams ("%D" lines)
\xyoption{curve}     % For the ".curve=" feature in 2D diagrams
%
\usepackage{edrx21}               % (find-LATEX "edrx21.sty")
\input edrxaccents.tex            % (find-LATEX "edrxaccents.tex")
\input edrx21chars.tex            % (find-LATEX "edrx21chars.tex")
\input edrxheadfoot.tex           % (find-LATEX "edrxheadfoot.tex")
\input edrxgac2.tex               % (find-LATEX "edrxgac2.tex")
%
\usepackage{agda}                 % (find-LATEX "agda.sty")
\begin{document}

\catcode`\^^J=10
\directlua{dofile "dednat6load.lua"}  % (find-LATEX "dednat6load.lua")


\catcode`⟨=13 \def⟨{\ensuremath{\langle}}
\catcode`⟩=13 \def⟩{\ensuremath{\rangle}}

% \catcode`₀=13 \def₀{{\ensuremath{{}_0}}}
% \catcode`₁=13 \def₁{{\ensuremath{{}_1}}}
% \catcode`₂=13 \def₂{{\ensuremath{{}_2}}}
% \catcode`₃=13 \def₃{{\ensuremath{{}_3}}}
% \catcode`∎=13 \def∎{\blacksquare}
% \catcode`∎=13 \def∎{{\ensuremath{HELLO}}}

% % $ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎ ₐ ₑ ₒ ₓ ₕ ₖ ₗ ₘ ₙ ₚ ₛ ₜ$

%  ____  _                   _ 
% |  _ \(_) __ _  __ _ ___  / |
% | | | | |/ _` |/ _` / __| | |
% | |_| | | (_| | (_| \__ \ | |
% |____/|_|\__,_|\__, |___/ |_|
%                |___/         
%
%D diagram Yoneda-names
%D 2Dx     100  +30
%D 2D  100      A1
%D 2D            |
%D 2D  +25 A2 - A3
%D 2D      |     |
%D 2D  +25 A4 - A5
%D 2D      |     |
%D 2D  +25 A6 - A7
%D 2D      |     |
%D 2D  +25 A8 - A9
%D 2D
%D 2D  +15 B0 - B1
%D 2D
%D ren    A1 ==>    A
%D ren A2 A3 ==> C RC
%D ren A4 A5 ==> D RD
%D ren A6 A7 ==> E RE
%D ren A8 A9 ==> F RF
%D ren B0 B1 ==> \catB \catA
%D
%D (( A1 A3  -> .plabel= r η
%D    A2 A3 |->
%D    A2 A4  -> .plabel= l f
%D    A3 A5  -> .plabel= r Rf
%D    A2 A5 harrownodes nil 20 nil |->
%D    A4 A5 |->
%D    A4 A6  -> .plabel= l g
%D    A5 A7  -> .plabel= r Rg
%D    A4 A7 harrownodes nil 20 nil |->
%D    A6 A7 |->
%D    A6 A8  -> .plabel= l m
%D    A7 A9  -> .plabel= r Rm
%D    A6 A9 harrownodes nil 20 nil |->
%D    A8 A9 |->
%D
%D    A1 A5  -> .slide=  20pt .plabel= r h
%D    A1 A7  -> .slide=  35pt .plabel= r ℓ
%D    A2 A6  -> .slide= -15pt .plabel= l k
%D
%D    B0 B1  -> .plabel= a R
%D ))
%D enddiagram
%D
$$\pu
  \diag{Yoneda-names}
$$

\def\oB{∘_\catB}
\def\oA{∘_\catA}
\def\oBC{∘_{\catB(C,-)}}
\def\oAA{∘_{\catA(A,R-)}}

\sa{catB(C,idD)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catB(C,\id_D) \\
    = λf.\;\id_D \oB f \\
    = λf.\;f \\
    = \id_{\catB(C,D)} \\
  \end{array}
  $}
  }

\sa{catB(C,g)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catB(C,g) \\
    = λf.\;g \oB f \\
  \end{array}
  $}
  }
\sa{catB(C,m)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catB(C,m) \\
    = λk.\;m \oB k \\
  \end{array}
  $}
  }
\sa{catB(C,mog)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catB(C,m) \oBC \catB(C,g) \\
    = (λk.\;m \oB k)∘(λf.\;g \oB f) \\
    = λf.\;((λk.\;m \oB k)∘(λf.\;g \oB f))(f) \\
    = λf.\;(λk.\;m \oB k)((λf.\;g \oB f)(f)) \\
    = λf.\;(λk.\;m \oB k)(g \oB f) \\
    = λf.\;m \oB (g \oB f) \\
    = λf.\;(m \oB g) \oB f \\
    = \catB(C,m \oB g) \\
  \end{array}
  $}
  }




%D diagram B(C,-)-equalities
%D 2Dx     100   +30  +60   +30
%D 2D  100 LA0 - LA1  LB0 - LB1
%D 2D      |       |  |     |
%D 2D  +25 |       |  LB2 - LB3
%D 2D      |       |  |     |
%D 2D  +25 LA2 - LA3  LB4 - LB5
%D 2D
%D 2D  +15 LC0 - LC1  LD0 - LD1
%D 2D
%D ren LA0 LA1 ==> D \catB(C,D)
%D ren LA2 LA3 ==> D \catB(C,D)
%D ren LB0 LB1 ==> D \catB(C,D)
%D ren LB2 LB3 ==> E \catB(C,E)
%D ren LB4 LB5 ==> F \catB(C,F)
%D ren LC0 LC1 ==> \catB \Set
%D ren LD0 LD1 ==> \catB \Set
%D
%D (( LA0 LA1 |->
%D    LA0 LA2  -> .plabel= l \id_D
%D    LA1 LA3  -> .plabel= r \ga{catB(C,idD)}
%D    LA0 LA3 harrownodes nil 20 nil |->
%D    LA2 LA3 |->
%D
%D    LB0 LB1 |->
%D    LB0 LB2  -> .plabel= l g
%D    LB1 LB3  -> .plabel= r \ga{catB(C,g)}
%D    LB0 LB3 harrownodes nil 20 nil |->
%D    LB2 LB3 |->
%D    LB2 LB4  -> .plabel= l m
%D    LB3 LB5  -> .plabel= r \ga{catB(C,m)}
%D    LB2 LB5 harrownodes nil 20 nil |->
%D    LB4 LB5 |->
%D
%D    LB0 LB4  -> .slide= -15pt .plabel= l m∘g
%D    LB1 LB5  -> .slide=  60pt .plabel= r \ga{catB(C,mog)}
%D
%D    LC0 LC1 -> .plabel= a \catB(C,-)
%D    LD0 LD1 -> .plabel= a \catB(C,-)
%D ))
%D enddiagram
%D
$$\pu
  \diag{B(C,-)-equalities}
$$


\sa{catA(A,RidD)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catA(A,R\id_D) \\
    = λh.\;R\id_D∘h \\
    = λh.\;\id_{RD}∘h \\
    = λh.\;h \\
    = \id_{\catA(A,RD)} \\
  \end{array}
  $}
  }

\sa{catA(A,Rg)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catA(A,Rg) \\
    = λh.\;Rg∘h \\
  \end{array}
  $}
  }
\sa{catA(A,Rm)}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catA(A,Rm) \\
    = λℓ.\;Rm∘ℓ \\
  \end{array}
  $}
  }
\sa{catA(A,R(log))}{
  \scalebox{0.7}{$
  \begin{array}{l}
    \catA(RC,m) \oAA \catA(RC,g) \\
    = (λℓ.\;Rm∘ℓ)∘(λh.\;Rg∘h) \\
    = λh.\;((λℓ.\;Rm∘ℓ)∘(λh.\;Rg∘h))(h) \\
    = λh.\;(λℓ.\;Rm∘ℓ)((λh.\;Rg∘h)(h)) \\
    = λh.\;(λℓ.\;Rm∘ℓ)(Rg∘h) \\
    = λh.\;Rm∘(Rg∘h) \\
    = λh.\;(Rm∘Rg)∘h \\
    = \catA(A,R(m∘g)) \\
  \end{array}
  $}
  }





%D diagram A(A,R-)-equalities
%D 2Dx     100   +30  +60   +30
%D 2D  100 RA0 - RA1  RB0 - RB1
%D 2D      |       |  |     |
%D 2D  +25 |       |  RB2 - RB3
%D 2D      |       |  |     |
%D 2D  +25 RA2 - RA3  RB4 - RB5
%D 2D
%D 2D  +15 RC0 - RC1  RD0 - RD1
%D 2D
%D ren RA0 RA1 ==> D \catA(A,RD)
%D ren RA2 RA3 ==> D \catA(A,RD)
%D ren RB0 RB1 ==> D \catA(A,RD)
%D ren RB2 RB3 ==> E \catA(A,RE)
%D ren RB4 RB5 ==> F \catA(A,RF)
%D ren RC0 RC1 ==> \catB \Set
%D ren RD0 RD1 ==> \catB \Set
%D
%D (( RA0 RA1 |->
%D    RA0 RA2  -> .plabel= l \id_D
%D    RA1 RA3  -> .plabel= r \ga{catA(A,RidD)}
%D    RA0 RA3 harrownodes nil 20 nil |->
%D    RA2 RA3 |->
%D
%D    RB0 RB1 |->
%D    RB0 RB2  -> .plabel= l g
%D    RB1 RB3  -> .plabel= r \ga{catA(A,Rg)}
%D    RB0 RB3 harrownodes nil 20 nil |->
%D    RB2 RB3 |->
%D    RB2 RB4  -> .plabel= l m
%D    RB3 RB5  -> .plabel= r \ga{catA(A,Rm)}
%D    RB2 RB5 harrownodes nil 20 nil |->
%D    RB4 RB5 |->
%D
%D    RB0 RB4  -> .slide= -15pt .plabel= l m∘g
%D    RB1 RB5  -> .slide=  60pt .plabel= r \ga{catA(A,R(log))}
%D
%D    RC0 RC1 -> .plabel= a \catA(A,R-)
%D    RD0 RD1 -> .plabel= a \catA(A,R-)
%D ))
%D enddiagram
%D
$$\pu
  \diag{A(A,R-)-equalities}
$$


\newpage

%     _             _       
%    / \   __ _  __| | __ _ 
%   / _ \ / _` |/ _` |/ _` |
%  / ___ \ (_| | (_| | (_| |
% /_/   \_\__, |\__,_|\__,_|
%         |___/             

\begin{code}
module 2022Cats3 where

open import Level
open import Relation.Binary.PropositionalEquality as Eq
open Eq.≡-Reasoning

postulate ext : ∀ {ℓ ℓ'} {A : Set ℓ} {B : A → Set ℓ'} {f g : (a : A) → B a}
                  → (∀ (a : A) → f a ≡ g a) → f ≡ g

module Cats3 where

record Cat {ℓ₀ ℓ₁ : Level} : Set (suc (ℓ₀ ⊔ ℓ₁)) where
  field
    Objs  : Set ℓ₀
    Hom   : Objs → Objs → Set ℓ₁
    id    : (D : Objs) → (Hom D D)
    _◦_   : {C D E : Objs}
            → (g : Hom D E)
            → (f : Hom C D)
            →     (Hom C E)
    idL   : {D E : Objs}
            → (g : Hom D E)
            → (g ≡ g ◦ (id D))
    idR   : {D E : Objs}
            → (g : Hom D E)
            → (g ≡ (id E) ◦ g)
    assoc : {C D E F : Objs}
            → (f : Hom C D)
            → (g : Hom D E)
            → (m : Hom E F)
            → (m ◦ (g ◦ f) ≡ (m ◦ g) ◦ f)

catSet : Cat {suc zero} {zero}
Cat.Objs  catSet = Set
Cat.Hom   catSet = λ A B → (A → B)
Cat.id    catSet = λ A → (λ a → a)
Cat._◦_   catSet = λ g f → (λ a → g (f a))
Cat.idL   catSet = λ f → refl
Cat.idR   catSet = λ f → refl
Cat.assoc catSet = λ f g h → refl

catSetH : Cat {suc zero} {zero}
Cat.Objs  catSetH = Set
Cat.Hom   catSetH = λ A B → (A → B)
Cat.id    catSetH = λ A → (λ a → a)
Cat._◦_   catSetH = λ g f → (λ a → g (f a))
Cat.idL   catSetH = λ f → refl
Cat.idR   catSetH = λ f → refl
Cat.assoc catSetH = λ f g h → refl

record Functor {ℓ₀ ℓ₁ ℓ₂ ℓ₃ : Level}
               (catB : Cat {ℓ₀} {ℓ₁})
               (catA : Cat {ℓ₂} {ℓ₃})
             : Set (suc (ℓ₀ ⊔ ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃)) where
  field
    ac0      : (Cat.Objs catB) → (Cat.Objs catA)
    ac1      : {C D : Cat.Objs catB}
               → (Cat.Hom catB C D)
               → (Cat.Hom catA (ac0 C) (ac0 D))
    respids  : {C : Cat.Objs catB}
               → (ac1 (Cat.id catB C) ≡ Cat.id catA (ac0 C))
    -- respcomp : {C D E : Cat.Objs catB}
    --            → {f : Cat.Hom catB C D}
    --            → {g : Cat.Hom catB D E}
    --            → (ac1 (Cat._◦_ catB g f) ≡ (Cat._◦_ catA (ac1 g) (ac1 f)))
  --
  -- R.ac0       C                  = RC
  -- R.ac1      {C} {D} f           = R f
  -- R.respids  {C}                 : R(id C) ≡ id(RC)
  -- R.respcomp {C} {D} {E} {f} {g} : R(g∘f) ≡ Rg∘Rf

record NT {ℓ₀ ℓ₁ ℓ₂ ℓ₃ : Level}
          {catC : Cat {ℓ₀} {ℓ₁}}
          {catD : Cat {ℓ₂} {ℓ₃}}
          (F G : Functor catC catD)
             : Set (suc (suc (ℓ₀ ⊔ ℓ₁ ⊔ ℓ₂ ⊔ ℓ₃))) where
  field
    ac       : (A : Cat.Objs catC)
               → (Cat.Hom catD (Functor.ac0 F A) (Functor.ac0 G A))
    sqcond   : {A B : Cat.Objs catC}
               → (f : Cat.Hom catC A B)
               → ((Cat._◦_ catD (ac B) (Functor.ac1 F f)) ≡
                   (Cat._◦_ catD (Functor.ac1 G f) (ac A)))
               → Set
  --
  -- T.ac      A        : Hom(FA,GA)
  -- T.sqcond {A} {B} f : TB∘Ff ≡ Gf∘TA

postulate catA : Cat {zero} {zero}
postulate catB : Cat {zero} {zero}
postulate R : Functor catB catA
postulate A : Cat.Objs catA
postulate C : Cat.Objs catB
postulate η : Cat.Hom catA A (Functor.ac0 R C)

postulate D E F : Cat.Objs catB
postulate f     : Cat.Hom  catB C D
postulate g     : Cat.Hom  catB D E

catB[C,-] : Functor catB catSetH
Functor.ac0      catB[C,-] D           = Cat.Hom catB C D
Functor.ac1      catB[C,-] {D} {E} g f = Cat._◦_ catB g f
Functor.respids  catB[C,-] {D} = trans (ext (λ f → sym (Cat.idR catB f))) refl
-- Functor.respcomp catB[C,-] {D} {E} {F} {g} {m} = {!!}

infix 10 _◦B_

B₀      : Set
B₀      = Cat.Objs catB
B[_,_]  : B₀ → B₀ → Set
B[_,_]  D E = Cat.Hom catB D E
_◦B_    : {D E F : B₀} → (B[_,_] E F) → (B[_,_] D E) → (B[_,_] D F)
_◦B_    {D} {E} {F} m g = Cat._◦_ catB m g
id_B    : (D : B₀) → B[_,_] D D
id_B    D = Cat.id catB D

Set[_,_] : Set → Set → Set
Set[_,_] A B = Cat.Hom catSet A B

B[C,_]₀ : B₀ → Set 
B[C,_]₀ E = Functor.ac0 catB[C,-] E
B[C,_]₁ : {D E : B₀} → (B[_,_] D E) → (B[_,_] C D) → (B[_,_] C E)
B[C,_]₁ {D} {E} g = Functor.ac1 catB[C,-] g

module On_DEF (D E F : Cat.Objs catB) where
  idD          : B[_,_] D D
  idD          = id_B D
  B[C,D]       : Set
  B[C,D]       = B[C,_]₀ D
  B[C,idD]     : Set[_,_] B[C,D] B[C,D]
  B[C,idD]     = B[C,_]₁  idD
  id[B[C,D]]   : Set[_,_] B[C,D] B[C,D]
  id[B[C,D]]   = Cat.id  catSet B[C,D]
  λf⇒[idD◦f]   : (f : B[C,D]) → B[C,D]
  λf⇒[idD◦f]   f = idD ◦B f
  λf⇒f         : (f : B[C,D]) → B[C,D]
  λf⇒f         f = f
  λf⇒<idD◦f≡f> : (f : B[C,D]) → (idD ◦B f) ≡ f
  λf⇒<idD◦f≡f> f = sym (Cat.idR catB f)
  --
  <B[C,idD]≡[λf⇒[idD◦f]]> : B[C,idD] ≡ λf⇒[idD◦f]
  <B[C,idD]≡[λf⇒[idD◦f]]> = refl
  <[λf⇒[idD◦f]]≡[λf⇒f]>   : λf⇒[idD◦f] ≡ λf⇒f
  <[λf⇒[idD◦f]]≡[λf⇒f]>   = ext λf⇒<idD◦f≡f>
  <[λf⇒f]≡id[B[C,D]]>     : λf⇒f ≡ id[B[C,D]]
  <[λf⇒f]≡id[B[C,D]]>     = refl
  --
  <B[C,idD]≡id[B[C,D]]>  : B[C,idD] ≡ id[B[C,D]]
  <B[C,idD]≡id[B[C,D]]>  = begin
      B[C,idD]    ≡⟨ <B[C,idD]≡[λf⇒[idD◦f]]> ⟩
      λf⇒[idD◦f]  ≡⟨ <[λf⇒[idD◦f]]≡[λf⇒f]>   ⟩
      λf⇒f        ≡⟨ <[λf⇒f]≡id[B[C,D]]>     ⟩
      id[B[C,D]]
    ∎
  --
  -- m g f = Cat.assoc catB f g m

  -- g◦f               : (g : B[D,E]) → (f : B[C,D]) → B[C,E]
  -- g◦f               g f = Cat._◦_ catB g f
  -- m◦g               : (m : B[E,F]) → (g : B[D,E]) → B[D,F]
  -- m◦g               m g = Cat._◦_ catB m g
  -- m◦k               : (m : B[E,F]) → (k : B[C,E]) → B[C,F]
  -- m◦k               m k = Cat._◦_ catB m k
  -- m◦[g◦f]           : (m : B[E,F]) → (g : B[D,E]) → (f : B[C,D]) → B[C,F]
  -- m◦[g◦f]           m g f = Cat._◦_ catB m (g◦f g f)
  -- [m◦g]◦f           : (m : B[E,F]) → (g : B[D,E]) → (f : B[C,D]) → B[C,F]
  -- [m◦g]◦f           m g f = Cat._◦_ catB (m◦g m g) f
  -- m◦[g◦f]≡[m◦g]◦f   : (m : B[E,F]) → (g : B[D,E]) → (f : B[C,D])
  --                     → (m◦[g◦f] m g f ≡ [m◦g]◦f m g f)
  -- m◦[g◦f]≡[m◦g]◦f   m g f = Cat.assoc catB f g m

  

-- (find-es "agda" "module-system")

module M = On_DEF D E F -- where
open M

-- foo : {!Set!}
-- foo = <B[C,idD]≡id[B[C,D]]>
-- trans (ext (λ f → sym (Cat.idR catB f))) refl


  --
  -- [λf⇒[id:D◦f]]≡[λf⇒f] : λf⇒[id:D◦f] ≡ λf⇒f
  -- [λf⇒[id:D◦f]]≡[λf⇒f] = {!!}

\end{code}






\end{document}

% (find-fline "~/LATEX/")
% (find-fline "~/AGDA/latex/")
% (find-fline "~/AGDA/latex/Logic2.tex")
% (find-agdausermanualpage (+ 4 195) "4.7 Generating LaTeX")
% (find-agdausermanualtext (+ 4 195) "4.7 Generating LaTeX")
% (find-agdausermanualpage (+ 4 95) "3.19.3 Literate Agda")
% (find-agdausermanualtext (+ 4 95) "3.19.3 Literate Agda")

 (eepitch-shell)
 (eepitch-kill)
 (eepitch-shell)
agda --latex --latex-dir=. 2022Cats3.lagda.tex
laf 2022Cats3*
cd ~/LATEX/
lualatex 2022Cats3.tex


% Local Variables:
% coding:  utf-8-unix
% modes:   (latex-mode agda2-mode)
% End:


