Theorem: TopCat.Presheaf.pullback_obj_obj_ext
File: Mathlib/Topology/Sheaves/Stalks.lean

Proof steps:
state_before: C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : (Opens ↑X)ᵒᵖ
φ ψ : ((pullback C f).obj F).obj U ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop U ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
⊢ φ = ψ
state_after: case op
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : Opens ↑X
φ ψ : ((pullback C f).obj F).obj (op U) ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop (op U) ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
⊢ φ = ψ
tactic: obtain ⟨U⟩ := U
state_before: case op
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : Opens ↑X
φ ψ : ((pullback C f).obj F).obj (op U) ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop (op U) ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
⊢ φ = ψ
state_after: case op
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : Opens ↑X
φ ψ : ((pullback C f).obj F).obj (op U) ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop (op U) ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
⊢ ∀ (j : CostructuredArrow (Opens.map f).op (op U)),
    ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app j ≫
        φ =
      ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app
          j ≫
        ψ
tactic: apply ((Opens.map f).op.isPointwiseLeftKanExtensionLanUnit F _).hom_ext
state_before: case op
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : Opens ↑X
φ ψ : ((pullback C f).obj F).obj (op U) ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop (op U) ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
⊢ ∀ (j : CostructuredArrow (Opens.map f).op (op U)),
    ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app j ≫
        φ =
      ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app
          j ≫
        ψ
state_after: case op.mk.op.mk.op
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : Opens ↑X
φ ψ : ((pullback C f).obj F).obj (op U) ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop (op U) ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
V : Opens ↑Y
as✝ : PUnit.{1}
b : unop ((Functor.fromPUnit (op U)).obj { as := as✝ }) ⟶ unop ((Opens.map f).op.obj (op V))
⊢ ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app
        { left := op V, right := { as := as✝ }, hom := op b } ≫
      φ =
    ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app
        { left := op V, right := { as := as✝ }, hom := op b } ≫
      ψ
tactic: rintro ⟨⟨V⟩, ⟨⟩, ⟨b⟩⟩
state_before: case op.mk.op.mk.op
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z✝ : TopCat
Z : C
f : X ⟶ Y
F : Presheaf C Y
U : Opens ↑X
φ ψ : ((pullback C f).obj F).obj (op U) ⟶ Z
h :
  ∀ (V : Opens ↑Y) (hV : unop (op U) ≤ (Opens.map f).obj V),
    ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ φ =
      ((pushforwardPullbackAdjunction C f).unit.app F).app (op V) ≫ ((pullback C f).obj F).map (homOfLE hV).op ≫ ψ
V : Opens ↑Y
as✝ : PUnit.{1}
b : unop ((Functor.fromPUnit (op U)).obj { as := as✝ }) ⟶ unop ((Opens.map f).op.obj (op V))
⊢ ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app
        { left := op V, right := { as := as✝ }, hom := op b } ≫
      φ =
    ((Functor.LeftExtension.mk ((Opens.map f).op.lan.obj F) ((Opens.map f).op.lanUnit.app F)).coconeAt (op U)).ι.app
        { left := op V, right := { as := as✝ }, hom := op b } ≫
      ψ
state_after: no goals
tactic: simpa [pushforwardPullbackAdjunction, Functor.lanAdjunction_unit]
    using h V (leOfHom b)