@@ -560,7 +560,7 @@ def to_SheafedSpace_hom : to_SheafedSpace Y f ⟶ Y := f
560
560
561
561
@[simp] lemma to_SheafedSpace_hom_c : (to_SheafedSpace_hom Y f).c = f.c := rfl
562
562
563
- instance to_SheafedSpace_hom_forget_is_open_immersion :
563
+ instance to_SheafedSpace_is_open_immersion :
564
564
SheafedSpace.is_open_immersion (to_SheafedSpace_hom Y f) := H
565
565
566
566
omit H
@@ -597,7 +597,7 @@ def to_LocallyRingedSpace_hom : to_LocallyRingedSpace Y f ⟶ Y := ⟨f, λ x, i
597
597
@[simp] lemma to_LocallyRingedSpace_hom_val :
598
598
(to_LocallyRingedSpace_hom Y f).val = f := rfl
599
599
600
- instance to_LocallyRingedSpace_hom_hom_forget_is_open_immersion :
600
+ instance to_LocallyRingedSpace_is_open_immersion :
601
601
LocallyRingedSpace.is_open_immersion (to_LocallyRingedSpace_hom Y f) := H
602
602
603
603
omit H
@@ -1061,6 +1061,34 @@ end
1061
1061
1062
1062
end pullback
1063
1063
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
+
1064
1092
end LocallyRingedSpace.is_open_immersion
1065
1093
1066
1094
lemma is_open_immersion.open_range {X Y : Scheme} (f : X ⟶ Y) [H : is_open_immersion f] :
@@ -1173,6 +1201,13 @@ a basis. -/
1173
1201
def affine_basis_cover (X : Scheme) : open_cover X :=
1174
1202
X.affine_cover.bind (λ x, affine_basis_cover_of_affine _)
1175
1203
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
+
1176
1211
lemma affine_basis_cover_map_range (X : Scheme)
1177
1212
(x : X.carrier) (r : (X.local_affine x).some_spec.some) :
1178
1213
set.range (X.affine_basis_cover.map ⟨x, r⟩).1 .base =
@@ -1207,4 +1242,169 @@ end Scheme
1207
1242
1208
1243
end open_cover
1209
1244
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
+
1210
1410
end algebraic_geometry
0 commit comments