{-# OPTIONS --safe #-}
module Cubical.Categories.Instances.FunctorAlgebras where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism renaming (Iso to _≅_)
open import Cubical.Foundations.Univalence
open import Cubical.Categories.Category
open import Cubical.Categories.Functor
open import Cubical.Categories.NaturalTransformation.Base
open _≅_
private
variable ℓC ℓC' : Level
module _ {C : Category ℓC ℓC'} (F : Functor C C) where
open Category
open Functor
IsAlgebra : ob C → Type ℓC'
IsAlgebra x = C [ F-ob F x , x ]
record Algebra : Type (ℓ-max ℓC ℓC') where
constructor algebra
field
carrier : ob C
str : IsAlgebra carrier
open Algebra
IsAlgebraHom : (algA algB : Algebra) → C [ carrier algA , carrier algB ] → Type ℓC'
IsAlgebraHom algA algB f = (f ∘⟨ C ⟩ str algA) ≡ (str algB ∘⟨ C ⟩ F-hom F f)
record AlgebraHom (algA algB : Algebra) : Type ℓC' where
constructor algebraHom
field
carrierHom : C [ carrier algA , carrier algB ]
strHom : IsAlgebraHom algA algB carrierHom
open AlgebraHom
RepAlgebraHom : (algA algB : Algebra) → Type ℓC'
RepAlgebraHom algA algB = Σ[ f ∈ C [ carrier algA , carrier algB ] ] IsAlgebraHom algA algB f
isoRepAlgebraHom : (algA algB : Algebra) → AlgebraHom algA algB ≅ RepAlgebraHom algA algB
fun (isoRepAlgebraHom algA algB) (algebraHom f isalgF) = f , isalgF
inv (isoRepAlgebraHom algA algB) (f , isalgF) = algebraHom f isalgF
rightInv (isoRepAlgebraHom algA algB) (f , isalgF) = refl
leftInv (isoRepAlgebraHom algA algB) (algebraHom f isalgF)= refl
pathRepAlgebraHom : (algA algB : Algebra) → AlgebraHom algA algB ≡ RepAlgebraHom algA algB
pathRepAlgebraHom algA algB = ua (isoToEquiv (isoRepAlgebraHom algA algB))
AlgebraHom≡ : {algA algB : Algebra} {algF algG : AlgebraHom algA algB}
→ (carrierHom algF ≡ carrierHom algG) → algF ≡ algG
carrierHom (AlgebraHom≡ {algA} {algB} {algF} {algG} p i) = p i
strHom (AlgebraHom≡ {algA} {algB} {algF} {algG} p i) = idfun
(PathP (λ j → (p j ∘⟨ C ⟩ str algA) ≡ (str algB ∘⟨ C ⟩ F-hom F (p j)))
(strHom algF)
(strHom algG)
)
(fst (idfun (isContr _) (isOfHLevelPathP' 0
(isOfHLevelPath' 1 (isSetHom C) _ _)
(strHom algF) (strHom algG))))
i
idAlgebraHom : {algA : Algebra} → AlgebraHom algA algA
carrierHom (idAlgebraHom {algA}) = id C
strHom (idAlgebraHom {algA}) =
⋆IdR C (str algA) ∙∙ sym (⋆IdL C (str algA)) ∙∙ cong (λ φ → φ ⋆⟨ C ⟩ str algA) (sym (F-id F))
seqAlgebraHom : {algA algB algC : Algebra}
(algF : AlgebraHom algA algB) (algG : AlgebraHom algB algC)
→ AlgebraHom algA algC
carrierHom (seqAlgebraHom {algA} {algB} {algC} algF algG) = carrierHom algF ⋆⟨ C ⟩ carrierHom algG
strHom (seqAlgebraHom {algA} {algB} {algC} algF algG) =
str algA ⋆⟨ C ⟩ (carrierHom algF ⋆⟨ C ⟩ carrierHom algG)
≡⟨ sym (⋆Assoc C (str algA) (carrierHom algF) (carrierHom algG)) ⟩
(str algA ⋆⟨ C ⟩ carrierHom algF) ⋆⟨ C ⟩ carrierHom algG
≡⟨ cong (λ φ → φ ⋆⟨ C ⟩ carrierHom algG) (strHom algF) ⟩
(F-hom F (carrierHom algF) ⋆⟨ C ⟩ str algB) ⋆⟨ C ⟩ carrierHom algG
≡⟨ ⋆Assoc C (F-hom F (carrierHom algF)) (str algB) (carrierHom algG) ⟩
F-hom F (carrierHom algF) ⋆⟨ C ⟩ (str algB ⋆⟨ C ⟩ carrierHom algG)
≡⟨ cong (λ φ → F-hom F (carrierHom algF) ⋆⟨ C ⟩ φ) (strHom algG) ⟩
F-hom F (carrierHom algF) ⋆⟨ C ⟩ (F-hom F (carrierHom algG) ⋆⟨ C ⟩ str algC)
≡⟨ sym (⋆Assoc C (F-hom F (carrierHom algF)) (F-hom F (carrierHom algG)) (str algC)) ⟩
(F-hom F (carrierHom algF) ⋆⟨ C ⟩ F-hom F (carrierHom algG)) ⋆⟨ C ⟩ str algC
≡⟨ cong (λ φ → φ ⋆⟨ C ⟩ str algC) (sym (F-seq F (carrierHom algF) (carrierHom algG))) ⟩
F-hom F (carrierHom algF ⋆⟨ C ⟩ carrierHom algG) ⋆⟨ C ⟩ str algC ∎
AlgebrasCategory : Category (ℓ-max ℓC ℓC') ℓC'
ob AlgebrasCategory = Algebra
Hom[_,_] AlgebrasCategory = AlgebraHom
id AlgebrasCategory = idAlgebraHom
_⋆_ AlgebrasCategory = seqAlgebraHom
⋆IdL AlgebrasCategory algF = AlgebraHom≡ (⋆IdL C (carrierHom algF))
⋆IdR AlgebrasCategory algF = AlgebraHom≡ (⋆IdR C (carrierHom algF))
⋆Assoc AlgebrasCategory algF algG algH =
AlgebraHom≡ (⋆Assoc C (carrierHom algF) (carrierHom algG) (carrierHom algH))
isSetHom AlgebrasCategory = subst isSet (sym (pathRepAlgebraHom _ _))
(isSetΣ (isSetHom C) (λ f → isProp→isSet (isSetHom C _ _)))
ForgetAlgebra : Functor AlgebrasCategory C
F-ob ForgetAlgebra = carrier
F-hom ForgetAlgebra = carrierHom
F-id ForgetAlgebra = refl
F-seq ForgetAlgebra algF algG = refl
module _ {C : Category ℓC ℓC'} {F G : Functor C C} (τ : NatTrans F G) where
private
module C = Category C
open Functor
open NatTrans
open AlgebraHom
AlgebrasFunctor : Functor (AlgebrasCategory G) (AlgebrasCategory F)
F-ob AlgebrasFunctor (algebra a α) = algebra a (α C.∘ N-ob τ a)
carrierHom (F-hom AlgebrasFunctor (algebraHom f isalgF)) = f
strHom (F-hom AlgebrasFunctor {algebra a α} {algebra b β} (algebraHom f isalgF)) =
(N-ob τ a C.⋆ α) C.⋆ f
≡⟨ C.⋆Assoc (N-ob τ a) α f ⟩
N-ob τ a C.⋆ (α C.⋆ f)
≡⟨ cong (N-ob τ a C.⋆_) isalgF ⟩
N-ob τ a C.⋆ (F-hom G f C.⋆ β)
≡⟨ sym (C.⋆Assoc _ _ _) ⟩
(N-ob τ a C.⋆ F-hom G f) C.⋆ β
≡⟨ cong (C._⋆ β) (sym (N-hom τ f)) ⟩
(F-hom F f C.⋆ N-ob τ b) C.⋆ β
≡⟨ C.⋆Assoc _ _ _ ⟩
F-hom F f C.⋆ (N-ob τ b C.⋆ β) ∎
F-id AlgebrasFunctor = AlgebraHom≡ F refl
F-seq AlgebrasFunctor algΦ algΨ = AlgebraHom≡ F refl