Theorem: CategoryTheory.monoidalCounit_toNatTrans
File: Mathlib/CategoryTheory/Monoidal/NaturalTransformation.lean

Proof steps:
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).μ X Y ≫ h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ (LaxMonoidalFunctor.id D).μ X Y
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
eq :
  (F.map (G.map (F.μ (G.obj X) (G.obj Y))) ≫ h.counit.app (F.obj (G.obj X ⊗ G.obj Y))) ≫ inv (F.μ (G.obj X) (G.obj Y)) =
    (h.counit.app (F.obj (G.obj X) ⊗ F.obj (G.obj Y)) ≫ F.μ (G.obj X) (G.obj Y)) ≫ inv (F.μ (G.obj X) (G.obj Y))
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).μ X Y ≫ h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ (LaxMonoidalFunctor.id D).μ X Y
tactic: have eq := h.counit_naturality (F.μ (G.obj X) (G.obj Y)) =≫ inv (F.μ _ _)
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
eq :
  (F.map (G.map (F.μ (G.obj X) (G.obj Y))) ≫ h.counit.app (F.obj (G.obj X ⊗ G.obj Y))) ≫ inv (F.μ (G.obj X) (G.obj Y)) =
    (h.counit.app (F.obj (G.obj X) ⊗ F.obj (G.obj Y)) ≫ F.μ (G.obj X) (G.obj Y)) ≫ inv (F.μ (G.obj X) (G.obj Y))
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).μ X Y ≫ h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ (LaxMonoidalFunctor.id D).μ X Y
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
eq :
  F.map (G.map (F.μ (G.obj X) (G.obj Y))) ≫ h.counit.app (F.obj (G.obj X ⊗ G.obj Y)) ≫ inv (F.μ (G.obj X) (G.obj Y)) =
    h.counit.app (F.obj (G.obj X) ⊗ F.obj (G.obj Y))
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).μ X Y ≫ h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ (LaxMonoidalFunctor.id D).μ X Y
tactic: simp only [assoc, IsIso.hom_inv_id, comp_id] at eq
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
eq :
  F.map (G.map (F.μ (G.obj X) (G.obj Y))) ≫ h.counit.app (F.obj (G.obj X ⊗ G.obj Y)) ≫ inv (F.μ (G.obj X) (G.obj Y)) =
    h.counit.app (F.obj (G.obj X) ⊗ F.obj (G.obj Y))
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).μ X Y ≫ h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ (LaxMonoidalFunctor.id D).μ X Y
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
eq :
  F.map (G.map (F.μ (G.obj X) (G.obj Y))) ≫ h.counit.app (F.obj (G.obj X ⊗ G.obj Y)) ≫ inv (F.μ (G.obj X) (G.obj Y)) =
    h.counit.app (F.obj (G.obj X) ⊗ F.obj (G.obj Y))
⊢ (F.μ (G.obj X) (G.obj Y) ≫
        F.map
          ((h.homEquiv (G.obj X ⊗ G.obj Y) (X ⊗ Y))
            (inv (F.μ (G.obj X) (G.obj Y)) ≫ (h.counit.app X ⊗ h.counit.app Y)))) ≫
      h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ 𝟙 (X ⊗ Y)
tactic: dsimp
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
X Y : D
eq :
  F.map (G.map (F.μ (G.obj X) (G.obj Y))) ≫ h.counit.app (F.obj (G.obj X ⊗ G.obj Y)) ≫ inv (F.μ (G.obj X) (G.obj Y)) =
    h.counit.app (F.obj (G.obj X) ⊗ F.obj (G.obj Y))
⊢ (F.μ (G.obj X) (G.obj Y) ≫
        F.map
          ((h.homEquiv (G.obj X ⊗ G.obj Y) (X ⊗ Y))
            (inv (F.μ (G.obj X) (G.obj Y)) ≫ (h.counit.app X ⊗ h.counit.app Y)))) ≫
      h.counit.app (X ⊗ Y) =
    (h.counit.app X ⊗ h.counit.app Y) ≫ 𝟙 (X ⊗ Y)
state_after: no goals
tactic: simp only [Adjunction.homEquiv_unit, comp_id, assoc,
      map_comp, map_inv, h.counit_naturality, ← eq,
      h.left_triangle_components_assoc,
      IsIso.inv_hom_id_assoc, IsIso.hom_inv_id_assoc]
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).ε ≫ h.counit.app (𝟙_ D) = (LaxMonoidalFunctor.id D).ε
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
eq : (G ⋙ F.toFunctor).map F.ε ≫ h.counit.app (F.obj (𝟙_ C)) = h.counit.app (𝟙_ D) ≫ (𝟭 D).map F.ε
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).ε ≫ h.counit.app (𝟙_ D) = (LaxMonoidalFunctor.id D).ε
tactic: have eq := h.counit.naturality F.ε
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
eq : (G ⋙ F.toFunctor).map F.ε ≫ h.counit.app (F.obj (𝟙_ C)) = h.counit.app (𝟙_ D) ≫ (𝟭 D).map F.ε
⊢ (monoidalAdjoint F h ⊗⋙ F.toLaxMonoidalFunctor).ε ≫ h.counit.app (𝟙_ D) = (LaxMonoidalFunctor.id D).ε
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
eq : F.map (G.map F.ε) ≫ h.counit.app (F.obj (𝟙_ C)) = h.counit.app (𝟙_ D) ≫ F.ε
⊢ (F.ε ≫ F.map ((h.homEquiv (𝟙_ C) (𝟙_ D)) (inv F.ε))) ≫ h.counit.app (𝟙_ D) = 𝟙 (𝟙_ D)
tactic: dsimp at eq ⊢
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
inst✝² : MonoidalCategory C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F : MonoidalFunctor C D
G : D ⥤ C
h : F.toFunctor ⊣ G
eq : F.map (G.map F.ε) ≫ h.counit.app (F.obj (𝟙_ C)) = h.counit.app (𝟙_ D) ≫ F.ε
⊢ (F.ε ≫ F.map ((h.homEquiv (𝟙_ C) (𝟙_ D)) (inv F.ε))) ≫ h.counit.app (𝟙_ D) = 𝟙 (𝟙_ D)
state_after: no goals
tactic: rw [Adjunction.homEquiv_unit, map_inv, map_comp, assoc, assoc, map_inv,
      ← cancel_mono F.ε, assoc, assoc, assoc, ← eq, IsIso.inv_hom_id_assoc,
      Adjunction.left_triangle_components, comp_id, id_comp]