88public import Mathlib.Algebra.Category.Ring.Under.Limits
99public import Mathlib.CategoryTheory.Limits.MorphismProperty
1010public import Mathlib.CategoryTheory.ObjectProperty.FiniteProducts
11+ public import Mathlib.CategoryTheory.ConcreteCategory.EpiMono
1112
1213/-!
1314# Properties of `P.Under ⊤ R` for `R : CommRingCat`
@@ -19,6 +20,8 @@ In this file we translate ring theoretic properties of a property of ring homomo
1920
2021- `CommRingCat.Under.hasFiniteLimits`: If `P` is stable under finite products and equalizers,
2122 `P.Under ⊤ R` has finite limits.
23+ - `RingHom.HasStableEqualizers.preservesFiniteLimits_pushout`: If `P` has stable equalizers,
24+ base change along arbitrary morphisms preserve finite limits.
2225 -/
2326
2427@[expose] public section
@@ -80,6 +83,18 @@ lemma RingHom.HasFiniteProducts.hasFiniteProducts (hQi : RespectsIso Q) (hQp : H
8083 have := hQp.createsFiniteProductsForget hQi R
8184 exact CategoryTheory.hasLimit_of_created D (Under.forget _ _ R)
8285
86+ lemma RingHom.HasFiniteProducts.preservesFiniteProducts_pushout (hQi : RingHom.RespectsIso Q)
87+ (hQp : RingHom.HasFiniteProducts Q) [(toMorphismProperty Q).IsStableUnderCobaseChange]
88+ {R S : CommRingCat.{u}} (f : R ⟶ S) :
89+ PreservesFiniteProducts (Under.pushout (toMorphismProperty Q) ⊤ f) := by
90+ have := hQp.createsFiniteProductsForget hQi R
91+ refine ⟨fun n ↦ ⟨fun {K} ↦ ?_⟩⟩
92+ have : PreservesLimit K (Under.pushout (toMorphismProperty Q) ⊤ f ⋙
93+ Under.forget (toMorphismProperty Q) ⊤ S) := by
94+ rw [preservesLimit_iff_of_natIso _ (Under.pushoutCompForgetIso _)]
95+ infer_instance
96+ exact preservesLimit_of_reflects_of_preserves _ (MorphismProperty.Under.forget _ ⊤ S)
97+
8398/-- If `Q` is stable under equalizers, the inclusion from the subcategory of `Under R` defined
8499by `Q` creates equalizers. -/
85100@[implicit_reducible]
@@ -117,3 +132,74 @@ lemma Under.hasFiniteLimits (hQi : RingHom.RespectsIso Q)
117132 hasFiniteLimits_of_hasEqualizers_and_finite_products
118133
119134end CommRingCat
135+
136+ variable (P : ∀ {R S : Type u} [CommRing R] [CommRing S], (R →+* S) → Prop )
137+
138+ open RingHom
139+
140+ variable {P}
141+
142+ lemma CommRingCat.preservesLimit_parallelPair_tensorProd_iff_tensorEqualizer_bijective
143+ {R S : CommRingCat.{u}} [Algebra R S] {A B : Under R} {f g : A ⟶ B} :
144+ PreservesLimit (parallelPair f g) (tensorProd R S) ↔
145+ Function.Bijective ((toAlgHom f).tensorEqualizer R S (toAlgHom g)) := by
146+ let c : Fork f g := Under.equalizerFork f g
147+ let hc : IsLimit c := Under.equalizerForkIsLimit f g
148+ let ι : R.mkUnder (AlgHom.equalizer (toAlgHom f) (toAlgHom g)) ⟶ A :=
149+ (AlgHom.equalizer (toAlgHom f) (toAlgHom g)).val.toUnder
150+ let h' := (R.tensorProd S).map ι
151+ have w' : h' ≫ (tensorProd R S).map f = h' ≫ (tensorProd R S).map g := by
152+ simpa using congr((R.tensorProd S).map $(CommRingCat.Under.equalizer_comp f g))
153+ let e : IsLimit ((R.tensorProd S).mapCone c) ≃ IsLimit (Fork.ofι h' w') :=
154+ isLimitMapConeForkEquiv (tensorProd R S) (Under.equalizer_comp f g)
155+ rw [preservesLimit_iff_isLimit_mapCone hc, e.nonempty_congr,
156+ (Under.equalizerForkIsLimit _ _).nonempty_isLimit_iff_isIso_lift]
157+ have heq : (Under.equalizerForkIsLimit _ _).lift (Fork.ofι h' w') =
158+ (AlgHom.tensorEqualizer S S (toAlgHom f) (toAlgHom g)).toUnder ≫
159+ Under.homMk (CommRingCat.ofHom (.id _)) := by
160+ refine Fork.IsLimit.hom_ext (Under.equalizerForkIsLimit _ _) ?_
161+ rw [Fork.IsLimit.lift_ι]
162+ ext : 2
163+ dsimp
164+ ext x <;> rfl
165+ rw [heq, ← isIso_iff_of_reflects_iso _ (CategoryTheory.Under.forget S),
166+ ConcreteCategory.isIso_iff_bijective]
167+ rfl
168+
169+ lemma RingHom.HasStableEqualizers.preservesLimit_parallelPair_tensorProd
170+ (hPse : HasStableEqualizers P) {R S : CommRingCat.{u}} [Algebra R S]
171+ {A B : Under R} (f g : A ⟶ B) (hA : P A.hom.hom) (hB : P B.hom.hom) :
172+ PreservesLimit (parallelPair f g) (CommRingCat.tensorProd R S) := by
173+ rw [CommRingCat.preservesLimit_parallelPair_tensorProd_iff_tensorEqualizer_bijective]
174+ exact hPse _ _ hA hB
175+
176+ lemma RingHom.HasStableEqualizers.preservesEqualizers_pushout (hPi : RespectsIso P)
177+ (hPe : HasEqualizers P) (hPse : HasStableEqualizers P)
178+ [(toMorphismProperty P).IsStableUnderCobaseChange] {R S : CommRingCat.{u}} (f : R ⟶ S) :
179+ PreservesLimitsOfShape WalkingParallelPair (Under.pushout (toMorphismProperty P) ⊤ f) := by
180+ refine ⟨fun {K} ↦ ?_⟩
181+ have := hPe.createsLimitsWalkingParallelPair hPi R
182+ algebraize [f.hom]
183+ have : PreservesLimit (K ⋙ Under.forget (toMorphismProperty P) ⊤ R)
184+ (CategoryTheory.Under.pushout f) := by
185+ rw [← CommRingCat.ofHom_hom f,
186+ ← preservesLimit_iff_of_natIso _ (CommRingCat.tensorProdIsoPushout R S),
187+ ← preservesLimit_iff_of_iso_diagram _ (diagramIsoParallelPair _).symm]
188+ exact hPse.preservesLimit_parallelPair_tensorProd _ _ ((K.obj _).prop) ((K.obj _).prop)
189+ have : PreservesLimit K (Under.pushout (toMorphismProperty P) ⊤ f ⋙
190+ Under.forget (toMorphismProperty P) ⊤ S) := by
191+ rw [preservesLimit_iff_of_natIso _ (Under.pushoutCompForgetIso _)]
192+ infer_instance
193+ exact preservesLimit_of_reflects_of_preserves _ (Under.forget _ ⊤ S)
194+
195+ /-- If `P` is a property of ring homs that is stable under finite products and
196+ equalizers, and the latter are preserved by arbitrary base change,
197+ pushout along any ring homomorphism preserves finite limits. -/
198+ lemma RingHom.HasStableEqualizers.preservesFiniteLimits_pushout (hPi : RingHom.RespectsIso P)
199+ (hPp : HasFiniteProducts P) (hPe : HasEqualizers P) (hPse : HasStableEqualizers P)
200+ [(toMorphismProperty P).IsStableUnderCobaseChange] {R S : CommRingCat.{u}} (f : R ⟶ S) :
201+ PreservesFiniteLimits (Under.pushout (toMorphismProperty P) ⊤ f) :=
202+ have := hPp.preservesFiniteProducts_pushout hPi f
203+ have := hPse.preservesEqualizers_pushout hPi hPe f
204+ have := CommRingCat.Under.hasFiniteLimits hPi hPp hPe
205+ preservesFiniteLimits_of_preservesEqualizers_and_finiteProducts _
0 commit comments