Theorem: CategoryTheory.Over.ConstructProducts.conesEquivInverseObj_π_app
File: Mathlib/CategoryTheory/Limits/Constructions/Over/Products.lean

Proof steps:
state_before: J✝ : Type w
C : Type u
inst✝ : Category.{v, u} C
X✝ B : C
J : Type w
F : Discrete J ⥤ Over B
c : Cone F
X Y : WidePullbackShape J
f : X ⟶ Y
⊢ ((Functor.const (WidePullbackShape J)).obj c.pt.left).map f ≫
      (fun X => Option.casesOn X c.pt.hom fun j => (c.π.app { as := j }).left) Y =
    (fun X => Option.casesOn X c.pt.hom fun j => (c.π.app { as := j }).left) X ≫
      (widePullbackDiagramOfDiagramOver B F).map f
state_after: J✝ : Type w
C : Type u
inst✝ : Category.{v, u} C
X✝ B : C
J : Type w
F : Discrete J ⥤ Over B
c : Cone F
X Y : WidePullbackShape J
f : X ⟶ Y
⊢ 𝟙 c.pt.left ≫ Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) Y =
    Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) X ≫
      WidePullbackShape.Hom.rec (motive := fun a a_1 t =>
        X = a →
          Y = a_1 →
            HEq f t →
              (Option.rec B (fun val => (F.obj { as := val }).left) X ⟶
                Option.rec B (fun val => (F.obj { as := val }).left) Y))
        (fun X_1 h =>
          Eq.rec (motive := fun x x_1 =>
            Y = x →
              HEq f (𝟙 x) →
                (Option.rec B (fun val => (F.obj { as := val }).left) X ⟶
                  Option.rec B (fun val => (F.obj { as := val }).left) Y))
            (fun h =>
              Eq.rec (motive := fun x x_1 =>
                (f : X ⟶ x) →
                  HEq f (𝟙 X) →
                    (Option.rec B (fun val => (F.obj { as := val }).left) X ⟶
                      Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => 𝟙 (Option.rec B (fun val => (F.obj { as := val }).left) X)) ⋯ f)
            h)
        (fun j h =>
          Eq.rec (motive := fun x x_1 =>
            (f : x ⟶ Y) →
              Y = none →
                HEq f (WidePullbackShape.Hom.term j) →
                  (Option.rec B (fun val => (F.obj { as := val }).left) x ⟶
                    Option.rec B (fun val => (F.obj { as := val }).left) Y))
            (fun f h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some j ⟶ x) →
                  HEq f (WidePullbackShape.Hom.term j) →
                    ((F.obj { as := j }).left ⟶ Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => (F.obj { as := j }).hom) ⋯ f)
            ⋯ f)
        f ⋯ ⋯ ⋯
tactic: dsimp
state_before: J✝ : Type w
C : Type u
inst✝ : Category.{v, u} C
X✝ B : C
J : Type w
F : Discrete J ⥤ Over B
c : Cone F
X Y : WidePullbackShape J
f : X ⟶ Y
⊢ 𝟙 c.pt.left ≫ Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) Y =
    Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) X ≫
      WidePullbackShape.Hom.rec (motive := fun a a_1 t =>
        X = a →
          Y = a_1 →
            HEq f t →
              (Option.rec B (fun val => (F.obj { as := val }).left) X ⟶
                Option.rec B (fun val => (F.obj { as := val }).left) Y))
        (fun X_1 h =>
          Eq.rec (motive := fun x x_1 =>
            Y = x →
              HEq f (𝟙 x) →
                (Option.rec B (fun val => (F.obj { as := val }).left) X ⟶
                  Option.rec B (fun val => (F.obj { as := val }).left) Y))
            (fun h =>
              Eq.rec (motive := fun x x_1 =>
                (f : X ⟶ x) →
                  HEq f (𝟙 X) →
                    (Option.rec B (fun val => (F.obj { as := val }).left) X ⟶
                      Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => 𝟙 (Option.rec B (fun val => (F.obj { as := val }).left) X)) ⋯ f)
            h)
        (fun j h =>
          Eq.rec (motive := fun x x_1 =>
            (f : x ⟶ Y) →
              Y = none →
                HEq f (WidePullbackShape.Hom.term j) →
                  (Option.rec B (fun val => (F.obj { as := val }).left) x ⟶
                    Option.rec B (fun val => (F.obj { as := val }).left) Y))
            (fun f h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some j ⟶ x) →
                  HEq f (WidePullbackShape.Hom.term j) →
                    ((F.obj { as := j }).left ⟶ Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => (F.obj { as := j }).hom) ⋯ f)
            ⋯ f)
        f ⋯ ⋯ ⋯
state_after: case none.none.id
J✝ : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
J : Type w
F : Discrete J ⥤ Over B
c : Cone F
⊢ 𝟙 c.pt.left ≫ Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) none =
    Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) none ≫
      WidePullbackShape.Hom.rec (motive := fun a a_1 t =>
        none = a →
          none = a_1 →
            HEq (WidePullbackShape.Hom.id none) t →
              (Option.rec B (fun val => (F.obj { as := val }).left) none ⟶
                Option.rec B (fun val => (F.obj { as := val }).left) none))
        (fun X h =>
          Eq.rec (motive := fun x x_1 =>
            none = x →
              HEq (WidePullbackShape.Hom.id none) (𝟙 x) →
                (Option.rec B (fun val => (F.obj { as := val }).left) none ⟶
                  Option.rec B (fun val => (F.obj { as := val }).left) none))
            (fun h =>
              Eq.rec (motive := fun x x_1 =>
                (f : none ⟶ x) →
                  HEq f (𝟙 none) →
                    (Option.rec B (fun val => (F.obj { as := val }).left) none ⟶
                      Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => 𝟙 (Option.rec B (fun val => (F.obj { as := val }).left) none)) ⋯
                (WidePullbackShape.Hom.id none))
            h)
        (fun j h =>
          Eq.rec (motive := fun x x_1 =>
            (f : x ⟶ none) →
              none = none →
                HEq f (WidePullbackShape.Hom.term j) →
                  (Option.rec B (fun val => (F.obj { as := val }).left) x ⟶
                    Option.rec B (fun val => (F.obj { as := val }).left) none))
            (fun f h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some j ⟶ x) →
                  HEq f (WidePullbackShape.Hom.term j) →
                    ((F.obj { as := j }).left ⟶ Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => (F.obj { as := j }).hom) ⋯ f)
            ⋯ (WidePullbackShape.Hom.id none))
        (WidePullbackShape.Hom.id none) ⋯ ⋯ ⋯

case some.none.term
J✝ : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
J : Type w
F : Discrete J ⥤ Over B
c : Cone F
val✝ : J
⊢ 𝟙 c.pt.left ≫ Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) none =
    Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) (some val✝) ≫
      WidePullbackShape.Hom.rec (motive := fun a a_1 t =>
        some val✝ = a →
          none = a_1 →
            HEq (WidePullbackShape.Hom.term val✝) t →
              (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝) ⟶
                Option.rec B (fun val => (F.obj { as := val }).left) none))
        (fun X h =>
          Eq.rec (motive := fun x x_1 =>
            none = x →
              HEq (WidePullbackShape.Hom.term val✝) (𝟙 x) →
                (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝) ⟶
                  Option.rec B (fun val => (F.obj { as := val }).left) none))
            (fun h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some val✝ ⟶ x) →
                  HEq f (𝟙 (some val✝)) →
                    (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝) ⟶
                      Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => 𝟙 (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝))) ⋯
                (WidePullbackShape.Hom.term val✝))
            h)
        (fun j h =>
          Eq.rec (motive := fun x x_1 =>
            (f : x ⟶ none) →
              none = none →
                HEq f (WidePullbackShape.Hom.term j) →
                  (Option.rec B (fun val => (F.obj { as := val }).left) x ⟶
                    Option.rec B (fun val => (F.obj { as := val }).left) none))
            (fun f h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some j ⟶ x) →
                  HEq f (WidePullbackShape.Hom.term j) →
                    ((F.obj { as := j }).left ⟶ Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => (F.obj { as := j }).hom) ⋯ f)
            ⋯ (WidePullbackShape.Hom.term val✝))
        (WidePullbackShape.Hom.term val✝) ⋯ ⋯ ⋯

case some.some.id
J✝ : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
J : Type w
F : Discrete J ⥤ Over B
c : Cone F
val✝ : J
⊢ 𝟙 c.pt.left ≫ Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) (some val✝) =
    Option.rec c.pt.hom (fun val => (c.π.app { as := val }).left) (some val✝) ≫
      WidePullbackShape.Hom.rec (motive := fun a a_1 t =>
        some val✝ = a →
          some val✝ = a_1 →
            HEq (WidePullbackShape.Hom.id (some val✝)) t →
              (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝) ⟶
                Option.rec B (fun val => (F.obj { as := val }).left) (some val✝)))
        (fun X h =>
          Eq.rec (motive := fun x x_1 =>
            some val✝ = x →
              HEq (WidePullbackShape.Hom.id (some val✝)) (𝟙 x) →
                (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝) ⟶
                  Option.rec B (fun val => (F.obj { as := val }).left) (some val✝)))
            (fun h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some val✝ ⟶ x) →
                  HEq f (𝟙 (some val✝)) →
                    (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝) ⟶
                      Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => 𝟙 (Option.rec B (fun val => (F.obj { as := val }).left) (some val✝))) ⋯
                (WidePullbackShape.Hom.id (some val✝)))
            h)
        (fun j h =>
          Eq.rec (motive := fun x x_1 =>
            (f : x ⟶ some val✝) →
              some val✝ = none →
                HEq f (WidePullbackShape.Hom.term j) →
                  (Option.rec B (fun val => (F.obj { as := val }).left) x ⟶
                    Option.rec B (fun val => (F.obj { as := val }).left) (some val✝)))
            (fun f h =>
              Eq.rec (motive := fun x x_1 =>
                (f : some j ⟶ x) →
                  HEq f (WidePullbackShape.Hom.term j) →
                    ((F.obj { as := j }).left ⟶ Option.rec B (fun val => (F.obj { as := val }).left) x))
                (fun f h => (F.obj { as := j }).hom) ⋯ f)
            ⋯ (WidePullbackShape.Hom.id (some val✝)))
        (WidePullbackShape.Hom.id (some val✝)) ⋯ ⋯ ⋯
tactic: cases X <;> cases Y <;> cases f