Skip to content

Commit 727956d

Browse files
joneugsterkim-emParcly-Taxel
committed
feat: port Algebra.Category.Semigroup.Basic (#4857)
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
1 parent 6c3530b commit 727956d

File tree

3 files changed

+338
-0
lines changed

3 files changed

+338
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ import Mathlib.Algebra.Category.Ring.Constructions
8080
import Mathlib.Algebra.Category.Ring.FilteredColimits
8181
import Mathlib.Algebra.Category.Ring.Instances
8282
import Mathlib.Algebra.Category.Ring.Limits
83+
import Mathlib.Algebra.Category.SemigroupCat.Basic
8384
import Mathlib.Algebra.CharP.Algebra
8485
import Mathlib.Algebra.CharP.Basic
8586
import Mathlib.Algebra.CharP.CharAndCard

Mathlib/Algebra/Category/MonCat/Basic.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ set_option linter.uppercaseLean3 false in
6969
deriving instance LargeCategory for MonCat
7070
attribute [to_additive instAddMonCatLargeCategory] instMonCatLargeCategory
7171

72+
-- Porting note: https://github.com/leanprover-community/mathlib4/issues/5020
7273
@[to_additive]
7374
instance concreteCategory : ConcreteCategory MonCat :=
7475
BundledHom.concreteCategory _
@@ -189,6 +190,7 @@ instance : BundledHom.ParentProjection @CommMonoid.toMonoid := ⟨⟩
189190
deriving instance LargeCategory for CommMonCat
190191
attribute [to_additive instAddCommMonCatLargeCategory] instCommMonCatLargeCategory
191192

193+
-- Porting note: https://github.com/leanprover-community/mathlib4/issues/5020
192194
@[to_additive]
193195
instance concreteCategory : ConcreteCategory CommMonCat := by
194196
dsimp only [CommMonCat]
Lines changed: 335 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,335 @@
1+
/-
2+
Copyright (c) 2021 Julian Kuelshammer. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Julian Kuelshammer
5+
6+
! This file was ported from Lean 3 source module algebra.category.Semigroup.basic
7+
! leanprover-community/mathlib commit 47b51515e69f59bca5cf34ef456e6000fe205a69
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Algebra.PEmptyInstances
12+
import Mathlib.Algebra.Hom.Equiv.Basic
13+
import Mathlib.CategoryTheory.ConcreteCategory.BundledHom
14+
import Mathlib.CategoryTheory.Functor.ReflectsIso
15+
import Mathlib.CategoryTheory.Elementwise
16+
17+
/-!
18+
# Category instances for has_mul, has_add, semigroup and add_semigroup
19+
20+
We introduce the bundled categories:
21+
* `MagmaCat`
22+
* `AddMagmaCat`
23+
* `SemigroupCat`
24+
* `AddSemigroupCat`
25+
along with the relevant forgetful functors between them.
26+
27+
This closely follows `Mathlib.Algebra.Category.MonCat.Basic`.
28+
29+
## TODO
30+
31+
* Limits in these categories
32+
* free/forgetful adjunctions
33+
-/
34+
35+
set_option linter.uppercaseLean3 false
36+
37+
universe u v
38+
39+
open CategoryTheory
40+
41+
/-- The category of magmas and magma morphisms. -/
42+
@[to_additive]
43+
def MagmaCat : Type (u + 1) :=
44+
Bundled Mul
45+
#align Magma MagmaCat
46+
#align AddMagma AddMagmaCat
47+
48+
/-- The category of additive magmas and additive magma morphisms. -/
49+
add_decl_doc AddMagmaCat
50+
51+
namespace MagmaCat
52+
53+
@[to_additive]
54+
instance bundledHom : BundledHom @MulHom :=
55+
⟨@MulHom.toFun, @MulHom.id, @MulHom.comp,
56+
--Porting note : was `@MulHom.coe_inj` which is deprecated
57+
by intros; apply @FunLike.coe_injective, by aesop_cat, by aesop_cat⟩
58+
#align Magma.bundled_hom MagmaCat.bundledHom
59+
#align AddMagma.bundled_hom AddMagmaCat.bundledHom
60+
61+
-- Porting note: deriving failed for `ConcreteCategory`,
62+
-- "default handlers have not been implemented yet"
63+
-- https://github.com/leanprover-community/mathlib4/issues/5020
64+
deriving instance LargeCategory for MagmaCat
65+
instance instConcreteCategory : ConcreteCategory MagmaCat := BundledHom.concreteCategory MulHom
66+
67+
attribute [to_additive] instMagmaCatLargeCategory instConcreteCategory
68+
69+
@[to_additive]
70+
instance : CoeSort MagmaCat (Type _) where
71+
coe X := X.α
72+
73+
-- Porting note : Hinting to Lean that `forget R` and `R` are the same
74+
unif_hint forget_obj_eq_coe (R : MagmaCat) where
75+
(forget MagmaCat).obj R ≟ R
76+
unif_hint _root_.AddMagmaCat.forget_obj_eq_coe (R : AddMagmaCat) where
77+
(forget AddMagmaCat).obj R ≟ R
78+
79+
@[to_additive]
80+
instance (X : MagmaCat) : Mul X := X.str
81+
82+
@[to_additive]
83+
instance instMulHomClass (X Y : MagmaCat) : MulHomClass (X ⟶ Y) X Y :=
84+
inferInstanceAs <| MulHomClass (X →ₙ* Y) X Y
85+
86+
/-- Construct a bundled `MagmaCat` from the underlying type and typeclass. -/
87+
@[to_additive]
88+
def of (M : Type u) [Mul M] : MagmaCat :=
89+
Bundled.of M
90+
#align Magma.of MagmaCat.of
91+
#align AddMagma.of AddMagmaCat.of
92+
93+
/-- Construct a bundled `AddMagmaCat` from the underlying type and typeclass. -/
94+
add_decl_doc AddMagmaCat.of
95+
96+
@[to_additive (attr := simp)]
97+
theorem coe_of (R : Type u) [Mul R] : (MagmaCat.of R : Type u) = R :=
98+
rfl
99+
#align Magma.coe_of MagmaCat.coe_of
100+
#align AddMagma.coe_of AddMagmaCat.coe_of
101+
102+
@[to_additive (attr := simp)]
103+
lemma MulEquiv_coe_eq {X Y : Type _} [Mul X] [Mul Y] (e : X ≃* Y) :
104+
(@FunLike.coe (MagmaCat.of X ⟶ MagmaCat.of Y) _ (fun _ => (forget MagmaCat).obj _)
105+
ConcreteCategory.funLike (e : X →ₙ* Y) : X → Y) = ↑e :=
106+
rfl
107+
108+
/-- Typecheck a `MulHom` as a morphism in `MagmaCat`. -/
109+
@[to_additive]
110+
def ofHom {X Y : Type u} [Mul X] [Mul Y] (f : X →ₙ* Y) : of X ⟶ of Y := f
111+
#align Magma.of_hom MagmaCat.ofHom
112+
#align AddMagma.of_hom AddMagmaCat.ofHom
113+
114+
/-- Typecheck a `AddHom` as a morphism in `AddMagmaCat`. -/
115+
add_decl_doc AddMagmaCat.ofHom
116+
117+
@[to_additive] -- Porting note: simp removed, simpNF says LHS simplifies to itself
118+
theorem ofHom_apply {X Y : Type u} [Mul X] [Mul Y] (f : X →ₙ* Y) (x : X) : ofHom f x = f x :=
119+
rfl
120+
#align Magma.of_hom_apply MagmaCat.ofHom_apply
121+
#align AddMagma.of_hom_apply AddMagmaCat.ofHom_apply
122+
123+
@[to_additive]
124+
instance : Inhabited MagmaCat :=
125+
⟨MagmaCat.of PEmpty⟩
126+
127+
end MagmaCat
128+
129+
/-- The category of semigroups and semigroup morphisms. -/
130+
@[to_additive]
131+
def SemigroupCat : Type (u + 1) :=
132+
Bundled Semigroup
133+
#align Semigroup SemigroupCat
134+
#align AddSemigroup AddSemigroupCat
135+
136+
/-- The category of additive semigroups and semigroup morphisms. -/
137+
add_decl_doc AddSemigroupCat
138+
139+
namespace SemigroupCat
140+
141+
@[to_additive]
142+
instance : BundledHom.ParentProjection @Semigroup.toMul := ⟨⟩
143+
144+
deriving instance LargeCategory for SemigroupCat
145+
146+
-- Porting note: deriving failed for `ConcreteCategory`,
147+
-- "default handlers have not been implemented yet"
148+
-- https://github.com/leanprover-community/mathlib4/issues/5020
149+
instance instConcreteCategory : ConcreteCategory SemigroupCat :=
150+
BundledHom.concreteCategory (fun _ _ => _)
151+
152+
attribute [to_additive] instSemigroupCatLargeCategory SemigroupCat.instConcreteCategory
153+
154+
@[to_additive]
155+
instance : CoeSort SemigroupCat (Type _) where
156+
coe X := X.α
157+
158+
-- Porting note : Hinting to Lean that `forget R` and `R` are the same
159+
unif_hint forget_obj_eq_coe (R : SemigroupCat) where
160+
(forget SemigroupCat).obj R ≟ R
161+
unif_hint _root_.AddSemigroupCat.forget_obj_eq_coe (R : AddSemigroupCat) where
162+
(forget AddSemigroupCat).obj R ≟ R
163+
164+
@[to_additive]
165+
instance (X : SemigroupCat) : Semigroup X := X.str
166+
167+
@[to_additive]
168+
instance instMulHomClass (X Y : SemigroupCat) : MulHomClass (X ⟶ Y) X Y :=
169+
inferInstanceAs <| MulHomClass (X →ₙ* Y) X Y
170+
171+
/-- Construct a bundled `SemigroupCat` from the underlying type and typeclass. -/
172+
@[to_additive]
173+
def of (M : Type u) [Semigroup M] : SemigroupCat :=
174+
Bundled.of M
175+
#align Semigroup.of SemigroupCat.of
176+
#align AddSemigroup.of AddSemigroupCat.of
177+
178+
/-- Construct a bundled `AddSemigroupCat` from the underlying type and typeclass. -/
179+
add_decl_doc AddSemigroupCat.of
180+
181+
@[to_additive (attr := simp)]
182+
theorem coe_of (R : Type u) [Semigroup R] : (SemigroupCat.of R : Type u) = R :=
183+
rfl
184+
#align Semigroup.coe_of SemigroupCat.coe_of
185+
#align AddSemigroup.coe_of AddSemigroupCat.coe_of
186+
187+
@[to_additive (attr := simp)]
188+
lemma MulEquiv_coe_eq {X Y : Type _} [Semigroup X] [Semigroup Y] (e : X ≃* Y) :
189+
(@FunLike.coe (SemigroupCat.of X ⟶ SemigroupCat.of Y) _ (fun _ => (forget SemigroupCat).obj _)
190+
ConcreteCategory.funLike (e : X →ₙ* Y) : X → Y) = ↑e :=
191+
rfl
192+
193+
/-- Typecheck a `MulHom` as a morphism in `SemigroupCat`. -/
194+
@[to_additive]
195+
def ofHom {X Y : Type u} [Semigroup X] [Semigroup Y] (f : X →ₙ* Y) : of X ⟶ of Y :=
196+
f
197+
#align Semigroup.of_hom SemigroupCat.ofHom
198+
#align AddSemigroup.of_hom AddSemigroupCat.ofHom
199+
200+
/-- Typecheck a `AddHom` as a morphism in `AddSemigroupCat`. -/
201+
add_decl_doc AddSemigroupCat.ofHom
202+
203+
@[to_additive] -- Porting note: simp removed, simpNF says LHS simplifies to itself
204+
theorem ofHom_apply {X Y : Type u} [Semigroup X] [Semigroup Y] (f : X →ₙ* Y) (x : X) :
205+
ofHom f x = f x :=
206+
rfl
207+
#align Semigroup.of_hom_apply SemigroupCat.ofHom_apply
208+
#align AddSemigroup.of_hom_apply AddSemigroupCat.ofHom_apply
209+
210+
@[to_additive]
211+
instance : Inhabited SemigroupCat :=
212+
⟨SemigroupCat.of PEmpty⟩
213+
214+
@[to_additive]
215+
instance hasForgetToMagmaCat : HasForget₂ SemigroupCat MagmaCat :=
216+
BundledHom.forget₂ _ _
217+
#align Semigroup.has_forget_to_Magma SemigroupCat.hasForgetToMagmaCat
218+
#align AddSemigroup.has_forget_to_AddMagma AddSemigroupCat.hasForgetToAddMagmaCat
219+
220+
end SemigroupCat
221+
222+
variable {X Y : Type u}
223+
224+
section
225+
226+
variable [Mul X] [Mul Y]
227+
228+
/-- Build an isomorphism in the category `MagmaCat` from a `MulEquiv` between `Mul`s. -/
229+
@[to_additive (attr := simps)
230+
"Build an isomorphism in the category `AddMagmaCat` from\nan `AddEquiv` between `Add`s."]
231+
def MulEquiv.toMagmaCatIso (e : X ≃* Y) : MagmaCat.of X ≅ MagmaCat.of Y where
232+
hom := e.toMulHom
233+
inv := e.symm.toMulHom
234+
hom_inv_id := by
235+
ext
236+
simp_rw [comp_apply, toMulHom_eq_coe, MagmaCat.MulEquiv_coe_eq, symm_apply_apply, id_apply]
237+
238+
#align mul_equiv.to_Magma_iso MulEquiv.toMagmaCatIso
239+
#align add_equiv.to_AddMagma_iso AddEquiv.toAddMagmaCatIso
240+
241+
end
242+
243+
section
244+
245+
variable [Semigroup X] [Semigroup Y]
246+
247+
/-- Build an isomorphism in the category `Semigroup` from a `mul_equiv` between `semigroup`s. -/
248+
@[to_additive (attr := simps)
249+
"Build an isomorphism in the category
250+
`AddSemigroup` from an `add_equiv` between `add_semigroup`s."]
251+
def MulEquiv.toSemigroupCatIso (e : X ≃* Y) : SemigroupCat.of X ≅ SemigroupCat.of Y where
252+
hom := e.toMulHom
253+
inv := e.symm.toMulHom
254+
#align mul_equiv.to_Semigroup_iso MulEquiv.toSemigroupCatIso
255+
#align add_equiv.to_AddSemigroup_iso AddEquiv.toAddSemigroupCatIso
256+
257+
end
258+
259+
namespace CategoryTheory.Iso
260+
261+
/-- Build a `mul_equiv` from an isomorphism in the category `Magma`. -/
262+
@[to_additive
263+
"Build an `add_equiv` from an isomorphism in the category\n`AddMagma`."]
264+
def magmaCatIsoToMulEquiv {X Y : MagmaCat} (i : X ≅ Y) : X ≃* Y :=
265+
MulHom.toMulEquiv i.hom i.inv i.hom_inv_id i.inv_hom_id
266+
#align category_theory.iso.Magma_iso_to_mul_equiv CategoryTheory.Iso.magmaCatIsoToMulEquiv
267+
#align category_theory.iso.AddMagma_iso_to_add_equiv CategoryTheory.Iso.addMagmaCatIsoToAddEquiv
268+
269+
/-- Build a `mul_equiv` from an isomorphism in the category `Semigroup`. -/
270+
@[to_additive
271+
"Build an `add_equiv` from an isomorphism in the category\n`AddSemigroup`."]
272+
def semigroupCatIsoToMulEquiv {X Y : SemigroupCat} (i : X ≅ Y) : X ≃* Y :=
273+
MulHom.toMulEquiv i.hom i.inv i.hom_inv_id i.inv_hom_id
274+
#align category_theory.iso.Semigroup_iso_to_mul_equiv CategoryTheory.Iso.semigroupCatIsoToMulEquiv
275+
#align category_theory.iso.Semigroup_iso_to_add_equiv CategoryTheory.Iso.addSemigroupCatIsoToAddEquiv
276+
277+
end CategoryTheory.Iso
278+
279+
/-- multiplicative equivalences between `has_mul`s are the same as (isomorphic to) isomorphisms
280+
in `Magma` -/
281+
@[to_additive
282+
"additive equivalences between `has_add`s are the same
283+
as (isomorphic to) isomorphisms in `AddMagma`"]
284+
def mulEquivIsoMagmaIso {X Y : Type u} [Mul X] [Mul Y] :
285+
X ≃* Y ≅ MagmaCat.of X ≅ MagmaCat.of Y where
286+
hom e := e.toMagmaCatIso
287+
inv i := i.magmaCatIsoToMulEquiv
288+
#align mul_equiv_iso_Magma_iso mulEquivIsoMagmaIso
289+
#align add_equiv_iso_AddMagma_iso addEquivIsoAddMagmaIso
290+
291+
/-- multiplicative equivalences between `semigroup`s are the same as (isomorphic to) isomorphisms
292+
in `Semigroup` -/
293+
@[to_additive
294+
"additive equivalences between `add_semigroup`s are
295+
the same as (isomorphic to) isomorphisms in `AddSemigroup`"]
296+
def mulEquivIsoSemigroupCatIso {X Y : Type u} [Semigroup X] [Semigroup Y] :
297+
X ≃* Y ≅ SemigroupCat.of X ≅ SemigroupCat.of Y where
298+
hom e := e.toSemigroupCatIso
299+
inv i := i.semigroupCatIsoToMulEquiv
300+
#align mul_equiv_iso_Semigroup_iso mulEquivIsoSemigroupCatIso
301+
#align add_equiv_iso_AddSemigroup_iso addEquivIsoAddSemigroupCatIso
302+
303+
@[to_additive]
304+
instance MagmaCat.forgetReflectsIsos : ReflectsIsomorphisms (forget MagmaCat.{u}) where
305+
reflects {X Y} f _ := by
306+
skip
307+
let i := asIso ((forget MagmaCat).map f)
308+
let e : X ≃* Y := { f, i.toEquiv with }
309+
exact ⟨(IsIso.of_iso e.toMagmaCatIso).1
310+
#align Magma.forget_reflects_isos MagmaCat.forgetReflectsIsos
311+
#align AddMagma.forget_reflects_isos AddMagmaCat.forgetReflectsIsos
312+
313+
@[to_additive]
314+
instance SemigroupCat.forgetReflectsIsos : ReflectsIsomorphisms (forget SemigroupCat.{u}) where
315+
reflects {X Y} f _ := by
316+
skip
317+
let i := asIso ((forget SemigroupCat).map f)
318+
let e : X ≃* Y := { f, i.toEquiv with }
319+
exact ⟨(IsIso.of_iso e.toSemigroupCatIso).1
320+
#align Semigroup.forget_reflects_isos SemigroupCat.forgetReflectsIsos
321+
#align AddSemigroup.forget_reflects_isos AddSemigroupCat.forgetReflectsIsos
322+
323+
-- porting note: this was added in order to ensure that `forget₂ CommMonCat MonCat`
324+
-- automatically reflects isomorphisms
325+
-- we could have used `CategoryTheory.ConcreteCategory.ReflectsIso` alternatively
326+
@[to_additive]
327+
instance SemigroupCat.forget₂Full : Full (forget₂ SemigroupCat MagmaCat) where preimage f := f
328+
329+
/-!
330+
Once we've shown that the forgetful functors to type reflect isomorphisms,
331+
we automatically obtain that the `forget₂` functors between our concrete categories
332+
reflect isomorphisms.
333+
-/
334+
335+
example : ReflectsIsomorphisms (forget₂ SemigroupCat MagmaCat) := inferInstance

0 commit comments

Comments
 (0)