Theorem: CategoryTheory.Equalizer.Presieve.Arrows.SecondObj.ext
File: Mathlib/CategoryTheory/Sites/EqualizerSheafCondition.lean

Proof steps:
state_before: C : Type u
inst✝² : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type (max v u)
X✝¹ : C
R✝ : Presieve X✝¹
S✝ : Sieve X✝¹
inst✝¹ : R✝.hasPullbacks
P : Cᵒᵖ ⥤ Type w
X✝ : C
R : Presieve X✝
S : Sieve X✝
B : C
I : Type
X : I → C
π : (i : I) → X i ⟶ B
inst✝ : (Presieve.ofArrows X π).hasPullbacks
z₁ z₂ : SecondObj P X π
h :
  ∀ (ij : I × I),
    Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₁ =
      Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₂
⊢ z₁ = z₂
state_after: case w
C : Type u
inst✝² : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type (max v u)
X✝¹ : C
R✝ : Presieve X✝¹
S✝ : Sieve X✝¹
inst✝¹ : R✝.hasPullbacks
P : Cᵒᵖ ⥤ Type w
X✝ : C
R : Presieve X✝
S : Sieve X✝
B : C
I : Type
X : I → C
π : (i : I) → X i ⟶ B
inst✝ : (Presieve.ofArrows X π).hasPullbacks
z₁ z₂ : SecondObj P X π
h :
  ∀ (ij : I × I),
    Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₁ =
      Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₂
⊢ ∀ (j : Discrete (I × I)),
    limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) j z₁ =
      limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) j z₂
tactic: apply Limits.Types.limit_ext
state_before: case w
C : Type u
inst✝² : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type (max v u)
X✝¹ : C
R✝ : Presieve X✝¹
S✝ : Sieve X✝¹
inst✝¹ : R✝.hasPullbacks
P : Cᵒᵖ ⥤ Type w
X✝ : C
R : Presieve X✝
S : Sieve X✝
B : C
I : Type
X : I → C
π : (i : I) → X i ⟶ B
inst✝ : (Presieve.ofArrows X π).hasPullbacks
z₁ z₂ : SecondObj P X π
h :
  ∀ (ij : I × I),
    Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₁ =
      Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₂
⊢ ∀ (j : Discrete (I × I)),
    limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) j z₁ =
      limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) j z₂
state_after: case w.mk
C : Type u
inst✝² : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type (max v u)
X✝¹ : C
R✝ : Presieve X✝¹
S✝ : Sieve X✝¹
inst✝¹ : R✝.hasPullbacks
P : Cᵒᵖ ⥤ Type w
X✝ : C
R : Presieve X✝
S : Sieve X✝
B : C
I : Type
X : I → C
π : (i : I) → X i ⟶ B
inst✝ : (Presieve.ofArrows X π).hasPullbacks
z₁ z₂ : SecondObj P X π
h :
  ∀ (ij : I × I),
    Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₁ =
      Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₂
i : I × I
⊢ limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) { as := i } z₁ =
    limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) { as := i } z₂
tactic: rintro ⟨i⟩
state_before: case w.mk
C : Type u
inst✝² : Category.{v, u} C
P✝ : Cᵒᵖ ⥤ Type (max v u)
X✝¹ : C
R✝ : Presieve X✝¹
S✝ : Sieve X✝¹
inst✝¹ : R✝.hasPullbacks
P : Cᵒᵖ ⥤ Type w
X✝ : C
R : Presieve X✝
S : Sieve X✝
B : C
I : Type
X : I → C
π : (i : I) → X i ⟶ B
inst✝ : (Presieve.ofArrows X π).hasPullbacks
z₁ z₂ : SecondObj P X π
h :
  ∀ (ij : I × I),
    Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₁ =
      Pi.π (fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) ij z₂
i : I × I
⊢ limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) { as := i } z₁ =
    limit.π (Discrete.functor fun ij => P.obj (op (Limits.pullback (π ij.1) (π ij.2)))) { as := i } z₂
state_after: no goals
tactic: exact h i