Theorem: Submodule.exists_le_ker_of_lt_top
File: Mathlib/LinearAlgebra/Basis.lean

tactic: rcases SetLike.exists_of_lt hp with ⟨v, -, hpv⟩
state_before: ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v : ι → V
s t : Set V
x y z : V
p : Submodule K V
hp : p < ⊤
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f

tactic: clear hp
state_before: case intro.intro
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
hp : p < ⊤
v : V
hpv : ¬v ∈ p
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f

tactic: rcases(LinearPMap.supSpanSingleton ⟨p, 0⟩ v (1 : K) hpv).toFun.exists_extend with ⟨f, hf⟩
state_before: case intro.intro
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f

tactic: refine' ⟨f, _, _⟩
state_before: case intro.intro.intro
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ ∃ f, f ≠ 0 ∧ p ≤ ker f

tactic: rintro rfl
state_before: case intro.intro.intro.refine'_1
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ f ≠ 0

tactic: rw [LinearMap.zero_comp] at hf
state_before: case intro.intro.intro.refine'_1
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
hf :
  LinearMap.comp 0 (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ False

tactic: have := LinearPMap.supSpanSingleton_apply_mk ⟨p, 0⟩ v (1 : K) hpv 0 p.zero_mem 1
state_before: case intro.intro.intro.refine'_1
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
hf : 0 = (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ False

tactic: simpa using (LinearMap.congr_fun hf _).trans this
state_before: case intro.intro.intro.refine'_1
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
hf : 0 = (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
this :
  ↑(LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv)
      { val := 0 + 1 • v,
        property :=
          (_ :
            0 + 1 • v ∈
              { domain := p, toFun := 0 }.domain ⊔ (LinearPMap.mkSpanSingleton v 1 (_ : v = 0 → False)).domain) } =
    ↑{ domain := p, toFun := 0 } { val := 0, property := (_ : 0 ∈ p) } + 1 • 1
⊢ False

tactic: refine' fun x hx => mem_ker.2 _
state_before: case intro.intro.intro.refine'_2
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
⊢ p ≤ ker f

tactic: have := LinearPMap.supSpanSingleton_apply_mk ⟨p, 0⟩ v (1 : K) hpv x hx 0
state_before: case intro.intro.intro.refine'_2
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x✝ y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
x : V
hx : x ∈ p
⊢ ↑f x = 0

tactic: simpa using (LinearMap.congr_fun hf _).trans this
state_before: case intro.intro.intro.refine'_2
ι : Type ?u.1216438
ι' : Type ?u.1216441
R : Type ?u.1216444
R₂ : Type ?u.1216447
K : Type u_1
M : Type ?u.1216453
M' : Type ?u.1216456
M'' : Type ?u.1216459
V : Type u
V' : Type ?u.1216464
inst✝⁴ : DivisionRing K
inst✝³ : AddCommGroup V
inst✝² : AddCommGroup V'
inst✝¹ : Module K V
inst✝ : Module K V'
v✝ : ι → V
s t : Set V
x✝ y z : V
p : Submodule K V
v : V
hpv : ¬v ∈ p
f : V →ₗ[K] K
hf :
  LinearMap.comp f (Submodule.subtype (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).domain) =
    (LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv).toFun
x : V
hx : x ∈ p
this :
  ↑(LinearPMap.supSpanSingleton { domain := p, toFun := 0 } v 1 hpv)
      { val := x + 0 • v,
        property :=
          (_ :
            x + 0 • v ∈
              { domain := p, toFun := 0 }.domain ⊔ (LinearPMap.mkSpanSingleton v 1 (_ : v = 0 → False)).domain) } =
    ↑{ domain := p, toFun := 0 } { val := x, property := hx } + 0 • 1
⊢ ↑f x = 0