Skip to content

Commit 67bb55a

Browse files
feat(CategoryTheory/Monoidal/Opposites): monoid objects internal to the monoidal opposite (#25854)
We construct an equivalence between monoid objects internal to a monoidal category `C`, and monoid objects internal to its monoidal opposite `Cᴹᵒᵖ`. This is done by adding `Mon_Class` and `IsMon_Hom` instance to the relevant objects, as well as by recording an explicit equivalence of categories `Mon_ C ≌ Mon_ Cᴹᵒᵖ`. Co-authored-by: Robin Carlier <57142648+robin-carlier@users.noreply.github.com>
1 parent 658f961 commit 67bb55a

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2463,6 +2463,7 @@ import Mathlib.CategoryTheory.Monoidal.OfChosenFiniteProducts.Basic
24632463
import Mathlib.CategoryTheory.Monoidal.OfChosenFiniteProducts.Symmetric
24642464
import Mathlib.CategoryTheory.Monoidal.OfHasFiniteProducts
24652465
import Mathlib.CategoryTheory.Monoidal.Opposite
2466+
import Mathlib.CategoryTheory.Monoidal.Opposite.Mon_
24662467
import Mathlib.CategoryTheory.Monoidal.Preadditive
24672468
import Mathlib.CategoryTheory.Monoidal.Rigid.Basic
24682469
import Mathlib.CategoryTheory.Monoidal.Rigid.Braided
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/-
2+
Copyright (c) 2025 Robin Carlier. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Robin Carlier
5+
-/
6+
import Mathlib.CategoryTheory.Monoidal.Opposite
7+
import Mathlib.CategoryTheory.Monoidal.Mon_
8+
9+
/-!
10+
# Monoid objects internal to monoidal opposites
11+
12+
In this file, we record the equivalence between `Mon_ C` and `Mon Cᴹᵒᵖ`.
13+
-/
14+
15+
namespace Mon_Class
16+
17+
open CategoryTheory MonoidalCategory MonoidalOpposite
18+
19+
variable {C : Type*} [Category C] [MonoidalCategory C]
20+
21+
section mop
22+
23+
variable (M : C) [Mon_Class M]
24+
25+
/-- If `M : C` is a monoid object, then `mop M : Cᴹᵒᵖ` too. -/
26+
@[simps!]
27+
instance mopMon_Class : Mon_Class (mop M) where
28+
mul := Mon_Class.mul.mop
29+
one := Mon_Class.one.mop
30+
mul_one := by
31+
apply mopEquiv C|>.fullyFaithfulInverse.map_injective
32+
simp
33+
one_mul := by
34+
apply mopEquiv C|>.fullyFaithfulInverse.map_injective
35+
simp
36+
mul_assoc := by
37+
apply mopEquiv C|>.fullyFaithfulInverse.map_injective
38+
simp
39+
40+
variable {M} in
41+
/-- If `f` is a morphism of monoid objects internal to `C`,
42+
then `f.mop` is a morphism of monoid objects internal to `Cᴹᵒᵖ`. -/
43+
instance mop_isMon_Hom {N : C} [Mon_Class N]
44+
(f : M ⟶ N) [IsMon_Hom f] : IsMon_Hom f.mop where
45+
mul_hom := by
46+
apply mopEquiv C|>.fullyFaithfulInverse.map_injective
47+
simpa [-IsMon_Hom.mul_hom] using IsMon_Hom.mul_hom f
48+
one_hom := by
49+
apply mopEquiv C|>.fullyFaithfulInverse.map_injective
50+
simpa [-IsMon_Hom.one_hom] using IsMon_Hom.one_hom f
51+
52+
end mop
53+
54+
section unmop
55+
56+
variable (M : Cᴹᵒᵖ) [Mon_Class M]
57+
58+
/-- If `M : Cᴹᵒᵖ` is a monoid object, then `unmop M : C` too. -/
59+
@[simps -isSimp] -- not making them simp because it causes a loop.
60+
instance unmopMon_Class : Mon_Class (unmop M) where
61+
mul := Mon_Class.mul.unmop
62+
one := Mon_Class.one.unmop
63+
mul_one := by
64+
apply mopEquiv C|>.fullyFaithfulFunctor.map_injective
65+
simp
66+
one_mul := by
67+
apply mopEquiv C|>.fullyFaithfulFunctor.map_injective
68+
simp
69+
mul_assoc := by
70+
apply mopEquiv C|>.fullyFaithfulFunctor.map_injective
71+
simp
72+
73+
variable {M} in
74+
/-- If `f` is a morphism of monoid objects internal to `Cᴹᵒᵖ`,
75+
so is `f.unmop`. -/
76+
instance unmop_isMon_Hom {N : Cᴹᵒᵖ} [Mon_Class N]
77+
(f : M ⟶ N) [IsMon_Hom f] : IsMon_Hom f.unmop where
78+
mul_hom := by
79+
apply mopEquiv C|>.fullyFaithfulFunctor.map_injective
80+
simpa [-IsMon_Hom.mul_hom] using IsMon_Hom.mul_hom f
81+
one_hom := by
82+
apply mopEquiv C|>.fullyFaithfulFunctor.map_injective
83+
simpa [-IsMon_Hom.one_hom] using IsMon_Hom.one_hom f
84+
85+
end unmop
86+
87+
variable (C) in
88+
89+
/-- The equivalence of categories between monoids internal to `C`
90+
and monoids internal to the monoidal opposite of `C`. -/
91+
@[simps!]
92+
def mopEquiv : Mon_ C ≌ Mon_ Cᴹᵒᵖ where
93+
functor :=
94+
{ obj M := ⟨mop M.X⟩
95+
map f := ⟨f.hom.mop⟩ }
96+
inverse :=
97+
{ obj M := ⟨unmop M.X⟩
98+
map f := ⟨f.hom.unmop⟩ }
99+
unitIso := .refl _
100+
counitIso := .refl _
101+
102+
/-- The equivalence of categories between monoids internal to `C`
103+
and monoids internal to the monoidal opposite of `C` lies over
104+
the equivalence `C ≌ Cᴹᵒᵖ` via the forgetful functors. -/
105+
@[simps!]
106+
def mopEquivCompForgetIso :
107+
(mopEquiv C).functor ⋙ Mon_.forget Cᴹᵒᵖ ≅
108+
Mon_.forget C ⋙ (MonoidalOpposite.mopEquiv C).functor :=
109+
.refl _
110+
111+
end Mon_Class

0 commit comments

Comments
 (0)