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

tactic: rw [Types.type_equalizer_iff_unique,
  ← Equiv.forall_congr_right (firstObjEqFamily P (S : Presieve X)).toEquiv.symm]
state_before: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ Presieve.IsSheafFor P S.arrows ↔ Nonempty (IsLimit (Fork.ofι (forkMap P S.arrows) ⋯))
state_after: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ Presieve.IsSheafFor P S.arrows ↔
    ∀ (a : Presieve.FamilyOfElements P S.arrows),
      firstMap P S ((firstObjEqFamily P S.arrows).toEquiv.symm a) =
          secondMap P S ((firstObjEqFamily P S.arrows).toEquiv.symm a) →
        ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).toEquiv.symm a

tactic: simp_rw [← compatible_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
⊢ Presieve.IsSheafFor P S.arrows ↔
    ∀ (a : Presieve.FamilyOfElements P S.arrows),
      firstMap P S ((firstObjEqFamily P S.arrows).toEquiv.symm a) =
          secondMap P S ((firstObjEqFamily P S.arrows).toEquiv.symm a) →
        ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).toEquiv.symm a
state_after: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ Presieve.IsSheafFor P S.arrows ↔
    ∀ (a : Presieve.FamilyOfElements P S.arrows),
      ((firstObjEqFamily P S.arrows).hom ((firstObjEqFamily P S.arrows).toEquiv.symm a)).Compatible →
        ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).toEquiv.symm a

tactic: simp only [inv_hom_id_apply, Iso.toEquiv_symm_fun]
state_before: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ Presieve.IsSheafFor P S.arrows ↔
    ∀ (a : Presieve.FamilyOfElements P S.arrows),
      ((firstObjEqFamily P S.arrows).hom ((firstObjEqFamily P S.arrows).toEquiv.symm a)).Compatible →
        ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).toEquiv.symm a
state_after: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ Presieve.IsSheafFor P S.arrows ↔
    ∀ (a : Presieve.FamilyOfElements P S.arrows),
      a.Compatible → ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).inv a

tactic: apply forall₂_congr
state_before: C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ Presieve.IsSheafFor P S.arrows ↔
    ∀ (a : Presieve.FamilyOfElements P S.arrows),
      a.Compatible → ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).inv a
state_after: case h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ ∀ (a : Presieve.FamilyOfElements P S.arrows),
    a.Compatible → ((∃! t, a.IsAmalgamation t) ↔ ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).inv a)

tactic: intro x _
state_before: case h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
⊢ ∀ (a : Presieve.FamilyOfElements P S.arrows),
    a.Compatible → ((∃! t, a.IsAmalgamation t) ↔ ∃! x, forkMap P S.arrows x = (firstObjEqFamily P S.arrows).inv a)
state_after: case h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
⊢ (∃! t, x.IsAmalgamation t) ↔ ∃! x_1, forkMap P S.arrows x_1 = (firstObjEqFamily P S.arrows).inv x

tactic: apply existsUnique_congr
state_before: case h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
⊢ (∃! t, x.IsAmalgamation t) ↔ ∃! x_1, forkMap P S.arrows x_1 = (firstObjEqFamily P S.arrows).inv x
state_after: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
⊢ ∀ (a : P.obj { unop := X }), x.IsAmalgamation a ↔ forkMap P S.arrows a = (firstObjEqFamily P S.arrows).inv x

tactic: intro t
state_before: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
⊢ ∀ (a : P.obj { unop := X }), x.IsAmalgamation a ↔ forkMap P S.arrows a = (firstObjEqFamily P S.arrows).inv x
state_after: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t ↔ forkMap P S.arrows t = (firstObjEqFamily P S.arrows).inv x

tactic: rw [← Iso.toEquiv_symm_fun]
state_before: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t ↔ forkMap P S.arrows t = (firstObjEqFamily P S.arrows).inv x
state_after: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t ↔ forkMap P S.arrows t = (firstObjEqFamily P S.arrows).toEquiv.symm x

tactic: rw [Equiv.eq_symm_apply]
state_before: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t ↔ forkMap P S.arrows t = (firstObjEqFamily P S.arrows).toEquiv.symm x
state_after: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t ↔ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x

tactic: constructor
state_before: case h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t ↔ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
state_after: case h.h.mp
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t → (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x

case h.h.mpr
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x → x.IsAmalgamation t

tactic: intro q
state_before: case h.h.mp
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ x.IsAmalgamation t → (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
state_after: case h.h.mp
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : x.IsAmalgamation t
⊢ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x

tactic: funext Y f hf
state_before: case h.h.mp
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : x.IsAmalgamation t
⊢ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
state_after: case h.h.mp.h.h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : x.IsAmalgamation t
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) f hf = x f hf

tactic: simpa [firstObjEqFamily, forkMap] using q _ _
state_before: case h.h.mp.h.h.h
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : x.IsAmalgamation t
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) f hf = x f hf
state_after: no goals

tactic: intro q Y f hf
state_before: case h.h.mpr
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
⊢ (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x → x.IsAmalgamation t
state_after: case h.h.mpr
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op t = x f hf

tactic: rw [← q]
state_before: case h.h.mpr
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op t = x f hf
state_after: case h.h.mpr
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op t = (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) f hf

tactic: simp [firstObjEqFamily, forkMap]
state_before: case h.h.mpr
C : Type u
inst✝ : Category.{v, u} C
P : Cᵒᵖ ⥤ Type (max v u)
X : C
R : Presieve X
S : Sieve X
x : Presieve.FamilyOfElements P S.arrows
b✝ : x.Compatible
t : P.obj { unop := X }
q : (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) = x
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op t = (firstObjEqFamily P S.arrows).toEquiv (forkMap P S.arrows t) f hf
state_after: no goals