[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' f g : MultilinearMap R M₁ M₂
h : (fun f => f.toFun) f = (fun f => f.toFun) g
⊢ f = g
[PROOFSTEP]
cases f
[GOAL]
case mk
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' g : MultilinearMap R M₁ M₂
toFun✝ : ((i : ι) → M₁ i) → M₂
map_add'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
h : (fun f => f.toFun) { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ } = (fun f => f.toFun) g
⊢ { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ } = g
[PROOFSTEP]
cases g
[GOAL]
case mk.mk
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
toFun✝¹ : ((i : ι) → M₁ i) → M₂
map_add'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝¹ (update m i (x + y)) = toFun✝¹ (update m i x) + toFun✝¹ (update m i y)
map_smul'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝¹ (update m i (c • x)) = c • toFun✝¹ (update m i x)
toFun✝ : ((i : ι) → M₁ i) → M₂
map_add'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
h :
  (fun f => f.toFun) { toFun := toFun✝¹, map_add' := map_add'✝¹, map_smul' := map_smul'✝¹ } =
    (fun f => f.toFun) { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ }
⊢ { toFun := toFun✝¹, map_add' := map_add'✝¹, map_smul' := map_smul'✝¹ } =
    { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ }
[PROOFSTEP]
cases h
[GOAL]
case mk.mk.refl
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
toFun✝ : ((i : ι) → M₁ i) → M₂
map_add'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
map_add'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
⊢ { toFun := toFun✝, map_add' := map_add'✝¹, map_smul' := map_smul'✝¹ } =
    { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ }
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
⊢ Injective FunLike.coe
[PROOFSTEP]
intro f g h
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' f g : MultilinearMap R M₁ M₂
h : ↑f = ↑g
⊢ f = g
[PROOFSTEP]
cases f
[GOAL]
case mk
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' g : MultilinearMap R M₁ M₂
toFun✝ : ((i : ι) → M₁ i) → M₂
map_add'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
h : ↑{ toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ } = ↑g
⊢ { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ } = g
[PROOFSTEP]
cases g
[GOAL]
case mk.mk
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
toFun✝¹ : ((i : ι) → M₁ i) → M₂
map_add'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝¹ (update m i (x + y)) = toFun✝¹ (update m i x) + toFun✝¹ (update m i y)
map_smul'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝¹ (update m i (c • x)) = c • toFun✝¹ (update m i x)
toFun✝ : ((i : ι) → M₁ i) → M₂
map_add'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
h :
  ↑{ toFun := toFun✝¹, map_add' := map_add'✝¹, map_smul' := map_smul'✝¹ } =
    ↑{ toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ }
⊢ { toFun := toFun✝¹, map_add' := map_add'✝¹, map_smul' := map_smul'✝¹ } =
    { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ }
[PROOFSTEP]
cases h
[GOAL]
case mk.mk.refl
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
toFun✝ : ((i : ι) → M₁ i) → M₂
map_add'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝¹ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
map_add'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    toFun✝ (update m i (x + y)) = toFun✝ (update m i x) + toFun✝ (update m i y)
map_smul'✝ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    toFun✝ (update m i (c • x)) = c • toFun✝ (update m i x)
⊢ { toFun := toFun✝, map_add' := map_add'✝¹, map_smul' := map_smul'✝¹ } =
    { toFun := toFun✝, map_add' := map_add'✝, map_smul' := map_smul'✝ }
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' f : MultilinearMap R M₁ M₂
h₁ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    ↑f (update m i (x + y)) = ↑f (update m i x) + ↑f (update m i y)
h₂ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    ↑f (update m i (c • x)) = c • ↑f (update m i x)
⊢ { toFun := ↑f, map_add' := h₁, map_smul' := h₂ } = f
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' f : MultilinearMap R M₁ M₂
h₁ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
    ↑f (update m i (x + y)) = ↑f (update m i x) + ↑f (update m i y)
h₂ :
  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
    ↑f (update m i (c • x)) = c • ↑f (update m i x)
x✝ : (i : ι) → M₁ i
⊢ ↑{ toFun := ↑f, map_add' := h₁, map_smul' := h₂ } x✝ = ↑f x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
i : ι
h : m i = 0
⊢ ↑f m = 0
[PROOFSTEP]
classical
have : (0 : R) • (0 : M₁ i) = 0 := by simp
rw [← update_eq_self i m, h, ← this, f.map_smul, zero_smul R (M := M₂)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
i : ι
h : m i = 0
⊢ ↑f m = 0
[PROOFSTEP]
have : (0 : R) • (0 : M₁ i) = 0 := by simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
i : ι
h : m i = 0
⊢ 0 • 0 = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
i : ι
h : m i = 0
this : 0 • 0 = 0
⊢ ↑f m = 0
[PROOFSTEP]
rw [← update_eq_self i m, h, ← this, f.map_smul, zero_smul R (M := M₂)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : Nonempty ι
⊢ ↑f 0 = 0
[PROOFSTEP]
obtain ⟨i, _⟩ : ∃ i : ι, i ∈ Set.univ := Set.exists_mem_of_nonempty ι
[GOAL]
case intro
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : Nonempty ι
i : ι
h✝ : i ∈ univ
⊢ ↑f 0 = 0
[PROOFSTEP]
exact map_coord_zero f i rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f'✝ f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun x => ↑f x + ↑f' x) (update m i (x + y)) =
    (fun x => ↑f x + ↑f' x) (update m i x) + (fun x => ↑f x + ↑f' x) (update m i y)
[PROOFSTEP]
simp [add_left_comm, add_assoc]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f'✝ f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ (fun x => ↑f x + ↑f' x) (update m i (c • x)) = c • (fun x => ↑f x + ↑f' x) (update m i x)
[PROOFSTEP]
simp [smul_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
x✝² : (i : ι) → M₁ i
i : ι
x✝¹ x✝ : M₁ i
⊢ (fun x => 0) (update x✝² i (x✝¹ + x✝)) = (fun x => 0) (update x✝² i x✝¹) + (fun x => 0) (update x✝² i x✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
x✝¹ : (i : ι) → M₁ i
i : ι
c : R
x✝ : M₁ i
⊢ (fun x => 0) (update x✝¹ i (c • x✝)) = c • (fun x => 0) (update x✝¹ i x✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁷ : Semiring R
inst✝¹⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁵ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : AddCommMonoid M₃
inst✝¹² : AddCommMonoid M'
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
inst✝⁸ : Module R M₃
inst✝⁷ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁶ : Monoid R'
inst✝⁵ : Semiring A
inst✝⁴ : (i : ι) → Module A (M₁ i)
inst✝³ : DistribMulAction R' M₂
inst✝² : Module A M₂
inst✝¹ : SMulCommClass A R' M₂
c : R'
f : MultilinearMap A M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun m => c • ↑f m) (update m i (x + y)) = (fun m => c • ↑f m) (update m i x) + (fun m => c • ↑f m) (update m i y)
[PROOFSTEP]
simp [smul_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁷ : Semiring R
inst✝¹⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁵ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : AddCommMonoid M₃
inst✝¹² : AddCommMonoid M'
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
inst✝⁸ : Module R M₃
inst✝⁷ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁶ : Monoid R'
inst✝⁵ : Semiring A
inst✝⁴ : (i : ι) → Module A (M₁ i)
inst✝³ : DistribMulAction R' M₂
inst✝² : Module A M₂
inst✝¹ : SMulCommClass A R' M₂
c : R'
f : MultilinearMap A M₁ M₂
inst✝ : DecidableEq ι
l : (i : ι) → M₁ i
i : ι
x : A
d : M₁ i
⊢ (fun m => c • ↑f m) (update l i (x • d)) = x • (fun m => c • ↑f m) (update l i d)
[PROOFSTEP]
simp [← smul_comm x c (_ : M₂)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
⊢ ∀ {s : Finset α}, ↑(∑ a in s, f a) m = ∑ a in s, ↑(f a) m
[PROOFSTEP]
classical
apply Finset.induction
· rw [Finset.sum_empty]
  simp
· intro a s has H
  rw [Finset.sum_insert has]
  simp [H, has]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
⊢ ∀ {s : Finset α}, ↑(∑ a in s, f a) m = ∑ a in s, ↑(f a) m
[PROOFSTEP]
apply Finset.induction
[GOAL]
case empty
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
⊢ ↑(∑ a in ∅, f a) m = ∑ a in ∅, ↑(f a) m
[PROOFSTEP]
rw [Finset.sum_empty]
[GOAL]
case empty
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
⊢ ↑0 m = ∑ a in ∅, ↑(f a) m
[PROOFSTEP]
simp
[GOAL]
case insert
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
⊢ ∀ ⦃a : α⦄ {s : Finset α},
    ¬a ∈ s → ↑(∑ a in s, f a) m = ∑ a in s, ↑(f a) m → ↑(∑ a in insert a s, f a) m = ∑ a in insert a s, ↑(f a) m
[PROOFSTEP]
intro a s has H
[GOAL]
case insert
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
a : α
s : Finset α
has : ¬a ∈ s
H : ↑(∑ a in s, f a) m = ∑ a in s, ↑(f a) m
⊢ ↑(∑ a in insert a s, f a) m = ∑ a in insert a s, ↑(f a) m
[PROOFSTEP]
rw [Finset.sum_insert has]
[GOAL]
case insert
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
α : Type u_1
f : α → MultilinearMap R M₁ M₂
m : (i : ι) → M₁ i
a : α
s : Finset α
has : ¬a ∈ s
H : ↑(∑ a in s, f a) m = ∑ a in s, ↑(f a) m
⊢ ↑(f a + ∑ x in s, f x) m = ∑ a in insert a s, ↑(f a) m
[PROOFSTEP]
simp [H, has]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun x => ↑f (update m i x)) (x + y) = (fun x => ↑f (update m i x)) x + (fun x => ↑f (update m i x)) y
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ AddHom.toFun
      { toFun := fun x => ↑f (update m i x),
        map_add' := (_ : ∀ (x y : M₁ i), ↑f (update m i (x + y)) = ↑f (update m i x) + ↑f (update m i y)) }
      (c • x) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        { toFun := fun x => ↑f (update m i x),
          map_add' := (_ : ∀ (x y : M₁ i), ↑f (update m i (x + y)) = ↑f (update m i x) + ↑f (update m i y)) }
        x
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' f : MultilinearMap R M₁ M₂
g : MultilinearMap R M₁ M₃
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun m => (↑f m, ↑g m)) (update m i (x + y)) =
    (fun m => (↑f m, ↑g m)) (update m i x) + (fun m => (↑f m, ↑g m)) (update m i y)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' f : MultilinearMap R M₁ M₂
g : MultilinearMap R M₁ M₃
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ (fun m => (↑f m, ↑g m)) (update m i (c • x)) = c • (fun m => (↑f m, ↑g m)) (update m i x)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝¹ : Subsingleton ι
i' : ι
inst✝ : DecidableEq ι
m : ι → M₂
i : ι
x y : M₂
⊢ eval i' (update m i (x + y)) = eval i' (update m i x) + eval i' (update m i y)
[PROOFSTEP]
rw [Subsingleton.elim i i']
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝¹ : Subsingleton ι
i' : ι
inst✝ : DecidableEq ι
m : ι → M₂
i : ι
x y : M₂
⊢ eval i' (update m i' (x + y)) = eval i' (update m i' x) + eval i' (update m i' y)
[PROOFSTEP]
simp only [Function.eval, Function.update_same]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝¹ : Subsingleton ι
i' : ι
inst✝ : DecidableEq ι
m : ι → M₂
i : ι
r : R
x : M₂
⊢ eval i' (update m i (r • x)) = r • eval i' (update m i x)
[PROOFSTEP]
rw [Subsingleton.elim i i']
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝¹ : Subsingleton ι
i' : ι
inst✝ : DecidableEq ι
m : ι → M₂
i : ι
r : R
x : M₂
⊢ eval i' (update m i' (r • x)) = r • eval i' (update m i' x)
[PROOFSTEP]
simp only [Function.eval, Function.update_same]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
x y : M'
⊢ (fun v =>
        ↑f fun j =>
          if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
      (update v i (x + y)) =
    (fun v =>
          ↑f fun j =>
            if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
        (update v i x) +
      (fun v =>
          ↑f fun j =>
            if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
        (update v i y)
[PROOFSTEP]
have : FunLike.coe (s.orderIsoOfFin hk).symm = (s.orderIsoOfFin hk).toEquiv.symm := rfl
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
x y : M'
this : ↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) = ↑(Finset.orderIsoOfFin s hk).symm
⊢ (fun v =>
        ↑f fun j =>
          if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
      (update v i (x + y)) =
    (fun v =>
          ↑f fun j =>
            if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
        (update v i x) +
      (fun v =>
          ↑f fun j =>
            if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
        (update v i y)
[PROOFSTEP]
simp only [this]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
x y : M'
this : ↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) = ↑(Finset.orderIsoOfFin s hk).symm
⊢ (↑f fun j =>
      if h : j ∈ s then update v i (x + y) (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h })
      else z) =
    (↑f fun j =>
        if h : j ∈ s then update v i x (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h })
        else z) +
      ↑f fun j =>
        if h : j ∈ s then update v i y (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z
[PROOFSTEP]
erw [dite_comp_equiv_update (s.orderIsoOfFin hk).toEquiv, dite_comp_equiv_update (s.orderIsoOfFin hk).toEquiv,
  dite_comp_equiv_update (s.orderIsoOfFin hk).toEquiv]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
x y : M'
this : ↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) = ↑(Finset.orderIsoOfFin s hk).symm
⊢ ↑f
      (update (fun i => if h : i ∈ s then v (↑(Finset.orderIsoOfFin s hk).symm { val := i, property := h }) else z)
        (↑(↑(Finset.orderIsoOfFin s hk).toEquiv i)) (x + y)) =
    ↑f
        (update (fun i => if h : i ∈ s then v (↑(Finset.orderIsoOfFin s hk).symm { val := i, property := h }) else z)
          (↑(↑(Finset.orderIsoOfFin s hk).toEquiv i)) x) +
      ↑f
        (update (fun i => if h : i ∈ s then v (↑(Finset.orderIsoOfFin s hk).symm { val := i, property := h }) else z)
          (↑(↑(Finset.orderIsoOfFin s hk).toEquiv i)) y)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
c : R
x : M'
⊢ (fun v =>
        ↑f fun j =>
          if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
      (update v i (c • x)) =
    c •
      (fun v =>
          ↑f fun j =>
            if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
        (update v i x)
[PROOFSTEP]
have : FunLike.coe (s.orderIsoOfFin hk).symm = (s.orderIsoOfFin hk).toEquiv.symm := rfl
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
c : R
x : M'
this : ↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) = ↑(Finset.orderIsoOfFin s hk).symm
⊢ (fun v =>
        ↑f fun j =>
          if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
      (update v i (c • x)) =
    c •
      (fun v =>
          ↑f fun j =>
            if h : j ∈ s then v (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z)
        (update v i x)
[PROOFSTEP]
simp only [this]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
c : R
x : M'
this : ↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) = ↑(Finset.orderIsoOfFin s hk).symm
⊢ (↑f fun j =>
      if h : j ∈ s then update v i (c • x) (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h })
      else z) =
    c •
      ↑f fun j =>
        if h : j ∈ s then update v i x (↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) { val := j, property := h }) else z
[PROOFSTEP]
erw [dite_comp_equiv_update (s.orderIsoOfFin hk).toEquiv, dite_comp_equiv_update (s.orderIsoOfFin hk).toEquiv]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
k n : ℕ
f : MultilinearMap R (fun x => M') M₂
s : Finset (Fin n)
hk : Finset.card s = k
z : M'
inst✝ : DecidableEq (Fin k)
v : Fin k → M'
i : Fin k
c : R
x : M'
this : ↑(OrderIso.symm (Finset.orderIsoOfFin s hk)) = ↑(Finset.orderIsoOfFin s hk).symm
⊢ ↑f
      (update (fun i => if h : i ∈ s then v (↑(Finset.orderIsoOfFin s hk).symm { val := i, property := h }) else z)
        (↑(↑(Finset.orderIsoOfFin s hk).toEquiv i)) (c • x)) =
    c •
      ↑f
        (update (fun i => if h : i ∈ s then v (↑(Finset.orderIsoOfFin s hk).symm { val := i, property := h }) else z)
          (↑(↑(Finset.orderIsoOfFin s hk).toEquiv i)) x)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (succ i)
x y : M 0
⊢ ↑f (cons (x + y) m) = ↑f (cons x m) + ↑f (cons y m)
[PROOFSTEP]
simp_rw [← update_cons_zero x m (x + y), f.map_add, update_cons_zero]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (succ i)
c : R
x : M 0
⊢ ↑f (cons (c • x) m) = c • ↑f (cons x m)
[PROOFSTEP]
simp_rw [← update_cons_zero x m (c • x), f.map_smul, update_cons_zero]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
x y : M (last n)
⊢ ↑f (snoc m (x + y)) = ↑f (snoc m x) + ↑f (snoc m y)
[PROOFSTEP]
simp_rw [← update_snoc_last x m (x + y), f.map_add, update_snoc_last]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
c : R
x : M (last n)
⊢ ↑f (snoc m (c • x)) = c • ↑f (snoc m x)
[PROOFSTEP]
simp_rw [← update_snoc_last x m (c • x), f.map_smul, update_snoc_last]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : Semiring R
inst✝¹⁴ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : AddCommMonoid M₃
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁸ : (i : ι) → Module R (M₁ i)
inst✝⁷ : Module R M₂
inst✝⁶ : Module R M₃
inst✝⁵ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝⁴ : (i : ι) → AddCommMonoid (M₁' i)
inst✝³ : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝² : (i : ι) → AddCommMonoid (M₁'' i)
inst✝¹ : (i : ι) → Module R (M₁'' i)
g : MultilinearMap R M₁' M₂
f : (i : ι) → M₁ i →ₗ[R] M₁' i
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun m => ↑g fun i => ↑(f i) (m i)) (update m i (x + y)) =
    (fun m => ↑g fun i => ↑(f i) (m i)) (update m i x) + (fun m => ↑g fun i => ↑(f i) (m i)) (update m i y)
[PROOFSTEP]
have : ∀ j z, f j (update m i z j) = update (fun k => f k (m k)) i (f i z) j := fun j z =>
  Function.apply_update (fun k => f k) _ _ _ _
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : Semiring R
inst✝¹⁴ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : AddCommMonoid M₃
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁸ : (i : ι) → Module R (M₁ i)
inst✝⁷ : Module R M₂
inst✝⁶ : Module R M₃
inst✝⁵ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝⁴ : (i : ι) → AddCommMonoid (M₁' i)
inst✝³ : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝² : (i : ι) → AddCommMonoid (M₁'' i)
inst✝¹ : (i : ι) → Module R (M₁'' i)
g : MultilinearMap R M₁' M₂
f : (i : ι) → M₁ i →ₗ[R] M₁' i
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
this : ∀ (j : ι) (z : M₁ i), ↑(f j) (update m i z j) = update (fun k => ↑(f k) (m k)) i (↑(f i) z) j
⊢ (fun m => ↑g fun i => ↑(f i) (m i)) (update m i (x + y)) =
    (fun m => ↑g fun i => ↑(f i) (m i)) (update m i x) + (fun m => ↑g fun i => ↑(f i) (m i)) (update m i y)
[PROOFSTEP]
simp [this]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : Semiring R
inst✝¹⁴ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : AddCommMonoid M₃
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁸ : (i : ι) → Module R (M₁ i)
inst✝⁷ : Module R M₂
inst✝⁶ : Module R M₃
inst✝⁵ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝⁴ : (i : ι) → AddCommMonoid (M₁' i)
inst✝³ : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝² : (i : ι) → AddCommMonoid (M₁'' i)
inst✝¹ : (i : ι) → Module R (M₁'' i)
g : MultilinearMap R M₁' M₂
f : (i : ι) → M₁ i →ₗ[R] M₁' i
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ (fun m => ↑g fun i => ↑(f i) (m i)) (update m i (c • x)) = c • (fun m => ↑g fun i => ↑(f i) (m i)) (update m i x)
[PROOFSTEP]
have : ∀ j z, f j (update m i z j) = update (fun k => f k (m k)) i (f i z) j := fun j z =>
  Function.apply_update (fun k => f k) _ _ _ _
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : Semiring R
inst✝¹⁴ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : AddCommMonoid M₃
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁸ : (i : ι) → Module R (M₁ i)
inst✝⁷ : Module R M₂
inst✝⁶ : Module R M₃
inst✝⁵ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝⁴ : (i : ι) → AddCommMonoid (M₁' i)
inst✝³ : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝² : (i : ι) → AddCommMonoid (M₁'' i)
inst✝¹ : (i : ι) → Module R (M₁'' i)
g : MultilinearMap R M₁' M₂
f : (i : ι) → M₁ i →ₗ[R] M₁' i
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
this : ∀ (j : ι) (z : M₁ i), ↑(f j) (update m i z j) = update (fun k => ↑(f k) (m k)) i (↑(f i) z) j
⊢ (fun m => ↑g fun i => ↑(f i) (m i)) (update m i (c • x)) = c • (fun m => ↑g fun i => ↑(f i) (m i)) (update m i x)
[PROOFSTEP]
simp [this]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : Semiring R
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : AddCommMonoid M₃
inst✝⁹ : AddCommMonoid M'
inst✝⁸ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁷ : (i : ι) → Module R (M₁ i)
inst✝⁶ : Module R M₂
inst✝⁵ : Module R M₃
inst✝⁴ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝³ : (i : ι) → AddCommMonoid (M₁' i)
inst✝² : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝¹ : (i : ι) → AddCommMonoid (M₁'' i)
inst✝ : (i : ι) → Module R (M₁'' i)
f : (i : ι) → M₁ i →ₗ[R] M₁' i
hf : ∀ (i : ι), Surjective ↑(f i)
g₁ g₂ : MultilinearMap R M₁' M₂
h : (fun g => compLinearMap g f) g₁ = (fun g => compLinearMap g f) g₂
x : (i : ι) → M₁' i
⊢ ↑g₁ x = ↑g₂ x
[PROOFSTEP]
simpa [fun i => surjInv_eq (hf i)] using ext_iff.mp h fun i => surjInv (hf i) (x i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : Semiring R
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : AddCommMonoid M₃
inst✝⁹ : AddCommMonoid M'
inst✝⁸ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁷ : (i : ι) → Module R (M₁ i)
inst✝⁶ : Module R M₂
inst✝⁵ : Module R M₃
inst✝⁴ : Module R M'
f✝ f' : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝³ : (i : ι) → AddCommMonoid (M₁' i)
inst✝² : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝¹ : (i : ι) → AddCommMonoid (M₁'' i)
inst✝ : (i : ι) → Module R (M₁'' i)
g : MultilinearMap R M₁' M₂
f : (i : ι) → M₁ i ≃ₗ[R] M₁' i
⊢ (compLinearMap g fun i => ↑(f i)) = 0 ↔ g = 0
[PROOFSTEP]
set f' := fun i => (f i : M₁ i →ₗ[R] M₁' i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : Semiring R
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : AddCommMonoid M₃
inst✝⁹ : AddCommMonoid M'
inst✝⁸ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁷ : (i : ι) → Module R (M₁ i)
inst✝⁶ : Module R M₂
inst✝⁵ : Module R M₃
inst✝⁴ : Module R M'
f✝ f'✝ : MultilinearMap R M₁ M₂
M₁' : ι → Type u_1
inst✝³ : (i : ι) → AddCommMonoid (M₁' i)
inst✝² : (i : ι) → Module R (M₁' i)
M₁'' : ι → Type u_2
inst✝¹ : (i : ι) → AddCommMonoid (M₁'' i)
inst✝ : (i : ι) → Module R (M₁'' i)
g : MultilinearMap R M₁' M₂
f : (i : ι) → M₁ i ≃ₗ[R] M₁' i
f' : (i : ι) → M₁ i →ₗ[R] M₁' i := fun i => ↑(f i)
⊢ compLinearMap g f' = 0 ↔ g = 0
[PROOFSTEP]
rw [← zero_compLinearMap f', compLinearMap_inj f' fun i => (f i).surjective]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m m' : (i : ι) → M₁ i
t : Finset ι
⊢ ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
[PROOFSTEP]
revert m'
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t : Finset ι
⊢ ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
[PROOFSTEP]
refine' Finset.induction_on t (by simp) _
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t : Finset ι
⊢ ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise ∅ (m + m') m') = ∑ s in Finset.powerset ∅, ↑f (Finset.piecewise s m m')
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t : Finset ι
⊢ ∀ ⦃a : ι⦄ {s : Finset ι},
    ¬a ∈ s →
      (∀ (m' : (i : ι) → M₁ i),
          ↑f (Finset.piecewise s (m + m') m') = ∑ s in Finset.powerset s, ↑f (Finset.piecewise s m m')) →
        ∀ (m' : (i : ι) → M₁ i),
          ↑f (Finset.piecewise (insert a s) (m + m') m') =
            ∑ s in Finset.powerset (insert a s), ↑f (Finset.piecewise s m m')
[PROOFSTEP]
intro i t hit Hrec m'
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
⊢ ↑f (Finset.piecewise (insert i t) (m + m') m') = ∑ s in Finset.powerset (insert i t), ↑f (Finset.piecewise s m m')
[PROOFSTEP]
have A : (insert i t).piecewise (m + m') m' = update (t.piecewise (m + m') m') i (m i + m' i) :=
  t.piecewise_insert _ _ _
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
⊢ ↑f (Finset.piecewise (insert i t) (m + m') m') = ∑ s in Finset.powerset (insert i t), ↑f (Finset.piecewise s m m')
[PROOFSTEP]
have B : update (t.piecewise (m + m') m') i (m' i) = t.piecewise (m + m') m' :=
  by
  ext j
  by_cases h : j = i
  · rw [h]
    simp [hit]
  · simp [h]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
⊢ update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
[PROOFSTEP]
ext j
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
j : ι
⊢ update (Finset.piecewise t (m + m') m') i (m' i) j = Finset.piecewise t (m + m') m' j
[PROOFSTEP]
by_cases h : j = i
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
j : ι
h : j = i
⊢ update (Finset.piecewise t (m + m') m') i (m' i) j = Finset.piecewise t (m + m') m' j
[PROOFSTEP]
rw [h]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
j : ι
h : j = i
⊢ update (Finset.piecewise t (m + m') m') i (m' i) i = Finset.piecewise t (m + m') m' i
[PROOFSTEP]
simp [hit]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
j : ι
h : ¬j = i
⊢ update (Finset.piecewise t (m + m') m') i (m' i) j = Finset.piecewise t (m + m') m' j
[PROOFSTEP]
simp [h]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
⊢ ↑f (Finset.piecewise (insert i t) (m + m') m') = ∑ s in Finset.powerset (insert i t), ↑f (Finset.piecewise s m m')
[PROOFSTEP]
let m'' := update m' i (m i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
⊢ ↑f (Finset.piecewise (insert i t) (m + m') m') = ∑ s in Finset.powerset (insert i t), ↑f (Finset.piecewise s m m')
[PROOFSTEP]
have C : update (t.piecewise (m + m') m') i (m i) = t.piecewise (m + m'') m'' :=
  by
  ext j
  by_cases h : j = i
  · rw [h]
    simp [hit]
  · by_cases h' : j ∈ t <;> simp [h, hit, h']
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
⊢ update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
[PROOFSTEP]
ext j
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
j : ι
⊢ update (Finset.piecewise t (m + m') m') i (m i) j = Finset.piecewise t (m + m'') m'' j
[PROOFSTEP]
by_cases h : j = i
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
j : ι
h : j = i
⊢ update (Finset.piecewise t (m + m') m') i (m i) j = Finset.piecewise t (m + m'') m'' j
[PROOFSTEP]
rw [h]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
j : ι
h : j = i
⊢ update (Finset.piecewise t (m + m') m') i (m i) i = Finset.piecewise t (m + m'') m'' i
[PROOFSTEP]
simp [hit]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
j : ι
h : ¬j = i
⊢ update (Finset.piecewise t (m + m') m') i (m i) j = Finset.piecewise t (m + m'') m'' j
[PROOFSTEP]
by_cases h' : j ∈ t
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
j : ι
h : ¬j = i
h' : j ∈ t
⊢ update (Finset.piecewise t (m + m') m') i (m i) j = Finset.piecewise t (m + m'') m'' j
[PROOFSTEP]
simp [h, hit, h']
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
j : ι
h : ¬j = i
h' : ¬j ∈ t
⊢ update (Finset.piecewise t (m + m') m') i (m i) j = Finset.piecewise t (m + m'') m'' j
[PROOFSTEP]
simp [h, hit, h']
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
⊢ ↑f (Finset.piecewise (insert i t) (m + m') m') = ∑ s in Finset.powerset (insert i t), ↑f (Finset.piecewise s m m')
[PROOFSTEP]
rw [A, f.map_add, B, C, Finset.sum_powerset_insert hit, Hrec, Hrec, add_comm (_ : M₂)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
⊢ ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m') + ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m'') =
    ∑ a in Finset.powerset t, ↑f (Finset.piecewise a m m') +
      ∑ t in Finset.powerset t, ↑f (Finset.piecewise (insert i t) m m')
[PROOFSTEP]
congr 1
[GOAL]
case e_a
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
⊢ ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m'') =
    ∑ t in Finset.powerset t, ↑f (Finset.piecewise (insert i t) m m')
[PROOFSTEP]
refine Finset.sum_congr rfl fun s hs => ?_
[GOAL]
case e_a
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
⊢ ↑f (Finset.piecewise s m m'') = ↑f (Finset.piecewise (insert i s) m m')
[PROOFSTEP]
have : (insert i s).piecewise m m' = s.piecewise m m'' :=
  by
  ext j
  by_cases h : j = i
  · rw [h]
    simp [Finset.not_mem_of_mem_powerset_of_not_mem hs hit]
  · by_cases h' : j ∈ s <;> simp [h, h']
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
⊢ Finset.piecewise (insert i s) m m' = Finset.piecewise s m m''
[PROOFSTEP]
ext j
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
j : ι
⊢ Finset.piecewise (insert i s) m m' j = Finset.piecewise s m m'' j
[PROOFSTEP]
by_cases h : j = i
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
j : ι
h : j = i
⊢ Finset.piecewise (insert i s) m m' j = Finset.piecewise s m m'' j
[PROOFSTEP]
rw [h]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
j : ι
h : j = i
⊢ Finset.piecewise (insert i s) m m' i = Finset.piecewise s m m'' i
[PROOFSTEP]
simp [Finset.not_mem_of_mem_powerset_of_not_mem hs hit]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
j : ι
h : ¬j = i
⊢ Finset.piecewise (insert i s) m m' j = Finset.piecewise s m m'' j
[PROOFSTEP]
by_cases h' : j ∈ s
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
j : ι
h : ¬j = i
h' : j ∈ s
⊢ Finset.piecewise (insert i s) m m' j = Finset.piecewise s m m'' j
[PROOFSTEP]
simp [h, h']
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
j : ι
h : ¬j = i
h' : ¬j ∈ s
⊢ Finset.piecewise (insert i s) m m' j = Finset.piecewise s m m'' j
[PROOFSTEP]
simp [h, h']
[GOAL]
case e_a
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
t✝ : Finset ι
i : ι
t : Finset ι
hit : ¬i ∈ t
Hrec :
  ∀ (m' : (i : ι) → M₁ i), ↑f (Finset.piecewise t (m + m') m') = ∑ s in Finset.powerset t, ↑f (Finset.piecewise s m m')
m' : (i : ι) → M₁ i
A : Finset.piecewise (insert i t) (m + m') m' = update (Finset.piecewise t (m + m') m') i (m i + m' i)
B : update (Finset.piecewise t (m + m') m') i (m' i) = Finset.piecewise t (m + m') m'
m'' : (a : ι) → M₁ a := update m' i (m i)
C : update (Finset.piecewise t (m + m') m') i (m i) = Finset.piecewise t (m + m'') m''
s : Finset ι
hs : s ∈ Finset.powerset t
this : Finset.piecewise (insert i s) m m' = Finset.piecewise s m m''
⊢ ↑f (Finset.piecewise s m m'') = ↑f (Finset.piecewise (insert i s) m m')
[PROOFSTEP]
rw [this]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
m m' : (i : ι) → M₁ i
⊢ ↑f (m + m') = ∑ s : Finset ι, ↑f (Finset.piecewise s m m')
[PROOFSTEP]
simpa using f.map_piecewise_add m m' Finset.univ
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n : ℕ
h : ∑ i : ι, Finset.card (A i) = n
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
letI := fun i => Classical.decEq (α i)
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n : ℕ
h : ∑ i : ι, Finset.card (A i) = n
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
induction' n using Nat.strong_induction_on with n IH generalizing A
[GOAL]
case h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
by_cases Ai_empty : ∃ i, A i = ∅
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∃ i, A i = ∅
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
rcases Ai_empty with ⟨i, hi⟩
[GOAL]
case pos.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have : ∑ j in A i, g i j = 0 := by rw [hi, Finset.sum_empty]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
⊢ ∑ j in A i, g i j = 0
[PROOFSTEP]
rw [hi, Finset.sum_empty]
[GOAL]
case pos.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
this : ∑ j in A i, g i j = 0
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
rw [f.map_coord_zero i this]
[GOAL]
case pos.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
this : ∑ j in A i, g i j = 0
⊢ 0 = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have : piFinset A = ∅ := by
  refine Finset.eq_empty_of_forall_not_mem fun r hr => ?_
  have : r i ∈ A i := mem_piFinset.mp hr i
  simp [hi] at this
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
this : ∑ j in A i, g i j = 0
⊢ piFinset A = ∅
[PROOFSTEP]
refine Finset.eq_empty_of_forall_not_mem fun r hr => ?_
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
this : ∑ j in A i, g i j = 0
r : (a : ι) → α a
hr : r ∈ piFinset A
⊢ False
[PROOFSTEP]
have : r i ∈ A i := mem_piFinset.mp hr i
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝¹ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
this✝ : ∑ j in A i, g i j = 0
r : (a : ι) → α a
hr : r ∈ piFinset A
this : r i ∈ A i
⊢ False
[PROOFSTEP]
simp [hi] at this
[GOAL]
case pos.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝¹ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
i : ι
hi : A i = ∅
this✝ : ∑ j in A i, g i j = 0
this : piFinset A = ∅
⊢ 0 = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
rw [this, Finset.sum_empty]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ¬∃ i, A i = ∅
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
push_neg at Ai_empty
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
by_cases Ai_singleton : ∀ i, (A i).card ≤ 1
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have Ai_card : ∀ i, (A i).card = 1 := by
  intro i
  have pos : Finset.card (A i) ≠ 0 := by simp [Finset.card_eq_zero, Ai_empty i]
  have : Finset.card (A i) ≤ 1 := Ai_singleton i
  exact le_antisymm this (Nat.succ_le_of_lt (_root_.pos_iff_ne_zero.mpr pos))
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
⊢ ∀ (i : ι), Finset.card (A i) = 1
[PROOFSTEP]
intro i
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
i : ι
⊢ Finset.card (A i) = 1
[PROOFSTEP]
have pos : Finset.card (A i) ≠ 0 := by simp [Finset.card_eq_zero, Ai_empty i]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
i : ι
⊢ Finset.card (A i) ≠ 0
[PROOFSTEP]
simp [Finset.card_eq_zero, Ai_empty i]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
i : ι
pos : Finset.card (A i) ≠ 0
⊢ Finset.card (A i) = 1
[PROOFSTEP]
have : Finset.card (A i) ≤ 1 := Ai_singleton i
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
i : ι
pos : Finset.card (A i) ≠ 0
this : Finset.card (A i) ≤ 1
⊢ Finset.card (A i) = 1
[PROOFSTEP]
exact le_antisymm this (Nat.succ_le_of_lt (_root_.pos_iff_ne_zero.mpr pos))
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have : ∀ r : ∀ i, α i, r ∈ piFinset A → (f fun i => g i (r i)) = f fun i => ∑ j in A i, g i j :=
  by
  intro r hr
  congr with i
  have : ∀ j ∈ A i, g i j = g i (r i) := by
    intro j hj
    congr
    apply Finset.card_le_one_iff.1 (Ai_singleton i) hj
    exact mem_piFinset.mp hr i
  simp only [Finset.sum_congr rfl this, Finset.mem_univ, Finset.sum_const, Ai_card i, one_nsmul]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
⊢ ∀ (r : (i : ι) → α i), r ∈ piFinset A → (↑f fun i => g i (r i)) = ↑f fun i => ∑ j in A i, g i j
[PROOFSTEP]
intro r hr
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
⊢ (↑f fun i => g i (r i)) = ↑f fun i => ∑ j in A i, g i j
[PROOFSTEP]
congr with i
[GOAL]
case h.e_6.h.h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
i : ι
⊢ g i (r i) = ∑ j in A i, g i j
[PROOFSTEP]
have : ∀ j ∈ A i, g i j = g i (r i) := by
  intro j hj
  congr
  apply Finset.card_le_one_iff.1 (Ai_singleton i) hj
  exact mem_piFinset.mp hr i
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
i : ι
⊢ ∀ (j : α i), j ∈ A i → g i j = g i (r i)
[PROOFSTEP]
intro j hj
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
i : ι
j : α i
hj : j ∈ A i
⊢ g i j = g i (r i)
[PROOFSTEP]
congr
[GOAL]
case e_a
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
i : ι
j : α i
hj : j ∈ A i
⊢ j = r i
[PROOFSTEP]
apply Finset.card_le_one_iff.1 (Ai_singleton i) hj
[GOAL]
case e_a
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
i : ι
j : α i
hj : j ∈ A i
⊢ r i ∈ A i
[PROOFSTEP]
exact mem_piFinset.mp hr i
[GOAL]
case h.e_6.h.h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
r : (i : ι) → α i
hr : r ∈ piFinset A
i : ι
this : ∀ (j : α i), j ∈ A i → g i j = g i (r i)
⊢ g i (r i) = ∑ j in A i, g i j
[PROOFSTEP]
simp only [Finset.sum_congr rfl this, Finset.mem_univ, Finset.sum_const, Ai_card i, one_nsmul]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∀ (i : ι), Finset.card (A i) ≤ 1
Ai_card : ∀ (i : ι), Finset.card (A i) = 1
this : ∀ (r : (i : ι) → α i), r ∈ piFinset A → (↑f fun i => g i (r i)) = ↑f fun i => ∑ j in A i, g i j
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
simp only [Finset.sum_congr rfl this, Ai_card, card_piFinset, prod_const_one, one_nsmul, Finset.sum_const]
  -- Remains the interesting case where one of the `A i`, say `A i₀`, has cardinality at least 2.
    -- We will split into two parts `B i₀` and `C i₀` of smaller cardinality, let `B i = C i = A i`
    -- for `i ≠ i₀`, apply the inductive assumption to `B` and `C`, and add up the corresponding
    -- parts to get the sum for `A`.
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ¬∀ (i : ι), Finset.card (A i) ≤ 1
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
push_neg at Ai_singleton
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
Ai_singleton : ∃ i, 1 < Finset.card (A i)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
obtain ⟨i₀, hi₀⟩ : ∃ i, 1 < (A i).card := Ai_singleton
[GOAL]
case neg.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
obtain ⟨j₁, j₂, _, hj₂, _⟩ : ∃ j₁ j₂, j₁ ∈ A i₀ ∧ j₂ ∈ A i₀ ∧ j₁ ≠ j₂ := Finset.one_lt_card_iff.1 hi₀
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
let B := Function.update A i₀ (A i₀ \ { j₂ })
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
let C := Function.update A i₀ { j₂ }
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have B_subset_A : ∀ i, B i ⊆ A i := by
  intro i
  by_cases hi : i = i₀
  · rw [hi]
    simp only [sdiff_subset, update_same]
  · simp only [hi, update_noteq, Ne.def, not_false_iff, Finset.Subset.refl]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
⊢ ∀ (i : ι), B i ⊆ A i
[PROOFSTEP]
intro i
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
i : ι
⊢ B i ⊆ A i
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
i : ι
hi : i = i₀
⊢ B i ⊆ A i
[PROOFSTEP]
rw [hi]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
i : ι
hi : i = i₀
⊢ B i₀ ⊆ A i₀
[PROOFSTEP]
simp only [sdiff_subset, update_same]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
i : ι
hi : ¬i = i₀
⊢ B i ⊆ A i
[PROOFSTEP]
simp only [hi, update_noteq, Ne.def, not_false_iff, Finset.Subset.refl]
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have C_subset_A : ∀ i, C i ⊆ A i := by
  intro i
  by_cases hi : i = i₀
  · rw [hi]
    simp only [hj₂, Finset.singleton_subset_iff, update_same]
  ·
    simp only [hi, update_noteq, Ne.def, not_false_iff, Finset.Subset.refl]
      -- split the sum at `i₀` as the sum over `B i₀` plus the sum over `C i₀`, to use additivity.
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
⊢ ∀ (i : ι), C i ⊆ A i
[PROOFSTEP]
intro i
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
i : ι
⊢ C i ⊆ A i
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
i : ι
hi : i = i₀
⊢ C i ⊆ A i
[PROOFSTEP]
rw [hi]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
i : ι
hi : i = i₀
⊢ C i₀ ⊆ A i₀
[PROOFSTEP]
simp only [hj₂, Finset.singleton_subset_iff, update_same]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
i : ι
hi : ¬i = i₀
⊢ C i ⊆ A i
[PROOFSTEP]
simp only [hi, update_noteq, Ne.def, not_false_iff, Finset.Subset.refl]
  -- split the sum at `i₀` as the sum over `B i₀` plus the sum over `C i₀`, to use additivity.
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have A_eq_BC :
  (fun i => ∑ j in A i, g i j) =
    Function.update (fun i => ∑ j in A i, g i j) i₀ ((∑ j in B i₀, g i₀ j) + ∑ j in C i₀, g i₀ j) :=
  by
  ext i
  by_cases hi : i = i₀
  · rw [hi, update_same]
    have : A i₀ = B i₀ ∪ C i₀ :=
      by
      simp only [Function.update_same, Finset.sdiff_union_self_eq_union]
      symm
      simp only [hj₂, Finset.singleton_subset_iff, Finset.union_eq_left_iff_subset]
    rw [this]
    refine Finset.sum_union <| Finset.disjoint_right.2 fun j hj => ?_
    have : j = j₂ := by simpa using hj
    rw [this]
    simp only [mem_sdiff, eq_self_iff_true, not_true, not_false_iff, Finset.mem_singleton, update_same, and_false_iff]
  · simp [hi]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
⊢ (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
[PROOFSTEP]
ext i
[GOAL]
case h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
⊢ ∑ j in A i, g i j = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j) i
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
⊢ ∑ j in A i, g i j = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j) i
[PROOFSTEP]
rw [hi, update_same]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
⊢ ∑ j in A i₀, g i₀ j = ∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j
[PROOFSTEP]
have : A i₀ = B i₀ ∪ C i₀ :=
  by
  simp only [Function.update_same, Finset.sdiff_union_self_eq_union]
  symm
  simp only [hj₂, Finset.singleton_subset_iff, Finset.union_eq_left_iff_subset]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
⊢ A i₀ = B i₀ ∪ C i₀
[PROOFSTEP]
simp only [Function.update_same, Finset.sdiff_union_self_eq_union]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
⊢ A i₀ = A i₀ ∪ {j₂}
[PROOFSTEP]
symm
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
⊢ A i₀ ∪ {j₂} = A i₀
[PROOFSTEP]
simp only [hj₂, Finset.singleton_subset_iff, Finset.union_eq_left_iff_subset]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
this : A i₀ = B i₀ ∪ C i₀
⊢ ∑ j in A i₀, g i₀ j = ∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j
[PROOFSTEP]
rw [this]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
this : A i₀ = B i₀ ∪ C i₀
⊢ ∑ j in B i₀ ∪ C i₀, g i₀ j = ∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j
[PROOFSTEP]
refine Finset.sum_union <| Finset.disjoint_right.2 fun j hj => ?_
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
this : A i₀ = B i₀ ∪ C i₀
j : α i₀
hj : j ∈ C i₀
⊢ ¬j ∈ B i₀
[PROOFSTEP]
have : j = j₂ := by simpa using hj
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
this : A i₀ = B i₀ ∪ C i₀
j : α i₀
hj : j ∈ C i₀
⊢ j = j₂
[PROOFSTEP]
simpa using hj
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝¹ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
this✝ : A i₀ = B i₀ ∪ C i₀
j : α i₀
hj : j ∈ C i₀
this : j = j₂
⊢ ¬j ∈ B i₀
[PROOFSTEP]
rw [this]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝¹ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : i = i₀
this✝ : A i₀ = B i₀ ∪ C i₀
j : α i₀
hj : j ∈ C i₀
this : j = j₂
⊢ ¬j₂ ∈ B i₀
[PROOFSTEP]
simp only [mem_sdiff, eq_self_iff_true, not_true, not_false_iff, Finset.mem_singleton, update_same, and_false_iff]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
i : ι
hi : ¬i = i₀
⊢ ∑ j in A i, g i j = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j) i
[PROOFSTEP]
simp [hi]
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have Beq : Function.update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j :=
  by
  ext i
  by_cases hi : i = i₀
  · rw [hi]
    simp only [update_same]
  · simp only [hi, update_noteq, Ne.def, not_false_iff]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
[PROOFSTEP]
ext i
[GOAL]
case h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
i : ι
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) i = ∑ j in B i, g i j
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
i : ι
hi : i = i₀
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) i = ∑ j in B i, g i j
[PROOFSTEP]
rw [hi]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
i : ι
hi : i = i₀
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) i₀ = ∑ j in B i₀, g i₀ j
[PROOFSTEP]
simp only [update_same]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
i : ι
hi : ¬i = i₀
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) i = ∑ j in B i, g i j
[PROOFSTEP]
simp only [hi, update_noteq, Ne.def, not_false_iff]
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have Ceq : Function.update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j :=
  by
  ext i
  by_cases hi : i = i₀
  · rw [hi]
    simp only [update_same]
  ·
    simp only [hi, update_noteq, Ne.def, not_false_iff]
      -- Express the inductive assumption for `B`
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
[PROOFSTEP]
ext i
[GOAL]
case h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
i : ι
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) i = ∑ j in C i, g i j
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
i : ι
hi : i = i₀
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) i = ∑ j in C i, g i j
[PROOFSTEP]
rw [hi]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
i : ι
hi : i = i₀
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) i₀ = ∑ j in C i₀, g i₀ j
[PROOFSTEP]
simp only [update_same]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
i : ι
hi : ¬i = i₀
⊢ update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) i = ∑ j in C i, g i j
[PROOFSTEP]
simp only [hi, update_noteq, Ne.def, not_false_iff]
  -- Express the inductive assumption for `B`
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have Brec : (f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, f fun i => g i (r i) :=
  by
  have : (∑ i, Finset.card (B i)) < ∑ i, Finset.card (A i) :=
    by
    refine' Finset.sum_lt_sum (fun i _ => Finset.card_le_of_subset (B_subset_A i)) ⟨i₀, Finset.mem_univ _, _⟩
    have : { j₂ } ⊆ A i₀ := by simp [hj₂]
    simp only [Finset.card_sdiff this, Function.update_same, Finset.card_singleton]
    exact Nat.pred_lt (ne_of_gt (lt_trans Nat.zero_lt_one hi₀))
  rw [h] at this
  exact IH _ this B rfl
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
⊢ (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
[PROOFSTEP]
have : (∑ i, Finset.card (B i)) < ∑ i, Finset.card (A i) :=
  by
  refine' Finset.sum_lt_sum (fun i _ => Finset.card_le_of_subset (B_subset_A i)) ⟨i₀, Finset.mem_univ _, _⟩
  have : { j₂ } ⊆ A i₀ := by simp [hj₂]
  simp only [Finset.card_sdiff this, Function.update_same, Finset.card_singleton]
  exact Nat.pred_lt (ne_of_gt (lt_trans Nat.zero_lt_one hi₀))
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
⊢ ∑ i : ι, Finset.card (B i) < ∑ i : ι, Finset.card (A i)
[PROOFSTEP]
refine' Finset.sum_lt_sum (fun i _ => Finset.card_le_of_subset (B_subset_A i)) ⟨i₀, Finset.mem_univ _, _⟩
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
⊢ Finset.card (B i₀) < Finset.card (A i₀)
[PROOFSTEP]
have : { j₂ } ⊆ A i₀ := by simp [hj₂]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
⊢ {j₂} ⊆ A i₀
[PROOFSTEP]
simp [hj₂]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
this : {j₂} ⊆ A i₀
⊢ Finset.card (B i₀) < Finset.card (A i₀)
[PROOFSTEP]
simp only [Finset.card_sdiff this, Function.update_same, Finset.card_singleton]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
this : {j₂} ⊆ A i₀
⊢ Finset.card (A i₀) - 1 < Finset.card (A i₀)
[PROOFSTEP]
exact Nat.pred_lt (ne_of_gt (lt_trans Nat.zero_lt_one hi₀))
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
this : ∑ i : ι, Finset.card (B i) < ∑ i : ι, Finset.card (A i)
⊢ (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
[PROOFSTEP]
rw [h] at this
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
this : ∑ i : ι, Finset.card (B i) < n
⊢ (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
[PROOFSTEP]
exact IH _ this B rfl
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have Crec : (f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, f fun i => g i (r i) :=
  by
  have : (∑ i, Finset.card (C i)) < ∑ i, Finset.card (A i) :=
    Finset.sum_lt_sum (fun i _ => Finset.card_le_of_subset (C_subset_A i)) ⟨i₀, Finset.mem_univ _, by simp [hi₀]⟩
  rw [h] at this
  exact IH _ this C rfl
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
⊢ (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
[PROOFSTEP]
have : (∑ i, Finset.card (C i)) < ∑ i, Finset.card (A i) :=
  Finset.sum_lt_sum (fun i _ => Finset.card_le_of_subset (C_subset_A i)) ⟨i₀, Finset.mem_univ _, by simp [hi₀]⟩
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
⊢ Finset.card (C i₀) < Finset.card (A i₀)
[PROOFSTEP]
simp [hi₀]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
this : ∑ i : ι, Finset.card (C i) < ∑ i : ι, Finset.card (A i)
⊢ (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
[PROOFSTEP]
rw [h] at this
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
this : ∑ i : ι, Finset.card (C i) < n
⊢ (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
[PROOFSTEP]
exact IH _ this C rfl
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have D : Disjoint (piFinset B) (piFinset C) :=
  haveI : Disjoint (B i₀) (C i₀) := by simp
  piFinset_disjoint_of_disjoint B C this
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
⊢ Disjoint (B i₀) (C i₀)
[PROOFSTEP]
simp
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
have pi_BC : piFinset A = piFinset B ∪ piFinset C :=
  by
  apply Finset.Subset.antisymm
  · intro r hr
    by_cases hri₀ : r i₀ = j₂
    · apply Finset.mem_union_right
      refine mem_piFinset.2 fun i => ?_
      by_cases hi : i = i₀
      · have : r i₀ ∈ C i₀ := by simp [hri₀]
        rwa [hi]
      · simp [hi, mem_piFinset.1 hr i]
    · apply Finset.mem_union_left
      refine mem_piFinset.2 fun i => ?_
      by_cases hi : i = i₀
      · have : r i₀ ∈ B i₀ := by simp [hri₀, mem_piFinset.1 hr i₀]
        rwa [hi]
      · simp [hi, mem_piFinset.1 hr i]
  · exact Finset.union_subset (piFinset_subset _ _ fun i => B_subset_A i) (piFinset_subset _ _ fun i => C_subset_A i)
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
⊢ piFinset A = piFinset B ∪ piFinset C
[PROOFSTEP]
apply Finset.Subset.antisymm
[GOAL]
case H₁
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
⊢ piFinset A ⊆ piFinset B ∪ piFinset C
[PROOFSTEP]
intro r hr
[GOAL]
case H₁
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
⊢ r ∈ piFinset B ∪ piFinset C
[PROOFSTEP]
by_cases hri₀ : r i₀ = j₂
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
⊢ r ∈ piFinset B ∪ piFinset C
[PROOFSTEP]
apply Finset.mem_union_right
[GOAL]
case pos.h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
⊢ r ∈ piFinset C
[PROOFSTEP]
refine mem_piFinset.2 fun i => ?_
[GOAL]
case pos.h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
i : ι
⊢ r i ∈ C i
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
i : ι
hi : i = i₀
⊢ r i ∈ C i
[PROOFSTEP]
have : r i₀ ∈ C i₀ := by simp [hri₀]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
i : ι
hi : i = i₀
⊢ r i₀ ∈ C i₀
[PROOFSTEP]
simp [hri₀]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
i : ι
hi : i = i₀
this : r i₀ ∈ C i₀
⊢ r i ∈ C i
[PROOFSTEP]
rwa [hi]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : r i₀ = j₂
i : ι
hi : ¬i = i₀
⊢ r i ∈ C i
[PROOFSTEP]
simp [hi, mem_piFinset.1 hr i]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
⊢ r ∈ piFinset B ∪ piFinset C
[PROOFSTEP]
apply Finset.mem_union_left
[GOAL]
case neg.h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
⊢ r ∈ piFinset B
[PROOFSTEP]
refine mem_piFinset.2 fun i => ?_
[GOAL]
case neg.h
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
i : ι
⊢ r i ∈ B i
[PROOFSTEP]
by_cases hi : i = i₀
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
i : ι
hi : i = i₀
⊢ r i ∈ B i
[PROOFSTEP]
have : r i₀ ∈ B i₀ := by simp [hri₀, mem_piFinset.1 hr i₀]
[GOAL]
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
i : ι
hi : i = i₀
⊢ r i₀ ∈ B i₀
[PROOFSTEP]
simp [hri₀, mem_piFinset.1 hr i₀]
[GOAL]
case pos
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this✝ : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
i : ι
hi : i = i₀
this : r i₀ ∈ B i₀
⊢ r i ∈ B i
[PROOFSTEP]
rwa [hi]
[GOAL]
case neg
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
r : (a : ι) → α a
hr : r ∈ piFinset A
hri₀ : ¬r i₀ = j₂
i : ι
hi : ¬i = i₀
⊢ r i ∈ B i
[PROOFSTEP]
simp [hi, mem_piFinset.1 hr i]
[GOAL]
case H₂
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
⊢ piFinset B ∪ piFinset C ⊆ piFinset A
[PROOFSTEP]
exact Finset.union_subset (piFinset_subset _ _ fun i => B_subset_A i) (piFinset_subset _ _ fun i => C_subset_A i)
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
pi_BC : piFinset A = piFinset B ∪ piFinset C
⊢ (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
rw [A_eq_BC]
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
pi_BC : piFinset A = piFinset B ∪ piFinset C
⊢ ↑f (update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)) =
    ∑ r in piFinset A, ↑f fun i => g i (r i)
[PROOFSTEP]
simp only [MultilinearMap.map_add, Beq, Ceq, Brec, Crec, pi_BC]
[GOAL]
case neg.intro.intro.intro.intro.intro
R : Type u
ι : Type u'
n✝¹ : ℕ
M : Fin (Nat.succ n✝¹) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹² : Semiring R
inst✝¹¹ : (i : Fin (Nat.succ n✝¹)) → AddCommMonoid (M i)
inst✝¹⁰ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid M₃
inst✝⁷ : AddCommMonoid M'
inst✝⁶ : (i : Fin (Nat.succ n✝¹)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
f f' : MultilinearMap R M₁ M₂
α : ι → Type u_1
g : (i : ι) → α i → M₁ i
A✝ : (i : ι) → Finset (α i)
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
n✝ : ℕ
h✝ : ∑ i : ι, Finset.card (A✝ i) = n✝
this : (i : ι) → DecidableEq (α i) := fun i => Classical.decEq (α i)
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n →
      ∀ (A : (i : ι) → Finset (α i)),
        ∑ i : ι, Finset.card (A i) = m → (↑f fun i => ∑ j in A i, g i j) = ∑ r in piFinset A, ↑f fun i => g i (r i)
A : (i : ι) → Finset (α i)
h : ∑ i : ι, Finset.card (A i) = n
Ai_empty : ∀ (i : ι), A i ≠ ∅
i₀ : ι
hi₀ : 1 < Finset.card (A i₀)
j₁ j₂ : α i₀
left✝ : j₁ ∈ A i₀
hj₂ : j₂ ∈ A i₀
right✝ : j₁ ≠ j₂
B : (a : ι) → Finset (α a) := update A i₀ (A i₀ \ {j₂})
C : (a : ι) → Finset (α a) := update A i₀ {j₂}
B_subset_A : ∀ (i : ι), B i ⊆ A i
C_subset_A : ∀ (i : ι), C i ⊆ A i
A_eq_BC :
  (fun i => ∑ j in A i, g i j) = update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j + ∑ j in C i₀, g i₀ j)
Beq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in B i₀, g i₀ j) = fun i => ∑ j in B i, g i j
Ceq : update (fun i => ∑ j in A i, g i j) i₀ (∑ j in C i₀, g i₀ j) = fun i => ∑ j in C i, g i j
Brec : (↑f fun i => ∑ j in B i, g i j) = ∑ r in piFinset B, ↑f fun i => g i (r i)
Crec : (↑f fun i => ∑ j in C i, g i j) = ∑ r in piFinset C, ↑f fun i => g i (r i)
D : Disjoint (piFinset B) (piFinset C)
pi_BC : piFinset A = piFinset B ∪ piFinset C
⊢ ((∑ x in piFinset (update A i₀ (A i₀ \ {j₂})), ↑f fun i => g i (x i)) +
      ∑ x in piFinset (update A i₀ {j₂}), ↑f fun i => g i (x i)) =
    ∑ x in piFinset (update A i₀ (A i₀ \ {j₂})) ∪ piFinset (update A i₀ {j₂}), ↑f fun i => g i (x i)
[PROOFSTEP]
rw [← Finset.sum_union D]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
α✝ : ι → Type u_1
g✝ : (i : ι) → α✝ i → M₁ i
A : (i : ι) → Finset (α✝ i)
α : Type u_2
inst✝ : DecidableEq ι
t : Finset α
i : ι
g : α → M₁ i
m : (i : ι) → M₁ i
⊢ ↑f (update m i (∑ a in t, g a)) = ∑ a in t, ↑f (update m i (g a))
[PROOFSTEP]
classical
induction' t using Finset.induction with a t has ih h
· simp
· simp [Finset.sum_insert has, ih]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
α✝ : ι → Type u_1
g✝ : (i : ι) → α✝ i → M₁ i
A : (i : ι) → Finset (α✝ i)
α : Type u_2
inst✝ : DecidableEq ι
t : Finset α
i : ι
g : α → M₁ i
m : (i : ι) → M₁ i
⊢ ↑f (update m i (∑ a in t, g a)) = ∑ a in t, ↑f (update m i (g a))
[PROOFSTEP]
induction' t using Finset.induction with a t has ih h
[GOAL]
case empty
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
α✝ : ι → Type u_1
g✝ : (i : ι) → α✝ i → M₁ i
A : (i : ι) → Finset (α✝ i)
α : Type u_2
inst✝ : DecidableEq ι
i : ι
g : α → M₁ i
m : (i : ι) → M₁ i
⊢ ↑f (update m i (∑ a in ∅, g a)) = ∑ a in ∅, ↑f (update m i (g a))
[PROOFSTEP]
simp
[GOAL]
case insert
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
α✝ : ι → Type u_1
g✝ : (i : ι) → α✝ i → M₁ i
A : (i : ι) → Finset (α✝ i)
α : Type u_2
inst✝ : DecidableEq ι
i : ι
g : α → M₁ i
m : (i : ι) → M₁ i
a : α
t : Finset α
has : ¬a ∈ t
ih : ↑f (update m i (∑ a in t, g a)) = ∑ a in t, ↑f (update m i (g a))
⊢ ↑f (update m i (∑ a in insert a t, g a)) = ∑ a in insert a t, ↑f (update m i (g a))
[PROOFSTEP]
simp [Finset.sum_insert has, ih]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
inst✝ : DecidableEq ι₂
v : ι₂ → M₂
i : ι₂
a b : M₂
⊢ (fun v => ↑m fun i => v (↑σ i)) (update v i (a + b)) =
    (fun v => ↑m fun i => v (↑σ i)) (update v i a) + (fun v => ↑m fun i => v (↑σ i)) (update v i b)
[PROOFSTEP]
letI := σ.injective.decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
inst✝ : DecidableEq ι₂
v : ι₂ → M₂
i : ι₂
a b : M₂
this : DecidableEq ι₁ := Injective.decidableEq (_ : Injective ↑σ)
⊢ (fun v => ↑m fun i => v (↑σ i)) (update v i (a + b)) =
    (fun v => ↑m fun i => v (↑σ i)) (update v i a) + (fun v => ↑m fun i => v (↑σ i)) (update v i b)
[PROOFSTEP]
simp_rw [Function.update_apply_equiv_apply v]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
inst✝ : DecidableEq ι₂
v : ι₂ → M₂
i : ι₂
a b : M₂
this : DecidableEq ι₁ := Injective.decidableEq (_ : Injective ↑σ)
⊢ (↑m fun i_1 => update (v ∘ ↑σ) (↑σ.symm i) (a + b) i_1) =
    (↑m fun i_1 => update (v ∘ ↑σ) (↑σ.symm i) a i_1) + ↑m fun i_1 => update (v ∘ ↑σ) (↑σ.symm i) b i_1
[PROOFSTEP]
rw [m.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
inst✝ : DecidableEq ι₂
v : ι₂ → M₂
i : ι₂
a : R
b : M₂
⊢ (fun v => ↑m fun i => v (↑σ i)) (update v i (a • b)) = a • (fun v => ↑m fun i => v (↑σ i)) (update v i b)
[PROOFSTEP]
letI := σ.injective.decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
inst✝ : DecidableEq ι₂
v : ι₂ → M₂
i : ι₂
a : R
b : M₂
this : DecidableEq ι₁ := Injective.decidableEq (_ : Injective ↑σ)
⊢ (fun v => ↑m fun i => v (↑σ i)) (update v i (a • b)) = a • (fun v => ↑m fun i => v (↑σ i)) (update v i b)
[PROOFSTEP]
simp_rw [Function.update_apply_equiv_apply v]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹¹ : Semiring R
inst✝¹⁰ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : AddCommMonoid M₃
inst✝⁶ : AddCommMonoid M'
inst✝⁵ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
inst✝ : DecidableEq ι₂
v : ι₂ → M₂
i : ι₂
a : R
b : M₂
this : DecidableEq ι₁ := Injective.decidableEq (_ : Injective ↑σ)
⊢ (↑m fun i_1 => update (v ∘ ↑σ) (↑σ.symm i) (a • b) i_1) = a • ↑m fun i_1 => update (v ∘ ↑σ) (↑σ.symm i) b i_1
[PROOFSTEP]
rw [m.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
⊢ domDomCongr σ.symm (domDomCongr σ m) = m
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
x✝ : ι₁ → M₂
⊢ ↑(domDomCongr σ.symm (domDomCongr σ m)) x✝ = ↑m x✝
[PROOFSTEP]
simp [domDomCongr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
⊢ domDomCongr σ (domDomCongr σ.symm m) = m
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
m : MultilinearMap R (fun x => M₂) M₃
x✝ : ι₂ → M₂
⊢ ↑(domDomCongr σ (domDomCongr σ.symm m)) x✝ = ↑m x✝
[PROOFSTEP]
simp [domDomCongr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
a b : MultilinearMap R (fun x => M₂) M₃
⊢ Equiv.toFun
      { toFun := domDomCongr σ, invFun := domDomCongr σ.symm,
        left_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ.symm (domDomCongr σ m) = m),
        right_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ (domDomCongr σ.symm m) = m) }
      (a + b) =
    Equiv.toFun
        { toFun := domDomCongr σ, invFun := domDomCongr σ.symm,
          left_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ.symm (domDomCongr σ m) = m),
          right_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ (domDomCongr σ.symm m) = m) }
        a +
      Equiv.toFun
        { toFun := domDomCongr σ, invFun := domDomCongr σ.symm,
          left_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ.symm (domDomCongr σ m) = m),
          right_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ (domDomCongr σ.symm m) = m) }
        b
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : Semiring R
inst✝⁹ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
f f' : MultilinearMap R M₁ M₂
ι₁ : Type u_1
ι₂ : Type u_2
ι₃ : Type u_3
σ : ι₁ ≃ ι₂
a b : MultilinearMap R (fun x => M₂) M₃
x✝ : ι₂ → M₂
⊢ ↑(Equiv.toFun
          { toFun := domDomCongr σ, invFun := domDomCongr σ.symm,
            left_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ.symm (domDomCongr σ m) = m),
            right_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ (domDomCongr σ.symm m) = m) }
          (a + b))
      x✝ =
    ↑(Equiv.toFun
            { toFun := domDomCongr σ, invFun := domDomCongr σ.symm,
              left_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ.symm (domDomCongr σ m) = m),
              right_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ (domDomCongr σ.symm m) = m) }
            a +
          Equiv.toFun
            { toFun := domDomCongr σ, invFun := domDomCongr σ.symm,
              left_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ.symm (domDomCongr σ m) = m),
              right_inv := (_ : ∀ (m : MultilinearMap R (fun x => M₂) M₃), domDomCongr σ (domDomCongr σ.symm m) = m) }
            b)
      x✝
[PROOFSTEP]
simp [domDomCongr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁹ : Semiring R
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
g : M₂ →ₗ[R] M₃
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (↑g ∘ ↑f) (update m i (x + y)) = (↑g ∘ ↑f) (update m i x) + (↑g ∘ ↑f) (update m i y)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁹ : Semiring R
inst✝⁸ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : AddCommMonoid M₃
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : (i : ι) → Module R (M₁ i)
inst✝³ : Module R M₂
inst✝² : Module R M₃
inst✝¹ : Module R M'
g : M₂ →ₗ[R] M₃
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ (↑g ∘ ↑f) (update m i (c • x)) = c • (↑g ∘ ↑f) (update m i x)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : AddCommMonoid M₂
inst✝⁵ : AddCommMonoid M₃
inst✝⁴ : AddCommMonoid M'
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
ι₁ : Type u_1
ι₂ : Type u_2
σ : ι₁ ≃ ι₂
g : M₂ →ₗ[R] M₃
f : MultilinearMap R (fun x => M') M₂
⊢ MultilinearMap.domDomCongr σ (compMultilinearMap g f) = compMultilinearMap g (MultilinearMap.domDomCongr σ f)
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : Semiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : AddCommMonoid M₂
inst✝⁵ : AddCommMonoid M₃
inst✝⁴ : AddCommMonoid M'
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M'
ι₁ : Type u_1
ι₂ : Type u_2
σ : ι₁ ≃ ι₂
g : M₂ →ₗ[R] M₃
f : MultilinearMap R (fun x => M') M₂
x✝ : ι₂ → M'
⊢ ↑(MultilinearMap.domDomCongr σ (compMultilinearMap g f)) x✝ =
    ↑(compMultilinearMap g (MultilinearMap.domDomCongr σ f)) x✝
[PROOFSTEP]
simp [MultilinearMap.domDomCongr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s : Finset ι
⊢ ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
[PROOFSTEP]
refine' s.induction_on (by simp) _
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s : Finset ι
⊢ ↑f (Finset.piecewise ∅ (fun i => c i • m i) m) = (∏ i in ∅, c i) • ↑f m
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s : Finset ι
⊢ ∀ ⦃a : ι⦄ {s : Finset ι},
    ¬a ∈ s →
      ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m →
        ↑f (Finset.piecewise (insert a s) (fun i => c i • m i) m) = (∏ i in insert a s, c i) • ↑f m
[PROOFSTEP]
intro j s j_not_mem_s Hrec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
⊢ ↑f (Finset.piecewise (insert j s) (fun i => c i • m i) m) = (∏ i in insert j s, c i) • ↑f m
[PROOFSTEP]
have A : Function.update (s.piecewise (fun i => c i • m i) m) j (m j) = s.piecewise (fun i => c i • m i) m :=
  by
  ext i
  by_cases h : i = j
  · rw [h]
    simp [j_not_mem_s]
  · simp [h]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
⊢ update (Finset.piecewise s (fun i => c i • m i) m) j (m j) = Finset.piecewise s (fun i => c i • m i) m
[PROOFSTEP]
ext i
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
i : ι
⊢ update (Finset.piecewise s (fun i => c i • m i) m) j (m j) i = Finset.piecewise s (fun i => c i • m i) m i
[PROOFSTEP]
by_cases h : i = j
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
i : ι
h : i = j
⊢ update (Finset.piecewise s (fun i => c i • m i) m) j (m j) i = Finset.piecewise s (fun i => c i • m i) m i
[PROOFSTEP]
rw [h]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
i : ι
h : i = j
⊢ update (Finset.piecewise s (fun i => c i • m i) m) j (m j) j = Finset.piecewise s (fun i => c i • m i) m j
[PROOFSTEP]
simp [j_not_mem_s]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
i : ι
h : ¬i = j
⊢ update (Finset.piecewise s (fun i => c i • m i) m) j (m j) i = Finset.piecewise s (fun i => c i • m i) m i
[PROOFSTEP]
simp [h]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
A : update (Finset.piecewise s (fun i => c i • m i) m) j (m j) = Finset.piecewise s (fun i => c i • m i) m
⊢ ↑f (Finset.piecewise (insert j s) (fun i => c i • m i) m) = (∏ i in insert j s, c i) • ↑f m
[PROOFSTEP]
rw [s.piecewise_insert, f.map_smul, A, Hrec]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
c : ι → R
m : (i : ι) → M₁ i
s✝ : Finset ι
j : ι
s : Finset ι
j_not_mem_s : ¬j ∈ s
Hrec : ↑f (Finset.piecewise s (fun i => c i • m i) m) = (∏ i in s, c i) • ↑f m
A : update (Finset.piecewise s (fun i => c i • m i) m) j (m j) = Finset.piecewise s (fun i => c i • m i) m
⊢ c j • (∏ i in s, c i) • ↑f m = (∏ i in insert j s, c i) • ↑f m
[PROOFSTEP]
simp [j_not_mem_s, mul_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
c : ι → R
m : (i : ι) → M₁ i
⊢ (↑f fun i => c i • m i) = (∏ i : ι, c i) • ↑f m
[PROOFSTEP]
classical simpa using map_piecewise_smul f c m Finset.univ
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
c : ι → R
m : (i : ι) → M₁ i
⊢ (↑f fun i => c i • m i) = (∏ i : ι, c i) • ↑f m
[PROOFSTEP]
simpa using map_piecewise_smul f c m Finset.univ
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ ↑f (update (c • m) i x) = c ^ (Fintype.card ι - 1) • ↑f (update m i x)
[PROOFSTEP]
have :
  f ((Finset.univ.erase i).piecewise (c • update m i x) (update m i x)) =
    (∏ _i in Finset.univ.erase i, c) • f (update m i x) :=
  map_piecewise_smul f _ _ _
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
this :
  ↑f (Finset.piecewise (Finset.erase Finset.univ i) (c • update m i x) (update m i x)) =
    (∏ _i in Finset.erase Finset.univ i, c) • ↑f (update m i x)
⊢ ↑f (update (c • m) i x) = c ^ (Fintype.card ι - 1) • ↑f (update m i x)
[PROOFSTEP]
simpa [← Function.update_smul c m] using this
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι₁ : Type ?u.427401
ι₂ : Type ?u.427507
σ : ι₁ ≃ ι₂
src✝ : MultilinearMap A (fun x => M₂) M₃ ≃+ MultilinearMap A (fun x => M₂) M₃ := domDomCongrEquiv σ
c : R'
f : MultilinearMap A (fun x => M₂) M₃
⊢ AddHom.toFun
      { toFun := src✝.toFun,
        map_add' :=
          (_ :
            ∀ (x y : MultilinearMap A (fun x => M₂) M₃),
              Equiv.toFun src✝.toEquiv (x + y) = Equiv.toFun src✝.toEquiv x + Equiv.toFun src✝.toEquiv y) }
      (c • f) =
    ↑(RingHom.id R') c •
      AddHom.toFun
        { toFun := src✝.toFun,
          map_add' :=
            (_ :
              ∀ (x y : MultilinearMap A (fun x => M₂) M₃),
                Equiv.toFun src✝.toEquiv (x + y) = Equiv.toFun src✝.toEquiv x + Equiv.toFun src✝.toEquiv y) }
        f
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι₁ : Type ?u.427401
ι₂ : Type ?u.427507
σ : ι₁ ≃ ι₂
src✝ : MultilinearMap A (fun x => M₂) M₃ ≃+ MultilinearMap A (fun x => M₂) M₃ := domDomCongrEquiv σ
c : R'
f : MultilinearMap A (fun x => M₂) M₃
x✝ : ι₂ → M₂
⊢ ↑(AddHom.toFun
          { toFun := src✝.toFun,
            map_add' :=
              (_ :
                ∀ (x y : MultilinearMap A (fun x => M₂) M₃),
                  Equiv.toFun src✝.toEquiv (x + y) = Equiv.toFun src✝.toEquiv x + Equiv.toFun src✝.toEquiv y) }
          (c • f))
      x✝ =
    ↑(↑(RingHom.id R') c •
          AddHom.toFun
            { toFun := src✝.toFun,
              map_add' :=
                (_ :
                  ∀ (x y : MultilinearMap A (fun x => M₂) M₃),
                    Equiv.toFun src✝.toEquiv (x + y) = Equiv.toFun src✝.toEquiv x + Equiv.toFun src✝.toEquiv y) }
            f)
      x✝
[PROOFSTEP]
simp [MultilinearMap.domDomCongr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
⊢ ∀ (x y : M₁ (↑σ.symm i)),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) + (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)
[PROOFSTEP]
letI := σ.decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
this : DecidableEq ι := Equiv.decidableEq σ
⊢ ∀ (x y : M₁ (↑σ.symm i)),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) + (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)
[PROOFSTEP]
rw [← σ.apply_symm_apply i]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
this : DecidableEq ι := Equiv.decidableEq σ
⊢ ∀ (x y : M₁ (↑σ.symm (↑σ (↑σ.symm i)))),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) (x + y)) =
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) x) +
        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) y)
[PROOFSTEP]
intro x y
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
this : DecidableEq ι := Equiv.decidableEq σ
x y : M₁ (↑σ.symm (↑σ (↑σ.symm i)))
⊢ (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) (x + y)) =
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) x) +
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) y)
[PROOFSTEP]
simp only [comp_apply, piCongrLeft'_symm_update, f.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
c : R
⊢ ∀ (x : M₁ (↑σ.symm i)),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)
[PROOFSTEP]
letI := σ.decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
c : R
this : DecidableEq ι := Equiv.decidableEq σ
⊢ ∀ (x : M₁ (↑σ.symm i)),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)
[PROOFSTEP]
rw [← σ.apply_symm_apply i]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
c : R
this : DecidableEq ι := Equiv.decidableEq σ
⊢ ∀ (x : M₁ (↑σ.symm (↑σ (↑σ.symm i)))),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) (c • x)) =
      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) x)
[PROOFSTEP]
intro x
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι'
m : (i : ι') → M₁ (↑σ.symm i)
i : ι'
c : R
this : DecidableEq ι := Equiv.decidableEq σ
x : M₁ (↑σ.symm (↑σ (↑σ.symm i)))
⊢ (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) (c • x)) =
    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m (↑σ (↑σ.symm i)) x)
[PROOFSTEP]
simp only [Function.comp, piCongrLeft'_symm_update, f.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f₁ f₂ : MultilinearMap R M₁ M₂
⊢ (fun f =>
        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
          map_add' :=
            (_ :
              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
          map_smul' :=
            (_ :
              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
      (f₁ + f₂) =
    (fun f =>
          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
            map_add' :=
              (_ :
                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
            map_smul' :=
              (_ :
                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
        f₁ +
      (fun f =>
          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
            map_add' :=
              (_ :
                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
            map_smul' :=
              (_ :
                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
        f₂
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f₁ f₂ : MultilinearMap R M₁ M₂
x✝ : (i : ι') → M₁ (↑σ.symm i)
⊢ ↑((fun f =>
            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
          (f₁ + f₂))
      x✝ =
    ↑((fun f =>
              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
            f₁ +
          (fun f =>
              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
            f₂)
      x✝
[PROOFSTEP]
simp only [Function.comp, coe_mk, add_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
c : R
f : MultilinearMap R M₁ M₂
⊢ AddHom.toFun
      {
        toFun := fun f =>
          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
            map_add' :=
              (_ :
                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
            map_smul' :=
              (_ :
                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
        map_add' :=
          (_ :
            ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
              (fun f =>
                    { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                      map_add' :=
                        (_ :
                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                      map_smul' :=
                        (_ :
                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                            (x : M₁ (↑σ.symm i)),
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                              c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                  (f₁ + f₂) =
                (fun f =>
                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                        map_add' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                        map_smul' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                              (x : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                    f₁ +
                  (fun f =>
                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                        map_add' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                        map_smul' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                              (x : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                    f₂) }
      (c • f) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        {
          toFun := fun f =>
            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
          map_add' :=
            (_ :
              ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                (fun f =>
                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                        map_add' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                        map_smul' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                              (x : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                    (f₁ + f₂) =
                  (fun f =>
                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                          map_add' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                          map_smul' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                (x : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                      f₁ +
                    (fun f =>
                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                          map_add' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                          map_smul' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                (x : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                      f₂) }
        f
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
c : R
f : MultilinearMap R M₁ M₂
x✝ : (i : ι') → M₁ (↑σ.symm i)
⊢ ↑(AddHom.toFun
          {
            toFun := fun f =>
              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
            map_add' :=
              (_ :
                ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                  (fun f =>
                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                          map_add' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                          map_smul' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                (x : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                      (f₁ + f₂) =
                    (fun f =>
                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                            map_add' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                  (x y : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                            map_smul' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                  (x : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                        f₁ +
                      (fun f =>
                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                            map_add' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                  (x y : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                            map_smul' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                  (x : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                        f₂) }
          (c • f))
      x✝ =
    ↑(↑(RingHom.id R) c •
          AddHom.toFun
            {
              toFun := fun f =>
                { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                  map_add' :=
                    (_ :
                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                  map_smul' :=
                    (_ :
                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                          c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
              map_add' :=
                (_ :
                  ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                    (fun f =>
                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                            map_add' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                  (x y : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                            map_smul' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                  (x : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                        (f₁ + f₂) =
                      (fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                          f₁ +
                        (fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                          f₂) }
            f)
      x✝
[PROOFSTEP]
simp only [Function.comp, coe_mk, smul_apply, RingHom.id_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
⊢ ∀ (x y : M₁ i),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (x + y)) =
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x) + (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i y)
[PROOFSTEP]
letI := σ.symm.decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
this : DecidableEq ι' := Equiv.decidableEq σ.symm
⊢ ∀ (x y : M₁ i),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (x + y)) =
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x) + (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i y)
[PROOFSTEP]
rw [← σ.symm_apply_apply i]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
this : DecidableEq ι' := Equiv.decidableEq σ.symm
⊢ ∀ (x y : M₁ (↑σ.symm (↑σ i))),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) (x + y)) =
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) x) +
        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) y)
[PROOFSTEP]
intro x y
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
this : DecidableEq ι' := Equiv.decidableEq σ.symm
x y : M₁ (↑σ.symm (↑σ i))
⊢ (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) (x + y)) =
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) x) +
      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) y)
[PROOFSTEP]
simp only [comp_apply, piCongrLeft'_update, f.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
⊢ ∀ (x : M₁ i),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (c • x)) = c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x)
[PROOFSTEP]
letI := σ.symm.decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
this : DecidableEq ι' := Equiv.decidableEq σ.symm
⊢ ∀ (x : M₁ i),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (c • x)) = c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x)
[PROOFSTEP]
rw [← σ.symm_apply_apply i]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
this : DecidableEq ι' := Equiv.decidableEq σ.symm
⊢ ∀ (x : M₁ (↑σ.symm (↑σ i))),
    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) (c • x)) =
      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) x)
[PROOFSTEP]
intro x
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁵ : CommSemiring R
inst✝¹⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹³ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹⁰ : (i : ι) → Module R (M₁ i)
inst✝⁹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁸ : Semiring R'
inst✝⁷ : Semiring A
inst✝⁶ : (i : ι) → Module A (M₁ i)
inst✝⁵ : Module A M₂
inst✝⁴ : AddCommMonoid M₃
inst✝³ : Module R' M₃
inst✝² : Module A M₃
inst✝¹ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
this : DecidableEq ι' := Equiv.decidableEq σ.symm
x : M₁ (↑σ.symm (↑σ i))
⊢ (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) (c • x)) =
    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m (↑σ.symm (↑σ i)) x)
[PROOFSTEP]
simp only [Function.comp, piCongrLeft'_update, f.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
⊢ (fun f =>
        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ),
          map_add' :=
            (_ :
              ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (x + y)) =
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x) + (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i y)),
          map_smul' :=
            (_ :
              ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (c • x)) =
                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x)) })
      (AddHom.toFun
        {
            toAddHom :=
              {
                toFun := fun f =>
                  { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                    map_add' :=
                      (_ :
                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                    map_smul' :=
                      (_ :
                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                            c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                map_add' :=
                  (_ :
                    ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                      (fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                          (f₁ + f₂) =
                        (fun f =>
                              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                map_add' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                      (x y : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                map_smul' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                      (x : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                            f₁ +
                          (fun f =>
                              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                map_add' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                      (x y : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                map_smul' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                      (x : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                            f₂) },
            map_smul' :=
              (_ :
                ∀ (c : R) (f : MultilinearMap R M₁ M₂),
                  AddHom.toFun
                      {
                        toFun := fun f =>
                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                            map_add' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                  (x y : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                            map_smul' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                  (x : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                        map_add' :=
                          (_ :
                            ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                              (fun f =>
                                    { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                      map_add' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                            (x y : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                      map_smul' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                            (x : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                              c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                  (f₁ + f₂) =
                                (fun f =>
                                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                        map_add' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                              (x y : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                        map_smul' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                              (x : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                    f₁ +
                                  (fun f =>
                                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                        map_add' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                              (x y : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                        map_smul' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                              (x : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                    f₂) }
                      (c • f) =
                    ↑(RingHom.id R) c •
                      AddHom.toFun
                        {
                          toFun := fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                          map_add' :=
                            (_ :
                              ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                                (fun f =>
                                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                        map_add' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                              (x y : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                        map_smul' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                              (x : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                    (f₁ + f₂) =
                                  (fun f =>
                                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                          map_add' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                (x y : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                          map_smul' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                                (x : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                      f₁ +
                                    (fun f =>
                                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                          map_add' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                (x y : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                          map_smul' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                                (x : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                      f₂) }
                        f) }.toAddHom
        f) =
    f
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R M₁ M₂
x✝ : (i : ι) → M₁ i
⊢ ↑((fun f =>
            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ),
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (x + y)) =
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x) +
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i y)),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (c • x)) =
                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x)) })
          (AddHom.toFun
            {
                toAddHom :=
                  {
                    toFun := fun f =>
                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                        map_add' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                        map_smul' :=
                          (_ :
                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                              (x : M₁ (↑σ.symm i)),
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                    map_add' :=
                      (_ :
                        ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                          (fun f =>
                                { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                  map_add' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                        (x y : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                  map_smul' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                        (x : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                          c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                              (f₁ + f₂) =
                            (fun f =>
                                  { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                    map_add' :=
                                      (_ :
                                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                          (x y : M₁ (↑σ.symm i)),
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                    map_smul' :=
                                      (_ :
                                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                          (x : M₁ (↑σ.symm i)),
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                            c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                f₁ +
                              (fun f =>
                                  { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                    map_add' :=
                                      (_ :
                                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                          (x y : M₁ (↑σ.symm i)),
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                    map_smul' :=
                                      (_ :
                                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                          (x : M₁ (↑σ.symm i)),
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                            c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                f₂) },
                map_smul' :=
                  (_ :
                    ∀ (c : R) (f : MultilinearMap R M₁ M₂),
                      AddHom.toFun
                          {
                            toFun := fun f =>
                              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                map_add' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                      (x y : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                map_smul' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                      (x : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                            map_add' :=
                              (_ :
                                ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                                  (fun f =>
                                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                          map_add' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                (x y : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                          map_smul' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                                (x : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                      (f₁ + f₂) =
                                    (fun f =>
                                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                            map_add' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (x y : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                            map_smul' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (c : R) (x : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                        f₁ +
                                      (fun f =>
                                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                            map_add' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (x y : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                            map_smul' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (c : R) (x : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                        f₂) }
                          (c • f) =
                        ↑(RingHom.id R) c •
                          AddHom.toFun
                            {
                              toFun := fun f =>
                                { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                  map_add' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                        (x y : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                  map_smul' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                        (x : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                          c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                              map_add' :=
                                (_ :
                                  ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                                    (fun f =>
                                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                            map_add' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (x y : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                            map_smul' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (c : R) (x : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                        (f₁ + f₂) =
                                      (fun f =>
                                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                              map_add' :=
                                                (_ :
                                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                    (x y : M₁ (↑σ.symm i)),
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                              map_smul' :=
                                                (_ :
                                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                    (c : R) (x : M₁ (↑σ.symm i)),
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                          f₁ +
                                        (fun f =>
                                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                              map_add' :=
                                                (_ :
                                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                    (x y : M₁ (↑σ.symm i)),
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                              map_smul' :=
                                                (_ :
                                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                    (c : R) (x : M₁ (↑σ.symm i)),
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                          f₂) }
                            f) }.toAddHom
            f))
      x✝ =
    ↑f x✝
[PROOFSTEP]
simp only [coe_mk, comp_apply, Equiv.symm_apply_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
⊢ AddHom.toFun
      {
          toAddHom :=
            {
              toFun := fun f =>
                { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                  map_add' :=
                    (_ :
                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                  map_smul' :=
                    (_ :
                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R) (x : M₁ (↑σ.symm i)),
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                          c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
              map_add' :=
                (_ :
                  ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                    (fun f =>
                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                            map_add' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                  (x y : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                            map_smul' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                  (x : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                        (f₁ + f₂) =
                      (fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                          f₁ +
                        (fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                          f₂) },
          map_smul' :=
            (_ :
              ∀ (c : R) (f : MultilinearMap R M₁ M₂),
                AddHom.toFun
                    {
                      toFun := fun f =>
                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                          map_add' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                          map_smul' :=
                            (_ :
                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                (x : M₁ (↑σ.symm i)),
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                      map_add' :=
                        (_ :
                          ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                            (fun f =>
                                  { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                    map_add' :=
                                      (_ :
                                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                          (x y : M₁ (↑σ.symm i)),
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                    map_smul' :=
                                      (_ :
                                        ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                          (x : M₁ (↑σ.symm i)),
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                            c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                (f₁ + f₂) =
                              (fun f =>
                                    { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                      map_add' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                            (x y : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                      map_smul' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                            (x : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                              c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                  f₁ +
                                (fun f =>
                                    { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                      map_add' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                            (x y : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                      map_smul' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                            (x : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                              c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                  f₂) }
                    (c • f) =
                  ↑(RingHom.id R) c •
                    AddHom.toFun
                      {
                        toFun := fun f =>
                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                            map_add' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                  (x y : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                            map_smul' :=
                              (_ :
                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                  (x : M₁ (↑σ.symm i)),
                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                        map_add' :=
                          (_ :
                            ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                              (fun f =>
                                    { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                      map_add' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                            (x y : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                      map_smul' :=
                                        (_ :
                                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                            (x : M₁ (↑σ.symm i)),
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                              c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                  (f₁ + f₂) =
                                (fun f =>
                                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                        map_add' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                              (x y : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                        map_smul' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                              (x : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                    f₁ +
                                  (fun f =>
                                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                        map_add' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                              (x y : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                        map_smul' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                              (x : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                    f₂) }
                      f) }.toAddHom
      ((fun f =>
          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ),
            map_add' :=
              (_ :
                ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (x + y)) =
                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x) +
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i y)),
            map_smul' :=
              (_ :
                ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (c • x)) =
                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x)) })
        f) =
    f
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁴ : CommSemiring R
inst✝¹³ : (i : ι) → AddCommMonoid (M₁ i)
inst✝¹² : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁹ : (i : ι) → Module R (M₁ i)
inst✝⁸ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
R' : Type u_1
A : Type u_2
inst✝⁷ : Semiring R'
inst✝⁶ : Semiring A
inst✝⁵ : (i : ι) → Module A (M₁ i)
inst✝⁴ : Module A M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R' M₃
inst✝¹ : Module A M₃
inst✝ : SMulCommClass A R' M₃
ι' : Type u_3
σ : ι ≃ ι'
f : MultilinearMap R (fun i => M₁ (↑σ.symm i)) M₂
x✝ : (i : ι') → M₁ (↑σ.symm i)
⊢ ↑(AddHom.toFun
          {
              toAddHom :=
                {
                  toFun := fun f =>
                    { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                      map_add' :=
                        (_ :
                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (x y : M₁ (↑σ.symm i)),
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                      map_smul' :=
                        (_ :
                          ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                            (x : M₁ (↑σ.symm i)),
                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                              c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                  map_add' :=
                    (_ :
                      ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                        (fun f =>
                              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                map_add' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                      (x y : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                map_smul' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                      (x : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                            (f₁ + f₂) =
                          (fun f =>
                                { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                  map_add' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                        (x y : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                  map_smul' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                        (x : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                          c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                              f₁ +
                            (fun f =>
                                { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                  map_add' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                        (x y : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                            (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                  map_smul' :=
                                    (_ :
                                      ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                        (x : M₁ (↑σ.symm i)),
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                          c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                              f₂) },
              map_smul' :=
                (_ :
                  ∀ (c : R) (f : MultilinearMap R M₁ M₂),
                    AddHom.toFun
                        {
                          toFun := fun f =>
                            { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                              map_add' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                    (x y : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                              map_smul' :=
                                (_ :
                                  ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                    (x : M₁ (↑σ.symm i)),
                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                      c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                          map_add' :=
                            (_ :
                              ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                                (fun f =>
                                      { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                        map_add' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                              (x y : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                        map_smul' :=
                                          (_ :
                                            ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                              (x : M₁ (↑σ.symm i)),
                                              (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                    (f₁ + f₂) =
                                  (fun f =>
                                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                          map_add' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                (x y : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                          map_smul' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                                (x : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                      f₁ +
                                    (fun f =>
                                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                          map_add' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                (x y : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                          map_smul' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                                (x : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                      f₂) }
                        (c • f) =
                      ↑(RingHom.id R) c •
                        AddHom.toFun
                          {
                            toFun := fun f =>
                              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                map_add' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                      (x y : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                map_smul' :=
                                  (_ :
                                    ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                      (x : M₁ (↑σ.symm i)),
                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) },
                            map_add' :=
                              (_ :
                                ∀ (f₁ f₂ : MultilinearMap R M₁ M₂),
                                  (fun f =>
                                        { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                          map_add' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                (x y : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                          map_smul' :=
                                            (_ :
                                              ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι') (c : R)
                                                (x : M₁ (↑σ.symm i)),
                                                (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                  c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                      (f₁ + f₂) =
                                    (fun f =>
                                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                            map_add' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (x y : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                            map_smul' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (c : R) (x : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                        f₁ +
                                      (fun f =>
                                          { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm,
                                            map_add' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (x y : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (x + y)) =
                                                    (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x) +
                                                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i y)),
                                            map_smul' :=
                                              (_ :
                                                ∀ [inst : DecidableEq ι'] (m : (i : ι') → M₁ (↑σ.symm i)) (i : ι')
                                                  (c : R) (x : M₁ (↑σ.symm i)),
                                                  (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i (c • x)) =
                                                    c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ).symm) (update m i x)) })
                                        f₂) }
                          f) }.toAddHom
          ((fun f =>
              { toFun := ↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (x + y)) =
                        (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x) +
                          (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i y)),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i),
                      (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i (c • x)) =
                        c • (↑f ∘ ↑(Equiv.piCongrLeft' M₁ σ)) (update m i x)) })
            f))
      x✝ =
    ↑f x✝
[PROOFSTEP]
simp only [coe_mk, comp_apply, Equiv.apply_symm_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : CommSemiring R
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝³ : CommSemiring A
inst✝² : Algebra R A
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
m : ι → A
i : ι
x y : A
⊢ (fun m => ∏ i : ι, m i) (update m i (x + y)) =
    (fun m => ∏ i : ι, m i) (update m i x) + (fun m => ∏ i : ι, m i) (update m i y)
[PROOFSTEP]
simp [Finset.prod_update_of_mem, add_mul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝¹⁰ : CommSemiring R
inst✝⁹ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁸ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝⁵ : (i : ι) → Module R (M₁ i)
inst✝⁴ : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝³ : CommSemiring A
inst✝² : Algebra R A
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
m : ι → A
i : ι
c : R
x : A
⊢ (fun m => ∏ i : ι, m i) (update m i (c • x)) = c • (fun m => ∏ i : ι, m i) (update m i x)
[PROOFSTEP]
simp [Finset.prod_update_of_mem]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
x y : A
⊢ (fun m => List.prod (List.ofFn m)) (update m i (x + y)) =
    (fun m => List.prod (List.ofFn m)) (update m i x) + (fun m => List.prod (List.ofFn m)) (update m i y)
[PROOFSTEP]
rw [Subsingleton.elim dec (by infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
x y : A
⊢ DecidableEq (Fin n)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
x y : A
⊢ (fun m => List.prod (List.ofFn m)) (update m i (x + y)) =
    (fun m => List.prod (List.ofFn m)) (update m i x) + (fun m => List.prod (List.ofFn m)) (update m i y)
[PROOFSTEP]
have : (List.finRange n).indexOf i < n := by simpa using List.indexOf_lt_length.2 (List.mem_finRange i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
x y : A
⊢ List.indexOf i (List.finRange n) < n
[PROOFSTEP]
simpa using List.indexOf_lt_length.2 (List.mem_finRange i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
x y : A
this : List.indexOf i (List.finRange n) < n
⊢ (fun m => List.prod (List.ofFn m)) (update m i (x + y)) =
    (fun m => List.prod (List.ofFn m)) (update m i x) + (fun m => List.prod (List.ofFn m)) (update m i y)
[PROOFSTEP]
simp [List.ofFn_eq_map, (List.nodup_finRange n).map_update, List.prod_set, add_mul, this, mul_add, add_mul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
c : R
x : A
⊢ (fun m => List.prod (List.ofFn m)) (update m i (c • x)) = c • (fun m => List.prod (List.ofFn m)) (update m i x)
[PROOFSTEP]
rw [Subsingleton.elim dec (by infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
c : R
x : A
⊢ DecidableEq (Fin n)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
c : R
x : A
⊢ (fun m => List.prod (List.ofFn m)) (update m i (c • x)) = c • (fun m => List.prod (List.ofFn m)) (update m i x)
[PROOFSTEP]
have : (List.finRange n).indexOf i < n := by simpa using List.indexOf_lt_length.2 (List.mem_finRange i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
c : R
x : A
⊢ List.indexOf i (List.finRange n) < n
[PROOFSTEP]
simpa using List.indexOf_lt_length.2 (List.mem_finRange i)
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
dec : DecidableEq (Fin n)
m : Fin n → A
i : Fin n
c : R
x : A
this : List.indexOf i (List.finRange n) < n
⊢ (fun m => List.prod (List.ofFn m)) (update m i (c • x)) = c • (fun m => List.prod (List.ofFn m)) (update m i x)
[PROOFSTEP]
simp [List.ofFn_eq_map, (List.nodup_finRange n).map_update, List.prod_set, this]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁸ : CommSemiring R
inst✝⁷ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M₂
f f' : MultilinearMap R M₁ M₂
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ (↑(MultilinearMap.mkPiAlgebraFin R n A) fun x => a) = a ^ n
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
⊢ MultilinearMap.mkPiRing R ι (↑f fun x => 1) = f
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
⊢ ↑(MultilinearMap.mkPiRing R ι (↑f fun x => 1)) m = ↑f m
[PROOFSTEP]
have : m = fun i => m i • (1 : R) := by
  ext j
  simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
⊢ m = fun i => m i • 1
[PROOFSTEP]
ext j
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
j : ι
⊢ m j = m j • 1
[PROOFSTEP]
simp
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
this : m = fun i => m i • 1
⊢ ↑(MultilinearMap.mkPiRing R ι (↑f fun x => 1)) m = ↑f m
[PROOFSTEP]
conv_rhs => rw [this, f.map_smul_univ]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
this : m = fun i => m i • 1
| ↑f m
[PROOFSTEP]
rw [this, f.map_smul_univ]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
this : m = fun i => m i • 1
| ↑f m
[PROOFSTEP]
rw [this, f.map_smul_univ]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
f : MultilinearMap R (fun x => R) M₂
m : ι → R
this : m = fun i => m i • 1
| ↑f m
[PROOFSTEP]
rw [this, f.map_smul_univ]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
⊢ MultilinearMap.mkPiRing R ι z₁ = MultilinearMap.mkPiRing R ι z₂ ↔ z₁ = z₂
[PROOFSTEP]
simp_rw [MultilinearMap.ext_iff, mkPiRing_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
⊢ (∀ (x : ι → R), (∏ i : ι, x i) • z₁ = (∏ i : ι, x i) • z₂) ↔ z₁ = z₂
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
⊢ (∀ (x : ι → R), (∏ i : ι, x i) • z₁ = (∏ i : ι, x i) • z₂) → z₁ = z₂
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
⊢ z₁ = z₂ → ∀ (x : ι → R), (∏ i : ι, x i) • z₁ = (∏ i : ι, x i) • z₂
[PROOFSTEP]
intro h
[GOAL]
case mp
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
h : ∀ (x : ι → R), (∏ i : ι, x i) • z₁ = (∏ i : ι, x i) • z₂
⊢ z₁ = z₂
[PROOFSTEP]
simpa using h fun _ => 1
[GOAL]
case mpr
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
h : z₁ = z₂
⊢ ∀ (x : ι → R), (∏ i : ι, x i) • z₁ = (∏ i : ι, x i) • z₂
[PROOFSTEP]
intro x
[GOAL]
case mpr
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z₁ z₂ : M₂
h : z₁ = z₂
x : ι → R
⊢ (∏ i : ι, x i) • z₁ = (∏ i : ι, x i) • z₂
[PROOFSTEP]
simp [h]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
⊢ MultilinearMap.mkPiRing R ι 0 = 0
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
x✝ : ι → R
⊢ ↑(MultilinearMap.mkPiRing R ι 0) x✝ = ↑0 x✝
[PROOFSTEP]
rw [mkPiRing_apply, smul_zero, MultilinearMap.zero_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f f' : MultilinearMap R M₁ M₂
inst✝ : Fintype ι
z : M₂
⊢ MultilinearMap.mkPiRing R ι z = 0 ↔ z = 0
[PROOFSTEP]
rw [← mkPiRing_zero, mkPiRing_eq_iff]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun m => -↑f m) (update m i (x + y)) = (fun m => -↑f m) (update m i x) + (fun m => -↑f m) (update m i y)
[PROOFSTEP]
simp [add_comm]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ (fun m => -↑f m) (update m i (c • x)) = c • (fun m => -↑f m) (update m i x)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g✝ f g : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun m => ↑f m - ↑g m) (update m i (x + y)) =
    (fun m => ↑f m - ↑g m) (update m i x) + (fun m => ↑f m - ↑g m) (update m i y)
[PROOFSTEP]
simp only [MultilinearMap.map_add, sub_eq_add_neg, neg_add]
  -- Porting note: used to be `cc`
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g✝ f g : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ ↑f (update m i x) + ↑f (update m i y) + (-↑g (update m i x) + -↑g (update m i y)) =
    ↑f (update m i x) + -↑g (update m i x) + (↑f (update m i y) + -↑g (update m i y))
[PROOFSTEP]
abel
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g✝ f g : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ ↑f (update m i x) + ↑f (update m i y) + (-↑g (update m i x) + -↑g (update m i y)) =
    ↑f (update m i x) + -↑g (update m i x) + (↑f (update m i y) + -↑g (update m i y))
[PROOFSTEP]
abel
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g✝ f g : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
c : R
x : M₁ i
⊢ (fun m => ↑f m - ↑g m) (update m i (c • x)) = c • (fun m => ↑f m - ↑g m) (update m i x)
[PROOFSTEP]
simp only [MultilinearMap.map_smul, smul_sub]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g : MultilinearMap R M₁ M₂
src✝ : AddCommMonoid (MultilinearMap R M₁ M₂) := addCommMonoid
n : ℤ
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ (fun m => n • ↑f m) (update m i (x + y)) = (fun m => n • ↑f m) (update m i x) + (fun m => n • ↑f m) (update m i y)
[PROOFSTEP]
simp [smul_add]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f✝ g : MultilinearMap R M₁ M₂
src✝ : AddCommMonoid (MultilinearMap R M₁ M₂) := addCommMonoid
n : ℤ
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
l : (i : ι) → M₁ i
i : ι
x : R
d : M₁ i
⊢ (fun m => n • ↑f m) (update l i (x • d)) = x • (fun m => n • ↑f m) (update l i d)
[PROOFSTEP]
simp [← smul_comm x n (_ : M₂)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommGroup (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x : M₁ i
⊢ ↑f (update m i (-x)) + ↑f (update m i x) = 0
[PROOFSTEP]
rw [← MultilinearMap.map_add, add_left_neg, f.map_coord_zero i (update_same i 0 m)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : Semiring R
inst✝⁴ : (i : ι) → AddCommGroup (M₁ i)
inst✝³ : AddCommGroup M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
f : MultilinearMap R M₁ M₂
inst✝ : DecidableEq ι
m : (i : ι) → M₁ i
i : ι
x y : M₁ i
⊢ ↑f (update m i (x - y)) = ↑f (update m i x) - ↑f (update m i y)
[PROOFSTEP]
rw [sub_eq_add_neg, sub_eq_add_neg, MultilinearMap.map_add, map_neg]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : CommSemiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommMonoid M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
inst✝ : Fintype ι
z z' : M₂
⊢ (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
    (fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z'
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : CommSemiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommMonoid M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
inst✝ : Fintype ι
z z' : M₂
m : ι → R
⊢ ↑((fun z => MultilinearMap.mkPiRing R ι z) (z + z')) m =
    ↑((fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z') m
[PROOFSTEP]
simp [smul_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : CommSemiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommMonoid M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
inst✝ : Fintype ι
c : R
z : M₂
⊢ AddHom.toFun
      { toFun := fun z => MultilinearMap.mkPiRing R ι z,
        map_add' :=
          (_ :
            ∀ (z z' : M₂),
              (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                (fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z') }
      (c • z) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        { toFun := fun z => MultilinearMap.mkPiRing R ι z,
          map_add' :=
            (_ :
              ∀ (z z' : M₂),
                (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                  (fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z') }
        z
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : CommSemiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommMonoid M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
inst✝ : Fintype ι
c : R
z : M₂
m : ι → R
⊢ ↑(AddHom.toFun
          { toFun := fun z => MultilinearMap.mkPiRing R ι z,
            map_add' :=
              (_ :
                ∀ (z z' : M₂),
                  (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                    (fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z') }
          (c • z))
      m =
    ↑(↑(RingHom.id R) c •
          AddHom.toFun
            { toFun := fun z => MultilinearMap.mkPiRing R ι z,
              map_add' :=
                (_ :
                  ∀ (z z' : M₂),
                    (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                      (fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z') }
            z)
      m
[PROOFSTEP]
simp [smul_smul, mul_comm]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁵ : CommSemiring R
inst✝⁴ : (i : ι) → AddCommMonoid (M₁ i)
inst✝³ : AddCommMonoid M₂
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : Module R M₂
inst✝ : Fintype ι
z : M₂
⊢ (fun f => ↑f fun x => 1)
      (AddHom.toFun
        {
            toAddHom :=
              { toFun := fun z => MultilinearMap.mkPiRing R ι z,
                map_add' :=
                  (_ :
                    ∀ (z z' : M₂),
                      (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                        (fun z => MultilinearMap.mkPiRing R ι z) z + (fun z => MultilinearMap.mkPiRing R ι z) z') },
            map_smul' :=
              (_ :
                ∀ (c : R) (z : M₂),
                  AddHom.toFun
                      { toFun := fun z => MultilinearMap.mkPiRing R ι z,
                        map_add' :=
                          (_ :
                            ∀ (z z' : M₂),
                              (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                                (fun z => MultilinearMap.mkPiRing R ι z) z +
                                  (fun z => MultilinearMap.mkPiRing R ι z) z') }
                      (c • z) =
                    ↑(RingHom.id R) c •
                      AddHom.toFun
                        { toFun := fun z => MultilinearMap.mkPiRing R ι z,
                          map_add' :=
                            (_ :
                              ∀ (z z' : M₂),
                                (fun z => MultilinearMap.mkPiRing R ι z) (z + z') =
                                  (fun z => MultilinearMap.mkPiRing R ι z) z +
                                    (fun z => MultilinearMap.mkPiRing R ι z) z') }
                        z) }.toAddHom
        z) =
    z
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (x + y)) =
    (fun m => ↑(↑f (m 0)) (tail m)) (update m i x) + (fun m => ↑(↑f (m 0)) (tail m)) (update m i y)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (x + y)) =
    (fun m => ↑(↑f (m 0)) (tail m)) (update m i x) + (fun m => ↑(↑f (m 0)) (tail m)) (update m i y)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (x + y)) =
    (fun m => ↑(↑f (m 0)) (tail m)) (update m i x) + (fun m => ↑(↑f (m 0)) (tail m)) (update m i y)
[PROOFSTEP]
by_cases h : i = 0
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : i = 0
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (x + y)) =
    (fun m => ↑(↑f (m 0)) (tail m)) (update m i x) + (fun m => ↑(↑f (m 0)) (tail m)) (update m i y)
[PROOFSTEP]
subst i
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
x y : M 0
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m 0 (x + y)) =
    (fun m => ↑(↑f (m 0)) (tail m)) (update m 0 x) + (fun m => ↑(↑f (m 0)) (tail m)) (update m 0 y)
[PROOFSTEP]
simp only [update_same, map_add, tail_update_zero, MultilinearMap.add_apply]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : ¬i = 0
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (x + y)) =
    (fun m => ↑(↑f (m 0)) (tail m)) (update m i x) + (fun m => ↑(↑f (m 0)) (tail m)) (update m i y)
[PROOFSTEP]
simp_rw [update_noteq (Ne.symm h)]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : ¬i = 0
⊢ ↑(↑f (m 0)) (tail (update m i (x + y))) = ↑(↑f (m 0)) (tail (update m i x)) + ↑(↑f (m 0)) (tail (update m i y))
[PROOFSTEP]
revert x y
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ¬i = 0
⊢ ∀ (x y : M i),
    ↑(↑f (m 0)) (tail (update m i (x + y))) = ↑(↑f (m 0)) (tail (update m i x)) + ↑(↑f (m 0)) (tail (update m i y))
[PROOFSTEP]
rw [← succ_pred i h]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ¬i = 0
⊢ ∀ (x y : M (succ (pred i h))),
    ↑(↑f (m 0)) (tail (update m (succ (pred i h)) (x + y))) =
      ↑(↑f (m 0)) (tail (update m (succ (pred i h)) x)) + ↑(↑f (m 0)) (tail (update m (succ (pred i h)) y))
[PROOFSTEP]
intro x y
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ¬i = 0
x y : M (succ (pred i h))
⊢ ↑(↑f (m 0)) (tail (update m (succ (pred i h)) (x + y))) =
    ↑(↑f (m 0)) (tail (update m (succ (pred i h)) x)) + ↑(↑f (m 0)) (tail (update m (succ (pred i h)) y))
[PROOFSTEP]
rw [tail_update_succ, MultilinearMap.map_add, tail_update_succ, tail_update_succ]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (c • x)) = c • (fun m => ↑(↑f (m 0)) (tail m)) (update m i x)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (c • x)) = c • (fun m => ↑(↑f (m 0)) (tail m)) (update m i x)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (c • x)) = c • (fun m => ↑(↑f (m 0)) (tail m)) (update m i x)
[PROOFSTEP]
by_cases h : i = 0
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : i = 0
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (c • x)) = c • (fun m => ↑(↑f (m 0)) (tail m)) (update m i x)
[PROOFSTEP]
subst i
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
c : R
x : M 0
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m 0 (c • x)) = c • (fun m => ↑(↑f (m 0)) (tail m)) (update m 0 x)
[PROOFSTEP]
simp only [update_same, map_smul, tail_update_zero, MultilinearMap.smul_apply]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : ¬i = 0
⊢ (fun m => ↑(↑f (m 0)) (tail m)) (update m i (c • x)) = c • (fun m => ↑(↑f (m 0)) (tail m)) (update m i x)
[PROOFSTEP]
simp_rw [update_noteq (Ne.symm h)]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : ¬i = 0
⊢ ↑(↑f (m 0)) (tail (update m i (c • x))) = c • ↑(↑f (m 0)) (tail (update m i x))
[PROOFSTEP]
revert x
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ¬i = 0
⊢ ∀ (x : M i), ↑(↑f (m 0)) (tail (update m i (c • x))) = c • ↑(↑f (m 0)) (tail (update m i x))
[PROOFSTEP]
rw [← succ_pred i h]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ¬i = 0
⊢ ∀ (x : M (succ (pred i h))),
    ↑(↑f (m 0)) (tail (update m (succ (pred i h)) (c • x))) = c • ↑(↑f (m 0)) (tail (update m (succ (pred i h)) x))
[PROOFSTEP]
intro x
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ¬i = 0
x : M (succ (pred i h))
⊢ ↑(↑f (m 0)) (tail (update m (succ (pred i h)) (c • x))) = c • ↑(↑f (m 0)) (tail (update m (succ (pred i h)) x))
[PROOFSTEP]
rw [tail_update_succ, tail_update_succ, MultilinearMap.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (succ i)
i : Fin n
y y' : M (succ i)
⊢ (fun m => ↑f (cons x m)) (update m i (y + y')) =
    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (succ i)
i : Fin n
y y' : M (succ i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
m : (i : Fin n) → M (succ i)
i : Fin n
y y' : M (succ i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (succ i)
i : Fin n
y y' : M (succ i)
⊢ (fun m => ↑f (cons x m)) (update m i (y + y')) =
    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (succ i)
i : Fin n
y : R
c : M (succ i)
⊢ (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (succ i)
i : Fin n
y : R
c : M (succ i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
m : (i : Fin n) → M (succ i)
i : Fin n
y : R
c : M (succ i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x : M 0
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (succ i)
i : Fin n
y : R
c : M (succ i)
⊢ (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x y : M 0
⊢ (fun x =>
        { toFun := fun m => ↑f (cons x m),
          map_add' :=
            (_ :
              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                (fun m => ↑f (cons x m)) (update m i (y + y')) =
                  (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
          map_smul' :=
            (_ :
              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) })
      (x + y) =
    (fun x =>
          { toFun := fun m => ↑f (cons x m),
            map_add' :=
              (_ :
                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                  (fun m => ↑f (cons x m)) (update m i (y + y')) =
                    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
            map_smul' :=
              (_ :
                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                  (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) })
        x +
      (fun x =>
          { toFun := fun m => ↑f (cons x m),
            map_add' :=
              (_ :
                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                  (fun m => ↑f (cons x m)) (update m i (y + y')) =
                    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
            map_smul' :=
              (_ :
                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                  (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) })
        y
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
x y : M 0
m : (i : Fin n) → M (succ i)
⊢ ↑((fun x =>
            { toFun := fun m => ↑f (cons x m),
              map_add' :=
                (_ :
                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                    (fun m => ↑f (cons x m)) (update m i (y + y')) =
                      (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
              map_smul' :=
                (_ :
                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                    (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) })
          (x + y))
      m =
    ↑((fun x =>
              { toFun := fun m => ↑f (cons x m),
                map_add' :=
                  (_ :
                    ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                      (fun m => ↑f (cons x m)) (update m i (y + y')) =
                        (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                map_smul' :=
                  (_ :
                    ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                      (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) })
            x +
          (fun x =>
              { toFun := fun m => ↑f (cons x m),
                map_add' :=
                  (_ :
                    ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                      (fun m => ↑f (cons x m)) (update m i (y + y')) =
                        (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                map_smul' :=
                  (_ :
                    ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                      (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) })
            y)
      m
[PROOFSTEP]
exact cons_add f m x y
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
c : R
x : M 0
⊢ AddHom.toFun
      {
        toFun := fun x =>
          { toFun := fun m => ↑f (cons x m),
            map_add' :=
              (_ :
                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                  (fun m => ↑f (cons x m)) (update m i (y + y')) =
                    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
            map_smul' :=
              (_ :
                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                  (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) },
        map_add' :=
          (_ :
            ∀ (x y : M 0),
              (fun x =>
                    { toFun := fun m => ↑f (cons x m),
                      map_add' :=
                        (_ :
                          ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                            (fun m => ↑f (cons x m)) (update m i (y + y')) =
                              (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                      map_smul' :=
                        (_ :
                          ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                            (c : M (succ i)),
                            (fun m => ↑f (cons x m)) (update m i (y • c)) =
                              y • (fun m => ↑f (cons x m)) (update m i c)) })
                  (x + y) =
                (fun x =>
                      { toFun := fun m => ↑f (cons x m),
                        map_add' :=
                          (_ :
                            ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                              (y y' : M (succ i)),
                              (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                        map_smul' :=
                          (_ :
                            ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                              (c : M (succ i)),
                              (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                y • (fun m => ↑f (cons x m)) (update m i c)) })
                    x +
                  (fun x =>
                      { toFun := fun m => ↑f (cons x m),
                        map_add' :=
                          (_ :
                            ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                              (y y' : M (succ i)),
                              (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                        map_smul' :=
                          (_ :
                            ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                              (c : M (succ i)),
                              (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                y • (fun m => ↑f (cons x m)) (update m i c)) })
                    y) }
      (c • x) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        {
          toFun := fun x =>
            { toFun := fun m => ↑f (cons x m),
              map_add' :=
                (_ :
                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                    (fun m => ↑f (cons x m)) (update m i (y + y')) =
                      (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
              map_smul' :=
                (_ :
                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                    (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) },
          map_add' :=
            (_ :
              ∀ (x y : M 0),
                (fun x =>
                      { toFun := fun m => ↑f (cons x m),
                        map_add' :=
                          (_ :
                            ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                              (y y' : M (succ i)),
                              (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                        map_smul' :=
                          (_ :
                            ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                              (c : M (succ i)),
                              (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                y • (fun m => ↑f (cons x m)) (update m i c)) })
                    (x + y) =
                  (fun x =>
                        { toFun := fun m => ↑f (cons x m),
                          map_add' :=
                            (_ :
                              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                (y y' : M (succ i)),
                                (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                  (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                          map_smul' :=
                            (_ :
                              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                (c : M (succ i)),
                                (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                  y • (fun m => ↑f (cons x m)) (update m i c)) })
                      x +
                    (fun x =>
                        { toFun := fun m => ↑f (cons x m),
                          map_add' :=
                            (_ :
                              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                (y y' : M (succ i)),
                                (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                  (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                          map_smul' :=
                            (_ :
                              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                (c : M (succ i)),
                                (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                  y • (fun m => ↑f (cons x m)) (update m i c)) })
                      y) }
        x
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
c : R
x : M 0
m : (i : Fin n) → M (succ i)
⊢ ↑(AddHom.toFun
          {
            toFun := fun x =>
              { toFun := fun m => ↑f (cons x m),
                map_add' :=
                  (_ :
                    ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                      (fun m => ↑f (cons x m)) (update m i (y + y')) =
                        (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                map_smul' :=
                  (_ :
                    ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                      (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) },
            map_add' :=
              (_ :
                ∀ (x y : M 0),
                  (fun x =>
                        { toFun := fun m => ↑f (cons x m),
                          map_add' :=
                            (_ :
                              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                (y y' : M (succ i)),
                                (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                  (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                          map_smul' :=
                            (_ :
                              ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                (c : M (succ i)),
                                (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                  y • (fun m => ↑f (cons x m)) (update m i c)) })
                      (x + y) =
                    (fun x =>
                          { toFun := fun m => ↑f (cons x m),
                            map_add' :=
                              (_ :
                                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                  (y y' : M (succ i)),
                                  (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                            map_smul' :=
                              (_ :
                                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                  (c : M (succ i)),
                                  (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                    y • (fun m => ↑f (cons x m)) (update m i c)) })
                        x +
                      (fun x =>
                          { toFun := fun m => ↑f (cons x m),
                            map_add' :=
                              (_ :
                                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                  (y y' : M (succ i)),
                                  (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                            map_smul' :=
                              (_ :
                                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                  (c : M (succ i)),
                                  (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                    y • (fun m => ↑f (cons x m)) (update m i c)) })
                        y) }
          (c • x))
      m =
    ↑(↑(RingHom.id R) c •
          AddHom.toFun
            {
              toFun := fun x =>
                { toFun := fun m => ↑f (cons x m),
                  map_add' :=
                    (_ :
                      ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y y' : M (succ i)),
                        (fun m => ↑f (cons x m)) (update m i (y + y')) =
                          (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                  map_smul' :=
                    (_ :
                      ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R) (c : M (succ i)),
                        (fun m => ↑f (cons x m)) (update m i (y • c)) = y • (fun m => ↑f (cons x m)) (update m i c)) },
              map_add' :=
                (_ :
                  ∀ (x y : M 0),
                    (fun x =>
                          { toFun := fun m => ↑f (cons x m),
                            map_add' :=
                              (_ :
                                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                  (y y' : M (succ i)),
                                  (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                    (fun m => ↑f (cons x m)) (update m i y) + (fun m => ↑f (cons x m)) (update m i y')),
                            map_smul' :=
                              (_ :
                                ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                  (c : M (succ i)),
                                  (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                    y • (fun m => ↑f (cons x m)) (update m i c)) })
                        (x + y) =
                      (fun x =>
                            { toFun := fun m => ↑f (cons x m),
                              map_add' :=
                                (_ :
                                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                    (y y' : M (succ i)),
                                    (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                      (fun m => ↑f (cons x m)) (update m i y) +
                                        (fun m => ↑f (cons x m)) (update m i y')),
                              map_smul' :=
                                (_ :
                                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                    (c : M (succ i)),
                                    (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                      y • (fun m => ↑f (cons x m)) (update m i c)) })
                          x +
                        (fun x =>
                            { toFun := fun m => ↑f (cons x m),
                              map_add' :=
                                (_ :
                                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n)
                                    (y y' : M (succ i)),
                                    (fun m => ↑f (cons x m)) (update m i (y + y')) =
                                      (fun m => ↑f (cons x m)) (update m i y) +
                                        (fun m => ↑f (cons x m)) (update m i y')),
                              map_smul' :=
                                (_ :
                                  ∀ (dec : DecidableEq (Fin n)) (m : (i : Fin n) → M (succ i)) (i : Fin n) (y : R)
                                    (c : M (succ i)),
                                    (fun m => ↑f (cons x m)) (update m i (y • c)) =
                                      y • (fun m => ↑f (cons x m)) (update m i c)) })
                          y) }
            x)
      m
[PROOFSTEP]
exact cons_smul f m c x
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
⊢ curryLeft (uncurryLeft f) = f
[PROOFSTEP]
ext m x
[GOAL]
case h.H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : M 0
x : (i : Fin n) → M (succ i)
⊢ ↑(↑(curryLeft (uncurryLeft f)) m) x = ↑(↑f m) x
[PROOFSTEP]
simp only [tail_cons, LinearMap.uncurryLeft_apply, MultilinearMap.curryLeft_apply]
[GOAL]
case h.H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : M 0
x : (i : Fin n) → M (succ i)
⊢ ↑(↑f (cons m x 0)) x = ↑(↑f m) x
[PROOFSTEP]
rw [cons_zero]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
⊢ LinearMap.uncurryLeft (curryLeft f) = f
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(LinearMap.uncurryLeft (curryLeft f)) m = ↑f m
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f₁ f₂ : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
⊢ LinearMap.uncurryLeft (f₁ + f₂) = LinearMap.uncurryLeft f₁ + LinearMap.uncurryLeft f₂
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f₁ f₂ : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(LinearMap.uncurryLeft (f₁ + f₂)) m = ↑(LinearMap.uncurryLeft f₁ + LinearMap.uncurryLeft f₂) m
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
c : R
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
⊢ AddHom.toFun
      { toFun := LinearMap.uncurryLeft,
        map_add' :=
          (_ :
            ∀ (f₁ f₂ : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂),
              LinearMap.uncurryLeft (f₁ + f₂) = LinearMap.uncurryLeft f₁ + LinearMap.uncurryLeft f₂) }
      (c • f) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        { toFun := LinearMap.uncurryLeft,
          map_add' :=
            (_ :
              ∀ (f₁ f₂ : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂),
                LinearMap.uncurryLeft (f₁ + f₂) = LinearMap.uncurryLeft f₁ + LinearMap.uncurryLeft f₂) }
        f
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
c : R
f : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(AddHom.toFun
          { toFun := LinearMap.uncurryLeft,
            map_add' :=
              (_ :
                ∀ (f₁ f₂ : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂),
                  LinearMap.uncurryLeft (f₁ + f₂) = LinearMap.uncurryLeft f₁ + LinearMap.uncurryLeft f₂) }
          (c • f))
      m =
    ↑(↑(RingHom.id R) c •
          AddHom.toFun
            { toFun := LinearMap.uncurryLeft,
              map_add' :=
                (_ :
                  ∀ (f₁ f₂ : M 0 →ₗ[R] MultilinearMap R (fun i => M (succ i)) M₂),
                    LinearMap.uncurryLeft (f₁ + f₂) = LinearMap.uncurryLeft f₁ + LinearMap.uncurryLeft f₂) }
            f)
      m
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
by_cases h : i.val < n
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : ↑i < n
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
have : last n ≠ i := Ne.symm (ne_of_lt h)
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : ↑i < n
this : last n ≠ i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
simp_rw [update_noteq this]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : ↑i < n
this : last n ≠ i
⊢ ↑(↑f (init (update m i (x + y)))) (m (last n)) =
    ↑(↑f (init (update m i x))) (m (last n)) + ↑(↑f (init (update m i y))) (m (last n))
[PROOFSTEP]
revert x y
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ↑i < n
this : last n ≠ i
⊢ ∀ (x y : M i),
    ↑(↑f (init (update m i (x + y)))) (m (last n)) =
      ↑(↑f (init (update m i x))) (m (last n)) + ↑(↑f (init (update m i y))) (m (last n))
[PROOFSTEP]
rw [(castSucc_castLT i h).symm]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ↑i < n
this : last n ≠ i
⊢ ∀ (x y : M (castSucc (castLT i h))),
    ↑(↑f (init (update m (castSucc (castLT i h)) (x + y)))) (m (last n)) =
      ↑(↑f (init (update m (castSucc (castLT i h)) x))) (m (last n)) +
        ↑(↑f (init (update m (castSucc (castLT i h)) y))) (m (last n))
[PROOFSTEP]
intro x y
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ↑i < n
this : last n ≠ i
x y : M (castSucc (castLT i h))
⊢ ↑(↑f (init (update m (castSucc (castLT i h)) (x + y)))) (m (last n)) =
    ↑(↑f (init (update m (castSucc (castLT i h)) x))) (m (last n)) +
      ↑(↑f (init (update m (castSucc (castLT i h)) y))) (m (last n))
[PROOFSTEP]
rw [init_update_castSucc, MultilinearMap.map_add, init_update_castSucc, init_update_castSucc, LinearMap.add_apply]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
x y : M i
h : ¬↑i < n
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
revert x y
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ¬↑i < n
⊢ ∀ (x y : M i),
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i (x + y)) =
      (fun m => ↑(↑f (init m)) (m (last n))) (update m i x) + (fun m => ↑(↑f (init m)) (m (last n))) (update m i y)
[PROOFSTEP]
rw [eq_last_of_not_lt h]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ¬↑i < n
⊢ ∀ (x y : M (last n)),
    (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) (x + y)) =
      (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) x) +
        (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) y)
[PROOFSTEP]
intro x y
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
h : ¬↑i < n
x y : M (last n)
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) (x + y)) =
    (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) x) +
      (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) y)
[PROOFSTEP]
simp_rw [init_update_last, update_same, LinearMap.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ DecidableEq (Fin (Nat.succ n))
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
dec : DecidableEq (Fin (Nat.succ n))
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
by_cases h : i.val < n
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : ↑i < n
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
have : last n ≠ i := Ne.symm (ne_of_lt h)
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : ↑i < n
this : last n ≠ i
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
simp_rw [update_noteq this]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : ↑i < n
this : last n ≠ i
⊢ ↑(↑f (init (update m i (c • x)))) (m (last n)) = c • ↑(↑f (init (update m i x))) (m (last n))
[PROOFSTEP]
revert x
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ↑i < n
this : last n ≠ i
⊢ ∀ (x : M i), ↑(↑f (init (update m i (c • x)))) (m (last n)) = c • ↑(↑f (init (update m i x))) (m (last n))
[PROOFSTEP]
rw [(castSucc_castLT i h).symm]
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ↑i < n
this : last n ≠ i
⊢ ∀ (x : M (castSucc (castLT i h))),
    ↑(↑f (init (update m (castSucc (castLT i h)) (c • x)))) (m (last n)) =
      c • ↑(↑f (init (update m (castSucc (castLT i h)) x))) (m (last n))
[PROOFSTEP]
intro x
[GOAL]
case pos
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ↑i < n
this : last n ≠ i
x : M (castSucc (castLT i h))
⊢ ↑(↑f (init (update m (castSucc (castLT i h)) (c • x)))) (m (last n)) =
    c • ↑(↑f (init (update m (castSucc (castLT i h)) x))) (m (last n))
[PROOFSTEP]
rw [init_update_castSucc, init_update_castSucc, MultilinearMap.map_smul, LinearMap.smul_apply]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
x : M i
h : ¬↑i < n
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
revert x
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ¬↑i < n
⊢ ∀ (x : M i),
    (fun m => ↑(↑f (init m)) (m (last n))) (update m i (c • x)) =
      c • (fun m => ↑(↑f (init m)) (m (last n))) (update m i x)
[PROOFSTEP]
rw [eq_last_of_not_lt h]
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ¬↑i < n
⊢ ∀ (x : M (last n)),
    (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) (c • x)) =
      c • (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) x)
[PROOFSTEP]
intro x
[GOAL]
case neg
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
i : Fin (Nat.succ n)
c : R
h : ¬↑i < n
x : M (last n)
⊢ (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) (c • x)) =
    c • (fun m => ↑(↑f (init m)) (m (last n))) (update m (last n) x)
[PROOFSTEP]
simp_rw [update_same, init_update_last, map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
x y : M (last n)
⊢ (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y
[PROOFSTEP]
simp_rw [f.snoc_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
c : R
x : M (last n)
⊢ AddHom.toFun
      { toFun := fun x => ↑f (snoc m x),
        map_add' :=
          (_ :
            ∀ (x y : M (last n)),
              (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) }
      (c • x) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        { toFun := fun x => ↑f (snoc m x),
          map_add' :=
            (_ :
              ∀ (x y : M (last n)),
                (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) }
        x
[PROOFSTEP]
simp only [f.snoc_smul, RingHom.id_apply]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
⊢ (fun m =>
        {
          toAddHom :=
            { toFun := fun x => ↑f (snoc m x),
              map_add' :=
                (_ :
                  ∀ (x y : M (last n)),
                    (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
          map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
      (update m i (x + y)) =
    (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i x) +
      (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i y)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
⊢ (fun m =>
        {
          toAddHom :=
            { toFun := fun x => ↑f (snoc m x),
              map_add' :=
                (_ :
                  ∀ (x y : M (last n)),
                    (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
          map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
      (update m i (x + y)) =
    (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i x) +
      (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i y)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
⊢ (fun m =>
        {
          toAddHom :=
            { toFun := fun x => ↑f (snoc m x),
              map_add' :=
                (_ :
                  ∀ (x y : M (last n)),
                    (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
          map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
      (update m i (x + y)) =
    (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i x) +
      (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i y)
[PROOFSTEP]
ext z
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
z : M (last n)
⊢ ↑((fun m =>
            {
              toAddHom :=
                { toFun := fun x => ↑f (snoc m x),
                  map_add' :=
                    (_ :
                      ∀ (x y : M (last n)),
                        (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
              map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
          (update m i (x + y)))
      z =
    ↑((fun m =>
              {
                toAddHom :=
                  { toFun := fun x => ↑f (snoc m x),
                    map_add' :=
                      (_ :
                        ∀ (x y : M (last n)),
                          (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
                map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
            (update m i x) +
          (fun m =>
              {
                toAddHom :=
                  { toFun := fun x => ↑f (snoc m x),
                    map_add' :=
                      (_ :
                        ∀ (x y : M (last n)),
                          (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
                map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
            (update m i y))
      z
[PROOFSTEP]
change f (snoc (update m i (x + y)) z) = f (snoc (update m i x) z) + f (snoc (update m i y) z)
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
x y : M (castSucc i)
z : M (last n)
⊢ ↑f (snoc (update m i (x + y)) z) = ↑f (snoc (update m i x) z) + ↑f (snoc (update m i y) z)
[PROOFSTEP]
rw [snoc_update, snoc_update, snoc_update, f.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
⊢ (fun m =>
        {
          toAddHom :=
            { toFun := fun x => ↑f (snoc m x),
              map_add' :=
                (_ :
                  ∀ (x y : M (last n)),
                    (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
          map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
      (update m i (c • x)) =
    c •
      (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i x)
[PROOFSTEP]
rw [Subsingleton.elim dec (by clear dec; infer_instance)]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
⊢ DecidableEq (Fin n)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
dec : DecidableEq (Fin n)
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
⊢ (fun m =>
        {
          toAddHom :=
            { toFun := fun x => ↑f (snoc m x),
              map_add' :=
                (_ :
                  ∀ (x y : M (last n)),
                    (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
          map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
      (update m i (c • x)) =
    c •
      (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i x)
[PROOFSTEP]
clear dec
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
⊢ (fun m =>
        {
          toAddHom :=
            { toFun := fun x => ↑f (snoc m x),
              map_add' :=
                (_ :
                  ∀ (x y : M (last n)),
                    (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
          map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
      (update m i (c • x)) =
    c •
      (fun m =>
          {
            toAddHom :=
              { toFun := fun x => ↑f (snoc m x),
                map_add' :=
                  (_ :
                    ∀ (x y : M (last n)),
                      (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
            map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
        (update m i x)
[PROOFSTEP]
ext z
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
z : M (last n)
⊢ ↑((fun m =>
            {
              toAddHom :=
                { toFun := fun x => ↑f (snoc m x),
                  map_add' :=
                    (_ :
                      ∀ (x y : M (last n)),
                        (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
              map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
          (update m i (c • x)))
      z =
    ↑(c •
          (fun m =>
              {
                toAddHom :=
                  { toFun := fun x => ↑f (snoc m x),
                    map_add' :=
                      (_ :
                        ∀ (x y : M (last n)),
                          (fun x => ↑f (snoc m x)) (x + y) = (fun x => ↑f (snoc m x)) x + (fun x => ↑f (snoc m x)) y) },
                map_smul' := (_ : ∀ (c : R) (x : M (last n)), ↑f (snoc m (c • x)) = c • ↑f (snoc m x)) })
            (update m i x))
      z
[PROOFSTEP]
change f (snoc (update m i (c • x)) z) = c • f (snoc (update m i x) z)
[GOAL]
case h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin n) → M (castSucc i)
i : Fin n
c : R
x : M (castSucc i)
z : M (last n)
⊢ ↑f (snoc (update m i (c • x)) z) = c • ↑f (snoc (update m i x) z)
[PROOFSTEP]
rw [snoc_update, snoc_update, f.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
⊢ curryRight (uncurryRight f) = f
[PROOFSTEP]
ext m x
[GOAL]
case H.h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin n) → M (castSucc i)
x : M (last n)
⊢ ↑(↑(curryRight (uncurryRight f)) m) x = ↑(↑f m) x
[PROOFSTEP]
simp only [snoc_last, MultilinearMap.curryRight_apply, MultilinearMap.uncurryRight_apply]
[GOAL]
case H.h
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin n) → M (castSucc i)
x : M (last n)
⊢ ↑(↑f (init (snoc m x))) x = ↑(↑f m) x
[PROOFSTEP]
rw [init_snoc]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
⊢ uncurryRight (curryRight f) = f
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f : MultilinearMap R M M₂
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(uncurryRight (curryRight f)) m = ↑f m
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
⊢ uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(uncurryRight (f₁ + f₂)) m = ↑(uncurryRight f₁ + uncurryRight f₂) m
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
c : R
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
⊢ AddHom.toFun
      { toFun := uncurryRight,
        map_add' :=
          (_ :
            ∀ (f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)),
              uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂) }
      (c • f) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        { toFun := uncurryRight,
          map_add' :=
            (_ :
              ∀ (f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)),
                uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂) }
        f
[PROOFSTEP]
ext m
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
c : R
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(AddHom.toFun
          { toFun := uncurryRight,
            map_add' :=
              (_ :
                ∀ (f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)),
                  uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂) }
          (c • f))
      m =
    ↑(↑(RingHom.id R) c •
          AddHom.toFun
            { toFun := uncurryRight,
              map_add' :=
                (_ :
                  ∀ (f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)),
                    uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂) }
            f)
      m
[PROOFSTEP]
rw [smul_apply]
[GOAL]
case H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
c : R
f : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)
m : (i : Fin (Nat.succ n)) → M i
⊢ ↑(AddHom.toFun
          { toFun := uncurryRight,
            map_add' :=
              (_ :
                ∀ (f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)),
                  uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂) }
          (c • f))
      m =
    ↑(RingHom.id R) c •
      ↑(AddHom.toFun
            { toFun := uncurryRight,
              map_add' :=
                (_ :
                  ∀ (f₁ f₂ : MultilinearMap R (fun i => M (castSucc i)) (M (last n) →ₗ[R] M₂)),
                    uncurryRight (f₁ + f₂) = uncurryRight f₁ + uncurryRight f₂) }
            f)
        m
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
u : ι → M'
inst✝ : DecidableEq ι'
v : ι' → M'
i : ι'
x y : M'
⊢ (fun v => ↑f (Sum.elim u v)) (update v i (x + y)) =
    (fun v => ↑f (Sum.elim u v)) (update v i x) + (fun v => ↑f (Sum.elim u v)) (update v i y)
[PROOFSTEP]
letI := Classical.decEq ι
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
u : ι → M'
inst✝ : DecidableEq ι'
v : ι' → M'
i : ι'
x y : M'
this : DecidableEq ι := Classical.decEq ι
⊢ (fun v => ↑f (Sum.elim u v)) (update v i (x + y)) =
    (fun v => ↑f (Sum.elim u v)) (update v i x) + (fun v => ↑f (Sum.elim u v)) (update v i y)
[PROOFSTEP]
simp only [← Sum.update_elim_inr, f.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
u : ι → M'
inst✝ : DecidableEq ι'
v : ι' → M'
i : ι'
c : R
x : M'
⊢ (fun v => ↑f (Sum.elim u v)) (update v i (c • x)) = c • (fun v => ↑f (Sum.elim u v)) (update v i x)
[PROOFSTEP]
letI := Classical.decEq ι
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
u : ι → M'
inst✝ : DecidableEq ι'
v : ι' → M'
i : ι'
c : R
x : M'
this : DecidableEq ι := Classical.decEq ι
⊢ (fun v => ↑f (Sum.elim u v)) (update v i (c • x)) = c • (fun v => ↑f (Sum.elim u v)) (update v i x)
[PROOFSTEP]
simp only [← Sum.update_elim_inr, f.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
inst✝ : DecidableEq ι
u : ι → M'
i : ι
x y : M'
v : ι' → M'
⊢ ↑((fun u =>
            { toFun := fun v => ↑f (Sum.elim u v),
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                    ↑f (Sum.elim u (update v i (x + y))) =
                      ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                    ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
          (update u i (x + y)))
      v =
    ↑((fun u =>
              { toFun := fun v => ↑f (Sum.elim u v),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                      ↑f (Sum.elim u (update v i (x + y))) =
                        ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                      ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
            (update u i x) +
          (fun u =>
              { toFun := fun v => ↑f (Sum.elim u v),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                      ↑f (Sum.elim u (update v i (x + y))) =
                        ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                      ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
            (update u i y))
      v
[PROOFSTEP]
letI := Classical.decEq ι'
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
inst✝ : DecidableEq ι
u : ι → M'
i : ι
x y : M'
v : ι' → M'
this : DecidableEq ι' := Classical.decEq ι'
⊢ ↑((fun u =>
            { toFun := fun v => ↑f (Sum.elim u v),
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                    ↑f (Sum.elim u (update v i (x + y))) =
                      ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                    ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
          (update u i (x + y)))
      v =
    ↑((fun u =>
              { toFun := fun v => ↑f (Sum.elim u v),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                      ↑f (Sum.elim u (update v i (x + y))) =
                        ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                      ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
            (update u i x) +
          (fun u =>
              { toFun := fun v => ↑f (Sum.elim u v),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                      ↑f (Sum.elim u (update v i (x + y))) =
                        ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                      ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
            (update u i y))
      v
[PROOFSTEP]
simp only [MultilinearMap.coe_mk, add_apply, ← Sum.update_elim_inl, f.map_add]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
inst✝ : DecidableEq ι
u : ι → M'
i : ι
c : R
x : M'
v : ι' → M'
⊢ ↑((fun u =>
            { toFun := fun v => ↑f (Sum.elim u v),
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                    ↑f (Sum.elim u (update v i (x + y))) =
                      ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                    ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
          (update u i (c • x)))
      v =
    ↑(c •
          (fun u =>
              { toFun := fun v => ↑f (Sum.elim u v),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                      ↑f (Sum.elim u (update v i (x + y))) =
                        ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                      ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
            (update u i x))
      v
[PROOFSTEP]
letI := Classical.decEq ι'
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
inst✝ : DecidableEq ι
u : ι → M'
i : ι
c : R
x : M'
v : ι' → M'
this : DecidableEq ι' := Classical.decEq ι'
⊢ ↑((fun u =>
            { toFun := fun v => ↑f (Sum.elim u v),
              map_add' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                    ↑f (Sum.elim u (update v i (x + y))) =
                      ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
              map_smul' :=
                (_ :
                  ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                    ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
          (update u i (c • x)))
      v =
    ↑(c •
          (fun u =>
              { toFun := fun v => ↑f (Sum.elim u v),
                map_add' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (x y : M'),
                      ↑f (Sum.elim u (update v i (x + y))) =
                        ↑f (Sum.elim u (update v i x)) + ↑f (Sum.elim u (update v i y))),
                map_smul' :=
                  (_ :
                    ∀ [inst : DecidableEq ι'] (v : ι' → M') (i : ι') (c : R) (x : M'),
                      ↑f (Sum.elim u (update v i (c • x))) = c • ↑f (Sum.elim u (update v i x))) })
            (update u i x))
      v
[PROOFSTEP]
simp only [MultilinearMap.coe_mk, smul_apply, ← Sum.update_elim_inl, f.map_smul]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
i : ι ⊕ ι'
x y : M'
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i (x + y)) =
    (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i x) +
      (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i y)
[PROOFSTEP]
letI := (@Sum.inl_injective ι ι').decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
i : ι ⊕ ι'
x y : M'
this : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i (x + y)) =
    (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i x) +
      (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i y)
[PROOFSTEP]
letI := (@Sum.inr_injective ι ι').decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
i : ι ⊕ ι'
x y : M'
this✝ : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
this : DecidableEq ι' := Injective.decidableEq (_ : Injective Sum.inr)
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i (x + y)) =
    (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i x) +
      (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i y)
[PROOFSTEP]
cases i
[GOAL]
case inl
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
x y : M'
this✝ : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
this : DecidableEq ι' := Injective.decidableEq (_ : Injective Sum.inr)
val✝ : ι
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inl val✝) (x + y)) =
    (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inl val✝) x) +
      (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inl val✝) y)
[PROOFSTEP]
simp only [MultilinearMap.map_add, add_apply, Sum.update_inl_comp_inl, Sum.update_inl_comp_inr, Sum.update_inr_comp_inl,
  Sum.update_inr_comp_inr]
[GOAL]
case inr
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
x y : M'
this✝ : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
this : DecidableEq ι' := Injective.decidableEq (_ : Injective Sum.inr)
val✝ : ι'
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inr val✝) (x + y)) =
    (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inr val✝) x) +
      (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inr val✝) y)
[PROOFSTEP]
simp only [MultilinearMap.map_add, add_apply, Sum.update_inl_comp_inl, Sum.update_inl_comp_inr, Sum.update_inr_comp_inl,
  Sum.update_inr_comp_inr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
i : ι ⊕ ι'
c : R
x : M'
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i (c • x)) =
    c • (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i x)
[PROOFSTEP]
letI := (@Sum.inl_injective ι ι').decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
i : ι ⊕ ι'
c : R
x : M'
this : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i (c • x)) =
    c • (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i x)
[PROOFSTEP]
letI := (@Sum.inr_injective ι ι').decidableEq
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
i : ι ⊕ ι'
c : R
x : M'
this✝ : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
this : DecidableEq ι' := Injective.decidableEq (_ : Injective Sum.inr)
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i (c • x)) =
    c • (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u i x)
[PROOFSTEP]
cases i
[GOAL]
case inl
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
c : R
x : M'
this✝ : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
this : DecidableEq ι' := Injective.decidableEq (_ : Injective Sum.inr)
val✝ : ι
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inl val✝) (c • x)) =
    c • (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inl val✝) x)
[PROOFSTEP]
simp only [MultilinearMap.map_smul, smul_apply, Sum.update_inl_comp_inl, Sum.update_inl_comp_inr,
  Sum.update_inr_comp_inl, Sum.update_inr_comp_inr]
[GOAL]
case inr
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : CommSemiring R
inst✝⁶ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
inst✝ : DecidableEq (ι ⊕ ι')
u : ι ⊕ ι' → M'
c : R
x : M'
this✝ : DecidableEq ι := Injective.decidableEq (_ : Injective Sum.inl)
this : DecidableEq ι' := Injective.decidableEq (_ : Injective Sum.inr)
val✝ : ι'
⊢ (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inr val✝) (c • x)) =
    c • (fun u => ↑(↑f (u ∘ Sum.inl)) (u ∘ Sum.inr)) (update u (Sum.inr val✝) x)
[PROOFSTEP]
simp only [MultilinearMap.map_smul, smul_apply, Sum.update_inl_comp_inl, Sum.update_inl_comp_inr,
  Sum.update_inr_comp_inl, Sum.update_inr_comp_inr]
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
f g : MultilinearMap R (fun x => M') M₂
⊢ currySum (f + g) = currySum f + currySum g
[PROOFSTEP]
ext
[GOAL]
case H.H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
f g : MultilinearMap R (fun x => M') M₂
x✝¹ : ι → M'
x✝ : ι' → M'
⊢ ↑(↑(currySum (f + g)) x✝¹) x✝ = ↑(↑(currySum f + currySum g) x✝¹) x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
c : R
f : MultilinearMap R (fun x => M') M₂
⊢ AddHom.toFun
      { toFun := currySum,
        map_add' := (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) }
      (c • f) =
    ↑(RingHom.id R) c •
      AddHom.toFun
        { toFun := currySum,
          map_add' := (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) }
        f
[PROOFSTEP]
ext
[GOAL]
case H.H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
c : R
f : MultilinearMap R (fun x => M') M₂
x✝¹ : ι → M'
x✝ : ι' → M'
⊢ ↑(↑(AddHom.toFun
              { toFun := currySum,
                map_add' :=
                  (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) }
              (c • f))
          x✝¹)
      x✝ =
    ↑(↑(↑(RingHom.id R) c •
              AddHom.toFun
                { toFun := currySum,
                  map_add' :=
                    (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) }
                f)
          x✝¹)
      x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') M₂
u : ι ⊕ ι' → M'
⊢ ↑(uncurrySum
          (AddHom.toFun
            {
                toAddHom :=
                  { toFun := currySum,
                    map_add' :=
                      (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) },
                map_smul' :=
                  (_ :
                    ∀ (c : R) (f : MultilinearMap R (fun x => M') M₂),
                      AddHom.toFun
                          { toFun := currySum,
                            map_add' :=
                              (_ :
                                ∀ (f g : MultilinearMap R (fun x => M') M₂),
                                  currySum (f + g) = currySum f + currySum g) }
                          (c • f) =
                        ↑(RingHom.id R) c •
                          AddHom.toFun
                            { toFun := currySum,
                              map_add' :=
                                (_ :
                                  ∀ (f g : MultilinearMap R (fun x => M') M₂),
                                    currySum (f + g) = currySum f + currySum g) }
                            f) }.toAddHom
            f))
      u =
    ↑f u
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
⊢ AddHom.toFun
      {
          toAddHom :=
            { toFun := currySum,
              map_add' :=
                (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) },
          map_smul' :=
            (_ :
              ∀ (c : R) (f : MultilinearMap R (fun x => M') M₂),
                AddHom.toFun
                    { toFun := currySum,
                      map_add' :=
                        (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) }
                    (c • f) =
                  ↑(RingHom.id R) c •
                    AddHom.toFun
                      { toFun := currySum,
                        map_add' :=
                          (_ :
                            ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) }
                      f) }.toAddHom
      (uncurrySum f) =
    f
[PROOFSTEP]
ext
[GOAL]
case H.H
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x✝¹ : ι → M'
x✝ : ι' → M'
⊢ ↑(↑(AddHom.toFun
              {
                  toAddHom :=
                    { toFun := currySum,
                      map_add' :=
                        (_ : ∀ (f g : MultilinearMap R (fun x => M') M₂), currySum (f + g) = currySum f + currySum g) },
                  map_smul' :=
                    (_ :
                      ∀ (c : R) (f : MultilinearMap R (fun x => M') M₂),
                        AddHom.toFun
                            { toFun := currySum,
                              map_add' :=
                                (_ :
                                  ∀ (f g : MultilinearMap R (fun x => M') M₂),
                                    currySum (f + g) = currySum f + currySum g) }
                            (c • f) =
                          ↑(RingHom.id R) c •
                            AddHom.toFun
                              { toFun := currySum,
                                map_add' :=
                                  (_ :
                                    ∀ (f g : MultilinearMap R (fun x => M') M₂),
                                      currySum (f + g) = currySum f + currySum g) }
                              f) }.toAddHom
              (uncurrySum f))
          x✝¹)
      x✝ =
    ↑(↑f x✝¹) x✝
[PROOFSTEP]
simp
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
⊢ ↑(↑(LinearEquiv.symm (curryFinFinset R M₂ M' hk hl)) f) (Finset.piecewise s (fun x_1 => x) fun x => y) =
    ↑(↑f fun x_1 => x) fun x => y
[PROOFSTEP]
rw [curryFinFinset_symm_apply]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
⊢ (↑(↑f fun i => Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inl i))) fun i =>
      Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr i))) =
    ↑(↑f fun x_1 => x) fun x => y
[PROOFSTEP]
congr
[GOAL]
case h.e_5.h.h.e_6.h
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
⊢ (fun i => Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inl i))) = fun x_1 => x
[PROOFSTEP]
ext
[GOAL]
case h.e_5.h.h.e_6.h.h
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
x✝ : Fin k
⊢ Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inl x✝)) = x
[PROOFSTEP]
rw [finSumEquivOfFinset_inl, Finset.piecewise_eq_of_mem]
[GOAL]
case h.e_5.h.h.e_6.h.h.hi
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
x✝ : Fin k
⊢ ↑(Finset.orderEmbOfFin s hk) x✝ ∈ s
[PROOFSTEP]
apply Finset.orderEmbOfFin_mem
[GOAL]
case h.e_6.h
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
⊢ (fun i => Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr i))) = fun x => y
[PROOFSTEP]
ext
[GOAL]
case h.e_6.h.h
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
x✝ : Fin l
⊢ Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr x✝)) = y
[PROOFSTEP]
rw [finSumEquivOfFinset_inr, Finset.piecewise_eq_of_not_mem]
[GOAL]
case h.e_6.h.h.hi
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
x✝ : Fin l
⊢ ¬↑(Finset.orderEmbOfFin sᶜ hl) x✝ ∈ s
[PROOFSTEP]
exact Finset.mem_compl.1 (Finset.orderEmbOfFin_mem _ _ _)
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
⊢ (↑(↑f fun x_1 => x) fun i =>
      Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr i))) =
    ↑(↑f fun x_1 => x) fun x => y
[PROOFSTEP]
have := curryFinFinset_symm_apply_piecewise_const hk hl f x y
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
this :
  ↑(↑(LinearEquiv.symm (curryFinFinset R M₂ M' hk hl)) f) (Finset.piecewise s (fun x_1 => x) fun x => y) =
    ↑(↑f fun x_1 => x) fun x => y
⊢ (↑(↑f fun x_1 => x) fun i =>
      Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr i))) =
    ↑(↑f fun x_1 => x) fun x => y
[PROOFSTEP]
simp only [curryFinFinset_symm_apply, finSumEquivOfFinset_inl, Finset.orderEmbOfFin_mem, Finset.piecewise_eq_of_mem,
  finSumEquivOfFinset_inr] at this
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') (MultilinearMap R (fun x => M') M₂)
x y : M'
this :
  (↑(↑f fun i => x) fun i =>
      Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr i))) =
    ↑(↑f fun i => x) fun x => y
⊢ (↑(↑f fun x_1 => x) fun i =>
      Finset.piecewise s (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl) (Sum.inr i))) =
    ↑(↑f fun x_1 => x) fun x => y
[PROOFSTEP]
exact this
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') M₂
x y : M'
⊢ (↑(↑(↑(curryFinFinset R M₂ M' hk hl) f) fun x_1 => x) fun x => y) = ↑f (Finset.piecewise s (fun x_1 => x) fun x => y)
[PROOFSTEP]
refine'
  (curryFinFinset_symm_apply_piecewise_const hk hl _ _ _).symm.trans
    _
      -- `rw` fails
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') M₂
x y : M'
⊢ ↑(↑(LinearEquiv.symm (curryFinFinset R M₂ M' hk hl)) (↑(curryFinFinset R M₂ M' hk hl) f))
      (Finset.piecewise s (fun x_1 => x) fun x => y) =
    ↑f (Finset.piecewise s (fun x_1 => x) fun x => y)
[PROOFSTEP]
rw [LinearEquiv.symm_apply_apply]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') M₂
x y : M'
⊢ (↑f fun i => Sum.elim (fun x_1 => x) (fun x => y) (↑(finSumEquivOfFinset hk hl).symm i)) =
    ↑f (Finset.piecewise s (fun x_1 => x) fun x => y)
[PROOFSTEP]
rw [← curryFinFinset_apply]
[GOAL]
R : Type u
ι : Type u'
n✝ : ℕ
M : Fin (Nat.succ n✝) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁶ : CommSemiring R
inst✝⁵ : (i : Fin (Nat.succ n✝)) → AddCommMonoid (M i)
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M₂
inst✝² : (i : Fin (Nat.succ n✝)) → Module R (M i)
inst✝¹ : Module R M'
inst✝ : Module R M₂
ι' : Type u_1
k l n : ℕ
s : Finset (Fin n)
hk : Finset.card s = k
hl : Finset.card sᶜ = l
f : MultilinearMap R (fun x => M') M₂
x y : M'
⊢ (↑(↑(↑(curryFinFinset R M₂ M' hk hl) f) fun x_1 => x) fun x => y) = ↑f (Finset.piecewise s (fun x_1 => x) fun x => y)
[PROOFSTEP]
apply curryFinFinset_apply_const
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
⊢ c • x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
[PROOFSTEP]
let ⟨i⟩ := ‹Nonempty ι›
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
⊢ c • x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
[PROOFSTEP]
letI := Classical.decEq ι
[GOAL]
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
this : DecidableEq ι := Classical.decEq ι
⊢ c • x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
[PROOFSTEP]
refine' ⟨update x i (c • x i), fun j => if hij : j = i then _ else _, hf ▸ _⟩
[GOAL]
case refine'_1
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
this : DecidableEq ι := Classical.decEq ι
j : ι
hij : j = i
⊢ update x i (c • x i) j ∈ p j
[PROOFSTEP]
rw [hij, update_same]
[GOAL]
case refine'_1
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
this : DecidableEq ι := Classical.decEq ι
j : ι
hij : j = i
⊢ c • x i ∈ p i
[PROOFSTEP]
exact (p i).smul_mem _ (hx i)
[GOAL]
case refine'_2
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
this : DecidableEq ι := Classical.decEq ι
j : ι
hij : ¬j = i
⊢ update x i (c • x i) j ∈ p j
[PROOFSTEP]
rw [update_noteq hij]
[GOAL]
case refine'_2
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
this : DecidableEq ι := Classical.decEq ι
j : ι
hij : ¬j = i
⊢ x j ∈ p j
[PROOFSTEP]
exact hx j
[GOAL]
case refine'_3
R : Type u
ι : Type u'
n : ℕ
M : Fin (Nat.succ n) → Type v
M₁ : ι → Type v₁
M₂ : Type v₂
M₃ : Type v₃
M' : Type v'
inst✝⁷ : Ring R
inst✝⁶ : (i : ι) → AddCommMonoid (M₁ i)
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M₂
inst✝³ : (i : ι) → Module R (M₁ i)
inst✝² : Module R M'
inst✝¹ : Module R M₂
inst✝ : Nonempty ι
f : MultilinearMap R M₁ M₂
p : (i : ι) → Submodule R (M₁ i)
c : R
x✝¹ : M₂
x✝ : x✝¹ ∈ ↑f '' {v | ∀ (i : ι), v i ∈ p i}
x : (i : ι) → M₁ i
hx : x ∈ {v | ∀ (i : ι), v i ∈ p i}
hf : ↑f x = x✝¹
i : ι
this : DecidableEq ι := Classical.decEq ι
⊢ ↑f (update x i (c • x i)) = c • ↑f x
[PROOFSTEP]
rw [f.map_smul, update_eq_self]