@@ -60,7 +60,7 @@ open topological_space category_theory opposite
60
60
open category_theory.limits
61
61
namespace algebraic_geometry
62
62
63
- universes v u
63
+ universes v v₁ v₂ u
64
64
65
65
variables {C : Type u} [category.{v} C]
66
66
@@ -454,7 +454,7 @@ begin
454
454
apply_instance
455
455
end
456
456
457
- instance pullback_one_is_open_immersion [is_open_immersion g] :
457
+ instance pullback_to_base_is_open_immersion [is_open_immersion g] :
458
458
is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
459
459
begin
460
460
rw [←limit.w (cospan f g) walking_cospan.hom.inl, cospan_map_inl],
@@ -724,7 +724,7 @@ begin
724
724
apply_instance
725
725
end
726
726
727
- instance SheafedSpace_pullback_one_is_open_immersion [SheafedSpace.is_open_immersion g] :
727
+ instance SheafedSpace_pullback_to_base_is_open_immersion [SheafedSpace.is_open_immersion g] :
728
728
SheafedSpace.is_open_immersion (limit.π (cospan f g) one : pullback f g ⟶ Z) :=
729
729
begin
730
730
rw [←limit.w (cospan f g) hom.inl, cospan_map_inl],
@@ -934,7 +934,7 @@ begin
934
934
apply_instance
935
935
end
936
936
937
- instance pullback_one_is_open_immersion [LocallyRingedSpace.is_open_immersion g] :
937
+ instance pullback_to_base_is_open_immersion [LocallyRingedSpace.is_open_immersion g] :
938
938
LocallyRingedSpace.is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
939
939
begin
940
940
rw [←limit.w (cospan f g) walking_cospan.hom.inl, cospan_map_inl],
@@ -1204,6 +1204,17 @@ def open_cover.pushforward_iso {X Y : Scheme} (𝒰 : open_cover X)
1204
1204
(λ _, iso.refl _)
1205
1205
(λ _, (category.id_comp _).symm)
1206
1206
1207
+ /-- Adding an open immersion into an open cover gives another open cover. -/
1208
+ @[simps]
1209
+ def open_cover.add {X : Scheme} (𝒰 : X.open_cover) {Y : Scheme} (f : Y ⟶ X)
1210
+ [is_open_immersion f] : X.open_cover :=
1211
+ { J := option 𝒰.J,
1212
+ obj := λ i, option.rec Y 𝒰.obj i,
1213
+ map := λ i, option.rec f 𝒰.map i,
1214
+ f := λ x, some (𝒰.f x),
1215
+ covers := 𝒰.covers,
1216
+ is_open := by rintro (_|_); dsimp; apply_instance }
1217
+
1207
1218
-- Related result : `open_cover.pullback_cover`, where we pullback an open cover on `X` along a
1208
1219
-- morphism `W ⟶ X`. This is provided at the end of the file since it needs some more results
1209
1220
-- about open immersion (which in turn needs the open cover API).
@@ -1475,7 +1486,7 @@ begin
1475
1486
apply_instance
1476
1487
end
1477
1488
1478
- instance pullback_one [is_open_immersion g] :
1489
+ instance pullback_to_base [is_open_immersion g] :
1479
1490
is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
1480
1491
begin
1481
1492
rw ← limit.w (cospan f g) walking_cospan.hom.inl,
@@ -1496,6 +1507,51 @@ end
1496
1507
instance forget_to_Top_preserves_of_right :
1497
1508
preserves_limit (cospan g f) Scheme.forget_to_Top := preserves_pullback_symmetry _ _ _
1498
1509
1510
+ lemma range_pullback_snd_of_left :
1511
+ set.range (pullback.snd : pullback f g ⟶ Y).1 .base =
1512
+ (opens.map g.1 .base).obj ⟨set.range f.1 .base, H.base_open.open_range⟩ :=
1513
+ begin
1514
+ rw [← (show _ = (pullback.snd : pullback f g ⟶ _).1 .base,
1515
+ from preserves_pullback.iso_hom_snd Scheme.forget_to_Top f g), coe_comp, set.range_comp,
1516
+ set.range_iff_surjective.mpr,
1517
+ ← @set.preimage_univ _ _ (pullback.fst : pullback f.1 .base g.1 .base ⟶ _),
1518
+ Top.pullback_snd_image_fst_preimage, set.image_univ],
1519
+ refl,
1520
+ rw ← Top.epi_iff_surjective,
1521
+ apply_instance
1522
+ end
1523
+
1524
+ lemma range_pullback_fst_of_right :
1525
+ set.range (pullback.fst : pullback g f ⟶ Y).1 .base =
1526
+ (opens.map g.1 .base).obj ⟨set.range f.1 .base, H.base_open.open_range⟩ :=
1527
+ begin
1528
+ rw [← (show _ = (pullback.fst : pullback g f ⟶ _).1 .base,
1529
+ from preserves_pullback.iso_hom_fst Scheme.forget_to_Top g f), coe_comp, set.range_comp,
1530
+ set.range_iff_surjective.mpr,
1531
+ ← @set.preimage_univ _ _ (pullback.snd : pullback g.1 .base f.1 .base ⟶ _),
1532
+ Top.pullback_fst_image_snd_preimage, set.image_univ],
1533
+ refl,
1534
+ rw ← Top.epi_iff_surjective,
1535
+ apply_instance
1536
+ end
1537
+
1538
+ lemma range_pullback_to_base_of_left :
1539
+ set.range (pullback.fst ≫ f : pullback f g ⟶ Z).1 .base =
1540
+ set.range f.1 .base ∩ set.range g.1 .base :=
1541
+ begin
1542
+ rw [pullback.condition, Scheme.comp_val_base, coe_comp, set.range_comp,
1543
+ range_pullback_snd_of_left, opens.map_obj, subtype.coe_mk, set.image_preimage_eq_inter_range,
1544
+ set.inter_comm],
1545
+ end
1546
+
1547
+ lemma range_pullback_to_base_of_right :
1548
+ set.range (pullback.fst ≫ g : pullback g f ⟶ Z).1 .base =
1549
+ set.range g.1 .base ∩ set.range f.1 .base :=
1550
+ begin
1551
+ rw [Scheme.comp_val_base, coe_comp, set.range_comp, range_pullback_fst_of_right, opens.map_obj,
1552
+ subtype.coe_mk, set.image_preimage_eq_inter_range, set.inter_comm],
1553
+ end
1554
+
1499
1555
/--
1500
1556
The universal property of open immersions:
1501
1557
For an open immersion `f : X ⟶ Z`, given any morphism of schemes `g : Y ⟶ Z` whose topological
@@ -1523,6 +1579,41 @@ LocallyRingedSpace.is_open_immersion.lift_uniq f g H' l hl
1523
1579
1524
1580
end is_open_immersion
1525
1581
1582
+ /-- The functor taking open subsets of `X` to open subschemes of `X`. -/
1583
+ @[simps obj_left obj_hom map_left]
1584
+ def Scheme.restrict_functor (X : Scheme) : opens X.carrier ⥤ over X :=
1585
+ { obj := λ U, over.mk (X.of_restrict U.open_embedding),
1586
+ map := λ U V i, over.hom_mk (is_open_immersion.lift (X.of_restrict _) (X.of_restrict _)
1587
+ (by { change set.range coe ⊆ set.range coe, simp_rw [subtype.range_coe], exact i.le }))
1588
+ (is_open_immersion.lift_fac _ _ _),
1589
+ map_id' := λ U, by begin
1590
+ ext1,
1591
+ dsimp only [over.hom_mk_left, over.id_left],
1592
+ rw [← cancel_mono (X.of_restrict U.open_embedding), category.id_comp,
1593
+ is_open_immersion.lift_fac],
1594
+ end ,
1595
+ map_comp' := λ U V W i j, begin
1596
+ ext1,
1597
+ dsimp only [over.hom_mk_left, over.comp_left],
1598
+ rw [← cancel_mono (X.of_restrict W.open_embedding), category.assoc],
1599
+ iterate 3 { rw [is_open_immersion.lift_fac] }
1600
+ end }
1601
+
1602
+ /-- The restriction of an isomorphism onto an open set. -/
1603
+ noncomputable
1604
+ abbreviation Scheme.restrict_map_iso {X Y : Scheme} (f : X ⟶ Y) [is_iso f] (U : opens Y.carrier) :
1605
+ X.restrict ((opens.map f.1 .base).obj U).open_embedding ≅ Y.restrict U.open_embedding :=
1606
+ begin
1607
+ refine is_open_immersion.iso_of_range_eq (X.of_restrict _ ≫ f) (Y.of_restrict _) _,
1608
+ dsimp [opens.inclusion],
1609
+ rw [coe_comp, set.range_comp],
1610
+ dsimp,
1611
+ rw [subtype.range_coe, subtype.range_coe],
1612
+ refine @set.image_preimage_eq _ _ f.1 .base U.1 _,
1613
+ rw ← Top.epi_iff_surjective,
1614
+ apply_instance
1615
+ end
1616
+
1526
1617
/-- Given an open cover on `X`, we may pull them back along a morphism `W ⟶ X` to obtain
1527
1618
an open cover of `W`. -/
1528
1619
@[simps]
@@ -1543,4 +1634,132 @@ def Scheme.open_cover.pullback_cover {X : Scheme} (𝒰 : X.open_cover) {W : Sch
1543
1634
{ rw ← Top.epi_iff_surjective, apply_instance }
1544
1635
end }
1545
1636
1637
+ /-- Given open covers `{ Uᵢ }` and `{ Uⱼ }`, we may form the open cover `{ Uᵢ ∩ Uⱼ }`. -/
1638
+ def Scheme.open_cover.inter {X : Scheme.{u}} (𝒰₁ : Scheme.open_cover.{v₁} X)
1639
+ (𝒰₂ : Scheme.open_cover.{v₂} X) : X.open_cover :=
1640
+ { J := 𝒰₁.J × 𝒰₂.J,
1641
+ obj := λ ij, pullback (𝒰₁.map ij.1 ) (𝒰₂.map ij.2 ),
1642
+ map := λ ij, pullback.fst ≫ 𝒰₁.map ij.1 ,
1643
+ f := λ x, ⟨𝒰₁.f x, 𝒰₂.f x⟩,
1644
+ covers := λ x, by { rw is_open_immersion.range_pullback_to_base_of_left,
1645
+ exact ⟨𝒰₁.covers x, 𝒰₂.covers x⟩ } }
1646
+
1647
+ section morphism_restrict
1648
+
1649
+ /-- Given a morphism `f : X ⟶ Y` and an open set `U ⊆ Y`, we have `X ×[Y] U ≅ X |_{f ⁻¹ U}` -/
1650
+ def pullback_restrict_iso_restrict {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) :
1651
+ pullback f (Y.of_restrict U.open_embedding) ≅
1652
+ X.restrict ((opens.map f.1 .base).obj U).open_embedding :=
1653
+ begin
1654
+ refine is_open_immersion.iso_of_range_eq pullback.fst (X.of_restrict _) _,
1655
+ rw is_open_immersion.range_pullback_fst_of_right,
1656
+ dsimp [opens.inclusion],
1657
+ rw [subtype.range_coe, subtype.range_coe],
1658
+ refl,
1659
+ end
1660
+
1661
+ @[simp, reassoc]
1662
+ lemma pullback_restrict_iso_restrict_inv_fst {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) :
1663
+ (pullback_restrict_iso_restrict f U).inv ≫ pullback.fst = X.of_restrict _ :=
1664
+ by { delta pullback_restrict_iso_restrict, simp }
1665
+
1666
+ @[simp, reassoc]
1667
+ lemma pullback_restrict_iso_restrict_hom_restrict {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) :
1668
+ (pullback_restrict_iso_restrict f U).hom ≫ X.of_restrict _ = pullback.fst :=
1669
+ by { delta pullback_restrict_iso_restrict, simp }
1670
+
1671
+ /-- The restriction of a morphism `X ⟶ Y` onto `X |_{f ⁻¹ U} ⟶ Y |_ U`. -/
1672
+ def morphism_restrict {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) :
1673
+ X.restrict ((opens.map f.1 .base).obj U).open_embedding ⟶ Y.restrict U.open_embedding :=
1674
+ (pullback_restrict_iso_restrict f U).inv ≫ pullback.snd
1675
+
1676
+ infix ` ∣_ `: 80 := morphism_restrict
1677
+
1678
+ @[simp, reassoc]
1679
+ lemma pullback_restrict_iso_restrict_hom_morphism_restrict {X Y : Scheme} (f : X ⟶ Y)
1680
+ (U : opens Y.carrier) :
1681
+ (pullback_restrict_iso_restrict f U).hom ≫ f ∣_ U = pullback.snd :=
1682
+ iso.hom_inv_id_assoc _ _
1683
+
1684
+ @[simp, reassoc]
1685
+ lemma morphism_restrict_ι {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) :
1686
+ f ∣_ U ≫ Y.of_restrict U.open_embedding = X.of_restrict _ ≫ f :=
1687
+ by { delta morphism_restrict,
1688
+ rw [category.assoc, pullback.condition.symm, pullback_restrict_iso_restrict_inv_fst_assoc] }
1689
+
1690
+ lemma morphism_restrict_comp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) (U : opens Z.carrier) :
1691
+ (f ≫ g) ∣_ U = (f ∣_ ((opens.map g.val.base).obj U) ≫ g ∣_ U : _) :=
1692
+ begin
1693
+ delta morphism_restrict,
1694
+ rw ← pullback_right_pullback_fst_iso_inv_snd_snd,
1695
+ simp_rw ← category.assoc,
1696
+ congr' 1 ,
1697
+ rw ← cancel_mono pullback.fst,
1698
+ simp_rw category.assoc,
1699
+ rw [pullback_restrict_iso_restrict_inv_fst, pullback_right_pullback_fst_iso_inv_snd_fst,
1700
+ ← pullback.condition, pullback_restrict_iso_restrict_inv_fst_assoc,
1701
+ pullback_restrict_iso_restrict_inv_fst_assoc],
1702
+ refl,
1703
+ apply_instance
1704
+ end
1705
+
1706
+ instance {X Y : Scheme} (f : X ⟶ Y) [is_iso f] (U : opens Y.carrier) : is_iso (f ∣_ U) :=
1707
+ by { delta morphism_restrict, apply_instance }
1708
+
1709
+ lemma morphism_restrict_base_coe {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) (x) :
1710
+ @coe U Y.carrier _ ((f ∣_ U).1 .base x) = f.1 .base x.1 :=
1711
+ congr_arg (λ f, PresheafedSpace.hom.base (subtype.val f) x) (morphism_restrict_ι f U)
1712
+
1713
+ lemma image_morphism_restrict_preimage {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier)
1714
+ (V : opens U) :
1715
+ ((opens.map f.val.base).obj U).open_embedding.is_open_map.functor.obj
1716
+ ((opens.map (f ∣_ U).val.base).obj V) =
1717
+ (opens.map f.val.base).obj (U.open_embedding.is_open_map.functor.obj V) :=
1718
+ begin
1719
+ ext1,
1720
+ ext x,
1721
+ split,
1722
+ { rintro ⟨⟨x, hx⟩, (hx' : (f ∣_ U).1 .base _ ∈ _), rfl⟩,
1723
+ refine ⟨⟨_, hx⟩, _, rfl⟩,
1724
+ convert hx',
1725
+ ext1,
1726
+ exact (morphism_restrict_base_coe f U ⟨x, hx⟩).symm },
1727
+ { rintro ⟨⟨x, hx⟩, hx', (rfl : x = _)⟩,
1728
+ refine ⟨⟨_, hx⟩, (_: ((f ∣_ U).1 .base ⟨x, hx⟩) ∈ V.1 ), rfl⟩,
1729
+ convert hx',
1730
+ ext1,
1731
+ exact morphism_restrict_base_coe f U ⟨x, hx⟩ }
1732
+ end
1733
+
1734
+ lemma morphism_restrict_c_app {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) (V : opens U) :
1735
+ (f ∣_ U).1 .c.app (op V) = f.1 .c.app (op (U.open_embedding.is_open_map.functor.obj V)) ≫
1736
+ X.presheaf.map (eq_to_hom (image_morphism_restrict_preimage f U V)).op :=
1737
+ begin
1738
+ have := Scheme.congr_app (morphism_restrict_ι f U)
1739
+ (op (U.open_embedding.is_open_map.functor.obj V)),
1740
+ rw [Scheme.comp_val_c_app, Scheme.comp_val_c_app_assoc] at this ,
1741
+ have e : (opens.map U.inclusion).obj (U.open_embedding.is_open_map.functor.obj V) = V,
1742
+ { ext1, exact set.preimage_image_eq _ subtype.coe_injective },
1743
+ have : _ ≫ X.presheaf.map _ = _ :=
1744
+ (((f ∣_ U).1 .c.naturality (eq_to_hom e).op).symm.trans _).trans this ,
1745
+ swap, { change Y.presheaf.map _ ≫ _ = Y.presheaf.map _ ≫ _, congr, },
1746
+ rw [← is_iso.eq_comp_inv, ← functor.map_inv, category.assoc] at this ,
1747
+ rw this ,
1748
+ congr' 1 ,
1749
+ erw [← X.presheaf.map_comp, ← X.presheaf.map_comp],
1750
+ congr' 1 ,
1751
+ end
1752
+
1753
+ lemma Γ_map_morphism_restrict {X Y : Scheme} (f : X ⟶ Y) (U : opens Y.carrier) :
1754
+ Scheme.Γ.map (f ∣_ U).op = Y.presheaf.map (eq_to_hom $ U.open_embedding_obj_top.symm).op ≫
1755
+ f.1 .c.app (op U) ≫
1756
+ X.presheaf.map (eq_to_hom $ ((opens.map f.val.base).obj U).open_embedding_obj_top).op :=
1757
+ begin
1758
+ rw [Scheme.Γ_map_op, morphism_restrict_c_app f U ⊤, f.val.c.naturality_assoc],
1759
+ erw ← X.presheaf.map_comp,
1760
+ congr,
1761
+ end
1762
+
1763
+ end morphism_restrict
1764
+
1546
1765
end algebraic_geometry
0 commit comments