module TAlgebra where open import Level open import Data.Product open import Relation.Binary open Setoid open import Basic open import Category import Functor import Nat import Adjoint open import Monad open Category.Category open Functor.Functor open Nat.Nat open Nat.Export open Adjoint.Export open Monad.Monad record TAlgebra {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} (T : Monad C) : Set (C₀ ⊔ C₁ ⊔ ℓ) where field Tobj : Obj C Tmap : Hom C (fobj (MFunctor T) Tobj) Tobj field join-fmap-alg : C [ C [ Tmap ∘ component (Mjoin T) Tobj ] ≈ C [ Tmap ∘ fmap (MFunctor T) Tmap ] ] map-unit : C [ C [ Tmap ∘ component (Munit T) Tobj ] ≈ id C ] open TAlgebra record TAlgMap {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} {T : Monad C} (a b : TAlgebra T) : Set (C₁ ⊔ ℓ) where field Thom : Hom C (Tobj a) (Tobj b) field hom-comm : C [ C [ Tmap b ∘ fmap (MFunctor T) Thom ] ≈ C [ Thom ∘ Tmap a ] ] open TAlgMap compose : ∀ {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} {T : Monad C} {a b c : TAlgebra T} → TAlgMap b c → TAlgMap a b → TAlgMap a c compose {C = C} {T} {a} {b} {c} f g = record { Thom = C [ Thom f ∘ Thom g ] ; hom-comm = begin⟨ C ⟩ C [ Tmap c ∘ fmap (MFunctor T) (C [ Thom f ∘ Thom g ]) ] ≈⟨ ≈-composite C (refl-hom C) (preserveComp (MFunctor T)) ⟩ C [ Tmap c ∘ C [ fmap (MFunctor T) (Thom f) ∘ fmap (MFunctor T) (Thom g) ] ] ≈⟨ sym-hom C (assoc C) ⟩ C [ C [ Tmap c ∘ fmap (MFunctor T) (Thom f) ] ∘ fmap (MFunctor T) (Thom g) ] ≈⟨ ≈-composite C (hom-comm f) (refl-hom C) ⟩ C [ C [ Thom f ∘ Tmap b ] ∘ fmap (MFunctor T) (Thom g) ] ≈⟨ assoc C ⟩ C [ Thom f ∘ C [ Tmap b ∘ fmap (MFunctor T) (Thom g) ] ] ≈⟨ ≈-composite C (refl-hom C) (hom-comm g) ⟩ C [ Thom f ∘ C [ Thom g ∘ Tmap a ] ] ≈⟨ sym-hom C (assoc C) ⟩ C [ C [ Thom f ∘ Thom g ] ∘ Tmap a ] ∎ } identity : ∀ {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} {T : Monad C} {a : TAlgebra T} → TAlgMap a a identity {C = C} {T} {a} = record { Thom = id C ; hom-comm = begin⟨ C ⟩ C [ Tmap a ∘ fmap (MFunctor T) (id C) ] ≈⟨ ≈-composite C (refl-hom C) (preserveId (MFunctor T)) ⟩ C [ Tmap a ∘ id C ] ≈⟨ rightId C ⟩ Tmap a ≈⟨ sym-hom C (leftId C) ⟩ C [ id C ∘ Tmap a ] ∎ } T-Algs : ∀ {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} (T : Monad C) → Category _ _ _ T-Algs {C = C} T = record { Obj = TAlgebra T; Homsetoid = λ a b → record { Carrier = TAlgMap a b ; _≈_ = λ f g → C [ Thom f ≈ Thom g ] ; isEquivalence = record { refl = refl-hom C ; sym = sym-hom C ; trans = trans-hom C } }; comp = compose; id = identity; leftId = leftId C; rightId = rightId C; assoc = assoc C; ≈-composite = ≈-composite C } Free-TAlg : ∀ {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} (T : Monad C) → Functor.Functor C (T-Algs T) Free-TAlg {C = C} T = record { fobj = λ x → record { Tobj = fobj (MFunctor T) x ; Tmap = component (Mjoin T) x ; join-fmap-alg = join_join T ; map-unit = unit_MFunctor T } ; fmapsetoid = λ {a} {b} → record { mapping = λ x → record { Thom = fmap (MFunctor T) x ; hom-comm = naturality (Mjoin T) } ; preserveEq = Functor.preserveEq (MFunctor T) } ; preserveId = preserveId (MFunctor T) ; preserveComp = preserveComp (MFunctor T) } Forgetful-TAlg : ∀ {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} (T : Monad C) → Functor.Functor (T-Algs T) C Forgetful-TAlg {C = C} T = record { fobj = Tobj ; fmapsetoid = record { mapping = Thom ; preserveEq = λ x≈y → x≈y } ; preserveId = refl-hom C ; preserveComp = refl-hom C } Free⊣Forgetful-TAlg : ∀ {C₀ C₁ ℓ} {C : Category C₀ C₁ ℓ} (T : Monad C) → Free-TAlg T ⊣ Forgetful-TAlg T Free⊣Forgetful-TAlg {C = C} T = Adjoint.unit-triangular-holds-adjoint {C = C} {D = T-Algs T} {FT} {GT} ηT εT triL (λ {a} → triR {a}) where FT = Free-TAlg T GT = Forgetful-TAlg T ηT = record { component = component (Munit T) ; naturality = naturality (Munit T) } εT = record { component = λ X → record { Thom = Tmap X ; hom-comm = sym-hom C (join-fmap-alg X) } ; naturality = λ {a} {b} {f} → hom-comm f } triL : [ C , T-Algs T ] [ Nat.compose (Nat.compose Nat.leftIdNat→ (εT N∘F FT)) (Nat.compose (Nat.assocNat← {F = FT} {GT} {FT}) (Nat.compose (FT F∘N ηT) Nat.rightIdNat←)) ≈ id [ C , T-Algs T ] ] triL = λ {a} → begin⟨ C ⟩ C [ C [ id C ∘ Thom (component εT (fobj FT a)) ] ∘ C [ id C ∘ C [ Thom (fmap FT (component ηT a)) ∘ id C ] ] ] ≈⟨ ≈-composite C (leftId C) (trans-hom C (leftId C) (rightId C)) ⟩ C [ component (Mjoin T) a ∘ fmap (MFunctor T) (component (Munit T) a) ] ≈⟨ MFunctor_unit T ⟩ id C ∎ triR : [ T-Algs T , C ] [ Nat.compose (Nat.compose Nat.rightIdNat→ (GT F∘N εT)) (Nat.compose (Nat.assocNat→ {F = GT} {FT} {GT}) (Nat.compose (ηT N∘F GT) Nat.leftIdNat←)) ≈ id [ T-Algs T , C ] ] triR = λ {a} → begin⟨ C ⟩ C [ C [ id C ∘ fmap GT (component εT a) ] ∘ C [ id C ∘ C [ component ηT (fobj GT a) ∘ id C ] ] ] ≈⟨ ≈-composite C (leftId C) (trans-hom C (leftId C) (rightId C)) ⟩ C [ fmap GT (component εT a) ∘ component ηT (fobj GT a) ] ≈⟨ refl-hom C ⟩ C [ component (GT F∘N εT) a ∘ component (Munit T) (Tobj a) ] ≈⟨ map-unit a ⟩ id C ∎