Skip to content

Commit 0872931

Browse files
chrisflavReemMelamed
authored andcommitted
chore(AlgebraicGeometry/AffineTransitionLimit): deduce that Hom(-, X) preserves certain cofiltered limits (leanprover-community#40546)
We deduce this from the unbundled statement. Usually the unbundled formulation is more useful, but sometimes we need the categorical spelling to apply general API. We also add some API for descending a finite affine open cover. From Proetale.
1 parent 09dceaf commit 0872931

1 file changed

Lines changed: 96 additions & 12 deletions

File tree

Mathlib/AlgebraicGeometry/AffineTransitionLimit.lean

Lines changed: 96 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public import Mathlib.AlgebraicGeometry.Morphisms.Separated
1111
public import Mathlib.AlgebraicGeometry.Morphisms.FinitePresentation
1212
public import Mathlib.AlgebraicGeometry.QuasiAffine
1313
public import Mathlib.CategoryTheory.Limits.Shapes.Pullback.Connected
14+
public import Mathlib.CategoryTheory.Limits.Types.ColimitTypeFiltered
1415
public 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

2930
open 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+
10731098
set_option backward.isDefEq.respectTransparency false in
10741099
open TopologicalSpace in
10751100
include 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

11011155
end 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+
12861370
end LocallyOfFinitePresentation
12871371

12881372
end AlgebraicGeometry

0 commit comments

Comments
 (0)