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

tactic: apply Limits.Types.limit_ext
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 { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₁ =
      Pi.π (fun ij => P.obj { unop := 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 { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₁ =
      Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₂
⊢ ∀ (j : Discrete (I × I)),
    limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) j z₁ =
      limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) j z₂

tactic: rintro ⟨i⟩
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 { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₁ =
      Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₂
⊢ ∀ (j : Discrete (I × I)),
    limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) j z₁ =
      limit.π (Discrete.functor fun ij => P.obj { unop := 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 { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₁ =
      Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₂
i : I × I
⊢ limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) { as := i } z₁ =
    limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) { as := i } z₂

tactic: exact h 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 { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₁ =
      Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij z₂
i : I × I
⊢ limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) { as := i } z₁ =
    limit.π (Discrete.functor fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) { as := i } z₂
state_after: no goals