Theorem: Subspace.dualAnnihilator_dualCoannihilator_eq
File: Mathlib/LinearAlgebra/Dual.lean

tactic: refine' le_antisymm _ (le_dualAnnihilator_dualCoannihilator _)
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
⊢ dualCoannihilator (dualAnnihilator W) = W

tactic: intro v
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
⊢ dualCoannihilator (dualAnnihilator W) ≤ W

tactic: simp only [mem_dualAnnihilator, mem_dualCoannihilator]
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
v : V
⊢ v ∈ dualCoannihilator (dualAnnihilator W) → v ∈ W

tactic: contrapose!
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
v : V
⊢ (∀ (φ : Module.Dual K V), (∀ (w : V), w ∈ W → ↑φ w = 0) → ↑φ v = 0) → v ∈ W

tactic: intro hv
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
v : V
⊢ ¬v ∈ W → ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ v ≠ 0

tactic: obtain ⟨W', hW⟩ := Submodule.exists_isCompl W
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
v : V
hv : ¬v ∈ W
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ v ≠ 0

tactic: obtain ⟨⟨w, w'⟩, rfl, -⟩ := existsUnique_add_of_isCompl_prod hW v
state_before: case intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
v : V
hv : ¬v ∈ W
W' : Submodule K V
hW : IsCompl W W'
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ v ≠ 0

tactic: have hw'n : (w' : V) ∉ W := by
  contrapose! hv
  exact Submodule.add_mem W w.2 hv
state_before: case intro.intro.mk.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ (↑(w, w').fst + ↑(w, w').snd) ≠ 0

tactic: have hw'nz : w' ≠ 0 := by
  rintro rfl
  exact hw'n (Submodule.zero_mem W)
state_before: case intro.intro.mk.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ (↑(w, w').fst + ↑(w, w').snd) ≠ 0

tactic: rw [Ne.def, ← Module.forall_dual_apply_eq_zero_iff K w'] at hw'nz
state_before: case intro.intro.mk.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
hw'nz : w' ≠ 0
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ (↑(w, w').fst + ↑(w, w').snd) ≠ 0

tactic: push_neg  at hw'nz
state_before: case intro.intro.mk.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
hw'nz : ¬∀ (φ : Module.Dual K { x // x ∈ W' }), ↑φ w' = 0
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ (↑(w, w').fst + ↑(w, w').snd) ≠ 0

tactic: obtain ⟨φ, hφ⟩ := hw'nz
state_before: case intro.intro.mk.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
hw'nz : ∃ φ, ↑φ w' ≠ 0
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ (↑(w, w').fst + ↑(w, w').snd) ≠ 0

tactic: exists ((LinearMap.ofIsComplProd hW).comp (LinearMap.inr _ _ _)) φ
state_before: case intro.intro.mk.intro.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
φ : Module.Dual K { x // x ∈ W' }
hφ : ↑φ w' ≠ 0
⊢ ∃ φ, (∀ (w : V), w ∈ W → ↑φ w = 0) ∧ ↑φ (↑(w, w').fst + ↑(w, w').snd) ≠ 0

tactic: simp only [coe_comp, coe_inr, Function.comp_apply, ofIsComplProd_apply, map_add,
  ofIsCompl_left_apply, zero_apply, ofIsCompl_right_apply, zero_add, Ne.def]
state_before: case intro.intro.mk.intro.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
φ : Module.Dual K { x // x ∈ W' }
hφ : ↑φ w' ≠ 0
⊢ (∀ (w : V),
      w ∈ W → ↑(↑(comp (ofIsComplProd hW) (inr K ({ x // x ∈ W } →ₗ[K] K) ({ x // x ∈ W' } →ₗ[K] K))) φ) w = 0) ∧
    ↑(↑(comp (ofIsComplProd hW) (inr K ({ x // x ∈ W } →ₗ[K] K) ({ x // x ∈ W' } →ₗ[K] K))) φ)
        (↑(w, w').fst + ↑(w, w').snd) ≠
      0

tactic: refine' ⟨_, hφ⟩
state_before: case intro.intro.mk.intro.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
φ : Module.Dual K { x // x ∈ W' }
hφ : ↑φ w' ≠ 0
⊢ (∀ (w : V), w ∈ W → ↑(ofIsCompl hW 0 φ) w = 0) ∧ ¬↑φ w' = 0

tactic: intro v hv
state_before: case intro.intro.mk.intro.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
φ : Module.Dual K { x // x ∈ W' }
hφ : ↑φ w' ≠ 0
⊢ ∀ (w : V), w ∈ W → ↑(ofIsCompl hW 0 φ) w = 0

tactic: apply LinearMap.ofIsCompl_left_apply hW ⟨v, hv⟩
state_before: case intro.intro.mk.intro.intro
K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv✝ : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
φ : Module.Dual K { x // x ∈ W' }
hφ : ↑φ w' ≠ 0
v : V
hv : v ∈ W
⊢ ↑(ofIsCompl hW 0 φ) v = 0

tactic: contrapose! hv
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
⊢ ¬↑w' ∈ W

tactic: exact Submodule.add_mem W w.2 hv
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ↑w' ∈ W
⊢ ↑w + ↑w' ∈ W

tactic: rintro rfl
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
w' : { x // x ∈ W' }
hv : ¬↑(w, w').fst + ↑(w, w').snd ∈ W
hw'n : ¬↑w' ∈ W
⊢ w' ≠ 0

tactic: exact hw'n (Submodule.zero_mem W)
state_before: K : Type u
V : Type v
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
W : Subspace K V
W' : Submodule K V
hW : IsCompl W W'
w : { x // x ∈ W }
hv : ¬↑(w, 0).fst + ↑(w, 0).snd ∈ W
hw'n : ¬↑0 ∈ W
⊢ False