# The category of monoids in a monoidal category. #

We define monoids in a monoidal category C and show that the category of monoids is equivalent to the category of lax monoidal functors from the unit monoidal category to C. We also show that if C is braided, then the category of monoids is naturally monoidal.

structure Mon_ (C : Type u₁) [] :
Type (max u₁ v₁)

A monoid object internal to a monoidal category.

When the monoidal category is preadditive, this is also sometimes called an "algebra object".

Instances For
@[simp]
theorem Mon_.one_mul {C : Type u₁} [] (self : Mon_ C) :
@[simp]
theorem Mon_.mul_one {C : Type u₁} [] (self : Mon_ C) :
@[simp]
theorem Mon_.trivial_X (C : Type u₁) [] :
().X = 𝟙_ C
@[simp]
theorem Mon_.trivial_mul (C : Type u₁) [] :
().mul = .hom
@[simp]
theorem Mon_.trivial_one (C : Type u₁) [] :
().one =
def Mon_.trivial (C : Type u₁) [] :

The trivial monoid object. We later show this is initial in Mon_ C.

Equations
• = { X := 𝟙_ C, one := , mul := .hom, one_mul := , mul_one := , mul_assoc := }
Instances For
instance Mon_.instInhabited (C : Type u₁) [] :
Equations
• = { default := }
@[simp]
theorem Mon_.one_mul_hom {C : Type u₁} [] {M : Mon_ C} {Z : C} (f : Z M.X) :
@[simp]
theorem Mon_.mul_one_hom {C : Type u₁} [] {M : Mon_ C} {Z : C} (f : Z M.X) :
theorem Mon_.mul_assoc_flip {C : Type u₁} [] {M : Mon_ C} :
theorem Mon_.Hom.ext {C : Type u₁} :
∀ {inst : } {inst_1 : } {M N : Mon_ C} (x y : M.Hom N), x.hom = y.homx = y
theorem Mon_.Hom.ext_iff {C : Type u₁} :
∀ {inst : } {inst_1 : } {M N : Mon_ C} (x y : M.Hom N), x = y x.hom = y.hom
structure Mon_.Hom {C : Type u₁} [] (M : Mon_ C) (N : Mon_ C) :
Type v₁

A morphism of monoid objects.

Instances For
@[simp]
theorem Mon_.Hom.one_hom {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (self : M.Hom N) :
@[simp]
theorem Mon_.Hom.mul_hom {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (self : M.Hom N) :
@[simp]
theorem Mon_.Hom.one_hom_assoc {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (self : M.Hom N) {Z : C} (h : N.X Z) :
@[simp]
theorem Mon_.Hom.mul_hom_assoc {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (self : M.Hom N) {Z : C} (h : N.X Z) :
@[simp]
theorem Mon_.id_hom {C : Type u₁} [] (M : Mon_ C) :
M.id.hom =
def Mon_.id {C : Type u₁} [] (M : Mon_ C) :
M.Hom M

The identity morphism on a monoid object.

Equations
• M.id = { hom := , one_hom := , mul_hom := }
Instances For
instance Mon_.homInhabited {C : Type u₁} [] (M : Mon_ C) :
Inhabited (M.Hom M)
Equations
• M.homInhabited = { default := M.id }
@[simp]
theorem Mon_.comp_hom {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} {O : Mon_ C} (f : M.Hom N) (g : N.Hom O) :
def Mon_.comp {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} {O : Mon_ C} (f : M.Hom N) (g : N.Hom O) :
M.Hom O

Composition of morphisms of monoid objects.

Equations
Instances For
instance Mon_.instCategory {C : Type u₁} [] :
Equations
• Mon_.instCategory =
theorem Mon_.ext {C : Type u₁} [] {X : Mon_ C} {Y : Mon_ C} {f : X Y} {g : X Y} (w : f.hom = g.hom) :
f = g
@[simp]
theorem Mon_.id_hom' {C : Type u₁} [] (M : Mon_ C) :
@[simp]
theorem Mon_.comp_hom' {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} {K : Mon_ C} (f : M N) (g : N K) :
@[simp]
theorem Mon_.forget_obj (C : Type u₁) [] (A : Mon_ C) :
().obj A = A.X
@[simp]
theorem Mon_.forget_map (C : Type u₁) [] :
∀ {X Y : Mon_ C} (f : X Y), ().map f = f.hom
def Mon_.forget (C : Type u₁) [] :

The forgetful functor from monoid objects to the ambient category.

Equations
• = { obj := fun (A : Mon_ C) => A.X, map := fun {X Y : Mon_ C} (f : X Y) => f.hom, map_id := , map_comp := }
Instances For
instance Mon_.forget_faithful {C : Type u₁} [] :
().Faithful
Equations
• =
instance Mon_.instIsIsoHomOfMapForget {C : Type u₁} [] {A : Mon_ C} {B : Mon_ C} (f : A B) [e : CategoryTheory.IsIso (().map f)] :
Equations
• = e
instance Mon_.instReflectsIsomorphismsForget {C : Type u₁} [] :
().ReflectsIsomorphisms

The forgetful functor from monoid objects to the ambient category reflects isomorphisms.

Equations
• =
@[simp]
theorem Mon_.mkIso_hom_hom {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (f : M.X N.X) (one_f : autoParam (CategoryTheory.CategoryStruct.comp M.one f.hom = N.one) _auto✝) (mul_f : autoParam (CategoryTheory.CategoryStruct.comp M.mul f.hom = CategoryTheory.CategoryStruct.comp () N.mul) _auto✝) :
(Mon_.mkIso f one_f mul_f).hom.hom = f.hom
@[simp]
theorem Mon_.mkIso_inv_hom {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (f : M.X N.X) (one_f : autoParam (CategoryTheory.CategoryStruct.comp M.one f.hom = N.one) _auto✝) (mul_f : autoParam (CategoryTheory.CategoryStruct.comp M.mul f.hom = CategoryTheory.CategoryStruct.comp () N.mul) _auto✝) :
(Mon_.mkIso f one_f mul_f).inv.hom = f.inv
def Mon_.mkIso {C : Type u₁} [] {M : Mon_ C} {N : Mon_ C} (f : M.X N.X) (one_f : autoParam (CategoryTheory.CategoryStruct.comp M.one f.hom = N.one) _auto✝) (mul_f : autoParam (CategoryTheory.CategoryStruct.comp M.mul f.hom = CategoryTheory.CategoryStruct.comp () N.mul) _auto✝) :
M N

Construct an isomorphism of monoids by giving an isomorphism between the underlying objects and checking compatibility with unit and multiplication only in the forward direction.

Equations
• Mon_.mkIso f one_f mul_f = { hom := { hom := f.hom, one_hom := , mul_hom := }, inv := { hom := f.inv, one_hom := , mul_hom := }, hom_inv_id := , inv_hom_id := }
Instances For
instance Mon_.uniqueHomFromTrivial {C : Type u₁} [] (A : Mon_ C) :
Equations
• A.uniqueHomFromTrivial = { default := { hom := A.one, one_hom := , mul_hom := }, uniq := }
instance Mon_.instHasInitial {C : Type u₁} [] :
Equations
• =
@[simp]
theorem CategoryTheory.LaxMonoidalFunctor.mapMon_map_hom {C : Type u₁} [] {D : Type u₂} [] (F : ) :
∀ {X Y : Mon_ C} (f : X Y), (F.mapMon.map f).hom = F.map f.hom
@[simp]
theorem CategoryTheory.LaxMonoidalFunctor.mapMon_obj_mul {C : Type u₁} [] {D : Type u₂} [] (F : ) (A : Mon_ C) :
(F.mapMon.obj A).mul = CategoryTheory.CategoryStruct.comp (F A.X A.X) (F.map A.mul)
@[simp]
theorem CategoryTheory.LaxMonoidalFunctor.mapMon_obj_one {C : Type u₁} [] {D : Type u₂} [] (F : ) (A : Mon_ C) :
(F.mapMon.obj A).one = CategoryTheory.CategoryStruct.comp F (F.map A.one)
@[simp]
theorem CategoryTheory.LaxMonoidalFunctor.mapMon_obj_X {C : Type u₁} [] {D : Type u₂} [] (F : ) (A : Mon_ C) :
(F.mapMon.obj A).X = F.obj A.X
def CategoryTheory.LaxMonoidalFunctor.mapMon {C : Type u₁} [] {D : Type u₂} [] (F : ) :

A lax monoidal functor takes monoid objects to monoid objects.

That is, a lax monoidal functor F : C ⥤ D induces a functor Mon_ C ⥤ Mon_ D.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.LaxMonoidalFunctor.mapMonFunctor_obj (C : Type u₁) [] (D : Type u₂) [] (F : ) :
= F.mapMon
@[simp]
theorem CategoryTheory.LaxMonoidalFunctor.mapMonFunctor_map_app_hom (C : Type u₁) [] (D : Type u₂) [] :
∀ {X Y : } (α : X Y) (A : Mon_ C), (().app A).hom = α.app A.X

mapMon is functorial in the lax monoidal functor.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.laxMonoidalToMon_map (C : Type u₁) [] :
∀ {X Y : } (α : X Y), = ().app
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.laxMonoidalToMon_obj (C : Type u₁) [] :
= F.mapMon.obj

Implementation of Mon_.equivLaxMonoidalFunctorPUnit.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.monToLaxMonoidal_obj_μ (C : Type u₁) [] (A : Mon_ C) :
∀ (x x_1 : ), x x_1 = A.mul
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.monToLaxMonoidal_obj_toFunctor_map (C : Type u₁) [] (A : Mon_ C) :
∀ {X Y : } (x : X Y), .map x = CategoryTheory.CategoryStruct.id ((fun (x : ) => A.X) X)
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.monToLaxMonoidal_map_toNatTrans_app (C : Type u₁) [] :
∀ {X Y : Mon_ C} (f : X Y) (x : ), .app x = f.hom
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.monToLaxMonoidal_obj_ε (C : Type u₁) [] (A : Mon_ C) :
= A.one
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.monToLaxMonoidal_obj_toFunctor_obj (C : Type u₁) [] (A : Mon_ C) :
∀ (x : ), .obj x = A.X

Implementation of Mon_.equivLaxMonoidalFunctorPUnit.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]

Implementation of Mon_.equivLaxMonoidalFunctorPUnit.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.counitIso_inv_app_hom (C : Type u₁) [] (X : Mon_ C) :
(.app X).hom =
@[simp]
theorem Mon_.EquivLaxMonoidalFunctorPUnit.counitIso_hom_app_hom (C : Type u₁) [] (X : Mon_ C) :
(.app X).hom =

Implementation of Mon_.equivLaxMonoidalFunctorPUnit.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
@[simp]
@[simp]

Monoid objects in C are "just" lax monoidal functors from the trivial monoidal category to C.

Equations
• One or more equations did not get rendered due to their size.
Instances For

In this section, we prove that the category of monoids in a braided monoidal category is monoidal.

Given two monoids M and N in a braided monoidal category C, the multiplication on the tensor product M.X ⊗ N.X is defined in the obvious way: it is the tensor product of the multiplications on M and N, except that the tensor factors in the source come in the wrong order, which we fix by pre-composing with a permutation isomorphism constructed from the braiding.

(There is a subtlety here: in fact there are two ways to do these, using either the positive or negative crossing.)

A more conceptual way of understanding this definition is the following: The braiding on C gives rise to a monoidal structure on the tensor product functor from C × C to C. A pair of monoids in C gives rise to a monoid in C × C, which the tensor product functor by being monoidal takes to a monoid in C. The permutation isomorphism appearing in the definition of the multiplication on the tensor product of two monoids is an instance of a more general family of isomorphisms which together form a strength that equips the tensor product functor with a monoidal structure, and the monoid axioms for the tensor product follow from the monoid axioms for the tensor factors plus the properties of the strength (i.e., monoidal functor axioms). The strength tensor_μ of the tensor product functor has been defined in Mathlib.CategoryTheory.Monoidal.Braided. Its properties, stated as independent lemmas in that module, are used extensively in the proofs below. Notice that we could have followed the above plan not only conceptually but also as a possible implementation and could have constructed the tensor product of monoids via mapMon, but we chose to give a more explicit definition directly in terms of tensor_μ.

To complete the definition of the monoidal category structure on the category of monoids, we need to provide definitions of associator and unitors. The obvious candidates are the associator and unitors from C, but we need to prove that they are monoid morphisms, i.e., compatible with unit and multiplication. These properties translate to the monoidality of the associator and unitors (with respect to the monoidal structures on the functors they relate), which have also been proved in Mathlib.CategoryTheory.Monoidal.Braided.

theorem Mon_.one_leftUnitor {C : Type u₁} [] {M : Mon_ C} :
= M.one
theorem Mon_.one_rightUnitor {C : Type u₁} [] {M : Mon_ C} :
= M.one
@[simp]
theorem Mon_.monMonoidalStruct_tensorHom_hom {C : Type u₁} [] :
∀ {X₁ Y₁ X₂ Y₂ : Mon_ C} (f : X₁ Y₁) (g : X₂ Y₂), =
@[simp]
theorem Mon_.monMonoidalStruct_tensorObj_X {C : Type u₁} [] (M : Mon_ C) (N : Mon_ C) :
Equations
• One or more equations did not get rendered due to their size.
@[simp]
theorem Mon_.tensorUnit_X {C : Type u₁} [] :
(𝟙_ (Mon_ C)).X = 𝟙_ C
@[simp]
theorem Mon_.tensorUnit_one {C : Type u₁} [] :
(𝟙_ (Mon_ C)).one =
@[simp]
theorem Mon_.tensorUnit_mul {C : Type u₁} [] :
(𝟙_ (Mon_ C)).mul = .hom
@[simp]
theorem Mon_.tensorObj_one {C : Type u₁} [] (X : Mon_ C) (Y : Mon_ C) :
=
@[simp]
theorem Mon_.tensorObj_mul {C : Type u₁} [] (X : Mon_ C) (Y : Mon_ C) :
@[simp]
theorem Mon_.whiskerLeft_hom {C : Type u₁} [] {X : Mon_ C} {Y : Mon_ C} (f : X Y) (Z : Mon_ C) :
@[simp]
theorem Mon_.whiskerRight_hom {C : Type u₁} [] (X : Mon_ C) {Y : Mon_ C} {Z : Mon_ C} (f : Y Z) :
@[simp]
theorem Mon_.leftUnitor_hom_hom {C : Type u₁} [] (X : Mon_ C) :
.hom =
@[simp]
theorem Mon_.leftUnitor_inv_hom {C : Type u₁} [] (X : Mon_ C) :
.hom =
@[simp]
theorem Mon_.rightUnitor_hom_hom {C : Type u₁} [] (X : Mon_ C) :
.hom =
@[simp]
theorem Mon_.rightUnitor_inv_hom {C : Type u₁} [] (X : Mon_ C) :
.hom =
@[simp]
theorem Mon_.associator_hom_hom {C : Type u₁} [] (X : Mon_ C) (Y : Mon_ C) (Z : Mon_ C) :
.hom.hom = ().hom
@[simp]
theorem Mon_.associator_inv_hom {C : Type u₁} [] (X : Mon_ C) (Y : Mon_ C) (Z : Mon_ C) :
.inv.hom = ().inv
@[simp]
theorem Mon_.tensor_one {C : Type u₁} [] (M : Mon_ C) (N : Mon_ C) :
=
@[simp]
theorem Mon_.tensor_mul {C : Type u₁} [] (M : Mon_ C) (N : Mon_ C) :
instance Mon_.monMonoidal {C : Type u₁} [] :
Equations

The forgetful functor from Mon_ C to C is monoidal when C is braided monoidal.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem Mon_.forgetMonoidal_toFunctor (C : Type u₁) [] :
.toFunctor =
@[simp]
theorem Mon_.forgetMonoidal_ε (C : Type u₁) [] :
=
@[simp]
theorem Mon_.forgetMonoidal_μ (C : Type u₁) [] (X : Mon_ C) (Y : Mon_ C) :
theorem Mon_.one_braiding {C : Type u₁} [] {X : Mon_ C} {Y : Mon_ C} :

We next show that if C is symmetric, then Mon_ C is braided, and indeed symmetric.

Note that Mon_ C is not braided in general when C is only braided.

The more interesting construction is the 2-category of monoids in C, bimodules between the monoids, and intertwiners between the bimodules.

When C is braided, that is a monoidal 2-category.

Equations
• Mon_.instSymmetricCategory =

Projects:

• Check that Mon_ MonCat ≌ CommMonCat, via the Eckmann-Hilton argument. (You'll have to hook up the cartesian monoidal structure on MonCat first, available in mathlib3#3463)
• More generally, check that Mon_ (Mon_ C) ≌ CommMon_ C when C is braided.
• Check that Mon_ TopCat ≌ [bundled topological monoids].
• Check that Mon_ AddCommGrp ≌ RingCat. (We've already got Mon_ (ModuleCat R) ≌ AlgebraCat R, in Mathlib.CategoryTheory.Monoidal.Internal.Module.)
• Can you transport this monoidal structure to RingCat or AlgebraCat R? How does it compare to the "native" one?
• Show that when F is a lax braided functor C ⥤ D, the functor map_Mon F : Mon_ C ⥤ Mon_ D is lax monoidal.