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

Commit af5c45d

Browse files
committed
feat(algebraic_geometry): Restriction of morphisms onto open sets of the target (#14972)
Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com>
1 parent 13e97da commit af5c45d

File tree

1 file changed

+224
-5
lines changed

1 file changed

+224
-5
lines changed

src/algebraic_geometry/open_immersion.lean

Lines changed: 224 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ open topological_space category_theory opposite
6060
open category_theory.limits
6161
namespace algebraic_geometry
6262

63-
universes v u
63+
universes v v₁ v₂ u
6464

6565
variables {C : Type u} [category.{v} C]
6666

@@ -454,7 +454,7 @@ begin
454454
apply_instance
455455
end
456456

457-
instance pullback_one_is_open_immersion [is_open_immersion g] :
457+
instance pullback_to_base_is_open_immersion [is_open_immersion g] :
458458
is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
459459
begin
460460
rw [←limit.w (cospan f g) walking_cospan.hom.inl, cospan_map_inl],
@@ -724,7 +724,7 @@ begin
724724
apply_instance
725725
end
726726

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] :
728728
SheafedSpace.is_open_immersion (limit.π (cospan f g) one : pullback f g ⟶ Z) :=
729729
begin
730730
rw [←limit.w (cospan f g) hom.inl, cospan_map_inl],
@@ -934,7 +934,7 @@ begin
934934
apply_instance
935935
end
936936

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] :
938938
LocallyRingedSpace.is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
939939
begin
940940
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)
12041204
(λ _, iso.refl _)
12051205
(λ _, (category.id_comp _).symm)
12061206

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+
12071218
-- Related result : `open_cover.pullback_cover`, where we pullback an open cover on `X` along a
12081219
-- morphism `W ⟶ X`. This is provided at the end of the file since it needs some more results
12091220
-- about open immersion (which in turn needs the open cover API).
@@ -1475,7 +1486,7 @@ begin
14751486
apply_instance
14761487
end
14771488

1478-
instance pullback_one [is_open_immersion g] :
1489+
instance pullback_to_base [is_open_immersion g] :
14791490
is_open_immersion (limit.π (cospan f g) walking_cospan.one) :=
14801491
begin
14811492
rw ← limit.w (cospan f g) walking_cospan.hom.inl,
@@ -1496,6 +1507,51 @@ end
14961507
instance forget_to_Top_preserves_of_right :
14971508
preserves_limit (cospan g f) Scheme.forget_to_Top := preserves_pullback_symmetry _ _ _
14981509

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+
14991555
/--
15001556
The universal property of open immersions:
15011557
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
15231579

15241580
end is_open_immersion
15251581

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+
15261617
/-- Given an open cover on `X`, we may pull them back along a morphism `W ⟶ X` to obtain
15271618
an open cover of `W`. -/
15281619
@[simps]
@@ -1543,4 +1634,132 @@ def Scheme.open_cover.pullback_cover {X : Scheme} (𝒰 : X.open_cover) {W : Sch
15431634
{ rw ← Top.epi_iff_surjective, apply_instance }
15441635
end }
15451636

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+
15461765
end algebraic_geometry

0 commit comments

Comments
 (0)