Skip to content

Commit 7974e75

Browse files
committed
feat(Algebra/Category/ModuleCat): refactor Monoidal.lean to use PresheafOfModulesOfCommRing (#43193)
Co-authored-by: Brian-Nugent <bnugent@uw.edu>
1 parent fe6e3cd commit 7974e75

2 files changed

Lines changed: 67 additions & 65 deletions

File tree

‎Mathlib/Algebra/Category/ModuleCat/Presheaf/Monoidal.lean‎

Lines changed: 58 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ Authors: Dagur Asgeirsson, Jack McKoen, Joël Riou
55
-/
66
module
77

8-
public import Mathlib.Algebra.Category.ModuleCat.Presheaf.Colimits
8+
public import Mathlib.Algebra.Category.ModuleCat.Presheaf.OfCommRing
99
public import Mathlib.Algebra.Category.ModuleCat.Monoidal.Closed
1010

1111
/-!
1212
# The monoidal category structure on presheaves of modules
1313
1414
Given a presheaf of commutative rings `R : Cᵒᵖ ⥤ CommRingCat`, we construct
1515
the monoidal category structure on the category of presheaves of modules
16-
`PresheafOfModules (R ⋙ forget₂ _ _)`. The tensor product `M₁ ⊗ M₂` is defined
16+
`PresheafOfModulesOfCommRing R`. The tensor product `M₁ ⊗ M₂` is defined
1717
as the presheaf of modules which sends `X : Cᵒᵖ` to `M₁.obj X ⊗ M₂.obj X`.
1818
1919
## Notes
@@ -31,14 +31,11 @@ universe v u v₁ u₁
3131

3232
variable {C : Type*} [Category* C] {R : Cᵒᵖ ⥤ CommRingCat.{u}}
3333

34-
instance (X : Cᵒᵖ) : CommRing ((R ⋙ forget₂ _ RingCat).obj X) :=
35-
inferInstanceAs (CommRing (R.obj X))
36-
37-
namespace PresheafOfModules
34+
namespace PresheafOfModulesOfCommRing
3835

3936
namespace Monoidal
4037

41-
variable (M₁ M₂ M₃ M₄ : PresheafOfModules.{u} (R ⋙ forget₂ _ _))
38+
variable (M₁ M₂ M₃ M₄ : PresheafOfModulesOfCommRing.{u} R)
4239

4340
set_option backward.isDefEq.respectTransparency false in
4441
/-- Auxiliary definition for `tensorObj`. -/
@@ -47,62 +44,57 @@ noncomputable def tensorObjMap {X Y : Cᵒᵖ} (f : X ⟶ Y) : M₁.obj X ⊗ M
4744
ModuleCat.MonoidalCategory.tensorLift (fun m₁ m₂ ↦ M₁.map f m₁ ⊗ₜ M₂.map f m₂)
4845
(by
4946
intro m₁ m₁' m₂
50-
dsimp +instances
47+
dsimp
5148
rw [map_add, TensorProduct.add_tmul])
5249
(by intro a m₁ m₂; dsimp; erw [M₁.map_smul]; rfl)
5350
(by
5451
intro m₁ m₂ m₂'
55-
dsimp +instances
52+
dsimp
5653
rw [map_add, TensorProduct.tmul_add])
5754
(by intro a m₁ m₂; dsimp; erw [M₂.map_smul, TensorProduct.tmul_smul (r := R.map f a)]; rfl)
5855

59-
set_option backward.defeqAttrib.useBackward true in
6056
set_option backward.isDefEq.respectTransparency false in
6157
/-- The tensor product of two presheaves of modules. -/
6258
@[simps obj]
63-
noncomputable def tensorObj : PresheafOfModules (R ⋙ forget₂ _ _) where
64-
obj X := M₁.obj X ⊗ M₂.obj X
65-
map f := tensorObjMap M₁ M₂ f
66-
map_id X := ModuleCat.MonoidalCategory.tensor_ext (by
67-
intro m₁ m₂
68-
dsimp [tensorObjMap]
69-
simp
70-
rfl) -- `ModuleCat.restrictScalarsId'App_inv_apply` doesn't get picked up due to type mismatch
71-
map_comp f g := ModuleCat.MonoidalCategory.tensor_ext (by
72-
intro m₁ m₂
73-
dsimp [tensorObjMap]
74-
simp +instances)
59+
noncomputable def tensorObj : PresheafOfModulesOfCommRing R :=
60+
mk (fun X ↦ M₁.obj X ⊗ M₂.obj X)
61+
(fun f ↦ tensorObjMap M₁ M₂ f)
62+
(fun X ↦ ModuleCat.MonoidalCategory.tensor_ext (by
63+
intro m₁ m₂
64+
dsimp [tensorObjMap]
65+
simp))
66+
(fun f g ↦ ModuleCat.MonoidalCategory.tensor_ext (by
67+
intro m₁ m₂
68+
dsimp [tensorObjMap]
69+
simp +instances))
7570

7671
variable {M₁ M₂ M₃ M₄}
7772

7873
@[simp]
7974
lemma tensorObj_map_tmul {X Y : Cᵒᵖ} (f : X ⟶ Y) (m₁ : M₁.obj X) (m₂ : M₂.obj X) :
8075
DFunLike.coe (α := (M₁.obj X ⊗ M₂.obj X :))
8176
(β := fun _ ↦ (ModuleCat.restrictScalars (R.map f).hom).obj (M₁.obj Y ⊗ M₂.obj Y))
82-
(ModuleCat.Hom.hom (R := ↑(R.obj X)) ((tensorObj M₁ M₂).map f)) (m₁ ⊗ₜ[R.obj X] m₂) =
77+
(ModuleCat.Hom.hom ((tensorObj M₁ M₂).map f)) (m₁ ⊗ₜ[R.obj X] m₂) =
8378
M₁.map f m₁ ⊗ₜ[R.obj Y] M₂.map f m₂ := rfl
8479

8580
set_option backward.defeqAttrib.useBackward true in
8681
set_option backward.isDefEq.respectTransparency false in
8782
/-- The tensor product of two morphisms of presheaves of modules. -/
8883
@[simps]
89-
noncomputable def tensorHom (f : M₁ ⟶ M₂) (g : M₃ ⟶ M₄) : tensorObj M₁ M₃ ⟶ tensorObj M₂ M₄ where
90-
app X := f.app X ⊗ₘ g.app X
91-
naturality {X Y} φ := ModuleCat.MonoidalCategory.tensor_ext (fun m₁ m₃ ↦ by
92-
dsimp
93-
rw [tensorObj_map_tmul]
94-
-- Need `erw` because of the type mismatch in `map` and the tensor product.
95-
erw [ModuleCat.MonoidalCategory.tensorHom_tmul, tensorObj_map_tmul]
96-
rw [naturality_apply, naturality_apply]
97-
simp)
84+
noncomputable def tensorHom (f : M₁ ⟶ M₂) (g : M₃ ⟶ M₄) :
85+
tensorObj M₁ M₃ ⟶ tensorObj M₂ M₄ :=
86+
homMk (fun X ↦ f.app' X ⊗ₘ g.app' X)
87+
(fun φ ↦ ModuleCat.MonoidalCategory.tensor_ext (fun m₁ m₃ ↦ by
88+
dsimp
89+
rw [tensorObj_map_tmul, ModuleCat.MonoidalCategory.tensorHom_tmul, tensorObj_map_tmul,
90+
naturality_apply, naturality_apply]))
9891

9992
end Monoidal
10093

10194
open Monoidal
10295

103-
open ModuleCat.MonoidalCategory in
10496
noncomputable instance monoidalCategoryStruct :
105-
MonoidalCategoryStruct (PresheafOfModules.{u} (R ⋙ forget₂ _ _)) where
97+
MonoidalCategoryStruct (PresheafOfModulesOfCommRing.{u} R) where
10698
tensorObj := tensorObj
10799
whiskerLeft _ _ _ g := tensorHom (𝟙 _) g
108100
whiskerRight f _ := tensorHom f (𝟙 _)
@@ -113,16 +105,18 @@ noncomputable instance monoidalCategoryStruct :
113105
leftUnitor M := Iso.symm (isoMk (fun _ ↦ (λ_ _).symm) (fun X Y f ↦ by
114106
ext m
115107
dsimp [CommRingCat.forgetToRingCat_obj]
116-
erw [leftUnitor_inv_apply, leftUnitor_inv_apply, tensorObj_map_tmul, (R.map f).hom.map_one]
108+
erw [ModuleCat.MonoidalCategory.leftUnitor_inv_apply,
109+
ModuleCat.MonoidalCategory.leftUnitor_inv_apply, tensorObj_map_tmul, (R.map f).hom.map_one]
117110
rfl))
118111
rightUnitor M := Iso.symm (isoMk (fun _ ↦ (ρ_ _).symm) (fun X Y f ↦ by
119112
ext m
120113
dsimp [CommRingCat.forgetToRingCat_obj]
121-
erw [rightUnitor_inv_apply, rightUnitor_inv_apply, tensorObj_map_tmul, (R.map f).hom.map_one]
114+
erw [ModuleCat.MonoidalCategory.rightUnitor_inv_apply,
115+
ModuleCat.MonoidalCategory.rightUnitor_inv_apply, tensorObj_map_tmul, (R.map f).hom.map_one]
122116
rfl))
123117

124118
noncomputable instance monoidalCategory :
125-
MonoidalCategory (PresheafOfModules.{u} (R ⋙ forget₂ _ _)) where
119+
MonoidalCategory (PresheafOfModulesOfCommRing.{u} R) where
126120
tensorHom_def _ _ := by ext1; apply tensorHom_def
127121
id_tensorHom_id _ _ := by ext1; apply id_tensorHom_id
128122
tensorHom_comp_tensorHom _ _ _ _ := by ext1; apply tensorHom_comp_tensorHom
@@ -141,9 +135,9 @@ noncomputable instance monoidalCategory :
141135
open BraidedCategory
142136

143137
noncomputable instance symmetricCategory :
144-
SymmetricCategory (PresheafOfModules.{u} (R ⋙ forget₂ _ _)) where
138+
SymmetricCategory (PresheafOfModulesOfCommRing.{u} R) where
145139
braiding M₁ M₂ :=
146-
isoMk (fun X ↦ braiding (C := ModuleCat (R.obj X)) (M₁.obj X) (M₂.obj X))
140+
isoMk (fun X ↦ braiding (M₁.obj X) (M₂.obj X))
147141
(fun _ _ f ↦ ModuleCat.MonoidalCategory.tensor_ext (fun _ _ ↦ rfl))
148142
braiding_naturality_right _ _ _ _ := by
149143
ext : 1
@@ -163,84 +157,83 @@ noncomputable instance symmetricCategory :
163157

164158
section
165159

166-
variable (M₁ M₂ M₃ M₄ : PresheafOfModules.{u} (R ⋙ forget₂ _ _))
160+
variable (M₁ M₂ M₃ M₄ : PresheafOfModulesOfCommRing.{u} R)
167161

168162
lemma tensorObj_obj (X : Cᵒᵖ) :
169-
(M₁ ⊗ M₂).obj X =
170-
MonoidalCategory.tensorObj (C := ModuleCat (R.obj X)) (M₁.obj X) (M₂.obj X) := rfl
163+
(M₁ ⊗ M₂).obj X = MonoidalCategory.tensorObj (M₁.obj X) (M₂.obj X) := rfl
171164

172165
attribute [local simp] tensorObj_obj
173166

174167
variable {M₂ M₃} in
175168
@[simp]
176169
lemma whiskerLeft_app (f : M₂ ⟶ M₃) (X : Cᵒᵖ) :
177-
dsimp% (M₁ ◁ f).app X = whiskerLeft (C := ModuleCat (R.obj X)) (M₁.obj X) (f.app X) :=
178-
rfl
170+
dsimp% (M₁ ◁ f).app' X = whiskerLeft (M₁.obj X) (f.app' X) := rfl
179171

180172
variable {M₁ M₂} in
181173
@[simp]
182-
lemma whiskerRight_app (f : M₁ ⟶ M₂) (M₃ : PresheafOfModules.{u} (R ⋙ forget₂ _ _)) (X : Cᵒᵖ) :
183-
dsimp% (f ▷ M₃).app X = whiskerRight (C := ModuleCat (R.obj X)) (f.app X) (M₃.obj X) := rfl
174+
lemma whiskerRight_app (f : M₁ ⟶ M₂) (M₃ : PresheafOfModulesOfCommRing.{u} R)
175+
(X : Cᵒᵖ) :
176+
dsimp% (f ▷ M₃).app' X = whiskerRight (f.app' X) (M₃.obj X) := rfl
184177

185178
variable {M₁ M₂ M₃ M₄} in
186179
@[simp]
187180
lemma tensorHom_app (f : M₁ ⟶ M₂) (g : M₃ ⟶ M₄) (X : Cᵒᵖ) :
188-
dsimp% (f ⊗ₘ g).app X =
189-
MonoidalCategory.tensorHom (C := ModuleCat (R.obj X)) (f.app X) (g.app X) := rfl
181+
dsimp% (f ⊗ₘ g).app' X =
182+
MonoidalCategory.tensorHom (f.app' X) (g.app' X) := rfl
190183

191184
@[simp]
192185
lemma leftUnitor_hom_app (X : Cᵒᵖ) :
193-
dsimp% (λ_ M₁).hom.app X = (leftUnitor (C := ModuleCat (R.obj X)) (M₁.obj X)).hom :=
186+
dsimp% (λ_ M₁).hom.app' X = (leftUnitor (M₁.obj X)).hom :=
194187
rfl
195188

196189
@[simp]
197190
lemma leftUnitor_inv_app (X : Cᵒᵖ) :
198-
dsimp% (λ_ M₁).inv.app X = (leftUnitor (C := ModuleCat (R.obj X)) (M₁.obj X)).inv := by
191+
dsimp% (λ_ M₁).inv.app' X = (leftUnitor (M₁.obj X)).inv := by
199192
rfl
200193

201194
@[simp]
202195
lemma rightUnitor_hom_app (X : Cᵒᵖ) :
203-
dsimp% (ρ_ M₁).hom.app X = (rightUnitor (C := ModuleCat (R.obj X)) (M₁.obj X)).hom :=
196+
dsimp% (ρ_ M₁).hom.app' X = (rightUnitor (M₁.obj X)).hom :=
204197
rfl
205198

206199
@[simp]
207200
lemma rightUnitor_inv_app (X : Cᵒᵖ) :
208-
dsimp% (ρ_ M₁).inv.app X = (rightUnitor (C := ModuleCat (R.obj X)) (M₁.obj X)).inv :=
201+
dsimp% (ρ_ M₁).inv.app' X = (rightUnitor (M₁.obj X)).inv :=
209202
rfl
210203

211204
@[simp]
212205
lemma associator_hom_app (X : Cᵒᵖ) :
213-
(α_ M₁ M₂ M₃).hom.app X =
214-
(associator (C := ModuleCat (R.obj X)) (M₁.obj X) (M₂.obj X) (M₃.obj X)).hom :=
206+
(α_ M₁ M₂ M₃).hom.app' X =
207+
(associator (M₁.obj X) (M₂.obj X) (M₃.obj X)).hom :=
215208
rfl
216209

217210
@[simp]
218211
lemma associator_inv_app (X : Cᵒᵖ) :
219-
(α_ M₁ M₂ M₃).inv.app X =
220-
(associator (C := ModuleCat (R.obj X)) (M₁.obj X) (M₂.obj X) (M₃.obj X)).inv :=
212+
(α_ M₁ M₂ M₃).inv.app' X =
213+
(associator (M₁.obj X) (M₂.obj X) (M₃.obj X)).inv :=
221214
rfl
222215

223216
@[simp]
224217
lemma braiding_hom_app (X : Cᵒᵖ) :
225-
dsimp% (braiding M₁ M₂).hom.app X =
226-
(braiding (C := ModuleCat (R.obj X)) (M₁.obj X) (M₂.obj X)).hom := by
218+
dsimp% (braiding M₁ M₂).hom.app' X =
219+
(braiding (M₁.obj X) (M₂.obj X)).hom := by
227220
rfl
228221

229222
@[simp]
230223
lemma braiding_inv_app (X : Cᵒᵖ) :
231-
dsimp% (braiding M₁ M₂).inv.app X =
232-
(braiding (C := ModuleCat (R.obj X)) (M₁.obj X) (M₂.obj X)).inv := rfl
224+
dsimp% (braiding M₁ M₂).inv.app' X =
225+
(braiding (M₁.obj X) (M₂.obj X)).inv := rfl
233226

234227
end
235228

236-
instance (F : PresheafOfModules.{u} (R ⋙ forget₂ _ _)) :
229+
instance (F : PresheafOfModulesOfCommRing.{u} R) :
237230
PreservesColimitsOfSize.{u, u} (tensorLeft F) where
238-
preservesColimitsOfShape := ⟨⟨fun hc ↦ ⟨evaluationJointlyReflectsColimits _ _
231+
preservesColimitsOfShape := ⟨⟨fun hc ↦ ⟨PresheafOfModules.evaluationJointlyReflectsColimits _ _
239232
(fun X ↦ isColimitOfPreserves (tensorLeft (show ModuleCat (R.obj X) from F.obj X))
240-
(isColimitOfPreserves (evaluation _ X) hc))⟩⟩⟩
233+
(isColimitOfPreserves (PresheafOfModules.evaluation _ X) hc))⟩⟩⟩
241234

242-
instance (F : PresheafOfModules.{u} (R ⋙ forget₂ _ _)) :
235+
instance (F : PresheafOfModulesOfCommRing.{u} R) :
243236
PreservesColimitsOfSize.{u, u} (tensorRight F) :=
244237
preservesColimits_of_natIso (tensorLeftIsoTensorRight F)
245238

246-
end PresheafOfModules
239+
end PresheafOfModulesOfCommRing

‎Mathlib/Algebra/Category/ModuleCat/Presheaf/OfCommRing.lean‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ abbrev isoMk {M₁ M₂ : PresheafOfModulesOfCommRing.{v} R}
7373
(app X).hom ≫ M₂.map f := by cat_disch) : M₁ ≅ M₂ :=
7474
PresheafOfModules.isoMk app naturality
7575

76+
/-- a family of linear maps `M₁.obj X ⟶ M₂.obj X` for all `X`. -/
77+
abbrev _root_.PresheafOfModules.Hom.app' {M₁ M₂ : PresheafOfModulesOfCommRing.{v} R}
78+
(f : M₁ ⟶ M₂) (X : Cᵒᵖ) : M₁.obj X ⟶ M₂.obj X := f.app X
79+
7680
/-- The free presheaf of modules of rank one over a presheaf of commutative rings. -/
7781
noncomputable abbrev unit (R : Cᵒᵖ ⥤ CommRingCat.{u}) :
7882
PresheafOfModulesOfCommRing.{u} R :=
@@ -83,6 +87,11 @@ noncomputable abbrev restrictScalars {S : Cᵒᵖ ⥤ CommRingCat.{u}} (φ : R
8387
PresheafOfModulesOfCommRing.{v} S ⥤ PresheafOfModulesOfCommRing.{v} R :=
8488
PresheafOfModules.restrictScalars (whiskerRight φ (forget₂ _ _))
8589

90+
lemma naturality_apply {M₁ M₂ : PresheafOfModulesOfCommRing.{v} R}
91+
(f : M₁ ⟶ M₂) {X Y : Cᵒᵖ} (g : X ⟶ Y) (x : M₁.obj X) :
92+
(f.app' Y) ((M₁.map g) x) = (M₂.map g) ((f.app' X) x) :=
93+
PresheafOfModules.naturality_apply _ _ _
94+
8695
end Basic
8796

8897
section PushforwardPullback

0 commit comments

Comments
 (0)