The most important technique in scheme theory is certainly the reduction to
affine situations and commutative algebra. We first explain a few of the
basic tools for this and then give an example how these can be used
to prove a standard fact.
The goal of this section is to define flat morphisms of schemes and to prove
that a morphism is flat if it is stalkwise flat.
Here is a definition of a flat morphism of schemes: A morphism of schemes f : X \to Y
is flat if for every affine open U \subseteq Y and V \subseteq f^{-1}(U), the
induced ring homomorphism \mathcal{O}_Y(U) \to \mathcal{O}_X(V) is flat.
With these preparations, we can now prove that a morphism that is stalkwise flat is flat:
theoremflat_of_flat_stalkMap(f:X⟶Y)(H:∀x,(f.stalkMapx).hom.Flat):Flatf:=byX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat⊢ Flatf-- We may assume `Y` is of the form `Spec R`wloghY:∃R,Y=SpecRgeneralizingXYfinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecR⊢ FlatfX✝:SchemeY✝:SchemeX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).FlathY:∃R,Y=SpecR⊢ Flatf·inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecR⊢ Flatfrw[IsZariskiLocalAtTarget.iff_of_openCover(P:=@Flat)Y.affineCoverinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecR⊢ ∀(i:Y.affineCover.toPreZeroHypercover.1),Flat(Scheme.Cover.pullbackHomY.affineCoverfi)]inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecR⊢ ∀(i:Y.affineCover.toPreZeroHypercover.1),Flat(Scheme.Cover.pullbackHomY.affineCoverfi)introiinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1⊢ Flat(Scheme.Cover.pullbackHomY.affineCoverfi)refinethis_?_⟨_,rfl⟩inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1⊢ ∀(x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Scheme.Cover.pullbackHomY.affineCoverfi)x)).FlatintroxinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ (CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Scheme.Cover.pullbackHomY.affineCoverfi)x)).Flatrw[RingHom.Flat.respectsIso.arrow_mk_iso_iffinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ (CommRingCat.Hom.hom?m.67).FlatinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ Arrow.mk(Scheme.Hom.stalkMap(Scheme.Cover.pullbackHomY.affineCoverfi)x)≅Arrow.mk?m.67X:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ CommRingCatX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ CommRingCatX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ ?m.64⟶?m.65]inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ (CommRingCat.Hom.hom?m.67).FlatinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ Arrow.mk(Scheme.Hom.stalkMap(Scheme.Cover.pullbackHomY.affineCoverfi)x)≅Arrow.mk?m.67X:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ CommRingCatX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ CommRingCatX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ ?m.64⟶?m.65·inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ (CommRingCat.Hom.hom?m.67).FlatapplyHinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ ↥XbdsimpatxinrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥(pullbackf(Y.affineCover.fi))⊢ ↥Xexactpullback.fstf_xAll goals completed! 🐙·inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ Arrow.mk(Scheme.Hom.stalkMap(Scheme.Cover.pullbackHomY.affineCoverfi)x)≅Arrow.mk(Scheme.Hom.stalkMapf((pullback.fstf(Y.affineCover.fi))x))dsimp[Scheme.Cover.pullbackHom]inrX:SchemeY:Schemef:X⟶YH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{XY:Scheme}(f:X⟶Y),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃R,Y=SpecR)→FlatfhY:¬∃R,Y=SpecRi:Y.affineCover.toPreZeroHypercover.1x:↥((Precoverage.ZeroHypercover.pullback₁fY.affineCover).Xi)⊢ Arrow.mk(Scheme.Hom.stalkMap(pullback.sndf(Y.affineCover.fi))x)≅Arrow.mk(Scheme.Hom.stalkMapf((pullback.fstf(Y.affineCover.fi))x))applyIso.symm<|Scheme.stalkMapIsoOfIsPullback(IsPullback.of_hasPullback_(Y.affineCover.fi))_All goals completed! 🐙-- Replace `Y` by `Spec R` in the context and goal.obtain⟨R,rfl⟩:=hYX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat⊢ FlatfwloghX:∃S,X=SpecSgeneralizingXfinrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecS⊢ FlatfX✝:SchemeY:SchemeR:CommRingCatX:Schemef:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).FlathX:∃S,X=SpecS⊢ Flatf·inrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecS⊢ Flatfrw[IsZariskiLocalAtSource.iff_of_openCover(P:=@Flat)X.affineCoverinrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecS⊢ ∀(i:X.affineCover.I₀),Flat(X.affineCover.fi≫f)]inrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecS⊢ ∀(i:X.affineCover.I₀),Flat(X.affineCover.fi≫f)introiinrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀⊢ Flat(X.affineCover.fi≫f)refinethis_?_⟨_,rfl⟩inrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀⊢ ∀(x:↥(X.affineCover.Xi)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(X.affineCover.fi≫f)x)).FlatintroxinrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀x:↥(X.affineCover.Xi)⊢ (CommRingCat.Hom.hom(Scheme.Hom.stalkMap(X.affineCover.fi≫f)x)).Flatrw[Scheme.Hom.stalkMap_comp,inrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀x:↥(X.affineCover.Xi)⊢ (CommRingCat.Hom.hom(Scheme.Hom.stalkMapf((X.affineCover.fi)x)≫Scheme.Hom.stalkMap(X.affineCover.fi)x)).FlatCommRingCat.hom_comp,inrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀x:↥(X.affineCover.Xi)⊢ ((CommRingCat.Hom.hom(Scheme.Hom.stalkMap(X.affineCover.fi)x)).comp(CommRingCat.Hom.hom(Scheme.Hom.stalkMapf((X.affineCover.fi)x)))).FlatRingHom.Flat.respectsIso.cancel_right_isIsoinrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀x:↥(X.affineCover.Xi)⊢ (CommRingCat.Hom.hom(Scheme.Hom.stalkMapf((X.affineCover.fi)x))).Flat]inrX✝:SchemeY:SchemeX:SchemeR:CommRingCatf:X⟶SpecRH:∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flatthis:∀{X:Scheme}(f:X⟶SpecR),(∀(x:↥X),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat)→(∃S,X=SpecS)→FlatfhX:¬∃S,X=SpecSi:X.affineCover.I₀x:↥(X.affineCover.Xi)⊢ (CommRingCat.Hom.hom(Scheme.Hom.stalkMapf((X.affineCover.fi)x))).FlatapplyHAll goals completed! 🐙-- Replace `X` by `Spec S` in the context and goal.obtain⟨S,rfl⟩:=hXX:SchemeY:SchemeR:CommRingCatS:CommRingCatf:SpecS⟶SpecRH:∀(x:↥(SpecS)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMapfx)).Flat⊢ Flatf-- Replace `f` by `Spec.map φ` in the context and goal.obtain⟨φ,rfl⟩:=Spec.map_surjectivefX:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SH:∀(x:↥(SpecS)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Spec.mapφ)x)).Flat⊢ Flat(Spec.mapφ)/- Since we have shown before that flat morphisms of
schemes correspond to flat ring homomorphisms, we can now
turn the goal into commutative algebra. -/rw[HasRingHomProperty.Spec_iff(P:=@Flat)X:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SH:∀(x:↥(SpecS)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Spec.mapφ)x)).Flat⊢ (CommRingCat.Hom.homφ).Flat]X:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SH:∀(x:↥(SpecS)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Spec.mapφ)x)).Flat⊢ (CommRingCat.Hom.homφ).Flat/- Finally, use the fact from commutative algebra, that
flatness of ring maps can be checked on stalks. -/applyRingHom.Flat.ofLocalizationPrimeX:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SH:∀(x:↥(SpecS)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Spec.mapφ)x)).Flat⊢ ∀(J:Ideal↑S)(x:J.IsPrime),(fun{RS}[CommRingR][CommRingS]=>RingHom.Flat)(Localization.localRingHom(Ideal.comap(CommRingCat.Hom.homφ)J)J(CommRingCat.Hom.homφ)⋯)introPhPX:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SH:∀(x:↥(SpecS)),(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Spec.mapφ)x)).FlatP:Ideal↑ShP:P.IsPrime⊢ (Localization.localRingHom(Ideal.comap(CommRingCat.Hom.homφ)P)P(CommRingCat.Hom.homφ)⋯).FlatspecializeH⟨P,hP⟩X:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SP:Ideal↑ShP:P.IsPrimeH:(CommRingCat.Hom.hom(Scheme.Hom.stalkMap(Spec.mapφ){asIdeal:=P,isPrime:=hP})).Flat⊢ (Localization.localRingHom(Ideal.comap(CommRingCat.Hom.homφ)P)P(CommRingCat.Hom.homφ)⋯).Flatrwa[RingHom.Flat.respectsIso.arrow_mk_iso_iff(Scheme.arrowStalkMapSpecIsoφ_)X:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SP:Ideal↑ShP:P.IsPrimeH:(CommRingCat.Hom.hom(CommRingCat.ofHom(Localization.localRingHom(PrimeSpectrum.comap(CommRingCat.Hom.homφ){asIdeal:=P,isPrime:=hP}).asIdeal{asIdeal:=P,isPrime:=hP}.asIdeal(CommRingCat.Hom.homφ)⋯))).Flat⊢ (Localization.localRingHom(Ideal.comap(CommRingCat.Hom.homφ)P)P(CommRingCat.Hom.homφ)⋯).Flat]X:SchemeY:SchemeR:CommRingCatS:CommRingCatφ:R⟶SP:Ideal↑ShP:P.IsPrimeH:(CommRingCat.Hom.hom(CommRingCat.ofHom(Localization.localRingHom(PrimeSpectrum.comap(CommRingCat.Hom.homφ){asIdeal:=P,isPrime:=hP}).asIdeal{asIdeal:=P,isPrime:=hP}.asIdeal(CommRingCat.Hom.homφ)⋯))).Flat⊢ (Localization.localRingHom(Ideal.comap(CommRingCat.Hom.homφ)P)P(CommRingCat.Hom.homφ)⋯).FlatatH