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

tactic: have : W ⊓ B.orthogonal W = ⊥ := by
  rw [eq_bot_iff]
  intro x hx
  obtain ⟨hx₁, hx₂⟩ := Submodule.mem_inf.1 hx
  refine' Subtype.mk_eq_mk.1 (b₂ ⟨x, hx₁⟩ _)
  rintro ⟨n, hn⟩
  rw [restrict_apply, Submodule.coe_mk, Submodule.coe_mk, b₁]
  exact hx₂ n hn
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
⊢ IsCompl W (orthogonal B W)

tactic: refine' IsCompl.of_eq this (eq_top_of_finrank_eq <| (Submodule.finrank_le _).antisymm _)
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
this : W ⊓ orthogonal B W = ⊥
⊢ IsCompl W (orthogonal B W)

tactic: conv_rhs => rw [← add_zero (finrank K _)]
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
this : W ⊓ orthogonal B W = ⊥
⊢ finrank K V ≤ finrank K { x // x ∈ W ⊔ orthogonal B W }

tactic: rw [← finrank_bot K V, ← this, Submodule.finrank_sup_add_finrank_inf_eq,
  finrank_add_finrank_orthogonal b₁]
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
this : W ⊓ orthogonal B W = ⊥
⊢ finrank K V ≤ finrank K { x // x ∈ W ⊔ orthogonal B W } + 0

tactic: exact le_self_add
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
this : W ⊓ orthogonal B W = ⊥
⊢ finrank K V ≤ finrank K V + finrank K { x // x ∈ W ⊓ orthogonal B ⊤ }

tactic: rw [eq_bot_iff]
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
⊢ W ⊓ orthogonal B W = ⊥

tactic: intro x hx
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
⊢ W ⊓ orthogonal B W ≤ ⊥

tactic: obtain ⟨hx₁, hx₂⟩ := Submodule.mem_inf.1 hx
state_before: R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
x : V
hx : x ∈ W ⊓ orthogonal B W
⊢ x ∈ ⊥

tactic: refine' Subtype.mk_eq_mk.1 (b₂ ⟨x, hx₁⟩ _)
state_before: case intro
R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
x : V
hx : x ∈ W ⊓ orthogonal B W
hx₁ : x ∈ W
hx₂ : x ∈ orthogonal B W
⊢ x ∈ ⊥

tactic: rintro ⟨n, hn⟩
state_before: case intro
R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
x : V
hx : x ∈ W ⊓ orthogonal B W
hx₁ : x ∈ W
hx₂ : x ∈ orthogonal B W
⊢ ∀ (n : { x // x ∈ W }), bilin (restrict B W) { val := x, property := hx₁ } n = 0

tactic: rw [restrict_apply, Submodule.coe_mk, Submodule.coe_mk, b₁]
state_before: case intro.mk
R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
x : V
hx : x ∈ W ⊓ orthogonal B W
hx₁ : x ∈ W
hx₂ : x ∈ orthogonal B W
n : V
hn : n ∈ W
⊢ bilin (restrict B W) { val := x, property := hx₁ } { val := n, property := hn } = 0

tactic: exact hx₂ n hn
state_before: case intro.mk.a
R : Type ?u.1671762
M : Type ?u.1671765
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type ?u.1671801
M₁ : Type ?u.1671804
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type ?u.1672413
M₂ : Type ?u.1672416
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type ?u.1672603
M₃ : Type ?u.1672606
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.1674411
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
W : Subspace K V
b₁ : IsRefl B
b₂ : Nondegenerate (restrict B W)
x : V
hx : x ∈ W ⊓ orthogonal B W
hx₁ : x ∈ W
hx₂ : x ∈ orthogonal B W
n : V
hn : n ∈ W
⊢ bilin B n x = 0