@@ -27,10 +27,12 @@ We construct various limits and colimits in the category of schemes.
27
27
suppress_compilation
28
28
29
29
30
- universe u
30
+ universe u v
31
31
32
32
open CategoryTheory CategoryTheory.Limits Opposite TopologicalSpace
33
33
34
+ attribute [local instance] Opposite.small
35
+
34
36
namespace AlgebraicGeometry
35
37
36
38
/-- `Spec ℤ` is the terminal object in the category of schemes. -/
@@ -137,7 +139,6 @@ section Coproduct
137
139
138
140
variable {ι : Type u} (f : ι → Scheme.{u})
139
141
140
-
141
142
/-- (Implementation Detail) The glue data associated to a disjoint union. -/
142
143
@[simps]
143
144
noncomputable
@@ -203,31 +204,28 @@ instance : CreatesColimit (Discrete.functor f) Scheme.forgetToLocallyRingedSpace
203
204
have := (IsColimit.precomposeHomEquiv F _).symm (toLocallyRingedSpaceCoproductCofanIsColimit f)
204
205
(colimit.isoColimitCocone ⟨_, this⟩).symm
205
206
206
- noncomputable
207
- instance : CreatesColimitsOfShape (Discrete ι) Scheme.forgetToLocallyRingedSpace := by
208
- constructor
209
- intro K
210
- exact createsColimitOfIsoDiagram _ (Discrete.natIsoFunctor (F := K)).symm
207
+ variable {σ : Type v} (g : σ → Scheme.{u})
211
208
212
- instance : PreservesColimitsOfShape (Discrete ι) Scheme.forgetToTop.{u} :=
213
- inferInstanceAs (PreservesColimitsOfShape (Discrete ι) (Scheme.forgetToLocallyRingedSpace ⋙
209
+ noncomputable
210
+ instance [Small.{u} σ] :
211
+ CreatesColimitsOfShape (Discrete σ) Scheme.forgetToLocallyRingedSpace.{u} := by
212
+ choose σ' eq using Small.equiv_small.{u} (α := σ)
213
+ let e : Discrete σ ≌ Discrete σ' := Discrete.equivalence eq.some
214
+ let _ : CreatesColimitsOfShape (Discrete σ') Scheme.forgetToLocallyRingedSpace := by
215
+ constructor
216
+ intro K
217
+ exact createsColimitOfIsoDiagram _ (Discrete.natIsoFunctor (F := K)).symm
218
+ apply CategoryTheory.createsColimitsOfShapeOfEquiv e.symm
219
+
220
+ instance [Small.{u} σ] : PreservesColimitsOfShape (Discrete σ) Scheme.forgetToTop.{u} :=
221
+ inferInstanceAs (PreservesColimitsOfShape (Discrete σ) (Scheme.forgetToLocallyRingedSpace ⋙
214
222
LocallyRingedSpace.forgetToSheafedSpace ⋙ SheafedSpace.forget CommRingCat))
215
223
216
- instance : HasCoproducts.{u} Scheme.{u} :=
217
- fun _ ↦ ⟨fun _ ↦ hasColimit_of_created _ Scheme.forgetToLocallyRingedSpace⟩
218
-
219
- instance : HasCoproducts.{0 } Scheme.{u} := has_smallest_coproducts_of_hasCoproducts
224
+ instance [Small.{u} σ] : HasColimitsOfShape (Discrete σ) Scheme.{u} :=
225
+ ⟨fun _ ↦ hasColimit_of_created _ Scheme.forgetToLocallyRingedSpace⟩
220
226
221
- noncomputable
222
- instance {ι : Type} : PreservesColimitsOfShape (Discrete ι) Scheme.forgetToTop.{u} :=
223
- preservesColimitsOfShape_of_equiv
224
- (Discrete.equivalence Equiv.ulift : Discrete (ULift.{u} ι) ≌ _) _
225
-
226
- noncomputable
227
- instance {ι : Type} :
228
- PreservesColimitsOfShape (Discrete ι) Scheme.forgetToLocallyRingedSpace.{u} :=
229
- preservesColimitsOfShape_of_equiv
230
- (Discrete.equivalence Equiv.ulift : Discrete (ULift.{u} ι) ≌ _) _
227
+ instance [UnivLE.{v, u}] : HasCoproducts.{v} Scheme.{u} :=
228
+ fun _ ↦ ⟨fun _ ↦ hasColimit_of_created _ Scheme.forgetToLocallyRingedSpace⟩
231
229
232
230
/-- (Implementation Detail) Coproduct of schemes is isomorphic to the disjoint union. -/
233
231
noncomputable
@@ -256,6 +254,12 @@ instance (i) : IsOpenImmersion (Sigma.ι f i) := by
256
254
rw [← ι_sigmaIsoGlued_inv]
257
255
infer_instance
258
256
257
+ instance [Small.{u} σ] (i) : IsOpenImmersion (Sigma.ι g i) := by
258
+ obtain ⟨ι, ⟨e⟩⟩ := Small.equiv_small (α := σ)
259
+ obtain ⟨i, rfl⟩ := e.symm.surjective i
260
+ rw [← Sigma.ι_reindex_hom e.symm g i]
261
+ infer_instance
262
+
259
263
lemma sigmaι_eq_iff (i j : ι) (x y) :
260
264
(Sigma.ι f i).base x = (Sigma.ι f j).base y ↔
261
265
(Sigma.mk i x : Σ i, f i) = Sigma.mk j y := by
@@ -283,23 +287,28 @@ lemma disjoint_opensRange_sigmaι (i j : ι) (h : i ≠ j) :
283
287
obtain ⟨rfl⟩ := (sigmaι_eq_iff _ _ _ _ _).mp hy
284
288
cases h rfl
285
289
286
- lemma exists_sigmaι_eq (x : (∐ f :)) : ∃ i y, (Sigma.ι f i).base y = x := by
287
- obtain ⟨i, y, e⟩ := (disjointGlueData f).ι_jointly_surjective ((sigmaIsoGlued f).hom.base x)
288
- refine ⟨i, y, (sigmaIsoGlued f).hom.isOpenEmbedding.injective ?_⟩
289
- rwa [← Scheme.comp_base_apply, ι_sigmaIsoGlued_hom]
290
+ lemma exists_sigmaι_eq [Small.{u} σ] (x : (∐ g :)) : ∃ i y, (Sigma.ι g i).base y = x := by
291
+ obtain ⟨ι, ⟨e⟩⟩ := Small.equiv_small (α := σ)
292
+ let x' : (∐ g ∘ e.symm :) := (Sigma.reindex e.symm g).inv.base x
293
+ obtain ⟨i, y, h⟩ := (disjointGlueData <| g ∘ e.symm).ι_jointly_surjective
294
+ ((sigmaIsoGlued <| g ∘ e.symm).hom.base <| x')
295
+ refine ⟨e.symm i, y, (Sigma.reindex e.symm g).inv.isOpenEmbedding.injective ?_⟩
296
+ apply (sigmaIsoGlued _).hom.isOpenEmbedding.injective
297
+ rwa [← Scheme.comp_base_apply, ← Scheme.comp_base_apply, ← Scheme.comp_base_apply,
298
+ Sigma.ι_reindex_inv_assoc, ι_sigmaIsoGlued_hom]
290
299
291
300
lemma iSup_opensRange_sigmaι : ⨆ i, (Sigma.ι f i).opensRange = ⊤ :=
292
301
eq_top_iff.mpr fun x ↦ by simpa using exists_sigmaι_eq f x
293
302
294
303
/-- The open cover of the coproduct. -/
295
304
@[simps obj map]
296
305
noncomputable
297
- def sigmaOpenCover : (∐ f ).OpenCover where
298
- J := ι
299
- obj := f
300
- map := Sigma.ι f
301
- f x := (exists_sigmaι_eq f x).choose
302
- covers x := (exists_sigmaι_eq f x).choose_spec
306
+ def sigmaOpenCover [Small.{u} σ] : (∐ g ).OpenCover where
307
+ J := σ
308
+ obj := g
309
+ map := Sigma.ι g
310
+ f x := (exists_sigmaι_eq g x).choose
311
+ covers x := (exists_sigmaι_eq g x).choose_spec
303
312
304
313
/-- The underlying topological space of the coproduct is homeomorphic to the disjoint union. -/
305
314
noncomputable
@@ -318,8 +327,8 @@ lemma sigmaMk_mk (i) (x : f i) :
318
327
exact ι_comp_sigmaComparison Scheme.forgetToTop _ _
319
328
320
329
open scoped Function in
321
- lemma isOpenImmersion_sigmaDesc
322
- {X : Scheme} (α : ∀ i, f i ⟶ X) [∀ i, IsOpenImmersion (α i)]
330
+ private lemma isOpenImmersion_sigmaDesc_aux
331
+ {X : Scheme.{u} } (α : ∀ i, f i ⟶ X) [∀ i, IsOpenImmersion (α i)]
323
332
(hα : Pairwise (Disjoint on (Set.range <| α · |>.base))) :
324
333
IsOpenImmersion (Sigma.desc α) := by
325
334
rw [IsOpenImmersion.iff_stalk_iso]
@@ -346,6 +355,38 @@ lemma isOpenImmersion_sigmaDesc
346
355
· simp [← Scheme.comp_base_apply]
347
356
· simp [← Scheme.stalkMap_comp, Scheme.stalkMap_congr_hom _ _ (Sigma.ι_desc _ _)]
348
357
358
+ open scoped Function in
359
+ lemma isOpenImmersion_sigmaDesc [Small.{u} σ]
360
+ {X : Scheme.{u}} (α : ∀ i, g i ⟶ X) [∀ i, IsOpenImmersion (α i)]
361
+ (hα : Pairwise (Disjoint on (Set.range <| α · |>.base))) :
362
+ IsOpenImmersion (Sigma.desc α) := by
363
+ obtain ⟨ι, ⟨e⟩⟩ := Small.equiv_small (α := σ)
364
+ convert IsOpenImmersion.comp ((Sigma.reindex e.symm g).inv) (Sigma.desc fun i ↦ α _)
365
+ · refine Sigma.hom_ext _ _ fun i ↦ ?_
366
+ obtain ⟨i, rfl⟩ := e.symm.surjective i
367
+ simp
368
+ · apply isOpenImmersion_sigmaDesc_aux
369
+ intro i j hij
370
+ exact hα (fun h ↦ hij (e.symm.injective h))
371
+
372
+ open scoped Function in
373
+ /-- `S` is the disjoint union of `Xᵢ` if the `Xᵢ` are covering, pairwise disjoint open subschemes
374
+ of `S`. -/
375
+ lemma nonempty_isColimit_cofanMk_of [Small.{u} σ]
376
+ {X : σ → Scheme.{u}} {S : Scheme.{u}} (f : ∀ i, X i ⟶ S) [∀ i, IsOpenImmersion (f i)]
377
+ (hcov : ⨆ i, (f i).opensRange = ⊤) (hdisj : Pairwise (Disjoint on (f · |>.opensRange))) :
378
+ Nonempty (IsColimit <| Cofan.mk S f) := by
379
+ have : IsOpenImmersion (Sigma.desc f) := by
380
+ refine isOpenImmersion_sigmaDesc _ _ (fun i j hij ↦ ?_)
381
+ simpa [Function.onFun_apply, disjoint_iff, Opens.ext_iff] using hdisj hij
382
+ simp only [← Cofan.isColimit_iff_isIso_sigmaDesc (Cofan.mk S f), cofan_mk_inj, Cofan.mk_pt]
383
+ apply isIso_of_isOpenImmersion_of_opensRange_eq_top
384
+ rw [eq_top_iff]
385
+ intro x hx
386
+ have : x ∈ ⨆ i, (f i).opensRange := by rwa [hcov]
387
+ obtain ⟨i, y, rfl⟩ := by simpa only [Opens.iSup_mk, Opens.mem_mk, Set.mem_iUnion] using this
388
+ use Sigma.ι X i |>.base y
389
+ simp [← Scheme.comp_base_apply]
349
390
350
391
variable (X Y : Scheme.{u})
351
392
@@ -371,7 +412,7 @@ lemma isCompl_range_inl_inr :
371
412
IsCompl (Set.range (coprod.inl : X ⟶ X ⨿ Y).base)
372
413
(Set.range (coprod.inr : Y ⟶ X ⨿ Y).base) :=
373
414
((TopCat.binaryCofan_isColimit_iff _).mp
374
- ⟨mapIsColimitOfPreservesOfIsColimit Scheme.forgetToTop _ _ (coprodIsCoprod X Y)⟩).2 .2
415
+ ⟨mapIsColimitOfPreservesOfIsColimit Scheme.forgetToTop.{u} _ _ (coprodIsCoprod X Y)⟩).2 .2
375
416
376
417
lemma isCompl_opensRange_inl_inr :
377
418
IsCompl (coprod.inl : X ⟶ X ⨿ Y).opensRange (coprod.inr : Y ⟶ X ⨿ Y).opensRange := by
@@ -421,6 +462,26 @@ def coprodOpenCover.{w} : (X ⨿ Y).OpenCover where
421
462
· simp only [Sum.elim_inr, coprodMk_inr, exists_apply_eq_apply]
422
463
map_prop x := x.rec (fun _ ↦ inferInstance) (fun _ ↦ inferInstance)
423
464
465
+ /-- If `X` and `Y` are open disjoint and covering open subschemes of `S`,
466
+ `S` is the disjoint union of `X` and `Y`. -/
467
+ lemma nonempty_isColimit_binaryCofanMk_of_isCompl {X Y S : Scheme.{u}}
468
+ (f : X ⟶ S) (g : Y ⟶ S) [IsOpenImmersion f] [IsOpenImmersion g]
469
+ (hf : IsCompl f.opensRange g.opensRange) :
470
+ Nonempty (IsColimit <| BinaryCofan.mk f g) := by
471
+ let c' : Cofan fun j ↦ (WalkingPair.casesOn j X Y : Scheme.{u}) :=
472
+ .mk S fun j ↦ WalkingPair.casesOn j f g
473
+ let i : BinaryCofan.mk f g ≅ c' := Cofan.ext (Iso.refl _) (by rintro (b|b) <;> rfl)
474
+ refine ⟨IsColimit.ofIsoColimit (Nonempty.some ?_) i.symm⟩
475
+ let fi (j : WalkingPair) : WalkingPair.casesOn j X Y ⟶ S := WalkingPair.casesOn j f g
476
+ convert nonempty_isColimit_cofanMk_of fi _ _
477
+ · intro i
478
+ cases i <;> (simp [fi]; infer_instance)
479
+ · simpa [← WalkingPair.equivBool.symm.iSup_comp, iSup_bool_eq, ← codisjoint_iff] using hf.2
480
+ · intro i j hij
481
+ match i, j with
482
+ | .left, .right => simpa [fi] using hf.1
483
+ | .right, .left => simpa [fi] using hf.1 .symm
484
+
424
485
variable (R S : Type u) [CommRing R] [CommRing S]
425
486
426
487
/-- The map `Spec R ⨿ Spec S ⟶ Spec (R × S)`.
@@ -484,7 +545,7 @@ instance : IsIso (coprodSpec R S) := by
484
545
· ext x; exact coprodSpec_apply R S x
485
546
· infer_instance
486
547
487
- instance (R S : CommRingCatᵒᵖ ) : IsIso (coprodComparison Scheme.Spec R S) := by
548
+ instance (R S : CommRingCat.{u}ᵒᵖ ) : IsIso (coprodComparison Scheme.Spec R S) := by
488
549
obtain ⟨R⟩ := R; obtain ⟨S⟩ := S
489
550
have : coprodComparison Scheme.Spec (.op R) (.op S) ≫ (Spec.map
490
551
((limit.isoLimitCone ⟨_, CommRingCat.prodFanIsLimit R S⟩).inv ≫
@@ -501,22 +562,22 @@ instance (R S : CommRingCatᵒᵖ) : IsIso (coprodComparison Scheme.Spec R S) :=
501
562
rw [(IsIso.eq_comp_inv _).mpr this]
502
563
infer_instance
503
564
504
- instance : PreservesColimitsOfShape (Discrete WalkingPair) Scheme.Spec :=
565
+ instance : PreservesColimitsOfShape (Discrete WalkingPair) Scheme.Spec.{u} :=
505
566
⟨fun {_} ↦
506
- have (X Y : CommRingCatᵒᵖ ) := PreservesColimitPair.of_iso_coprod_comparison Scheme.Spec X Y
567
+ have (X Y : CommRingCat.{u}ᵒᵖ ) := PreservesColimitPair.of_iso_coprod_comparison Scheme.Spec X Y
507
568
preservesColimit_of_iso_diagram _ (diagramIsoPair _).symm⟩
508
569
509
- instance : PreservesColimitsOfShape (Discrete PEmpty.{1 }) Scheme.Spec := by
570
+ instance : PreservesColimitsOfShape (Discrete PEmpty.{1 }) Scheme.Spec.{u} := by
510
571
have : IsEmpty (Scheme.Spec.obj (⊥_ CommRingCatᵒᵖ)) :=
511
572
@Function.isEmpty _ _ spec_punit_isEmpty (Scheme.Spec.mapIso
512
573
(initialIsoIsInitial (initialOpOfTerminal CommRingCat.punitIsTerminal))).hom.base
513
574
have := preservesInitial_of_iso Scheme.Spec (asIso (initial.to _))
514
575
exact preservesColimitsOfShape_pempty_of_preservesInitial _
515
576
516
- instance {J} [Finite J] : PreservesColimitsOfShape (Discrete J) Scheme.Spec :=
577
+ instance {J : Type* } [Finite J] : PreservesColimitsOfShape (Discrete J) Scheme.Spec.{u} :=
517
578
preservesFiniteCoproductsOfPreservesBinaryAndInitial _ _
518
579
519
- instance {J : Type*} [Finite J] : PreservesColimitsOfShape (Discrete J) Scheme.Spec :=
580
+ instance {J : Type*} [Finite J] : PreservesColimitsOfShape (Discrete J) Scheme.Spec.{u} :=
520
581
letI := (nonempty_fintype J).some
521
582
preservesColimitsOfShape_of_equiv (Discrete.equivalence (Fintype.equivFin _).symm) _
522
583
@@ -545,7 +606,7 @@ instance (i) (R : ι → Type _) [∀ i, CommRing (R i)] :
545
606
· exact Function.surjective_eval _
546
607
exact IsOpenImmersion.of_isLocalization (Function.update 0 i 1 )
547
608
548
- instance (R : ι → CommRingCat) : IsOpenImmersion (sigmaSpec R) := by
609
+ instance (R : ι → CommRingCat.{u} ) : IsOpenImmersion (sigmaSpec R) := by
549
610
classical
550
611
apply isOpenImmersion_sigmaDesc
551
612
intro ix iy h
@@ -556,7 +617,7 @@ instance (R : ι → CommRingCat) : IsOpenImmersion (sigmaSpec R) := by
556
617
(show DFinsupp.single (β := (R ·)) iy 1 ix ∈ x.asIdeal by simp [h.symm])
557
618
simp [← Ideal.eq_top_iff_one, y.2 .ne_top] at this
558
619
559
- instance [Finite ι] (R : ι → CommRingCat) : IsIso (sigmaSpec R) := by
620
+ instance [Finite ι] (R : ι → CommRingCat.{u} ) : IsIso (sigmaSpec R) := by
560
621
have : sigmaSpec R =
561
622
(colimit.isoColimitCocone ⟨_,
562
623
(IsColimit.precomposeHomEquiv Discrete.natIsoFunctor.symm _).symm (isColimitOfPreserves
0 commit comments