[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f g : M → R
x y : M
⊢ polar (f + g) x y = polar f x y + polar g x y
[PROOFSTEP]
simp only [polar, Pi.add_apply]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f g : M → R
x y : M
⊢ f (x + y) + g (x + y) - (f x + g x) - (f y + g y) = f (x + y) - f x - f y + (g (x + y) - g x - g y)
[PROOFSTEP]
abel
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f g : M → R
x y : M
⊢ f (x + y) + g (x + y) - (f x + g x) - (f y + g y) = f (x + y) - f x - f y + (g (x + y) - g x - g y)
[PROOFSTEP]
abel
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f : M → R
x y : M
⊢ polar (-f) x y = -polar f x y
[PROOFSTEP]
simp only [polar, Pi.neg_apply, sub_eq_add_neg, neg_add]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁴ : Ring R
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Monoid S
inst✝ : DistribMulAction S R
f : M → R
s : S
x y : M
⊢ polar (s • f) x y = s • polar f x y
[PROOFSTEP]
simp only [polar, Pi.smul_apply, smul_sub]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f : M → R
x y : M
⊢ polar f x y = polar f y x
[PROOFSTEP]
rw [polar, polar, add_comm, sub_sub, sub_sub, add_comm (f x) (f y)]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f : M → R
x x' y : M
⊢ polar f (x + x') y = polar f x y + polar f x' y ↔
    f (x + x' + y) + (f x + f x' + f y) = f (x + x') + f (x' + y) + f (y + x)
[PROOFSTEP]
simp only [← add_assoc]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f : M → R
x x' y : M
⊢ polar f (x + x') y = polar f x y + polar f x' y ↔
    f (x + x' + y) + f x + f x' + f y = f (x + x') + f (x' + y) + f (y + x)
[PROOFSTEP]
simp only [polar, sub_eq_iff_eq_add, eq_sub_iff_add_eq, sub_add_eq_add_sub, add_sub]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f : M → R
x x' y : M
⊢ f (x + x' + y) + f y + f x' + f y + f x = f (x + y) + f (x' + y) + f y + f (x + x') ↔
    f (x + x' + y) + f x + f x' + f y = f (x + x') + f (x' + y) + f (y + x)
[PROOFSTEP]
simp only [add_right_comm _ (f y) _, add_right_comm _ (f x') (f x)]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : CommRing R₁
inst✝ : AddCommGroup M
f : M → R
x x' y : M
⊢ f (x + x' + y) + f x + f x' + f y + f y = f (x + y) + f (x' + y) + f (x + x') + f y ↔
    f (x + x' + y) + f x + f x' + f y = f (x + x') + f (x' + y) + f (y + x)
[PROOFSTEP]
rw [add_comm y x, add_right_comm _ _ (f (x + y)), add_comm _ (f (x + y)), add_right_comm (f (x + y)), add_left_inj]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁴ : Ring R
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
F : Type u_6
inst✝¹ : Ring S
inst✝ : AddMonoidHomClass F R S
f : M → R
g : F
x y : M
⊢ polar (↑g ∘ f) x y = ↑g (polar f x y)
[PROOFSTEP]
simp only [polar, Pi.smul_apply, Function.comp_apply, map_sub]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q Q' x y : QuadraticForm R M
h : x.toFun = y.toFun
⊢ x = y
[PROOFSTEP]
cases x
[GOAL]
case mk
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q Q' y : QuadraticForm R M
toFun✝ : M → R
toFun_smul✝ : ∀ (a : R) (x : M), toFun✝ (a • x) = a * a * toFun✝ x
exists_companion'✝ : ∃ B, ∀ (x y : M), toFun✝ (x + y) = toFun✝ x + toFun✝ y + BilinForm.bilin B x y
h : { toFun := toFun✝, toFun_smul := toFun_smul✝, exists_companion' := exists_companion'✝ }.toFun = y.toFun
⊢ { toFun := toFun✝, toFun_smul := toFun_smul✝, exists_companion' := exists_companion'✝ } = y
[PROOFSTEP]
cases y
[GOAL]
case mk.mk
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q Q' : QuadraticForm R M
toFun✝¹ : M → R
toFun_smul✝¹ : ∀ (a : R) (x : M), toFun✝¹ (a • x) = a * a * toFun✝¹ x
exists_companion'✝¹ : ∃ B, ∀ (x y : M), toFun✝¹ (x + y) = toFun✝¹ x + toFun✝¹ y + BilinForm.bilin B x y
toFun✝ : M → R
toFun_smul✝ : ∀ (a : R) (x : M), toFun✝ (a • x) = a * a * toFun✝ x
exists_companion'✝ : ∃ B, ∀ (x y : M), toFun✝ (x + y) = toFun✝ x + toFun✝ y + BilinForm.bilin B x y
h :
  { toFun := toFun✝¹, toFun_smul := toFun_smul✝¹, exists_companion' := exists_companion'✝¹ }.toFun =
    { toFun := toFun✝, toFun_smul := toFun_smul✝, exists_companion' := exists_companion'✝ }.toFun
⊢ { toFun := toFun✝¹, toFun_smul := toFun_smul✝¹, exists_companion' := exists_companion'✝¹ } =
    { toFun := toFun✝, toFun_smul := toFun_smul✝, exists_companion' := exists_companion'✝ }
[PROOFSTEP]
congr
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x y z : M
⊢ ↑Q (x + y + z) + (↑Q x + ↑Q y + ↑Q z) = ↑Q (x + y) + ↑Q (y + z) + ↑Q (z + x)
[PROOFSTEP]
obtain ⟨B, h⟩ := Q.exists_companion
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x y z : M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
⊢ ↑Q (x + y + z) + (↑Q x + ↑Q y + ↑Q z) = ↑Q (x + y) + ↑Q (y + z) + ↑Q (z + x)
[PROOFSTEP]
rw [add_comm z x]
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x y z : M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
⊢ ↑Q (x + y + z) + (↑Q x + ↑Q y + ↑Q z) = ↑Q (x + y) + ↑Q (y + z) + ↑Q (x + z)
[PROOFSTEP]
simp [h]
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x y z : M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
⊢ ↑Q x + ↑Q y + BilinForm.bilin B x y + ↑Q z + (BilinForm.bilin B x z + BilinForm.bilin B y z) + (↑Q x + ↑Q y + ↑Q z) =
    ↑Q x + ↑Q y + BilinForm.bilin B x y + (↑Q y + ↑Q z + BilinForm.bilin B y z) + (↑Q x + ↑Q z + BilinForm.bilin B x z)
[PROOFSTEP]
abel
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x y z : M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
⊢ ↑Q x + ↑Q y + BilinForm.bilin B x y + ↑Q z + (BilinForm.bilin B x z + BilinForm.bilin B y z) + (↑Q x + ↑Q y + ↑Q z) =
    ↑Q x + ↑Q y + BilinForm.bilin B x y + (↑Q y + ↑Q z + BilinForm.bilin B y z) + (↑Q x + ↑Q z + BilinForm.bilin B x z)
[PROOFSTEP]
abel
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x : M
⊢ ↑Q (x + x) = 4 * ↑Q x
[PROOFSTEP]
rw [← one_smul R x, ← add_smul, map_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
x : M
⊢ (1 + 1) * (1 + 1) * ↑Q x = 4 * ↑Q (1 • x)
[PROOFSTEP]
norm_num
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
⊢ ↑Q 0 = 0
[PROOFSTEP]
rw [← @zero_smul R _ _ _ _ (0 : M), map_smul, zero_mul, zero_mul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
a : S
x : M
⊢ ↑Q (a • x) = (a * a) • ↑Q x
[PROOFSTEP]
rw [← IsScalarTower.algebraMap_smul R a x, map_smul, ← RingHom.map_mul, Algebra.smul_def]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x : M
⊢ ↑Q (-x) = ↑Q x
[PROOFSTEP]
rw [← @neg_one_smul R _ _ _ _ x, map_smul, neg_one_mul, neg_neg, one_mul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x y : M
⊢ ↑Q (x - y) = ↑Q (y - x)
[PROOFSTEP]
rw [← neg_sub, map_neg]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
y : M
⊢ polar (↑Q) 0 y = 0
[PROOFSTEP]
simp only [polar, zero_add, QuadraticForm.map_zero, sub_zero, sub_self]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
a : R
x y : M
⊢ polar (↑Q) (a • x) y = a * polar (↑Q) x y
[PROOFSTEP]
obtain ⟨B, h⟩ := Q.exists_companion
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
a : R
x y : M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
⊢ polar (↑Q) (a • x) y = a * polar (↑Q) x y
[PROOFSTEP]
simp_rw [polar, h, Q.map_smul, BilinForm.smul_left, sub_sub, add_sub_cancel']
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x y : M
⊢ polar (↑Q) (-x) y = -polar (↑Q) x y
[PROOFSTEP]
rw [← neg_one_smul R x, polar_smul_left, neg_one_mul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x x' y : M
⊢ polar (↑Q) (x - x') y = polar (↑Q) x y - polar (↑Q) x' y
[PROOFSTEP]
rw [sub_eq_add_neg, sub_eq_add_neg, polar_add_left, polar_neg_left]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
y : M
⊢ polar (↑Q) y 0 = 0
[PROOFSTEP]
simp only [add_zero, polar, QuadraticForm.map_zero, sub_self]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x y y' : M
⊢ polar (↑Q) x (y + y') = polar (↑Q) x y + polar (↑Q) x y'
[PROOFSTEP]
rw [polar_comm Q x, polar_comm Q x, polar_comm Q x, polar_add_left]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
a : R
x y : M
⊢ polar (↑Q) x (a • y) = a * polar (↑Q) x y
[PROOFSTEP]
rw [polar_comm Q x, polar_comm Q x, polar_smul_left]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x y : M
⊢ polar (↑Q) x (-y) = -polar (↑Q) x y
[PROOFSTEP]
rw [← neg_one_smul R y, polar_smul_right, neg_one_mul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x y y' : M
⊢ polar (↑Q) x (y - y') = polar (↑Q) x y - polar (↑Q) x y'
[PROOFSTEP]
rw [sub_eq_add_neg, sub_eq_add_neg, polar_add_right, polar_neg_right]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x : M
⊢ polar (↑Q) x x = 2 * ↑Q x
[PROOFSTEP]
rw [polar, map_add_self, sub_sub, sub_eq_iff_eq_add, ← two_mul, ← two_mul, ← mul_assoc]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x : M
⊢ 4 * ↑Q x = 2 * 2 * ↑Q x
[PROOFSTEP]
norm_num
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
x y z : M
⊢ polar (↑Q) x (y + z) = polar (↑Q) x y + polar (↑Q) x z
[PROOFSTEP]
simp_rw [polar_comm _ x, polar_add_left Q]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : CommRing R₁
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
r : R
x y : M
⊢ polar (↑Q) x (r • y) = r * polar (↑Q) x y
[PROOFSTEP]
simp_rw [polar_comm _ x, polar_smul_left Q]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
a : S
x y : M
⊢ polar (↑Q) (a • x) y = a • polar (↑Q) x y
[PROOFSTEP]
rw [← IsScalarTower.algebraMap_smul R a x, polar_smul_left, Algebra.smul_def]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
a : S
x y : M
⊢ polar (↑Q) x (a • y) = a • polar (↑Q) x y
[PROOFSTEP]
rw [← IsScalarTower.algebraMap_smul R a y, polar_smul_right, Algebra.smul_def]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
toFun : M → R
toFun_smul : ∀ (a : R) (x : M), toFun (a • x) = a * a * toFun x
polar_add_left : ∀ (x x' y : M), polar toFun (x + x') y = polar toFun x y + polar toFun x' y
polar_smul_left : ∀ (a : R) (x y : M), polar toFun (a • x) y = a • polar toFun x y
x y z : M
⊢ polar toFun x (y + z) = polar toFun x y + polar toFun x z
[PROOFSTEP]
simp_rw [polar_comm _ x, polar_add_left]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
toFun : M → R
toFun_smul : ∀ (a : R) (x : M), toFun (a • x) = a * a * toFun x
polar_add_left : ∀ (x x' y : M), polar toFun (x + x') y = polar toFun x y + polar toFun x' y
polar_smul_left : ∀ (a : R) (x y : M), polar toFun (a • x) y = a • polar toFun x y
r : R
x y : M
⊢ polar toFun x (r • y) = r * polar toFun x y
[PROOFSTEP]
simp_rw [polar_comm _ x, polar_smul_left, smul_eq_mul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
toFun : M → R
toFun_smul : ∀ (a : R) (x : M), toFun (a • x) = a * a * toFun x
polar_add_left : ∀ (x x' y : M), polar toFun (x + x') y = polar toFun x y + polar toFun x' y
polar_smul_left : ∀ (a : R) (x y : M), polar toFun (a • x) y = a • polar toFun x y
x y : M
⊢ toFun (x + y) =
    toFun x + toFun y +
      BilinForm.bilin
        { bilin := polar toFun, bilin_add_left := polar_add_left, bilin_smul_left := polar_smul_left,
          bilin_add_right := (_ : ∀ (x y z : M), polar toFun x (y + z) = polar toFun x y + polar toFun x z),
          bilin_smul_right := (_ : ∀ (r : R) (x y : M), polar toFun x (r • y) = r * polar toFun x y) }
        x y
[PROOFSTEP]
rw [BilinForm.coeFn_mk, polar, sub_sub, add_sub_cancel'_right]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
Q : QuadraticForm R M
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
x y : M
⊢ BilinForm.bilin (Exists.choose (_ : ∃ B, ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y)) x y =
    BilinForm.bilin (polarBilin Q) x y
[PROOFSTEP]
rw [polarBilin_apply, polar, Q.exists_companion.choose_spec, sub_sub, add_sub_cancel']
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
inst✝⁵ : Monoid S
inst✝⁴ : Monoid T
inst✝³ : DistribMulAction S R
inst✝² : DistribMulAction T R
inst✝¹ : SMulCommClass S R R
inst✝ : SMulCommClass T R R
a : S
Q : QuadraticForm R M
b : R
x : M
⊢ (a • ↑Q) (b • x) = b * b * (a • ↑Q) x
[PROOFSTEP]
rw [Pi.smul_apply, map_smul, Pi.smul_apply, mul_smul_comm]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
inst✝⁵ : Monoid S
inst✝⁴ : Monoid T
inst✝³ : DistribMulAction S R
inst✝² : DistribMulAction T R
inst✝¹ : SMulCommClass S R R
inst✝ : SMulCommClass T R R
a : S
Q : QuadraticForm R M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
⊢ ∀ (x y : M), (a • ↑Q) (x + y) = (a • ↑Q) x + (a • ↑Q) y + BilinForm.bilin (a • B) x y
[PROOFSTEP]
simp [h]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
a : R
x✝ : M
⊢ (fun x => 0) (a • x✝) = a * a * (fun x => 0) x✝
[PROOFSTEP]
simp only [mul_zero]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝¹ x✝ : M
⊢ (fun x => 0) (x✝¹ + x✝) = (fun x => 0) x✝¹ + (fun x => 0) x✝ + BilinForm.bilin 0 x✝¹ x✝
[PROOFSTEP]
simp only [add_zero, BilinForm.zero_apply]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q Q' : QuadraticForm R M
a : R
x : M
⊢ (↑Q + ↑Q') (a • x) = a * a * (↑Q + ↑Q') x
[PROOFSTEP]
simp only [Pi.add_apply, map_smul, mul_add]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q Q' : QuadraticForm R M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
B' : BilinForm R M
h' : ∀ (x y : M), ↑Q' (x + y) = ↑Q' x + ↑Q' y + BilinForm.bilin B' x y
x y : M
⊢ (↑Q + ↑Q') (x + y) = (↑Q + ↑Q') x + (↑Q + ↑Q') y + BilinForm.bilin (B + B') x y
[PROOFSTEP]
simp_rw [Pi.add_apply, h, h', BilinForm.add_apply, add_add_add_comm]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Monoid S
inst✝¹ : DistribMulAction S R
inst✝ : SMulCommClass S R R
Q : QuadraticForm R M
x : M
⊢ ↑(1 • Q) x = ↑Q x
[PROOFSTEP]
simp only [QuadraticForm.smul_apply, one_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Monoid S
inst✝¹ : DistribMulAction S R
inst✝ : SMulCommClass S R R
a b : S
Q : QuadraticForm R M
x : M
⊢ ↑((a * b) • Q) x = ↑(a • b • Q) x
[PROOFSTEP]
simp only [smul_apply, mul_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Monoid S
inst✝¹ : DistribMulAction S R
inst✝ : SMulCommClass S R R
a : S
⊢ a • 0 = 0
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Monoid S
inst✝¹ : DistribMulAction S R
inst✝ : SMulCommClass S R R
a : S
x✝ : M
⊢ ↑(a • 0) x✝ = ↑0 x✝
[PROOFSTEP]
simp only [zero_apply, smul_apply, smul_zero]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Monoid S
inst✝¹ : DistribMulAction S R
inst✝ : SMulCommClass S R R
a : S
Q Q' : QuadraticForm R M
⊢ a • (Q + Q') = a • Q + a • Q'
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Monoid S
inst✝¹ : DistribMulAction S R
inst✝ : SMulCommClass S R R
a : S
Q Q' : QuadraticForm R M
x✝ : M
⊢ ↑(a • (Q + Q')) x✝ = ↑(a • Q + a • Q') x✝
[PROOFSTEP]
simp only [add_apply, smul_apply, smul_add]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Semiring S
inst✝¹ : Module S R
inst✝ : SMulCommClass S R R
a b : S
Q : QuadraticForm R M
⊢ (a + b) • Q = a • Q + b • Q
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Semiring S
inst✝¹ : Module S R
inst✝ : SMulCommClass S R R
a b : S
Q : QuadraticForm R M
x✝ : M
⊢ ↑((a + b) • Q) x✝ = ↑(a • Q + b • Q) x✝
[PROOFSTEP]
simp only [add_apply, smul_apply, add_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Semiring S
inst✝¹ : Module S R
inst✝ : SMulCommClass S R R
Q : QuadraticForm R M
⊢ 0 • Q = 0
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁵ : Semiring R
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Semiring S
inst✝¹ : Module S R
inst✝ : SMulCommClass S R R
Q : QuadraticForm R M
x✝ : M
⊢ ↑(0 • Q) x✝ = ↑0 x✝
[PROOFSTEP]
simp only [zero_apply, smul_apply, zero_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
a : R
x : M
⊢ (-↑Q) (a • x) = a * a * (-↑Q) x
[PROOFSTEP]
simp only [Pi.neg_apply, map_smul, mul_neg]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
x y : M
⊢ (-↑Q) (x + y) = (-↑Q) x + (-↑Q) y + BilinForm.bilin (-B) x y
[PROOFSTEP]
simp_rw [Pi.neg_apply, h, BilinForm.neg_apply, neg_add]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
N : Type v
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
Q : QuadraticForm R N
f : M →ₗ[R] N
a : R
x : M
⊢ (fun x => ↑Q (↑f x)) (a • x) = a * a * (fun x => ↑Q (↑f x)) x
[PROOFSTEP]
simp only [map_smul, f.map_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
N : Type v
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
Q : QuadraticForm R N
f : M →ₗ[R] N
B : BilinForm R N
h : ∀ (x y : N), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
x y : M
⊢ (fun x => ↑Q (↑f x)) (x + y) =
    (fun x => ↑Q (↑f x)) x + (fun x => ↑Q (↑f x)) y + BilinForm.bilin (BilinForm.comp B f f) x y
[PROOFSTEP]
simp_rw [f.map_add, h, BilinForm.comp_apply]
[GOAL]
S✝ : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
N : Type v
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
S : Type u_6
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
f : R →ₗ[S] S
Q : QuadraticForm R M
b : S
x : M
⊢ (fun x => ↑f (↑Q x)) (b • x) = b * b * (fun x => ↑f (↑Q x)) x
[PROOFSTEP]
simp only [Q.map_smul_of_tower b x, f.map_smul, smul_eq_mul]
[GOAL]
S✝ : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁸ : Semiring R
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
N : Type v
inst✝⁵ : AddCommMonoid N
inst✝⁴ : Module R N
S : Type u_6
inst✝³ : CommSemiring S
inst✝² : Algebra S R
inst✝¹ : Module S M
inst✝ : IsScalarTower S R M
f : R →ₗ[S] S
Q : QuadraticForm R M
B : BilinForm R M
h : ∀ (x y : M), ↑Q (x + y) = ↑Q x + ↑Q y + BilinForm.bilin B x y
x y : M
⊢ (fun x => ↑f (↑Q x)) (x + y) =
    (fun x => ↑f (↑Q x)) x + (fun x => ↑f (↑Q x)) y + BilinForm.bilin (LinearMap.compBilinForm f B) x y
[PROOFSTEP]
simp_rw [h, f.map_add, LinearMap.compBilinForm_apply]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f g : M →ₗ[R] R
a : R
x : M
⊢ (↑f * ↑g) (a • x) = a * a * (↑f * ↑g) x
[PROOFSTEP]
simp only [smul_eq_mul, RingHom.id_apply, Pi.mul_apply, LinearMap.map_smulₛₗ]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f g : M →ₗ[R] R
a : R
x : M
⊢ a * ↑f x * (a * ↑g x) = a * a * (↑f x * ↑g x)
[PROOFSTEP]
ring
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f g : M →ₗ[R] R
x y : M
⊢ (↑f * ↑g) (x + y) =
    (↑f * ↑g) x + (↑f * ↑g) y + BilinForm.bilin (BilinForm.linMulLin f g + BilinForm.linMulLin g f) x y
[PROOFSTEP]
simp
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f g : M →ₗ[R] R
x y : M
⊢ (↑f x + ↑f y) * (↑g x + ↑g y) = ↑f x * ↑g x + ↑f y * ↑g y + (↑f x * ↑g y + ↑g x * ↑f y)
[PROOFSTEP]
ring
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
B✝ B : BilinForm R M
a : R
x : M
⊢ (fun x => bilin B x x) (a • x) = a * a * (fun x => bilin B x x) x
[PROOFSTEP]
simp only [mul_assoc, smul_right, smul_left]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
B✝ B : BilinForm R M
x y : M
⊢ (fun x => bilin B x x) (x + y) = (fun x => bilin B x x) x + (fun x => bilin B x x) y + bilin (B + ↑(flipHom ℕ) B) x y
[PROOFSTEP]
simp [add_add_add_comm, add_comm]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
B : BilinForm R M
x y : M
⊢ polar (fun x => bilin B x x) x y = bilin B x y + bilin B y x
[PROOFSTEP]
simp only [add_assoc, add_sub_cancel', add_right, polar, add_left_inj, add_neg_cancel_left, add_left,
  sub_eq_add_neg _ (B y y), add_comm (B y x) _]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q Q' : QuadraticForm R M
⊢ (fun Q =>
        (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) } (polarBilin Q))
      (Q + Q') =
    (fun Q =>
          (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) } (polarBilin Q))
        Q +
      (fun Q =>
          (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) } (polarBilin Q))
        Q'
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q Q' : QuadraticForm R M
x✝ y✝ : M
⊢ bilin
      ((fun Q =>
          (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) } (polarBilin Q))
        (Q + Q'))
      x✝ y✝ =
    bilin
      ((fun Q =>
            (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
              (polarBilin Q))
          Q +
        (fun Q =>
            (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
              (polarBilin Q))
          Q')
      x✝ y✝
[PROOFSTEP]
simp only [BilinForm.add_apply, BilinForm.smul_apply, coeFn_mk, polarBilin_apply, polar_add, coeFn_add, smul_add]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
s : S
Q : QuadraticForm R M
⊢ AddHom.toFun
      {
        toFun := fun Q =>
          (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) } (polarBilin Q),
        map_add' :=
          (_ :
            ∀ (Q Q' : QuadraticForm R M),
              (fun Q =>
                    (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                      (polarBilin Q))
                  (Q + Q') =
                (fun Q =>
                      (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                        (polarBilin Q))
                    Q +
                  (fun Q =>
                      (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                        (polarBilin Q))
                    Q') }
      (s • Q) =
    ↑(RingHom.id S) s •
      AddHom.toFun
        {
          toFun := fun Q =>
            (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
              (polarBilin Q),
          map_add' :=
            (_ :
              ∀ (Q Q' : QuadraticForm R M),
                (fun Q =>
                      (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                        (polarBilin Q))
                    (Q + Q') =
                  (fun Q =>
                        (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                          (polarBilin Q))
                      Q +
                    (fun Q =>
                        (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                          (polarBilin Q))
                      Q') }
        Q
[PROOFSTEP]
ext
  -- porting note: added type annotations
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
s : S
Q : QuadraticForm R M
x✝ y✝ : M
⊢ bilin
      (AddHom.toFun
        {
          toFun := fun Q =>
            (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
              (polarBilin Q),
          map_add' :=
            (_ :
              ∀ (Q Q' : QuadraticForm R M),
                (fun Q =>
                      (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                        (polarBilin Q))
                    (Q + Q') =
                  (fun Q =>
                        (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                          (polarBilin Q))
                      Q +
                    (fun Q =>
                        (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                          (polarBilin Q))
                      Q') }
        (s • Q))
      x✝ y✝ =
    bilin
      (↑(RingHom.id S) s •
        AddHom.toFun
          {
            toFun := fun Q =>
              (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                (polarBilin Q),
            map_add' :=
              (_ :
                ∀ (Q Q' : QuadraticForm R M),
                  (fun Q =>
                        (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                          (polarBilin Q))
                      (Q + Q') =
                    (fun Q =>
                          (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                            (polarBilin Q))
                        Q +
                      (fun Q =>
                          (fun x x_1 => x • x_1) { val := ⅟2, property := (_ : ∀ (x : R), Commute x ⅟(OfNat.ofNat 2)) }
                            (polarBilin Q))
                        Q') }
          Q)
      x✝ y✝
[PROOFSTEP]
simp only [RingHom.id_apply, polar_smul, smul_comm s (_ : Submonoid.center R) (_ : R), polarBilin_apply, coeFn_mk,
  coeFn_smul, BilinForm.smul_apply]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q : QuadraticForm R M
x y : M
⊢ bilin (↑(associatedHom S) Q) x y = bilin (↑(associatedHom S) Q) y x
[PROOFSTEP]
simp only [associated_apply, add_comm, add_left_comm, sub_eq_add_neg, add_assoc]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : CommRing R₁
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
inst✝⁵ : Module R₁ M
inst✝⁴ : CommSemiring S
inst✝³ : Algebra S R
inst✝² : Invertible 2
B₁ : BilinForm R M
Q : QuadraticForm R M
N : Type v
inst✝¹ : AddCommGroup N
inst✝ : Module R N
f : N →ₗ[R] M
⊢ ↑(associatedHom S) (comp Q f) = BilinForm.comp (↑(associatedHom S) Q) f f
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : CommRing R₁
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
inst✝⁵ : Module R₁ M
inst✝⁴ : CommSemiring S
inst✝³ : Algebra S R
inst✝² : Invertible 2
B₁ : BilinForm R M
Q : QuadraticForm R M
N : Type v
inst✝¹ : AddCommGroup N
inst✝ : Module R N
f : N →ₗ[R] M
x✝ y✝ : N
⊢ bilin (↑(associatedHom S) (comp Q f)) x✝ y✝ = bilin (BilinForm.comp (↑(associatedHom S) Q) f f) x✝ y✝
[PROOFSTEP]
simp only [QuadraticForm.comp_apply, BilinForm.comp_apply, associated_apply, LinearMap.map_add]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q : QuadraticForm R M
B : BilinForm R M
x y : M
⊢ bilin (↑(associatedHom S) (toQuadraticForm B)) x y = ⅟2 * (bilin B x y + bilin B y x)
[PROOFSTEP]
simp only [associated_apply, ← polar_to_quadratic_form, polar, toQuadraticForm_apply]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q : QuadraticForm R M
h : BilinForm.IsSymm B₁
x y : M
⊢ bilin (↑(associatedHom S) (toQuadraticForm B₁)) x y = bilin B₁ x y
[PROOFSTEP]
rw [associated_toQuadraticForm, h.eq x y, ← two_mul, ← mul_assoc, invOf_mul_self, one_mul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q : QuadraticForm R M
x : M
⊢ bilin (↑(associatedHom S) Q) x x = ↑Q x
[PROOFSTEP]
rw [associated_apply, map_add_self, ← three_add_one_eq_four, ← two_add_one_eq_three, add_mul, add_mul, one_mul,
  add_sub_cancel, add_sub_cancel, invOf_mul_self_assoc]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q✝ Q : QuadraticForm R M
hB₁ : ↑associated' Q ≠ 0
⊢ ∃ x, ↑Q x ≠ 0
[PROOFSTEP]
rw [← not_forall]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q✝ Q : QuadraticForm R M
hB₁ : ↑associated' Q ≠ 0
⊢ ¬∀ (x : M), ↑Q x = 0
[PROOFSTEP]
intro h
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q✝ Q : QuadraticForm R M
hB₁ : ↑associated' Q ≠ 0
h : ∀ (x : M), ↑Q x = 0
⊢ False
[PROOFSTEP]
apply hB₁
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁷ : Ring R
inst✝⁶ : CommRing R₁
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module R₁ M
inst✝² : CommSemiring S
inst✝¹ : Algebra S R
inst✝ : Invertible 2
B₁ : BilinForm R M
Q✝ Q : QuadraticForm R M
hB₁ : ↑associated' Q ≠ 0
h : ∀ (x : M), ↑Q x = 0
⊢ ↑associated' Q = 0
[PROOFSTEP]
rw [(QuadraticForm.ext h : Q = 0), LinearMap.map_zero]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
f g : M →ₗ[R₁] R₁
⊢ ↑associated (linMulLin f g) = ⅟2 • (BilinForm.linMulLin f g + BilinForm.linMulLin g f)
[PROOFSTEP]
ext
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
f g : M →ₗ[R₁] R₁
x✝ y✝ : M
⊢ bilin (↑associated (linMulLin f g)) x✝ y✝ = bilin (⅟2 • (BilinForm.linMulLin f g + BilinForm.linMulLin g f)) x✝ y✝
[PROOFSTEP]
simp only [smul_add, Algebra.id.smul_eq_mul, BilinForm.linMulLin_apply, QuadraticForm.linMulLin_apply,
  BilinForm.smul_apply, associated_apply, BilinForm.add_apply, LinearMap.map_add]
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
f g : M →ₗ[R₁] R₁
x✝ y✝ : M
⊢ ⅟2 * ((↑f x✝ + ↑f y✝) * (↑g x✝ + ↑g y✝) - ↑f x✝ * ↑g x✝ - ↑f y✝ * ↑g y✝) = ⅟2 * (↑f x✝ * ↑g y✝) + ⅟2 * (↑g x✝ * ↑f y✝)
[PROOFSTEP]
ring
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
Q : QuadraticForm R M
⊢ ¬Anisotropic Q ↔ ∃ x, x ≠ 0 ∧ ↑Q x = 0
[PROOFSTEP]
simp only [Anisotropic, not_forall, exists_prop, and_comm]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Invertible 2
Q : QuadraticForm R M
hB : Anisotropic Q
x : M
hx : ∀ (n : M), bilin (↑associated' Q) x n = 0
⊢ ↑Q x = 0
[PROOFSTEP]
rw [← hx x]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Invertible 2
Q : QuadraticForm R M
hB : Anisotropic Q
x : M
hx : ∀ (n : M), bilin (↑associated' Q) x n = 0
⊢ ↑Q x = bilin (↑associated' Q) x x
[PROOFSTEP]
exact (associated_eq_self_apply _ _ x).symm
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
R₂ : Type u
inst✝² : OrderedRing R₂
inst✝¹ : AddCommMonoid M
inst✝ : Module R₂ M
Q₂ : QuadraticForm R₂ M
n : Type u_6
Q : QuadraticForm R₂ M
hQ : PosDef Q
x : M
hQx : ↑Q x = 0
hx : ¬x = 0
⊢ 0 < 0
[PROOFSTEP]
have := hQ _ hx
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
R₂ : Type u
inst✝² : OrderedRing R₂
inst✝¹ : AddCommMonoid M
inst✝ : Module R₂ M
Q₂ : QuadraticForm R₂ M
n : Type u_6
Q : QuadraticForm R₂ M
hQ : PosDef Q
x : M
hQx : ↑Q x = 0
hx : ¬x = 0
this : 0 < ↑Q x
⊢ 0 < 0
[PROOFSTEP]
rw [hQx] at this
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
R₂ : Type u
inst✝² : OrderedRing R₂
inst✝¹ : AddCommMonoid M
inst✝ : Module R₂ M
Q₂ : QuadraticForm R₂ M
n : Type u_6
Q : QuadraticForm R₂ M
hQ : PosDef Q
x : M
hQx : ↑Q x = 0
hx : ¬x = 0
this : 0 < 0
⊢ 0 < 0
[PROOFSTEP]
exact this
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : DecidableEq n
inst✝³ : CommRing R₁
inst✝² : AddCommMonoid M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
a : R₁
Q : QuadraticForm R₁ (n → R₁)
⊢ toMatrix' (a • Q) = a • toMatrix' Q
[PROOFSTEP]
simp only [toMatrix', LinearEquiv.map_smul, LinearMap.map_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : DecidableEq n
inst✝³ : CommRing R₁
inst✝² : AddCommMonoid M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ (n → R₁)
⊢ Matrix.IsSymm (toMatrix' Q)
[PROOFSTEP]
ext i j
[GOAL]
case a.h
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : DecidableEq n
inst✝³ : CommRing R₁
inst✝² : AddCommMonoid M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ (n → R₁)
i j : n
⊢ Matrix.transpose (toMatrix' Q) i j = toMatrix' Q i j
[PROOFSTEP]
rw [toMatrix', Matrix.transpose_apply, BilinForm.toMatrix'_apply, BilinForm.toMatrix'_apply, associated_isSymm]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R₁
inst✝³ : DecidableEq n
inst✝² : Invertible 2
m : Type w
inst✝¹ : DecidableEq m
inst✝ : Fintype m
Q : QuadraticForm R₁ (m → R₁)
f : (n → R₁) →ₗ[R₁] m → R₁
⊢ toMatrix' (comp Q f) = (↑LinearMap.toMatrix' f)ᵀ * toMatrix' Q * ↑LinearMap.toMatrix' f
[PROOFSTEP]
ext
[GOAL]
case a.h
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R₁
inst✝³ : DecidableEq n
inst✝² : Invertible 2
m : Type w
inst✝¹ : DecidableEq m
inst✝ : Fintype m
Q : QuadraticForm R₁ (m → R₁)
f : (n → R₁) →ₗ[R₁] m → R₁
i✝ x✝ : n
⊢ toMatrix' (comp Q f) i✝ x✝ = ((↑LinearMap.toMatrix' f)ᵀ * toMatrix' Q * ↑LinearMap.toMatrix' f) i✝ x✝
[PROOFSTEP]
simp only [QuadraticForm.associated_comp, BilinForm.toMatrix'_comp, toMatrix']
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R₁
inst✝³ : DecidableEq n
inst✝² : Invertible 2
m : Type w
inst✝¹ : DecidableEq m
inst✝ : Fintype m
Q : QuadraticForm R₁ (n → R₁)
a : R₁
⊢ discr (a • Q) = a ^ Fintype.card n * discr Q
[PROOFSTEP]
simp only [discr, toMatrix'_smul, Matrix.det_smul]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
n : Type w
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R₁
inst✝³ : DecidableEq n
inst✝² : Invertible 2
m : Type w
inst✝¹ : DecidableEq m
inst✝ : Fintype m
Q : QuadraticForm R₁ (n → R₁)
f : (n → R₁) →ₗ[R₁] n → R₁
⊢ discr (comp Q f) = det (↑LinearMap.toMatrix' f) * det (↑LinearMap.toMatrix' f) * discr Q
[PROOFSTEP]
simp only [Matrix.det_transpose, mul_left_comm, QuadraticForm.toMatrix'_comp, mul_comm, Matrix.det_mul, discr]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
htwo : Invertible 2
B : BilinForm R M
hB₁ : B ≠ 0
hB₂ : IsSymm B
⊢ ∃ x, ¬IsOrtho B x x
[PROOFSTEP]
lift B to QuadraticForm R M using hB₂ with Q
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
htwo : Invertible 2
B : BilinForm R M
Q : QuadraticForm R M
hB₁✝ hB₁ : ↑(QuadraticForm.associatedHom ℕ) Q ≠ 0
⊢ ∃ x, ¬IsOrtho (↑(QuadraticForm.associatedHom ℕ) Q) x x
[PROOFSTEP]
obtain ⟨x, hx⟩ := QuadraticForm.exists_quadraticForm_ne_zero hB₁
[GOAL]
case intro.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
htwo : Invertible 2
B : BilinForm R M
Q : QuadraticForm R M
hB₁✝ hB₁ : ↑(QuadraticForm.associatedHom ℕ) Q ≠ 0
x : M
hx : ↑Q x ≠ 0
⊢ ∃ x, ¬IsOrtho (↑(QuadraticForm.associatedHom ℕ) Q) x x
[PROOFSTEP]
exact ⟨x, fun h => hx (Q.associated_eq_self_apply ℕ x ▸ h)⟩
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
V : Type u
K : Type v
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
hK : Invertible 2
B : BilinForm K V
hB₂ : IsSymm B
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
induction' hd : finrank K V with d ih generalizing V
[GOAL]
case zero
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
hd : finrank K V = Nat.zero
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
simp_rw [Nat.zero_eq]
[GOAL]
case zero
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
hd : finrank K V = Nat.zero
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
exact ⟨basisOfFinrankZero hd, fun _ _ _ => zero_left _⟩
[GOAL]
case succ
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
hd : finrank K V = Nat.succ d
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
haveI :=
  finrank_pos_iff.1
    (hd.symm ▸ Nat.succ_pos d : 0 < finrank K V)
      -- either the bilinear form is trivial or we can pick a non-null `x`
[GOAL]
case succ
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
hd : finrank K V = Nat.succ d
this : Nontrivial V
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
obtain rfl | hB₁ := eq_or_ne B 0
[GOAL]
case succ.inl
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B : BilinForm K V✝
hB₂✝ : IsSymm B
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
hd : finrank K V = Nat.succ d
this : Nontrivial V
hB₂ : IsSymm 0
⊢ ∃ v, iIsOrtho 0 ↑v
[PROOFSTEP]
let b := FiniteDimensional.finBasis K V
[GOAL]
case succ.inl
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B : BilinForm K V✝
hB₂✝ : IsSymm B
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
hd : finrank K V = Nat.succ d
this : Nontrivial V
hB₂ : IsSymm 0
b : Basis (Fin (finrank K V)) K V := finBasis K V
⊢ ∃ v, iIsOrtho 0 ↑v
[PROOFSTEP]
rw [hd] at b
[GOAL]
case succ.inl
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B : BilinForm K V✝
hB₂✝ : IsSymm B
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
hd : finrank K V = Nat.succ d
this : Nontrivial V
hB₂ : IsSymm 0
b : Basis (Fin (Nat.succ d)) K V
⊢ ∃ v, iIsOrtho 0 ↑v
[PROOFSTEP]
refine' ⟨b, fun i j _ => rfl⟩
[GOAL]
case succ.inr
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
hd : finrank K V = Nat.succ d
this : Nontrivial V
hB₁ : B ≠ 0
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
obtain ⟨x, hx⟩ := exists_bilinForm_self_ne_zero hB₁ hB₂
[GOAL]
case succ.inr.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
hd : finrank K V = Nat.succ d
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hx : ¬IsOrtho B x x
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
rw [← Submodule.finrank_add_eq_of_isCompl (isCompl_span_singleton_orthogonal hx).symm,
  finrank_span_singleton (ne_zero_of_not_isOrtho_self x hx)] at hd
[GOAL]
case succ.inr.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
let B' := B.restrict (B.orthogonal <| K ∙ x)
[GOAL]
case succ.inr.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
obtain ⟨v', hv₁⟩ :=
  ih (B.restrictSymm hB₂ _ : B'.IsSymm)
    (Nat.succ.inj hd)
      -- concatenate `x` with the basis obtained by induction
[GOAL]
case succ.inr.intro.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
let b :=
  Basis.mkFinCons x v'
    (by
      rintro c y hy hc
      rw [add_eq_zero_iff_neg_eq] at hc
      rw [← hc, Submodule.neg_mem_iff] at hy
      have := (isCompl_span_singleton_orthogonal hx).disjoint
      rw [Submodule.disjoint_def] at this
      have := this (c • x) (Submodule.smul_mem _ _ <| Submodule.mem_span_singleton_self _) hy
      exact (smul_eq_zero.1 this).resolve_right fun h => hx <| h.symm ▸ zero_left _)
    (by
      intro y
      refine' ⟨-B x y / B x x, fun z hz => _⟩
      obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hz
      rw [IsOrtho, smul_left, add_right, smul_right, div_mul_cancel _ hx, add_neg_self, mul_zero])
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
⊢ ∀ (c : K) (x_1 : V), x_1 ∈ orthogonal B (Submodule.span K {x}) → c • x + x_1 = 0 → c = 0
[PROOFSTEP]
rintro c y hy hc
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
c : K
y : V
hy : y ∈ orthogonal B (Submodule.span K {x})
hc : c • x + y = 0
⊢ c = 0
[PROOFSTEP]
rw [add_eq_zero_iff_neg_eq] at hc
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
c : K
y : V
hy : y ∈ orthogonal B (Submodule.span K {x})
hc : -(c • x) = y
⊢ c = 0
[PROOFSTEP]
rw [← hc, Submodule.neg_mem_iff] at hy
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
c : K
y : V
hy : c • x ∈ orthogonal B (Submodule.span K {x})
hc : -(c • x) = y
⊢ c = 0
[PROOFSTEP]
have := (isCompl_span_singleton_orthogonal hx).disjoint
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this✝ : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
c : K
y : V
hy : c • x ∈ orthogonal B (Submodule.span K {x})
hc : -(c • x) = y
this : Disjoint (Submodule.span K {x}) (orthogonal B (Submodule.span K {x}))
⊢ c = 0
[PROOFSTEP]
rw [Submodule.disjoint_def] at this
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this✝ : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
c : K
y : V
hy : c • x ∈ orthogonal B (Submodule.span K {x})
hc : -(c • x) = y
this : ∀ (x_1 : V), x_1 ∈ Submodule.span K {x} → x_1 ∈ orthogonal B (Submodule.span K {x}) → x_1 = 0
⊢ c = 0
[PROOFSTEP]
have := this (c • x) (Submodule.smul_mem _ _ <| Submodule.mem_span_singleton_self _) hy
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this✝¹ : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
c : K
y : V
hy : c • x ∈ orthogonal B (Submodule.span K {x})
hc : -(c • x) = y
this✝ : ∀ (x_1 : V), x_1 ∈ Submodule.span K {x} → x_1 ∈ orthogonal B (Submodule.span K {x}) → x_1 = 0
this : c • x = 0
⊢ c = 0
[PROOFSTEP]
exact (smul_eq_zero.1 this).resolve_right fun h => hx <| h.symm ▸ zero_left _
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
⊢ ∀ (z : V), ∃ c, z + c • x ∈ orthogonal B (Submodule.span K {x})
[PROOFSTEP]
intro y
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
y : V
⊢ ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x})
[PROOFSTEP]
refine' ⟨-B x y / B x x, fun z hz => _⟩
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
y z : V
hz : z ∈ Submodule.span K {x}
⊢ IsOrtho B z (y + (-bilin B x y / bilin B x x) • x)
[PROOFSTEP]
obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hz
[GOAL]
case intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
y : V
c : K
hz : c • x ∈ Submodule.span K {x}
⊢ IsOrtho B (c • x) (y + (-bilin B x y / bilin B x x) • x)
[PROOFSTEP]
rw [IsOrtho, smul_left, add_right, smul_right, div_mul_cancel _ hx, add_neg_self, mul_zero]
[GOAL]
case succ.inr.intro.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
⊢ ∃ v, iIsOrtho B ↑v
[PROOFSTEP]
refine' ⟨b, _⟩
[GOAL]
case succ.inr.intro.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
⊢ iIsOrtho B ↑b
[PROOFSTEP]
rw [Basis.coe_mkFinCons]
[GOAL]
case succ.inr.intro.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
⊢ iIsOrtho B (Fin.cons x (Subtype.val ∘ ↑v'))
[PROOFSTEP]
intro j i
[GOAL]
case succ.inr.intro.intro
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i : Fin (Nat.succ d)
⊢ j ≠ i → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) j i
[PROOFSTEP]
refine' Fin.cases _ (fun i => _) i
[GOAL]
case succ.inr.intro.intro.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i : Fin (Nat.succ d)
⊢ j ≠ 0 → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) j 0
[PROOFSTEP]
refine' Fin.cases _ (fun j => _) j
[GOAL]
case succ.inr.intro.intro.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i✝ : Fin (Nat.succ d)
i : Fin d
⊢ j ≠ Fin.succ i → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) j (Fin.succ i)
[PROOFSTEP]
refine' Fin.cases _ (fun j => _) j
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i : Fin (Nat.succ d)
⊢ 0 ≠ 0 → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) 0 0
[PROOFSTEP]
intro hij
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i : Fin (Nat.succ d)
j : Fin d
⊢ Fin.succ j ≠ 0 → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) (Fin.succ j) 0
[PROOFSTEP]
intro hij
[GOAL]
case succ.inr.intro.intro.refine'_2.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i✝ : Fin (Nat.succ d)
i : Fin d
⊢ 0 ≠ Fin.succ i → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) 0 (Fin.succ i)
[PROOFSTEP]
intro hij
[GOAL]
case succ.inr.intro.intro.refine'_2.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i✝ : Fin (Nat.succ d)
i j : Fin d
⊢ Fin.succ j ≠ Fin.succ i → (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) (Fin.succ j) (Fin.succ i)
[PROOFSTEP]
intro hij
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i : Fin (Nat.succ d)
hij : 0 ≠ 0
⊢ (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) 0 0
[PROOFSTEP]
simp only [Function.onFun, Fin.cons_zero, Fin.cons_succ, Function.comp_apply]
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i : Fin (Nat.succ d)
j : Fin d
hij : Fin.succ j ≠ 0
⊢ (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) (Fin.succ j) 0
[PROOFSTEP]
simp only [Function.onFun, Fin.cons_zero, Fin.cons_succ, Function.comp_apply]
[GOAL]
case succ.inr.intro.intro.refine'_2.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i✝ : Fin (Nat.succ d)
i : Fin d
hij : 0 ≠ Fin.succ i
⊢ (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) 0 (Fin.succ i)
[PROOFSTEP]
simp only [Function.onFun, Fin.cons_zero, Fin.cons_succ, Function.comp_apply]
[GOAL]
case succ.inr.intro.intro.refine'_2.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i✝ : Fin (Nat.succ d)
i j : Fin d
hij : Fin.succ j ≠ Fin.succ i
⊢ (IsOrtho B on Fin.cons x (Subtype.val ∘ ↑v')) (Fin.succ j) (Fin.succ i)
[PROOFSTEP]
simp only [Function.onFun, Fin.cons_zero, Fin.cons_succ, Function.comp_apply]
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i : Fin (Nat.succ d)
hij : 0 ≠ 0
⊢ IsOrtho B x x
[PROOFSTEP]
exact (hij rfl).elim
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i : Fin (Nat.succ d)
j : Fin d
hij : Fin.succ j ≠ 0
⊢ IsOrtho B (↑(↑v' j)) x
[PROOFSTEP]
rw [IsOrtho, hB₂]
[GOAL]
case succ.inr.intro.intro.refine'_1.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i : Fin (Nat.succ d)
j : Fin d
hij : Fin.succ j ≠ 0
⊢ bilin B x ↑(↑v' j) = 0
[PROOFSTEP]
exact (v' j).prop _ (Submodule.mem_span_singleton_self x)
[GOAL]
case succ.inr.intro.intro.refine'_2.refine'_1
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j i✝ : Fin (Nat.succ d)
i : Fin d
hij : 0 ≠ Fin.succ i
⊢ IsOrtho B x ↑(↑v' i)
[PROOFSTEP]
exact (v' i).prop _ (Submodule.mem_span_singleton_self x)
[GOAL]
case succ.inr.intro.intro.refine'_2.refine'_2
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
inst✝⁹ : Ring R
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R M
V✝ : Type u
K : Type v
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V✝
inst✝⁴ : Module K V✝
inst✝³ : FiniteDimensional K V✝
hK : Invertible 2
B✝ : BilinForm K V✝
hB₂✝ : IsSymm B✝
x✝ : ℕ
hd✝ : finrank K V✝ = x✝
d : ℕ
ih :
  ∀ {V : Type u} [inst : AddCommGroup V] [inst_1 : Module K V] [inst_2 : FiniteDimensional K V] {B : BilinForm K V},
    IsSymm B → finrank K V = d → ∃ v, iIsOrtho B ↑v
V : Type u
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB₂ : IsSymm B
this : Nontrivial V
hB₁ : B ≠ 0
x : V
hd : finrank K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } + 1 = Nat.succ d
hx : ¬IsOrtho B x x
B' : BilinForm K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) } :=
  restrict B (orthogonal B (Submodule.span K {x}))
v' : Basis (Fin d) K { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hv₁ : iIsOrtho (restrict B (orthogonal B (Submodule.span K {x}))) ↑v'
b : Basis (Fin (d + 1)) K V :=
  Basis.mkFinCons x v' (_ : ∀ (c : K) (y : V), y ∈ orthogonal B (Submodule.span K {x}) → c • x + y = 0 → c = 0)
    (_ : ∀ (y : V), ∃ c, y + c • x ∈ orthogonal B (Submodule.span K {x}))
j✝ i✝ : Fin (Nat.succ d)
i j : Fin d
hij : Fin.succ j ≠ Fin.succ i
⊢ IsOrtho B ↑(↑v' j) ↑(↑v' i)
[PROOFSTEP]
exact hv₁ (ne_of_apply_ne _ hij)
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
M₁ : Type u_6
inst✝⁶ : Semiring R
inst✝⁵ : CommSemiring R₁
inst✝⁴ : AddCommMonoid M
inst✝³ : AddCommMonoid M₁
inst✝² : Module R M
inst✝¹ : Module R M₁
ι : Type u_7
inst✝ : Fintype ι
v : Basis ι R M
Q : QuadraticForm R M
w : ι → R
⊢ ↑(basisRepr Q v) w = ↑Q (∑ i : ι, w i • ↑v i)
[PROOFSTEP]
rw [← v.equivFun_symm_apply]
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁ : Type u_4
M : Type u_5
M₁ : Type u_6
inst✝⁶ : Semiring R
inst✝⁵ : CommSemiring R₁
inst✝⁴ : AddCommMonoid M
inst✝³ : AddCommMonoid M₁
inst✝² : Module R M
inst✝¹ : Module R M₁
ι : Type u_7
inst✝ : Fintype ι
v : Basis ι R M
Q : QuadraticForm R M
w : ι → R
⊢ ↑(basisRepr Q v) w = ↑Q (↑(LinearEquiv.symm (Basis.equivFun v)) fun i => w i)
[PROOFSTEP]
rfl
[GOAL]
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
⊢ basisRepr Q v = weightedSumSquares R₁ fun i => ↑Q (↑v i)
[PROOFSTEP]
ext w
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
⊢ ↑(basisRepr Q v) w = ↑(weightedSumSquares R₁ fun i => ↑Q (↑v i)) w
[PROOFSTEP]
rw [basisRepr_apply, ← @associated_eq_self_apply R₁, sum_left, weightedSumSquares_apply]
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
⊢ ∑ i : ι, bilin (↑(associatedHom R₁) Q) (w i • ↑v i) (∑ i : ι, w i • ↑v i) = ∑ i : ι, ↑Q (↑v i) • (w i * w i)
[PROOFSTEP]
refine' sum_congr rfl fun j hj => _
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
j : ι
hj : j ∈ univ
⊢ bilin (↑(associatedHom R₁) Q) (w j • ↑v j) (∑ i : ι, w i • ↑v i) = ↑Q (↑v j) • (w j * w j)
[PROOFSTEP]
rw [← @associated_eq_self_apply R₁, sum_right, sum_eq_single_of_mem j hj]
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
j : ι
hj : j ∈ univ
⊢ bilin (↑(associatedHom R₁) Q) (w j • ↑v j) (w j • ↑v j) = bilin (↑(associatedHom R₁) Q) (↑v j) (↑v j) • (w j * w j)
[PROOFSTEP]
rw [smul_left, smul_right, smul_eq_mul]
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
j : ι
hj : j ∈ univ
⊢ w j * (w j * bilin (↑(associatedHom R₁) Q) (↑v j) (↑v j)) = bilin (↑(associatedHom R₁) Q) (↑v j) (↑v j) * (w j * w j)
[PROOFSTEP]
ring
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
j : ι
hj : j ∈ univ
⊢ ∀ (b : ι), b ∈ univ → b ≠ j → bilin (↑(associatedHom R₁) Q) (w j • ↑v j) (w b • ↑v b) = 0
[PROOFSTEP]
intro i _ hij
[GOAL]
case H
S : Type u_1
T : Type u_2
R : Type u_3
R₁✝ : Type u_4
M✝ : Type u_5
M₁ : Type u_6
inst✝¹⁰ : Semiring R
inst✝⁹ : CommSemiring R₁✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : AddCommMonoid M₁
inst✝⁶ : Module R M✝
inst✝⁵ : Module R M₁
ι : Type u_7
inst✝⁴ : Fintype ι
v✝ : Basis ι R M✝
R₁ : Type u_8
M : Type u_9
inst✝³ : CommRing R₁
inst✝² : AddCommGroup M
inst✝¹ : Module R₁ M
inst✝ : Invertible 2
Q : QuadraticForm R₁ M
v : Basis ι R₁ M
hv₂ : iIsOrtho (↑associated Q) ↑v
w : ι → R₁
j : ι
hj : j ∈ univ
i : ι
a✝ : i ∈ univ
hij : i ≠ j
⊢ bilin (↑(associatedHom R₁) Q) (w j • ↑v j) (w i • ↑v i) = 0
[PROOFSTEP]
rw [smul_left, smul_right, show associatedHom R₁ Q (v j) (v i) = 0 from hv₂ hij.symm, mul_zero, mul_zero]