l3lab/ntp-mathlib huggingface dataset:
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      

Proof state:
case h.mp.intro.mk.intro.right.a
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 K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W
hker : (LinearMap.domRestrict (toLin B) W) { val := x, property := hx } = 0
y : V
a✝ : y ∈ ⊤
⊢ bilin B ((Submodule.subtype W) { val := x, property := hx }) y = 0

Next tactic:
change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      

Proof state:
case h.mp.intro.mk.intro.right.a
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 K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W
hker : (LinearMap.domRestrict (toLin B) W) { val := x, property := hx } = 0
y : V
a✝ : y ∈ ⊤
⊢ ((LinearMap.domRestrict (toLin B) W) { val := x, property := hx }) y = 0

Next tactic:
rw [hker]
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      

Proof state:
case h.mp.intro.mk.intro.right.a
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 K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W
hker : (LinearMap.domRestrict (toLin B) W) { val := x, property := hx } = 0
y : V
a✝ : y ∈ ⊤
⊢ 0 y = 0

Next tactic:
rfl
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      rfl
  · 

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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W ⊓ orthogonal B ⊤
⊢ x ∈ Submodule.map (Submodule.subtype W) (LinearMap.ker (LinearMap.domRestrict (toLin B) W))

Next tactic:
simp_rw [Submodule.mem_map, LinearMap.mem_ker]
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      rfl
  · simp_rw [Submodule.mem_map, LinearMap.mem_ker]
    

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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W ⊓ orthogonal B ⊤
⊢ ∃ y, (LinearMap.domRestrict (toLin B) W) y = 0 ∧ (Submodule.subtype W) y = x

Next tactic:
refine' ⟨⟨x, hx.1⟩, _, rfl⟩
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      rfl
  · simp_rw [Submodule.mem_map, LinearMap.mem_ker]
    refine' ⟨⟨x, hx.1⟩, _, rfl⟩
    

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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W ⊓ orthogonal B ⊤
⊢ (LinearMap.domRestrict (toLin B) W) { val := x, property := (_ : x ∈ ↑W) } = 0

Next tactic:
ext y
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      rfl
  · simp_rw [Submodule.mem_map, LinearMap.mem_ker]
    refine' ⟨⟨x, hx.1⟩, _, rfl⟩
    ext y
    

Proof state:
case h.mpr.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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W ⊓ orthogonal B ⊤
y : V
⊢ ((LinearMap.domRestrict (toLin B) W) { val := x, property := (_ : x ∈ ↑W) }) y = 0 y

Next tactic:
change B x y = 0
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      rfl
  · simp_rw [Submodule.mem_map, LinearMap.mem_ker]
    refine' ⟨⟨x, hx.1⟩, _, rfl⟩
    ext y
    change B x y = 0
    

Proof state:
case h.mpr.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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W ⊓ orthogonal B ⊤
y : V
⊢ bilin B x y = 0

Next tactic:
rw [b]
theorem toLin_restrict_ker_eq_inf_orthogonal (B : BilinForm K V) (W : Subspace K V) (b : B.IsRefl) :
    (B.toLin.domRestrict W).ker.map W.subtype = (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
  ext x; constructor <;> intro hx
  · rcases hx with ⟨⟨x, hx⟩, hker, rfl⟩
    erw [LinearMap.mem_ker] at hker
    constructor
    · simp [hx]
    · intro y _
      rw [IsOrtho, b]
      change (B.toLin.domRestrict W) ⟨x, hx⟩ y = 0
      rw [hker]
      rfl
  · simp_rw [Submodule.mem_map, LinearMap.mem_ker]
    refine' ⟨⟨x, hx.1⟩, _, rfl⟩
    ext y
    change B x y = 0
    rw [b]
    

Proof state:
case h.mpr.h.a
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 K V
W : Subspace K V
b : IsRefl B
x : V
hx : x ∈ W ⊓ orthogonal B ⊤
y : V
⊢ bilin B y x = 0

Next tactic:
exact hx.2 _ Submodule.mem_top
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := 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 K V
W : Subspace K V
⊢ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (toLin B) W)) = orthogonal B W

Next tactic:
ext x
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; 

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₂
M₂' : Type u_13
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

Next tactic:
constructor
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; 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₂
M₂' : Type u_13
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

Next tactic:
rw [mem_orthogonal_iff]
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; constructor <;> 

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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
⊢ x ∈ orthogonal B W → x ∈ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (toLin B) W))

Next tactic:
rw [mem_orthogonal_iff]
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; constructor <;> rw [mem_orthogonal_iff] <;> 

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₂
M₂' : Type u_13
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)) → ∀ n ∈ W, IsOrtho B n x

Next tactic:
intro hx
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; constructor <;> rw [mem_orthogonal_iff] <;> 

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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
⊢ (∀ n ∈ W, IsOrtho B n x) → x ∈ Submodule.dualCoannihilator (LinearMap.range (LinearMap.domRestrict (toLin B) W))

Next tactic:
intro hx
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; constructor <;> rw [mem_orthogonal_iff] <;> intro hx
  · 

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₂
M₂' : Type u_13
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 ∈ W, IsOrtho B n x

Next tactic:
intro y hy
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; constructor <;> rw [mem_orthogonal_iff] <;> intro hx
  · intro y hy
    

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₂
M₂' : Type u_13
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

Next tactic:
rw [Submodule.mem_dualCoannihilator] at hx
theorem toLin_restrict_range_dualCoannihilator_eq_orthogonal (B : BilinForm K V)
    (W : Subspace K V) : (B.toLin.domRestrict W).range.dualCoannihilator = B.orthogonal W := by
  ext x; constructor <;> rw [mem_orthogonal_iff] <;> intro hx
  · intro y hy
    rw [Submodule.mem_dualCoannihilator] at hx
    

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₂
M₂' : Type u_13
inst✝¹ : AddCommMonoid M₂'
inst✝ : Module R₂ M₂'
B : BilinForm K V
W : Subspace K V
x : V
hx : ∀ φ ∈ LinearMap.range (LinearMap.domRestrict (toLin B) W), φ x = 0
y : V
hy : y ∈ W
⊢ IsOrtho B y x

Next tactic:
refine' hx (B.toLin.domRestrict W ⟨y, hy⟩) ⟨⟨y, hy⟩, rfl⟩