Theorem: CategoryTheory.Cat.HasLimits.homDiagram_map
File: Mathlib/CategoryTheory/Category/Cat/Limit.lean

Proof steps:
state_before: J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
X✝ Y✝ : J
f : X✝ ⟶ Y✝
g : (fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y) X✝
⊢ (fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y) Y✝
state_after: case refine_1
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
X✝ Y✝ : J
f : X✝ ⟶ Y✝
g : (fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y) X✝
⊢ limit.π (F ⋙ objects) Y✝ X = (F.map f).obj (limit.π (F ⋙ objects) X✝ X)

case refine_2
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
X✝ Y✝ : J
f : X✝ ⟶ Y✝
g : (fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y) X✝
⊢ (F.map f).obj (limit.π (F ⋙ objects) X✝ Y) = limit.π (F ⋙ objects) Y✝ Y
tactic: refine eqToHom ?_ ≫ (F.map f).map g ≫ eqToHom ?_
state_before: J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X✝ Y : limit (F ⋙ objects)
X : J
⊢ { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (𝟙 X) =
    𝟙
      ({ obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
        X)
state_after: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X✝ Y : limit (F ⋙ objects)
X : J
f :
  { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    X
⊢ { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (𝟙 X) f =
    𝟙
      ({ obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
        X)
      f
tactic: funext f
state_before: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X✝ Y : limit (F ⋙ objects)
X : J
f :
  { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    X
⊢ { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (𝟙 X) f =
    𝟙
      ({ obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
        X)
      f
state_after: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X✝ Y : limit (F ⋙ objects)
X : J
f :
  { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    X
this : Category.{v, v} (objects.obj (F.obj X)) := inferInstance
⊢ { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (𝟙 X) f =
    𝟙
      ({ obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
        X)
      f
tactic: letI : Category (objects.obj (F.obj X)) := (inferInstance : Category (F.obj X))
state_before: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X✝ Y : limit (F ⋙ objects)
X : J
f :
  { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    X
this : Category.{v, v} (objects.obj (F.obj X)) := inferInstance
⊢ { obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (𝟙 X) f =
    𝟙
      ({ obj := fun j => limit.π (F ⋙ objects) j X✝ ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
        X)
      f
state_after: no goals
tactic: simp [Functor.congr_hom (F.map_id X) f]
state_before: J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
x✝¹ x✝ Z : J
f : x✝¹ ⟶ x✝
g : x✝ ⟶ Z
⊢ { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (f ≫ g) =
    { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
        f ≫
      { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
            map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
        g
state_after: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
x✝¹ x✝ Z : J
f : x✝¹ ⟶ x✝
g : x✝ ⟶ Z
h :
  { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    x✝¹
⊢ { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (f ≫ g) h =
    ({ obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          f ≫
        { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          g)
      h
tactic: funext h
state_before: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
x✝¹ x✝ Z : J
f : x✝¹ ⟶ x✝
g : x✝ ⟶ Z
h :
  { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    x✝¹
⊢ { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (f ≫ g) h =
    ({ obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          f ≫
        { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          g)
      h
state_after: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
x✝¹ x✝ Z : J
f : x✝¹ ⟶ x✝
g : x✝ ⟶ Z
h :
  { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    x✝¹
this : Category.{v, v} (objects.obj (F.obj Z)) := inferInstance
⊢ { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (f ≫ g) h =
    ({ obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          f ≫
        { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          g)
      h
tactic: letI : Category (objects.obj (F.obj Z)) := (inferInstance : Category (F.obj Z))
state_before: case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ Cat
X Y : limit (F ⋙ objects)
x✝¹ x✝ Z : J
f : x✝¹ ⟶ x✝
g : x✝ ⟶ Z
h :
  { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
        map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.obj
    x✝¹
this : Category.{v, v} (objects.obj (F.obj Z)) := inferInstance
⊢ { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
          map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
      (f ≫ g) h =
    ({ obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          f ≫
        { obj := fun j => limit.π (F ⋙ objects) j X ⟶ limit.π (F ⋙ objects) j Y,
              map := fun {X_1 Y_1} f g => eqToHom ⋯ ≫ (F.map f).map g ≫ eqToHom ⋯ }.map
          g)
      h
state_after: no goals
tactic: simp [Functor.congr_hom (F.map_comp f g) h, eqToHom_map]