l3lab/ntp-mathlib huggingface dataset:
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                

Proof state:
case zero
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c : Cone (SheafConditionEqualizerProducts.diagram F U)
⊢ 𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt ≫
      ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).π.app WalkingParallelPair.zero =
    ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).π.app WalkingParallelPair.zero

Next tactic:
refine limit.hom_ext fun ⟨j⟩ => ?_
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                

Proof state:
case zero
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c : Cone (SheafConditionEqualizerProducts.diagram F U)
x✝ : Discrete ι
j : ι
⊢ (𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt ≫
        ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).π.app WalkingParallelPair.zero) ≫
      limit.π (Discrete.functor fun i => F.obj (op (U i))) { as := j } =
    ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).π.app WalkingParallelPair.zero ≫
      limit.π (Discrete.functor fun i => F.obj (op (U i))) { as := j }

Next tactic:
dsimp [coneEquivInverse]
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                

Proof state:
case zero
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c : Cone (SheafConditionEqualizerProducts.diagram F U)
x✝ : Discrete ι
j : ι
⊢ (𝟙 c.pt ≫ Pi.lift fun i => Fork.ι c ≫ Pi.π (fun i => F.obj (op (U i))) i) ≫
      limit.π (Discrete.functor fun i => F.obj (op (U i))) { as := j } =
    Fork.ι c ≫ limit.π (Discrete.functor fun i => F.obj (op (U i))) { as := j }

Next tactic:
simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                

Proof state:
case one
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c : Cone (SheafConditionEqualizerProducts.diagram F U)
⊢ 𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt ≫
      ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).π.app WalkingParallelPair.one =
    ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).π.app WalkingParallelPair.one

Next tactic:
refine limit.hom_ext fun ⟨i, j⟩ => ?_
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                

Proof state:
case one
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c : Cone (SheafConditionEqualizerProducts.diagram F U)
x✝ : Discrete (ι × ι)
i j : ι
⊢ (𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt ≫
        ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).π.app WalkingParallelPair.one) ≫
      limit.π (Discrete.functor fun p => F.obj (op (U p.1 ⊓ U p.2))) { as := (i, j) } =
    ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).π.app WalkingParallelPair.one ≫
      limit.π (Discrete.functor fun p => F.obj (op (U p.1 ⊓ U p.2))) { as := (i, j) }

Next tactic:
dsimp [coneEquivInverse]
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                

Proof state:
case one
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c : Cone (SheafConditionEqualizerProducts.diagram F U)
x✝ : Discrete (ι × ι)
i j : ι
⊢ (𝟙 c.pt ≫ Pi.lift fun b => c.π.app WalkingParallelPair.one ≫ Pi.π (fun p => F.obj (op (U p.1 ⊓ U p.2))) (b.1, b.2)) ≫
      limit.π (Discrete.functor fun p => F.obj (op (U p.1 ⊓ U p.2))) { as := (i, j) } =
    c.π.app WalkingParallelPair.one ≫ limit.π (Discrete.functor fun p => F.obj (op (U p.1 ⊓ U p.2))) { as := (i, j) }

Next tactic:
simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] } })
    fun {c d} f => by
    

Proof state:
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c d : Cone (SheafConditionEqualizerProducts.diagram F U)
f : c ⟶ d
⊢ (coneEquivInverse F U ⋙ coneEquivFunctor F U).map f ≫
      ((fun c =>
            Iso.mk (ConeMorphism.mk (𝟙 ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).pt))
              (ConeMorphism.mk (𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt)))
          d).hom =
    ((fun c =>
            Iso.mk (ConeMorphism.mk (𝟙 ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).pt))
              (ConeMorphism.mk (𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt)))
          c).hom ≫
      (𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).map f

Next tactic:
ext
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] } })
    fun {c d} f => by
    ext
    

Proof state:
case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c d : Cone (SheafConditionEqualizerProducts.diagram F U)
f : c ⟶ d
⊢ ((coneEquivInverse F U ⋙ coneEquivFunctor F U).map f ≫
        ((fun c =>
              Iso.mk (ConeMorphism.mk (𝟙 ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).pt))
                (ConeMorphism.mk (𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt)))
            d).hom).hom =
    (((fun c =>
              Iso.mk (ConeMorphism.mk (𝟙 ((coneEquivInverse F U ⋙ coneEquivFunctor F U).obj c).pt))
                (ConeMorphism.mk (𝟙 ((𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).obj c).pt)))
            c).hom ≫
        (𝟭 (Cone (SheafConditionEqualizerProducts.diagram F U))).map f).hom

Next tactic:
dsimp
/-- Implementation of `SheafConditionPairwiseIntersections.coneEquiv`. -/
@[simps!]
def coneEquivCounitIso :
    coneEquivInverse F U ⋙ coneEquivFunctor F U ≅
      𝟭 (Limits.Cone (SheafConditionEqualizerProducts.diagram F U)) :=
  NatIso.ofComponents
    (fun c =>
      { hom :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] }
        inv :=
          { hom := 𝟙 _
            w := by
              rintro ⟨_ | _⟩
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π]
              · -- Porting note : `ext` can't see `limit.hom_ext` applies here:
                -- See https://github.com/leanprover-community/mathlib4/issues/5229
                refine limit.hom_ext fun ⟨i, j⟩ => ?_
                dsimp [coneEquivInverse]
                simp only [Limits.Fan.mk_π_app, Category.id_comp, Limits.limit.lift_π] } })
    fun {c d} f => by
    ext
    dsimp
    

Proof state:
case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
c d : Cone (SheafConditionEqualizerProducts.diagram F U)
f : c ⟶ d
⊢ f.hom ≫ 𝟙 d.pt = 𝟙 c.pt ≫ f.hom

Next tactic:
simp only [Category.comp_id, Category.id_comp]
/-- If `SheafConditionEqualizerProducts.fork` is an equalizer,
then `F.mapCone (cone U)` is a limit cone.
-/
def isLimitMapConeOfIsLimitSheafConditionFork
    (P : IsLimit (SheafConditionEqualizerProducts.fork F U)) : IsLimit (F.mapCone (cocone U).op) :=
  IsLimit.ofIsoLimit ((IsLimit.ofConeEquiv (coneEquiv F U).symm).symm P)
    { hom :=
        { hom := 𝟙 _
          w := by
            

Proof state:
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
P : IsLimit (SheafConditionEqualizerProducts.fork F U)
⊢ ∀ (j : (CategoryTheory.Pairwise ι)ᵒᵖ),
    𝟙 ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).pt ≫
        (F.mapCone (Cocone.op (cocone U))).π.app j =
      ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).π.app j

Next tactic:
intro x
/-- If `SheafConditionEqualizerProducts.fork` is an equalizer,
then `F.mapCone (cone U)` is a limit cone.
-/
def isLimitMapConeOfIsLimitSheafConditionFork
    (P : IsLimit (SheafConditionEqualizerProducts.fork F U)) : IsLimit (F.mapCone (cocone U).op) :=
  IsLimit.ofIsoLimit ((IsLimit.ofConeEquiv (coneEquiv F U).symm).symm P)
    { hom :=
        { hom := 𝟙 _
          w := by
            intro x
            

Proof state:
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
P : IsLimit (SheafConditionEqualizerProducts.fork F U)
x : (CategoryTheory.Pairwise ι)ᵒᵖ
⊢ 𝟙 ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).pt ≫
      (F.mapCone (Cocone.op (cocone U))).π.app x =
    ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).π.app x

Next tactic:
induction x with | h x => ?_
/-- If `SheafConditionEqualizerProducts.fork` is an equalizer,
then `F.mapCone (cone U)` is a limit cone.
-/
def isLimitMapConeOfIsLimitSheafConditionFork
    (P : IsLimit (SheafConditionEqualizerProducts.fork F U)) : IsLimit (F.mapCone (cocone U).op) :=
  IsLimit.ofIsoLimit ((IsLimit.ofConeEquiv (coneEquiv F U).symm).symm P)
    { hom :=
        { hom := 𝟙 _
          w := by
            intro x
            induction x with | h x => ?_
            

Proof state:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
P : IsLimit (SheafConditionEqualizerProducts.fork F U)
x : CategoryTheory.Pairwise ι
⊢ 𝟙 ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).pt ≫
      (F.mapCone (Cocone.op (cocone U))).π.app (op x) =
    ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).π.app (op x)

Next tactic:
rcases x with ⟨⟩
/-- If `SheafConditionEqualizerProducts.fork` is an equalizer,
then `F.mapCone (cone U)` is a limit cone.
-/
def isLimitMapConeOfIsLimitSheafConditionFork
    (P : IsLimit (SheafConditionEqualizerProducts.fork F U)) : IsLimit (F.mapCone (cocone U).op) :=
  IsLimit.ofIsoLimit ((IsLimit.ofConeEquiv (coneEquiv F U).symm).symm P)
    { hom :=
        { hom := 𝟙 _
          w := by
            intro x
            induction x with | h x => ?_
            rcases x with ⟨⟩
            · 

Proof state:
case h.single
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasProducts C
X : TopCat
F : Presheaf C X
ι : Type v'
U : ι → Opens ↑X
P : IsLimit (SheafConditionEqualizerProducts.fork F U)
a✝ : ι
⊢ 𝟙 ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).pt ≫
      (F.mapCone (Cocone.op (cocone U))).π.app (op (single a✝)) =
    ((coneEquiv F U).symm.functor.obj (SheafConditionEqualizerProducts.fork F U)).π.app (op (single a✝))

Next tactic:
simp