Theorem: TopCat.Presheaf.generateEquivalenceOpensLe_counitIso
File: Mathlib/Topology/Sheaves/SheafCondition/OpensLeCover.lean

Proof steps:
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ ∀ (X_1 : FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom),
    (𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).obj X_1 =
      (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).obj X_1
state_after: case mk.mk
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
left✝ : Opens ↑X
right✝ : Discrete PUnit.{1}
hom✝ : (𝟭 (Opens ↑X)).obj left✝ ⟶ (Functor.fromPUnit Y).obj right✝
property✝ : (Sieve.generate (presieveOfCoveringAux U Y)).arrows { left := left✝, right := right✝, hom := hom✝ }.hom
⊢ (𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).obj
      { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ } =
    (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).obj
      { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ }
tactic: rintro ⟨⟨_, _⟩, _⟩
state_before: case mk.mk
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
left✝ : Opens ↑X
right✝ : Discrete PUnit.{1}
hom✝ : (𝟭 (Opens ↑X)).obj left✝ ⟶ (Functor.fromPUnit Y).obj right✝
property✝ : (Sieve.generate (presieveOfCoveringAux U Y)).arrows { left := left✝, right := right✝, hom := hom✝ }.hom
⊢ (𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).obj
      { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ } =
    (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).obj
      { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ }
state_after: case mk.mk
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
left✝ : Opens ↑X
right✝ : Discrete PUnit.{1}
hom✝ : (𝟭 (Opens ↑X)).obj left✝ ⟶ (Functor.fromPUnit Y).obj right✝
property✝ : (Sieve.generate (presieveOfCoveringAux U Y)).arrows { left := left✝, right := right✝, hom := hom✝ }.hom
⊢ { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ } =
    (generateEquivalenceOpensLe_inverse' U ?m.36432).obj
      ((generateEquivalenceOpensLe_functor' U ?m.36385).obj
        { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ })
tactic: dsimp
state_before: case mk.mk
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
left✝ : Opens ↑X
right✝ : Discrete PUnit.{1}
hom✝ : (𝟭 (Opens ↑X)).obj left✝ ⟶ (Functor.fromPUnit Y).obj right✝
property✝ : (Sieve.generate (presieveOfCoveringAux U Y)).arrows { left := left✝, right := right✝, hom := hom✝ }.hom
⊢ { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ } =
    (generateEquivalenceOpensLe_inverse' U ?m.36432).obj
      ((generateEquivalenceOpensLe_functor' U ?m.36385).obj
        { obj := { left := left✝, right := right✝, hom := hom✝ }, property := property✝ })
state_after: no goals
tactic: congr
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ ∀ (X_1 Y_1 : FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom) (f : X_1 ⟶ Y_1),
    (𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).map f =
      eqToHom ⋯ ≫
        (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).map f ≫
          eqToHom ⋯
state_after: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ Y✝ : FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom
f✝ : X✝ ⟶ Y✝
⊢ (𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).map f✝ =
    eqToHom ⋯ ≫
      (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).map f✝ ≫
        eqToHom ⋯
tactic: intros
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ Y✝ : FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom
f✝ : X✝ ⟶ Y✝
⊢ (𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).map f✝ =
    eqToHom ⋯ ≫
      (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).map f✝ ≫
        eqToHom ⋯
state_after: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ Y✝ : FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom
f✝ : X✝ ⟶ Y✝
⊢ ((𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).map f✝).left =
    (eqToHom ⋯ ≫
        (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).map f✝ ≫
          eqToHom ⋯).left
tactic: refine Over.OverMorphism.ext ?_
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ Y✝ : FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom
f✝ : X✝ ⟶ Y✝
⊢ ((𝟭 (FullSubcategory fun f => (Sieve.generate (presieveOfCoveringAux U Y)).arrows f.hom)).map f✝).left =
    (eqToHom ⋯ ≫
        (generateEquivalenceOpensLe_functor' U ?m.36385 ⋙ generateEquivalenceOpensLe_inverse' U ?m.36432).map f✝ ≫
          eqToHom ⋯).left
state_after: no goals
tactic: aesop_cat
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ ∀ (X_1 : OpensLeCover U),
    (generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).obj X_1 =
      (𝟭 (OpensLeCover U)).obj X_1
state_after: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ : OpensLeCover U
⊢ (generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).obj X✝ =
    (𝟭 (OpensLeCover U)).obj X✝
tactic: intro
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ : OpensLeCover U
⊢ (generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).obj X✝ =
    (𝟭 (OpensLeCover U)).obj X✝
state_after: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ : OpensLeCover U
⊢ ((generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).obj X✝).obj =
    ((𝟭 (OpensLeCover U)).obj X✝).obj
tactic: refine FullSubcategory.ext _ _ ?_
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ : OpensLeCover U
⊢ ((generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).obj X✝).obj =
    ((𝟭 (OpensLeCover U)).obj X✝).obj
state_after: no goals
tactic: rfl
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ ∀ (X_1 Y_1 : OpensLeCover U) (f : X_1 ⟶ Y_1),
    HEq ((generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).map f)
      ((𝟭 (OpensLeCover U)).map f)
state_after: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ Y✝ : OpensLeCover U
f✝ : X✝ ⟶ Y✝
⊢ HEq ((generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).map f✝)
    ((𝟭 (OpensLeCover U)).map f✝)
tactic: intros
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
X✝ Y✝ : OpensLeCover U
f✝ : X✝ ⟶ Y✝
⊢ HEq ((generateEquivalenceOpensLe_inverse' U ⋯ ⋙ generateEquivalenceOpensLe_functor' U ⋯).map f✝)
    ((𝟭 (OpensLeCover U)).map f✝)
state_after: no goals
tactic: rfl