aboutsummaryrefslogtreecommitdiff
path: root/Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@protonmail.com>2025-04-23 10:09:32 -0500
committerJacques Comeaux <jacquesrcomeaux@protonmail.com>2025-04-23 10:09:32 -0500
commitf7afdb1823fe8d785849f817d022efa100007560 (patch)
tree34ebb6ee2b94c1ba8b0278f9d4458c62825fb3e5 /Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda
parentdf517e27a5a6d1740e7d982f3c01205d27aff347 (diff)
Category of decorated cospans is symmetric monoidal
Diffstat (limited to 'Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda')
-rw-r--r--Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda169
1 files changed, 169 insertions, 0 deletions
diff --git a/Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda b/Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda
new file mode 100644
index 0000000..346999b
--- /dev/null
+++ b/Functor/Cartesian/Instance/Underlying/SymmetricMonoidal/FinitelyCocomplete.agda
@@ -0,0 +1,169 @@
+{-# OPTIONS --without-K --safe #-}
+{-# OPTIONS --lossy-unification #-}
+
+open import Level using (Level)
+
+module Functor.Cartesian.Instance.Underlying.SymmetricMonoidal.FinitelyCocomplete {o ℓ e : Level} where
+
+import Categories.Morphism.Reasoning as ⇒-Reasoning
+import Categories.Category.Monoidal.Utilities as ⊗-Util
+
+open import Categories.Category.Cartesian.Bundle using (CartesianCategory)
+open import Categories.Category.Monoidal.Bundle using (SymmetricMonoidalCategory)
+open import Categories.Category.Product using (_※_)
+open import Categories.Category.Product.Properties using () renaming (project₁ to p₁; project₂ to p₂; unique to u)
+open import Categories.Functor.Core using (Functor)
+open import Categories.Functor.Cartesian using (CartesianF)
+open import Categories.Functor.Monoidal.Symmetric using (module Lax)
+open import Categories.NaturalTransformation.Core using (ntHelper)
+open import Categories.NaturalTransformation.NaturalIsomorphism.Monoidal.Symmetric using (module Lax)
+open import Categories.Object.Product using (IsProduct)
+open import Categories.Object.Terminal using (IsTerminal)
+open import Data.Product.Base using (_,_; <_,_>; proj₁; proj₂)
+
+open import Category.Cartesian.Instance.FinitelyCocompletes {o} {ℓ} {e} using (FinitelyCocompletes-CC)
+open import Category.Cocomplete.Finitely.Bundle using (FinitelyCocompleteCategory)
+open import Category.Cartesian.Instance.SymMonCat {o} {ℓ} {e} using (SymMonCat-CC)
+open import Functor.Instance.Underlying.SymmetricMonoidal.FinitelyCocomplete {o} {ℓ} {e} using () renaming (Underlying to U)
+
+module CartesianCategory′ {o ℓ e : Level} (C : CartesianCategory o ℓ e) where
+ module CC = CartesianCategory C
+ open import Categories.Object.Terminal using (Terminal)
+ open Terminal CC.terminal public
+ open import Categories.Category.BinaryProducts using (BinaryProducts)
+ open BinaryProducts CC.products public
+ open CC public
+
+module FC = CartesianCategory′ FinitelyCocompletes-CC
+module SMC = CartesianCategory′ SymMonCat-CC
+module U = Functor U
+
+F-resp-⊤ : IsTerminal SMC.U (U.₀ FC.⊤)
+F-resp-⊤ = _
+
+F-resp-× : {A B : FC.Obj} → IsProduct SMC.U (U.₁ (FC.π₁ {A} {B})) (U.₁ (FC.π₂ {A} {B}))
+F-resp-× {A} {B} = record
+ { ⟨_,_⟩ = pairing
+ ; project₁ = λ { {C} {F} {G} → project₁ {C} F G }
+ ; project₂ = λ { {C} {F} {G} → project₂ {C} F G }
+ ; unique = λ { {C} {H} {F} {G} ≃₁ ≃₂ → unique {C} F G H ≃₁ ≃₂ }
+ }
+ where
+ module _ {C : SMC.Obj} (F : Lax.SymmetricMonoidalFunctor C (U.₀ A)) (G : Lax.SymmetricMonoidalFunctor C (U.₀ B)) where
+ module F = Lax.SymmetricMonoidalFunctor F
+ module G = Lax.SymmetricMonoidalFunctor G
+ pairing : Lax.SymmetricMonoidalFunctor C (U.₀ (A FC.× B))
+ pairing = record
+ { F = F.F ※ G.F
+ ; isBraidedMonoidal = record
+ { isMonoidal = record
+ { ε = F.ε , G.ε
+ ; ⊗-homo = ntHelper record
+ { η = < F.⊗-homo.η , G.⊗-homo.η >
+ ; commute = < F.⊗-homo.commute , G.⊗-homo.commute >
+ }
+ ; associativity = F.associativity , G.associativity
+ ; unitaryˡ = F.unitaryˡ , G.unitaryˡ
+ ; unitaryʳ = F.unitaryʳ , G.unitaryʳ
+ }
+ ; braiding-compat = F.braiding-compat , G.braiding-compat
+ }
+ }
+ module pairing = Lax.SymmetricMonoidalFunctor pairing
+ module A = FinitelyCocompleteCategory A
+ module B = FinitelyCocompleteCategory B
+ module C = SymmetricMonoidalCategory C
+ module A′ = SymmetricMonoidalCategory (U.₀ A)
+ module B′ = SymmetricMonoidalCategory (U.₀ B)
+ project₁ : Lax.SymmetricMonoidalNaturalIsomorphism ((U.₁ (FC.π₁ {A} {B})) SMC.∘ pairing) F
+ project₁ = record
+ { U = p₁ {o} {ℓ} {e} {o} {ℓ} {e} {o} {ℓ} {e} {A.U} {B.U} {C.U} {F.F} {G.F}
+ ; F⇒G-isMonoidal = record
+ { ε-compat = ¡-unique₂ (id ∘ F.ε ∘ ¡) F.ε
+ ; ⊗-homo-compat = λ { {X} {Y} → identityˡ ○ refl⟩∘⟨ sym ([]-cong₂ identityʳ identityʳ) }
+ }
+ }
+ where
+ open FinitelyCocompleteCategory A
+ open HomReasoning
+ open Equiv
+ open ⇒-Reasoning A.U
+ project₂ : Lax.SymmetricMonoidalNaturalIsomorphism (U.₁ {A FC.× B} {B} FC.π₂ SMC.∘ pairing) G
+ project₂ = record
+ { U = p₂ {o} {ℓ} {e} {o} {ℓ} {e} {o} {ℓ} {e} {A.U} {B.U} {C.U} {F.F} {G.F}
+ ; F⇒G-isMonoidal = record
+ { ε-compat = ¡-unique₂ (id ∘ G.ε ∘ ¡) G.ε
+ ; ⊗-homo-compat = λ { {X} {Y} → identityˡ ○ refl⟩∘⟨ sym ([]-cong₂ identityʳ identityʳ) }
+ }
+ }
+ where
+ open FinitelyCocompleteCategory B
+ open HomReasoning
+ open Equiv
+ open ⇒-Reasoning B.U
+ unique
+ : (H : Lax.SymmetricMonoidalFunctor C (U.F₀ (A FC.× B)))
+ → Lax.SymmetricMonoidalNaturalIsomorphism (U.₁ {A FC.× B} {A} FC.π₁ SMC.∘ H) F
+ → Lax.SymmetricMonoidalNaturalIsomorphism (U.₁ {A FC.× B} {B} FC.π₂ SMC.∘ H) G
+ → Lax.SymmetricMonoidalNaturalIsomorphism pairing H
+ unique H ≃₁ ≃₂ = record
+ { U = u {o} {ℓ} {e} {o} {ℓ} {e} {o} {ℓ} {e} {A.U} {B.U} {C.U} {F.F} {G.F} {H.F} ≃₁.U ≃₂.U
+ ; F⇒G-isMonoidal = record
+ { ε-compat = ε-compat₁ , ε-compat₂
+ ; ⊗-homo-compat =
+ λ { {X} {Y} → ⊗-homo-compat₁ {X} {Y} , ⊗-homo-compat₂ {X} {Y} }
+ }
+ }
+ where
+ module H = Lax.SymmetricMonoidalFunctor H
+ module ≃₁ = Lax.SymmetricMonoidalNaturalIsomorphism ≃₁
+ module ≃₂ = Lax.SymmetricMonoidalNaturalIsomorphism ≃₂
+ ε-compat₁ : ≃₁.⇐.η C.unit A.∘ F.ε A.≈ proj₁ H.ε
+ ε-compat₁ = refl⟩∘⟨ sym ≃₁.ε-compat ○ cancelˡ (≃₁.iso.isoˡ C.unit) ○ ¡-unique₂ (proj₁ H.ε ∘ ¡) (proj₁ H.ε)
+ where
+ open A
+ open HomReasoning
+ open ⇒-Reasoning A.U
+ open Equiv
+ ε-compat₂ : ≃₂.⇐.η C.unit B.∘ G.ε B.≈ proj₂ H.ε
+ ε-compat₂ = refl⟩∘⟨ sym ≃₂.ε-compat ○ cancelˡ (≃₂.iso.isoˡ C.unit) ○ ¡-unique₂ (proj₂ H.ε ∘ ¡) (proj₂ H.ε)
+ where
+ open B
+ open HomReasoning
+ open ⇒-Reasoning B.U
+ open Equiv
+ ⊗-homo-compat₁
+ : {X Y : C.Obj}
+ → ≃₁.⇐.η (C.⊗.₀ (X , Y))
+ A.∘ F.⊗-homo.η (X , Y)
+ A.≈ proj₁ (H.⊗-homo.η (X , Y))
+ A.∘ (≃₁.⇐.η X A.+₁ ≃₁.⇐.η Y)
+ ⊗-homo-compat₁ {X} {Y} = switch-fromtoʳ (≃₁.FX≅GX ⊗ᵢ ≃₁.FX≅GX) (assoc ○ sym (switch-fromtoˡ ≃₁.FX≅GX (refl⟩∘⟨ introʳ A.+-η ○ ≃₁.⊗-homo-compat)))
+ where
+ open A
+ open HomReasoning
+ open Equiv
+ open ⇒-Reasoning A.U
+ open ⊗-Util A′.monoidal
+ ⊗-homo-compat₂
+ : {X Y : C.Obj}
+ → ≃₂.⇐.η (C.⊗.₀ (X , Y))
+ B.∘ G.⊗-homo.η (X , Y)
+ B.≈ proj₂ (H.⊗-homo.η (X , Y))
+ B.∘ (≃₂.⇐.η X B.+₁ ≃₂.⇐.η Y)
+ ⊗-homo-compat₂ = switch-fromtoʳ (≃₂.FX≅GX ⊗ᵢ ≃₂.FX≅GX) (assoc ○ sym (switch-fromtoˡ ≃₂.FX≅GX (refl⟩∘⟨ introʳ B.+-η ○ ≃₂.⊗-homo-compat)))
+ where
+ open B
+ open HomReasoning
+ open Equiv
+ open ⇒-Reasoning B.U
+ open ⊗-Util B′.monoidal
+
+Underlying : CartesianF FinitelyCocompletes-CC SymMonCat-CC
+Underlying = record
+ { F = U
+ ; isCartesian = record
+ { F-resp-⊤ = F-resp-⊤
+ ; F-resp-× = F-resp-×
+ }
+ }