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

tactic: rw [Presieve.compatible_iff_sieveCompatible]
state_before: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : FirstObj P S.arrows
⊢ ((firstObjEqFamily P S.arrows).hom x).Compatible ↔ firstMap P S x = secondMap P S 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
x : FirstObj P S.arrows
⊢ ((firstObjEqFamily P S.arrows).hom x).SieveCompatible ↔ firstMap P S x = secondMap P S 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
x : FirstObj P S.arrows
⊢ ((firstObjEqFamily P S.arrows).hom x).SieveCompatible ↔ firstMap P S x = secondMap P S 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
x : FirstObj P S.arrows
⊢ ((firstObjEqFamily P S.arrows).hom x).SieveCompatible → firstMap P S x = secondMap P S 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
x : FirstObj P S.arrows
⊢ firstMap P S x = secondMap P S x → ((firstObjEqFamily P S.arrows).hom x).SieveCompatible

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

tactic: apply SecondObj.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
x : FirstObj P S.arrows
t : ((firstObjEqFamily P S.arrows).hom x).SieveCompatible
⊢ firstMap P S x = secondMap P S 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
x : FirstObj P S.arrows
t : ((firstObjEqFamily P S.arrows).hom x).SieveCompatible
⊢ ∀ (Y Z : C) (g : Z ⟶ Y) (f : Y ⟶ X) (hf : S.arrows f),
    Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (firstMap P S x) =
      Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (secondMap P S x)

tactic: intros Y Z g f hf
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
x : FirstObj P S.arrows
t : ((firstObjEqFamily P S.arrows).hom x).SieveCompatible
⊢ ∀ (Y Z : C) (g : Z ⟶ Y) (f : Y ⟶ X) (hf : S.arrows f),
    Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (firstMap P S x) =
      Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (secondMap P S 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
x : FirstObj P S.arrows
t : ((firstObjEqFamily P S.arrows).hom x).SieveCompatible
Y Z : C
g : Z ⟶ Y
f : Y ⟶ X
hf : S.arrows f
⊢ Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (firstMap P S x) =
    Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (secondMap P S x)

tactic: simpa [firstMap, secondMap] using t _ g hf
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
x : FirstObj P S.arrows
t : ((firstObjEqFamily P S.arrows).hom x).SieveCompatible
Y Z : C
g : Z ⟶ Y
f : Y ⟶ X
hf : S.arrows f
⊢ Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (firstMap P S x) =
    Pi.π (fun f => P.obj { unop := f.snd.fst }) ⟨Y, ⟨Z, ⟨g, ⟨f, hf⟩⟩⟩⟩ (secondMap P S x)
state_after: no goals

tactic: intro t Y Z f g hf
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
x : FirstObj P S.arrows
⊢ firstMap P S x = secondMap P S x → ((firstObjEqFamily P S.arrows).hom x).SieveCompatible
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
x : FirstObj P S.arrows
t : firstMap P S x = secondMap P S x
Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
hf : S.arrows f
⊢ (firstObjEqFamily P S.arrows).hom x (g ≫ f) ⋯ = P.map g.op ((firstObjEqFamily P S.arrows).hom x f hf)

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
x : FirstObj P S.arrows
t : firstMap P S x = secondMap P S x
Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
hf : S.arrows f
⊢ (firstObjEqFamily P S.arrows).hom x (g ≫ f) ⋯ = P.map g.op ((firstObjEqFamily P S.arrows).hom x f hf)
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
x : FirstObj P S.arrows
t :
  ∀ (j : Discrete ((Y : C) × (Z : C) × (_ : Z ⟶ Y) × { f' // S.arrows f' })),
    limit.π (Discrete.functor fun f => P.obj { unop := f.snd.fst }) j (firstMap P S x) =
      limit.π (Discrete.functor fun f => P.obj { unop := f.snd.fst }) j (secondMap P S x)
Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
hf : S.arrows f
⊢ (firstObjEqFamily P S.arrows).hom x (g ≫ f) ⋯ = P.map g.op ((firstObjEqFamily P S.arrows).hom x f hf)

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