@@ -25,6 +25,7 @@ We also define predicates about affine schemes and affine open sets.
25
25
`AffineScheme.Γ : AffineSchemeᵒᵖ ⥤ CommRing`.
26
26
* `algebraic_geometry.is_affine_open`: An open subset of a scheme is affine if the open subscheme is
27
27
affine.
28
+ * `algebraic_geometry.is_affine_open.from_Spec`: The immersion `Spec 𝒪ₓ(U) ⟶ X` for an affine `U`.
28
29
29
30
-/
30
31
@@ -136,4 +137,174 @@ begin
136
137
exact range_is_affine_open_of_open_immersion _,
137
138
end
138
139
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
+
139
310
end algebraic_geometry
0 commit comments