|
| 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