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

Tactic:
refine Basis.ext (e 0) ?_

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), f.curryLeft ((e 0) i) = g.curryLeft ((e 0) i)

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)
⊢ Fin.cons ((e 0) i) (fun i => (Fin.tail e i) (j i)) x = (e x) (Fin.cons i j x)

Tactic:
refine Fin.cases rfl (fun x => ?_) x

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 => (Fin.tail e i) (j i)) x.succ = (e x.succ) (Fin.cons i j x.succ)

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 (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)

Tactic:
congr 1 with x

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)
⊢ Fin.cons ((e 0) i) (fun i => (Fin.tail e i) (j i)) x = (e x) (Fin.cons i j x)

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
⊢ f.curryLeft ((e 0) i) = g.curryLeft ((e 0) i)

Tactic:
apply hm (Fin.tail e)

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
⊢ ∀ (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)