import Mathlib import Definitions.Def_PresheafOfModules_InternalHom import Definitions.Def_SheafOfModules_Monoidal section InlinedTheorems section LinkageInlined_5b3a613b set_option autoImplicit false set_option backward.isDefEq.respectTransparency false universe u v' u' open CategoryTheory MonoidalCategory Limits Opposite noncomputable section namespace PresheafOfModules namespace InternalHom variable {C : Type u'} [Category.{v'} C] {R : Cᵒᵖ ⥤ CommRingCat.{u}} (F N : PresheafOfModules.{u} (R ⋙ forget₂ _ _)) private noncomputable def toPresheafHom (X : Cᵒᵖ) (φ : naturalFamilies F N X) : (presheafHom F.presheaf N.presheaf).obj X where app Y := AddCommGrpCat.ofHom (φ.1 Y.unop.hom.op).toAddMonoidHom naturality {Y Y'} k := by ext x change φ.1 Y'.unop.hom.op (F.map k.unop.left.op x) = N.map k.unop.left.op (φ.1 Y.unop.hom.op x) rw [φ.2 Y.unop.hom.op k.unop.left.op x] exact congr_app φ (by rw [← op_comp, Over.w]) _ variable {F N} in private abbrev appAt {X : Cᵒᵖ} (s : (presheafHom F.presheaf N.presheaf).obj X) (Y : (Over X.unop)ᵒᵖ) (x : F.obj (Opposite.op Y.unop.left)) : N.obj (Opposite.op Y.unop.left) := s.app Y x @[local simp] private lemma appAt_toPresheafHom (X : Cᵒᵖ) (φ : naturalFamilies F N X) (Y : (Over X.unop)ᵒᵖ) (x : F.obj (Opposite.op Y.unop.left)) : appAt (toPresheafHom F N X φ) Y x = φ.1 Y.unop.hom.op x := rfl private noncomputable def linearSub : Subfunctor (presheafHom F.presheaf N.presheaf) where obj X := { s | ∀ (Y : (Over X.unop)ᵒᵖ) (r : R.obj (Opposite.op Y.unop.left)) (x : F.obj (Opposite.op Y.unop.left)), appAt s Y (r • x) = r • appAt s Y x } map h _ hs Y r x := hs (Opposite.op ((Over.map h.unop).obj Y.unop)) r x private noncomputable def ofPresheafHom (X : Cᵒᵖ) (s : (linearSub F N).obj X) : naturalFamilies F N X := ⟨fun Y f => { toFun := fun x => appAt s.1 (Opposite.op (Over.mk f.unop)) x map_add' := fun x x' => (s.1.app _).hom.map_add _ _ map_smul' := fun r x => s.2 (Opposite.op (Over.mk f.unop)) r x }, by intro Y Z f g x change N.map g (appAt s.1 (Opposite.op (Over.mk f.unop)) x) = appAt s.1 (Opposite.op (Over.mk (g.unop ≫ f.unop))) (F.map g x) have := s.1.naturality (Over.homMk g.unop rfl : Over.mk (g.unop ≫ f.unop) ⟶ Over.mk f.unop).op exact (ConcreteCategory.congr_hom this x).symm⟩ private lemma ofPresheafHom_app (X : Cᵒᵖ) (s : (linearSub F N).obj X) {Y : Cᵒᵖ} (f : X ⟶ Y) (x : F.obj Y) : (ofPresheafHom F N X s).1 f x = appAt s.1 (Opposite.op (Over.mk f.unop)) x := rfl private noncomputable def equivLinearSub (X : Cᵒᵖ) : naturalFamilies F N X ≃ (linearSub F N).obj X where toFun φ := ⟨toPresheafHom F N X φ, fun Y r x => (φ.1 Y.unop.hom.op).map_smul r x⟩ invFun s := ofPresheafHom F N X s left_inv φ := by apply naturalFamilies_ext; intro Y f x; rfl right_inv s := by rfl private noncomputable def isoLinearSub : InternalHom.presheaf F N ⋙ forget AddCommGrpCat ≅ (linearSub F N).toFunctor := NatIso.ofComponents (fun X => (equivLinearSub F N X).toIso) (by intros; rfl) variable {F N} private lemma linearSub_local {J : GrothendieckTopology C} (hNsep : Presieve.IsSeparated J (N.presheaf ⋙ forget AddCommGrpCat)) (X : Cᵒᵖ) (s : (presheafHom F.presheaf N.presheaf).obj X) (hs : (linearSub F N).sieveOfSection s ∈ J X.unop) : s ∈ (linearSub F N).obj X := by intro Y r x obtain ⟨Y⟩ := Y apply (hNsep _ (J.pullback_stable Y.hom hs)).ext intro W k hk have nat : ∀ x' : F.obj (Opposite.op Y.left), appAt s (Opposite.op (Over.mk (k ≫ Y.hom))) (F.map k.op x') = N.map k.op (appAt s (Opposite.op Y) x') := fun x' => ConcreteCategory.congr_hom (s.naturality (Over.homMk k rfl : Over.mk (k ≫ Y.hom) ⟶ Y).op) x' have hlin : ∀ (ρ : R.obj (Opposite.op W)) (z : F.obj (Opposite.op W)), appAt s (Opposite.op (Over.mk (k ≫ Y.hom))) (ρ • z) = ρ • appAt s (Opposite.op (Over.mk (k ≫ Y.hom))) z := fun ρ z => by have h := hk (Opposite.op (Over.mk (𝟙 W))) ρ z have e := presheafHom_map_app_op_mk_id (F := F.presheaf) (G := N.presheaf) (k ≫ Y.hom) s dsimp only [appAt] at h ⊢ erw [e] at h exact h change N.map k.op (appAt s (Opposite.op Y) (r • x)) = N.map k.op (r • appAt s (Opposite.op Y) x) rw [← nat, N.map_smul, ← nat, F.map_smul] exact hlin _ _ end InternalHom end PresheafOfModules end private theorem PresheafOfModules.isSheaf_ihomObj_loc {C : Type u} [Category.{u} C] {R : Cᵒᵖ ⥤ CommRingCat.{u}} (F N : PresheafOfModules.{u} (R ⋙ forget₂ CommRingCat RingCat)) {J : GrothendieckTopology C} (hN : Presheaf.IsSheaf J N.presheaf) : Presheaf.IsSheaf J (PresheafOfModules.ihomObj F N).presheaf := by change Presheaf.IsSheaf J (PresheafOfModules.InternalHom.presheaf F N) rw [Presheaf.isSheaf_iff_isSheaf_comp J _ (forget AddCommGrpCat), isSheaf_iff_isSheaf_of_type] refine Presieve.isSheaf_iso J (PresheafOfModules.InternalHom.isoLinearSub F N).symm ?_ have hH : Presieve.IsSheaf J (presheafHom F.presheaf N.presheaf) := (isSheaf_iff_isSheaf_of_type _ _).1 (hN.hom F.presheaf) have hNsep : Presieve.IsSeparated J (N.presheaf ⋙ forget AddCommGrpCat) := ((isSheaf_iff_isSheaf_of_type _ _).1 ((Presheaf.isSheaf_iff_isSheaf_comp J N.presheaf (forget AddCommGrpCat)).1 hN)).isSeparated rw [(PresheafOfModules.InternalHom.linearSub F N).isSheaf_iff hH] intro X s hs exact PresheafOfModules.InternalHom.linearSub_local hNsep X s hs end LinkageInlined_5b3a613b section LinkageInlined_68107509 set_option autoImplicit false universe u open CategoryTheory MonoidalCategory Limits noncomputable section namespace PresheafOfModules.IsMonoidalW variable {C : Type u} [Category.{u} C] {J : GrothendieckTopology C} (𝒪 : Cᵒᵖ ⥤ CommRingCat.{u}) (R : Sheaf J RingCat.{u}) (α : 𝒪 ⋙ forget₂ CommRingCat RingCat ⟶ R.obj) [Presheaf.IsLocallyInjective J α] [Presheaf.IsLocallySurjective J α] [J.WEqualsLocallyBijective AddCommGrpCat.{u}] [HasWeakSheafify J AddCommGrpCat.{u}] private abbrev PMod := PresheafOfModules.{u} (𝒪 ⋙ forget₂ CommRingCat RingCat) private abbrev W : MorphismProperty (PMod 𝒪) := (J.W (A := AddCommGrpCat.{u})).inverseImage (PresheafOfModules.toPresheaf (𝒪 ⋙ forget₂ CommRingCat RingCat)) private abbrev shf : PMod 𝒪 ⥤ SheafOfModules.{u} R := PresheafOfModules.sheafification α private abbrev inc : SheafOfModules.{u} R ⥤ PMod 𝒪 := SheafOfModules.forget R ⋙ PresheafOfModules.restrictScalars α private abbrev adj : shf 𝒪 R α ⊣ inc 𝒪 R α := PresheafOfModules.sheafificationAdjunction α private local instance : (inc 𝒪 R α).Faithful := (adj 𝒪 R α).fullyFaithfulROfIsIsoCounit.faithful private local instance : (inc 𝒪 R α).Full := (adj 𝒪 R α).fullyFaithfulROfIsIsoCounit.full private lemma W_eq : W (J := J) 𝒪 = (MorphismProperty.isomorphisms _).inverseImage (shf 𝒪 R α) := PresheafOfModules.inverseImage_W_toPresheaf_eq_inverseImage_isomorphisms α private lemma isIso_unit_app_of_isSheaf (N : PMod 𝒪) (hN : Presheaf.IsSheaf J N.presheaf) : IsIso ((adj 𝒪 R α).unit.app N) := by have : IsIso ((PresheafOfModules.toPresheaf _).map ((adj 𝒪 R α).unit.app N)) := by rw [PresheafOfModules.toPresheaf_map_sheafificationAdjunction_unit_app] exact isIso_toSheafify J hN exact isIso_of_reflects_iso _ (PresheafOfModules.toPresheaf _) private lemma isIso_shf_map_unit_whiskerRight (d d' : PMod 𝒪) : IsIso ((shf 𝒪 R α).map (((adj 𝒪 R α).unit.app d) ▷ d')) := by have h := (Monoidal.Reflective.isIso_tfae (adj 𝒪 R α)).out 0 2 refine (h.mp ?_) d d' intro c d apply isIso_unit_app_of_isSheaf exact PresheafOfModules.isSheaf_ihomObj_loc _ _ c.isSheaf include R α in private lemma W_whiskerRight {d₁ d₂ : PMod 𝒪} (g : d₁ ⟶ d₂) (hg : W (J := J) 𝒪 g) (d' : PMod 𝒪) : W (J := J) 𝒪 (g ▷ d') := by have two3 : (W (J := J) 𝒪).HasTwoOutOfThreeProperty := by rw [W_eq 𝒪 R α]; infer_instance have hη : ∀ d : PMod 𝒪, W (J := J) 𝒪 ((adj 𝒪 R α).unit.app d ▷ d') := fun d => by rw [W_eq 𝒪 R α] exact isIso_shf_map_unit_whiskerRight 𝒪 R α d d' have hiso : W (J := J) 𝒪 ((inc 𝒪 R α).map ((shf 𝒪 R α).map g) ▷ d') := by rw [W_eq 𝒪 R α] at hg ⊢ simp only [MorphismProperty.inverseImage_iff, MorphismProperty.isomorphisms.iff] at hg ⊢ have : IsIso ((inc 𝒪 R α).map ((shf 𝒪 R α).map g)) := Functor.map_isIso _ _ infer_instance have e := (adj 𝒪 R α).unit_naturality g have hη₁ := hη d₁ have hη₂ := hη d₂ dsimp only [Functor.comp_obj, Functor.id_obj] at e hη₁ hη₂ hiso ⊢ have h' := (W (J := J) 𝒪).comp_mem _ _ hη₁ hiso rw [← comp_whiskerRight, e, comp_whiskerRight] at h' exact (W (J := J) 𝒪).of_postcomp _ _ hη₂ h' end PresheafOfModules.IsMonoidalW end open PresheafOfModules.IsMonoidalW in private theorem PresheafOfModules.isMonoidal_inverseImage_W_toPresheaf_loc {C : Type u} [Category.{u} C] {J : GrothendieckTopology C} (𝒪 : Cᵒᵖ ⥤ CommRingCat.{u}) (R : Sheaf J RingCat.{u}) (α : 𝒪 ⋙ forget₂ CommRingCat RingCat ⟶ R.obj) [Presheaf.IsLocallyInjective J α] [Presheaf.IsLocallySurjective J α] [J.WEqualsLocallyBijective AddCommGrpCat.{u}] [HasWeakSheafify J AddCommGrpCat.{u}] : ((J.W (A := AddCommGrpCat.{u})).inverseImage (PresheafOfModules.toPresheaf (𝒪 ⋙ forget₂ CommRingCat RingCat))).IsMonoidal where whiskerRight g hg d' := W_whiskerRight 𝒪 R α g hg d' whiskerLeft d g₁ g₂ g hg := ((W (J := J) 𝒪).arrow_mk_iso_iff (Arrow.isoMk' (g ▷ d) (d ◁ g) (β_ g₁ d) (β_ g₂ d) (BraidedCategory.braiding_naturality_left g d).symm)).1 (W_whiskerRight 𝒪 R α g hg d) end LinkageInlined_68107509 end InlinedTheorems set_option autoImplicit false universe u open CategoryTheory MonoidalCategory Limits noncomputable section namespace SheafOfModules variable {C : Type u} [Category.{u} C] {J : GrothendieckTopology C} (𝒪 : Cᵒᵖ ⥤ CommRingCat.{u}) (h𝒪 : Presheaf.IsSheaf J (𝒪 ⋙ forget₂ CommRingCat RingCat)) [J.WEqualsLocallyBijective AddCommGrpCat.{u}] [HasWeakSheafify J AddCommGrpCat.{u}] variable [J.HasSheafCompose (forget₂ RingCat.{u} AddCommGrpCat.{u})] end SheafOfModules namespace AlgebraicGeometry variable (X : Scheme.{u}) variable {X} end AlgebraicGeometry end