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

Commit 323e388

Browse files
committed
feat(algebraic_geometry): More lemmas about affine schemes and basic open sets (#11449)
Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com>
1 parent f770d6e commit 323e388

File tree

2 files changed

+196
-8
lines changed

2 files changed

+196
-8
lines changed

src/algebraic_geometry/AffineScheme.lean

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ We also define predicates about affine schemes and affine open sets.
2525
`AffineScheme.Γ : AffineSchemeᵒᵖ ⥤ CommRing`.
2626
* `algebraic_geometry.is_affine_open`: An open subset of a scheme is affine if the open subscheme is
2727
affine.
28+
* `algebraic_geometry.is_affine_open.from_Spec`: The immersion `Spec 𝒪ₓ(U) ⟶ X` for an affine `U`.
2829
2930
-/
3031

@@ -136,4 +137,174 @@ begin
136137
exact range_is_affine_open_of_open_immersion _,
137138
end
138139

140+
/-- The open immersion `Spec 𝒪ₓ(U) ⟶ X` for an affine `U`. -/
141+
def is_affine_open.from_Spec {X : Scheme} {U : opens X.carrier} (hU : is_affine_open U) :
142+
Scheme.Spec.obj (op $ X.presheaf.obj $ op U) ⟶ X :=
143+
begin
144+
haveI : is_affine (X.restrict U.open_embedding) := hU,
145+
have : U.open_embedding.is_open_map.functor.obj ⊤ = U,
146+
{ ext1, exact set.image_univ.trans subtype.range_coe },
147+
exact Scheme.Spec.map (X.presheaf.map (eq_to_hom this.symm).op).op ≫
148+
(X.restrict U.open_embedding).iso_Spec.inv ≫ X.of_restrict _
149+
end
150+
151+
instance is_affine_open.is_open_immersion_from_Spec {X : Scheme} {U : opens X.carrier}
152+
(hU : is_affine_open U) :
153+
is_open_immersion hU.from_Spec :=
154+
by { delta is_affine_open.from_Spec, apply_instance }
155+
156+
lemma is_affine_open.from_Spec_range {X : Scheme} {U : opens X.carrier} (hU : is_affine_open U) :
157+
set.range hU.from_Spec.1.base = (U : set X.carrier) :=
158+
begin
159+
delta is_affine_open.from_Spec,
160+
erw [← category.assoc, Scheme.comp_val_base],
161+
rw [coe_comp, set.range_comp, set.range_iff_surjective.mpr, set.image_univ],
162+
exact subtype.range_coe,
163+
rw ← Top.epi_iff_surjective,
164+
apply_instance
165+
end
166+
167+
lemma is_affine_open.from_Spec_image_top {X : Scheme} {U : opens X.carrier}
168+
(hU : is_affine_open U) :
169+
hU.is_open_immersion_from_Spec.base_open.is_open_map.functor.obj ⊤ = U :=
170+
by { ext1, exact set.image_univ.trans hU.from_Spec_range }
171+
172+
lemma is_affine_open.is_compact {X : Scheme} {U : opens X.carrier} (hU : is_affine_open U) :
173+
is_compact (U : set X.carrier) :=
174+
begin
175+
convert @is_compact.image _ _ _ _ set.univ hU.from_Spec.1.base
176+
prime_spectrum.compact_space.1 (by continuity),
177+
convert hU.from_Spec_range.symm,
178+
exact set.image_univ
179+
end
180+
181+
instance Scheme.quasi_compact_of_affine (X : Scheme) [is_affine X] : compact_space X.carrier :=
182+
⟨(top_is_affine_open X).is_compact⟩
183+
184+
lemma is_affine_open.from_Spec_base_preimage
185+
{X : Scheme} {U : opens X.carrier} (hU : is_affine_open U) :
186+
(opens.map hU.from_Spec.val.base).obj U = ⊤ :=
187+
begin
188+
ext1,
189+
change hU.from_Spec.1.base ⁻¹' (U : set X.carrier) = set.univ,
190+
rw [← hU.from_Spec_range, ← set.image_univ],
191+
exact set.preimage_image_eq _ PresheafedSpace.is_open_immersion.base_open.inj
192+
end
193+
194+
lemma Scheme.Spec_map_presheaf_map_eq_to_hom {X : Scheme} {U V : opens X.carrier} (h : U = V) (W) :
195+
(Scheme.Spec.map (X.presheaf.map (eq_to_hom h).op).op).val.c.app W =
196+
eq_to_hom (by { cases h, dsimp, induction W using opposite.rec, congr, ext1, simpa }) :=
197+
begin
198+
have : Scheme.Spec.map (X.presheaf.map (𝟙 (op U))).op = 𝟙 _,
199+
{ rw [X.presheaf.map_id, op_id, Scheme.Spec.map_id] },
200+
cases h,
201+
refine (Scheme.congr_app this _).trans _,
202+
erw category.id_comp,
203+
simpa
204+
end
205+
206+
lemma is_affine_open.Spec_Γ_identity_hom_app_from_Spec {X : Scheme} {U : opens X.carrier}
207+
(hU : is_affine_open U) :
208+
(Spec_Γ_identity.hom.app (X.presheaf.obj $ op U)) ≫ hU.from_Spec.1.c.app (op U) =
209+
(Scheme.Spec.obj _).presheaf.map (eq_to_hom hU.from_Spec_base_preimage).op :=
210+
begin
211+
haveI : is_affine _ := hU,
212+
have e₁ :=
213+
Spec_Γ_identity.hom.naturality (X.presheaf.map (eq_to_hom U.open_embedding_obj_top).op),
214+
rw ← is_iso.comp_inv_eq at e₁,
215+
have e₂ := Γ_Spec.adjunction_unit_app_app_top (X.restrict U.open_embedding),
216+
erw ← e₂ at e₁,
217+
simp only [functor.id_map, quiver.hom.unop_op, functor.comp_map, ← functor.map_inv, ← op_inv,
218+
LocallyRingedSpace.Γ_map, category.assoc, functor.right_op_map, inv_eq_to_hom] at e₁,
219+
delta is_affine_open.from_Spec Scheme.iso_Spec,
220+
rw [Scheme.comp_val_c_app, Scheme.comp_val_c_app, ← e₁],
221+
simp_rw category.assoc,
222+
erw ← X.presheaf.map_comp_assoc,
223+
rw ← op_comp,
224+
have e₃ : U.open_embedding.is_open_map.adjunction.counit.app U ≫
225+
eq_to_hom U.open_embedding_obj_top.symm =
226+
U.open_embedding.is_open_map.functor.map (eq_to_hom U.inclusion_map_eq_top) :=
227+
subsingleton.elim _ _,
228+
have e₄ : X.presheaf.map _ ≫ _ = _ :=
229+
(as_iso (Γ_Spec.adjunction.unit.app (X.restrict U.open_embedding)))
230+
.inv.1.c.naturality_assoc (eq_to_hom U.inclusion_map_eq_top).op _,
231+
erw [e₃, e₄, ← Scheme.comp_val_c_app_assoc, iso.inv_hom_id],
232+
simp only [eq_to_hom_map, eq_to_hom_op, Scheme.Spec_map_presheaf_map_eq_to_hom],
233+
erw [Scheme.Spec_map_presheaf_map_eq_to_hom, category.id_comp],
234+
simpa only [eq_to_hom_trans]
235+
end
236+
237+
@[elementwise]
238+
lemma is_affine_open.from_Spec_app_eq {X : Scheme} {U : opens X.carrier}
239+
(hU : is_affine_open U) :
240+
hU.from_Spec.1.c.app (op U) = Spec_Γ_identity.inv.app (X.presheaf.obj $ op U) ≫
241+
(Scheme.Spec.obj _).presheaf.map (eq_to_hom hU.from_Spec_base_preimage).op :=
242+
by rw [← hU.Spec_Γ_identity_hom_app_from_Spec, iso.inv_hom_id_app_assoc]
243+
244+
lemma is_affine_open.basic_open_is_affine {X : Scheme} {U : opens X.carrier}
245+
(hU : is_affine_open U) (f : X.presheaf.obj (op U)) : is_affine_open (X.basic_open f) :=
246+
begin
247+
convert range_is_affine_open_of_open_immersion (Scheme.Spec.map (CommRing.of_hom
248+
(algebra_map (X.presheaf.obj (op U)) (localization.away f))).op ≫ hU.from_Spec),
249+
ext1,
250+
have : hU.from_Spec.val.base '' (hU.from_Spec.val.base ⁻¹' (X.basic_open f : set X.carrier)) =
251+
(X.basic_open f : set X.carrier),
252+
{ rw [set.image_preimage_eq_inter_range, set.inter_eq_left_iff_subset, hU.from_Spec_range],
253+
exact Scheme.basic_open_subset _ _ },
254+
rw [subtype.coe_mk, Scheme.comp_val_base, ← this, coe_comp, set.range_comp],
255+
congr' 1,
256+
refine (congr_arg coe $ Scheme.preimage_basic_open hU.from_Spec f).trans _,
257+
refine eq.trans _ (prime_spectrum.localization_away_comap_range (localization.away f) f).symm,
258+
congr' 1,
259+
have : (opens.map hU.from_Spec.val.base).obj U = ⊤,
260+
{ ext1,
261+
change hU.from_Spec.1.base ⁻¹' (U : set X.carrier) = set.univ,
262+
rw [← hU.from_Spec_range, ← set.image_univ],
263+
exact set.preimage_image_eq _ PresheafedSpace.is_open_immersion.base_open.inj },
264+
refine eq.trans _ (basic_open_eq_of_affine f),
265+
have lm : ∀ s, (opens.map hU.from_Spec.val.base).obj U ⊓ s = s := λ s, this.symm ▸ top_inf_eq,
266+
refine eq.trans _ (lm _),
267+
refine eq.trans _
268+
((Scheme.Spec.obj $ op $ X.presheaf.obj $ op U).basic_open_res _ (eq_to_hom this).op),
269+
rw ← comp_apply,
270+
congr' 2,
271+
rw iso.eq_inv_comp,
272+
erw hU.Spec_Γ_identity_hom_app_from_Spec,
273+
end
274+
275+
lemma Scheme.map_prime_spectrum_basic_open_of_affine (X : Scheme) [is_affine X]
276+
(f : Scheme.Γ.obj (op X)) :
277+
(opens.map X.iso_Spec.hom.1.base).obj (prime_spectrum.basic_open f) = X.basic_open f :=
278+
begin
279+
rw ← basic_open_eq_of_affine,
280+
transitivity (opens.map X.iso_Spec.hom.1.base).obj ((Scheme.Spec.obj
281+
(op (Scheme.Γ.obj (op X)))).basic_open ((inv (X.iso_Spec.hom.1.c.app
282+
(op ((opens.map (inv X.iso_Spec.hom).val.base).obj ⊤)))) ((X.presheaf.map (eq_to_hom _)) f))),
283+
congr,
284+
{ rw [← is_iso.inv_eq_inv, is_iso.inv_inv, is_iso.iso.inv_inv, nat_iso.app_hom],
285+
erw ← Γ_Spec.adjunction_unit_app_app_top,
286+
refl },
287+
{ rw eq_to_hom_map, refl },
288+
{ dsimp, congr },
289+
{ refine (Scheme.preimage_basic_open _ _).trans _,
290+
rw [is_iso.inv_hom_id_apply, Scheme.basic_open_res_eq] }
291+
end
292+
293+
lemma is_basis_basic_open (X : Scheme) [is_affine X] :
294+
opens.is_basis (set.range (X.basic_open : X.presheaf.obj (op ⊤) → opens X.carrier)) :=
295+
begin
296+
delta opens.is_basis,
297+
convert prime_spectrum.is_basis_basic_opens.inducing
298+
(Top.homeo_of_iso (Scheme.forget_to_Top.map_iso X.iso_Spec)).inducing using 1,
299+
ext,
300+
simp only [set.mem_image, exists_exists_eq_and],
301+
split,
302+
{ rintro ⟨_, ⟨x, rfl⟩, rfl⟩,
303+
refine ⟨_, ⟨_, ⟨x, rfl⟩, rfl⟩, _⟩,
304+
exact congr_arg subtype.val (X.map_prime_spectrum_basic_open_of_affine x) },
305+
{ rintro ⟨_, ⟨_, ⟨x, rfl⟩, rfl⟩, rfl⟩,
306+
refine ⟨_, ⟨x, rfl⟩, _⟩,
307+
exact congr_arg subtype.val (X.map_prime_spectrum_basic_open_of_affine x).symm }
308+
end
309+
139310
end algebraic_geometry

src/algebraic_geometry/Scheme.lean

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,21 @@ def forget_to_LocallyRingedSpace : Scheme ⥤ LocallyRingedSpace :=
6161
def forget_to_Top : Scheme ⥤ Top :=
6262
Scheme.forget_to_LocallyRingedSpace ⋙ LocallyRingedSpace.forget_to_Top
6363

64+
instance {X Y : Scheme} : has_lift_t (X ⟶ Y)
65+
(X.to_SheafedSpace ⟶ Y.to_SheafedSpace) := (@@coe_to_lift $ @@coe_base coe_subtype)
66+
67+
@[reassoc]
68+
lemma comp_val {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) :
69+
(f ≫ g).val = f.val ≫ g.val := rfl
70+
71+
@[reassoc, simp]
72+
lemma comp_coe_base {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) :
73+
(↑(f ≫ g) : X.to_SheafedSpace ⟶ Z.to_SheafedSpace).base = f.val.base ≫ g.val.base := rfl
74+
75+
@[reassoc]
76+
lemma comp_val_base {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) :
77+
(f ≫ g).val.base = f.val.base ≫ g.val.base := rfl
78+
6479
@[reassoc, simp]
6580
lemma comp_val_c_app {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) (U) :
6681
(f ≫ g).val.c.app U = g.val.c.app U ≫ f.val.c.app _ := rfl
@@ -153,15 +168,18 @@ lemma mem_basic_open_top (f : X.presheaf.obj (op ⊤)) (x : X.carrier) :
153168
RingedSpace.mem_basic_open _ f ⟨x, trivial⟩
154169

155170
@[simp]
156-
lemma basic_open_res (i : V ⟶ U) :
157-
X.basic_open (X.presheaf.map i.op f) = V ∩ X.basic_open f :=
158-
RingedSpace.basic_open_res _ i.op f
171+
lemma basic_open_res (i : op U ⟶ op V) :
172+
X.basic_open (X.presheaf.map i f) = V ∩ X.basic_open f :=
173+
RingedSpace.basic_open_res _ i f
159174

160175
-- This should fire before `basic_open_res`.
161176
@[simp, priority 1100]
162-
lemma basic_open_res_eq (i : V ⟶ U) [is_iso i] :
163-
X.basic_open (X.presheaf.map i.op f) = X.basic_open f :=
164-
RingedSpace.basic_open_res_eq _ i.op f
177+
lemma basic_open_res_eq (i : op U ⟶ op V) [is_iso i] :
178+
X.basic_open (X.presheaf.map i f) = X.basic_open f :=
179+
RingedSpace.basic_open_res_eq _ i f
180+
181+
lemma basic_open_subset : X.basic_open f ⊆ U :=
182+
RingedSpace.basic_open_subset _ _
165183

166184
lemma preimage_basic_open {X Y : Scheme} (f : X ⟶ Y) {U : opens Y.carrier}
167185
(r : Y.presheaf.obj $ op U) :
@@ -172,8 +190,7 @@ LocallyRingedSpace.preimage_basic_open f r
172190
@[simp]
173191
lemma preimage_basic_open' {X Y : Scheme} (f : X ⟶ Y) {U : opens Y.carrier}
174192
(r : Y.presheaf.obj $ op U) :
175-
(opens.map (PresheafedSpace.hom.base $ @coe _ _ (@@coe_to_lift $ @@coe_base coe_subtype) f)).obj
176-
(Y.basic_open r) =
193+
(opens.map (↑f : X.to_SheafedSpace ⟶ Y.to_SheafedSpace).base).obj (Y.basic_open r) =
177194
@Scheme.basic_open X ((opens.map f.1.base).obj U) (f.1.c.app _ r) :=
178195
LocallyRingedSpace.preimage_basic_open f r
179196

0 commit comments

Comments
 (0)