{-# OPTIONS --without-K --rewriting #-}
open import lib.Basics
open import lib.types.Paths
open import lib.types.TwoSemiCategory
module lib.two-semi-categories.Functor where
record TwoSemiFunctor {i₁ j₁ i₂ j₂} (C : TwoSemiCategory i₁ j₁) (D : TwoSemiCategory i₂ j₂)
: Type (lmax (lmax i₁ j₁) (lmax i₂ j₂)) where
private
module C = TwoSemiCategory C
module D = TwoSemiCategory D
field
F₀ : C.El → D.El
F₁ : {x y : C.El} → C.Arr x y → D.Arr (F₀ x) (F₀ y)
pres-comp : {x y z : C.El} (f : C.Arr x y) (g : C.Arr y z)
→ F₁ (C.comp f g) == D.comp (F₁ f) (F₁ g)
pres-comp-coh-seq₁ : {w x y z : C.El} (f : C.Arr w x) (g : C.Arr x y) (h : C.Arr y z)
→ F₁ (C.comp (C.comp f g) h) =-= D.comp (F₁ f) (D.comp (F₁ g) (F₁ h))
pres-comp-coh-seq₁ f g h =
F₁ (C.comp (C.comp f g) h)
=⟪ pres-comp (C.comp f g) h ⟫
D.comp (F₁ (C.comp f g)) (F₁ h)
=⟪ ap (λ s → D.comp s (F₁ h)) (pres-comp f g) ⟫
D.comp (D.comp (F₁ f) (F₁ g)) (F₁ h)
=⟪ D.assoc (F₁ f) (F₁ g) (F₁ h) ⟫
D.comp (F₁ f) (D.comp (F₁ g) (F₁ h)) ∎∎
pres-comp-coh-seq₂ : {w x y z : C.El} (f : C.Arr w x) (g : C.Arr x y) (h : C.Arr y z)
→ F₁ (C.comp (C.comp f g) h) =-= D.comp (F₁ f) (D.comp (F₁ g) (F₁ h))
pres-comp-coh-seq₂ f g h =
F₁ (C.comp (C.comp f g) h)
=⟪ ap F₁ (C.assoc f g h) ⟫
F₁ (C.comp f (C.comp g h))
=⟪ pres-comp f (C.comp g h) ⟫
D.comp (F₁ f) (F₁ (C.comp g h))
=⟪ ap (D.comp (F₁ f)) (pres-comp g h) ⟫
D.comp (F₁ f) (D.comp (F₁ g) (F₁ h)) ∎∎
field
pres-comp-coh : {w x y z : C.El} (f : C.Arr w x) (g : C.Arr x y) (h : C.Arr y z)
→ pres-comp-coh-seq₁ f g h =ₛ pres-comp-coh-seq₂ f g h
module FunctorComposition
{i₁ j₁ i₂ j₂ i₃ j₃} {C : TwoSemiCategory i₁ j₁} {D : TwoSemiCategory i₂ j₂} {E : TwoSemiCategory i₃ j₃}
(F : TwoSemiFunctor C D) (G : TwoSemiFunctor D E) where
private
module C = TwoSemiCategory C
module D = TwoSemiCategory D
module E = TwoSemiCategory E
module F = TwoSemiFunctor F
module G = TwoSemiFunctor G
F₀ : C.El → E.El
F₀ = G.F₀ ∘ F.F₀
F₁ : {x y : C.El} → C.Arr x y → E.Arr (F₀ x) (F₀ y)
F₁ f = G.F₁ (F.F₁ f)
pres-comp-seq : {x y z : C.El} (f : C.Arr x y) (g : C.Arr y z)
→ G.F₁ (F.F₁ (C.comp f g)) =-= E.comp (G.F₁ (F.F₁ f)) (G.F₁ (F.F₁ g))
pres-comp-seq f g =
G.F₁ (F.F₁ (C.comp f g))
=⟪ ap G.F₁ (F.pres-comp f g) ⟫
G.F₁ (D.comp (F.F₁ f) (F.F₁ g))
=⟪ G.pres-comp (F.F₁ f) (F.F₁ g) ⟫
E.comp (G.F₁ (F.F₁ f)) (G.F₁ (F.F₁ g)) ∎∎
abstract
pres-comp : {x y z : C.El} (f : C.Arr x y) (g : C.Arr y z)
→ G.F₁ (F.F₁ (C.comp f g)) == E.comp (G.F₁ (F.F₁ f)) (G.F₁ (F.F₁ g))
pres-comp f g = ↯ (pres-comp-seq f g)
pres-comp-β : {x y z : C.El} (f : C.Arr x y) (g : C.Arr y z)
→ pres-comp f g ◃∎ =ₛ pres-comp-seq f g
pres-comp-β f g = =ₛ-in idp
private
abstract
pres-comp-coh : {w x y z : C.El} (f : C.Arr w x) (g : C.Arr x y) (h : C.Arr y z)
→ pres-comp (C.comp f g) h ◃∙ ap (λ s → E.comp s (F₁ h)) (pres-comp f g) ◃∙ E.assoc (F₁ f) (F₁ g) (F₁ h) ◃∎
=ₛ
ap F₁ (C.assoc f g h) ◃∙ pres-comp f (C.comp g h) ◃∙ ap (E.comp (F₁ f)) (pres-comp g h) ◃∎
pres-comp-coh f g h =
pres-comp (C.comp f g) h ◃∙
ap (λ s → E.comp s (F₁ h)) (pres-comp f g) ◃∙
E.assoc (F₁ f) (F₁ g) (F₁ h) ◃∎
=ₛ⟨ 0 & 1 & expand (pres-comp-seq (C.comp f g) h) ⟩
ap G.F₁ (F.pres-comp (C.comp f g) h) ◃∙
G.pres-comp (F.F₁ (C.comp f g)) (F.F₁ h) ◃∙
ap (λ s → E.comp s (F₁ h)) (pres-comp f g) ◃∙
E.assoc (F₁ f) (F₁ g) (F₁ h) ◃∎
=ₛ⟨ 2 & 1 & ap-seq-∙ (λ s → E.comp s (F₁ h)) (pres-comp-seq f g) ⟩
ap G.F₁ (F.pres-comp (C.comp f g) h) ◃∙
G.pres-comp (F.F₁ (C.comp f g)) (F.F₁ h) ◃∙
ap (λ s → E.comp s (F₁ h)) (ap G.F₁ (F.pres-comp f g)) ◃∙
ap (λ s → E.comp s (F₁ h)) (G.pres-comp (F.F₁ f) (F.F₁ g)) ◃∙
E.assoc (F₁ f) (F₁ g) (F₁ h) ◃∎
=ₛ₁⟨ 2 & 1 & ∘-ap (λ s → E.comp s (F₁ h)) G.F₁ (F.pres-comp f g) ⟩
ap G.F₁ (F.pres-comp (C.comp f g) h) ◃∙
G.pres-comp (F.F₁ (C.comp f g)) (F.F₁ h) ◃∙
ap (λ s → E.comp (G.F₁ s) (F₁ h)) (F.pres-comp f g) ◃∙
ap (λ s → E.comp s (F₁ h)) (G.pres-comp (F.F₁ f) (F.F₁ g)) ◃∙
E.assoc (F₁ f) (F₁ g) (F₁ h) ◃∎
=ₛ⟨ 1 & 2 & !ₛ $
homotopy-naturality (λ s → G.F₁ (D.comp s (F.F₁ h)))
(λ s → E.comp (G.F₁ s) (F₁ h))
(λ s → G.pres-comp s (F.F₁ h))
(F.pres-comp f g) ⟩
ap G.F₁ (F.pres-comp (C.comp f g) h) ◃∙
ap (λ s → G.F₁ (D.comp s (F.F₁ h))) (F.pres-comp f g) ◃∙
G.pres-comp (D.comp (F.F₁ f) (F.F₁ g)) (F.F₁ h) ◃∙
ap (λ s → E.comp s (F₁ h)) (G.pres-comp (F.F₁ f) (F.F₁ g)) ◃∙
E.assoc (F₁ f) (F₁ g) (F₁ h) ◃∎
=ₛ⟨ 2 & 3 & G.pres-comp-coh (F.F₁ f) (F.F₁ g) (F.F₁ h) ⟩
ap G.F₁ (F.pres-comp (C.comp f g) h) ◃∙
ap (λ s → G.F₁ (D.comp s (F.F₁ h))) (F.pres-comp f g) ◃∙
ap G.F₁ (D.assoc (F.F₁ f) (F.F₁ g) (F.F₁ h)) ◃∙
G.pres-comp (F.F₁ f) (D.comp (F.F₁ g) (F.F₁ h)) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ₁⟨ 1 & 1 & ap-∘ G.F₁ (λ s → D.comp s (F.F₁ h)) (F.pres-comp f g) ⟩
ap G.F₁ (F.pres-comp (C.comp f g) h) ◃∙
ap G.F₁ (ap (λ s → D.comp s (F.F₁ h)) (F.pres-comp f g)) ◃∙
ap G.F₁ (D.assoc (F.F₁ f) (F.F₁ g) (F.F₁ h)) ◃∙
G.pres-comp (F.F₁ f) (D.comp (F.F₁ g) (F.F₁ h)) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ⟨ 0 & 3 & ap-seq-=ₛ G.F₁ (F.pres-comp-coh f g h) ⟩
ap G.F₁ (ap F.F₁ (C.assoc f g h)) ◃∙
ap G.F₁ (F.pres-comp f (C.comp g h)) ◃∙
ap G.F₁ (ap (D.comp (F.F₁ f)) (F.pres-comp g h)) ◃∙
G.pres-comp (F.F₁ f) (D.comp (F.F₁ g) (F.F₁ h)) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ₁⟨ 2 & 1 & ∘-ap G.F₁ (D.comp (F.F₁ f)) (F.pres-comp g h) ⟩
ap G.F₁ (ap F.F₁ (C.assoc f g h)) ◃∙
ap G.F₁ (F.pres-comp f (C.comp g h)) ◃∙
ap (G.F₁ ∘ D.comp (F.F₁ f)) (F.pres-comp g h) ◃∙
G.pres-comp (F.F₁ f) (D.comp (F.F₁ g) (F.F₁ h)) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ⟨ 2 & 2 &
homotopy-naturality (G.F₁ ∘ D.comp (F.F₁ f))
(E.comp (F₁ f) ∘ G.F₁)
(G.pres-comp (F.F₁ f))
(F.pres-comp g h) ⟩
ap G.F₁ (ap F.F₁ (C.assoc f g h)) ◃∙
ap G.F₁ (F.pres-comp f (C.comp g h)) ◃∙
G.pres-comp (F.F₁ f) (F.F₁ (C.comp g h)) ◃∙
ap (λ s → E.comp (F₁ f) (G.F₁ s)) (F.pres-comp g h) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ⟨ 1 & 2 & contract ⟩
ap G.F₁ (ap F.F₁ (C.assoc f g h)) ◃∙
pres-comp f (C.comp g h) ◃∙
ap (λ s → E.comp (F₁ f) (G.F₁ s)) (F.pres-comp g h) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ₁⟨ 2 & 1 & ap-∘ (E.comp (F₁ f)) G.F₁ (F.pres-comp g h) ⟩
ap G.F₁ (ap F.F₁ (C.assoc f g h)) ◃∙
pres-comp f (C.comp g h) ◃∙
ap (E.comp (F₁ f)) (ap G.F₁ (F.pres-comp g h)) ◃∙
ap (E.comp (F₁ f)) (G.pres-comp (F.F₁ g) (F.F₁ h)) ◃∎
=ₛ⟨ 2 & 2 & ∙-ap-seq (E.comp (F₁ f)) (pres-comp-seq g h) ⟩
ap G.F₁ (ap F.F₁ (C.assoc f g h)) ◃∙
pres-comp f (C.comp g h) ◃∙
ap (E.comp (F₁ f)) (pres-comp g h) ◃∎
=ₛ₁⟨ 0 & 1 & ∘-ap G.F₁ F.F₁ (C.assoc f g h) ⟩
ap F₁ (C.assoc f g h) ◃∙
pres-comp f (C.comp g h) ◃∙
ap (E.comp (F₁ f)) (pres-comp g h) ◃∎ ∎ₛ
composition : TwoSemiFunctor C E
composition =
record
{ F₀ = F₀
; F₁ = F₁
; pres-comp = pres-comp
; pres-comp-coh = pres-comp-coh
}
open FunctorComposition
renaming ( composition to comp-functors
; pres-comp-seq to comp-functors-pres-comp-seq
; pres-comp to comp-functors-pres-comp
; pres-comp-β to comp-functors-pres-comp-β
) public
infixr 80 _–F→_
_–F→_ = comp-functors