Theorem: LinearMap.trace_prodMap'
File: Mathlib/LinearAlgebra/Trace.lean

Proof steps:
state_before: R : Type u_1
inst✝¹² : CommRing R
M : Type u_2
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
N : Type u_3
P : Type u_4
inst✝⁹ : AddCommGroup N
inst✝⁸ : Module R N
inst✝⁷ : AddCommGroup P
inst✝⁶ : Module R P
ι : Type u_5
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R N
inst✝² : Module.Finite R N
inst✝¹ : Module.Free R P
inst✝ : Module.Finite R P
f : M →ₗ[R] M
g : N →ₗ[R] N
⊢ (trace R (M × N)) (f.prodMap g) = (trace R M) f + (trace R N) g
state_after: R : Type u_1
inst✝¹² : CommRing R
M : Type u_2
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
N : Type u_3
P : Type u_4
inst✝⁹ : AddCommGroup N
inst✝⁸ : Module R N
inst✝⁷ : AddCommGroup P
inst✝⁶ : Module R P
ι : Type u_5
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R N
inst✝² : Module.Finite R N
inst✝¹ : Module.Free R P
inst✝ : Module.Finite R P
f : M →ₗ[R] M
g : N →ₗ[R] N
h : (trace R (M × N) ∘ₗ prodMapLinear R M N M N R) (f, g) = (id.coprod id ∘ₗ (trace R M).prodMap (trace R N)) (f, g)
⊢ (trace R (M × N)) (f.prodMap g) = (trace R M) f + (trace R N) g
tactic: have h := LinearMap.ext_iff.1 (trace_prodMap R M N) (f, g)
state_before: R : Type u_1
inst✝¹² : CommRing R
M : Type u_2
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
N : Type u_3
P : Type u_4
inst✝⁹ : AddCommGroup N
inst✝⁸ : Module R N
inst✝⁷ : AddCommGroup P
inst✝⁶ : Module R P
ι : Type u_5
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R N
inst✝² : Module.Finite R N
inst✝¹ : Module.Free R P
inst✝ : Module.Finite R P
f : M →ₗ[R] M
g : N →ₗ[R] N
h : (trace R (M × N) ∘ₗ prodMapLinear R M N M N R) (f, g) = (id.coprod id ∘ₗ (trace R M).prodMap (trace R N)) (f, g)
⊢ (trace R (M × N)) (f.prodMap g) = (trace R M) f + (trace R N) g
state_after: R : Type u_1
inst✝¹² : CommRing R
M : Type u_2
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
N : Type u_3
P : Type u_4
inst✝⁹ : AddCommGroup N
inst✝⁸ : Module R N
inst✝⁷ : AddCommGroup P
inst✝⁶ : Module R P
ι : Type u_5
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R N
inst✝² : Module.Finite R N
inst✝¹ : Module.Free R P
inst✝ : Module.Finite R P
f : M →ₗ[R] M
g : N →ₗ[R] N
h :
  (trace R (M × N)) (f.prodMap g) =
    { toFun := _root_.id, map_add' := ⋯, map_smul' := ⋯ } ((trace R M) f) +
      { toFun := _root_.id, map_add' := ⋯, map_smul' := ⋯ } ((trace R N) g)
⊢ (trace R (M × N)) (f.prodMap g) = (trace R M) f + (trace R N) g
tactic: simp only [coe_comp, Function.comp_apply, prodMap_apply, coprod_apply, id_coe, id,
    prodMapLinear_apply] at h
state_before: R : Type u_1
inst✝¹² : CommRing R
M : Type u_2
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
N : Type u_3
P : Type u_4
inst✝⁹ : AddCommGroup N
inst✝⁸ : Module R N
inst✝⁷ : AddCommGroup P
inst✝⁶ : Module R P
ι : Type u_5
inst✝⁵ : Module.Free R M
inst✝⁴ : Module.Finite R M
inst✝³ : Module.Free R N
inst✝² : Module.Finite R N
inst✝¹ : Module.Free R P
inst✝ : Module.Finite R P
f : M →ₗ[R] M
g : N →ₗ[R] N
h :
  (trace R (M × N)) (f.prodMap g) =
    { toFun := _root_.id, map_add' := ⋯, map_smul' := ⋯ } ((trace R M) f) +
      { toFun := _root_.id, map_add' := ⋯, map_smul' := ⋯ } ((trace R N) g)
⊢ (trace R (M × N)) (f.prodMap g) = (trace R M) f + (trace R N) g
state_after: no goals
tactic: exact h