-- Mathlib/LinearAlgebra/BilinearForm/Orthogonal.lean
theorem iIsOrtho.nondegenerate_iff_not_isOrtho_basis_self {n : Type w} [Nontrivial R]
    [NoZeroDivisors R] (B : BilinForm R M) (v : Basis n R M) (hO : B.iIsOrtho v) :
    B.Nondegenerate ↔ ∀ i, ¬B.IsOrtho (v i) (v i)

Proof state:
case intro.h
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : ∑ x ∈ vi.support, vi x * (B (v x)) (v i) = 0
⊢ vi i = 0

Tactic:
rw [Finset.sum_eq_single i] at hB

Result:
case intro.h
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : vi i * (B (v i)) (v i) = 0
⊢ vi i = 0

case intro.h.h₀
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : ∑ x ∈ vi.support, vi x * (B (v x)) (v i) = 0
⊢ ∀ b ∈ vi.support, b ≠ i → vi b * (B (v b)) (v i) = 0

case intro.h.h₁
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : ∑ x ∈ vi.support, vi x * (B (v x)) (v i) = 0
⊢ i ∉ vi.support → vi i * (B (v i)) (v i) = 0

Proof state:
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
m : M
hB : ∀ (n : M), (B m) n = 0
⊢ m = 0

Tactic:
obtain ⟨vi, rfl⟩ := v.repr.symm.surjective m

Result:
case intro
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
hB : ∀ (n_1 : M), (B (v.repr.symm vi)) n_1 = 0
⊢ v.repr.symm vi = 0

Proof state:
case intro.h
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
hB : ∀ (n_1 : M), (B (v.repr.symm vi)) n_1 = 0
i : n
⊢ vi i = 0

Tactic:
specialize hB (v i)

Result:
case intro.h
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : (B (v.repr.symm vi)) (v i) = 0
⊢ vi i = 0

Proof state:
case intro.h.h₁
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : ∑ x ∈ vi.support, vi x * (B (v x)) (v i) = 0
hi : i ∉ vi.support
⊢ vi i * (B (v i)) (v i) = 0

Tactic:
convert zero_mul (M₀ := R) _ using 2

Result:
case h.e'_2.h.e'_5
R : Type u_1
M : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
n : Type w
inst✝¹ : Nontrivial R
inst✝ : NoZeroDivisors R
B : BilinForm R M
v : Basis n R M
hO : B.iIsOrtho ⇑v
ho : ∀ (i : n), ¬B.IsOrtho (v i) (v i)
vi : n →₀ R
i : n
hB : ∑ x ∈ vi.support, vi x * (B (v x)) (v i) = 0
hi : i ∉ vi.support
⊢ vi i = 0