{-# OPTIONS --without-K --safe #-} module Categories.Category.Construction.F-Coalgebras where open import Level open import Categories.Category open import Categories.Functor hiding (id) open import Categories.Functor.Algebra open import Categories.Functor.Coalgebra open import Categories.Object.Initial open import Categories.Object.Terminal import Categories.Morphism.Reasoning as MR import Categories.Morphism as Mor using (_≅_; Iso) open import Categories.Category.Construction.F-Algebras open import Categories.Functor.Duality private variable o ℓ e : Level C : Category o ℓ e F-Coalgebras : {C : Category o ℓ e} → Endofunctor C → Category (ℓ ⊔ o) (e ⊔ ℓ) e F-Coalgebras {C = C} F = record { Obj = F-Coalgebra F ; _⇒_ = F-Coalgebra-Morphism ; _≈_ = λ α₁ α₂ → f α₁ ≈ f α₂ ; _∘_ = λ α₁ α₂ → record { f = f α₁ ∘ f α₂ ; commutes = F-Algebra-Morphism.commutes (F-Coalgebra-Morphism⇒coF-Algebra-Morphism α₁ coF-Algebras.∘ F-Coalgebra-Morphism⇒coF-Algebra-Morphism α₂) } ; id = record { f = id; commutes = F-Algebra-Morphism.commutes coF-Algebras.id } ; assoc = assoc ; sym-assoc = sym-assoc ; identityˡ = identityˡ ; identityʳ = identityʳ ; identity² = identity² ; equiv = record { refl = refl ; sym = sym ; trans = trans } ; ∘-resp-≈ = ∘-resp-≈ } where open Category C open MR C open HomReasoning open Equiv open F-Coalgebra-Morphism module coF-Algebras = Category (Category.op (F-Algebras (Functor.op F))) F-Coalgebras⇒coF-Algebras : {C : Category o ℓ e} → (F : Endofunctor C) → Functor (F-Coalgebras F) (Category.op (F-Algebras (Functor.op F))) F-Coalgebras⇒coF-Algebras {C = C} F = record { F₀ = F-Coalgebra⇒coF-Algebra ; F₁ = F-Coalgebra-Morphism⇒coF-Algebra-Morphism ; identity = refl ; homomorphism = refl ; F-resp-≈ = λ x → x } where open Category C open MR C open HomReasoning open Equiv open F-Coalgebra-Morphism private coIsTerminal⇒Initial : ∀ {C : Category o ℓ e} {F : Endofunctor C} {T : Category.Obj (F-Coalgebras F) } → IsTerminal (F-Coalgebras F) T → IsInitial (F-Algebras (Functor.op F)) (F-Coalgebra⇒coF-Algebra T) coIsTerminal⇒Initial {C = C} {F = F} {T = T} isTT = record { ! = F-Coalgebra-Morphism⇒coF-Algebra-Morphism ¡ ; !-unique = λ γ → Functor.F-resp-≈ (F-Coalgebras⇒coF-Algebras F) {f = ¡} {g = coF-Algebra-Morphism⇒F-Coalgebra-Morphism γ} (¡-unique (coF-Algebra-Morphism⇒F-Coalgebra-Morphism γ)) } where open Category (F-Algebras (Functor.op F)) open MR (F-Algebras (Functor.op F)) open IsTerminal isTT renaming (! to ¡; !-unique to ¡-unique) open HomReasoning open Equiv module CoLambek {C : Category o ℓ e} {F : Endofunctor C} (T : Terminal (F-Coalgebras F)) where open Category C open Functor F using (F₀) open F-Coalgebra using (α) open Mor C open Terminal T private module F⊤ = F-Coalgebra ⊤ A = F⊤.A a : A ⇒ F₀ A a = F⊤.α coInitial : Initial (F-Algebras (Functor.op F)) coInitial = record { ⊥ = F-Coalgebra⇒coF-Algebra ⊤ ; ⊥-is-initial = coIsTerminal⇒Initial ⊤-is-terminal } module coLambek = Lambek coInitial colambek : A ≅ F₀ A colambek = record { from = to coLambek.lambek ; to = from coLambek.lambek ; iso = record { isoˡ = isoˡ (iso coLambek.lambek) ; isoʳ = isoʳ (iso coLambek.lambek) } } where open HomReasoning open Mor._≅_ open Mor.Iso