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

tactic: ext x
state_before: R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
⊢ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (↑toLin B) W)) = orthogonal B W

tactic: constructor <;> rw [mem_orthogonal_iff] <;> intro hx
state_before: case h
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
⊢ x ∈ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (↑toLin B) W)) ↔ x ∈ orthogonal B W

tactic: intro y hy
state_before: case h.mp
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : x ∈ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (↑toLin B) W))
⊢ ∀ (n : V), n ∈ W → IsOrtho B n x

tactic: rw [Submodule.mem_dualCoannihilator] at hx
state_before: case h.mp
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : x ∈ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (↑toLin B) W))
y : V
hy : y ∈ W
⊢ IsOrtho B y x

tactic: refine' hx (B.toLin.domRestrict W ⟨y, hy⟩) ⟨⟨y, hy⟩, rfl⟩
state_before: case h.mp
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : ∀ (φ : Module.Dual K V), φ ∈ LinearMap.range (LinearMap.domRestrict (↑toLin B) W) → ↑φ x = 0
y : V
hy : y ∈ W
⊢ IsOrtho B y x

tactic: rw [Submodule.mem_dualCoannihilator]
state_before: case h.mpr
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : ∀ (n : V), n ∈ W → IsOrtho B n x
⊢ x ∈ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (↑toLin B) W))

tactic: rintro _ ⟨⟨w, hw⟩, rfl⟩
state_before: case h.mpr
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : ∀ (n : V), n ∈ W → IsOrtho B n x
⊢ ∀ (φ : Module.Dual K V), φ ∈ LinearMap.range (LinearMap.domRestrict (↑toLin B) W) → ↑φ x = 0

tactic: exact hx w hw
state_before: case h.mpr.intro.mk
R : Type ?u.1566077
M : Type ?u.1566080
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type ?u.1566116
M₁ : Type ?u.1566119
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type ?u.1566728
M₂ : Type ?u.1566731
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type ?u.1566918
M₃ : Type ?u.1566921
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.1568726
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : ∀ (n : V), n ∈ W → IsOrtho B n x
w : V
hw : w ∈ W
⊢ ↑(↑(LinearMap.domRestrict (↑toLin B) W) { val := w, property := hw }) x = 0