{-# OPTIONS --safe #-} module Multiset.Categories.Coalgebra where open import Multiset.Prelude open import Cubical.Foundations.HLevels open import Cubical.Categories.Category open import Cubical.Categories.Functor open import Cubical.Categories.Limits.Terminal open import Cubical.Reflection.RecordEquiv private variable ℓC ℓC' : Level module _ {C : Category ℓC ℓC'} (F : Functor C C) where open Category open Functor F renaming (F-ob to F₀_ ; F-hom to F₁_) IsCoalgebra : ob C → Type ℓC' IsCoalgebra x = C [ x , F₀ x ] record Coalgebra : Type (ℓ-max ℓC ℓC') where constructor coalgebra field {carrier} : ob C str : IsCoalgebra carrier open Coalgebra IsCoalgebraHom : (α β : Coalgebra) → C [ carrier α , carrier β ] → Type ℓC' IsCoalgebraHom α β f = f ⋆⟨ C ⟩ β .str ≡ α .str ⋆⟨ C ⟩ F₁ f isPropIsCoalgebraHom : {α β : Coalgebra} (f : C [ carrier α , carrier β ]) → isProp (IsCoalgebraHom α β f) isPropIsCoalgebraHom f = C .isSetHom _ _ record CoalgebraHom (α β : Coalgebra) : Type ℓC' where constructor coalgebraHom field carrierHom : C [ carrier α , carrier β ] strHom : IsCoalgebraHom α β carrierHom open CoalgebraHom unquoteDecl CoalgebraHomIsoΣ = declareRecordIsoΣ CoalgebraHomIsoΣ (quote CoalgebraHom) isSetCoalgebraHom : {α β : Coalgebra} → isSet (CoalgebraHom α β) isSetCoalgebraHom = isOfHLevelRetractFromIso 2 CoalgebraHomIsoΣ (isSetΣSndProp (C .isSetHom) isPropIsCoalgebraHom) idCoalgebraHom : {α : Coalgebra} → CoalgebraHom α α idCoalgebraHom {α} .carrierHom = id C idCoalgebraHom {α} .strHom = goal where abstract goal : IsCoalgebraHom α α (id C) goal = id C ⋆⟨ C ⟩ α .str ≡⟨ ⋆IdL C (α .str) ⟩ α .str ≡⟨ sym (⋆IdR C _) ⟩ α .str ⋆⟨ C ⟩ id C ≡⟨ cong (λ f → α .str ⋆⟨ C ⟩ f) (sym F-id) ⟩ F₁ (id C) ∘⟨ C ⟩ α .str ∎ CoalgebraHom≡ : {α β : Coalgebra} {f g : CoalgebraHom α β} → (f .carrierHom ≡ g .carrierHom) → f ≡ g CoalgebraHom≡ p i .carrierHom = p i CoalgebraHom≡ {f = f} {g = g} p i .strHom = isProp→PathP (λ i → isPropIsCoalgebraHom (p i)) (f .strHom) (g .strHom) i Coalg⟨_⟩[_,_] = CoalgebraHom seqCoalgebraHom : {α β γ : Coalgebra} → (f : CoalgebraHom α β) → (g : CoalgebraHom β γ) → CoalgebraHom α γ seqCoalgebraHom f g .carrierHom = f .carrierHom ⋆⟨ C ⟩ g .carrierHom seqCoalgebraHom {α} {β} {γ} (coalgebraHom f f-hom) (coalgebraHom g g-hom) .strHom = goal where abstract goal : IsCoalgebraHom α γ (f ⋆⟨ C ⟩ g) goal = (f ⋆⟨ C ⟩ g) ⋆⟨ C ⟩ γ .str ≡⟨ ⋆Assoc C _ _ _ ⟩ f ⋆⟨ C ⟩ (g ⋆⟨ C ⟩ γ .str) ≡⟨ lCatWhisker {C = C} _ _ _ g-hom ⟩ f ⋆⟨ C ⟩ (β .str ⋆⟨ C ⟩ F₁ g) ≡⟨ sym (⋆Assoc C _ _ _) ⟩ (f ⋆⟨ C ⟩ β .str) ⋆⟨ C ⟩ F₁ g ≡⟨ rCatWhisker {C = C} _ _ _ f-hom ⟩ (α .str ⋆⟨ C ⟩ F₁ f) ⋆⟨ C ⟩ F₁ g ≡⟨ ⋆Assoc C _ _ _ ⟩ α .str ⋆⟨ C ⟩ (F₁ f ⋆⟨ C ⟩ F₁ g) ≡⟨ lCatWhisker {C = C} _ _ _ (sym (F-seq f g)) ⟩ α .str ⋆⟨ C ⟩ F₁ (f ⋆⟨ C ⟩ g) ∎ CoalgebrasCategory : Category (ℓ-max ℓC ℓC') ℓC' CoalgebrasCategory .ob = Coalgebra CoalgebrasCategory .Hom[_,_] = CoalgebraHom CoalgebrasCategory .id = idCoalgebraHom CoalgebrasCategory ._⋆_ = seqCoalgebraHom CoalgebrasCategory .⋆IdL _ = CoalgebraHom≡ (⋆IdL C _) CoalgebrasCategory .⋆IdR _ = CoalgebraHom≡ (⋆IdR C _) CoalgebrasCategory .⋆Assoc _ _ _ = CoalgebraHom≡ (⋆Assoc C _ _ _) CoalgebrasCategory .isSetHom = isSetCoalgebraHom isTerminalCoalgebra : Coalgebra → Type _ isTerminalCoalgebra = isTerminal CoalgebrasCategory isPropIsTerminalCoalgebra : {ω : Coalgebra} → isProp (isTerminalCoalgebra ω) isPropIsTerminalCoalgebra {ω} = isPropIsTerminal CoalgebrasCategory ω TerminalCoalgebra : Type _ TerminalCoalgebra = Terminal CoalgebrasCategory