Theorem: CategoryTheory.SmallObject.functor_obj
File: Mathlib/CategoryTheory/SmallObject/Construction.lean

Proof steps:
state_before: C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
x✝ : Over S
⊢ { obj := fun π => Over.mk (πFunctorObj f π.hom),
          map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
      (𝟙 x✝) =
    𝟙
      ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.obj
        x✝)
state_after: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
x✝ : Over S
⊢ ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
        (𝟙 x✝)).left =
    (𝟙
        ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
              map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.obj
          x✝)).left
tactic: ext
state_before: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
x✝ : Over S
⊢ ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
        (𝟙 x✝)).left =
    (𝟙
        ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
              map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.obj
          x✝)).left
state_after: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
x✝ : Over S
⊢ functorMap f x✝.hom x✝.hom (𝟙 x✝.left) ⋯ = 𝟙 (functorObj f x✝.hom)
tactic: dsimp
state_before: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
x✝ : Over S
⊢ functorMap f x✝.hom x✝.hom (𝟙 x✝.left) ⋯ = 𝟙 (functorObj f x✝.hom)
state_after: no goals
tactic: simp
state_before: C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
⊢ { obj := fun π => Over.mk (πFunctorObj f π.hom),
          map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
      (φ ≫ φ') =
    { obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
        φ ≫
      { obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
        φ'
state_after: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
⊢ ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
        (φ ≫ φ')).left =
    ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
              map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
          φ ≫
        { obj := fun π => Over.mk (πFunctorObj f π.hom),
              map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
          φ').left
tactic: ext1
state_before: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
⊢ ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
            map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
        (φ ≫ φ')).left =
    ({ obj := fun π => Over.mk (πFunctorObj f π.hom),
              map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
          φ ≫
        { obj := fun π => Over.mk (πFunctorObj f π.hom),
              map := fun {π₁ π₂} φ => Over.homMk (functorMap f π₁.hom π₂.hom φ.left ⋯) ⋯ }.map
          φ').left
state_after: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
⊢ functorMap f π₁.hom π₃.hom (φ.left ≫ φ'.left) ⋯ =
    functorMap f π₁.hom π₂.hom φ.left ⋯ ≫ functorMap f π₂.hom π₃.hom φ'.left ⋯
tactic: dsimp
state_before: case h
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
⊢ functorMap f π₁.hom π₃.hom (φ.left ≫ φ'.left) ⋯ =
    functorMap f π₁.hom π₂.hom φ.left ⋯ ≫ functorMap f π₂.hom π₃.hom φ'.left ⋯
state_after: case h.h₀
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
⊢ pushout.inl (functorObjTop f π₁.hom) (functorObjLeft f π₁.hom) ≫ functorMap f π₁.hom π₃.hom (φ.left ≫ φ'.left) ⋯ =
    pushout.inl (functorObjTop f π₁.hom) (functorObjLeft f π₁.hom) ≫
      functorMap f π₁.hom π₂.hom φ.left ⋯ ≫ functorMap f π₂.hom π₃.hom φ'.left ⋯

case h.h₁.h.mk
C : Type u
inst✝² : Category.{v, u} C
I : Type w
A B : I → C
f : (i : I) → A i ⟶ B i
S : C
inst✝¹ : HasPushouts C
inst✝ : ∀ {X : C} (πX : X ⟶ S), HasColimitsOfShape (Discrete (FunctorObjIndex f πX)) C
π₁ π₂ π₃ : Over S
φ : π₁ ⟶ π₂
φ' : π₂ ⟶ π₃
i : I
t : A i ⟶ π₁.left
b : B i ⟶ S
w : t ≫ π₁.hom = f i ≫ b
⊢ Sigma.ι (functorObjTgtFamily f π₁.hom) { i := i, t := t, b := b, w := w } ≫
      pushout.inr (functorObjTop f π₁.hom) (functorObjLeft f π₁.hom) ≫ functorMap f π₁.hom π₃.hom (φ.left ≫ φ'.left) ⋯ =
    Sigma.ι (functorObjTgtFamily f π₁.hom) { i := i, t := t, b := b, w := w } ≫
      pushout.inr (functorObjTop f π₁.hom) (functorObjLeft f π₁.hom) ≫
        functorMap f π₁.hom π₂.hom φ.left ⋯ ≫ functorMap f π₂.hom π₃.hom φ'.left ⋯
tactic: ext ⟨i, t, b, w⟩