Theorem: CategoryTheory.Presheaf.IsSheaf.comp
File: Mathlib/CategoryTheory/Sites/Whiskering.lean

tactic: rw [Presheaf.isSheaf_iff_multifork] at hP⊢
state_before: C : Type u₁
inst✝³ : Category C
A : Type u₂
inst✝² : Category A
B : Type u₃
inst✝¹ : Category B
J : GrothendieckTopology C
U : C
R : Presieve U
F : A ⥤ B
inst✝ :
  (X : C) →
    (S : GrothendieckTopology.Cover J X) →
      (P : Cᵒᵖ ⥤ A) → PreservesLimit (MulticospanIndex.multicospan (GrothendieckTopology.Cover.index S P)) F
P : Cᵒᵖ ⥤ A
hP : IsSheaf J P
⊢ IsSheaf J (P ⋙ F)

tactic: intro X S
state_before: C : Type u₁
inst✝³ : Category C
A : Type u₂
inst✝² : Category A
B : Type u₃
inst✝¹ : Category B
J : GrothendieckTopology C
U : C
R : Presieve U
F : A ⥤ B
inst✝ :
  (X : C) →
    (S : GrothendieckTopology.Cover J X) →
      (P : Cᵒᵖ ⥤ A) → PreservesLimit (MulticospanIndex.multicospan (GrothendieckTopology.Cover.index S P)) F
P : Cᵒᵖ ⥤ A
hP : ∀ (X : C) (S : GrothendieckTopology.Cover J X), Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S P))
⊢ ∀ (X : C) (S : GrothendieckTopology.Cover J X), Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S (P ⋙ F)))

tactic: obtain ⟨h⟩ := hP X S
state_before: C : Type u₁
inst✝³ : Category C
A : Type u₂
inst✝² : Category A
B : Type u₃
inst✝¹ : Category B
J : GrothendieckTopology C
U : C
R : Presieve U
F : A ⥤ B
inst✝ :
  (X : C) →
    (S : GrothendieckTopology.Cover J X) →
      (P : Cᵒᵖ ⥤ A) → PreservesLimit (MulticospanIndex.multicospan (GrothendieckTopology.Cover.index S P)) F
P : Cᵒᵖ ⥤ A
hP : ∀ (X : C) (S : GrothendieckTopology.Cover J X), Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S P))
X : C
S : GrothendieckTopology.Cover J X
⊢ Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S (P ⋙ F)))

tactic: replace h := isLimitOfPreserves F h
state_before: case intro
C : Type u₁
inst✝³ : Category C
A : Type u₂
inst✝² : Category A
B : Type u₃
inst✝¹ : Category B
J : GrothendieckTopology C
U : C
R : Presieve U
F : A ⥤ B
inst✝ :
  (X : C) →
    (S : GrothendieckTopology.Cover J X) →
      (P : Cᵒᵖ ⥤ A) → PreservesLimit (MulticospanIndex.multicospan (GrothendieckTopology.Cover.index S P)) F
P : Cᵒᵖ ⥤ A
hP : ∀ (X : C) (S : GrothendieckTopology.Cover J X), Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S P))
X : C
S : GrothendieckTopology.Cover J X
h : IsLimit (GrothendieckTopology.Cover.multifork S P)
⊢ Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S (P ⋙ F)))

tactic: replace h := Limits.IsLimit.ofIsoLimit h (S.mapMultifork F P)
state_before: case intro
C : Type u₁
inst✝³ : Category C
A : Type u₂
inst✝² : Category A
B : Type u₃
inst✝¹ : Category B
J : GrothendieckTopology C
U : C
R : Presieve U
F : A ⥤ B
inst✝ :
  (X : C) →
    (S : GrothendieckTopology.Cover J X) →
      (P : Cᵒᵖ ⥤ A) → PreservesLimit (MulticospanIndex.multicospan (GrothendieckTopology.Cover.index S P)) F
P : Cᵒᵖ ⥤ A
hP : ∀ (X : C) (S : GrothendieckTopology.Cover J X), Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S P))
X : C
S : GrothendieckTopology.Cover J X
h : IsLimit (F.mapCone (GrothendieckTopology.Cover.multifork S P))
⊢ Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S (P ⋙ F)))

tactic: exact ⟨Limits.IsLimit.postcomposeHomEquiv (S.multicospanComp F P) _ h⟩
state_before: case intro
C : Type u₁
inst✝³ : Category C
A : Type u₂
inst✝² : Category A
B : Type u₃
inst✝¹ : Category B
J : GrothendieckTopology C
U : C
R : Presieve U
F : A ⥤ B
inst✝ :
  (X : C) →
    (S : GrothendieckTopology.Cover J X) →
      (P : Cᵒᵖ ⥤ A) → PreservesLimit (MulticospanIndex.multicospan (GrothendieckTopology.Cover.index S P)) F
P : Cᵒᵖ ⥤ A
hP : ∀ (X : C) (S : GrothendieckTopology.Cover J X), Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S P))
X : C
S : GrothendieckTopology.Cover J X
h :
  IsLimit
    ((Cones.postcompose (GrothendieckTopology.Cover.multicospanComp F P S).hom).obj
      (GrothendieckTopology.Cover.multifork S (P ⋙ F)))
⊢ Nonempty (IsLimit (GrothendieckTopology.Cover.multifork S (P ⋙ F)))