l3lab/ntp-mathlib huggingface dataset:
/-- `AlternatingMap.domDomCongr` as an equivalence.

This is declared separately because it does not work with dot notation. -/
@[simps apply symm_apply]
def domDomCongrEquiv (σ : ι ≃ ι') : M [Λ^ι]→ₗ[R] N ≃+ M [Λ^ι']→ₗ[R] N where
  toFun := domDomCongr σ
  invFun := domDomCongr σ.symm
  left_inv f := by
    ext
    simp [Function.comp]
  right_inv m := by
    ext
    

Proof state:
case H
R : Type u_1
inst✝¹⁴ : Semiring R
M : Type u_2
inst✝¹³ : AddCommMonoid M
inst✝¹² : Module R M
N : Type u_3
inst✝¹¹ : AddCommMonoid N
inst✝¹⁰ : Module R N
P : Type u_4
inst✝⁹ : AddCommMonoid P
inst✝⁸ : Module R P
M' : Type u_5
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M'
N' : Type u_6
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
M₃ : Type u_11
inst✝¹ : AddCommMonoid M₃
inst✝ : Module R M₃
f f' : M [Λ^ι]→ₗ[R] N
g g₂ : M [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v : ι → M
v' : ι → M'
σ : ι ≃ ι'
m : M [Λ^ι']→ₗ[R] N
x✝ : ι' → M
⊢ (domDomCongr σ (domDomCongr σ.symm m)) x✝ = m x✝

Next tactic:
simp [Function.comp]
/-- `AlternatingMap.domDomCongr` as a linear equivalence. -/
@[simps apply symm_apply]
def domDomCongrₗ (σ : ι ≃ ι') : M [Λ^ι]→ₗ[R] N ≃ₗ[S] M [Λ^ι']→ₗ[R] N where
  toFun := domDomCongr σ
  invFun := domDomCongr σ.symm
  left_inv f := by 

Proof state:
R : Type u_1
inst✝¹⁷ : Semiring R
M : Type u_2
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
N : Type u_3
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : Module R N
P : Type u_4
inst✝¹² : AddCommMonoid P
inst✝¹¹ : Module R P
M' : Type u_5
inst✝¹⁰ : AddCommGroup M'
inst✝⁹ : Module R M'
N' : Type u_6
inst✝⁸ : AddCommGroup N'
inst✝⁷ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁶ : AddCommMonoid M₂
inst✝⁵ : Module R M₂
M₃ : Type u_11
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R M₃
f✝ f' : M [Λ^ι]→ₗ[R] N
g g₂ : M [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v : ι → M
v' : ι → M'
S : Type u_12
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
σ : ι ≃ ι'
f : M [Λ^ι]→ₗ[R] N
⊢ domDomCongr σ.symm
      (AddHom.toFun
        {
            toAddHom :=
              { toFun := domDomCongr σ,
                map_add' := (_ : ∀ (f g : M [Λ^ι]→ₗ[R] N), domDomCongr σ (f + g) = domDomCongr σ f + domDomCongr σ g) },
            map_smul' := (_ : ∀ (c : S) (f : M [Λ^ι]→ₗ[R] N), domDomCongr σ (c • f) = c • domDomCongr σ f) }.toAddHom
        f) =
    f

Next tactic:
ext
/-- `AlternatingMap.domDomCongr` as a linear equivalence. -/
@[simps apply symm_apply]
def domDomCongrₗ (σ : ι ≃ ι') : M [Λ^ι]→ₗ[R] N ≃ₗ[S] M [Λ^ι']→ₗ[R] N where
  toFun := domDomCongr σ
  invFun := domDomCongr σ.symm
  left_inv f := by ext; 

Proof state:
case H
R : Type u_1
inst✝¹⁷ : Semiring R
M : Type u_2
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
N : Type u_3
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : Module R N
P : Type u_4
inst✝¹² : AddCommMonoid P
inst✝¹¹ : Module R P
M' : Type u_5
inst✝¹⁰ : AddCommGroup M'
inst✝⁹ : Module R M'
N' : Type u_6
inst✝⁸ : AddCommGroup N'
inst✝⁷ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁶ : AddCommMonoid M₂
inst✝⁵ : Module R M₂
M₃ : Type u_11
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R M₃
f✝ f' : M [Λ^ι]→ₗ[R] N
g g₂ : M [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v : ι → M
v' : ι → M'
S : Type u_12
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
σ : ι ≃ ι'
f : M [Λ^ι]→ₗ[R] N
x✝ : ι → M
⊢ (domDomCongr σ.symm
        (AddHom.toFun
          {
              toAddHom :=
                { toFun := domDomCongr σ,
                  map_add' :=
                    (_ : ∀ (f g : M [Λ^ι]→ₗ[R] N), domDomCongr σ (f + g) = domDomCongr σ f + domDomCongr σ g) },
              map_smul' := (_ : ∀ (c : S) (f : M [Λ^ι]→ₗ[R] N), domDomCongr σ (c • f) = c • domDomCongr σ f) }.toAddHom
          f))
      x✝ =
    f x✝

Next tactic:
simp [Function.comp]
/-- `AlternatingMap.domDomCongr` as a linear equivalence. -/
@[simps apply symm_apply]
def domDomCongrₗ (σ : ι ≃ ι') : M [Λ^ι]→ₗ[R] N ≃ₗ[S] M [Λ^ι']→ₗ[R] N where
  toFun := domDomCongr σ
  invFun := domDomCongr σ.symm
  left_inv f := by ext; simp [Function.comp]
  right_inv m := by 

Proof state:
R : Type u_1
inst✝¹⁷ : Semiring R
M : Type u_2
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
N : Type u_3
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : Module R N
P : Type u_4
inst✝¹² : AddCommMonoid P
inst✝¹¹ : Module R P
M' : Type u_5
inst✝¹⁰ : AddCommGroup M'
inst✝⁹ : Module R M'
N' : Type u_6
inst✝⁸ : AddCommGroup N'
inst✝⁷ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁶ : AddCommMonoid M₂
inst✝⁵ : Module R M₂
M₃ : Type u_11
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R M₃
f f' : M [Λ^ι]→ₗ[R] N
g g₂ : M [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v : ι → M
v' : ι → M'
S : Type u_12
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
σ : ι ≃ ι'
m : M [Λ^ι']→ₗ[R] N
⊢ AddHom.toFun
      {
          toAddHom :=
            { toFun := domDomCongr σ,
              map_add' := (_ : ∀ (f g : M [Λ^ι]→ₗ[R] N), domDomCongr σ (f + g) = domDomCongr σ f + domDomCongr σ g) },
          map_smul' := (_ : ∀ (c : S) (f : M [Λ^ι]→ₗ[R] N), domDomCongr σ (c • f) = c • domDomCongr σ f) }.toAddHom
      (domDomCongr σ.symm m) =
    m

Next tactic:
ext
/-- `AlternatingMap.domDomCongr` as a linear equivalence. -/
@[simps apply symm_apply]
def domDomCongrₗ (σ : ι ≃ ι') : M [Λ^ι]→ₗ[R] N ≃ₗ[S] M [Λ^ι']→ₗ[R] N where
  toFun := domDomCongr σ
  invFun := domDomCongr σ.symm
  left_inv f := by ext; simp [Function.comp]
  right_inv m := by ext; 

Proof state:
case H
R : Type u_1
inst✝¹⁷ : Semiring R
M : Type u_2
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
N : Type u_3
inst✝¹⁴ : AddCommMonoid N
inst✝¹³ : Module R N
P : Type u_4
inst✝¹² : AddCommMonoid P
inst✝¹¹ : Module R P
M' : Type u_5
inst✝¹⁰ : AddCommGroup M'
inst✝⁹ : Module R M'
N' : Type u_6
inst✝⁸ : AddCommGroup N'
inst✝⁷ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁶ : AddCommMonoid M₂
inst✝⁵ : Module R M₂
M₃ : Type u_11
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R M₃
f f' : M [Λ^ι]→ₗ[R] N
g g₂ : M [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v : ι → M
v' : ι → M'
S : Type u_12
inst✝² : Semiring S
inst✝¹ : Module S N
inst✝ : SMulCommClass R S N
σ : ι ≃ ι'
m : M [Λ^ι']→ₗ[R] N
x✝ : ι' → M
⊢ (AddHom.toFun
        {
            toAddHom :=
              { toFun := domDomCongr σ,
                map_add' := (_ : ∀ (f g : M [Λ^ι]→ₗ[R] N), domDomCongr σ (f + g) = domDomCongr σ f + domDomCongr σ g) },
            map_smul' := (_ : ∀ (c : S) (f : M [Λ^ι]→ₗ[R] N), domDomCongr σ (c • f) = c • domDomCongr σ f) }.toAddHom
        (domDomCongr σ.symm m))
      x✝ =
    m x✝

Next tactic:
simp [Function.comp]
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  

Proof state:
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h : ¬LinearIndependent K v
⊢ f v = 0

Next tactic:
obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  

Proof state:
case intro.intro.intro.intro.intro
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
h : (Finset.sum s fun i => g i • v i) = 0
i : ι
hi : i ∈ s
hz : g i ≠ 0
⊢ f v = 0

Next tactic:
letI := Classical.decEq ι
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  

Proof state:
case intro.intro.intro.intro.intro
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
h : (Finset.sum s fun i => g i • v i) = 0
i : ι
hi : i ∈ s
hz : g i ≠ 0
this : DecidableEq ι := Classical.decEq ι
⊢ f v = 0

Next tactic:
suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    exact Or.resolve_left this hz
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    

Proof state:
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
h : (Finset.sum s fun i => g i • v i) = 0
i : ι
hi : i ∈ s
hz : g i ≠ 0
this✝ : DecidableEq ι := Classical.decEq ι
this : f (update v i (g i • v i)) = 0
⊢ f v = 0

Next tactic:
rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    

Proof state:
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
h : (Finset.sum s fun i => g i • v i) = 0
i : ι
hi : i ∈ s
hz : g i ≠ 0
this✝ : DecidableEq ι := Classical.decEq ι
this : g i = 0 ∨ f v = 0
⊢ f v = 0

Next tactic:
exact Or.resolve_left this hz
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    exact Or.resolve_left this hz
  -- Porting note: Was `conv at h in .. => ..`.
  

Proof state:
case intro.intro.intro.intro.intro
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
h : (Finset.sum s fun i => g i • v i) = 0
i : ι
hi : i ∈ s
hz : g i ≠ 0
this : DecidableEq ι := Classical.decEq ι
⊢ f (update v i (g i • v i)) = 0

Next tactic:
rw [← (funext fun x => ite_self (c := i = x) (d := Classical.decEq ι i x) (g x • v x))] at h
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    exact Or.resolve_left this hz
  -- Porting note: Was `conv at h in .. => ..`.
  rw [← (funext fun x => ite_self (c := i = x) (d := Classical.decEq ι i x) (g x • v x))] at h
  

Proof state:
case intro.intro.intro.intro.intro
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
i : ι
h : (Finset.sum s fun x => if i = x then g x • v x else g x • v x) = 0
hi : i ∈ s
hz : g i ≠ 0
this : DecidableEq ι := Classical.decEq ι
⊢ f (update v i (g i • v i)) = 0

Next tactic:
rw [Finset.sum_ite, Finset.filter_eq, Finset.filter_ne, if_pos hi, Finset.sum_singleton,
    add_eq_zero_iff_eq_neg] at h
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    exact Or.resolve_left this hz
  -- Porting note: Was `conv at h in .. => ..`.
  rw [← (funext fun x => ite_self (c := i = x) (d := Classical.decEq ι i x) (g x • v x))] at h
  rw [Finset.sum_ite, Finset.filter_eq, Finset.filter_ne, if_pos hi, Finset.sum_singleton,
    add_eq_zero_iff_eq_neg] at h
  

Proof state:
case intro.intro.intro.intro.intro
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
i : ι
hi : i ∈ s
hz : g i ≠ 0
this : DecidableEq ι := Classical.decEq ι
h : g i • v i = -Finset.sum (Finset.erase s i) fun x => g x • v x
⊢ f (update v i (g i • v i)) = 0

Next tactic:
rw [h, f.map_neg, f.map_update_sum, neg_eq_zero]
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    exact Or.resolve_left this hz
  -- Porting note: Was `conv at h in .. => ..`.
  rw [← (funext fun x => ite_self (c := i = x) (d := Classical.decEq ι i x) (g x • v x))] at h
  rw [Finset.sum_ite, Finset.filter_eq, Finset.filter_ne, if_pos hi, Finset.sum_singleton,
    add_eq_zero_iff_eq_neg] at h
  rw [h, f.map_neg, f.map_update_sum, neg_eq_zero]; 

Proof state:
case intro.intro.intro.intro.intro
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
i : ι
hi : i ∈ s
hz : g i ≠ 0
this : DecidableEq ι := Classical.decEq ι
h : g i • v i = -Finset.sum (Finset.erase s i) fun x => g x • v x
⊢ (Finset.sum (Finset.erase s i) fun a => f (update v i (g a • v a))) = 0

Next tactic:
apply Finset.sum_eq_zero
/-- If the arguments are linearly dependent then the result is `0`. -/
theorem map_linearDependent {K : Type*} [Ring K] {M : Type*} [AddCommGroup M] [Module K M]
    {N : Type*} [AddCommGroup N] [Module K N] [NoZeroSMulDivisors K N] (f : M [Λ^ι]→ₗ[K] N)
    (v : ι → M) (h : ¬LinearIndependent K v) : f v = 0 := by
  obtain ⟨s, g, h, i, hi, hz⟩ := not_linearIndependent_iff.mp h
  letI := Classical.decEq ι
  suffices f (update v i (g i • v i)) = 0 by
    rw [f.map_smul, Function.update_eq_self, smul_eq_zero] at this
    exact Or.resolve_left this hz
  -- Porting note: Was `conv at h in .. => ..`.
  rw [← (funext fun x => ite_self (c := i = x) (d := Classical.decEq ι i x) (g x • v x))] at h
  rw [Finset.sum_ite, Finset.filter_eq, Finset.filter_ne, if_pos hi, Finset.sum_singleton,
    add_eq_zero_iff_eq_neg] at h
  rw [h, f.map_neg, f.map_update_sum, neg_eq_zero]; apply Finset.sum_eq_zero
  

Proof state:
case intro.intro.intro.intro.intro.h
R : Type u_1
inst✝²⁰ : Semiring R
M✝ : Type u_2
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
N✝ : Type u_3
inst✝¹⁷ : AddCommMonoid N✝
inst✝¹⁶ : Module R N✝
P : Type u_4
inst✝¹⁵ : AddCommMonoid P
inst✝¹⁴ : Module R P
M' : Type u_5
inst✝¹³ : AddCommGroup M'
inst✝¹² : Module R M'
N' : Type u_6
inst✝¹¹ : AddCommGroup N'
inst✝¹⁰ : Module R N'
ι : Type u_7
ι' : Type u_8
ι'' : Type u_9
M₂ : Type u_10
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R M₂
M₃ : Type u_11
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : Module R M₃
f✝ f' : M✝ [Λ^ι]→ₗ[R] N✝
g✝ g₂ : M✝ [Λ^ι]→ₗ[R] N'
g' : M' [Λ^ι]→ₗ[R] N'
v✝ : ι → M✝
v' : ι → M'
K : Type u_12
inst✝⁵ : Ring K
M : Type u_13
inst✝⁴ : AddCommGroup M
inst✝³ : Module K M
N : Type u_14
inst✝² : AddCommGroup N
inst✝¹ : Module K N
inst✝ : NoZeroSMulDivisors K N
f : M [Λ^ι]→ₗ[K] N
v : ι → M
h✝ : ¬LinearIndependent K v
s : Finset ι
g : ι → K
i : ι
hi : i ∈ s
hz : g i ≠ 0
this : DecidableEq ι := Classical.decEq ι
h : g i • v i = -Finset.sum (Finset.erase s i) fun x => g x • v x
⊢ ∀ x ∈ Finset.erase s i, f (update v i (g x • v x)) = 0

Next tactic:
intro j hj