Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit abf9657

Browse files
committed
feat(algebraic_geometry): Results about open immersions of schemes. (#10977)
Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com>
1 parent 07b578e commit abf9657

File tree

2 files changed

+207
-13
lines changed

2 files changed

+207
-13
lines changed

src/algebraic_geometry/Scheme.lean

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,13 @@ so that that the restriction of `X` to `U` is isomorphic,
3232
as a locally ringed space, to `Spec.to_LocallyRingedSpace.obj (op R)`
3333
for some `R : CommRing`.
3434
-/
35-
structure Scheme extends X : LocallyRingedSpace :=
36-
(local_affine : ∀ x : X, ∃ (U : open_nhds x) (R : CommRing),
37-
nonempty (X.restrict U.open_embedding ≅ Spec.to_LocallyRingedSpace.obj (op R)))
35+
structure Scheme extends to_LocallyRingedSpace : LocallyRingedSpace :=
36+
(local_affine : ∀ x : to_LocallyRingedSpace, ∃ (U : open_nhds x) (R : CommRing),
37+
nonempty (to_LocallyRingedSpace.restrict U.open_embedding ≅
38+
Spec.to_LocallyRingedSpace.obj (op R)))
3839

3940
namespace Scheme
4041

41-
/--
42-
Every `Scheme` is a `LocallyRingedSpace`.
43-
-/
44-
-- (This parent projection is apparently not automatically generated because
45-
-- we used the `extends X : LocallyRingedSpace` syntax.)
46-
def to_LocallyRingedSpace (S : Scheme) : LocallyRingedSpace := { ..S }
47-
4842
/--
4943
Schemes are a full subcategory of locally ringed spaces.
5044
-/
@@ -70,7 +64,7 @@ The spectrum of a commutative ring, as a scheme.
7064
def Spec_obj (R : CommRing) : Scheme :=
7165
{ local_affine := λ x,
7266
⟨⟨⊤, trivial⟩, R, ⟨(Spec.to_LocallyRingedSpace.obj (op R)).restrict_top_iso⟩⟩,
73-
.. Spec.LocallyRingedSpace_obj R }
67+
to_LocallyRingedSpace := Spec.LocallyRingedSpace_obj R }
7468

7569
@[simp] lemma Spec_obj_to_LocallyRingedSpace (R : CommRing) :
7670
(Spec_obj R).to_LocallyRingedSpace = Spec.LocallyRingedSpace_obj R := rfl

src/algebraic_geometry/open_immersion.lean

Lines changed: 202 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ def to_SheafedSpace_hom : to_SheafedSpace Y f ⟶ Y := f
560560

561561
@[simp] lemma to_SheafedSpace_hom_c : (to_SheafedSpace_hom Y f).c = f.c := rfl
562562

563-
instance to_SheafedSpace_hom_forget_is_open_immersion :
563+
instance to_SheafedSpace_is_open_immersion :
564564
SheafedSpace.is_open_immersion (to_SheafedSpace_hom Y f) := H
565565

566566
omit H
@@ -597,7 +597,7 @@ def to_LocallyRingedSpace_hom : to_LocallyRingedSpace Y f ⟶ Y := ⟨f, λ x, i
597597
@[simp] lemma to_LocallyRingedSpace_hom_val :
598598
(to_LocallyRingedSpace_hom Y f).val = f := rfl
599599

600-
instance to_LocallyRingedSpace_hom_hom_forget_is_open_immersion :
600+
instance to_LocallyRingedSpace_is_open_immersion :
601601
LocallyRingedSpace.is_open_immersion (to_LocallyRingedSpace_hom Y f) := H
602602

603603
omit H
@@ -1061,6 +1061,34 @@ end
10611061

10621062
end pullback
10631063

1064+
/-- An open immersion is isomorphic to the induced open subscheme on its image. -/
1065+
def iso_restrict {X Y : LocallyRingedSpace} {f : X ⟶ Y}
1066+
(H : LocallyRingedSpace.is_open_immersion f) : X ≅ Y.restrict H.base_open :=
1067+
begin
1068+
apply LocallyRingedSpace.iso_of_SheafedSpace_iso,
1069+
apply @preimage_iso _ _ _ _ SheafedSpace.forget_to_PresheafedSpace,
1070+
exact H.iso_restrict
1071+
end
1072+
1073+
/-- To show that a locally ringed space is a scheme, it suffices to show that it has a jointly
1074+
sujective family of open immersions from affine schemes. -/
1075+
protected def Scheme (X : LocallyRingedSpace)
1076+
(h : ∀ (x : X), ∃ (R : CommRing) (f : Spec.to_LocallyRingedSpace.obj (op R) ⟶ X),
1077+
(x ∈ set.range f.1.base : _) ∧ LocallyRingedSpace.is_open_immersion f) : Scheme :=
1078+
{ to_LocallyRingedSpace := X,
1079+
local_affine :=
1080+
begin
1081+
intro x,
1082+
obtain ⟨R, f, h₁, h₂⟩ := h x,
1083+
refine ⟨⟨⟨_, h₂.base_open.open_range⟩, h₁⟩, R, ⟨_⟩⟩,
1084+
apply LocallyRingedSpace.iso_of_SheafedSpace_iso,
1085+
apply @preimage_iso _ _ _ _ SheafedSpace.forget_to_PresheafedSpace,
1086+
resetI,
1087+
apply PresheafedSpace.is_open_immersion.iso_of_range_eq (PresheafedSpace.of_restrict _ _) f.1,
1088+
{ exact subtype.range_coe_subtype },
1089+
{ apply_instance }
1090+
end }
1091+
10641092
end LocallyRingedSpace.is_open_immersion
10651093

10661094
lemma is_open_immersion.open_range {X Y : Scheme} (f : X ⟶ Y) [H : is_open_immersion f] :
@@ -1173,6 +1201,13 @@ a basis. -/
11731201
def affine_basis_cover (X : Scheme) : open_cover X :=
11741202
X.affine_cover.bind (λ x, affine_basis_cover_of_affine _)
11751203

1204+
/-- The coordinate ring of a component in the `affine_basis_cover`. -/
1205+
def affine_basis_cover_ring (X : Scheme) (i : X.affine_basis_cover.J) : CommRing :=
1206+
CommRing.of $ @localization.away (X.local_affine i.1).some_spec.some _ i.2
1207+
1208+
lemma affine_basis_cover_obj (X : Scheme) (i : X.affine_basis_cover.J) :
1209+
X.affine_basis_cover.obj i = Spec.obj (op $ X.affine_basis_cover_ring i) := rfl
1210+
11761211
lemma affine_basis_cover_map_range (X : Scheme)
11771212
(x : X.carrier) (r : (X.local_affine x).some_spec.some) :
11781213
set.range (X.affine_basis_cover.map ⟨x, r⟩).1.base =
@@ -1207,4 +1242,169 @@ end Scheme
12071242

12081243
end open_cover
12091244

1245+
namespace PresheafedSpace.is_open_immersion
1246+
1247+
section to_Scheme
1248+
1249+
variables {X : PresheafedSpace CommRing.{u}} (Y : Scheme.{u})
1250+
variables (f : X ⟶ Y.to_PresheafedSpace) [H : PresheafedSpace.is_open_immersion f]
1251+
1252+
include H
1253+
1254+
/-- If `X ⟶ Y` is an open immersion, and `Y` is a scheme, then so is `X`. -/
1255+
def to_Scheme : Scheme :=
1256+
begin
1257+
apply LocallyRingedSpace.is_open_immersion.Scheme (to_LocallyRingedSpace _ f),
1258+
intro x,
1259+
obtain ⟨_,⟨i,rfl⟩,hx,hi⟩ := Y.affine_basis_cover_is_basis.exists_subset_of_mem_open
1260+
(set.mem_range_self x) H.base_open.open_range,
1261+
use Y.affine_basis_cover_ring i,
1262+
use LocallyRingedSpace.is_open_immersion.lift (to_LocallyRingedSpace_hom _ f) _ hi,
1263+
split,
1264+
{ rw LocallyRingedSpace.is_open_immersion.lift_range, exact hx },
1265+
{ delta LocallyRingedSpace.is_open_immersion.lift, apply_instance }
1266+
end
1267+
1268+
@[simp] lemma to_Scheme_to_LocallyRingedSpace :
1269+
(to_Scheme Y f).to_LocallyRingedSpace = (to_LocallyRingedSpace Y.1 f) := rfl
1270+
1271+
/--
1272+
If `X ⟶ Y` is an open immersion of PresheafedSpaces, and `Y` is a Scheme, we can
1273+
upgrade it into a morphism of Schemes.
1274+
-/
1275+
def to_Scheme_hom : to_Scheme Y f ⟶ Y := to_LocallyRingedSpace_hom _ f
1276+
1277+
@[simp] lemma to_Scheme_hom_val :
1278+
(to_Scheme_hom Y f).val = f := rfl
1279+
1280+
instance to_Scheme_hom_is_open_immersion :
1281+
is_open_immersion (to_Scheme_hom Y f) := H
1282+
1283+
omit H
1284+
1285+
lemma Scheme_eq_of_LocallyRingedSpace_eq {X Y : Scheme}
1286+
(H : X.to_LocallyRingedSpace = Y.to_LocallyRingedSpace) : X = Y :=
1287+
by { cases X, cases Y, congr, exact H }
1288+
1289+
lemma Scheme_to_Scheme {X Y : Scheme} (f : X ⟶ Y) [is_open_immersion f] :
1290+
to_Scheme Y f.1 = X :=
1291+
begin
1292+
apply Scheme_eq_of_LocallyRingedSpace_eq,
1293+
exact LocallyRingedSpace_to_LocallyRingedSpace f
1294+
end
1295+
1296+
end to_Scheme
1297+
1298+
end PresheafedSpace.is_open_immersion
1299+
1300+
namespace is_open_immersion
1301+
1302+
variables {X Y Z : Scheme.{u}} (f : X ⟶ Z) (g : Y ⟶ Z)
1303+
variable [H : is_open_immersion f]
1304+
1305+
@[priority 100]
1306+
instance of_is_iso [is_iso g] :
1307+
is_open_immersion g := @@LocallyRingedSpace.is_open_immersion.of_is_iso _
1308+
(show is_iso ((induced_functor _).map g), by apply_instance)
1309+
1310+
include H
1311+
1312+
local notation `forget` := Scheme.forget_to_LocallyRingedSpace
1313+
1314+
instance mono : mono f :=
1315+
faithful_reflects_mono (induced_functor _)
1316+
(show @mono LocallyRingedSpace _ _ _ f, by apply_instance)
1317+
1318+
instance forget_map_is_open_immersion : LocallyRingedSpace.is_open_immersion (forget .map f) :=
1319+
⟨H.base_open, H.c_iso⟩
1320+
1321+
instance has_limit_cospan_forget_of_left :
1322+
has_limit (cospan f g ⋙ Scheme.forget_to_LocallyRingedSpace) :=
1323+
begin
1324+
apply has_limit_of_iso (diagram_iso_cospan.{u} _).symm,
1325+
change has_limit (cospan (forget .map f) (forget .map g)),
1326+
apply_instance
1327+
end
1328+
1329+
open category_theory.limits.walking_cospan
1330+
1331+
instance has_limit_cospan_forget_of_left' :
1332+
has_limit (cospan ((cospan f g ⋙ forget).map hom.inl)
1333+
((cospan f g ⋙ forget).map hom.inr)) :=
1334+
show has_limit (cospan (forget .map f) (forget .map g)), from infer_instance
1335+
1336+
instance has_limit_cospan_forget_of_right : has_limit (cospan g f ⋙ forget) :=
1337+
begin
1338+
apply has_limit_of_iso (diagram_iso_cospan.{u} _).symm,
1339+
change has_limit (cospan (forget .map g) (forget .map f)),
1340+
apply_instance
1341+
end
1342+
1343+
instance has_limit_cospan_forget_of_right' :
1344+
has_limit (cospan ((cospan g f ⋙ forget).map hom.inl)
1345+
((cospan g f ⋙ forget).map hom.inr)) :=
1346+
show has_limit (cospan (forget .map g) (forget .map f)), from infer_instance
1347+
1348+
instance forget_creates_pullback_of_left : creates_limit (cospan f g) forget :=
1349+
creates_limit_of_fully_faithful_of_iso
1350+
(PresheafedSpace.is_open_immersion.to_Scheme Y
1351+
(@pullback.snd LocallyRingedSpace _ _ _ _ f g _).1)
1352+
(eq_to_iso (by simp) ≪≫ has_limit.iso_of_nat_iso (diagram_iso_cospan _).symm)
1353+
1354+
instance forget_creates_pullback_of_right : creates_limit (cospan g f) forget :=
1355+
creates_limit_of_fully_faithful_of_iso
1356+
(PresheafedSpace.is_open_immersion.to_Scheme Y
1357+
(@pullback.fst LocallyRingedSpace _ _ _ _ g f _).1)
1358+
(eq_to_iso (by simp) ≪≫ has_limit.iso_of_nat_iso (diagram_iso_cospan _).symm)
1359+
1360+
instance forget_preserves_of_left : preserves_limit (cospan f g) forget :=
1361+
category_theory.preserves_limit_of_creates_limit_and_has_limit _ _
1362+
1363+
instance forget_preserves_of_right : preserves_limit (cospan g f) forget :=
1364+
preserves_pullback_symmetry _ _ _
1365+
1366+
instance has_pullback_of_left : has_pullback f g :=
1367+
has_limit_of_created (cospan f g) forget
1368+
1369+
instance has_pullback_of_right : has_pullback g f :=
1370+
has_limit_of_created (cospan g f) forget
1371+
1372+
instance pullback_snd_of_left : is_open_immersion (pullback.snd : pullback f g ⟶ _) :=
1373+
begin
1374+
have := preserves_pullback.iso_hom_snd forget f g,
1375+
dsimp only [Scheme.forget_to_LocallyRingedSpace, induced_functor_map] at this,
1376+
rw ← this,
1377+
change LocallyRingedSpace.is_open_immersion _,
1378+
apply_instance
1379+
end
1380+
1381+
instance pullback_fst_of_right : is_open_immersion (pullback.fst : pullback g f ⟶ _) :=
1382+
begin
1383+
rw ← pullback_symmetry_hom_comp_snd,
1384+
apply_instance
1385+
end
1386+
1387+
instance pullback_one [is_open_immersion g] :
1388+
is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
1389+
begin
1390+
rw ← limit.w (cospan f g) walking_cospan.hom.inl,
1391+
change is_open_immersion (_ ≫ f),
1392+
apply_instance
1393+
end
1394+
1395+
instance forget_to_Top_preserves_of_left :
1396+
preserves_limit (cospan f g) Scheme.forget_to_Top :=
1397+
begin
1398+
apply_with limits.comp_preserves_limit { instances := ff },
1399+
apply_instance,
1400+
apply preserves_limit_of_iso_diagram _ (diagram_iso_cospan.{u} _).symm,
1401+
dsimp [LocallyRingedSpace.forget_to_Top],
1402+
apply_instance
1403+
end
1404+
1405+
instance forget_to_Top_preserves_of_right :
1406+
preserves_limit (cospan g f) Scheme.forget_to_Top := preserves_pullback_symmetry _ _ _
1407+
1408+
end is_open_immersion
1409+
12101410
end algebraic_geometry

0 commit comments

Comments
 (0)