Skip to content

Commit fd83ef4

Browse files
committed
chore(AlgebraicGeometry): refactor structureSheaf (leanprover-community#35090)
We redefine `structureSheaf` to unify its construction with `tilde`.
1 parent af9ef59 commit fd83ef4

14 files changed

Lines changed: 1003 additions & 1277 deletions

File tree

Mathlib/Algebra/Category/Ring/FilteredColimits.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,14 @@ instance forget₂SemiRing_preservesFilteredColimits :
295295
(SemiRingCat.FilteredColimits.colimitCoconeIsColimit
296296
(F ⋙ forget₂ RingCat SemiRingCat.{u})) }
297297

298+
instance : Limits.PreservesFilteredColimits (forget₂ RingCat AddCommGrpCat.{u}) where
299+
preserves_filtered_colimits _ :=
300+
{ preservesColimit := fun {F} =>
301+
Limits.preservesColimit_of_preserves_colimit_cocone
302+
(RingCat.FilteredColimits.colimitCoconeIsColimit.{u, u} F)
303+
(AddCommGrpCat.FilteredColimits.colimitCoconeIsColimit
304+
(F ⋙ forget₂ RingCat AddCommGrpCat.{u})) }
305+
298306
instance forget_preservesFilteredColimits : PreservesFilteredColimits (forget RingCat.{u}) :=
299307
Limits.comp_preservesFilteredColimits (forget₂ RingCat SemiRingCat) (forget SemiRingCat.{u})
300308

Mathlib/AlgebraicGeometry/AffineScheme.lean

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ theorem exists_basicOpen_le {V : X.Opens} (x : V) (h : ↑x ∈ U) :
622622

623623
noncomputable
624624
instance {R : CommRingCat} {U} : Algebra R Γ(Spec R, U) :=
625-
((Scheme.ΓSpecIso R).inv ≫ (Spec R).presheaf.map (homOfLE le_top).op).hom.toAlgebra
625+
inferInstanceAs (Algebra R ((Spec.structureSheaf R).presheaf.obj _))
626626

627627
@[simp]
628628
lemma algebraMap_Spec_obj {R : CommRingCat} {U} : algebraMap R Γ(Spec R, U) =
@@ -653,13 +653,13 @@ theorem isLocalization_basicOpen :
653653
(IsLocalization.isLocalization_iff_of_ringEquiv (Submonoid.powers f)
654654
(asIso <| basicOpenSectionsToAffine hU f).commRingCatIsoToRingEquiv).mpr
655655
convert StructureSheaf.IsLocalization.to_basicOpen _ f using 1
656-
-- Porting note: more hand holding is required here, the next 3 lines were not necessary
656+
apply Algebra.algebra_ext
657+
intro _
657658
congr 1
658659
dsimp [CommRingCat.ofHom, RingHom.algebraMap_toAlgebra, ← CommRingCat.hom_comp,
659660
basicOpenSectionsToAffine]
660661
rw [hU.fromSpec.naturality_assoc, hU.fromSpec_app_self]
661-
simp only [Category.assoc, ← Functor.map_comp, ← op_comp]
662-
exact CommRingCat.hom_ext_iff.mp (StructureSheaf.toOpen_res _ _ _ _)
662+
rfl
663663

664664
instance _root_.AlgebraicGeometry.isLocalization_away_of_isAffine
665665
[IsAffine X] (r : Γ(X, ⊤)) :
@@ -1219,22 +1219,44 @@ end Factorization
12191219

12201220
section Stalks
12211221

1222+
variable {R S : CommRingCat.{u}} (f : R ⟶ S) (p : PrimeSpectrum S) (x : PrimeSpectrum R)
1223+
1224+
variable (R) (x : PrimeSpectrum R) in
1225+
/-- The stalk of `Spec R` at `x` is isomorphic to `Rₚ`,
1226+
where `p` is the prime corresponding to `x`. -/
1227+
noncomputable
1228+
def Spec.stalkIso : (Spec R).presheaf.stalk x ≅ .of (Localization.AtPrime x.asIdeal) :=
1229+
(StructureSheaf.stalkIso ..).toCommRingCatIso.symm
1230+
1231+
@[reassoc (attr := simp)]
1232+
lemma Spec.algebraMap_stalkIso_inv :
1233+
CommRingCat.ofHom (algebraMap R _) ≫ (stalkIso R x).inv =
1234+
(Scheme.ΓSpecIso R).inv ≫ (Spec R).presheaf.germ ⊤ x trivial := by
1235+
ext s : 2
1236+
exact (IsLocalization.algEquiv _ ((structureSheaf R).presheaf.stalk _) _).symm.commutes s
1237+
1238+
@[reassoc (attr := simp)]
1239+
lemma Spec.germ_stalkMapIso_hom :
1240+
(Spec R).presheaf.germ ⊤ _ trivial ≫ (stalkIso R x).hom =
1241+
(Scheme.ΓSpecIso R).hom ≫ CommRingCat.ofHom (algebraMap R _) := by
1242+
simp [← Iso.inv_comp_eq, ← Spec.algebraMap_stalkIso_inv_assoc]
1243+
12221244
/-- Variant of `AlgebraicGeometry.localRingHom_comp_stalkIso` for `Spec.map`. -/
12231245
@[elementwise]
12241246
lemma Scheme.localRingHom_comp_stalkIso {R S : CommRingCat.{u}} (f : R ⟶ S) (p : PrimeSpectrum S) :
1225-
(StructureSheaf.stalkIso R (PrimeSpectrum.comap f.hom p)).hom ≫
1247+
(Spec.stalkIso R (p.comap f.hom)).hom ≫
12261248
(CommRingCat.ofHom <| Localization.localRingHom
12271249
(PrimeSpectrum.comap f.hom p).asIdeal p.asIdeal f.hom rfl) ≫
1228-
(StructureSheaf.stalkIso S p).inv = (Spec.map f).stalkMap p :=
1250+
(Spec.stalkIso S p).inv = (Spec.map f).stalkMap p :=
12291251
AlgebraicGeometry.localRingHom_comp_stalkIso f p
12301252

12311253
/-- Given a morphism of rings `f : R ⟶ S`, the stalk map of `Spec S ⟶ Spec R` at
12321254
a prime of `S` is isomorphic to the localized ring homomorphism. -/
12331255
def Scheme.arrowStalkMapSpecIso {R S : CommRingCat.{u}} (f : R ⟶ S) (p : PrimeSpectrum S) :
12341256
Arrow.mk ((Spec.map f).stalkMap p) ≅ Arrow.mk (CommRingCat.ofHom <| Localization.localRingHom
12351257
(p.comap f.hom).asIdeal p.asIdeal f.hom rfl) := Arrow.isoMk
1236-
(StructureSheaf.stalkIso R (PrimeSpectrum.comap f.hom p))
1237-
(StructureSheaf.stalkIso S p) <| by
1258+
(Spec.stalkIso R (p.comap f.hom))
1259+
(Spec.stalkIso S p) <| by
12381260
rw [← Scheme.localRingHom_comp_stalkIso]
12391261
simp
12401262

Mathlib/AlgebraicGeometry/GammaSpecAdjunction.lean

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ theorem toΓSpecCApp_iff
140140
(f :
141141
(structureSheaf <| Γ.obj <| op X).val.obj (op <| basicOpen r) ⟶
142142
X.presheaf.obj (op <| X.toΓSpecMapBasicOpen r)) :
143-
toOpen _ (basicOpen r) ≫ f = X.toToΓSpecMapBasicOpen r ↔ f = X.toΓSpecCApp r := by
143+
CommRingCat.ofHom (algebraMap (Γ.obj (op X)) _) ≫ f = X.toToΓSpecMapBasicOpen r ↔
144+
f = X.toΓSpecCApp r := by
144145
have loc_inst := IsLocalization.to_basicOpen (Γ.obj (op X)) r
145146
refine ConcreteCategory.ext_iff.trans ?_
146147
rw [← @IsLocalization.Away.lift_comp _ _ _ _ _ _ _ r loc_inst _
@@ -151,7 +152,8 @@ theorem toΓSpecCApp_iff
151152
exact IsLocalization.ringHom_ext (Submonoid.powers r) h
152153
apply congr_arg
153154

154-
theorem toΓSpecCApp_spec : toOpen _ (basicOpen r) ≫ X.toΓSpecCApp r = X.toToΓSpecMapBasicOpen r :=
155+
theorem toΓSpecCApp_spec :
156+
CommRingCat.ofHom (algebraMap (Γ.obj (op X)) _) ≫ X.toΓSpecCApp r = X.toToΓSpecMapBasicOpen r :=
155157
(X.toΓSpecCApp_iff r _).2 rfl
156158

157159
/-- The sheaf hom on all basic opens, commuting with restrictions. -/
@@ -163,7 +165,9 @@ def toΓSpecCBasicOpens :
163165
naturality r s f := by
164166
apply (StructureSheaf.to_basicOpen_epi (Γ.obj (op X)) r.unop).1
165167
simp only [← Category.assoc]
166-
rw [X.toΓSpecCApp_spec r.unop]
168+
rw [show algebraMap (Γ.obj (op X)) ((structureSheaf (Γ.obj (op X))).val.obj _) = algebraMap _
169+
((structureSheafInType (Γ.obj (op X)) (Γ.obj (op X))).val.obj _) from rfl,
170+
X.toΓSpecCApp_spec r.unop]
167171
convert X.toΓSpecCApp_spec s.unop
168172
symm
169173
apply X.presheaf.map_comp
@@ -182,7 +186,8 @@ theorem toΓSpecSheafedSpace_app_eq :
182186
apply TopCat.Sheaf.extend_hom_app _ _ _
183187

184188
@[reassoc] theorem toΓSpecSheafedSpace_app_spec (r : Γ.obj (op X)) :
185-
toOpen (Γ.obj (op X)) (basicOpen r) ≫ X.toΓSpecSheafedSpace.hom.c.app (op (basicOpen r)) =
189+
CommRingCat.ofHom (algebraMap (Γ.obj (op X)) _) ≫
190+
X.toΓSpecSheafedSpace.hom.c.app (op (basicOpen r)) =
186191
X.toToΓSpecMapBasicOpen r :=
187192
(X.toΓSpecSheafedSpace_app_eq r).symm ▸ X.toΓSpecCApp_spec r
188193

@@ -191,8 +196,8 @@ stalks (in `Spec Γ(X)` and in `X`). -/
191196
theorem toStalk_stalkMap_toΓSpec (x : X) :
192197
toStalk _ _ ≫ X.toΓSpecSheafedSpace.hom.stalkMap x = X.presheaf.Γgerm x := by
193198
rw [PresheafedSpace.Hom.stalkMap,
194-
toOpen_germ _ (basicOpen (1 : Γ.obj (op X))) _ (by rw [basicOpen_one]; trivial),
195-
← Category.assoc, Category.assoc (toOpen _ _), stalkFunctor_map_germ, ← Category.assoc,
199+
algebraMap_germ (basicOpen (1 : Γ.obj (op X))) _ (by rw [basicOpen_one]; trivial),
200+
← Category.assoc, Category.assoc (CommRingCat.ofHom _), stalkFunctor_map_germ, ← Category.assoc,
196201
X.toΓSpecSheafedSpace_app_eq, X.toΓSpecCApp_spec, Γgerm]
197202
erw [← stalkPushforward_germ _ _ X.presheaf ⊤]
198203
congr 1
@@ -244,7 +249,7 @@ theorem comp_ring_hom_ext {X : LocallyRingedSpace.{u}} {R : CommRingCat.{u}} {f
244249
(h :
245250
∀ r : R,
246251
f ≫ X.presheaf.map (homOfLE le_top : (Opens.map β.base).obj (basicOpen r) ⟶ _).op =
247-
toOpen R (basicOpen r) ≫ β.c.app (op (basicOpen r))) :
252+
CommRingCat.ofHom (algebraMap _ _) ≫ β.c.app (op (basicOpen r))) :
248253
X.toΓSpec ≫ Spec.locallyRingedSpaceMap f = β := by
249254
refine LocallyRingedSpace.forgetToSheafedSpace.map_injective
250255
(Spec.basicOpen_hom_ext w ?_)
@@ -258,10 +263,11 @@ theorem comp_ring_hom_ext {X : LocallyRingedSpace.{u}} {R : CommRingCat.{u}} {f
258263
/-- `toSpecΓ _` is an isomorphism so these are mutually two-sided inverses. -/
259264
theorem Γ_Spec_left_triangle : toSpecΓ (Γ.obj (op X)) ≫ X.toΓSpec.c.app (op ⊤) = 𝟙 _ := by
260265
unfold toSpecΓ
261-
rw [← toOpen_res _ (basicOpen (1 : Γ.obj (op X))) ⊤ (eqToHom basicOpen_one.symm),
262-
Category.assoc, NatTrans.naturality, ← Category.assoc]
263-
erw [X.toΓSpecSheafedSpace_app_spec 1, ← Functor.map_comp]
264-
convert eqToHom_map X.presheaf _; rfl
266+
have := X.toΓSpecSheafedSpace_app_spec 1
267+
unfold toToΓSpecMapBasicOpen toΓSpecMapBasicOpen at this
268+
rw! [basicOpen_one] at this
269+
convert this
270+
exact (X.presheaf.map_id ..).symm
265271

266272
end LocallyRingedSpace
267273

@@ -303,7 +309,7 @@ theorem right_triangle (R : CommRingCat) :
303309
rw [← IsLocalization.AtPrime.to_map_mem_maximal_iff ((structureSheaf R).presheaf.stalk p)
304310
p.asIdeal x]
305311
rfl
306-
· intro r; apply toOpen_res
312+
· intro r; rfl
307313

308314
/-- The adjunction `Γ ⊣ Spec` from `CommRingᵒᵖ` to `LocallyRingedSpace`. -/
309315
@[simps]
@@ -323,23 +329,26 @@ def locallyRingedSpaceAdjunction : Γ.rightOp ⊣ Spec.toLocallyRingedSpace.{u}
323329
Spec.toLocallyRingedSpace_map, Quiver.Hom.unop_op]
324330
exact right_triangle R.unop
325331

326-
/-- `@[simp]`-normal form of `locallyRingedSpaceAdjunction_counit_app`. -/
327-
@[simp]
332+
328333
lemma toSpecΓ_unop (R : CommRingCatᵒᵖ) :
329-
AlgebraicGeometry.toSpecΓ (Opposite.unop R) = toOpen R.unop ⊤ := rfl
334+
AlgebraicGeometry.toSpecΓ (Opposite.unop R) = CommRingCat.ofHom (algebraMap _ _) := rfl
330335

331336
/-- `@[simp]`-normal form of `locallyRingedSpaceAdjunction_counit_app'`. -/
332337
@[simp]
333338
lemma toSpecΓ_of (R : Type u) [CommRing R] :
334-
AlgebraicGeometry.toSpecΓ (CommRingCat.of R) = toOpen R ⊤ := rfl
339+
AlgebraicGeometry.toSpecΓ (CommRingCat.of R) = CommRingCat.ofHom (algebraMap _ _) := rfl
335340

336341
lemma locallyRingedSpaceAdjunction_counit_app (R : CommRingCatᵒᵖ) :
337342
locallyRingedSpaceAdjunction.counit.app R =
338-
(toOpen R.unop ⊤).op := rfl
343+
(CommRingCat.ofHom (algebraMap _ _)).op := rfl
339344

340345
lemma locallyRingedSpaceAdjunction_counit_app' (R : Type u) [CommRing R] :
341346
locallyRingedSpaceAdjunction.counit.app (op <| CommRingCat.of R) =
342-
(toOpen R ⊤).op := rfl
347+
(CommRingCat.ofHom (algebraMap _ _)).op := rfl
348+
349+
lemma unop_locallyRingedSpaceAdjunction_counit_app' (R : Type u) [CommRing R] :
350+
(locallyRingedSpaceAdjunction.counit.app (op <| CommRingCat.of R)).unop =
351+
(CommRingCat.ofHom (algebraMap _ _)) := rfl
343352

344353
lemma locallyRingedSpaceAdjunction_homEquiv_apply
345354
{X : LocallyRingedSpace} {R : CommRingCatᵒᵖ}
@@ -356,16 +365,16 @@ lemma locallyRingedSpaceAdjunction_homEquiv_apply'
356365
lemma toOpen_comp_locallyRingedSpaceAdjunction_homEquiv_app
357366
{X : LocallyRingedSpace} {R : Type u} [CommRing R]
358367
(f : Γ.rightOp.obj X ⟶ op (CommRingCat.of R)) (U) :
359-
StructureSheaf.toOpen R U.unop
368+
CommRingCat.ofHom (algebraMap R _)
360369
(locallyRingedSpaceAdjunction.homEquiv X (op <| CommRingCat.of R) f).c.app U =
361370
f.unop ≫ X.presheaf.map (homOfLE le_top).op := by
362-
rw [← StructureSheaf.toOpen_res _ _ _ (homOfLE le_top), Category.assoc,
371+
dsimp
372+
rw [← StructureSheaf.algebraMap_self_map _ U _ (homOfLE le_top).op, Category.assoc,
363373
NatTrans.naturality _ (homOfLE (le_top (a := U.unop))).op,
364-
show (toOpen R ⊤) = (toOpen R ⊤).op.unop from rfl,
365-
← locallyRingedSpaceAdjunction_counit_app']
374+
← unop_locallyRingedSpaceAdjunction_counit_app']
366375
simp_rw [← Γ_map_op]
367-
rw [← Γ.rightOp_map_unop, ← Category.assoc, ← unop_comp, ← Adjunction.homEquiv_counit,
368-
Equiv.symm_apply_apply]
376+
rw [← Γ.rightOp_map_unop, ← Category.assoc, ← unop_comp]
377+
erw [← Adjunction.homEquiv_counit, Equiv.symm_apply_apply]
369378
rfl
370379

371380
/-- The adjunction `Γ ⊣ Spec` from `CommRingᵒᵖ` to `Scheme`. -/
@@ -459,19 +468,6 @@ lemma Scheme.toSpecΓ_preimage_basicOpen (X : Scheme.{u}) (r : Γ(X, ⊤)) :
459468
rw [Scheme.toSpecΓ_appTop]
460469
exact Iso.inv_hom_id_apply (C := CommRingCat) _ _
461470

462-
-- Warning: this LHS of this lemma breaks the structure-sheaf abstraction.
463-
@[reassoc (attr := simp)]
464-
theorem toOpen_toSpecΓ_app {X : Scheme.{u}} (U) :
465-
StructureSheaf.toOpen _ _ ≫ X.toSpecΓ.app U =
466-
X.presheaf.map (homOfLE (by exact le_top)).op := by
467-
rw [← StructureSheaf.toOpen_res _ _ _ (homOfLE le_top), Category.assoc,
468-
NatTrans.naturality _ (homOfLE (le_top (a := U))).op]
469-
change (ΓSpec.adjunction.counit.app (Scheme.Γ.rightOp.obj X)).unop ≫
470-
(Scheme.Γ.rightOp.map (ΓSpec.adjunction.unit.app X)).unop ≫ _ = _
471-
rw [← Category.assoc, ← unop_comp, ΓSpec.adjunction.left_triangle_components]
472-
dsimp
473-
exact Category.id_comp _
474-
475471
lemma ΓSpecIso_inv_ΓSpec_adjunction_homEquiv {X : Scheme.{u}} {B : CommRingCat} (φ : B ⟶ Γ(X, ⊤)) :
476472
(Scheme.ΓSpecIso B).inv ≫ ((ΓSpec.adjunction.homEquiv X (op B)) φ.op).appTop = φ := by
477473
simp only [Adjunction.homEquiv_apply, Scheme.Spec_map, Opens.map_top, Scheme.Hom.comp_app]

Mathlib/AlgebraicGeometry/IdealSheaf/Subscheme.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ variable {X : Scheme.{u}}
4242
variable (I : IdealSheafData X)
4343

4444
/-- `Spec (𝒪ₓ(U)/I(U))`, the object to be glued into the closed subscheme. -/
45+
noncomputable
4546
def glueDataObj (U : X.affineOpens) : Scheme :=
4647
Spec <| .of <| Γ(X, U) ⧸ I.ideal U
4748

0 commit comments

Comments
 (0)