Theorem: CategoryTheory.GrothendieckTopology.Subpresheaf.lift_app_coe
File: Mathlib/CategoryTheory/Sites/Subsheaf.lean

Proof steps:
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
⊢ ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y),
    F'.map f_1 ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y = (fun U x => ⟨f.app U x, ⋯⟩) X ≫ G.toPresheaf.map f_1
state_after: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
⊢ ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y),
    F'.map f_1 ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y = (fun U x => ⟨f.app U x, ⋯⟩) X ≫ G.toPresheaf.map f_1
tactic: have := elementwise_of% f.naturality
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
⊢ ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y),
    F'.map f_1 ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y = (fun U x => ⟨f.app U x, ⋯⟩) X ≫ G.toPresheaf.map f_1
state_after: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
X✝ Y✝ : Cᵒᵖ
f✝ : X✝ ⟶ Y✝
⊢ F'.map f✝ ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y✝ = (fun U x => ⟨f.app U x, ⋯⟩) X✝ ≫ G.toPresheaf.map f✝
tactic: intros
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
X✝ Y✝ : Cᵒᵖ
f✝ : X✝ ⟶ Y✝
⊢ F'.map f✝ ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y✝ = (fun U x => ⟨f.app U x, ⋯⟩) X✝ ≫ G.toPresheaf.map f✝
state_after: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
X✝ Y✝ : Cᵒᵖ
f✝ : X✝ ⟶ Y✝
x : F'.obj X✝
⊢ ↑((F'.map f✝ ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y✝) x) = ↑(((fun U x => ⟨f.app U x, ⋯⟩) X✝ ≫ G.toPresheaf.map f✝) x)
tactic: refine funext fun x => Subtype.ext ?_
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
X✝ Y✝ : Cᵒᵖ
f✝ : X✝ ⟶ Y✝
x : F'.obj X✝
⊢ ↑((F'.map f✝ ≫ (fun U x => ⟨f.app U x, ⋯⟩) Y✝) x) = ↑(((fun U x => ⟨f.app U x, ⋯⟩) X✝ ≫ G.toPresheaf.map f✝) x)
state_after: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
X✝ Y✝ : Cᵒᵖ
f✝ : X✝ ⟶ Y✝
x : F'.obj X✝
⊢ f.app Y✝ (F'.map f✝ x) = ↑(G.toPresheaf.map f✝ ⟨f.app X✝ x, ⋯⟩)
tactic: simp only [toPresheaf_obj, types_comp_apply]
state_before: C : Type u
inst✝ : Category.{v, u} C
J : GrothendieckTopology C
F F' F'' : Cᵒᵖ ⥤ Type w
G G' : Subpresheaf F
f : F' ⟶ F
hf : ∀ (U : Cᵒᵖ) (x : F'.obj U), f.app U x ∈ G.obj U
this : ∀ ⦃X Y : Cᵒᵖ⦄ (f_1 : X ⟶ Y) (x : F'.obj X), f.app Y (F'.map f_1 x) = F.map f_1 (f.app X x)
X✝ Y✝ : Cᵒᵖ
f✝ : X✝ ⟶ Y✝
x : F'.obj X✝
⊢ f.app Y✝ (F'.map f✝ x) = ↑(G.toPresheaf.map f✝ ⟨f.app X✝ x, ⋯⟩)
state_after: no goals
tactic: exact this _ _