-- Mathlib/LinearAlgebra/Multilinear/Basis.lean
theorem Basis.ext_multilinear_fin {f g : MultilinearMap R M M₂} {ι₁ : Fin n → Type*}
    (e : ∀ i, Basis (ι₁ i) R (M i))
    (h : ∀ v : ∀ i, ι₁ i, (f fun i => e i (v i)) = g fun i => e i (v i)) : f = g

Proof state:
case succ.a
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ ((f.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)) = (g.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)

Tactic:
convert h (Fin.cons i j)

Result:
case h.e'_2
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ ((f.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)) = f fun i_1 => (e i_1) (Fin.cons i j i_1)

case h.e'_3
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ ((g.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)) = g fun i_1 => (e i_1) (Fin.cons i j i_1)

Proof state:
case zero.H
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
M : Fin 0 → Type u_3
inst✝¹ : (i : Fin 0) → AddCommMonoid (M i)
inst✝ : (i : Fin 0) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin 0 → Type u_6
e : (i : Fin 0) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin 0) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
x : (i : Fin 0) → M i
⊢ f x = g x

Tactic:
convert h finZeroElim

Result:
no goals

Proof state:
case zero
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
M : Fin 0 → Type u_3
inst✝¹ : (i : Fin 0) → AddCommMonoid (M i)
inst✝ : (i : Fin 0) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin 0 → Type u_6
e : (i : Fin 0) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin 0) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
⊢ f = g

Tactic:
ext x

Result:
case zero.H
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
M : Fin 0 → Type u_3
inst✝¹ : (i : Fin 0) → AddCommMonoid (M i)
inst✝ : (i : Fin 0) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin 0 → Type u_6
e : (i : Fin 0) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin 0) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
x : (i : Fin 0) → M i
⊢ f x = g x

Proof state:
case h.e'_2
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ ((f.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)) = f fun i_1 => (e i_1) (Fin.cons i j i_1)

case h.e'_3
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ ((g.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)) = g fun i_1 => (e i_1) (Fin.cons i j i_1)

Tactic:
iterate 2
  rw [curryLeft_apply]
  congr 1 with x
  refine Fin.cases rfl (fun x => ?_) x
  dsimp [Fin.tail]
  rw [Fin.cons_succ, Fin.cons_succ]

Result:
no goals

Proof state:
case h.e'_3
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ ((g.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (j i)) = g fun i_1 => (e i_1) (Fin.cons i j i_1)

Tactic:
rw [curryLeft_apply]

Result:
case h.e'_3
R : Type u_1
M₂ : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M₂
inst✝² : Module R M₂
m : ℕ
hm :
  ∀ {M : Fin m → Type u_3} [inst : (i : Fin m) → AddCommMonoid (M i)] [inst_1 : (i : Fin m) → Module R (M i)]
    {f g : MultilinearMap R M M₂} {ι₁ : Fin m → Type u_6} (e : (i : Fin m) → Basis (ι₁ i) R (M i)),
    (∀ (v : (i : Fin m) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)) → f = g
M : Fin (m + 1) → Type u_3
inst✝¹ : (i : Fin (m + 1)) → AddCommMonoid (M i)
inst✝ : (i : Fin (m + 1)) → Module R (M i)
f g : MultilinearMap R M M₂
ι₁ : Fin (m + 1) → Type u_6
e : (i : Fin (m + 1)) → Basis (ι₁ i) R (M i)
h : ∀ (v : (i : Fin (m + 1)) → ι₁ i), (f fun i => (e i) (v i)) = g fun i => (e i) (v i)
i : ι₁ 0
j : (i : Fin m) → ι₁ i.succ
⊢ g (Fin.cons ((e 0) i) fun i => (Fin.tail e i) (j i)) = g fun i_1 => (e i_1) (Fin.cons i j i_1)