aboutsummaryrefslogtreecommitdiff
path: root/Functor/Monoidal/Construction
diff options
context:
space:
mode:
Diffstat (limited to 'Functor/Monoidal/Construction')
-rw-r--r--Functor/Monoidal/Construction/MonoidValued.agda214
-rw-r--r--Functor/Monoidal/Construction/MultisetOf.agda89
2 files changed, 303 insertions, 0 deletions
diff --git a/Functor/Monoidal/Construction/MonoidValued.agda b/Functor/Monoidal/Construction/MonoidValued.agda
new file mode 100644
index 0000000..937714d
--- /dev/null
+++ b/Functor/Monoidal/Construction/MonoidValued.agda
@@ -0,0 +1,214 @@
+{-# OPTIONS --without-K --safe #-}
+
+open import Categories.Category using (Category)
+open import Categories.Category.Cocartesian using (Cocartesian)
+open import Categories.Category.Cocartesian.Bundle using (CocartesianCategory)
+open import Categories.Category.Construction.Monoids using (Monoids)
+open import Categories.Category.Monoidal.Bundle using (MonoidalCategory)
+open import Categories.Functor using (Functor) renaming (_∘F_ to _βˆ™_)
+open import Level using (Level; _βŠ”_)
+
+-- A functor from a cocartesian category π’ž to Monoids[S]
+-- can be turned into a monoidal functor from π’ž to S
+
+module Functor.Monoidal.Construction.MonoidValued
+ {o oβ€² β„“ β„“β€² e eβ€² : Level}
+ {π’ž : Category o β„“ e}
+ (π’ž-+ : Cocartesian π’ž)
+ {S : MonoidalCategory oβ€² β„“β€² eβ€²}
+ (let module S = MonoidalCategory S)
+ (M : Functor π’ž (Monoids S.monoidal))
+ where
+
+import Categories.Category.Monoidal.Reasoning as βŠ—-Reasoning
+import Categories.Category.Monoidal.Utilities as βŠ—-Util
+import Categories.Morphism.Reasoning as β‡’-Reasoning
+import Categories.Object.Monoid as MonoidObject
+
+open import Categories.Category using (module Definitions)
+open import Categories.Category.Cocartesian using (module CocartesianMonoidal)
+open import Categories.Category.Product using (_⁂_)
+open import Categories.Functor.Monoidal using (MonoidalFunctor; IsMonoidalFunctor)
+open import Categories.Functor.Properties using ([_]-resp-square; [_]-resp-∘)
+open import Categories.Morphism using (_β‰…_)
+open import Categories.NaturalTransformation using (NaturalTransformation; ntHelper)
+open import Data.Product using (_,_)
+open import Functor.Forgetful.Instance.Monoid S.monoidal using (Forget)
+
+private
+
+ G : Functor π’ž S.U
+ G = Forget βˆ™ M
+
+ module π’ž = CocartesianCategory (record { cocartesian = π’ž-+ })
+ module π’ž-M = CocartesianMonoidal π’ž π’ž-+
+
+ π’ž-MC : MonoidalCategory o β„“ e
+ π’ž-MC = record { monoidal = π’ž-M.+-monoidal }
+
+ module +-assoc {n} {m} {o} = _β‰…_ (π’ž.+-assoc {n} {m} {o})
+ module +-Ξ» {n} = _β‰…_ (π’ž-M.βŠ₯+Aβ‰…A {n})
+ module +-ρ {n} = _β‰…_ (π’ž-M.A+βŠ₯β‰…A {n})
+
+ module G = Functor G
+ module M = Functor M
+
+ open MonoidObject S.monoidal using (Monoid; Monoid⇒)
+ open Monoid renaming (assoc to ΞΌ-assoc; identityΛ‘ toΒ ΞΌ-identityΛ‘; identityΚ³ to ΞΌ-identityΚ³)
+ open Monoid⇒
+
+ open π’ž using (-+-; _+_; _+₁_; i₁; iβ‚‚; inject₁; injectβ‚‚)
+
+ module _ where
+
+ open Category π’ž
+ open β‡’-Reasoning π’ž
+ open βŠ—-Reasoning π’ž-M.+-monoidal
+
+ module _ {n m o : Obj} where
+
+ private
+
+ +-Ξ± : (n + m) + o π’ž.β‡’ n + (m + o)
+ +-Ξ± = +-assoc.to {n} {m} {o}
+
+ +-α∘iβ‚‚ : +-Ξ± ∘ iβ‚‚ β‰ˆ iβ‚‚ ∘ iβ‚‚
+ +-α∘iβ‚‚ = injectβ‚‚
+
+ +-α∘iβ‚βˆ˜i₁ : (+-Ξ± ∘ i₁) ∘ i₁ β‰ˆ i₁
+ +-α∘iβ‚βˆ˜i₁ = inject₁ ⟩∘⟨refl β—‹ inject₁
+
+ +-α∘iβ‚βˆ˜iβ‚‚ : (+-Ξ± ∘ i₁) ∘ iβ‚‚ β‰ˆ iβ‚‚ ∘ i₁
+ +-α∘iβ‚βˆ˜iβ‚‚ = inject₁ ⟩∘⟨refl β—‹ injectβ‚‚
+
+ module _ {n : Obj} where
+
+ +-ρ∘i₁ : +-ρ.from {n} ∘ i₁ β‰ˆ id
+ +-ρ∘i₁ = inject₁
+
+ +-λ∘iβ‚‚ : +-Ξ».from {n} ∘ iβ‚‚ β‰ˆ id
+ +-λ∘iβ‚‚ = injectβ‚‚
+
+ open S
+ open β‡’-Reasoning U
+ open βŠ—-Reasoning monoidal
+ open βŠ—-Util.Shorthands monoidal
+
+ ⊲ : {A : π’ž.Obj} β†’ G.β‚€ A βŠ—β‚€ G.β‚€ A β‡’ G.β‚€ A
+ ⊲ {A} = ΞΌ (M.β‚€ A)
+
+ β‡’βŠ² : {A B : π’ž.Obj} (f : A π’ž.β‡’ B) β†’ G.₁ f ∘ ⊲ β‰ˆ ⊲ ∘ G.₁ f βŠ—β‚ G.₁ f
+ β‡’βŠ² f = preserves-ΞΌ (M.₁ f)
+
+ Ξ΅ : {A : π’ž.Obj} β†’ unit β‡’ G.β‚€ A
+ Ξ΅ {A} = Ξ· (M.β‚€ A)
+
+ β‡’Ξ΅ : {A B : π’ž.Obj} (f : A π’ž.β‡’ B) β†’ G.₁ f ∘ Ξ΅ β‰ˆ Ξ΅
+ β‡’Ξ΅ f = preserves-Ξ· (M.₁ f)
+
+ ⊲-βŠ— : {n m : π’ž.Obj} β†’ G.β‚€ n βŠ—β‚€ G.β‚€ m β‡’ G.β‚€ (n + m)
+ ⊲-βŠ— = ⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚
+
+ module _ {n nβ€² m mβ€² : π’ž.Obj} (f : n π’ž.β‡’ nβ€²) (g : m π’ž.β‡’ mβ€²) where
+
+ open Definitions S.U using (CommutativeSquare)
+
+ left₁ : CommutativeSquare (G.₁ i₁) (G.₁ f) (G.₁ (f +₁ g)) (G.₁ i₁)
+ left₁ = [ G ]-resp-square inject₁
+
+ leftβ‚‚ : CommutativeSquare (G.₁ iβ‚‚) (G.₁ g) (G.₁ (f +₁ g)) (G.₁ iβ‚‚)
+ leftβ‚‚ = [ G ]-resp-square injectβ‚‚
+
+ right : CommutativeSquare ⊲ (G.₁ (f +₁ g) βŠ—β‚ G.₁ (f +₁ g)) (G.₁ (f +₁ g)) ⊲
+ right = β‡’βŠ² (f +₁ g)
+
+ ⊲-βŠ—-commute :
+ CommutativeSquare
+ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚)
+ (G.₁ f βŠ—β‚ G.₁ g)
+ (G.₁ (f +₁ g))
+ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚)
+ ⊲-βŠ—-commute = glueβ€² right (parallel left₁ leftβ‚‚)
+
+ ⊲-βŠ—-homo : NaturalTransformation (βŠ— βˆ™ (G ⁂ G)) (G βˆ™Β -+-)
+ ⊲-βŠ—-homo = ntHelper record
+ { Ξ· = Ξ» (n , m) β†’ ⊲-βŠ— {n} {m}
+ ; commute = Ξ» (f , g) β†’ Equiv.sym (⊲-βŠ—-commute f g)
+ }
+
+ ⊲-βŠ—-Ξ±
+ : {n m o : π’ž.Obj}
+ β†’ G.₁ (+-assoc.to {n} {m} {o})
+ ∘ (ΞΌ (M.β‚€ ((n + m) + o)) ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚)
+ ∘ (ΞΌ (M.β‚€ (n + m)) ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) βŠ—β‚ id
+ β‰ˆ (ΞΌ (M.β‚€ (n + m + o)) ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚)
+ ∘ id βŠ—β‚ (ΞΌ (M.β‚€ (m + o)) ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚)
+ ∘ Ξ±β‡’
+ ⊲-βŠ—-Ξ± {n} {m} {o} = begin
+ G.₁ +-Ξ± ∘ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) βŠ—β‚ id β‰ˆβŸ¨ refl⟩∘⟨ pullΚ³ merge₁ʳ ⟩
+ G.₁ +-Ξ± ∘ ⊲ ∘ (G.₁ i₁ ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) βŠ—β‚ G.₁ iβ‚‚ β‰ˆβŸ¨ extendΚ³ (β‡’βŠ² +-Ξ±) ⟩
+ ⊲ ∘ G.₁ +-Ξ± βŠ—β‚ G.₁ +-Ξ± ∘ (G.₁ i₁ ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) βŠ—β‚ G.₁ iβ‚‚ β‰ˆβŸ¨ refl⟩∘⟨ βŠ—-distrib-over-∘ ⟨
+ ⊲ ∘ (G.₁ +-Ξ± ∘ G.₁ i₁ ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) βŠ—β‚ (G.₁ +-Ξ± ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ pullΛ‘ (Equiv.sym G.homomorphism) βŸ©βŠ—βŸ¨ [ G ]-resp-square +-α∘iβ‚‚ ⟩
+ ⊲ ∘ (G.₁ (+-Ξ± π’ž.∘ i₁) ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ extendΚ³ (β‡’βŠ² (+-Ξ± π’ž.∘ i₁)) βŸ©βŠ—βŸ¨refl ⟩
+ ⊲ ∘ (⊲ ∘ G.₁ (+-Ξ± π’ž.∘ i₁) βŠ—β‚ G.₁ (+-Ξ± π’ž.∘ i₁) ∘ _) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ (refl⟩∘⟨ βŠ—-distrib-over-∘) βŸ©βŠ—βŸ¨refl ⟨
+ ⊲ ∘ (⊲ ∘ _ βŠ—β‚ (G.₁ (+-Ξ± π’ž.∘ i₁) ∘ G.₁ iβ‚‚)) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ (refl⟩∘⟨ [ G ]-resp-∘ +-α∘iβ‚βˆ˜i₁ βŸ©βŠ—βŸ¨ [ G ]-resp-square +-α∘iβ‚βˆ˜iβ‚‚) βŸ©βŠ—βŸ¨refl ⟩
+ ⊲ ∘ (⊲ ∘ G.₁ i₁ βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ i₁)) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ split₁ˑ ⟩
+ ⊲ ∘ ⊲ βŠ—β‚ id ∘ (G.₁ i₁ βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ i₁)) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ extendΚ³ (ΞΌ-assoc (M.β‚€ (n + (m + o)))) ⟩
+ ⊲ ∘ (id βŠ—β‚ ⊲ ∘ Ξ±β‡’) ∘ (G.₁ i₁ βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ i₁)) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ assoc ⟩
+ ⊲ ∘ id βŠ—β‚ ⊲ ∘ Ξ±β‡’ ∘ (G.₁ i₁ βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ i₁)) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ refl⟩∘⟨ assoc-commute-from ⟩
+ ⊲ ∘ id βŠ—β‚ ⊲ ∘ G.₁ i₁ βŠ—β‚ ((G.₁ iβ‚‚ ∘ G.₁ i₁) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚)) ∘ Ξ±β‡’ β‰ˆβŸ¨ refl⟩∘⟨ pullΛ‘ mergeβ‚‚Λ‘ ⟩
+ ⊲ ∘ G.₁ i₁ βŠ—β‚ (⊲ ∘ (G.₁ iβ‚‚ ∘ G.₁ i₁) βŠ—β‚ (G.₁ iβ‚‚ ∘ G.₁ iβ‚‚)) ∘ Ξ±β‡’ β‰ˆβŸ¨ refl⟩∘⟨ reflβŸ©βŠ—βŸ¨ (refl⟩∘⟨ βŠ—-distrib-over-∘) ⟩∘⟨refl ⟩
+ ⊲ ∘ G.₁ i₁ βŠ—β‚ (⊲ ∘ G.₁ iβ‚‚ βŠ—β‚ G.₁ iβ‚‚ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ Ξ±β‡’ β‰ˆβŸ¨ refl⟩∘⟨ reflβŸ©βŠ—βŸ¨ (extendΚ³ (β‡’βŠ² iβ‚‚)) ⟩∘⟨refl ⟨
+ ⊲ ∘ G.₁ i₁ βŠ—β‚ (G.₁ iβ‚‚ ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ Ξ±β‡’ β‰ˆβŸ¨ pushΚ³ (pushΛ‘ splitβ‚‚Κ³) ⟩
+ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ id βŠ—β‚ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ Ξ±β‡’ ∎
+ where
+ +-Ξ± : (n + m) + o π’ž.β‡’ n + (m + o)
+ +-Ξ± = +-assoc.to {n} {m} {o}
+
+ module _ {A B : π’ž.Obj} (f : AΒ π’ž.β‡’ B) where
+
+ ⊲-Ξ΅Κ³ : ⊲ ∘ G.₁ f βŠ—β‚ Ξ΅ β‰ˆ G.₁ f ∘ ρ⇒
+ ⊲-Ρʳ = begin
+ ⊲ ∘ G.₁ f βŠ—β‚ Ξ΅ β‰ˆβŸ¨ refl⟩∘⟨ serialize₂₁ ⟩
+ ⊲ ∘ id βŠ—β‚ Ξ΅ ∘ G.₁ f βŠ—β‚ id β‰ˆβŸ¨ pullΛ‘ (Equiv.sym (ΞΌ-identityΚ³Β (M.β‚€ B))) ⟩
+ ρ⇒ ∘ G.₁ f βŠ—β‚ id β‰ˆβŸ¨ unitorΚ³-commute-from ⟩
+ G.₁ f ∘ ρ⇒ ∎
+
+ ⊲-Ξ΅Λ‘ : ⊲ ∘ Ξ΅ βŠ—β‚ G.₁ f β‰ˆ G.₁ f ∘ Ξ»β‡’
+ ⊲-Ρˑ = begin
+ ⊲ ∘ Ξ΅ βŠ—β‚ G.₁ f β‰ˆβŸ¨ refl⟩∘⟨ serialize₁₂ ⟩
+ ⊲ ∘ Ξ΅ βŠ—β‚ id ∘ id βŠ—β‚ G.₁ f β‰ˆβŸ¨ pullΛ‘ (Equiv.sym (ΞΌ-identityΛ‘Β (M.β‚€ B))) ⟩
+ Ξ»β‡’ ∘ id βŠ—β‚ G.₁ f β‰ˆβŸ¨ unitorΛ‘-commute-from ⟩
+ G.₁ f ∘ Ξ»β‡’ ∎
+
+ module _ {n : π’ž.Obj} where
+
+ ⊲-βŠ—-Ξ» : G.₁ (+-Ξ».from {n}) ∘ ⊲-βŠ— ∘ Ξ΅ βŠ—β‚ id β‰ˆ Ξ»β‡’
+ ⊲-βŠ—-Ξ» = begin
+ G.₁ +-Ξ».from ∘ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ Ξ΅ βŠ—β‚ id β‰ˆβŸ¨ refl⟩∘⟨ pullΚ³ merge₁ʳ ⟩
+ G.₁ +-Ξ».from ∘ ⊲ ∘ (G.₁ i₁ ∘ Ξ΅) βŠ—β‚ G.₁ iβ‚‚ β‰ˆβŸ¨ refl⟩∘⟨ refl⟩∘⟨ β‡’Ξ΅ i₁ βŸ©βŠ—βŸ¨refl ⟩
+ G.₁ +-Ξ».from ∘ ⊲ ∘ Ξ΅ βŠ—β‚ G.₁ iβ‚‚ β‰ˆβŸ¨ refl⟩∘⟨ ⊲-Ξ΅Λ‘ iβ‚‚ ⟩
+ G.₁ +-Ξ».from ∘ G.₁ iβ‚‚ ∘ Ξ»β‡’ β‰ˆβŸ¨ cancelΛ‘ ([ G ]-resp-∘ +-λ∘iβ‚‚ β—‹ G.identity) ⟩
+ Ξ»β‡’ ∎
+
+ ⊲-βŠ—-ρ : G.₁ (+-ρ.from {n}) ∘ ⊲-βŠ— ∘ id βŠ—β‚ Ξ΅ β‰ˆ ρ⇒
+ ⊲-βŠ—-ρ = begin
+ G.₁ +-ρ.from ∘ (⊲ ∘ G.₁ i₁ βŠ—β‚ G.₁ iβ‚‚) ∘ id βŠ—β‚ Ξ΅ β‰ˆβŸ¨ refl⟩∘⟨ pullΚ³ mergeβ‚‚Κ³ ⟩
+ G.₁ +-ρ.from ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ (G.₁ iβ‚‚ ∘ Ξ΅) β‰ˆβŸ¨ refl⟩∘⟨ refl⟩∘⟨ reflβŸ©βŠ—βŸ¨ β‡’Ξ΅ iβ‚‚ ⟩
+ G.₁ +-ρ.from ∘ ⊲ ∘ G.₁ i₁ βŠ—β‚ Ξ΅ β‰ˆβŸ¨ refl⟩∘⟨ ⊲-Ξ΅Κ³ i₁ ⟩
+ G.₁ +-ρ.from ∘ G.₁ i₁ ∘ ρ⇒ β‰ˆβŸ¨ cancelΛ‘ ([ G ]-resp-∘ +-ρ∘i₁ β—‹ G.identity) ⟩
+ ρ⇒ Β  ∎
+
+F,βŠ—,Ξ΅ : MonoidalFunctor π’ž-MC S
+F,βŠ—,Ξ΅ = record
+ { F = G
+ ; isMonoidal = record
+ { Ξ΅ = Ξ΅
+ ; βŠ—-homo = ⊲-βŠ—-homo
+ ; associativity = ⊲-βŠ—-Ξ±
+ ; unitaryΛ‘ = ⊲-βŠ—-Ξ»
+ ; unitaryΚ³ = ⊲-βŠ—-ρ 
+ }
+ }
+
+module F,βŠ—,Ξ΅ = MonoidalFunctor F,βŠ—,Ξ΅
diff --git a/Functor/Monoidal/Construction/MultisetOf.agda b/Functor/Monoidal/Construction/MultisetOf.agda
new file mode 100644
index 0000000..83bdf52
--- /dev/null
+++ b/Functor/Monoidal/Construction/MultisetOf.agda
@@ -0,0 +1,89 @@
+{-# OPTIONS --without-K --safe #-}
+
+open import Categories.Category using (Category)
+open import Categories.Category.Cocartesian.Bundle using (CocartesianCategory)
+open import Categories.Category.Construction.Monoids using (Monoids)
+open import Categories.Category.Monoidal.Bundle using (SymmetricMonoidalCategory)
+open import Categories.Functor using (Functor) renaming (_∘F_ to _βˆ™_)
+open import Category.Construction.CMonoids using (CMonoids)
+
+open import Level using (Level)
+
+module Functor.Monoidal.Construction.MultisetOf
+ {o oβ€² β„“ β„“β€² e eβ€² : Level}
+ {π’ž : CocartesianCategory o β„“ e}
+ {S : SymmetricMonoidalCategory oβ€² β„“β€² eβ€²}
+ (let module π’ž = CocartesianCategory π’ž)
+ (let module S = SymmetricMonoidalCategory S)
+ (G : Functor π’ž.U S.U)
+ (M : Functor S.U (CMonoids S.symmetric))
+ where
+
+import Categories.Category.Monoidal.Reasoning as βŠ—-Reasoning
+import Categories.Category.Monoidal.Utilities as βŠ—-Util
+import Categories.Morphism.Reasoning as β‡’-Reasoning
+import Object.Monoid.Commutative as CMonoidObject
+
+open import Categories.Category.Cocartesian using (module CocartesianSymmetricMonoidal)
+open import Categories.Category.Monoidal.Symmetric.Properties using (module Shorthands)
+open import Categories.Functor.Monoidal using (MonoidalFunctor)
+open import Categories.Functor.Monoidal.Symmetric using (module Lax)
+open import Categories.Functor.Properties using ([_]-resp-∘)
+open import Data.Product using (_,_)
+
+module G = Functor G
+module M = Functor M
+module π’ž-SM = CocartesianSymmetricMonoidal π’ž.U π’ž.cocartesian
+
+open π’ž using (βŠ₯; -+-; _+_; _+₁_; i₁; iβ‚‚; inject₁; injectβ‚‚; +-swap)
+open Lax using (SymmetricMonoidalFunctor)
+
+open S
+open Functor
+open CMonoidObject symmetric using (CommutativeMonoid; CommutativeMonoid⇒)
+open CommutativeMonoid renaming (assoc to ΞΌ-assoc; identityΛ‘ toΒ ΞΌ-identityΛ‘; identityΚ³ to ΞΌ-identityΚ³; commutative to ΞΌ-commutative)
+open CommutativeMonoid⇒
+
+Forget : Functor (CMonoids symmetric) (Monoids monoidal)
+Forget .Fβ‚€ = monoid
+Forget .F₁ = monoidβ‡’
+Forget .identity = Equiv.refl
+Forget .homomorphism = Equiv.refl
+Forget .F-resp-β‰ˆ x = x
+
+π’ž-SMC : SymmetricMonoidalCategory o β„“ e
+π’ž-SMC = record { symmetric = π’ž-SM.+-symmetric }
+
+open import Functor.Monoidal.Construction.ListOf {π’ž = π’ž} G (Forget βˆ™ M)
+ using (List∘G; ListOf,++,[]; module LG; ++; module List; ++β‡’)
+
+open Shorthands symmetric
+
+++-swap : {A : Obj} β†’ ++ {A} β‰ˆ ++ ∘ Οƒβ‡’
+++-swap {A} = ΞΌ-commutative (M.β‚€ A)
+
+open β‡’-Reasoning U
+open βŠ—-Reasoning monoidal
+
+++-βŠ—-Οƒ
+ : {X Y : π’ž.Obj}
+ β†’ LG.₁ (+-swap {X} {Y}) ∘ ++ ∘ LG.₁ i₁ βŠ—β‚ LG.₁ iβ‚‚
+ β‰ˆ (++ ∘ LG.₁ i₁ βŠ—β‚ LG.₁ iβ‚‚) ∘ Οƒβ‡’
+++-βŠ—-Οƒ {X} {Y} = begin
+ LG.₁ +-swap ∘ ++ ∘ LG.₁ i₁ βŠ—β‚ LG.₁ iβ‚‚ β‰ˆβŸ¨ extendΚ³ (++β‡’ (G.₁ +-swap)) ⟩
+ ++ ∘ LG.₁ +-swap βŠ—β‚ LG.₁ +-swap ∘ LG.₁ i₁ βŠ—β‚ LG.₁ iβ‚‚ β‰ˆβŸ¨ refl⟩∘⟨ βŠ—-distrib-over-∘ ⟨
+ ++ ∘ (LG.₁ +-swap ∘ LG.₁ i₁) βŠ—β‚ (LG.₁ +-swap ∘ LG.₁ iβ‚‚) β‰ˆβŸ¨ refl⟩∘⟨ [ List∘G ]-resp-∘ inject₁ βŸ©βŠ—βŸ¨ [ List∘G ]-resp-∘ injectβ‚‚ ⟩
+ ++ ∘ LG.₁ iβ‚‚ βŠ—β‚ LG.₁ i₁ β‰ˆβŸ¨ pushΛ‘ ++-swap ⟩
+ ++ ∘ Οƒβ‡’ ∘ LG.₁ iβ‚‚ βŠ—β‚ LG.₁ i₁ β‰ˆβŸ¨ pushΚ³ (braiding.β‡’.commute (LG.₁ iβ‚‚ , LG.₁ i₁ )) ⟩
+ (++ ∘ LG.₁ i₁ βŠ—β‚ LG.₁ iβ‚‚) ∘ Οƒβ‡’ ∎
+
+open SymmetricMonoidalFunctor
+
+module ListOf,++,[] = MonoidalFunctor ListOf,++,[]
+
+MultisetOf,++,[] : SymmetricMonoidalFunctor π’ž-SMC S
+MultisetOf,++,[] .F = List∘G
+MultisetOf,++,[] .isBraidedMonoidal = record
+ { isMonoidal = ListOf,++,[].isMonoidal
+ ; braiding-compat = ++-βŠ—-Οƒ
+ }