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

tactic: rw [Arrows.pullbackCompatible_iff]
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
x : FirstObj P X
⊢ Arrows.Compatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x) ↔ firstMap P X π x = secondMap P X π x
state_after: 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
x : FirstObj P X
⊢ Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x) ↔
    firstMap P X π x = secondMap P X π x

tactic: constructor
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
x : FirstObj P X
⊢ Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x) ↔
    firstMap P X π x = secondMap P X π x
state_after: case mp
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
x : FirstObj P X
⊢ Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x) →
    firstMap P X π x = secondMap P X π x

case mpr
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
x : FirstObj P X
⊢ firstMap P X π x = secondMap P X π x →
    Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x)

tactic: intro t
state_before: case mp
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
x : FirstObj P X
⊢ Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x) →
    firstMap P X π x = secondMap P X π x
state_after: case mp
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
x : FirstObj P X
t : Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x)
⊢ firstMap P X π x = secondMap P X π x

tactic: ext ij
state_before: case mp
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
x : FirstObj P X
t : Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x)
⊢ firstMap P X π x = secondMap P X π x
state_after: case mp.h
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
x : FirstObj P X
t : Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x)
ij : I × I
⊢ Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij (firstMap P X π x) =
    Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij (secondMap P X π x)

tactic: simpa [firstMap, secondMap] using t ij.1 ij.2
state_before: case mp.h
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
x : FirstObj P X
t : Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x)
ij : I × I
⊢ Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij (firstMap P X π x) =
    Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) ij (secondMap P X π x)
state_after: no goals

tactic: intro t i j
state_before: case mpr
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
x : FirstObj P X
⊢ firstMap P X π x = secondMap P X π x →
    Arrows.PullbackCompatible P π ((Types.productIso fun i => P.obj { unop := X i }).hom x)
state_after: case mpr
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
x : FirstObj P X
t : firstMap P X π x = secondMap P X π x
i j : I
⊢ P.map pullback.fst.op ((Types.productIso fun i => P.obj { unop := X i }).hom x i) =
    P.map pullback.snd.op ((Types.productIso fun i => P.obj { unop := X i }).hom x j)

tactic: apply_fun Pi.π (fun (ij : I × I) ↦ P.obj (op (pullback (π ij.1) (π ij.2)))) ⟨i, j⟩ at t
state_before: case mpr
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
x : FirstObj P X
t : firstMap P X π x = secondMap P X π x
i j : I
⊢ P.map pullback.fst.op ((Types.productIso fun i => P.obj { unop := X i }).hom x i) =
    P.map pullback.snd.op ((Types.productIso fun i => P.obj { unop := X i }).hom x j)
state_after: case mpr
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
x : FirstObj P X
i j : I
t :
  Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) (i, j) (firstMap P X π x) =
    Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) (i, j) (secondMap P X π x)
⊢ P.map pullback.fst.op ((Types.productIso fun i => P.obj { unop := X i }).hom x i) =
    P.map pullback.snd.op ((Types.productIso fun i => P.obj { unop := X i }).hom x j)

tactic: simpa [firstMap, secondMap] using t
state_before: case mpr
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
x : FirstObj P X
i j : I
t :
  Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) (i, j) (firstMap P X π x) =
    Pi.π (fun ij => P.obj { unop := Limits.pullback (π ij.1) (π ij.2) }) (i, j) (secondMap P X π x)
⊢ P.map pullback.fst.op ((Types.productIso fun i => P.obj { unop := X i }).hom x i) =
    P.map pullback.snd.op ((Types.productIso fun i => P.obj { unop := X i }).hom x j)
state_after: no goals