Skip to content

Commit e56018a

Browse files
committed
feat: a pullback of schemes is canonically over the second component (#31475)
From Toric
1 parent 5434356 commit e56018a

File tree

2 files changed

+181
-14
lines changed

2 files changed

+181
-14
lines changed

Mathlib/AlgebraicGeometry/Pullbacks.lean

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ universe u v w
3333

3434
noncomputable section
3535

36-
open CategoryTheory CategoryTheory.Limits AlgebraicGeometry
36+
open CategoryTheory Functor CartesianMonoidalCategory Limits AlgebraicGeometry
3737

3838
namespace AlgebraicGeometry.Scheme
3939

@@ -635,6 +635,14 @@ instance Scheme.pullback_map_isOpenImmersion {X Y S X' Y' S' : Scheme}
635635
rw [pullback_map_eq_pullbackFstFstIso_inv]
636636
infer_instance
637637

638+
section CartesianMonoidalCategory
639+
variable {S : Scheme}
640+
641+
instance : CartesianMonoidalCategory (Over S) := Over.cartesianMonoidalCategory _
642+
instance : BraidedCategory (Over S) := .ofCartesianMonoidalCategory
643+
644+
end CartesianMonoidalCategory
645+
638646
section Spec
639647

640648
variable (R S T : Type u) [CommRing R] [CommRing S] [CommRing T] [Algebra R S] [Algebra R T]
@@ -662,6 +670,11 @@ lemma pullbackSpecIso_inv_fst :
662670
(pullbackSpecIso R S T).inv ≫ pullback.fst _ _ = Spec.map (ofHom includeLeftRingHom) :=
663671
limit.isoLimitCone_inv_π _ _
664672

673+
@[reassoc]
674+
lemma pullbackSpecIso_inv_fst' :
675+
(pullbackSpecIso R S T).inv ≫ pullback.fst _ _ = Spec.map (ofHom (algebraMap S _)) :=
676+
pullbackSpecIso_inv_fst ..
677+
665678
/--
666679
The composition of the inverse of the isomorphism `pullbackSpecIso R S T` (from the pullback of
667680
`Spec S ⟶ Spec R` and `Spec T ⟶ Spec R` to `Spec (S ⊗[R] T)`) with the second projection is
@@ -685,6 +698,11 @@ lemma pullbackSpecIso_hom_fst :
685698
(pullbackSpecIso R S T).hom ≫ Spec.map (ofHom includeLeftRingHom) = pullback.fst _ _ := by
686699
rw [← pullbackSpecIso_inv_fst, Iso.hom_inv_id_assoc]
687700

701+
@[reassoc (attr := simp)]
702+
lemma pullbackSpecIso_hom_fst' :
703+
(pullbackSpecIso R S T).hom ≫ Spec.map (ofHom (algebraMap S _)) = pullback.fst _ _ :=
704+
pullbackSpecIso_hom_fst ..
705+
688706
/--
689707
The composition of the isomorphism `pullbackSpecIso R S T` (from the pullback of
690708
`Spec S ⟶ Spec R` and `Spec T ⟶ Spec R` to `Spec (S ⊗[R] T)`) with the morphism
@@ -696,6 +714,12 @@ lemma pullbackSpecIso_hom_snd :
696714
(pullbackSpecIso R S T).hom ≫ Spec.map (ofHom (toRingHom includeRight)) = pullback.snd _ _ := by
697715
rw [← pullbackSpecIso_inv_snd, Iso.hom_inv_id_assoc]
698716

717+
@[reassoc (attr := simp)]
718+
lemma pullbackSpecIso_hom_base :
719+
(pullbackSpecIso R S T).hom ≫ Spec.map (ofHom (algebraMap R _)) =
720+
pullback.fst _ _ ≫ Spec.map (ofHom (algebraMap _ _)) := by
721+
simp [Algebra.TensorProduct.algebraMap_def]
722+
699723
lemma isPullback_SpecMap_of_isPushout {A B C P : CommRingCat} (f : A ⟶ B) (g : A ⟶ C)
700724
(inl : B ⟶ P) (inr : C ⟶ P) (h : IsPushout f g inl inr) :
701725
IsPullback (Spec.map inl) (Spec.map inr) (Spec.map f) (Spec.map g) :=
@@ -726,12 +750,28 @@ lemma diagonal_SpecMap :
726750

727751
end Spec
728752

729-
section CartesianMonoidalCategory
730-
variable {S : Scheme}
753+
namespace Scheme
754+
variable {M S T : Scheme.{u}} [M.Over S] {f : T ⟶ S}
731755

732-
instance : CartesianMonoidalCategory (Over S) := Over.cartesianMonoidalCategory _
733-
instance : BraidedCategory (Over S) := .ofCartesianMonoidalCategory
756+
@[simps]
757+
instance canonicallyOverPullback : (pullback (M ↘ S) f).CanonicallyOver T where
758+
hom := pullback.snd (M ↘ S) f
734759

735-
end CartesianMonoidalCategory
760+
@[simps! -isSimp mul one]
761+
instance monObjAsOverPullback [MonObj (asOver M S)] : MonObj (asOver (pullback (M ↘ S) f) T) := by
762+
unfold asOver OverClass.asOver at *; exact Over.monObjMkPullbackSnd
763+
764+
instance isCommMonObj_asOver_pullback [MonObj (asOver M S)] [IsCommMonObj (asOver M S)] :
765+
IsCommMonObj (asOver (pullback (M ↘ S) f) T) := by
766+
unfold asOver OverClass.asOver at *; exact Over.isCommMonObj_mk_pullbackSnd
767+
768+
instance GrpObjAsOverPullback [GrpObj (asOver M S)] : GrpObj (asOver (pullback (M ↘ S) f) T) := by
769+
unfold asOver OverClass.asOver at *; exact Over.grpObjMkPullbackSnd
736770

737-
end AlgebraicGeometry
771+
instance : (pullback.fst (M ↘ S) (𝟙 S)).IsOver S := ⟨pullback.condition.trans (by simp)⟩
772+
773+
instance isMonHom_fst_id_right [MonObj (asOver M S)] :
774+
IsMonHom ((pullback.fst (M ↘ S) (𝟙 S)).asOver S) := by
775+
unfold asOver OverClass.asOver at *; exact Over.isMonHom_pullbackFst_id_right
776+
777+
end AlgebraicGeometry.Scheme

Mathlib/CategoryTheory/Monoidal/Cartesian/Over.lean

Lines changed: 134 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ Authors: Andrew Yang
55
-/
66
module
77

8-
public import Mathlib.CategoryTheory.Monoidal.Cartesian.Basic
8+
public import Mathlib.CategoryTheory.Adjunction.Limits
9+
public import Mathlib.CategoryTheory.Comma.Over.Pullback
910
public import Mathlib.CategoryTheory.Limits.Constructions.Over.Products
11+
public import Mathlib.CategoryTheory.Monoidal.CommMon_
12+
public import Mathlib.CategoryTheory.Monoidal.Grp_
1013

1114
/-!
1215
@@ -17,28 +20,29 @@ for the induced `MonoidalCategory (Over X)` instance.
1720
1821
-/
1922

20-
@[expose] public section
23+
public noncomputable section
2124

2225
namespace CategoryTheory.Over
2326

24-
open Limits CartesianMonoidalCategory
27+
open Functor Limits CartesianMonoidalCategory
2528

2629
variable {C : Type*} [Category C] [HasPullbacks C]
2730

2831
/-- A choice of finite products of `Over X` given by `Limits.pullback`. -/
29-
noncomputable abbrev cartesianMonoidalCategory (X : C) : CartesianMonoidalCategory (Over X) :=
32+
abbrev cartesianMonoidalCategory (X : C) : CartesianMonoidalCategory (Over X) :=
3033
.ofChosenFiniteProducts
3134
⟨asEmptyCone (Over.mk (𝟙 X)), IsTerminal.ofUniqueHom (fun Y ↦ Over.homMk Y.hom)
3235
fun Y m ↦ Over.OverMorphism.ext (by simpa using m.w)⟩
3336
fun Y Z ↦ ⟨pullbackConeEquivBinaryFan.functor.obj (pullback.cone Y.hom Z.hom),
3437
(pullback.isLimit _ _).pullbackConeEquivBinaryFanFunctor⟩
3538

36-
@[deprecated (since := "2025-05-15")] alias chosenFiniteProducts := cartesianMonoidalCategory
39+
@[deprecated (since := "2025-05-15")]
40+
noncomputable alias chosenFiniteProducts := cartesianMonoidalCategory
3741

3842
attribute [local instance] cartesianMonoidalCategory
3943

4044
/-- `Over X` is braided w.r.t. the Cartesian monoidal structure given by `Limits.pullback`. -/
41-
noncomputable abbrev braidedCategory (X : C) : BraidedCategory (Over X) :=
45+
abbrev braidedCategory (X : C) : BraidedCategory (Over X) :=
4246
.ofCartesianMonoidalCategory
4347

4448
attribute [local instance] braidedCategory
@@ -54,7 +58,7 @@ lemma tensorObj_ext {R : C} {S T : Over X} (f₁ f₂ : R ⟶ (S ⊗ T).left)
5458
pullback.hom_ext e₁ e₂
5559

5660
@[simp]
57-
lemma tensorObj_left (R S : Over X) : (R ⊗ S).left = pullback R.hom S.hom := rfl
61+
lemma tensorObj_left (R S : Over X) : (R ⊗ S).left = Limits.pullback R.hom S.hom := rfl
5862

5963
@[simp]
6064
lemma tensorObj_hom (R S : Over X) : (R ⊗ S).hom = pullback.fst R.hom S.hom ≫ R.hom := rfl
@@ -185,4 +189,127 @@ lemma braiding_hom_left {R S : Over X} :
185189
lemma braiding_inv_left {R S : Over X} :
186190
(β_ R S).inv.left = (pullbackSymmetry _ _).hom := rfl
187191

192+
variable {A B R S Y Z : C} {f : R ⟶ X} {g : S ⟶ X}
193+
194+
instance : (Over.pullback f).Braided := .ofChosenFiniteProducts _
195+
196+
@[simp]
197+
lemma η_pullback_left : (OplaxMonoidal.η (Over.pullback f)).left = (pullback.snd (𝟙 _) f) := rfl
198+
199+
@[simp]
200+
lemma ε_pullback_left : (LaxMonoidal.ε (Over.pullback f)).left = inv (pullback.snd (𝟙 _) f) := by
201+
apply IsIso.eq_inv_of_hom_inv_id
202+
rw [← η_pullback_left, ← Over.comp_left, Monoidal.η_ε, Over.id_left]
203+
204+
lemma μ_pullback_left_fst_fst (R S : Over X) :
205+
(LaxMonoidal.μ (Over.pullback f) R S).left ≫
206+
pullback.fst _ _ ≫ pullback.fst _ _ = pullback.fst _ _ ≫ pullback.fst _ _ := by
207+
rw [Monoidal.μ_of_cartesianMonoidalCategory,
208+
← cancel_epi (prodComparisonIso (Over.pullback f) R S).hom.left, ← Over.comp_left_assoc,
209+
Iso.hom_inv_id]
210+
simp [CartesianMonoidalCategory.prodComparison, fst]
211+
212+
lemma μ_pullback_left_fst_snd (R S : Over X) :
213+
(LaxMonoidal.μ (Over.pullback f) R S).left ≫
214+
pullback.fst _ _ ≫ pullback.snd _ _ = pullback.snd _ _ ≫ pullback.fst _ _ := by
215+
rw [Monoidal.μ_of_cartesianMonoidalCategory,
216+
← cancel_epi (prodComparisonIso (Over.pullback f) R S).hom.left,
217+
← Over.comp_left_assoc, Iso.hom_inv_id]
218+
simp [CartesianMonoidalCategory.prodComparison, snd]
219+
220+
lemma μ_pullback_left_snd (R S : Over X) :
221+
(LaxMonoidal.μ (Over.pullback f) R S).left ≫ pullback.snd _ _ =
222+
pullback.snd _ _ ≫ pullback.snd _ _ := by
223+
rw [Monoidal.μ_of_cartesianMonoidalCategory,
224+
← cancel_epi (prodComparisonIso (Over.pullback f) R S).hom.left,
225+
← Over.comp_left_assoc, Iso.hom_inv_id]
226+
simp [CartesianMonoidalCategory.prodComparison]
227+
228+
@[simp]
229+
lemma μ_pullback_left_fst_fst' (g₁ : Y ⟶ X) (g₂ : Z ⟶ X) :
230+
(LaxMonoidal.μ (Over.pullback f) (.mk g₁) (.mk g₂)).left ≫
231+
pullback.fst (pullback.fst g₁ g₂ ≫ g₁) f ≫ pullback.fst g₁ g₂ =
232+
pullback.fst _ _ ≫ pullback.fst _ _ :=
233+
μ_pullback_left_fst_fst ..
234+
235+
@[simp]
236+
lemma μ_pullback_left_fst_snd' (g₁ : Y ⟶ X) (g₂ : Z ⟶ X) :
237+
(LaxMonoidal.μ (Over.pullback f) (.mk g₁) (.mk g₂)).left ≫
238+
pullback.fst (pullback.fst g₁ g₂ ≫ g₁) f ≫ pullback.snd g₁ g₂ =
239+
pullback.snd _ _ ≫ pullback.fst _ _ :=
240+
μ_pullback_left_fst_snd ..
241+
242+
@[simp]
243+
lemma μ_pullback_left_snd' (g₁ : Y ⟶ X) (g₂ : Z ⟶ X) :
244+
(LaxMonoidal.μ (Over.pullback f) (.mk g₁) (.mk g₂)).left ≫
245+
pullback.snd (pullback.fst g₁ g₂ ≫ g₁) f =
246+
pullback.snd _ _ ≫ pullback.snd _ _ := μ_pullback_left_snd ..
247+
248+
@[simp]
249+
lemma preservesTerminalIso_pullback (f : R ⟶ S) :
250+
preservesTerminalIso (Over.pullback f) =
251+
Over.isoMk (asIso (pullback.snd (𝟙 _) f)) (by simp) := by
252+
ext1; exact toUnit_unique _ _
253+
254+
@[simp]
255+
lemma prodComparisonIso_pullback_inv_left_fst_fst (f : X ⟶ Y) (A B : Over Y) :
256+
(prodComparisonIso (Over.pullback f) A B).inv.left ≫
257+
pullback.fst (pullback.fst A.hom B.hom ≫ A.hom) f ≫ pullback.fst _ _ =
258+
pullback.fst (pullback.snd A.hom f) (pullback.snd B.hom f) ≫ pullback.fst _ _ := by
259+
rw [← cancel_epi (prodComparisonIso (Over.pullback f) A B).hom.left,
260+
Over.hom_left_inv_left_assoc]
261+
simp [CartesianMonoidalCategory.prodComparison, fst]
262+
263+
@[simp]
264+
lemma prodComparisonIso_pullback_Spec_inv_left_fst_fst' (f : X ⟶ Y) (gA : A ⟶ Y) (gB : B ⟶ Y) :
265+
(prodComparisonIso (Over.pullback f) (.mk gA) (.mk gB)).inv.left ≫
266+
pullback.fst (pullback.fst gA gB ≫ gA) f ≫ pullback.fst _ _ =
267+
pullback.fst (pullback.snd gA f) (pullback.snd gB f) ≫ pullback.fst _ _ :=
268+
prodComparisonIso_pullback_inv_left_fst_fst ..
269+
270+
@[simp]
271+
lemma prodComparisonIso_pullback_inv_left_fst_snd' (f : X ⟶ Y) (gA : A ⟶ Y) (gB : B ⟶ Y) :
272+
(prodComparisonIso (Over.pullback f) (.mk gA) (.mk gB)).inv.left ≫
273+
pullback.fst (pullback.fst gA gB ≫ gA) f ≫ pullback.snd _ _ =
274+
pullback.snd _ _ ≫ pullback.fst _ _ := by
275+
rw [← cancel_epi (prodComparisonIso (Over.pullback f) _ _).hom.left,
276+
Over.hom_left_inv_left_assoc]
277+
simp [CartesianMonoidalCategory.prodComparison, snd]
278+
279+
@[simp]
280+
lemma prodComparisonIso_pullback_inv_left_snd' (f : X ⟶ Y) (gA : A ⟶ Y) (gB : B ⟶ Y) :
281+
(prodComparisonIso (Over.pullback f) (.mk gA) (.mk gB)).inv.left ≫
282+
pullback.snd (pullback.fst gA gB ≫ gA) f = pullback.snd _ _ ≫ pullback.snd _ _ := by
283+
rw [← cancel_epi (prodComparisonIso (Over.pullback f) _ _).hom.left,
284+
Over.hom_left_inv_left_assoc]
285+
simp [CartesianMonoidalCategory.prodComparison]
286+
287+
/-- The pullback of a monoid object is a monoid object. -/
288+
@[simps! -isSimp mul one]
289+
abbrev monObjMkPullbackSnd [MonObj (Over.mk f)] : MonObj (Over.mk <| pullback.snd f g) :=
290+
((Over.pullback g).mapMon.obj <| .mk <| .mk f).mon
291+
292+
attribute [local instance] monObjMkPullbackSnd
293+
294+
instance isCommMonObj_mk_pullbackSnd [MonObj (Over.mk f)] [IsCommMonObj (Over.mk f)] :
295+
IsCommMonObj (Over.mk <| pullback.snd f g) :=
296+
((Over.pullback g).mapCommMon.obj <| .mk <| .mk f).comm
297+
298+
/-- The pullback of a monoid object is a monoid object. -/
299+
@[simps! -isSimp mul one]
300+
abbrev grpObjMkPullbackSnd [GrpObj (Over.mk f)] : GrpObj (Over.mk (pullback.snd f g)) :=
301+
((Over.pullback g).mapGrp.obj <| .mk <| .mk f).grp
302+
303+
attribute [local simp] monObjMkPullbackSnd_one in
304+
instance isMonHom_pullbackFst_id_right [MonObj (Over.mk f)] :
305+
IsMonHom <| Over.homMk (U := Over.mk <| pullback.snd f (𝟙 X)) (V := Over.mk f)
306+
(pullback.fst f (𝟙 X)) (pullback.condition.trans <| by simp) where
307+
mul_hom := by
308+
ext
309+
dsimp [monObjMkPullbackSnd_mul]
310+
simp only [Category.assoc, limit.lift_π, PullbackCone.mk_pt, PullbackCone.mk_π_app]
311+
simp only [← Category.assoc]
312+
congr 1
313+
ext <;> simp
314+
188315
end CategoryTheory.Over

0 commit comments

Comments
 (0)