@@ -1053,4 +1053,185 @@ lemma Scheme.exists_isOpenCover_and_isAffine [IsCofiltered I]
10531053
10541054end IsAffine
10551055
1056+ section LocallyOfFinitePresentation
1057+
1058+ include hc in
1059+ /-- See `Scheme.exists_π_app_comp_eq_of_locallyOfFinitePresentation` for the general case. -/
1060+ private nonrec lemma Scheme.exists_π_app_comp_eq_of_locallyOfFinitePresentation_of_isAffine
1061+ [IsCofiltered I] [LocallyOfFinitePresentation f]
1062+ [IsAffine S] [IsAffine X] [∀ i, IsAffine (D.obj i)]
1063+ (a : c.pt ⟶ X) (ha : c.π ≫ t = (Functor.const _).map (a ≫ f)) :
1064+ ∃ (i : I) (g : D.obj i ⟶ X), c.π.app i ≫ g = a ∧ g ≫ f = t.app i := by
1065+ -- Every scheme involved is affine, so the proof is merely translate to commutative algebra and
1066+ -- use `RingHom.EssFiniteType.exists_eq_comp_ι_app_of_isColimit`.
1067+ -- Unfortunately the translation takes 45 lines.
1068+ wlog hS : ∃ R, S = Spec R generalizing S
1069+ · obtain ⟨i, g, hg, hg'⟩ := this (t ≫ ((Functor.const I).mapIso S.isoSpec).hom)
1070+ (f ≫ S.isoSpec.hom) (by simp [reassoc_of% ha]) ⟨_, rfl⟩
1071+ exact ⟨i, g, hg, by simpa using congr($hg' ≫ S.isoSpec.inv)⟩
1072+ obtain ⟨R, rfl⟩ := hS
1073+ wlog hX : ∃ S, X = Spec S generalizing X
1074+ · obtain ⟨i, f, hf⟩ := this (a ≫ X.isoSpec.hom) (X.isoSpec.inv ≫ f)
1075+ (by simp [ha, - Functor.map_comp]) ⟨_, rfl⟩
1076+ exact ⟨i, f ≫ X.isoSpec.inv, by simpa [← Iso.comp_inv_eq] using hf⟩
1077+ obtain ⟨S, rfl⟩ := hX
1078+ obtain ⟨φ, rfl⟩ := Spec.map_surjective f
1079+ wlog hD : ∃ D' : I ⥤ CommRingCatᵒᵖ, D = D' ⋙ Scheme.Spec generalizing D
1080+ · let e : D ⟶ D ⋙ Scheme.Γ.rightOp ⋙ Scheme.Spec := D.whiskerLeft ΓSpec.adjunction.unit
1081+ have inst (i) : IsIso (e.app i) := by dsimp [e]; infer_instance
1082+ have inst : IsIso e := NatIso.isIso_of_isIso_app e
1083+ have inst (i) : IsAffine ((D ⋙ Scheme.Γ.rightOp ⋙ Scheme.Spec).obj i) := by
1084+ dsimp; infer_instance
1085+ obtain ⟨i, g, hg, hg'⟩ := this _ _ ((IsLimit.postcomposeHomEquiv (asIso e) c).symm hc)
1086+ (inv e ≫ t) a (by simpa using ha) ⟨D ⋙ Scheme.Γ.rightOp, rfl⟩
1087+ exact ⟨i, e.app i ≫ g, by rwa [← Category.assoc], by simp [hg']⟩
1088+ obtain ⟨D, rfl⟩ := hD
1089+ let e : ((Functor.const Iᵒᵖ).obj R).rightOp ⋙ Scheme.Spec ≅ (Functor.const I).obj (Spec R) :=
1090+ NatIso.ofComponents (fun _ ↦ Iso.refl _) (by simp)
1091+ obtain ⟨t, rfl⟩ : ∃ t' : (Functor.const Iᵒᵖ).obj R ⟶ D.leftOp,
1092+ t = Functor.whiskerRight (NatTrans.rightOp t') Scheme.Spec ≫ e.hom :=
1093+ ⟨⟨fun i ↦ Spec.preimage (t.app i.unop), fun _ _ f ↦ Spec.map_injective
1094+ (by simpa using (t.naturality f.unop).symm)⟩, by ext : 2 ; simp [e]⟩
1095+ wlog hc' : ∃ c' : Cocone D.leftOp, c = Scheme.Spec.mapCone (coneOfCoconeLeftOp c') generalizing c
1096+ · have inst : IsAffine c.pt := isAffine_of_isLimit _ hc
1097+ let e' : (D ⋙ Scheme.Spec).op ⋙ Γ ≅ D.leftOp := D.leftOp.isoWhiskerLeft SpecΓIdentity
1098+ let c' := coneOfCoconeLeftOp ((Cocones.precompose e'.inv).obj (Γ.mapCocone c.op))
1099+ have inst : ∀ i, IsAffine ((D ⋙ Scheme.Spec).op.obj i).unop := by dsimp; infer_instance
1100+ obtain ⟨i, f, hf⟩ := this (Scheme.Spec.mapCone c') (isLimitOfPreserves _
1101+ (isLimitConeOfCoconeLeftOp _ ((IsColimit.precomposeHomEquiv e'.symm _).symm
1102+ (isColimitOfPreserves _ hc.op)))) (c.pt.isoSpec.inv ≫ a) (by
1103+ ext i
1104+ have : c.π.app i ≫ Spec.map (t.app (.op i)) = a ≫ Spec.map φ := by
1105+ simpa using congr((($ha).app i))
1106+ simp [c', e, e', ← this, Iso.eq_inv_comp, isoSpec_hom_naturality_assoc]) ⟨_, rfl⟩
1107+ refine ⟨i, f, ?_⟩
1108+ simpa [Iso.eq_inv_comp, c', isoSpec_hom_naturality_assoc, e'] using hf
1109+ obtain ⟨c', rfl⟩ := hc'
1110+ obtain ⟨ψ, rfl⟩ := Spec.map_surjective a
1111+ replace hc := isColimitOfConeOfCoconeLeftOp _ (isLimitOfReflects _ hc)
1112+ obtain ⟨i, g, hg, hg'⟩ :=
1113+ RingHom.EssFiniteType.exists_eq_comp_ι_app_of_isColimit _ D.leftOp t _ _ hc
1114+ (HasRingHomProperty.Spec_iff.mp ‹LocallyOfFinitePresentation (Spec.map φ)›) ψ fun i ↦ by
1115+ apply Spec.map_injective; simpa using congr(($ha).app i.unop).symm
1116+ exact ⟨i.unop, Spec.map g, by simpa using congr(Spec.map $hg').symm,
1117+ by simpa using congr(Spec.map $hg)⟩
1118+
1119+ open TopologicalSpace in
1120+ include hc in
1121+ /--
1122+ Given a cofiltered diagram of qcqs schemes `Dᵢ` over `S` with affine transition maps.
1123+ If `X` is locally of finite presentation over `S`, then any `S`-morphism `lim Dᵢ ⟶ X` factors
1124+ through some `lim Dᵢ ⟶ Dⱼ ⟶ X` for some `j`.
1125+ -/
1126+ lemma Scheme.exists_π_app_comp_eq_of_locallyOfFinitePresentation
1127+ [IsCofiltered I] [LocallyOfFinitePresentation f]
1128+ [∀ {i j} (f : i ⟶ j), IsAffineHom (D.map f)]
1129+ [∀ i, CompactSpace (D.obj i)] [∀ i, QuasiSeparatedSpace (D.obj i)]
1130+ (a : c.pt ⟶ X) (ha : c.π ≫ t = (Functor.const _).map (a ≫ f)) :
1131+ ∃ (i : I) (g : D.obj i ⟶ X), c.π.app i ≫ g = a ∧ g ≫ f = t.app i := by
1132+ classical
1133+ -- The open cover of `c := lim Dᵢ` indexed by triplets of affine opens `(U, V, W)` with
1134+ -- `U ⊆ c`, `V ⊆ X`, `W ⊆ S` such that `U` maps to `V` maps to `W`.
1135+ have 𝒰 := (c.pt.isBasis_affineOpens).isOpenCover_mem_and_le
1136+ (((X.isBasis_affineOpens).isOpenCover_mem_and_le
1137+ ((S.isBasis_affineOpens).isOpenCover.comap f.base.hom)).comap a.base.hom)
1138+ -- By qcqs, this cover descends to some finite affine open cover `𝒱` of `Dᵢ`.
1139+ obtain ⟨i, s, 𝒱, h𝒱, h𝒱𝒰⟩ := Scheme.exists_isOpenCover_and_isAffine D c hc _ 𝒰 fun U ↦ U.2 .1
1140+ obtain ⟨i', fi'i, hi'⟩ : ∃ (i' : I) (fi'i : i' ⟶ i),
1141+ ∀ j, D.map fi'i ⁻¹ᵁ 𝒱 j ≤ t.app i' ⁻¹ᵁ j.1 .1 .2 .1 .2 .1 := by
1142+ choose k fk hk using fun j ↦ exists_map_preimage_le_map_preimage D c hc (h𝒱𝒰 j).1 .isCompact
1143+ (V := t.app i ⁻¹ᵁ j.1 .1 .2 .1 .2 .1 ) (by
1144+ rw [← Hom.comp_preimage, ← NatTrans.comp_app, ha]
1145+ exact (h𝒱𝒰 j).2 .symm.trans_le (j.1 .prop.2 .trans (a.preimage_mono j.1 .1 .2 .prop.2 )))
1146+ obtain ⟨i', fi'i, fi', hfi'⟩ := IsCofiltered.wideCospan fk
1147+ refine ⟨i', fi'i, fun j ↦ ?_⟩
1148+ rw [← hfi', Functor.map_comp, Hom.comp_preimage]
1149+ refine (Hom.preimage_mono _ (hk _)).trans ?_
1150+ simp only [← Hom.comp_preimage, t.naturality, Functor.const_obj_obj,
1151+ Functor.const_obj_map, Category.comp_id, le_refl]
1152+ -- Using the affine version `exists_π_app_comp_eq_of_locallyOfFinitePresentation_of_isAffine`,
1153+ -- one can now factor `Dⱼ ⁻¹ 𝒱ⱼ ⟶ lim Dᵢ ⟶ X` through some `Dⱼₖ ⁻¹ 𝒱ⱼ` for each `𝒱ⱼ`,
1154+ -- and by finite-ness we may chose a fixed `k` that works for every `j`.
1155+ have : ∃ k, ∃ (fk : k ⟶ i), ∀ j, ∃ (ak : ↑(D.map fk ⁻¹ᵁ 𝒱 j) ⟶ X),
1156+ ak ≫ f = Opens.ι _ ≫ t.app k ∧ c.π.app _ ∣_ _ ≫ ak = Opens.ι _ ≫ a := by
1157+ let 𝒱' := (D.map fi'i ⁻¹ᵁ 𝒱 ·)
1158+ have h𝒱'𝒰 (j : s) : c.π.app i' ⁻¹ᵁ 𝒱' j = j.1 .1 .1 := by
1159+ rw [← Hom.comp_preimage, c.w fi'i]; exact (h𝒱𝒰 j).2 .symm
1160+ have _ (j k) : IsAffine ((opensDiagram D i' (𝒱' j)).obj k) := ((h𝒱𝒰 _).1 .preimage _).preimage _
1161+ let t𝒱 (j : _) : opensDiagram D i' (𝒱' j) ⟶ (Functor.const (Over i')).obj j.1 .1 .2 .1 .2 :=
1162+ { app k := (t.app k.left).resLE _ _ <| by
1163+ refine (Hom.preimage_mono _ (hi' _)).trans ?_
1164+ simp only [Functor.id_obj, Functor.const_obj_obj, ← Hom.comp_preimage, t.naturality,
1165+ Functor.const_obj_map, Category.comp_id, le_refl]
1166+ naturality {k₁ k₂} f₁₂ := by simp [Hom.resLE_comp_resLE] }
1167+ have (j : s) : IsAffine j.1 .1 .2 .1 .1 := j.1 .1 .2 .prop.1
1168+ choose k ak hk hk' using fun j ↦ exists_π_app_comp_eq_of_locallyOfFinitePresentation_of_isAffine
1169+ _ (t𝒱 j) (f.resLE _ _ j.1 .1 .2 .prop.2 ) _ (isLimitOpensCone D c hc i' (𝒱' j))
1170+ (a.resLE _ _ ((h𝒱'𝒰 _).trans_le j.1 .prop.2 )) (by
1171+ ext k
1172+ simp [t𝒱, Hom.resLE_comp_resLE, show c.π.app k.left ≫ t.app k.left = a ≫ f from
1173+ congr(($ha).app k.left)])
1174+ obtain ⟨i'', fi''i' , fi'', hi''⟩ := IsCofiltered.wideCospan fun j ↦ (k j).hom
1175+ refine ⟨i'', fi''i' ≫ fi'i, fun j ↦
1176+ ⟨Scheme.homOfLE _ ?_ ≫ D.map (fi'' _) ∣_ _ ≫ ak j ≫ Opens.ι _, ?_, ?_⟩⟩
1177+ · simp only [← Hom.comp_preimage, ← Functor.map_comp, 𝒱', reassoc_of% hi'']; rfl
1178+ · have : ak j ≫ Opens.ι _ ≫ f = Opens.ι _ ≫ t.app (k j).left := by
1179+ simpa [t𝒱] using congr($(hk' j) ≫ Opens.ι _)
1180+ simp [this]
1181+ · have e : c.π.app i'' ⁻¹ᵁ D.map (fi''i' ≫ fi'i) ⁻¹ᵁ 𝒱 j ≤ c.π.app i' ⁻¹ᵁ 𝒱' j := by
1182+ simp only [← Hom.comp_preimage, Cone.w, 𝒱']; rfl
1183+ simpa [← AlgebraicGeometry.Scheme.Hom.resLE_eq_morphismRestrict,
1184+ Scheme.Hom.resLE_comp_resLE_assoc] using congr(Scheme.homOfLE _ e ≫ $(hk j) ≫ Opens.ι _)
1185+ choose k fki ak hak hak' using this
1186+ -- We may then find an `l` for each `j₁` and `j₂` such that the map `Dⱼ₁ₗ ⁻¹ 𝒱ⱼ₁ ⟶ X` and
1187+ -- `Dⱼ₂ₗ ⁻¹ 𝒱ⱼ₂ ⟶ X` agrees on the intersection in `Dₗ`.
1188+ -- And again by finiteness we may choose a global `l`.
1189+ obtain ⟨l, flk, hl⟩ : ∃ (l : I) (flk : l ⟶ k), ∀ j₁ j₂, Scheme.homOfLE _ inf_le_left ≫
1190+ D.map flk ∣_ _ ≫ ak j₁ = Scheme.homOfLE _ inf_le_right ≫ D.map flk ∣_ _ ≫ ak j₂ := by
1191+ let 𝒱' := (D.map fki ⁻¹ᵁ 𝒱 ·)
1192+ have (j₁ j₂ : s) : ∃ (l : I) (flk : l ⟶ k), Scheme.homOfLE _ inf_le_left ≫ D.map flk ∣_ _ ≫
1193+ ak j₁ = Scheme.homOfLE _ inf_le_right ≫ D.map flk ∣_ _ ≫ ak j₂ := by
1194+ have _ (x) : CompactSpace ↥((opensDiagram D k (𝒱' j₁ ⊓ 𝒱' j₂)).obj x) :=
1195+ isCompact_iff_compactSpace.mp (QuasiCompact.isCompact_preimage _ (𝒱' j₁ ⊓ 𝒱' j₂).isOpen
1196+ (((h𝒱𝒰 _).1 .preimage _).isCompact.inter_of_isOpen ((h𝒱𝒰 _).1 .preimage _).isCompact
1197+ (D.map fki ⁻¹ᵁ 𝒱 j₁).2 (D.map fki ⁻¹ᵁ 𝒱 j₂).2 ))
1198+ obtain ⟨⟨l, ⟨⟨⟩⟩, flk⟩, ⟨flk', ⟨⟨⟨⟩⟩⟩, h⟩, e⟩ :=
1199+ Scheme.exists_hom_comp_eq_comp_of_locallyOfFiniteType _
1200+ (opensDiagramι .. ≫ (Over.forget k).whiskerLeft t) f _
1201+ (isLimitOpensCone D c hc k (𝒱' j₁ ⊓ 𝒱' j₂)) (i := .mk (𝟙 k))
1202+ (Scheme.homOfLE _ (by simp [𝒱']) ≫ ak j₁) (Scheme.homOfLE _ (by simp [𝒱']) ≫ ak j₂)
1203+ (by simp [hak]) (by simp [hak]) (by simp; simp [Hom.resLE, hak'])
1204+ obtain rfl : flk = flk' := by simpa using h.symm
1205+ refine ⟨l, flk, by simpa [← Scheme.Hom.resLE_eq_morphismRestrict] using e⟩
1206+ choose l flk hflk using this
1207+ obtain ⟨l', fl'k, fl'l, hl'⟩ := IsCofiltered.wideCospan (I := s × s) fun x ↦ flk x.1 x.2
1208+ refine ⟨l', fl'k, fun j₁ j₂ ↦ ?_⟩
1209+ have H : (D.map fl'k ≫ D.map fki) ⁻¹ᵁ (𝒱 j₁ ⊓ 𝒱 j₂) ≤
1210+ (D.map (fl'l (j₁, j₂)) ≫ D.map (flk j₁ j₂) ≫ D.map fki) ⁻¹ᵁ (𝒱 j₁ ⊓ 𝒱 j₂) := by
1211+ simp only [← Functor.map_comp, reassoc_of% hl']; rfl
1212+ simpa [← Scheme.Hom.resLE_eq_morphismRestrict, Scheme.Hom.resLE_comp_resLE_assoc,
1213+ ← Functor.map_comp, hl'] using congr((D.map (fl'l (j₁, j₂))).resLE _ _ H ≫ $(hflk j₁ j₂))
1214+ -- We may glue the morphisms into `Dₗ ⟶ X` and verify that it indeed satisfies the hypothesis.
1215+ let h𝒲 := (h𝒱.comap (D.map fki).base.hom).comap (D.map flk).base.hom
1216+ let 𝒲 := Scheme.openCoverOfIsOpenCover _ (D.map flk ⁻¹ᵁ D.map fki ⁻¹ᵁ 𝒱 ·) h𝒲
1217+ let F := 𝒲.glueMorphisms (fun j ↦ D.map flk ∣_ D.map fki ⁻¹ᵁ 𝒱 j ≫ ak j) (fun j₁ j₂ ↦ by
1218+ rw [← cancel_epi (isPullback_opens_inf _ _).isoPullback.hom]
1219+ simpa [𝒲] using hl j₁ j₂)
1220+ have hF (j : s) : (D.map flk ⁻¹ᵁ D.map fki ⁻¹ᵁ 𝒱 j).ι ≫ F = D.map flk ∣_ _ ≫ ak j :=
1221+ Scheme.Cover.ι_glueMorphisms ..
1222+ refine ⟨l, F, ?_, ?_⟩
1223+ · refine Cover.hom_ext (𝒲.pullback₁ (c.π.app l)) _ _ fun j ↦ ?_
1224+ rw [← cancel_epi (isPullback_morphismRestrict _ _).flip.isoPullback.hom]
1225+ dsimp [𝒲]
1226+ simp only [pullback.condition_assoc, IsPullback.isoPullback_hom_snd_assoc,
1227+ IsPullback.isoPullback_hom_fst_assoc, hF]
1228+ have h : c.π.app l ⁻¹ᵁ D.map flk ⁻¹ᵁ D.map fki ⁻¹ᵁ 𝒱 j ≤ c.π.app k ⁻¹ᵁ D.map fki ⁻¹ᵁ 𝒱 j := by
1229+ simp only [← Hom.comp_preimage, c.w_assoc, c.w]; rfl
1230+ simpa [← Scheme.Hom.resLE_eq_morphismRestrict, Scheme.Hom.resLE_comp_resLE_assoc] using
1231+ congr(Scheme.homOfLE _ h ≫ $(hak' j))
1232+ · refine 𝒲.hom_ext _ _ fun j ↦ ?_
1233+ simp [F, Cover.ι_glueMorphisms_assoc, hak]; rfl
1234+
1235+ end LocallyOfFinitePresentation
1236+
10561237end AlgebraicGeometry
0 commit comments