Theorem: CategoryTheory.Presieve.extension_iff_amalgamation
File: Mathlib/CategoryTheory/Sites/SheafOfTypes.lean

tactic: change _ ↔ ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S f), P.map f.op (yonedaEquiv g) = x.app (op Y) ⟨f, h⟩
state_before: C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
⊢ functorInclusion S ≫ g = x ↔ FamilyOfElements.IsAmalgamation (↑(↑natTransEquivCompatibleFamily x)) (↑yonedaEquiv g)

tactic: constructor
state_before: C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
⊢ functorInclusion S ≫ g = x ↔
    ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }

tactic: rintro rfl Y f hf
state_before: case mp
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
⊢ functorInclusion S ≫ g = x →
    ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }

tactic: rw [yonedaEquiv_naturality]
state_before: case mp
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op (↑yonedaEquiv g) = (functorInclusion S ≫ g).app Y.op { val := f, property := hf }

tactic: dsimp
state_before: case mp
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ↑yonedaEquiv (yoneda.map f ≫ g) = (functorInclusion S ≫ g).app Y.op { val := f, property := hf }

tactic: simp
state_before: case mp
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ g.app Y.op (𝟙 Y ≫ f) = g.app Y.op f

tactic: intro h
state_before: case mpr
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
⊢ (∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }) →
    functorInclusion S ≫ g = x

tactic: ext Y ⟨f, hf⟩
state_before: case mpr
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }
⊢ functorInclusion S ≫ g = x

tactic: convert h f hf
state_before: case mpr.w.h.h.mk
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (functorInclusion S ≫ g).app Y { val := f, property := hf } = x.app Y { val := f, property := hf }

tactic: rw [yonedaEquiv_naturality]
state_before: case h.e'_2.h
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
e_1✝ : P.obj Y = P.obj Y.unop.op
⊢ (functorInclusion S ≫ g).app Y { val := f, property := hf } = P.map f.op (↑yonedaEquiv g)

tactic: simp [yonedaEquiv]
state_before: case h.e'_2.h
C : Type u₁
inst✝ : Category C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y✝ : C
S : Sieve X
R : Presieve X
J J₂ : GrothendieckTopology C
P : Cᵒᵖ ⥤ Type v₁
x : functor S ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (↑yonedaEquiv g) = x.app Y.op { val := f, property := h }
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
e_1✝ : P.obj Y = P.obj Y.unop.op
⊢ (functorInclusion S ≫ g).app Y { val := f, property := hf } = ↑yonedaEquiv (yoneda.map f ≫ g)