Theorem: BilinForm.restrictOrthogonalSpanSingletonNondegenerate
File: Mathlib/LinearAlgebra/BilinearForm.lean

tactic: refine' fun m hm => Submodule.coe_eq_zero.1 (b₁ m.1 fun n => _)
state_before: R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
⊢ Nondegenerate (restrict B (orthogonal B (Submodule.span K {x})))

tactic: have : n ∈ (K ∙ x) ⊔ B.orthogonal (K ∙ x) :=
  (span_singleton_sup_orthogonal_eq_top hx).symm ▸ Submodule.mem_top
state_before: R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hm :
  ∀ (n : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }),
    bilin (restrict B (orthogonal B (Submodule.span K {x}))) m n = 0
n : V
⊢ bilin B (↑m) n = 0

tactic: rcases Submodule.mem_sup.1 this with ⟨y, hy, z, hz, rfl⟩
state_before: R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hm :
  ∀ (n : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }),
    bilin (restrict B (orthogonal B (Submodule.span K {x}))) m n = 0
n : V
this : n ∈ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x})
⊢ bilin B (↑m) n = 0

tactic: specialize hm ⟨z, hz⟩
state_before: case intro.intro.intro.intro
R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
hm :
  ∀ (n : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }),
    bilin (restrict B (orthogonal B (Submodule.span K {x}))) m n = 0
y : V
hy : y ∈ Submodule.span K {x}
z : V
hz : z ∈ orthogonal B (Submodule.span K {x})
this : y + z ∈ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x})
⊢ bilin B (↑m) (y + z) = 0

tactic: rw [restrict] at hm
state_before: case intro.intro.intro.intro
R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
y : V
hy : y ∈ Submodule.span K {x}
z : V
hz : z ∈ orthogonal B (Submodule.span K {x})
this : y + z ∈ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x})
hm : bilin (restrict B (orthogonal B (Submodule.span K {x}))) m { val := z, property := hz } = 0
⊢ bilin B (↑m) (y + z) = 0

tactic: erw [add_right, show B m.1 y = 0 by rw [b₂]; exact m.2 y hy, hm, add_zero]
state_before: case intro.intro.intro.intro
R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
y : V
hy : y ∈ Submodule.span K {x}
z : V
hz : z ∈ orthogonal B (Submodule.span K {x})
this : y + z ∈ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x})
hm :
  bilin
      { bilin := fun a b => bilin B ↑a ↑b,
        bilin_add_left :=
          (_ :
            ∀ (x_1 x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_1 + ↑x_2) ↑x_3 = bilin B ↑x_1 ↑x_3 + bilin B ↑x_2 ↑x_3),
        bilin_smul_left :=
          (_ :
            ∀ (x_1 : K) (x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (x_1 • ↑x_2) ↑x_3 = x_1 * bilin B ↑x_2 ↑x_3),
        bilin_add_right :=
          (_ :
            ∀ (x_1 x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_1) (↑x_2 + ↑x_3) = bilin B ↑x_1 ↑x_2 + bilin B ↑x_1 ↑x_3),
        bilin_smul_right :=
          (_ :
            ∀ (x_1 : K) (x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_2) (x_1 • ↑x_3) = x_1 * bilin B ↑x_2 ↑x_3) }
      m { val := z, property := hz } =
    0
⊢ bilin B (↑m) (y + z) = 0

tactic: rw [b₂]
state_before: R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
y : V
hy : y ∈ Submodule.span K {x}
z : V
hz : z ∈ orthogonal B (Submodule.span K {x})
this : y + z ∈ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x})
hm :
  bilin
      { bilin := fun a b => bilin B ↑a ↑b,
        bilin_add_left :=
          (_ :
            ∀ (x_1 x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_1 + ↑x_2) ↑x_3 = bilin B ↑x_1 ↑x_3 + bilin B ↑x_2 ↑x_3),
        bilin_smul_left :=
          (_ :
            ∀ (x_1 : K) (x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (x_1 • ↑x_2) ↑x_3 = x_1 * bilin B ↑x_2 ↑x_3),
        bilin_add_right :=
          (_ :
            ∀ (x_1 x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_1) (↑x_2 + ↑x_3) = bilin B ↑x_1 ↑x_2 + bilin B ↑x_1 ↑x_3),
        bilin_smul_right :=
          (_ :
            ∀ (x_1 : K) (x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_2) (x_1 • ↑x_3) = x_1 * bilin B ↑x_2 ↑x_3) }
      m { val := z, property := hz } =
    0
⊢ bilin B (↑m) y = 0

tactic: exact m.2 y hy
state_before: case a
R : Type ?u.1785101
M : Type ?u.1785104
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1785140
M₁ : Type ?u.1785143
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1785752
M₂ : Type ?u.1785755
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1785942
M₃ : Type ?u.1785945
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_2
K : Type u_1
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type ?u.1787750
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
b₁ : Nondegenerate B
b₂ : IsRefl B
x : V
hx : ¬IsOrtho B x x
m : { x_1 // x_1 ∈ orthogonal B (Submodule.span K {x}) }
y : V
hy : y ∈ Submodule.span K {x}
z : V
hz : z ∈ orthogonal B (Submodule.span K {x})
this : y + z ∈ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x})
hm :
  bilin
      { bilin := fun a b => bilin B ↑a ↑b,
        bilin_add_left :=
          (_ :
            ∀ (x_1 x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_1 + ↑x_2) ↑x_3 = bilin B ↑x_1 ↑x_3 + bilin B ↑x_2 ↑x_3),
        bilin_smul_left :=
          (_ :
            ∀ (x_1 : K) (x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (x_1 • ↑x_2) ↑x_3 = x_1 * bilin B ↑x_2 ↑x_3),
        bilin_add_right :=
          (_ :
            ∀ (x_1 x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_1) (↑x_2 + ↑x_3) = bilin B ↑x_1 ↑x_2 + bilin B ↑x_1 ↑x_3),
        bilin_smul_right :=
          (_ :
            ∀ (x_1 : K) (x_2 x_3 : { x_3 // x_3 ∈ orthogonal B (Submodule.span K {x}) }),
              bilin B (↑x_2) (x_1 • ↑x_3) = x_1 * bilin B ↑x_2 ↑x_3) }
      m { val := z, property := hz } =
    0
⊢ bilin B y ↑m = 0