{-# OPTIONS --without-K --safe #-}
module Cats.Category.Cat where
open import Cats.Functor public using (Functor ; _∘_ ; id)
open import Data.Product using (_,_)
open import Data.Unit using (⊤ ; tt)
open import Level
open import Relation.Binary using
(IsEquivalence ; _Preserves_⟶_ ; _Preserves₂_⟶_⟶_)
open import Relation.Binary.PropositionalEquality as ≡ using (_≡_)
open import Cats.Category.Base
open import Cats.Category.Zero
open import Cats.Category.One
open import Cats.Trans.Iso as NatIso using (NatIso ; iso ; forth-natural)
import Cats.Category.Constructions.Iso as Iso
open Functor
open Iso.Build._≅_
private
module ≅ {lo la l≈} (C : Category lo la l≈) = Iso.Build.≅ C
_⇒_ : ∀ {lo la l≈ lo′ la′ l≈′}
→ Category lo la l≈ → Category lo′ la′ l≈′ → Set _
C ⇒ D = Functor C D
module _ {lo la l≈ lo′ la′ l≈′}
{C : Category lo la l≈} {D : Category lo′ la′ l≈′}
where
infixr 4 _≈_
_≈_ : (F G : C ⇒ D) → Set (lo ⊔ la ⊔ lo′ ⊔ la′ ⊔ l≈′)
F ≈ G = NatIso F G
equiv : IsEquivalence _≈_
equiv = record
{ refl = NatIso.id
; sym = NatIso.sym
; trans = λ eq₁ eq₂ → eq₂ NatIso.∘ eq₁
}
module _ {lo la l≈ lo′ la′ l≈′}
{C : Category lo la l≈} {D : Category lo′ la′ l≈′}
where
∘-resp : ∀ {lo″ la″ l≈″} {E : Category lo″ la″ l≈″}
→ {F G : D ⇒ E} {H I : C ⇒ D}
→ F ≈ G
→ H ≈ I
→ F ∘ H ≈ G ∘ I
∘-resp {E = E} {F} {G} {H} {I}
record { iso = F≅G ; forth-natural = fnat-GH }
record { iso = H≅I ; forth-natural = fnat-HI }
= record
{ iso = ≅.trans E F≅G (fobj-resp G H≅I)
; forth-natural = λ {_} {_} {f} →
begin
(fmap G (forth H≅I) E.∘ forth F≅G) E.∘ fmap F (fmap H f)
≈⟨ E.assoc ⟩
fmap G (forth H≅I) E.∘ forth F≅G E.∘ fmap F (fmap H f)
≈⟨ E.∘-resp-r fnat-GH ⟩
fmap G (forth H≅I) E.∘ fmap G (fmap H f) E.∘ forth F≅G
≈⟨ E.unassoc ⟩
(fmap G (forth H≅I) E.∘ fmap G (fmap H f)) E.∘ forth F≅G
≈⟨ E.∘-resp-l (fmap-∘ G) ⟩
fmap G (forth H≅I D.∘ fmap H f) E.∘ forth F≅G
≈⟨ E.∘-resp-l (fmap-resp G fnat-HI) ⟩
fmap G (fmap I f D.∘ forth H≅I) E.∘ forth F≅G
≈⟨ E.∘-resp-l (E.≈.sym (fmap-∘ G)) ⟩
(fmap G (fmap I f) E.∘ fmap G (forth H≅I)) E.∘ forth F≅G
≈⟨ E.assoc ⟩
fmap G (fmap I f) E.∘ fmap G (forth H≅I) E.∘ forth F≅G
∎
}
where
module D = Category D
module E = Category E
open E.≈-Reasoning
id-r : {F : C ⇒ D} → F ∘ id ≈ F
id-r {F} = record
{ iso = ≅.refl D
; forth-natural = D.≈.trans D.id-l (D.≈.sym D.id-r)
}
where
module D = Category D
id-l : {F : C ⇒ D} → id ∘ F ≈ F
id-l {F} = record
{ iso = ≅.refl D
; forth-natural = D.≈.trans D.id-l (D.≈.sym D.id-r)
}
where
module D = Category D
assoc : ∀ {lo″ la″ l≈″ lo‴ la‴ l≈‴}
→ {E : Category lo″ la″ l≈″} {X : Category lo‴ la‴ l≈‴}
→ (F : E ⇒ X) (G : D ⇒ E) (H : C ⇒ D)
→ (F ∘ G) ∘ H ≈ F ∘ (G ∘ H)
assoc {E = E} {X} _ _ _ = record
{ iso = ≅.refl X
; forth-natural = X.≈.trans X.id-l (X.≈.sym X.id-r)
}
where
module X = Category X
Cat : ∀ lo la l≈
→ Category (suc (lo ⊔ la ⊔ l≈)) (lo ⊔ la ⊔ l≈) (lo ⊔ la ⊔ l≈)
Cat lo la l≈ = record
{ Obj = Category lo la l≈
; _⇒_ = _⇒_
; _≈_ = _≈_
; id = id
; _∘_ = _∘_
; equiv = equiv
; ∘-resp = ∘-resp
; id-r = id-r
; id-l = id-l
; assoc = λ {_} {_} {_} {_} {F} {G} {H} → assoc F G H
}