module CatDef where

{-
This file contains the category theoretic definitions.
-}
 
open import Basics

Mor :  (A : Set₁)  Set₁
Mor A = A  A  Set

record Cat : Set₂ where
 field
  Obj : Set₁
  _⇒_ : Obj  Obj  Set
  _≈_ :  {M N}  Rel (M  N)
  isEq :  {M N}   isEquivalence (M  N) _≈_ 
  id :  {N}  N  N
  _⊚_ :  {M N O}  M  N  N  O  M  O
  id1 :  {M N}  (f : M  N)  (id  f)  f
  id2 :  {M N}   (g : M  N)   (g  id)  g 
  asso :  {M N O P}  (f : M  N)  (g : N  O)  (h : O  P)  ((f  g)  h)  (f  (g  h))  
  resp :   {M N O}  (_⊚_ {M}{N}{O}) Preserves₂ _≈_  _≈_  _≈_      


open Cat public

record Terminal ( : Cat) : Set₁ where
   field
     Ter : Obj 
     A→T : (A : Obj )  (_⇒_ ) A Ter
     uni : (A : Obj )  (f : (_⇒_ ) A Ter)  (_≈_ ) (A→T A) f

record Initial ( : Cat) : Set₁ where
   field
     Ini : Obj 
     I→A : (A : Obj )  (_⇒_ ) Ini A
     uni : (A : Obj )  (f : (_⇒_ ) Ini A)  (_≈_ ) (I→A A) f


record Product { : Cat}(X Y : Obj ) : Set₁ where
  field
    X×Y : Obj 
    π₁ : (_⇒_ ) X×Y X
    π₂ : (_⇒_ ) X×Y Y
    〈_,_〉 :  {Z}  (_⇒_ ) Z X  (_⇒_ ) Z Y  (_⇒_ ) Z X×Y

    c₁ :  {Z}{f : (_⇒_ ) Z X}{g : (_⇒_ ) Z Y}  (_≈_ )((_⊚_ )  f , g  π₁) f
    c₂ :  {Z}{f : (_⇒_ ) Z X}{g : (_⇒_ ) Z Y}  (_≈_ )((_⊚_ )  f , g  π₂) g  
    uni :  {Z}{f : (_⇒_ ) Z X}{g : (_⇒_ ) Z Y}{h : (_⇒_ ) Z X×Y}  (_≈_ )((_⊚_ ) h π₁) f  (_≈_ ) ((_⊚_ ) h π₂) g  (_≈_ )  f , g  h

open Product public


record CarCat : Set₂ where
 field
  Ucat : Cat
  UTer : Terminal Ucat
  UProd : (X Y : Obj Ucat)  Product {Ucat} X Y

open CarCat public

record Coproduct { : Cat}(X Y : Obj ) : Set₁ where
  field
    X+Y : Obj 
    i₁ : (_⇒_ ) X X+Y
    i₂ : (_⇒_ ) Y X+Y
    [[_,_]] :  {Z}  (_⇒_ ) X Z  (_⇒_ ) Y Z  (_⇒_ ) X+Y Z

    c₁' :  {Z}{f : (_⇒_ ) X Z}{g : (_⇒_ ) Y Z}  (_≈_ )((_⊚_ ) i₁ [[ f , g ]]) f
    c₂' :  {Z}{f : (_⇒_ ) X Z}{g : (_⇒_ ) Y Z}  (_≈_ )((_⊚_ ) i₂ [[ f , g ]]) g  
    uni' :  {Z}{f : (_⇒_ ) X Z}{g : (_⇒_ ) Y Z}{h : (_⇒_ ) X+Y Z}  (_≈_ )((_⊚_ ) i₁ h) f  (_≈_ ) ((_⊚_ ) i₂ h) g  (_≈_ ) [[ f , g ]] h

record CoCarCat : Set₂ where
 field
  UCcat : Cat
  UIni : Initial UCcat
  UCoProd : (X Y : Obj UCcat)  Coproduct {UCcat} X Y

open CoCarCat public

Pair⇒ : { : CarCat}  (X Y Z W : Obj (Ucat ))  (XZ : ((_⇒_ (Ucat )) X Z))  (YW : ((_⇒_ (Ucat )) Y W))  (_⇒_ (Ucat )) (X×Y (UProd  X Y)) (X×Y (UProd  Z W))
Pair⇒ {} X Y Z W XZ YW = (〈_,_〉 (UProd  Z W)) ((_⊚_ (Ucat )) (π₁ (UProd  X Y)) XZ) ((_⊚_ (Ucat )) (π₂ (UProd  X Y)) YW)   

record Exp { : CarCat}(X Y : Obj (Ucat )) : Set₁ where
  field
    : Obj (Ucat )
   app : (_⇒_ (Ucat )) (X×Y (UProd   X)) Y
   curr : (Z : Obj (Ucat ))  (f : (_⇒_ (Ucat )) (X×Y (UProd  Z X)) Y)  ((_⇒_ (Ucat )) Z )
   comm : (Z : Obj (Ucat ))  (f : (_⇒_ (Ucat )) (X×Y (UProd  Z X)) Y)  (_≈_ (Ucat ))((_⊚_ (Ucat )) (Pair⇒ {} Z X  X (curr Z f) ((id (Ucat )) {X})) app) f
   univ : (Z : Obj (Ucat ))  (f : (_⇒_ (Ucat )) (X×Y (UProd  Z X)) Y)  (h : (_⇒_ (Ucat )) Z )  (_≈_ (Ucat ))((_⊚_ (Ucat )) (Pair⇒ {} Z X  X h ((id (Ucat )) {X})) app) f  (_≈_ (Ucat )) (curr Z f) h

open Exp public


record CCC : Set₂ where
 field
  CarC : CarCat
  exp : (X Y : Obj (Ucat CarC))  Exp {CarC} X Y

record Functor (C : Cat) (D : Cat) : Set₁ where
  field
   onObj : (Obj C)  (Obj D)
   onMor : (X Y : Obj C)  (f : (_⇒_ C) X Y)  (_⇒_ D) (onObj X)(onObj Y)
   res≈ : (X Y : Obj C)  (f g : (_⇒_ C) X Y)  (_≈_ C) f g  (_≈_ D) (onMor X Y f) (onMor X Y g)
   onId : (X : Obj C)  (_≈_ D) (onMor X X ((id C) {X})) ((id D) {onObj X})
   onComp : (X Y Z : Obj C)  (f : (_⇒_ C) X Y)  (g : (_⇒_ C) Y Z)  (_≈_ D) ((_⊚_ D) (onMor X Y f) (onMor Y Z g)) (onMor X Z ((_⊚_ C) f g))  

open Functor public


record Adjoint (C D : Cat) (F : Functor C D)(G : Functor D C) : Set₁ where
  field
   counit : (X : Obj D)  (_⇒_ D) ((onObj F) ((onObj G) X)) X 
    : (X : Obj D)  (Y : Obj C)  (_⇒_ D) ((onObj F) Y) X  (_⇒_ C) Y ((onObj G) X)
   f̂ε : (X : Obj D)  (Y : Obj C)  (f : ((_⇒_ D) ((onObj F) Y) X))  (_≈_ D) ((_⊚_ D) ((onMor F) Y ((onObj G) X) ( X Y f)) (counit X)) f
   unif̂ : (X : Obj D)  (Y : Obj C)  (f : ((_⇒_ D) ((onObj F) Y) X))  (g : (_⇒_ C) Y ((onObj G) X))  (_≈_ D) ((_⊚_ D) ((onMor F) Y ((onObj G) X) g) (counit X)) f  (_≈_ C) g ( X Y f)

open Adjoint public

record Pullbacks (C : Cat) (X Y Z : Obj C) (f : (_⇒_ C) X Z)(g : (_⇒_ C) Y Z) : Set₁ where
  field
   X⊗Y : Obj C
   X⊗Y→X : (_⇒_ C) X⊗Y  X
   X⊗Y→Y :  (_⇒_ C) X⊗Y  Y
   f∘p₁≡g∘p₂ : (_≈_ C) ((_⊚_ C) X⊗Y→X  f) ((_⊚_ C) X⊗Y→Y  g)
   W→X⊗Y : (W : Obj C)  (f' : (_⇒_ C) W X)  (g' : (_⇒_ C) W Y)  (_≈_ C) ((_⊚_ C) f' f) ((_⊚_ C) g' g)  (_⇒_ C) W  X⊗Y
   WXY₁ :  (W : Obj C)  (f' : (_⇒_ C) W X)  (g' : (_⇒_ C) W Y)  (f'g' : (_≈_ C) ((_⊚_ C) f' f) ((_⊚_ C) g' g))  (_≈_ C) ((_⊚_ C) (W→X⊗Y W f' g' f'g') X⊗Y→X) f'
   WXY₂ : (W : Obj C)  (f' : (_⇒_ C) W X)  (g' : (_⇒_ C) W Y)  (f'g' : (_≈_ C) ((_⊚_ C) f' f) ((_⊚_ C) g' g))  (_≈_ C) ((_⊚_ C) (W→X⊗Y W f' g' f'g') X⊗Y→Y) g'
   W↠X⊗Y : (W : Obj C)  (f' : (_⇒_ C) W X)  (g' : (_⇒_ C) W Y)  (f'g' : (_≈_ C) ((_⊚_ C) f' f) ((_⊚_ C) g' g))  (h : (_⇒_ C) W X⊗Y)  (_≈_ C) ((_⊚_ C) h X⊗Y→X) f'  (_≈_ C) ((_⊚_ C) h X⊗Y→Y) g' 
                                                                                                                                                                                                                                                              (_≈_ C) (W→X⊗Y W f' g' f'g') h
open Pullbacks public

record CatPull (C : Cat) : Set₁ where
  field
    Pulls : (X Y Z : Obj C)  (f : (_⇒_ C) X Z)  (g : (_⇒_ C) Y Z)  Pullbacks C X Y Z f g

record Iso {C : Cat}(X Y : Obj C) : Set where
 field
  liso : (_⇒_ C) X Y
  riso : (_⇒_ C) Y X
  idisl : (_≈_ C) ((_⊚_ C) liso riso) ((id C) {X})
  idisr : (_≈_ C) ((_⊚_ C) riso liso) ((id C) {Y})

record Nat (C D : Cat) (F G : Functor C D) : Set₁ where
 field
  trf : (X : Obj C)  (_⇒_ D) ((onObj F) X) ((onObj G) X)
  ntsq : (X Y : Obj C)  (f : (_⇒_ C) X Y)  (_≈_ D) ((_⊚_ D) (trf X) ((onMor G) X Y f)) ((_⊚_ D) ((onMor F) X Y f) (trf Y))

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