Theorem: CategoryTheory.GrothendieckTopology.sheafToPresheaf_map_sheafComposeNatTrans_eq_sheafifyCompIso_inv
File: Mathlib/CategoryTheory/Sites/PreservesSheafification.lean

Proof steps:
state_before: C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
⊢ (sheafToPresheaf J E).map ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P) =
    (J.sheafifyCompIso F P).inv
state_after: C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
⊢ (sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P =
    { val := (J.sheafifyCompIso F P).inv }
tactic: suffices (sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P =
    ⟨(sheafifyCompIso J F P).inv⟩ by
    rw [this]
    rfl
state_before: C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
⊢ (sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P =
    { val := (J.sheafifyCompIso F P).inv }
state_after: case a
C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
⊢ ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P) =
    ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      { val := (J.sheafifyCompIso F P).inv }
tactic: apply ((plusPlusAdjunction J E).homEquiv _ _).injective
state_before: case a
C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
⊢ ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P) =
    ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      { val := (J.sheafifyCompIso F P).inv }
state_after: case h.e'_2.h
C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
e_1✝ :
  (((whiskeringRight Cᵒᵖ D E).obj F).obj P ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P)) =
    ((𝟭 (Cᵒᵖ ⥤ E)).obj (P ⋙ F) ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
⊢ ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P) =
    (plusPlusAdjunction J E).unit.app (P ⋙ F) ≫
      (sheafToPresheaf J E).map ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P)

case h.e'_3.h
C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
e_1✝ :
  (((whiskeringRight Cᵒᵖ D E).obj F).obj P ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P)) =
    ((𝟭 (Cᵒᵖ ⥤ E)).obj (P ⋙ F) ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
⊢ ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      { val := (J.sheafifyCompIso F P).inv } =
    whiskerRight ((plusPlusAdjunction J D).unit.app P) F
tactic: convert sheafComposeNatTrans_fac J F (plusPlusAdjunction J D) (plusPlusAdjunction J E) P
state_before: case h.e'_2.h
C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
e_1✝ :
  (((whiskeringRight Cᵒᵖ D E).obj F).obj P ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P)) =
    ((𝟭 (Cᵒᵖ ⥤ E)).obj (P ⋙ F) ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
⊢ ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P) =
    (plusPlusAdjunction J E).unit.app (P ⋙ F) ≫
      (sheafToPresheaf J E).map ((sheafComposeNatTrans J F (plusPlusAdjunction J D) (plusPlusAdjunction J E)).app P)

case h.e'_3.h
C : Type u
inst✝¹⁸ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u_1
B : Type u_2
inst✝¹⁷ : Category.{?u.73757, u_1} A
inst✝¹⁶ : Category.{?u.73761, u_2} B
F✝ : A ⥤ B
D : Type u_3
E : Type u_4
inst✝¹⁵ : Category.{max v u, u_3} D
inst✝¹⁴ : Category.{max v u, u_4} E
F : D ⥤ E
inst✝¹³ : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) D
inst✝¹² : ∀ (α β : Type (max v u)) (fst snd : β → α), HasLimitsOfShape (WalkingMulticospan fst snd) E
inst✝¹¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝¹⁰ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ E
inst✝⁹ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ F
inst✝⁸ : (X : C) → (W : J.Cover X) → (P : Cᵒᵖ ⥤ D) → PreservesLimit (W.index P).multicospan F
inst✝⁷ : ConcreteCategory D
inst✝⁶ : ConcreteCategory E
inst✝⁵ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget D)
inst✝⁴ : (X : C) → PreservesColimitsOfShape (J.Cover X)ᵒᵖ (forget E)
inst✝³ : PreservesLimits (forget D)
inst✝² : PreservesLimits (forget E)
inst✝¹ : (forget D).ReflectsIsomorphisms
inst✝ : (forget E).ReflectsIsomorphisms
P : Cᵒᵖ ⥤ D
e_1✝ :
  (((whiskeringRight Cᵒᵖ D E).obj F).obj P ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P)) =
    ((𝟭 (Cᵒᵖ ⥤ E)).obj (P ⋙ F) ⟶ (sheafToPresheaf J E).obj ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
⊢ ((plusPlusAdjunction J E).homEquiv (((whiskeringRight Cᵒᵖ D E).obj F).obj P)
        ((plusPlusSheaf J D ⋙ sheafCompose J F).obj P))
      { val := (J.sheafifyCompIso F P).inv } =
    whiskerRight ((plusPlusAdjunction J D).unit.app P) F
state_after: no goals
tactic: all_goals
    dsimp [plusPlusAdjunction]
    simp