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

tactic: rw [Presieve.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
x : FirstObj P R
⊢ ((firstObjEqFamily P R).hom x).Compatible ↔ firstMap P R x = secondMap P R 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
x : FirstObj P R
⊢ ((firstObjEqFamily P R).hom x).PullbackCompatible ↔ firstMap P R x = secondMap P R 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
x : FirstObj P R
⊢ ((firstObjEqFamily P R).hom x).PullbackCompatible ↔ firstMap P R x = secondMap P R 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
x : FirstObj P R
⊢ ((firstObjEqFamily P R).hom x).PullbackCompatible → firstMap P R x = secondMap P R 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
x : FirstObj P R
⊢ firstMap P R x = secondMap P R x → ((firstObjEqFamily P R).hom x).PullbackCompatible

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
x : FirstObj P R
⊢ ((firstObjEqFamily P R).hom x).PullbackCompatible → firstMap P R x = secondMap P R 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
x : FirstObj P R
t : ((firstObjEqFamily P R).hom x).PullbackCompatible
⊢ firstMap P R x = secondMap P R x

tactic: apply Limits.Types.limit_ext
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
x : FirstObj P R
t : ((firstObjEqFamily P R).hom x).PullbackCompatible
⊢ firstMap P R x = secondMap P R x
state_after: case mp.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
x : FirstObj P R
t : ((firstObjEqFamily P R).hom x).PullbackCompatible
⊢ ∀ (j : Discrete (((Y : C) × { f // R f }) × (Z : C) × { g // R g })),
    limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (firstMap P R x) =
      limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (secondMap P R x)

tactic: rintro ⟨⟨Y, f, hf⟩, Z, g, hg⟩
state_before: case mp.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
x : FirstObj P R
t : ((firstObjEqFamily P R).hom x).PullbackCompatible
⊢ ∀ (j : Discrete (((Y : C) × { f // R f }) × (Z : C) × { g // R g })),
    limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (firstMap P R x) =
      limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (secondMap P R x)
state_after: case mp.w.mk.mk.mk.mk.mk.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
x : FirstObj P R
t : ((firstObjEqFamily P R).hom x).PullbackCompatible
Y : C
f : Y ⟶ X
hf : R f
Z : C
g : Z ⟶ X
hg : R g
⊢ limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd })
      { as := (⟨Y, ⟨f, hf⟩⟩, ⟨Z, ⟨g, hg⟩⟩) } (firstMap P R x) =
    limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd })
      { as := (⟨Y, ⟨f, hf⟩⟩, ⟨Z, ⟨g, hg⟩⟩) } (secondMap P R x)

tactic: simpa [firstMap, secondMap] using t hf hg
state_before: case mp.w.mk.mk.mk.mk.mk.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
x : FirstObj P R
t : ((firstObjEqFamily P R).hom x).PullbackCompatible
Y : C
f : Y ⟶ X
hf : R f
Z : C
g : Z ⟶ X
hg : R g
⊢ limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd })
      { as := (⟨Y, ⟨f, hf⟩⟩, ⟨Z, ⟨g, hg⟩⟩) } (firstMap P R x) =
    limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd })
      { as := (⟨Y, ⟨f, hf⟩⟩, ⟨Z, ⟨g, hg⟩⟩) } (secondMap P R x)
state_after: no goals

tactic: intro t Y Z f g hf hg
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
x : FirstObj P R
⊢ firstMap P R x = secondMap P R x → ((firstObjEqFamily P R).hom x).PullbackCompatible
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
x : FirstObj P R
t : firstMap P R x = secondMap P R x
Y Z : C
f : Y ⟶ X
g : Z ⟶ X
hf : R f
hg : R g
⊢ P.map pullback.fst.op ((firstObjEqFamily P R).hom x f hf) = P.map pullback.snd.op ((firstObjEqFamily P R).hom x g hg)

tactic: rw [Types.limit_ext_iff'] 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
x : FirstObj P R
t : firstMap P R x = secondMap P R x
Y Z : C
f : Y ⟶ X
g : Z ⟶ X
hf : R f
hg : R g
⊢ P.map pullback.fst.op ((firstObjEqFamily P R).hom x f hf) = P.map pullback.snd.op ((firstObjEqFamily P R).hom x g hg)
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
x : FirstObj P R
t :
  ∀ (j : Discrete (((Y : C) × { f // R f }) × (Z : C) × { g // R g })),
    limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (firstMap P R x) =
      limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (secondMap P R x)
Y Z : C
f : Y ⟶ X
g : Z ⟶ X
hf : R f
hg : R g
⊢ P.map pullback.fst.op ((firstObjEqFamily P R).hom x f hf) = P.map pullback.snd.op ((firstObjEqFamily P R).hom x g hg)

tactic: simpa [firstMap, secondMap] using t ⟨⟨⟨Y, f, hf⟩, Z, g, hg⟩⟩
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
x : FirstObj P R
t :
  ∀ (j : Discrete (((Y : C) × { f // R f }) × (Z : C) × { g // R g })),
    limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (firstMap P R x) =
      limit.π (Discrete.functor fun fg => P.obj { unop := Limits.pullback ↑fg.1.snd ↑fg.2.snd }) j (secondMap P R x)
Y Z : C
f : Y ⟶ X
g : Z ⟶ X
hf : R f
hg : R g
⊢ P.map pullback.fst.op ((firstObjEqFamily P R).hom x f hf) = P.map pullback.snd.op ((firstObjEqFamily P R).hom x g hg)
state_after: no goals