Theorem: rank_eq_zero_iff
File: Mathlib/LinearAlgebra/Dimension/Finite.lean

tactic: nontriviality R
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
⊢ Module.rank R M = 0 ↔ ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ Module.rank R M = 0 ↔ ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0

tactic: constructor
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ Module.rank R M = 0 ↔ ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
state_after: case mp
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ Module.rank R M = 0 → ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0

case mpr
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ (∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0) → Module.rank R M = 0

tactic: contrapose!
state_before: case mp
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ Module.rank R M = 0 → ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
state_after: case mp
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ (∃ x, ∀ (a : R), a ≠ 0 → a • x ≠ 0) → Module.rank R M ≠ 0

tactic: rintro ⟨x, hx⟩
state_before: case mp
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ (∃ x, ∀ (a : R), a ≠ 0 → a • x ≠ 0) → Module.rank R M ≠ 0
state_after: case mp.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
x : M
hx : ∀ (a : R), a ≠ 0 → a • x ≠ 0
⊢ Module.rank R M ≠ 0

tactic: rw [← Cardinal.one_le_iff_ne_zero]
state_before: case mp.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
x : M
hx : ∀ (a : R), a ≠ 0 → a • x ≠ 0
⊢ Module.rank R M ≠ 0
state_after: case mp.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
x : M
hx : ∀ (a : R), a ≠ 0 → a • x ≠ 0
⊢ 1 ≤ Module.rank R M

tactic: have : LinearIndependent R (fun _ : Unit ↦ x) :=
  linearIndependent_iff.mpr (fun l hl ↦ Finsupp.unique_ext <| not_not.mp fun H ↦
    hx _ H ((Finsupp.total_unique _ _ _).symm.trans hl))
state_before: case mp.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
x : M
hx : ∀ (a : R), a ≠ 0 → a • x ≠ 0
⊢ 1 ≤ Module.rank R M
state_after: case mp.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
x : M
hx : ∀ (a : R), a ≠ 0 → a • x ≠ 0
this : LinearIndependent R fun x_1 => x
⊢ 1 ≤ Module.rank R M

tactic: simpa using this.cardinal_lift_le_rank
state_before: case mp.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
x : M
hx : ∀ (a : R), a ≠ 0 → a • x ≠ 0
this : LinearIndependent R fun x_1 => x
⊢ 1 ≤ Module.rank R M
state_after: no goals

tactic: intro h
state_before: case mpr
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
⊢ (∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0) → Module.rank R M = 0
state_after: case mpr
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
⊢ Module.rank R M = 0

tactic: rw [← le_zero_iff, Module.rank_def]
state_before: case mpr
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
⊢ Module.rank R M = 0
state_after: case mpr
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
⊢ ⨆ ι, #↑↑ι ≤ 0

tactic: apply ciSup_le'
state_before: case mpr
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
⊢ ⨆ ι, #↑↑ι ≤ 0
state_after: case mpr.h
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
⊢ ∀ (i : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }), #↑↑i ≤ 0

tactic: intro ⟨s, hs⟩
state_before: case mpr.h
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
⊢ ∀ (i : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }), #↑↑i ≤ 0
state_after: case mpr.h
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ #↑↑⟨s, hs⟩ ≤ 0

tactic: rw [nonpos_iff_eq_zero, Cardinal.mk_eq_zero_iff, ← not_nonempty_iff]
state_before: case mpr.h
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ #↑↑⟨s, hs⟩ ≤ 0
state_after: case mpr.h
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ ¬Nonempty ↑↑⟨s, hs⟩

tactic: rintro ⟨i : s⟩
state_before: case mpr.h
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ ¬Nonempty ↑↑⟨s, hs⟩
state_after: case mpr.h.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
⊢ False

tactic: obtain ⟨a, ha, ha'⟩ := h i
state_before: case mpr.h.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
⊢ False
state_after: case mpr.h.intro.intro.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
a : R
ha : a ≠ 0
ha' : a • ↑i = 0
⊢ False

tactic: apply ha
state_before: case mpr.h.intro.intro.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
a : R
ha : a ≠ 0
ha' : a • ↑i = 0
⊢ False
state_after: case mpr.h.intro.intro.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
a : R
ha : a ≠ 0
ha' : a • ↑i = 0
⊢ a = 0

tactic: simpa using DFunLike.congr_fun (linearIndependent_iff.mp hs (Finsupp.single i a) (by simpa)) i
state_before: case mpr.h.intro.intro.intro
R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
a : R
ha : a ≠ 0
ha' : a • ↑i = 0
⊢ a = 0
state_after: no goals

tactic: simpa
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
a✝ : Nontrivial R
h : ∀ (x : M), ∃ a, a ≠ 0 ∧ a • x = 0
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
i : ↑s
a : R
ha : a ≠ 0
ha' : a • ↑i = 0
⊢ (Finsupp.total { x // x ∈ s } M R Subtype.val) (Finsupp.single i a) = 0
state_after: no goals