|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Joël Riou. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Joël Riou |
| 5 | +-/ |
| 6 | +import Mathlib.Algebra.Category.ModuleCat.Sheaf.Free |
| 7 | +import Mathlib.Algebra.Category.ModuleCat.Sheaf.PullbackContinuous |
| 8 | +import Mathlib.CategoryTheory.Limits.Preserves.Shapes.Products |
| 9 | +import Mathlib.CategoryTheory.Limits.Final.Type |
| 10 | + |
| 11 | +/-! |
| 12 | +# Pullbacks of free sheaves of modules |
| 13 | +
|
| 14 | +Let `S` (resp.`R`) be a sheaf of rings on a category `C` (resp. `D`) |
| 15 | +equipped with a Grothendieck topology `J` (resp. `K`). |
| 16 | +Let `F : C ⥤ D` be a continuous functor. |
| 17 | +Let `φ` be a morphism from `S` to the direct image of `R`. |
| 18 | +
|
| 19 | +We introduce `unitToPushforwardObjUnit φ` which is the morphism |
| 20 | +in the category `SheafOfModules S` which corresponds to `φ`, and |
| 21 | +show that the adjoint morphism |
| 22 | +`pullbackObjUnitToUnit φ : (pullback.{u} φ).obj (unit S) ⟶ unit R` |
| 23 | +is an isomorphism when `F` is a final functor. |
| 24 | +More generally, the functor `pullback φ` sends the free sheaf |
| 25 | +of modules `free I` to `free I`, see `pullbackObjFreeIso` and |
| 26 | +`freeFunctorCompPullbackIso`. |
| 27 | +-/ |
| 28 | + |
| 29 | +universe v v₁ v₂ u₁ u₂ u |
| 30 | + |
| 31 | +open CategoryTheory Limits |
| 32 | + |
| 33 | +namespace SheafOfModules |
| 34 | + |
| 35 | +variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₂} D] |
| 36 | + {J : GrothendieckTopology C} {K : GrothendieckTopology D} {F : C ⥤ D} |
| 37 | + {S : Sheaf J RingCat.{u}} {R : Sheaf K RingCat.{u}} |
| 38 | + [Functor.IsContinuous.{u} F J K] |
| 39 | + (φ : S ⟶ (F.sheafPushforwardContinuous RingCat.{u} J K).obj R) |
| 40 | + |
| 41 | +/-- The canonical map from the (global) sections of a sheaf of modules |
| 42 | +to the (global) sections of its pushforward. -/ |
| 43 | +@[simps] |
| 44 | +def pushforwardSections [Functor.IsContinuous.{v} F J K] |
| 45 | + {M : SheafOfModules.{v} R} (s : M.sections) : |
| 46 | + ((pushforward φ).obj M).sections where |
| 47 | + val _ := s.val _ |
| 48 | + property _ := s.property _ |
| 49 | + |
| 50 | +variable (M) in |
| 51 | +lemma bijective_pushforwardSections [Functor.IsContinuous.{v} F J K] [F.Final] : |
| 52 | + Function.Bijective (pushforwardSections φ (M := M)) := |
| 53 | + Functor.bijective_sectionsPrecomp _ _ |
| 54 | + |
| 55 | +variable [J.HasSheafCompose (forget₂ RingCat.{u} AddCommGrpCat.{u})] |
| 56 | + [K.HasSheafCompose (forget₂ RingCat.{u} AddCommGrpCat.{u})] |
| 57 | + |
| 58 | +/-- The canonical morphism `unit S ⟶ (pushforward.{u} φ).obj (unit R)` |
| 59 | +of sheaves of modules corresponding to a continuous map between ringed sites. -/ |
| 60 | +def unitToPushforwardObjUnit : unit S ⟶ (pushforward.{u} φ).obj (unit R) where |
| 61 | + val.app X := ModuleCat.homMk ((forget₂ RingCat AddCommGrpCat).map (φ.val.app X)) (fun r ↦ by |
| 62 | + ext m |
| 63 | + exact ((φ.val.app X).hom.map_mul _ _).symm) |
| 64 | + val.naturality f := by |
| 65 | + ext |
| 66 | + exact ConcreteCategory.congr_hom (φ.val.naturality f) _ |
| 67 | + |
| 68 | +lemma unitToPushforwardObjUnit_val_app_apply {X : Cᵒᵖ} (a : S.val.obj X) : |
| 69 | + (unitToPushforwardObjUnit φ).val.app X a = φ.val.app X a := rfl |
| 70 | + |
| 71 | +lemma pushforwardSections_unitHomEquiv |
| 72 | + {M : SheafOfModules.{u} R} (f : unit R ⟶ M) : |
| 73 | + pushforwardSections φ (M.unitHomEquiv f) = |
| 74 | + ((pushforward φ).obj M).unitHomEquiv |
| 75 | + (unitToPushforwardObjUnit φ ≫ (pushforward φ).map f) := by |
| 76 | + ext X |
| 77 | + have := unitToPushforwardObjUnit_val_app_apply φ (X := X) 1 |
| 78 | + dsimp at this ⊢ |
| 79 | + simp [this, map_one] |
| 80 | + rfl |
| 81 | + |
| 82 | +variable [(pushforward.{u} φ).IsRightAdjoint] |
| 83 | + |
| 84 | +/-- The canonical morphism `(pullback.{u} φ).obj (unit S) ⟶ unit R` |
| 85 | +of sheaves of modules corresponding to a continuous map between ringed sites. -/ |
| 86 | +noncomputable def pullbackObjUnitToUnit : |
| 87 | + (pullback.{u} φ).obj (unit S) ⟶ unit R := |
| 88 | + ((pullbackPushforwardAdjunction.{u} φ).homEquiv _ _).symm (unitToPushforwardObjUnit φ) |
| 89 | + |
| 90 | +@[simp] |
| 91 | +lemma pullbackPushforwardAdjunction_homEquiv_symm_unitToPushforwardObjUnit : |
| 92 | + ((pullbackPushforwardAdjunction.{u} φ).homEquiv _ _).symm (unitToPushforwardObjUnit φ) = |
| 93 | + pullbackObjUnitToUnit φ := rfl |
| 94 | + |
| 95 | +@[simp] |
| 96 | +lemma pullbackPushforwardAdjunction_homEquiv_pullbackObjUnitToUnit : |
| 97 | + (pullbackPushforwardAdjunction.{u} φ).homEquiv _ _ (pullbackObjUnitToUnit φ) = |
| 98 | + unitToPushforwardObjUnit φ := |
| 99 | + Equiv.apply_symm_apply _ _ |
| 100 | + |
| 101 | +instance [F.Final] : IsIso (pullbackObjUnitToUnit φ) := by |
| 102 | + rw [isIso_iff_coyoneda_map_bijective] |
| 103 | + intro M |
| 104 | + rw [← ((pullbackPushforwardAdjunction.{u} φ).homEquiv _ _).bijective.of_comp_iff', |
| 105 | + ← (unitHomEquiv _).bijective.of_comp_iff'] |
| 106 | + convert (bijective_pushforwardSections φ M).comp (unitHomEquiv _).bijective |
| 107 | + ext f : 1 |
| 108 | + dsimp |
| 109 | + rw [pushforwardSections_unitHomEquiv, EmbeddingLike.apply_eq_iff_eq, |
| 110 | + Adjunction.homEquiv_naturality_right, |
| 111 | + pullbackPushforwardAdjunction_homEquiv_pullbackObjUnitToUnit] |
| 112 | + |
| 113 | +variable [HasWeakSheafify J AddCommGrpCat.{u}] [HasWeakSheafify K AddCommGrpCat.{u}] |
| 114 | + [J.WEqualsLocallyBijective AddCommGrpCat.{u}] |
| 115 | + [K.WEqualsLocallyBijective AddCommGrpCat.{u}] [F.Final] |
| 116 | + |
| 117 | +/-- The pullback of a free sheaf of modules is a free sheaf of modules. -/ |
| 118 | +noncomputable def pullbackObjFreeIso (I : Type u) : |
| 119 | + (pullback φ).obj (free I) ≅ free I := |
| 120 | + (asIso (sigmaComparison _ _)).symm ≪≫ |
| 121 | + Sigma.mapIso (fun _ ↦ asIso (pullbackObjUnitToUnit φ)) |
| 122 | + |
| 123 | +@[reassoc (attr := simp)] |
| 124 | +lemma pullback_map_ιFree_comp_pullbackObjFreeIso_hom {I : Type u} (i : I) : |
| 125 | + (pullback φ).map (ιFree i) ≫ (pullbackObjFreeIso φ I).hom = |
| 126 | + pullbackObjUnitToUnit φ ≫ ιFree i := by |
| 127 | + simp [pullbackObjFreeIso, ιFree] |
| 128 | + |
| 129 | +@[reassoc (attr := simp)] |
| 130 | +lemma pullbackObjFreeIso_hom_naturality {I J : Type u} (f : I → J) : |
| 131 | + (pullback φ).map (freeMap f) ≫ (pullbackObjFreeIso φ J).hom = |
| 132 | + (pullbackObjFreeIso φ I).hom ≫ freeMap f := |
| 133 | + Cofan.IsColimit.hom_ext (isColimitCofanMkObjOfIsColimit (pullback φ) _ _ |
| 134 | + (isColimitFreeCofan (R := S) I)) _ _ (fun i ↦ by simp [← Functor.map_comp_assoc]) |
| 135 | + |
| 136 | +/-- The canonical isomorphism `freeFunctor ⋙ pullback φ ≅ freeFunctor` for a |
| 137 | +continuous map between ringed sites, when the underlying functor between the sites |
| 138 | +is final. -/ |
| 139 | +noncomputable def freeFunctorCompPullbackIso : freeFunctor ⋙ pullback φ ≅ freeFunctor := |
| 140 | + NatIso.ofComponents (pullbackObjFreeIso φ) |
| 141 | + |
| 142 | +end SheafOfModules |
0 commit comments