import Mathlib import Definitions.Def_PresheafOfModules_InternalHom import Theorems.Thm_PresheafOfModules_isMonoidal_inverseImage_W_toPresheaf 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}] abbrev ringSheaf : Sheaf J RingCat.{u} := ⟨π’ͺ β‹™ forgetβ‚‚ CommRingCat RingCat, hπ’ͺ⟩ abbrev PMod := PresheafOfModules.{u} (π’ͺ β‹™ forgetβ‚‚ CommRingCat RingCat) abbrev presheafW (J : GrothendieckTopology C) (π’ͺ : Cα΅’α΅– β₯€ CommRingCat.{u}) : MorphismProperty (PMod π’ͺ) := (J.W (A := AddCommGrpCat.{u})).inverseImage (PresheafOfModules.toPresheaf (π’ͺ β‹™ forgetβ‚‚ CommRingCat RingCat)) abbrev sheafifyFunctor : PMod π’ͺ β₯€ SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ) := PresheafOfModules.sheafification (R := ringSheaf π’ͺ hπ’ͺ) (πŸ™ (π’ͺ β‹™ forgetβ‚‚ CommRingCat RingCat)) abbrev toPMod : SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ) β₯€ PMod π’ͺ := SheafOfModules.forget (ringSheaf π’ͺ hπ’ͺ) β‹™ PresheafOfModules.restrictScalars (πŸ™ (π’ͺ β‹™ forgetβ‚‚ CommRingCat RingCat)) abbrev sheafifyAdj : sheafifyFunctor π’ͺ hπ’ͺ ⊣ toPMod π’ͺ hπ’ͺ := PresheafOfModules.sheafificationAdjunction (R := ringSheaf π’ͺ hπ’ͺ) (πŸ™ (π’ͺ β‹™ forgetβ‚‚ CommRingCat RingCat)) instance : (toPMod π’ͺ hπ’ͺ).Faithful := (sheafifyAdj π’ͺ hπ’ͺ).fullyFaithfulROfIsIsoCounit.faithful instance : (toPMod π’ͺ hπ’ͺ).Full := (sheafifyAdj π’ͺ hπ’ͺ).fullyFaithfulROfIsIsoCounit.full instance : (sheafifyFunctor π’ͺ hπ’ͺ).IsLocalization (presheafW J π’ͺ) := inferInstance include hπ’ͺ in theorem presheafW_isMonoidal : (presheafW J π’ͺ).IsMonoidal := PresheafOfModules.isMonoidal_inverseImage_W_toPresheaf π’ͺ (ringSheaf π’ͺ hπ’ͺ) (πŸ™ _) def sheafifyCounitIso (M : SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) : (sheafifyFunctor π’ͺ hπ’ͺ).obj ((toPMod π’ͺ hπ’ͺ).obj M) β‰… M := (asIso (sheafifyAdj π’ͺ hπ’ͺ).counit).app M variable [J.HasSheafCompose (forgetβ‚‚ RingCat.{u} AddCommGrpCat.{u})] set_option backward.isDefEq.respectTransparency false in def sheafifyUnitIso : (sheafifyFunctor π’ͺ hπ’ͺ).obj (πŸ™_ (PMod π’ͺ)) β‰… (unit (ringSheaf π’ͺ hπ’ͺ) : SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) := sheafifyCounitIso π’ͺ hπ’ͺ (unit (ringSheaf π’ͺ hπ’ͺ)) instance monoidalCategory : MonoidalCategory (SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) := letI := presheafW_isMonoidal π’ͺ hπ’ͺ inferInstanceAs (MonoidalCategory (LocalizedMonoidal (L := sheafifyFunctor π’ͺ hπ’ͺ) (W := presheafW J π’ͺ) (sheafifyUnitIso π’ͺ hπ’ͺ))) instance symmetricCategory : SymmetricCategory (SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) := letI := presheafW_isMonoidal π’ͺ hπ’ͺ inferInstanceAs (SymmetricCategory (LocalizedMonoidal (L := sheafifyFunctor π’ͺ hπ’ͺ) (W := presheafW J π’ͺ) (sheafifyUnitIso π’ͺ hπ’ͺ))) instance sheafifyFunctor_monoidal : (sheafifyFunctor π’ͺ hπ’ͺ).Monoidal := letI := presheafW_isMonoidal π’ͺ hπ’ͺ inferInstanceAs (Localization.Monoidal.toMonoidalCategory (L := sheafifyFunctor π’ͺ hπ’ͺ) (W := presheafW J π’ͺ) (sheafifyUnitIso π’ͺ hπ’ͺ)).Monoidal @[simp] theorem tensorUnit_eq : πŸ™_ (SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) = unit _ := rfl instance monoidalClosed : MonoidalClosed (SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) := Monoidal.Reflective.monoidalClosed (sheafifyAdj π’ͺ hπ’ͺ) def tensorIsoSheafify (L M : SheafOfModules.{u} (ringSheaf π’ͺ hπ’ͺ)) : (sheafifyFunctor π’ͺ hπ’ͺ).obj (L.val βŠ— M.val) β‰… L βŠ— M := (Functor.Monoidal.ΞΌIso (sheafifyFunctor π’ͺ hπ’ͺ) L.val M.val).symm β‰ͺ≫ (sheafifyCounitIso π’ͺ hπ’ͺ L βŠ—α΅’ sheafifyCounitIso π’ͺ hπ’ͺ M) end SheafOfModules namespace AlgebraicGeometry variable (X : Scheme.{u}) instance Scheme.PresheafOfModules.monoidalCategory : MonoidalCategory X.PresheafOfModules := inferInstanceAs (MonoidalCategory (_root_.PresheafOfModules.{u} (X.sheaf.obj β‹™ forgetβ‚‚ CommRingCat RingCat))) instance Scheme.PresheafOfModules.symmetricCategory : SymmetricCategory X.PresheafOfModules := inferInstanceAs (SymmetricCategory (_root_.PresheafOfModules.{u} (X.sheaf.obj β‹™ forgetβ‚‚ CommRingCat RingCat))) instance Scheme.PresheafOfModules.monoidalClosed : MonoidalClosed X.PresheafOfModules := inferInstanceAs (MonoidalClosed (_root_.PresheafOfModules.{u} (X.sheaf.obj β‹™ forgetβ‚‚ CommRingCat RingCat))) instance Scheme.Modules.monoidalCategory : MonoidalCategory X.Modules := inferInstanceAs (MonoidalCategory (SheafOfModules.{u} (SheafOfModules.ringSheaf X.sheaf.obj X.ringCatSheaf.property))) instance Scheme.Modules.symmetricCategory : SymmetricCategory X.Modules := inferInstanceAs (SymmetricCategory (SheafOfModules.{u} (SheafOfModules.ringSheaf X.sheaf.obj X.ringCatSheaf.property))) instance Scheme.Modules.monoidalClosed : MonoidalClosed X.Modules := inferInstanceAs (MonoidalClosed (SheafOfModules.{u} (SheafOfModules.ringSheaf X.sheaf.obj X.ringCatSheaf.property))) variable {X} abbrev Scheme.Modules.tensor (L M : X.Modules) : X.Modules := L βŠ— M abbrev Scheme.Modules.dual (L : X.Modules) : X.Modules := (ihom L).obj (πŸ™_ X.Modules) @[simp] theorem Scheme.Modules.tensorUnit_eq : πŸ™_ X.Modules = SheafOfModules.unit X.ringCatSheaf := rfl variable (X) in abbrev Scheme.Modules.sheafify : X.PresheafOfModules β₯€ X.Modules := SheafOfModules.sheafifyFunctor X.sheaf.obj X.ringCatSheaf.property instance : (Scheme.Modules.sheafify X).Monoidal := inferInstanceAs (SheafOfModules.sheafifyFunctor X.sheaf.obj X.ringCatSheaf.property).Monoidal def Scheme.Modules.tensorIsoSheafify (L M : X.Modules) : (Scheme.Modules.sheafify X).obj (L.val βŠ— M.val) β‰… L βŠ— M := SheafOfModules.tensorIsoSheafify X.sheaf.obj X.ringCatSheaf.property L M end AlgebraicGeometry end