Theorem: CategoryTheory.Limits.WidePushoutShape.wideSpan_obj
File: Mathlib/CategoryTheory/Limits/Shapes/WidePullbacks.lean

Proof steps:
state_before: J : Type w
C : Type u
inst✝ : Category.{v, u} C
B : C
objs : J → C
arrows : (j : J) → B ⟶ objs j
X✝ Y✝ : WidePushoutShape J
f : X✝ ⟶ Y✝
⊢ (fun j => Option.casesOn j B objs) X✝ ⟶ (fun j => Option.casesOn j B objs) Y✝
state_after: case id
J : Type w
C : Type u
inst✝ : Category.{v, u} C
B : C
objs : J → C
arrows : (j : J) → B ⟶ objs j
X✝ : WidePushoutShape J
⊢ (fun j => Option.casesOn j B objs) X✝ ⟶ (fun j => Option.casesOn j B objs) X✝

case init
J : Type w
C : Type u
inst✝ : Category.{v, u} C
B : C
objs : J → C
arrows : (j : J) → B ⟶ objs j
j : J
⊢ (fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) (some j)
tactic: cases' f with _ j
state_before: J : Type w
C : Type u
inst✝ : Category.{v, u} C
B : C
objs : J → C
arrows : (j : J) → B ⟶ objs j
X✝ Y✝ Z✝ : WidePushoutShape J
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
⊢ { obj := fun j => Option.casesOn j B objs,
          map := fun {X Y} f =>
            Hom.casesOn (motive := fun a a_1 t =>
              X = a → Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
              f
              (fun X_1 h =>
                Eq.ndrec (motive := fun X_2 =>
                  Y = X_2 →
                    HEq f (Hom.id X_2) → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                  (fun h =>
                    Eq.ndrec (motive := fun {Y} =>
                      (f : X ⟶ Y) →
                        HEq f (Hom.id X) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                      (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                  h)
              (fun j h =>
                Eq.ndrec (motive := fun {X} =>
                  (f : X ⟶ Y) →
                    Y = some j →
                      HEq f (Hom.init j) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                  (fun f h =>
                    Eq.ndrec (motive := fun {Y} =>
                      (f : none ⟶ Y) →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                      (fun f h => arrows j) ⋯ f)
                  ⋯ f)
              ⋯ ⋯ ⋯ }.map
      (f ≫ g) =
    { obj := fun j => Option.casesOn j B objs,
            map := fun {X Y} f =>
              Hom.casesOn (motive := fun a a_1 t =>
                X = a →
                  Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                f
                (fun X_1 h =>
                  Eq.ndrec (motive := fun X_2 =>
                    Y = X_2 →
                      HEq f (Hom.id X_2) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : X ⟶ Y) →
                          HEq f (Hom.id X) →
                            ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                    h)
                (fun j h =>
                  Eq.ndrec (motive := fun {X} =>
                    (f : X ⟶ Y) →
                      Y = some j →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun f h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : none ⟶ Y) →
                          HEq f (Hom.init j) →
                            ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => arrows j) ⋯ f)
                    ⋯ f)
                ⋯ ⋯ ⋯ }.map
        f ≫
      { obj := fun j => Option.casesOn j B objs,
            map := fun {X Y} f =>
              Hom.casesOn (motive := fun a a_1 t =>
                X = a →
                  Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                f
                (fun X_1 h =>
                  Eq.ndrec (motive := fun X_2 =>
                    Y = X_2 →
                      HEq f (Hom.id X_2) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : X ⟶ Y) →
                          HEq f (Hom.id X) →
                            ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                    h)
                (fun j h =>
                  Eq.ndrec (motive := fun {X} =>
                    (f : X ⟶ Y) →
                      Y = some j →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun f h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : none ⟶ Y) →
                          HEq f (Hom.init j) →
                            ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => arrows j) ⋯ f)
                    ⋯ f)
                ⋯ ⋯ ⋯ }.map
        g
state_after: case id
J : Type w
C : Type u
inst✝ : Category.{v, u} C
B : C
objs : J → C
arrows : (j : J) → B ⟶ objs j
X✝ Z✝ : WidePushoutShape J
g : X✝ ⟶ Z✝
⊢ { obj := fun j => Option.casesOn j B objs,
          map := fun {X Y} f =>
            Hom.casesOn (motive := fun a a_1 t =>
              X = a → Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
              f
              (fun X_1 h =>
                Eq.ndrec (motive := fun X_2 =>
                  Y = X_2 →
                    HEq f (Hom.id X_2) → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                  (fun h =>
                    Eq.ndrec (motive := fun {Y} =>
                      (f : X ⟶ Y) →
                        HEq f (Hom.id X) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                      (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                  h)
              (fun j h =>
                Eq.ndrec (motive := fun {X} =>
                  (f : X ⟶ Y) →
                    Y = some j →
                      HEq f (Hom.init j) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                  (fun f h =>
                    Eq.ndrec (motive := fun {Y} =>
                      (f : none ⟶ Y) →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                      (fun f h => arrows j) ⋯ f)
                  ⋯ f)
              ⋯ ⋯ ⋯ }.map
      (Hom.id X✝ ≫ g) =
    { obj := fun j => Option.casesOn j B objs,
            map := fun {X Y} f =>
              Hom.casesOn (motive := fun a a_1 t =>
                X = a →
                  Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                f
                (fun X_1 h =>
                  Eq.ndrec (motive := fun X_2 =>
                    Y = X_2 →
                      HEq f (Hom.id X_2) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : X ⟶ Y) →
                          HEq f (Hom.id X) →
                            ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                    h)
                (fun j h =>
                  Eq.ndrec (motive := fun {X} =>
                    (f : X ⟶ Y) →
                      Y = some j →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun f h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : none ⟶ Y) →
                          HEq f (Hom.init j) →
                            ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => arrows j) ⋯ f)
                    ⋯ f)
                ⋯ ⋯ ⋯ }.map
        (Hom.id X✝) ≫
      { obj := fun j => Option.casesOn j B objs,
            map := fun {X Y} f =>
              Hom.casesOn (motive := fun a a_1 t =>
                X = a →
                  Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                f
                (fun X_1 h =>
                  Eq.ndrec (motive := fun X_2 =>
                    Y = X_2 →
                      HEq f (Hom.id X_2) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : X ⟶ Y) →
                          HEq f (Hom.id X) →
                            ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                    h)
                (fun j h =>
                  Eq.ndrec (motive := fun {X} =>
                    (f : X ⟶ Y) →
                      Y = some j →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun f h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : none ⟶ Y) →
                          HEq f (Hom.init j) →
                            ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => arrows j) ⋯ f)
                    ⋯ f)
                ⋯ ⋯ ⋯ }.map
        g

case init
J : Type w
C : Type u
inst✝ : Category.{v, u} C
B : C
objs : J → C
arrows : (j : J) → B ⟶ objs j
Z✝ : WidePushoutShape J
j✝ : J
g : some j✝ ⟶ Z✝
⊢ { obj := fun j => Option.casesOn j B objs,
          map := fun {X Y} f =>
            Hom.casesOn (motive := fun a a_1 t =>
              X = a → Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
              f
              (fun X_1 h =>
                Eq.ndrec (motive := fun X_2 =>
                  Y = X_2 →
                    HEq f (Hom.id X_2) → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                  (fun h =>
                    Eq.ndrec (motive := fun {Y} =>
                      (f : X ⟶ Y) →
                        HEq f (Hom.id X) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                      (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                  h)
              (fun j h =>
                Eq.ndrec (motive := fun {X} =>
                  (f : X ⟶ Y) →
                    Y = some j →
                      HEq f (Hom.init j) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                  (fun f h =>
                    Eq.ndrec (motive := fun {Y} =>
                      (f : none ⟶ Y) →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                      (fun f h => arrows j) ⋯ f)
                  ⋯ f)
              ⋯ ⋯ ⋯ }.map
      (Hom.init j✝ ≫ g) =
    { obj := fun j => Option.casesOn j B objs,
            map := fun {X Y} f =>
              Hom.casesOn (motive := fun a a_1 t =>
                X = a →
                  Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                f
                (fun X_1 h =>
                  Eq.ndrec (motive := fun X_2 =>
                    Y = X_2 →
                      HEq f (Hom.id X_2) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : X ⟶ Y) →
                          HEq f (Hom.id X) →
                            ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                    h)
                (fun j h =>
                  Eq.ndrec (motive := fun {X} =>
                    (f : X ⟶ Y) →
                      Y = some j →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun f h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : none ⟶ Y) →
                          HEq f (Hom.init j) →
                            ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => arrows j) ⋯ f)
                    ⋯ f)
                ⋯ ⋯ ⋯ }.map
        (Hom.init j✝) ≫
      { obj := fun j => Option.casesOn j B objs,
            map := fun {X Y} f =>
              Hom.casesOn (motive := fun a a_1 t =>
                X = a →
                  Y = a_1 → HEq f t → ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                f
                (fun X_1 h =>
                  Eq.ndrec (motive := fun X_2 =>
                    Y = X_2 →
                      HEq f (Hom.id X_2) →
                        ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : X ⟶ Y) →
                          HEq f (Hom.id X) →
                            ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => 𝟙 ((fun j => Option.casesOn j B objs) X)) ⋯ f)
                    h)
                (fun j h =>
                  Eq.ndrec (motive := fun {X} =>
                    (f : X ⟶ Y) →
                      Y = some j →
                        HEq f (Hom.init j) →
                          ((fun j => Option.casesOn j B objs) X ⟶ (fun j => Option.casesOn j B objs) Y))
                    (fun f h =>
                      Eq.ndrec (motive := fun {Y} =>
                        (f : none ⟶ Y) →
                          HEq f (Hom.init j) →
                            ((fun j => Option.casesOn j B objs) none ⟶ (fun j => Option.casesOn j B objs) Y))
                        (fun f h => arrows j) ⋯ f)
                    ⋯ f)
                ⋯ ⋯ ⋯ }.map
        g
tactic: cases f