@@ -11,6 +11,7 @@ public import Mathlib.AlgebraicGeometry.Morphisms.Separated
1111public import Mathlib.AlgebraicGeometry.Morphisms.FinitePresentation
1212public import Mathlib.AlgebraicGeometry.QuasiAffine
1313public import Mathlib.CategoryTheory.Limits.Shapes.Pullback.Connected
14+ public import Mathlib.CategoryTheory.Limits.Types.ColimitTypeFiltered
1415public import Mathlib.CategoryTheory.Monad.Limits
1516
1617/-!
@@ -24,7 +25,7 @@ following EGA IV 8 and https://stacks.math.columbia.edu/tag/01YT.
2425
2526@[expose] public section
2627
27- universe uI u
28+ universe w uI u
2829
2930open CategoryTheory Limits
3031
@@ -1070,6 +1071,30 @@ lemma exists_isAffineOpen_preimage_eq
10701071 obtain ⟨j, hj⟩ := Scheme.exists_isAffine_of_isLimit _ _ (isLimitOpensCone D c hc i U)
10711072 exact ⟨_, _, hj, by simp [← Scheme.Hom.comp_preimage]⟩
10721073
1074+ set_option backward.isDefEq.respectTransparency false in
1075+ open TopologicalSpace in
1076+ include hc in
1077+ lemma Scheme.exists_isOpenCover_and_isAffine_of_finite [IsCofiltered I]
1078+ [∀ {i j} (f : i ⟶ j), IsAffineHom (D.map f)] [∀ (i : I), CompactSpace (D.obj i)]
1079+ [∀ (i : I), QuasiSeparatedSpace (D.obj i)]
1080+ {J : Type *} [Finite J] (U : J → c.pt.Opens) (hU : IsOpenCover U)
1081+ (hU' : ∀ i, IsAffineOpen (U i)) :
1082+ ∃ (i : I) (V : J → (D.obj i).Opens),
1083+ IsOpenCover V ∧ ∀ j, IsAffineOpen (V j) ∧ U j = c.π.app i ⁻¹ᵁ (V j) := by
1084+ classical
1085+ choose j V hV hVU using fun k ↦ exists_isAffineOpen_preimage_eq D c hc (U k) (hU' k)
1086+ cases nonempty_fintype J
1087+ obtain ⟨i, fi⟩ := IsCofiltered.inf_objs_exists (Finset.univ.image j)
1088+ replace fi : ∀ k, i ⟶ j k := fun k ↦ (fi (by simp)).some
1089+ obtain ⟨k, fkj, e⟩ := exists_map_eq_top D c hc (⨆ (k), D.map (fi k) ⁻¹ᵁ V k) (by
1090+ simp_rw [Hom.preimage_iSup, ← Hom.comp_preimage, c.w, hVU]
1091+ exact hU)
1092+ refine ⟨k, fun x ↦ D.map (fkj ≫ fi x) ⁻¹ᵁ V _, ?_, fun k ↦ ⟨(hV k).preimage _, ?_⟩⟩
1093+ · refine top_le_iff.mp (e.symm.trans_le ?_)
1094+ simp_rw [Hom.preimage_iSup, ← Hom.comp_preimage, ← D.map_comp]
1095+ simp
1096+ · rw [← hVU, ← Hom.comp_preimage, c.w]
1097+
10731098set_option backward.isDefEq.respectTransparency false in
10741099open TopologicalSpace in
10751100include hc in
@@ -1084,19 +1109,48 @@ lemma Scheme.exists_isOpenCover_and_isAffine [IsCofiltered I]
10841109 IsOpenCover V ∧ ∀ j, IsAffineOpen (V j) ∧ U j = c.π.app i ⁻¹ᵁ (V j) := by
10851110 classical
10861111 have := compactSpace_of_isLimit D c hc
1087- choose j V hV hVU using fun k ↦ exists_isAffineOpen_preimage_eq D c hc (U k) (hU' k)
10881112 obtain ⟨s, hs⟩ := isCompact_univ.elim_finite_subcover _
10891113 (fun i ↦ (U i).isOpen) hU.iSup_set_eq_univ.ge
1090- obtain ⟨i, fi⟩ := IsCofiltered.inf_objs_exists (s.image j)
1091- replace fi : ∀ k ∈ s, i ⟶ j k := fun k hk ↦ (fi (Finset.mem_image_of_mem _ hk)).some
1092- obtain ⟨k, fkj, e⟩ := exists_map_eq_top D c hc (⨆ (k) (hk : k ∈ s), D.map (fi k hk) ⁻¹ᵁ V k) (by
1093- simp_rw [Hom.preimage_iSup, ← Hom.comp_preimage, c.w, hVU]
1094- exact top_le_iff.mp fun x _ ↦ by simpa using hs (Set.mem_univ x))
1095- refine ⟨k, s, fun x ↦ D.map (fkj ≫ fi x.1 x.2 ) ⁻¹ᵁ V _, ?_, fun k ↦ ⟨(hV k).preimage _, ?_⟩⟩
1096- · refine top_le_iff.mp (e.symm.trans_le ?_)
1097- simp_rw [Hom.preimage_iSup, ← Hom.comp_preimage, iSup_subtype, ← D.map_comp]
1098- simp
1099- · rw [← hVU, ← Hom.comp_preimage, c.w]
1114+ have hU : IsOpenCover fun j : s ↦ U ↑j := by
1115+ simpa only [IsOpenCover, eq_top_iff, ← SetLike.coe_subset_coe, Opens.coe_top, Opens.iSup_mk,
1116+ Opens.carrier_eq_coe, Opens.coe_mk, Set.iUnion_subtype]
1117+ obtain ⟨i, V, hV, heq⟩ := Scheme.exists_isOpenCover_and_isAffine_of_finite _ _ hc _ hU (hU' ·)
1118+ use i, s, V, hV
1119+
1120+ set_option backward.defeqAttrib.useBackward true in
1121+ set_option backward.isDefEq.respectTransparency false in
1122+ include hc in
1123+ /-- Variant of `Scheme.exists_isOpenCover_and_isAffine_of_finite` in terms of `Scheme.OpenCover`. -/
1124+ lemma Scheme.OpenCover.exists_of_isCofiltered_of_finite [IsCofiltered I]
1125+ [∀ {i j} (f : i ⟶ j), IsAffineHom (D.map f)] [∀ (i : I), CompactSpace (D.obj i)]
1126+ [∀ (i : I), QuasiSeparatedSpace (D.obj i)]
1127+ (𝒰 : OpenCover.{w} c.pt) [∀ i, IsAffine (𝒰.X i)] [Finite 𝒰.I₀] :
1128+ ∃ (i : I) (R : 𝒰.I₀ → CommRingCat.{u}) (f : ∀ (a : 𝒰.I₀), Spec (R a) ⟶ (D.obj i))
1129+ (_ : Presieve.ofArrows _ f ∈ zariskiPrecoverage _) (g : ∀ (j : 𝒰.I₀), 𝒰.X j ⟶ Spec (R j)),
1130+ ∀ (j : 𝒰.I₀), IsPullback (g j) (𝒰.f j) (f j) (c.π.app i) := by
1131+ obtain ⟨i, V, hV, hV'⟩ := Scheme.exists_isOpenCover_and_isAffine_of_finite _ _ hc _
1132+ 𝒰.isOpenCover_opensRange fun k ↦ isAffineOpen_opensRange (𝒰.f k)
1133+ have hV'' (k) := dsimp% congr($((hV' k).right).carrier)
1134+ refine ⟨i, fun k ↦ Γ(_, V k), fun k ↦ (hV' k).left.isoSpec.inv ≫ (V k).ι, ?_, ?_, ?_⟩
1135+ · simp only [IsAffineOpen.isoSpec_inv_ι, ofArrows_mem_precoverage_iff,
1136+ IsAffineOpen.range_fromSpec, SetLike.mem_coe]
1137+ exact ⟨fun x ↦ hV.exists_mem x, inferInstance⟩
1138+ · intro k
1139+ exact IsOpenImmersion.lift (V k).ι (𝒰.f _ ≫ c.π.app i) (by simp [hV'', Set.range_comp]) ≫
1140+ (hV' k).left.isoSpec.hom
1141+ · intro k
1142+ dsimp
1143+ refine ⟨⟨?_⟩, ⟨PullbackCone.IsLimit.mk _ ?_ ?_ ?_ ?_⟩⟩
1144+ · simp [← IsAffineOpen.isoSpec_inv_ι]
1145+ · intro s
1146+ refine IsOpenImmersion.lift (𝒰.f k) s.snd ?_
1147+ simp only [hV'', Set.range_subset_iff, Set.mem_preimage, SetLike.mem_coe]
1148+ intro y
1149+ rw [← Scheme.Hom.comp_apply, ← s.condition]
1150+ simp [← IsAffineOpen.isoSpec_inv_ι]
1151+ · simp [← cancel_mono (hV' _).left.isoSpec.inv, ← cancel_mono (V k).ι, PullbackCone.condition]
1152+ · simp
1153+ · simp [← cancel_mono (𝒰.f k)]
11001154
11011155end IsAffine
11021156
@@ -1283,6 +1337,36 @@ lemma Scheme.exists_π_app_comp_eq_of_locallyOfFinitePresentation
12831337 · refine 𝒲.hom_ext _ _ fun j ↦ ?_
12841338 simp [F, Cover.ι_glueMorphisms_assoc, hak]; rfl
12851339
1340+ set_option backward.defeqAttrib.useBackward true in
1341+ set_option backward.isDefEq.respectTransparency false in
1342+ /-- `Hom_S(-, X)` sends a cofiltered limit of qcqs `S`-schemes with affine transition maps
1343+ to a filtered colimit if `X` is locally of finite presentation over `X`. -/
1344+ instance Scheme.preservesColimit_yoneda (D : I ⥤ Over S) [IsCofiltered I]
1345+ [∀ {i j} (f : i ⟶ j), IsAffineHom (D.map f).left]
1346+ [∀ (i : I), CompactSpace (D.obj i).left] [∀ (i : I), QuasiSeparatedSpace (D.obj i).left]
1347+ (X : Over S) [LocallyOfFinitePresentation X.hom] :
1348+ PreservesColimit D.op (yoneda.obj X) where
1349+ preserves {c hc} := by
1350+ rw [Limits.Types.isColimit_iff_coconeTypesIsColimit]
1351+ have (i : I) : CompactSpace ((D ⋙ Over.forget S).obj i) := by dsimp; infer_instance
1352+ have (i : I) : QuasiSeparatedSpace ((D ⋙ Over.forget S).obj i) := by dsimp; infer_instance
1353+ have {i j : I} (f : i ⟶ j) : IsAffineHom ((D ⋙ Over.forget S).map f) := by
1354+ dsimp; infer_instance
1355+ refine ⟨⟨?_, ?_⟩⟩
1356+ · rw [Functor.CoconeTypes.descColimitType_injective_iff_of_isFiltered']
1357+ intro k g₁ g₂ hg
1358+ obtain ⟨k, hik, heq⟩ := Scheme.exists_hom_comp_eq_comp_of_locallyOfFiniteType
1359+ (D ⋙ Over.forget _) (.mk (fun _ ↦ (D.obj _).hom)) X.hom _ (isLimitOfPreserves _ hc.unop)
1360+ g₁.left g₂.left (Over.w g₁).symm (Over.w g₂).symm congr($(hg).left)
1361+ use .op k, hik.op
1362+ cat_disch
1363+ · intro g
1364+ obtain ⟨k, u, h, h'⟩ := Scheme.exists_π_app_comp_eq_of_locallyOfFinitePresentation
1365+ (D ⋙ Over.forget _) (.mk (fun _ ↦ (D.obj _).hom)) X.hom _ (isLimitOfPreserves _ hc.unop)
1366+ g.left (by ext; simp)
1367+ use Functor.ιColimitType _ (.op k) (Over.homMk u)
1368+ cat_disch
1369+
12861370end LocallyOfFinitePresentation
12871371
12881372end AlgebraicGeometry
0 commit comments