File: Mathlib/CategoryTheory/Sites/Preserves.lean

full_name: CategoryTheory.Presieve.isTerminal_of_isSheafFor_empty_presieve
code: /--
If `F` is a presheaf which satisfies the sheaf condition with respect to the empty presieve on any
object, then `F` takes that object to the terminal object.
-/
noncomputable
def isTerminal_of_isSheafFor_empty_presieve : IsTerminal (F.obj (op I)) 
goal: CategoryTheory.Limits.IsTerminal (F.obj (Opposite.op I))

full_name: CategoryTheory.Presieve.preservesTerminalOfIsSheafForEmpty
code: /--
If `F` is a presheaf which satisfies the sheaf condition with respect to the empty presieve on the
initial object, then `F` preserves terminal objects.
-/
noncomputable
def preservesTerminalOfIsSheafForEmpty (hI : IsInitial I) : PreservesLimit (Functor.empty Cᵒᵖ) F 
goal: CategoryTheory.Limits.PreservesLimit (CategoryTheory.Functor.empty Cᵒᵖ) F

full_name: CategoryTheory.Presieve.firstMap_eq_secondMap
code: /--
The two parallel maps in the equalizer diagram for the sheaf condition corresponding to the
inclusion maps in a disjoint coproduct are equal.
-/
theorem firstMap_eq_secondMap : Equalizer.Presieve.Arrows.firstMap F X c.inj =
    Equalizer.Presieve.Arrows.secondMap F X c.inj 
goal: CategoryTheory.Equalizer.Presieve.Arrows.firstMap F X c.inj =
  CategoryTheory.Equalizer.Presieve.Arrows.secondMap F X c.inj

full_name: CategoryTheory.Presieve.piComparison_fac
code: theorem piComparison_fac :
    have : HasCoproduct X := ⟨⟨c, hc⟩⟩
    piComparison F (fun x ↦ op (X x)) = F.map (opCoproductIsoProduct' hc (productIsProduct _)).inv ≫
    Equalizer.Presieve.Arrows.forkMap F X c.inj 
goal: let_fun this := ⋯;
(CategoryTheory.Limits.piComparison F fun x => Opposite.op (X x)) =
  CategoryTheory.CategoryStruct.comp
    (F.map
      (CategoryTheory.Limits.opCoproductIsoProduct' hc
          (CategoryTheory.Limits.productIsProduct fun x => Opposite.op (X x))).inv)
    (CategoryTheory.Equalizer.Presieve.Arrows.forkMap F X c.inj)

full_name: CategoryTheory.Presieve.preservesProductOfIsSheafFor
code: /--
If `F` is a presheaf which `IsSheafFor` a presieve of arrows and the empty presieve, then it
preserves the product corresponding to the presieve of arrows.
-/
noncomputable
def preservesProductOfIsSheafFor (hF' : (ofArrows X c.inj).IsSheafFor F) :
    PreservesLimit (Discrete.functor (fun x ↦ op (X x))) F 
goal: CategoryTheory.Limits.PreservesLimit (CategoryTheory.Discrete.functor fun x => Opposite.op (X x)) F

full_name: CategoryTheory.Presieve.isSheafFor_of_preservesProduct
code: /--
If `F` preserves a particular product, then it `IsSheafFor` the corresponging presieve of arrows.
-/
theorem isSheafFor_of_preservesProduct [PreservesLimit (Discrete.functor (fun x ↦ op (X x))) F] :
    (ofArrows X c.inj).IsSheafFor F 
goal: CategoryTheory.Presieve.IsSheafFor F (CategoryTheory.Presieve.ofArrows X c.inj)

full_name: CategoryTheory.Presieve.isSheafFor_iff_preservesProduct
code: theorem isSheafFor_iff_preservesProduct : (ofArrows X c.inj).IsSheafFor F ↔
    Nonempty (PreservesLimit (Discrete.functor (fun x ↦ op (X x))) F) 
goal: CategoryTheory.Presieve.IsSheafFor F (CategoryTheory.Presieve.ofArrows X c.inj) ↔
  Nonempty (CategoryTheory.Limits.PreservesLimit (CategoryTheory.Discrete.functor fun x => Opposite.op (X x)) F)