Theorem: Mon_.limitConeIsLimit_lift_hom
File: Mathlib/CategoryTheory/Monoidal/Internal/Limits.lean

Proof steps:
state_before: J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
⊢ s.pt.mul ≫ limit.lift (F ⋙ forget C) ((forget C).mapCone s) =
    MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
        (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
      (limitCone F).pt.mul
state_after: J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
⊢ s.pt.mul ≫ limit.lift (F ⋙ forget C) ((forget C).mapCone s) =
    MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
        (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
      (limit F).mul
tactic: dsimp
state_before: J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
⊢ s.pt.mul ≫ limit.lift (F ⋙ forget C) ((forget C).mapCone s) =
    MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
        (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
      (limit F).mul
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
j✝ : J
⊢ (s.pt.mul ≫ limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫ limit.π (F ⋙ forget C) j✝ =
    (MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
          (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
        (limit F).mul) ≫
      limit.π (F ⋙ forget C) j✝
tactic: ext
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
j✝ : J
⊢ (s.pt.mul ≫ limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫ limit.π (F ⋙ forget C) j✝ =
    (MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
          (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
        (limit F).mul) ≫
      limit.π (F ⋙ forget C) j✝
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
j✝ : J
⊢ MonoidalCategory.tensorHom (s.π.app j✝).hom (s.π.app j✝).hom ≫ (F.obj j✝).mul =
    MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
        (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
      MonoidalCategory.tensorHom (limit.π (F ⋙ forget C) j✝) (limit.π (F ⋙ forget C) j✝) ≫
        (MonFunctorCategoryEquivalence.inverseObj F).mul.app j✝
tactic: simp only [Functor.comp_obj, forget_obj, Category.assoc, limit.lift_π, Functor.mapCone_pt,
          Functor.mapCone_π_app, forget_map, Hom.mul_hom, limit_mul, Cones.postcompose_obj_pt,
          Cones.postcompose_obj_π, NatTrans.comp_app, Functor.const_obj_obj, tensorObj_obj]
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
j✝ : J
⊢ MonoidalCategory.tensorHom (s.π.app j✝).hom (s.π.app j✝).hom ≫ (F.obj j✝).mul =
    MonoidalCategory.tensorHom (limit.lift (F ⋙ forget C) ((forget C).mapCone s))
        (limit.lift (F ⋙ forget C) ((forget C).mapCone s)) ≫
      MonoidalCategory.tensorHom (limit.π (F ⋙ forget C) j✝) (limit.π (F ⋙ forget C) j✝) ≫
        (MonFunctorCategoryEquivalence.inverseObj F).mul.app j✝
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
j✝ : J
⊢ MonoidalCategory.tensorHom (s.π.app j✝).hom (s.π.app j✝).hom ≫ (F.obj j✝).mul =
    MonoidalCategory.tensorHom (((forget C).mapCone s).π.app j✝) (((forget C).mapCone s).π.app j✝) ≫
      (MonFunctorCategoryEquivalence.inverseObj F).mul.app j✝
tactic: slice_rhs 1 2 => rw [← MonoidalCategory.tensor_comp, limit.lift_π]
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
j✝ : J
⊢ MonoidalCategory.tensorHom (s.π.app j✝).hom (s.π.app j✝).hom ≫ (F.obj j✝).mul =
    MonoidalCategory.tensorHom (((forget C).mapCone s).π.app j✝) (((forget C).mapCone s).π.app j✝) ≫
      (MonFunctorCategoryEquivalence.inverseObj F).mul.app j✝
state_after: no goals
tactic: rfl
state_before: J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
h : J
⊢ (fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s ≫
      (limitCone F).π.app h =
    s.π.app h
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
h : J
⊢ ((fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s ≫
        (limitCone F).π.app h).hom =
    (s.π.app h).hom
tactic: ext
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
h : J
⊢ ((fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s ≫
        (limitCone F).π.app h).hom =
    (s.π.app h).hom
state_after: no goals
tactic: simp
state_before: J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
⊢ m = (fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
⊢ m.hom = ((fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s).hom
tactic: ext1
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
⊢ m.hom = ((fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s).hom
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
j : J
⊢ m.hom ≫ limit.π ((monFunctorCategoryEquivalence J C).inverse.obj F).X j =
    ((fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s).hom ≫
      limit.π ((monFunctorCategoryEquivalence J C).inverse.obj F).X j
tactic: refine limit.hom_ext (fun j => ?_)
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
j : J
⊢ m.hom ≫ limit.π ((monFunctorCategoryEquivalence J C).inverse.obj F).X j =
    ((fun s => { hom := limit.lift (F ⋙ forget C) ((forget C).mapCone s), one_hom := ⋯, mul_hom := ⋯ }) s).hom ≫
      limit.π ((monFunctorCategoryEquivalence J C).inverse.obj F).X j
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
j : J
⊢ m.hom ≫ limit.π (F ⋙ forget C) j = limit.lift (F ⋙ forget C) ((forget C).mapCone s) ≫ limit.π (F ⋙ forget C) j
tactic: dsimp
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
j : J
⊢ m.hom ≫ limit.π (F ⋙ forget C) j = limit.lift (F ⋙ forget C) ((forget C).mapCone s) ≫ limit.π (F ⋙ forget C) j
state_after: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
j : J
⊢ m.hom ≫ limit.π (F ⋙ forget C) j = (s.π.app j).hom
tactic: simp only [Mon_.forget_map, limit.lift_π, Functor.mapCone_π_app]
state_before: case w
J : Type w
inst✝³ : SmallCategory J
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasLimitsOfShape J C
inst✝ : MonoidalCategory C
F : J ⥤ Mon_ C
s : Cone F
m : s.pt ⟶ (limitCone F).pt
w : ∀ (j : J), m ≫ (limitCone F).π.app j = s.π.app j
j : J
⊢ m.hom ≫ limit.π (F ⋙ forget C) j = (s.π.app j).hom
state_after: no goals
tactic: exact congr_arg Mon_.Hom.hom (w j)