{-# OPTIONS --without-K --safe #-} open import Categories.Category using (Category) open import Categories.Category.Cocartesian using (Cocartesian) open import Category.Construction.CMonoids using (CMonoids) open import Categories.Category.Monoidal.Bundle using (SymmetricMonoidalCategory) open import Categories.Functor using (Functor) renaming (_∘F_ to _βˆ™_) open import Level using (Level; _βŠ”_) -- A functor from a cocartesian category π’ž to CMonoids[S] -- can be turned into a symmetric monoidal functor from π’ž to S module Functor.Monoidal.Construction.CMonoidValued {o oβ€² β„“ β„“β€² e eβ€² : Level} {π’ž : Category o β„“ e} (π’ž-+ : Cocartesian π’ž) {S : SymmetricMonoidalCategory oβ€² β„“β€² eβ€²} (let module S = SymmetricMonoidalCategory S) (M : Functor π’ž (CMonoids S.symmetric)) where import Categories.Category.Monoidal.Reasoning as βŠ—-Reasoning import Categories.Morphism.Reasoning as β‡’-Reasoning import Object.Monoid.Commutative as CommutativeMonoidObject import Functor.Monoidal.Construction.MonoidValued as MonoidValued open import Categories.Category.Cocartesian using (module CocartesianSymmetricMonoidal) open import Categories.Category.Cocartesian.Bundle using (CocartesianCategory) open import Categories.Category.Construction.Monoids using (Monoids) open import Categories.Category.Monoidal.Symmetric.Properties using (module Shorthands) open import Categories.Functor.Monoidal.Symmetric using (module Lax) open import Categories.Functor.Properties using ([_]-resp-∘) open import Data.Product using (_,_) open import Functor.Forgetful.Instance.CMonoid S.symmetric using (Forget) open import Functor.Forgetful.Instance.Monoid S.monoidal using () renaming (Forget to Forgetβ‚˜) private G : Functor π’ž (Monoids S.monoidal) G = Forget βˆ™ M H : Functor π’ž S.U H = Forgetβ‚˜ βˆ™ G module π’ž = CocartesianCategory (record { cocartesian = π’ž-+ }) module π’ž-SM = CocartesianSymmetricMonoidal π’ž π’ž-+ π’ž-SMC : SymmetricMonoidalCategory o β„“ e π’ž-SMC = record { symmetric = π’ž-SM.+-symmetric } module H = Functor H module M = Functor M open CommutativeMonoidObject S.symmetric using (CommutativeMonoid; CommutativeMonoidβ‡’) open CommutativeMonoid using (ΞΌ; Carrier) renaming (commutative to ΞΌ-commutative) open CommutativeMonoidβ‡’ open π’ž using (_+_; i₁; iβ‚‚; inject₁; injectβ‚‚; +-swap) open S open β‡’-Reasoning U open βŠ—-Reasoning monoidal open Shorthands symmetric ⊲ : {A : π’ž.Obj} β†’ H.β‚€ A βŠ—β‚€ H.β‚€ A β‡’ H.β‚€ A ⊲ {A} = ΞΌ (M.β‚€ A) β‡’βŠ² : {A B : π’ž.Obj} (f : A π’ž.β‡’ B) β†’ H.₁ f ∘ ⊲ β‰ˆ ⊲ ∘ H.₁ f βŠ—β‚ H.₁ f β‡’βŠ² f = preserves-ΞΌ (M.₁ f) ⊲-βŠ— : {n m : π’ž.Obj} β†’ H.β‚€ n βŠ—β‚€ H.β‚€ m β‡’ H.β‚€ (n + m) ⊲-βŠ— = ⊲ ∘ H.₁ i₁ βŠ—β‚ H.₁ iβ‚‚ ⊲-Οƒ : {n : π’ž.Obj} β†’ ⊲ {n} β‰ˆ ⊲ ∘ Οƒβ‡’ ⊲-Οƒ {A} = ΞΌ-commutative (M.β‚€ A) braiding-compat : {n m : π’ž.Obj} β†’ H.₁ +-swap ∘ ⊲-βŠ— {n} {m} β‰ˆ ⊲-βŠ— ∘ Οƒβ‡’ {H.β‚€ n} {H.β‚€ m} braiding-compat {n} {m} = begin H.₁ +-swap ∘ ⊲-βŠ— {n} {m} β‰‘βŸ¨βŸ© H.₁ +-swap ∘ ⊲ {n + m} ∘ H.₁ i₁ βŠ—β‚ H.₁ iβ‚‚ β‰ˆβŸ¨ extendΚ³ (β‡’βŠ² +-swap) ⟩ ⊲ {m + n} ∘ H.₁ +-swap βŠ—β‚ H.₁ +-swap ∘ H.₁ i₁ βŠ—β‚ H.₁ iβ‚‚ β‰ˆβŸ¨ refl⟩∘⟨ βŠ—-distrib-over-∘ ⟨ ⊲ {m + n} ∘ (H.₁ +-swap ∘ H.₁ i₁) βŠ—β‚ (H.₁ +-swap ∘ H.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ [ H ]-resp-∘ inject₁ βŸ©βŠ—βŸ¨ [ H ]-resp-∘ injectβ‚‚ ⟩ ⊲ {m + n} ∘ H.₁ iβ‚‚ βŠ—β‚ H.₁ i₁ β‰ˆβŸ¨ ⊲-Οƒ ⟩∘⟨refl ⟩ (⊲ {m + n} ∘ Οƒβ‡’) ∘ H.₁ iβ‚‚ βŠ—β‚ H.₁ i₁ β‰ˆβŸ¨ extendΛ‘ (braiding.β‡’.commute (H.₁ iβ‚‚ , H.₁ i₁)) ⟩ (⊲ {m + n} ∘ H.₁ i₁ βŠ—β‚ H.₁ iβ‚‚) ∘ Οƒβ‡’ β‰‘βŸ¨βŸ© ⊲-βŠ— {m} {n} ∘ Οƒβ‡’ {H.β‚€ n} {H.β‚€ m} ∎ open MonoidValued π’ž-+ G using (F,βŠ—,Ξ΅) F,βŠ—,Ξ΅,Οƒ : Lax.SymmetricMonoidalFunctor π’ž-SMC S F,βŠ—,Ξ΅,Οƒ = record { F,βŠ—,Ξ΅ ; isBraidedMonoidal = record { F,βŠ—,Ξ΅ ; braiding-compat = braiding-compat } } module F,βŠ—,Ξ΅,Οƒ = Lax.SymmetricMonoidalFunctor F,βŠ—,Ξ΅,Οƒ