Theorem: CategoryTheory.Presieve.extension_iff_amalgamation
File: Mathlib/CategoryTheory/Sites/IsSheafFor.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.{v₁, u₁} C
P✝ Q U : Cᵒᵖ ⥤ Type w
X Y : C
S : Sieve X
R : Presieve X
P : Cᵒᵖ ⥤ Type v₁
x : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ S.functorInclusion ≫ g = x ↔ (↑(natTransEquivCompatibleFamily x)).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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ S.functorInclusion ≫ g = x ↔
    ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩

tactic: constructor
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ S.functorInclusion ≫ g = x ↔
    ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
state_after: case mp
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ S.functorInclusion ≫ g = x →
    ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩

case mpr
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ (∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩) →
    S.functorInclusion ≫ g = x

tactic: rintro rfl Y f hf
state_before: case mp
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ S.functorInclusion ≫ g = x →
    ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
state_after: case mp
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₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op (yonedaEquiv g) = (S.functorInclusion ≫ g).app { unop := Y } ⟨f, hf⟩

tactic: rw [yonedaEquiv_naturality]
state_before: case mp
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₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ P.map f.op (yonedaEquiv g) = (S.functorInclusion ≫ g).app { unop := Y } ⟨f, hf⟩
state_after: case mp
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₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ yonedaEquiv (yoneda.map f ≫ g) = (S.functorInclusion ≫ g).app { unop := Y } ⟨f, hf⟩

tactic: dsimp
state_before: case mp
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₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ yonedaEquiv (yoneda.map f ≫ g) = (S.functorInclusion ≫ g).app { unop := Y } ⟨f, hf⟩
state_after: case mp
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₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ yonedaEquiv (yoneda.map f ≫ g) = g.app { unop := Y } f

tactic: simp [yonedaEquiv_apply]
state_before: case mp
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₁
g : yoneda.obj X ⟶ P
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ yonedaEquiv (yoneda.map f ≫ g) = g.app { unop := Y } f
state_after: no goals

tactic: intro h
state_before: case mpr
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
⊢ (∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩) →
    S.functorInclusion ≫ g = x
state_after: case mpr
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
⊢ S.functorInclusion ≫ g = x

tactic: ext Y ⟨f, hf⟩
state_before: case mpr
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
⊢ S.functorInclusion ≫ g = x
state_after: case mpr.w.h.h.mk
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (S.functorInclusion ≫ g).app Y ⟨f, hf⟩ = x.app Y ⟨f, hf⟩

tactic: convert h f hf
state_before: case mpr.w.h.h.mk
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (S.functorInclusion ≫ g).app Y ⟨f, hf⟩ = x.app Y ⟨f, hf⟩
state_after: case h.e'_2
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (S.functorInclusion ≫ g).app Y ⟨f, hf⟩ = P.map f.op (yonedaEquiv g)

tactic: rw [yonedaEquiv_naturality]
state_before: case h.e'_2
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (S.functorInclusion ≫ g).app Y ⟨f, hf⟩ = P.map f.op (yonedaEquiv g)
state_after: case h.e'_2
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (S.functorInclusion ≫ g).app Y ⟨f, hf⟩ = yonedaEquiv (yoneda.map f ≫ g)

tactic: dsimp [yonedaEquiv]
state_before: case h.e'_2
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ (S.functorInclusion ≫ g).app Y ⟨f, hf⟩ = yonedaEquiv (yoneda.map f ≫ g)
state_after: case h.e'_2
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ g.app Y f = g.app Y (𝟙 Y.unop ≫ f)

tactic: simp
state_before: case h.e'_2
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 : S.functor ⟶ P
g : yoneda.obj X ⟶ P
h : ∀ ⦃Y : C⦄ (f : Y ⟶ X) (h : S.arrows f), P.map f.op (yonedaEquiv g) = x.app { unop := Y } ⟨f, h⟩
Y : Cᵒᵖ
f : Y.unop ⟶ X
hf : S.arrows f
⊢ g.app Y f = g.app Y (𝟙 Y.unop ≫ f)
state_after: no goals