Theorem: CategoryTheory.FreeMonoidalCategory.normalizeObj_congr
File: Mathlib/CategoryTheory/Monoidal/Free/Coherence.lean

tactic: rcases f with ⟨f'⟩
state_before: C : Type u
n : NormalMonoidalObject C
X Y : F C
f : X ⟶ Y
⊢ X.normalizeObj n = Y.normalizeObj n
state_after: case mk
C : Type u
n : NormalMonoidalObject C
X Y : F C
f : X ⟶ Y
f' : X ⟶ᵐ Y
⊢ X.normalizeObj n = Y.normalizeObj n

tactic: apply @congr_fun _ _ fun n => normalizeObj X n
state_before: case mk
C : Type u
n : NormalMonoidalObject C
X Y : F C
f : X ⟶ Y
f' : X ⟶ᵐ Y
⊢ X.normalizeObj n = Y.normalizeObj n
state_after: case mk.h
C : Type u
n : NormalMonoidalObject C
X Y : F C
f : X ⟶ Y
f' : X ⟶ᵐ Y
⊢ (fun n => X.normalizeObj n) = Y.normalizeObj

tactic: clear n f
state_before: case mk.h
C : Type u
n : NormalMonoidalObject C
X Y : F C
f : X ⟶ Y
f' : X ⟶ᵐ Y
⊢ (fun n => X.normalizeObj n) = Y.normalizeObj
state_after: case mk.h
C : Type u
X Y : F C
f' : X ⟶ᵐ Y
⊢ (fun n => X.normalizeObj n) = Y.normalizeObj

tactic: induction f' with
| comp _ _ _ _ => apply Eq.trans <;> assumption
| whiskerLeft  _ _ ih => funext; apply congr_fun ih
| whiskerRight _ _ ih => funext; apply congr_arg₂ _ rfl (congr_fun ih _)
| @tensor W X Y Z _ _ ih₁ ih₂ =>
    funext n
    simp [congr_fun ih₁ n, congr_fun ih₂ (normalizeObj Y n)]
| _ => funext; rfl
state_before: case mk.h
C : Type u
X Y : F C
f' : X ⟶ᵐ Y
⊢ (fun n => X.normalizeObj n) = Y.normalizeObj
state_after: no goals

tactic: apply Eq.trans <;> assumption
state_before: case mk.h.comp
C : Type u
X Y X✝ Y✝ Z✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
g✝ : Y✝ ⟶ᵐ Z✝
f_ih✝ : (fun n => X✝.normalizeObj n) = Y✝.normalizeObj
g_ih✝ : (fun n => Y✝.normalizeObj n) = Z✝.normalizeObj
⊢ (fun n => X✝.normalizeObj n) = Z✝.normalizeObj
state_after: no goals

tactic: funext
state_before: case mk.h.whiskerLeft
C : Type u
X Y X✝ Y₁✝ Y₂✝ : F C
f✝ : Y₁✝ ⟶ᵐ Y₂✝
ih : (fun n => Y₁✝.normalizeObj n) = Y₂✝.normalizeObj
⊢ (fun n => (X✝.tensor Y₁✝).normalizeObj n) = (X✝.tensor Y₂✝).normalizeObj
state_after: case mk.h.whiskerLeft.h
C : Type u
X Y X✝ Y₁✝ Y₂✝ : F C
f✝ : Y₁✝ ⟶ᵐ Y₂✝
ih : (fun n => Y₁✝.normalizeObj n) = Y₂✝.normalizeObj
x✝ : NormalMonoidalObject C
⊢ (X✝.tensor Y₁✝).normalizeObj x✝ = (X✝.tensor Y₂✝).normalizeObj x✝

tactic: apply congr_fun ih
state_before: case mk.h.whiskerLeft.h
C : Type u
X Y X✝ Y₁✝ Y₂✝ : F C
f✝ : Y₁✝ ⟶ᵐ Y₂✝
ih : (fun n => Y₁✝.normalizeObj n) = Y₂✝.normalizeObj
x✝ : NormalMonoidalObject C
⊢ (X✝.tensor Y₁✝).normalizeObj x✝ = (X✝.tensor Y₂✝).normalizeObj x✝
state_after: no goals

tactic: funext
state_before: case mk.h.whiskerRight
C : Type u
X Y X₁✝ X₂✝ : F C
f✝ : X₁✝ ⟶ᵐ X₂✝
Y✝ : F C
ih : (fun n => X₁✝.normalizeObj n) = X₂✝.normalizeObj
⊢ (fun n => (X₁✝.tensor Y✝).normalizeObj n) = (X₂✝.tensor Y✝).normalizeObj
state_after: case mk.h.whiskerRight.h
C : Type u
X Y X₁✝ X₂✝ : F C
f✝ : X₁✝ ⟶ᵐ X₂✝
Y✝ : F C
ih : (fun n => X₁✝.normalizeObj n) = X₂✝.normalizeObj
x✝ : NormalMonoidalObject C
⊢ (X₁✝.tensor Y✝).normalizeObj x✝ = (X₂✝.tensor Y✝).normalizeObj x✝

tactic: apply congr_arg₂ _ rfl (congr_fun ih _)
state_before: case mk.h.whiskerRight.h
C : Type u
X Y X₁✝ X₂✝ : F C
f✝ : X₁✝ ⟶ᵐ X₂✝
Y✝ : F C
ih : (fun n => X₁✝.normalizeObj n) = X₂✝.normalizeObj
x✝ : NormalMonoidalObject C
⊢ (X₁✝.tensor Y✝).normalizeObj x✝ = (X₂✝.tensor Y✝).normalizeObj x✝
state_after: no goals

tactic: funext n
state_before: case mk.h.tensor
C : Type u
X✝ Y✝ W X Y Z : F C
f✝ : W ⟶ᵐ Y
g✝ : X ⟶ᵐ Z
ih₁ : (fun n => W.normalizeObj n) = Y.normalizeObj
ih₂ : (fun n => X.normalizeObj n) = Z.normalizeObj
⊢ (fun n => (W.tensor X).normalizeObj n) = (Y.tensor Z).normalizeObj
state_after: case mk.h.tensor.h
C : Type u
X✝ Y✝ W X Y Z : F C
f✝ : W ⟶ᵐ Y
g✝ : X ⟶ᵐ Z
ih₁ : (fun n => W.normalizeObj n) = Y.normalizeObj
ih₂ : (fun n => X.normalizeObj n) = Z.normalizeObj
n : NormalMonoidalObject C
⊢ (W.tensor X).normalizeObj n = (Y.tensor Z).normalizeObj n

tactic: simp [congr_fun ih₁ n, congr_fun ih₂ (normalizeObj Y n)]
state_before: case mk.h.tensor.h
C : Type u
X✝ Y✝ W X Y Z : F C
f✝ : W ⟶ᵐ Y
g✝ : X ⟶ᵐ Z
ih₁ : (fun n => W.normalizeObj n) = Y.normalizeObj
ih₂ : (fun n => X.normalizeObj n) = Z.normalizeObj
n : NormalMonoidalObject C
⊢ (W.tensor X).normalizeObj n = (Y.tensor Z).normalizeObj n
state_after: no goals

tactic: funext
state_before: case mk.h.ρ_inv
C : Type u
X Y X✝ : F C
⊢ (fun n => X✝.normalizeObj n) = (X✝.tensor unit).normalizeObj
state_after: case mk.h.ρ_inv.h
C : Type u
X Y X✝ : F C
x✝ : NormalMonoidalObject C
⊢ X✝.normalizeObj x✝ = (X✝.tensor unit).normalizeObj x✝

tactic: rfl
state_before: case mk.h.ρ_inv.h
C : Type u
X Y X✝ : F C
x✝ : NormalMonoidalObject C
⊢ X✝.normalizeObj x✝ = (X✝.tensor unit).normalizeObj x✝
state_after: no goals