Theorem: CategoryTheory.Presieve.isSheafFor_iff_yonedaSheafCondition
File: Mathlib/CategoryTheory/Sites/IsSheafFor.lean

Proof steps:
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ IsSheafFor P S.arrows ↔ YonedaSheafCondition P S
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (f : S.functor ⟶ P), ∃! g, S.functorInclusion ≫ g = f
tactic: rw [IsSheafFor, YonedaSheafCondition]
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (f : S.functor ⟶ P), ∃! g, S.functorInclusion ≫ g = f
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (f : S.functor ⟶ P), ∃! g, (↑(natTransEquivCompatibleFamily f)).IsAmalgamation (yonedaEquiv g)
tactic: simp_rw [extension_iff_amalgamation]
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (f : S.functor ⟶ P), ∃! g, (↑(natTransEquivCompatibleFamily f)).IsAmalgamation (yonedaEquiv g)
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (b : { x // x.Compatible }),
      ∃! g, (↑(natTransEquivCompatibleFamily (natTransEquivCompatibleFamily.symm b))).IsAmalgamation (yonedaEquiv g)
tactic: rw [Equiv.forall_congr_left natTransEquivCompatibleFamily]
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (b : { x // x.Compatible }),
      ∃! g, (↑(natTransEquivCompatibleFamily (natTransEquivCompatibleFamily.symm b))).IsAmalgamation (yonedaEquiv g)
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (a : FamilyOfElements P S.arrows) (b : a.Compatible),
      ∃! g,
        (↑(natTransEquivCompatibleFamily (natTransEquivCompatibleFamily.symm ⟨a, b⟩))).IsAmalgamation (yonedaEquiv g)
tactic: rw [Subtype.forall]
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
⊢ (∀ (x : FamilyOfElements P S.arrows), x.Compatible → ∃! t, x.IsAmalgamation t) ↔
    ∀ (a : FamilyOfElements P S.arrows) (b : a.Compatible),
      ∃! g,
        (↑(natTransEquivCompatibleFamily (natTransEquivCompatibleFamily.symm ⟨a, b⟩))).IsAmalgamation (yonedaEquiv g)
state_after: no goals
tactic: exact forall₂_congr fun x hx ↦ by simp [Equiv.existsUnique_congr_right]