Skip to content

Commit 3a01b36

Browse files
erdOnebjoernkjoshanssen
authored andcommitted
feat(AlgebraicGeometry): Define preimmersions. (#14748)
1 parent b052147 commit 3a01b36

File tree

4 files changed

+149
-12
lines changed

4 files changed

+149
-12
lines changed

Mathlib.lean

+1
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,7 @@ import Mathlib.AlgebraicGeometry.Morphisms.Constructors
808808
import Mathlib.AlgebraicGeometry.Morphisms.FiniteType
809809
import Mathlib.AlgebraicGeometry.Morphisms.IsIso
810810
import Mathlib.AlgebraicGeometry.Morphisms.OpenImmersion
811+
import Mathlib.AlgebraicGeometry.Morphisms.Preimmersion
811812
import Mathlib.AlgebraicGeometry.Morphisms.QuasiCompact
812813
import Mathlib.AlgebraicGeometry.Morphisms.QuasiSeparated
813814
import Mathlib.AlgebraicGeometry.Morphisms.RingHomProperties

Mathlib/AlgebraicGeometry/Morphisms/ClosedImmersion.lean

+14-12
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Amelia Livingston, Christian Merten, Jonas van der Schaaf
55
-/
66
import Mathlib.AlgebraicGeometry.Morphisms.QuasiCompact
7-
import Mathlib.RingTheory.LocalProperties
8-
import Mathlib.AlgebraicGeometry.Morphisms.UnderlyingMap
7+
import Mathlib.AlgebraicGeometry.Morphisms.Preimmersion
98

109
/-!
1110
@@ -48,16 +47,24 @@ lemma closedEmbedding {X Y : Scheme} (f : X ⟶ Y)
4847
[IsClosedImmersion f] : ClosedEmbedding f.1.base :=
4948
IsClosedImmersion.base_closed
5049

51-
lemma surjective_stalkMap {X Y : Scheme} (f : X ⟶ Y)
52-
[IsClosedImmersion f] (x : X) : Function.Surjective (f.stalkMap x) :=
53-
IsClosedImmersion.surj_on_stalks x
54-
5550
lemma eq_inf : @IsClosedImmersion = (topologically ClosedEmbedding) ⊓
5651
stalkwise (fun f ↦ Function.Surjective f) := by
5752
ext X Y f
5853
rw [isClosedImmersion_iff]
5954
rfl
6055

56+
lemma iff_isPreimmersion {X Y : Scheme} {f : X ⟶ Y} :
57+
IsClosedImmersion f ↔ IsPreimmersion f ∧ IsClosed (Set.range f.1.base) := by
58+
rw [and_comm, isClosedImmersion_iff, isPreimmersion_iff, ← and_assoc, closedEmbedding_iff,
59+
@and_comm (Embedding _)]
60+
61+
lemma of_isPreimmersion {X Y : Scheme} (f : X ⟶ Y) [IsPreimmersion f]
62+
(hf : IsClosed (Set.range f.1.base)) : IsClosedImmersion f :=
63+
iff_isPreimmersion.mpr ⟨‹_›, hf⟩
64+
65+
instance (priority := 900) {X Y : Scheme} (f : X ⟶ Y) [IsClosedImmersion f] : IsPreimmersion f :=
66+
(iff_isPreimmersion.mp ‹_›).1
67+
6168
/-- Isomorphisms are closed immersions. -/
6269
instance {X Y : Scheme} (f : X ⟶ Y) [IsIso f] : IsClosedImmersion f where
6370
base_closed := Homeomorph.closedEmbedding <| TopCat.homeoOfIso (asIso f.1.base)
@@ -121,7 +128,7 @@ theorem of_comp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [IsClosedImmersion
121128
← Set.image_comp]
122129
exact ClosedEmbedding.isClosedMap h _ hZ
123130
surj_on_stalks x := by
124-
have h := surjective_stalkMap (f ≫ g) x
131+
have h := (f ≫ g).stalkMap_surjective x
125132
simp_rw [Scheme.comp_val, Scheme.stalkMap_comp] at h
126133
exact Function.Surjective.of_comp h
127134

@@ -130,11 +137,6 @@ instance {X Y : Scheme} (f : X ⟶ Y) [IsClosedImmersion f] : QuasiCompact f whe
130137

131138
end IsClosedImmersion
132139

133-
/-- Being surjective on stalks is local at the target. -/
134-
instance isSurjectiveOnStalks_isLocalAtTarget : IsLocalAtTarget
135-
(stalkwise (fun f ↦ Function.Surjective f)) :=
136-
stalkwiseIsLocalAtTarget_of_respectsIso surjective_respectsIso
137-
138140
/-- Being a closed immersion is local at the target. -/
139141
instance IsClosedImmersion.isLocalAtTarget : IsLocalAtTarget @IsClosedImmersion :=
140142
eq_inf ▸ inferInstance
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/-
2+
Copyright (c) 2024 Andrew Yang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Andrew Yang
5+
-/
6+
import Mathlib.AlgebraicGeometry.Morphisms.UnderlyingMap
7+
import Mathlib.RingTheory.LocalProperties
8+
9+
/-!
10+
11+
# Preimmersions of schemes
12+
13+
A morphism of schemes `f : X ⟶ Y` is a preimmersion if the underlying map of topological spaces
14+
is an embedding and the induced morphisms of stalks are all surjective. This is not a concept seen
15+
in the literature but it is useful for generalizing results on immersions to other maps including
16+
`Spec 𝒪_{X, x} ⟶ X` and inclusions of fibers `κ(x) ×ₓ Y ⟶ Y`.
17+
18+
## TODO
19+
20+
* Show preimmersions are local at the target.
21+
* Show preimmersions are stable under pullback.
22+
* Show that `Spec f` is a preimmersion for `f : R ⟶ S` if every `s : S` is of the form `f a / f b`.
23+
24+
-/
25+
26+
universe v u
27+
28+
open CategoryTheory
29+
30+
namespace AlgebraicGeometry
31+
32+
/-- A morphism of schemes `f : X ⟶ Y` is a preimmersion if the underlying map of
33+
topological spaces is an embedding and the induced morphisms of stalks are all surjective. -/
34+
@[mk_iff]
35+
class IsPreimmersion {X Y : Scheme} (f : X ⟶ Y) : Prop where
36+
base_embedding : Embedding f.1.base
37+
surj_on_stalks : ∀ x, Function.Surjective (f.stalkMap x)
38+
39+
lemma Scheme.Hom.embedding {X Y : Scheme} (f : Hom X Y) [IsPreimmersion f] : Embedding f.1.base :=
40+
IsPreimmersion.base_embedding
41+
42+
lemma Scheme.Hom.stalkMap_surjective {X Y : Scheme} (f : Hom X Y) [IsPreimmersion f] (x) :
43+
Function.Surjective (f.stalkMap x) :=
44+
IsPreimmersion.surj_on_stalks x
45+
46+
lemma isPreimmersion_eq_inf :
47+
@IsPreimmersion = topologically Embedding ⊓ stalkwise (Function.Surjective ·) := by
48+
ext
49+
rw [isPreimmersion_iff]
50+
rfl
51+
52+
/-- Being surjective on stalks is local at the target. -/
53+
instance isSurjectiveOnStalks_isLocalAtTarget : IsLocalAtTarget
54+
(stalkwise (Function.Surjective ·)) :=
55+
stalkwiseIsLocalAtTarget_of_respectsIso surjective_respectsIso
56+
57+
namespace IsPreimmersion
58+
59+
instance : IsLocalAtTarget @IsPreimmersion :=
60+
isPreimmersion_eq_inf ▸ inferInstance
61+
62+
instance (priority := 900) {X Y : Scheme} (f : X ⟶ Y) [IsOpenImmersion f] : IsPreimmersion f where
63+
base_embedding := f.openEmbedding.toEmbedding
64+
surj_on_stalks _ := (ConcreteCategory.bijective_of_isIso _).2
65+
66+
instance : MorphismProperty.IsMultiplicative @IsPreimmersion where
67+
id_mem _ := inferInstance
68+
comp_mem {X Y Z} f g hf hg := by
69+
refine ⟨hg.base_embedding.comp hf.base_embedding, fun x ↦ ?_⟩
70+
rw [Scheme.stalkMap_comp]
71+
exact (hf.surj_on_stalks x).comp (hg.surj_on_stalks (f.1.1 x))
72+
73+
instance comp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [IsPreimmersion f]
74+
[IsPreimmersion g] : IsPreimmersion (f ≫ g) :=
75+
MorphismProperty.IsStableUnderComposition.comp_mem f g inferInstance inferInstance
76+
77+
instance (priority := 900) {X Y} (f : X ⟶ Y) [IsPreimmersion f] : Mono f := by
78+
refine (Scheme.forgetToLocallyRingedSpace ⋙
79+
LocallyRingedSpace.forgetToSheafedSpace).mono_of_mono_map ?_
80+
apply SheafedSpace.mono_of_base_injective_of_stalk_epi
81+
· exact f.embedding.inj
82+
· exact fun x ↦ ConcreteCategory.epi_of_surjective _ (f.stalkMap_surjective x)
83+
84+
theorem of_comp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [IsPreimmersion g]
85+
[IsPreimmersion (f ≫ g)] : IsPreimmersion f where
86+
base_embedding := by
87+
have h := (f ≫ g).embedding
88+
rwa [← g.embedding.of_comp_iff]
89+
surj_on_stalks x := by
90+
have h := (f ≫ g).stalkMap_surjective x
91+
rw [Scheme.stalkMap_comp] at h
92+
exact Function.Surjective.of_comp h
93+
94+
theorem comp_iff {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [IsPreimmersion g] :
95+
IsPreimmersion (f ≫ g) ↔ IsPreimmersion f :=
96+
fun _ ↦ of_comp f g, fun _ ↦ inferInstance⟩
97+
98+
end IsPreimmersion
99+
100+
end AlgebraicGeometry

Mathlib/Geometry/RingedSpace/SheafedSpace.lean

+34
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Scott Morrison
55
-/
66
import Mathlib.Geometry.RingedSpace.PresheafedSpace.HasColimits
7+
import Mathlib.Geometry.RingedSpace.Stalks
78
import Mathlib.Topology.Sheaves.Functors
89

910
/-!
@@ -209,6 +210,39 @@ instance [HasLimits C] : HasColimits.{v} (SheafedSpace C) :=
209210
noncomputable instance [HasLimits C] : PreservesColimits (forget C) :=
210211
Limits.compPreservesColimits forgetToPresheafedSpace (PresheafedSpace.forget C)
211212

213+
section ConcreteCategory
214+
215+
variable [ConcreteCategory.{v} C] [HasColimits C] [HasLimits C]
216+
variable [PreservesLimits (CategoryTheory.forget C)]
217+
variable [PreservesFilteredColimits (CategoryTheory.forget C)]
218+
variable [(CategoryTheory.forget C).ReflectsIsomorphisms]
219+
220+
attribute [local instance] ConcreteCategory.instFunLike in
221+
lemma hom_stalk_ext {X Y : SheafedSpace C} (f g : X ⟶ Y) (h : f.base = g.base)
222+
(h' : ∀ x, f.stalkMap x = (Y.presheaf.stalkCongr (h ▸ rfl)).hom ≫ g.stalkMap x) :
223+
f = g := by
224+
obtain ⟨f, fc⟩ := f
225+
obtain ⟨g, gc⟩ := g
226+
obtain rfl : f = g := h
227+
congr
228+
ext U s
229+
refine section_ext X.sheaf _ _ _ fun x ↦ show X.presheaf.germ x _ = X.presheaf.germ x _ from ?_
230+
erw [← PresheafedSpace.stalkMap_germ_apply ⟨f, fc⟩, ← PresheafedSpace.stalkMap_germ_apply ⟨f, gc⟩]
231+
simp [h']
232+
233+
lemma mono_of_base_injective_of_stalk_epi {X Y : SheafedSpace C} (f : X ⟶ Y)
234+
(h₁ : Function.Injective f.base)
235+
(h₂ : ∀ x, Epi (f.stalkMap x)) : Mono f := by
236+
constructor
237+
intro Z ⟨g, gc⟩ ⟨h, hc⟩ e
238+
obtain rfl : g = h := ConcreteCategory.hom_ext _ _ fun x ↦ h₁ congr(($e).base x)
239+
refine SheafedSpace.hom_stalk_ext ⟨g, gc⟩ ⟨g, hc⟩ rfl fun x ↦ ?_
240+
rw [← cancel_epi (f.stalkMap (g x)), stalkCongr_hom, stalkSpecializes_refl, Category.id_comp,
241+
← PresheafedSpace.stalkMap.comp ⟨g, gc⟩ f, ← PresheafedSpace.stalkMap.comp ⟨g, hc⟩ f]
242+
congr 1
243+
244+
end ConcreteCategory
245+
212246
end SheafedSpace
213247

214248
end AlgebraicGeometry

0 commit comments

Comments
 (0)