-- 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
⊢ ∀ (v : (i : Fin m) → ι₁ i.succ),
    ((f.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (v i)) = (g.curryLeft ((e 0) i)) fun i => (Fin.tail e i) (v i)

Tactic:
intro j

Result:
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)

Proof state:
case succ
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)
⊢ f = g

Tactic:
apply Function.LeftInverse.injective uncurry_curryLeft

Result:
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)
⊢ f.curryLeft = g.curryLeft

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

Tactic:
induction n with
| zero =>
  ext x
  convert h finZeroElim
| succ m hm =>
  apply Function.LeftInverse.injective uncurry_curryLeft
  refine Basis.ext (e 0) ?_
  intro i
  apply hm (Fin.tail e)
  intro j
  convert h (Fin.cons i j)
  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.h.e_6.h.h
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
x✝ : Fin (m + 1)
x : Fin m
⊢ Fin.cons ((e 0) i) (fun i => (Fin.tail e i) (j i)) x.succ = (e x.succ) (Fin.cons i j x.succ)

Tactic:
dsimp [Fin.tail]

Result:
case h.e'_3.h.e_6.h.h
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
x✝ : Fin (m + 1)
x : Fin m
⊢ Fin.cons ((e 0) i) (fun i => (e i.succ) (j i)) x.succ = (e x.succ) (Fin.cons i j x.succ)