l3lab/ntp-mathlib huggingface dataset:
theorem orthogonal_span_singleton_eq_toLin_ker {B : BilinForm K V} (x : V) :
    B.orthogonal (K ∙ x) = LinearMap.ker (BilinForm.toLin B x) := by
  ext y
  

Proof state:
case h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x y : V
⊢ y ∈ orthogonal B (Submodule.span K {x}) ↔ y ∈ LinearMap.ker ((toLin B) x)

Next tactic:
simp_rw [mem_orthogonal_iff, LinearMap.mem_ker, Submodule.mem_span_singleton]
theorem orthogonal_span_singleton_eq_toLin_ker {B : BilinForm K V} (x : V) :
    B.orthogonal (K ∙ x) = LinearMap.ker (BilinForm.toLin B x) := by
  ext y
  simp_rw [mem_orthogonal_iff, LinearMap.mem_ker, Submodule.mem_span_singleton]
  

Proof state:
case h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x y : V
⊢ (∀ (n : V), (∃ a, a • x = n) → IsOrtho B n y) ↔ ((toLin B) x) y = 0

Next tactic:
constructor
theorem orthogonal_span_singleton_eq_toLin_ker {B : BilinForm K V} (x : V) :
    B.orthogonal (K ∙ x) = LinearMap.ker (BilinForm.toLin B x) := by
  ext y
  simp_rw [mem_orthogonal_iff, LinearMap.mem_ker, Submodule.mem_span_singleton]
  constructor
  · 

Proof state:
case h.mp
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x y : V
⊢ (∀ (n : V), (∃ a, a • x = n) → IsOrtho B n y) → ((toLin B) x) y = 0

Next tactic:
exact fun h => h x ⟨1, one_smul _ _⟩
theorem orthogonal_span_singleton_eq_toLin_ker {B : BilinForm K V} (x : V) :
    B.orthogonal (K ∙ x) = LinearMap.ker (BilinForm.toLin B x) := by
  ext y
  simp_rw [mem_orthogonal_iff, LinearMap.mem_ker, Submodule.mem_span_singleton]
  constructor
  · exact fun h => h x ⟨1, one_smul _ _⟩
  · 

Proof state:
case h.mpr
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x y : V
⊢ ((toLin B) x) y = 0 → ∀ (n : V), (∃ a, a • x = n) → IsOrtho B n y

Next tactic:
rintro h _ ⟨z, rfl⟩
theorem orthogonal_span_singleton_eq_toLin_ker {B : BilinForm K V} (x : V) :
    B.orthogonal (K ∙ x) = LinearMap.ker (BilinForm.toLin B x) := by
  ext y
  simp_rw [mem_orthogonal_iff, LinearMap.mem_ker, Submodule.mem_span_singleton]
  constructor
  · exact fun h => h x ⟨1, one_smul _ _⟩
  · rintro h _ ⟨z, rfl⟩
    

Proof state:
case h.mpr.intro
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x y : V
h : ((toLin B) x) y = 0
z : K
⊢ IsOrtho B (z • x) y

Next tactic:
rw [IsOrtho, smul_left, mul_eq_zero]
theorem orthogonal_span_singleton_eq_toLin_ker {B : BilinForm K V} (x : V) :
    B.orthogonal (K ∙ x) = LinearMap.ker (BilinForm.toLin B x) := by
  ext y
  simp_rw [mem_orthogonal_iff, LinearMap.mem_ker, Submodule.mem_span_singleton]
  constructor
  · exact fun h => h x ⟨1, one_smul _ _⟩
  · rintro h _ ⟨z, rfl⟩
    rw [IsOrtho, smul_left, mul_eq_zero]
    

Proof state:
case h.mpr.intro
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x y : V
h : ((toLin B) x) y = 0
z : K
⊢ z = 0 ∨ bilin B x y = 0

Next tactic:
exact Or.intro_right _ h
theorem span_singleton_sup_orthogonal_eq_top {B : BilinForm K V} {x : V} (hx : ¬B.IsOrtho x x) :
    (K ∙ x) ⊔ B.orthogonal (K ∙ x) = ⊤ := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x : V
hx : ¬IsOrtho B x x
⊢ Submodule.span K {x} ⊔ orthogonal B (Submodule.span K {x}) = ⊤

Next tactic:
rw [orthogonal_span_singleton_eq_toLin_ker]
theorem span_singleton_sup_orthogonal_eq_top {B : BilinForm K V} {x : V} (hx : ¬B.IsOrtho x x) :
    (K ∙ x) ⊔ B.orthogonal (K ∙ x) = ⊤ := by
  rw [orthogonal_span_singleton_eq_toLin_ker]
  

Proof state:
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
M₂' : Type u_11
M₂'' : Type u_12
inst✝³ : AddCommMonoid M₂'
inst✝² : AddCommMonoid M₂''
inst✝¹ : Module R₂ M₂'
inst✝ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
N L : Submodule R M
B : BilinForm K V
x : V
hx : ¬IsOrtho B x x
⊢ Submodule.span K {x} ⊔ LinearMap.ker ((toLin B) x) = ⊤

Next tactic:
exact LinearMap.span_singleton_sup_ker_eq_top _ hx
/-- The restriction of a reflexive bilinear form `B` onto a submodule `W` is
nondegenerate if `Disjoint W (B.orthogonal W)`. -/
theorem nondegenerateRestrictOfDisjointOrthogonal (B : BilinForm R₁ M₁) (b : B.IsRefl)
    {W : Submodule R₁ M₁} (hW : Disjoint W (B.orthogonal W)) : (B.restrict W).Nondegenerate := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁵ : AddCommMonoid M₂'✝
inst✝⁴ : AddCommMonoid M₂''
inst✝³ : Module R₂ M₂'✝
inst✝² : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm R₁ M₁
b : IsRefl B
W : Submodule R₁ M₁
hW : Disjoint W (orthogonal B W)
⊢ Nondegenerate (restrict B W)

Next tactic:
rintro ⟨x, hx⟩ b₁
/-- The restriction of a reflexive bilinear form `B` onto a submodule `W` is
nondegenerate if `Disjoint W (B.orthogonal W)`. -/
theorem nondegenerateRestrictOfDisjointOrthogonal (B : BilinForm R₁ M₁) (b : B.IsRefl)
    {W : Submodule R₁ M₁} (hW : Disjoint W (B.orthogonal W)) : (B.restrict W).Nondegenerate := by
  rintro ⟨x, hx⟩ b₁
  

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁵ : AddCommMonoid M₂'✝
inst✝⁴ : AddCommMonoid M₂''
inst✝³ : Module R₂ M₂'✝
inst✝² : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm R₁ M₁
b : IsRefl B
W : Submodule R₁ M₁
hW : Disjoint W (orthogonal B W)
x : M₁
hx : x ∈ W
b₁ : ∀ (n : ↥W), bilin (restrict B W) { val := x, property := hx } n = 0
⊢ { val := x, property := hx } = 0

Next tactic:
rw [Submodule.mk_eq_zero, ← Submodule.mem_bot R₁]
/-- The restriction of a reflexive bilinear form `B` onto a submodule `W` is
nondegenerate if `Disjoint W (B.orthogonal W)`. -/
theorem nondegenerateRestrictOfDisjointOrthogonal (B : BilinForm R₁ M₁) (b : B.IsRefl)
    {W : Submodule R₁ M₁} (hW : Disjoint W (B.orthogonal W)) : (B.restrict W).Nondegenerate := by
  rintro ⟨x, hx⟩ b₁
  rw [Submodule.mk_eq_zero, ← Submodule.mem_bot R₁]
  

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁵ : AddCommMonoid M₂'✝
inst✝⁴ : AddCommMonoid M₂''
inst✝³ : Module R₂ M₂'✝
inst✝² : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm R₁ M₁
b : IsRefl B
W : Submodule R₁ M₁
hW : Disjoint W (orthogonal B W)
x : M₁
hx : x ∈ W
b₁ : ∀ (n : ↥W), bilin (restrict B W) { val := x, property := hx } n = 0
⊢ x ∈ ⊥

Next tactic:
refine' hW.le_bot ⟨hx, fun y hy => _⟩
/-- The restriction of a reflexive bilinear form `B` onto a submodule `W` is
nondegenerate if `Disjoint W (B.orthogonal W)`. -/
theorem nondegenerateRestrictOfDisjointOrthogonal (B : BilinForm R₁ M₁) (b : B.IsRefl)
    {W : Submodule R₁ M₁} (hW : Disjoint W (B.orthogonal W)) : (B.restrict W).Nondegenerate := by
  rintro ⟨x, hx⟩ b₁
  rw [Submodule.mk_eq_zero, ← Submodule.mem_bot R₁]
  refine' hW.le_bot ⟨hx, fun y hy => _⟩
  

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁵ : AddCommMonoid M₂'✝
inst✝⁴ : AddCommMonoid M₂''
inst✝³ : Module R₂ M₂'✝
inst✝² : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm R₁ M₁
b : IsRefl B
W : Submodule R₁ M₁
hW : Disjoint W (orthogonal B W)
x : M₁
hx : x ∈ W
b₁ : ∀ (n : ↥W), bilin (restrict B W) { val := x, property := hx } n = 0
y : M₁
hy : y ∈ W
⊢ IsOrtho B y x

Next tactic:
specialize b₁ ⟨y, hy⟩
/-- The restriction of a reflexive bilinear form `B` onto a submodule `W` is
nondegenerate if `Disjoint W (B.orthogonal W)`. -/
theorem nondegenerateRestrictOfDisjointOrthogonal (B : BilinForm R₁ M₁) (b : B.IsRefl)
    {W : Submodule R₁ M₁} (hW : Disjoint W (B.orthogonal W)) : (B.restrict W).Nondegenerate := by
  rintro ⟨x, hx⟩ b₁
  rw [Submodule.mk_eq_zero, ← Submodule.mem_bot R₁]
  refine' hW.le_bot ⟨hx, fun y hy => _⟩
  specialize b₁ ⟨y, hy⟩
  

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁵ : AddCommMonoid M₂'✝
inst✝⁴ : AddCommMonoid M₂''
inst✝³ : Module R₂ M₂'✝
inst✝² : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm R₁ M₁
b : IsRefl B
W : Submodule R₁ M₁
hW : Disjoint W (orthogonal B W)
x : M₁
hx : x ∈ W
y : M₁
hy : y ∈ W
b₁ : bilin (restrict B W) { val := x, property := hx } { val := y, property := hy } = 0
⊢ IsOrtho B y x

Next tactic:
rw [restrict_apply, Submodule.coe_mk, Submodule.coe_mk] at b₁
/-- The restriction of a reflexive bilinear form `B` onto a submodule `W` is
nondegenerate if `Disjoint W (B.orthogonal W)`. -/
theorem nondegenerateRestrictOfDisjointOrthogonal (B : BilinForm R₁ M₁) (b : B.IsRefl)
    {W : Submodule R₁ M₁} (hW : Disjoint W (B.orthogonal W)) : (B.restrict W).Nondegenerate := by
  rintro ⟨x, hx⟩ b₁
  rw [Submodule.mk_eq_zero, ← Submodule.mem_bot R₁]
  refine' hW.le_bot ⟨hx, fun y hy => _⟩
  specialize b₁ ⟨y, hy⟩
  rw [restrict_apply, Submodule.coe_mk, Submodule.coe_mk] at b₁
  

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁵ : AddCommMonoid M₂'✝
inst✝⁴ : AddCommMonoid M₂''
inst✝³ : Module R₂ M₂'✝
inst✝² : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm R₁ M₁
b : IsRefl B
W : Submodule R₁ M₁
hW : Disjoint W (orthogonal B W)
x : M₁
hx : x ∈ W
y : M₁
hy : y ∈ W
b₁ : bilin B x y = 0
⊢ IsOrtho B y x

Next tactic:
exact isOrtho_def.mpr (b x y b₁)
/-- An orthogonal basis with respect to a nondegenerate bilinear form has no self-orthogonal
elements. -/
theorem iIsOrtho.not_isOrtho_basis_self_of_nondegenerate {n : Type w} [Nontrivial R]
    {B : BilinForm R M} {v : Basis n R M} (h : B.iIsOrtho v) (hB : B.Nondegenerate) (i : n) :
    ¬B.IsOrtho (v i) (v i) := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
n : Type w
inst✝ : Nontrivial R
B : BilinForm R M
v : Basis n R M
h : iIsOrtho B ⇑v
hB : Nondegenerate B
i : n
⊢ ¬IsOrtho B (v i) (v i)

Next tactic:
intro ho
/-- An orthogonal basis with respect to a nondegenerate bilinear form has no self-orthogonal
elements. -/
theorem iIsOrtho.not_isOrtho_basis_self_of_nondegenerate {n : Type w} [Nontrivial R]
    {B : BilinForm R M} {v : Basis n R M} (h : B.iIsOrtho v) (hB : B.Nondegenerate) (i : n) :
    ¬B.IsOrtho (v i) (v i) := by
  intro ho
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
n : Type w
inst✝ : Nontrivial R
B : BilinForm R M
v : Basis n R M
h : iIsOrtho B ⇑v
hB : Nondegenerate B
i : n
ho : IsOrtho B (v i) (v i)
⊢ False

Next tactic:
refine' v.ne_zero i (hB (v i) fun m => _)
/-- An orthogonal basis with respect to a nondegenerate bilinear form has no self-orthogonal
elements. -/
theorem iIsOrtho.not_isOrtho_basis_self_of_nondegenerate {n : Type w} [Nontrivial R]
    {B : BilinForm R M} {v : Basis n R M} (h : B.iIsOrtho v) (hB : B.Nondegenerate) (i : n) :
    ¬B.IsOrtho (v i) (v i) := by
  intro ho
  refine' v.ne_zero i (hB (v i) fun m => _)
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
n : Type w
inst✝ : Nontrivial R
B : BilinForm R M
v : Basis n R M
h : iIsOrtho B ⇑v
hB : Nondegenerate B
i : n
ho : IsOrtho B (v i) (v i)
m : M
⊢ bilin B (v i) m = 0

Next tactic:
obtain ⟨vi, rfl⟩ := v.repr.symm.surjective m
/-- An orthogonal basis with respect to a nondegenerate bilinear form has no self-orthogonal
elements. -/
theorem iIsOrtho.not_isOrtho_basis_self_of_nondegenerate {n : Type w} [Nontrivial R]
    {B : BilinForm R M} {v : Basis n R M} (h : B.iIsOrtho v) (hB : B.Nondegenerate) (i : n) :
    ¬B.IsOrtho (v i) (v i) := by
  intro ho
  refine' v.ne_zero i (hB (v i) fun m => _)
  obtain ⟨vi, rfl⟩ := v.repr.symm.surjective m
  

Proof state:
case intro
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
n : Type w
inst✝ : Nontrivial R
B : BilinForm R M
v : Basis n R M
h : iIsOrtho B ⇑v
hB : Nondegenerate B
i : n
ho : IsOrtho B (v i) (v i)
vi : n →₀ R
⊢ bilin B (v i) ((LinearEquiv.symm v.repr) vi) = 0

Next tactic:
rw [Basis.repr_symm_apply, Finsupp.total_apply, Finsupp.sum, sum_right]
/-- An orthogonal basis with respect to a nondegenerate bilinear form has no self-orthogonal
elements. -/
theorem iIsOrtho.not_isOrtho_basis_self_of_nondegenerate {n : Type w} [Nontrivial R]
    {B : BilinForm R M} {v : Basis n R M} (h : B.iIsOrtho v) (hB : B.Nondegenerate) (i : n) :
    ¬B.IsOrtho (v i) (v i) := by
  intro ho
  refine' v.ne_zero i (hB (v i) fun m => _)
  obtain ⟨vi, rfl⟩ := v.repr.symm.surjective m
  rw [Basis.repr_symm_apply, Finsupp.total_apply, Finsupp.sum, sum_right]
  

Proof state:
case intro
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
n : Type w
inst✝ : Nontrivial R
B : BilinForm R M
v : Basis n R M
h : iIsOrtho B ⇑v
hB : Nondegenerate B
i : n
ho : IsOrtho B (v i) (v i)
vi : n →₀ R
⊢ ∑ i_1 in vi.support, bilin B (v i) (vi i_1 • v i_1) = 0

Next tactic:
apply Finset.sum_eq_zero