Theorem: DFinsupp.lsum_symm_apply
File: Mathlib/LinearAlgebra/DFinsupp.lean

Proof steps:
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
c : R
f : Π₀ (i : ι), M i
⊢ { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯ }.toFun (c • f) =
    (RingHom.id R) c • { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯ }.toFun f
state_after: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
c : R
f : Π₀ (i : ι), M i
⊢ (sumAddHom fun i => (F i).toAddMonoidHom) (c • f) = c • (sumAddHom fun i => (F i).toAddMonoidHom) f
tactic: dsimp
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
c : R
f : Π₀ (i : ι), M i
⊢ (sumAddHom fun i => (F i).toAddMonoidHom) (c • f) = c • (sumAddHom fun i => (F i).toAddMonoidHom) f
state_after: case h0
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
c : R
f : Π₀ (i : ι), M i
⊢ (sumAddHom fun i => (F i).toAddMonoidHom) (c • 0) = c • (sumAddHom fun i => (F i).toAddMonoidHom) 0

case ha
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
c : R
f : Π₀ (i : ι), M i
⊢ ∀ (i : ι) (b : M i) (f : Π₀ (i : ι), M i),
    f i = 0 →
      b ≠ 0 →
        (sumAddHom fun i => (F i).toAddMonoidHom) (c • f) = c • (sumAddHom fun i => (F i).toAddMonoidHom) f →
          (sumAddHom fun i => (F i).toAddMonoidHom) (c • (single i b + f)) =
            c • (sumAddHom fun i => (F i).toAddMonoidHom) (single i b + f)
tactic: apply DFinsupp.induction f
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
⊢ (fun F i => F ∘ₗ lsingle i)
      ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
            map_add' := ⋯, map_smul' := ⋯ }.toFun
        F) =
    F
state_after: case h.h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
x✝¹ : ι
x✝ : M x✝¹
⊢ ((fun F i => F ∘ₗ lsingle i)
        ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯, map_smul' := ⋯ }.toFun
          F)
        x✝¹)
      x✝ =
    (F x✝¹) x✝
tactic: ext
state_before: case h.h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (i : ι) → M i →ₗ[R] N
x✝¹ : ι
x✝ : M x✝¹
⊢ ((fun F i => F ∘ₗ lsingle i)
        ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯, map_smul' := ⋯ }.toFun
          F)
        x✝¹)
      x✝ =
    (F x✝¹) x✝
state_after: no goals
tactic: simp
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (Π₀ (i : ι), M i) →ₗ[R] N
⊢ { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
          map_add' := ⋯, map_smul' := ⋯ }.toFun
      ((fun F i => F ∘ₗ lsingle i) F) =
    F
state_after: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (Π₀ (i : ι), M i) →ₗ[R] N
i : ι
⊢ { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
            map_add' := ⋯, map_smul' := ⋯ }.toFun
        ((fun F i => F ∘ₗ lsingle i) F) ∘ₗ
      lsingle i =
    F ∘ₗ lsingle i
tactic: refine DFinsupp.lhom_ext' (fun i ↦ ?_)
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (Π₀ (i : ι), M i) →ₗ[R] N
i : ι
⊢ { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
            map_add' := ⋯, map_smul' := ⋯ }.toFun
        ((fun F i => F ∘ₗ lsingle i) F) ∘ₗ
      lsingle i =
    F ∘ₗ lsingle i
state_after: case h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (Π₀ (i : ι), M i) →ₗ[R] N
i : ι
x✝ : M i
⊢ ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯, map_smul' := ⋯ }.toFun
          ((fun F i => F ∘ₗ lsingle i) F) ∘ₗ
        lsingle i)
      x✝ =
    (F ∘ₗ lsingle i) x✝
tactic: ext
state_before: case h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F : (Π₀ (i : ι), M i) →ₗ[R] N
i : ι
x✝ : M i
⊢ ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯, map_smul' := ⋯ }.toFun
          ((fun F i => F ∘ₗ lsingle i) F) ∘ₗ
        lsingle i)
      x✝ =
    (F ∘ₗ lsingle i) x✝
state_after: no goals
tactic: simp
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F G : (i : ι) → M i →ₗ[R] N
⊢ (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) (F + G) =
    (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) F +
      (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) G
state_after: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F G : (i : ι) → M i →ₗ[R] N
i : ι
⊢ (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) (F + G) ∘ₗ
      lsingle i =
    ((fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) F +
        (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) G) ∘ₗ
      lsingle i
tactic: refine DFinsupp.lhom_ext' (fun i ↦ ?_)
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F G : (i : ι) → M i →ₗ[R] N
i : ι
⊢ (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) (F + G) ∘ₗ
      lsingle i =
    ((fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) F +
        (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) G) ∘ₗ
      lsingle i
state_after: case h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F G : (i : ι) → M i →ₗ[R] N
i : ι
x✝ : M i
⊢ ((fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) (F + G) ∘ₗ
        lsingle i)
      x✝ =
    (((fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) F +
          (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) G) ∘ₗ
        lsingle i)
      x✝
tactic: ext
state_before: case h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
F G : (i : ι) → M i →ₗ[R] N
i : ι
x✝ : M i
⊢ ((fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) (F + G) ∘ₗ
        lsingle i)
      x✝ =
    (((fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) F +
          (fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ }) G) ∘ₗ
        lsingle i)
      x✝
state_after: no goals
tactic: simp
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
c : S
F : (i : ι) → M i →ₗ[R] N
⊢ { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
          map_add' := ⋯ }.toFun
      (c • F) =
    (RingHom.id S) c •
      { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
            map_add' := ⋯ }.toFun
        F
state_after: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
c : S
F : (i : ι) → M i →ₗ[R] N
i : ι
⊢ { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
            map_add' := ⋯ }.toFun
        (c • F) ∘ₗ
      lsingle i =
    ((RingHom.id S) c •
        { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯ }.toFun
          F) ∘ₗ
      lsingle i
tactic: refine DFinsupp.lhom_ext' (fun i ↦ ?_)
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
c : S
F : (i : ι) → M i →ₗ[R] N
i : ι
⊢ { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
            map_add' := ⋯ }.toFun
        (c • F) ∘ₗ
      lsingle i =
    ((RingHom.id S) c •
        { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯ }.toFun
          F) ∘ₗ
      lsingle i
state_after: case h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
c : S
F : (i : ι) → M i →ₗ[R] N
i : ι
x✝ : M i
⊢ ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯ }.toFun
          (c • F) ∘ₗ
        lsingle i)
      x✝ =
    (((RingHom.id S) c •
          { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
                map_add' := ⋯ }.toFun
            F) ∘ₗ
        lsingle i)
      x✝
tactic: ext
state_before: case h
ι : Type u_1
R : Type u_2
S : Type u_3
M : ι → Type u_4
N : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M i)
inst✝⁶ : (i : ι) → Module R (M i)
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
inst✝³ : DecidableEq ι
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
c : S
F : (i : ι) → M i →ₗ[R] N
i : ι
x✝ : M i
⊢ ({ toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
              map_add' := ⋯ }.toFun
          (c • F) ∘ₗ
        lsingle i)
      x✝ =
    (((RingHom.id S) c •
          { toFun := fun F => { toFun := ⇑(sumAddHom fun i => (F i).toAddMonoidHom), map_add' := ⋯, map_smul' := ⋯ },
                map_add' := ⋯ }.toFun
            F) ∘ₗ
        lsingle i)
      x✝
state_after: no goals
tactic: simp