l3lab/ntp-mathlib huggingface dataset:
/-- The finrank of `M ⊗[R] N` is `(finrank R M) * (finrank R N)`. -/
@[simp]
theorem finrank_tensorProduct (M : Type v) (N : Type w) [AddCommGroup M] [Module R M]
    [Module.Free R M] [AddCommGroup N] [Module R N] [Module.Free R N] :
    finrank R (M ⊗[R] N) = finrank R M * finrank R N := by 

Proof state:
R : Type u
M✝ : Type v
N✝ : Type w
inst✝¹⁵ : CommRing R
inst✝¹⁴ : StrongRankCondition R
inst✝¹³ : AddCommGroup M✝
inst✝¹² : Module R M✝
inst✝¹¹ : Module.Free R M✝
inst✝¹⁰ : Module.Finite R M✝
inst✝⁹ : AddCommGroup N✝
inst✝⁸ : Module R N✝
inst✝⁷ : Module.Free R N✝
inst✝⁶ : Module.Finite R N✝
M : Type v
N : Type w
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Free R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : Module.Free R N
⊢ finrank R (M ⊗[R] N) = finrank R M * finrank R N

Next tactic:
simp [finrank]
/-- The dimension of a submodule is bounded by the dimension of the ambient space. -/
theorem Submodule.finrank_le [Module.Finite R M] (s : Submodule R M) :
    finrank R s ≤ finrank R M := by
  

Proof state:
R : Type u
M : Type v
N : Type w
inst✝⁶ : Ring R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : Module.Finite R M
s : Submodule R M
⊢ finrank R ↥s ≤ finrank R M

Next tactic:
simpa only [Cardinal.toNat_lift] using
    toNat_le_of_le_of_lt_aleph0 (rank_lt_aleph0 _ _) (rank_submodule_le s)
/-- The dimension of a quotient is bounded by the dimension of the ambient space. -/
theorem Submodule.finrank_quotient_le [Module.Finite R M] (s : Submodule R M) :
    finrank R (M ⧸ s) ≤ finrank R M := by
  

Proof state:
R : Type u
M : Type v
N : Type w
inst✝⁶ : Ring R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : Module.Finite R M
s : Submodule R M
⊢ finrank R (M ⧸ s) ≤ finrank R M

Next tactic:
simpa only [Cardinal.toNat_lift] using
    toNat_le_of_le_of_lt_aleph0 (rank_lt_aleph0 _ _)
      ((Submodule.mkQ s).rank_le_of_surjective (surjective_quot_mk _))
/-- See `FiniteDimensional.rank_lt_aleph0` for the inverse direction without `Module.Free R V`. -/
lemma Module.rank_lt_alpeh0_iff :
    Module.rank R V < ℵ₀ ↔ Module.Finite R V := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
⊢ Module.rank R V < ℵ₀ ↔ Finite R V

Next tactic:
rw [Free.rank_eq_card_chooseBasisIndex, mk_lt_aleph0_iff]
/-- See `FiniteDimensional.rank_lt_aleph0` for the inverse direction without `Module.Free R V`. -/
lemma Module.rank_lt_alpeh0_iff :
    Module.rank R V < ℵ₀ ↔ Module.Finite R V := by
  rw [Free.rank_eq_card_chooseBasisIndex, mk_lt_aleph0_iff]
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
⊢ _root_.Finite (Free.ChooseBasisIndex R V) ↔ Finite R V

Next tactic:
exact ⟨fun h ↦ Finite.of_basis (Free.chooseBasis R V),
    fun I ↦ Finite.of_fintype (Free.ChooseBasisIndex R V)⟩
theorem Module.finite_of_finrank_pos (h : 0 < finrank R V) :
    Module.Finite R V := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
h : 0 < finrank R V
⊢ Finite R V

Next tactic:
contrapose h
theorem Module.finite_of_finrank_pos (h : 0 < finrank R V) :
    Module.Finite R V := by
  contrapose h
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
h : ¬Finite R V
⊢ ¬0 < finrank R V

Next tactic:
simp [finrank_of_not_finite h]
theorem Module.finite_of_finrank_eq_succ {n : ℕ}
    (hn : finrank R V = n.succ) : Module.Finite R V :=
  Module.finite_of_finrank_pos <| by 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
n : ℕ
hn : finrank R V = Nat.succ n
⊢ 0 < finrank R V

Next tactic:
rw [hn]
theorem Module.finite_of_finrank_eq_succ {n : ℕ}
    (hn : finrank R V = n.succ) : Module.Finite R V :=
  Module.finite_of_finrank_pos <| by rw [hn]; 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
n : ℕ
hn : finrank R V = Nat.succ n
⊢ 0 < Nat.succ n

Next tactic:
exact n.succ_pos
theorem Module.finite_iff_of_rank_eq_nsmul {W} [AddCommGroup W]
    [Module R W] [Module.Free R W] {n : ℕ} (hn : n ≠ 0)
    (hVW : Module.rank R V = n • Module.rank R W) :
    Module.Finite R V ↔ Module.Finite R W := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁸ : AddCommGroup V
V₂ : Type v'
inst✝⁷ : AddCommGroup V₂
inst✝⁶ : Ring R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Module R V
inst✝³ : Free R V
W : Type v
inst✝² : AddCommGroup W
inst✝¹ : Module R W
inst✝ : Free R W
n : ℕ
hn : n ≠ 0
hVW : Module.rank R V = n • Module.rank R W
⊢ Finite R V ↔ Finite R W

Next tactic:
simp only [← rank_lt_alpeh0_iff, hVW, nsmul_lt_aleph0_iff_of_ne_zero hn]
/-- If a free module is of finite rank, then the cardinality of any basis is equal to its
`finrank`. -/
theorem Module.mk_finrank_eq_card_basis [Module.Finite R V]
    {ι : Type w} (h : Basis ι R V) : (finrank R V : Cardinal.{w}) = #ι := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Finite R V
ι : Type w
h : Basis ι R V
⊢ ↑(finrank R V) = #ι

Next tactic:
cases @nonempty_fintype _ (Free.finite_basis h)
/-- If a free module is of finite rank, then the cardinality of any basis is equal to its
`finrank`. -/
theorem Module.mk_finrank_eq_card_basis [Module.Finite R V]
    {ι : Type w} (h : Basis ι R V) : (finrank R V : Cardinal.{w}) = #ι := by
  cases @nonempty_fintype _ (Free.finite_basis h)
  

Proof state:
case intro
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Finite R V
ι : Type w
h : Basis ι R V
val✝ : Fintype ι
⊢ ↑(finrank R V) = #ι

Next tactic:
rw [Cardinal.mk_fintype, finrank_eq_card_basis h]
/-- Given a basis of a ring over itself indexed by a type `ι`, then `ι` is `Unique`. -/
noncomputable def Basis.unique {ι : Type*} (b : Basis ι R R) : Unique ι := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
ι : Type u_1
b : Basis ι R R
⊢ Unique ι

Next tactic:
have A : Cardinal.mk ι = ↑(FiniteDimensional.finrank R R) :=
    (Module.mk_finrank_eq_card_basis b).symm
/-- Given a basis of a ring over itself indexed by a type `ι`, then `ι` is `Unique`. -/
noncomputable def Basis.unique {ι : Type*} (b : Basis ι R R) : Unique ι := by
  have A : Cardinal.mk ι = ↑(FiniteDimensional.finrank R R) :=
    (Module.mk_finrank_eq_card_basis b).symm
  -- porting note: replace `algebraMap.coe_one` with `Nat.cast_one`
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
ι : Type u_1
b : Basis ι R R
A : #ι = ↑(finrank R R)
⊢ Unique ι

Next tactic:
simp only [Cardinal.eq_one_iff_unique, FiniteDimensional.finrank_self, Nat.cast_one] at A
/-- Given a basis of a ring over itself indexed by a type `ι`, then `ι` is `Unique`. -/
noncomputable def Basis.unique {ι : Type*} (b : Basis ι R R) : Unique ι := by
  have A : Cardinal.mk ι = ↑(FiniteDimensional.finrank R R) :=
    (Module.mk_finrank_eq_card_basis b).symm
  -- porting note: replace `algebraMap.coe_one` with `Nat.cast_one`
  simp only [Cardinal.eq_one_iff_unique, FiniteDimensional.finrank_self, Nat.cast_one] at A
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁵ : AddCommGroup V
V₂ : Type v'
inst✝⁴ : AddCommGroup V₂
inst✝³ : Ring R
inst✝² : StrongRankCondition R
inst✝¹ : Module R V
inst✝ : Free R V
ι : Type u_1
b : Basis ι R R
A : Subsingleton ι ∧ Nonempty ι
⊢ Unique ι

Next tactic:
exact Nonempty.some ((unique_iff_subsingleton_and_nonempty _).2 A)
@[simp]
theorem basisUnique_repr_eq_zero_iff {ι : Type*} [Unique ι]
    {h : finrank R V = 1} {v : V} {i : ι} :
    (basisUnique ι h).repr v i = 0 ↔ v = 0 :=
  ⟨fun hv =>
    (basisUnique ι h).repr.map_eq_zero_iff.mp (Finsupp.ext fun j => Subsingleton.elim i j ▸ hv),
    fun hv => by 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type u_1
inst✝ : Unique ι
h : finrank R V = 1
v : V
i : ι
hv : v = 0
⊢ ((basisUnique ι h).repr v) i = 0

Next tactic:
rw [hv, LinearEquiv.map_zero, Finsupp.zero_apply]
theorem cardinal_mk_le_finrank_of_linearIndependent [Module.Finite R V]
    {ι : Type w} {b : ι → V} (h : LinearIndependent R b) : #ι ≤ finrank R V := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Module.Finite R V
ι : Type w
b : ι → V
h : LinearIndependent R b
⊢ #ι ≤ ↑(finrank R V)

Next tactic:
rw [← lift_le.{max v w}]
theorem cardinal_mk_le_finrank_of_linearIndependent [Module.Finite R V]
    {ι : Type w} {b : ι → V} (h : LinearIndependent R b) : #ι ≤ finrank R V := by
  rw [← lift_le.{max v w}]
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Module.Finite R V
ι : Type w
b : ι → V
h : LinearIndependent R b
⊢ Cardinal.lift.{max v w, w} #ι ≤ Cardinal.lift.{max v w, w} ↑(finrank R V)

Next tactic:
simpa only [← finrank_eq_rank, lift_natCast, lift_le_nat_iff] using
    cardinal_lift_le_rank_of_linearIndependent h
theorem fintype_card_le_finrank_of_linearIndependent [Module.Finite R V]
    {ι : Type*} [Fintype ι] {b : ι → V} (h : LinearIndependent R b) :
    Fintype.card ι ≤ finrank R V := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
ι : Type u_1
inst✝ : Fintype ι
b : ι → V
h : LinearIndependent R b
⊢ card ι ≤ finrank R V

Next tactic:
simpa using cardinal_mk_le_finrank_of_linearIndependent h
theorem finset_card_le_finrank_of_linearIndependent [Module.Finite R V]
    {b : Finset V} (h : LinearIndependent R (fun x => x : b → V)) :
    b.card ≤ finrank R V := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Module.Finite R V
b : Finset V
h : LinearIndependent R fun x => ↑x
⊢ Finset.card b ≤ finrank R V

Next tactic:
rw [← Fintype.card_coe]
theorem finset_card_le_finrank_of_linearIndependent [Module.Finite R V]
    {b : Finset V} (h : LinearIndependent R (fun x => x : b → V)) :
    b.card ≤ finrank R V := by
  rw [← Fintype.card_coe]
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Module.Finite R V
b : Finset V
h : LinearIndependent R fun x => ↑x
⊢ card { x // x ∈ b } ≤ finrank R V

Next tactic:
exact fintype_card_le_finrank_of_linearIndependent h
theorem Module.Finite.lt_aleph0_of_linearIndependent {ι : Type w}
    [Module.Finite R V] {v : ι → V} (h : LinearIndependent R v) : #ι < ℵ₀ := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ #ι < ℵ₀

Next tactic:
apply Cardinal.lift_lt.1
theorem Module.Finite.lt_aleph0_of_linearIndependent {ι : Type w}
    [Module.Finite R V] {v : ι → V} (h : LinearIndependent R v) : #ι < ℵ₀ := by
  apply Cardinal.lift_lt.1
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ Cardinal.lift.{?u.221244, w} #ι < Cardinal.lift.{?u.221244, w} ℵ₀

Next tactic:
apply lt_of_le_of_lt
theorem Module.Finite.lt_aleph0_of_linearIndependent {ι : Type w}
    [Module.Finite R V] {v : ι → V} (h : LinearIndependent R v) : #ι < ℵ₀ := by
  apply Cardinal.lift_lt.1
  apply lt_of_le_of_lt
  

Proof state:
case a
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ Cardinal.lift.{?u.221244, w} #ι ≤ ?b
case a
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ ?b < Cardinal.lift.{?u.221244, w} ℵ₀
case b
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ Cardinal.{max w ?u.221244}

Next tactic:
apply cardinal_lift_le_rank_of_linearIndependent h
theorem Module.Finite.lt_aleph0_of_linearIndependent {ι : Type w}
    [Module.Finite R V] {v : ι → V} (h : LinearIndependent R v) : #ι < ℵ₀ := by
  apply Cardinal.lift_lt.1
  apply lt_of_le_of_lt
  apply cardinal_lift_le_rank_of_linearIndependent h
  

Proof state:
case a
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ Cardinal.lift.{w, v} (Module.rank R V) < Cardinal.lift.{v, w} ℵ₀

Next tactic:
rw [← finrank_eq_rank, Cardinal.lift_aleph0, Cardinal.lift_natCast]
theorem Module.Finite.lt_aleph0_of_linearIndependent {ι : Type w}
    [Module.Finite R V] {v : ι → V} (h : LinearIndependent R v) : #ι < ℵ₀ := by
  apply Cardinal.lift_lt.1
  apply lt_of_le_of_lt
  apply cardinal_lift_le_rank_of_linearIndependent h
  rw [← finrank_eq_rank, Cardinal.lift_aleph0, Cardinal.lift_natCast]
  

Proof state:
case a
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
ι : Type w
inst✝ : Finite R V
v : ι → V
h : LinearIndependent R v
⊢ ↑(finrank R V) < ℵ₀

Next tactic:
apply Cardinal.nat_lt_aleph0
/-- A finite rank torsion-free module has positive `finrank` iff it has a nonzero element. -/
theorem FiniteDimensional.finrank_pos_iff_exists_ne_zero
    [Module.Finite R V] [NoZeroSMulDivisors R V] :
    0 < finrank R V ↔ ∃ x : V, x ≠ 0 :=
  Iff.trans
    (by
      

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
⊢ 0 < finrank R V ↔ 0 < Module.rank R V

Next tactic:
rw [← finrank_eq_rank]
/-- A finite rank torsion-free module has positive `finrank` iff it has a nonzero element. -/
theorem FiniteDimensional.finrank_pos_iff_exists_ne_zero
    [Module.Finite R V] [NoZeroSMulDivisors R V] :
    0 < finrank R V ↔ ∃ x : V, x ≠ 0 :=
  Iff.trans
    (by
      rw [← finrank_eq_rank]
      

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
⊢ 0 < finrank R V ↔ 0 < ↑(finrank R V)

Next tactic:
norm_cast
/-- An `R`-finite torsion-free module has positive `finrank` iff it is nontrivial. -/
theorem FiniteDimensional.finrank_pos_iff [Module.Finite R V] [NoZeroSMulDivisors R V] :
    0 < finrank R V ↔ Nontrivial V :=
  Iff.trans
    (by 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
⊢ 0 < finrank R V ↔ 0 < Module.rank R V

Next tactic:
rw [← finrank_eq_rank]
/-- An `R`-finite torsion-free module has positive `finrank` iff it is nontrivial. -/
theorem FiniteDimensional.finrank_pos_iff [Module.Finite R V] [NoZeroSMulDivisors R V] :
    0 < finrank R V ↔ Nontrivial V :=
  Iff.trans
    (by rw [← finrank_eq_rank]; 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
⊢ 0 < finrank R V ↔ 0 < ↑(finrank R V)

Next tactic:
norm_cast
/-- See `FiniteDimensional.finrank_zero_iff`
  for the stronger version with `NoZeroSMulDivisors R V`. -/
theorem FiniteDimensional.finrank_eq_zero_iff [Module.Finite R V] :
    finrank R V = 0 ↔ ∀ x : V, ∃ a : R, a ≠ 0 ∧ a • x = 0 :=
  Iff.trans
    (by 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Module.Finite R V
⊢ finrank R V = 0 ↔ Module.rank R V = 0

Next tactic:
rw [← finrank_eq_rank]
/-- See `FiniteDimensional.finrank_zero_iff`
  for the stronger version with `NoZeroSMulDivisors R V`. -/
theorem FiniteDimensional.finrank_eq_zero_iff [Module.Finite R V] :
    finrank R V = 0 ↔ ∀ x : V, ∃ a : R, a ≠ 0 ∧ a • x = 0 :=
  Iff.trans
    (by rw [← finrank_eq_rank]; 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁶ : AddCommGroup V
V₂ : Type v'
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
inst✝² : Module R V
inst✝¹ : Free R V
inst✝ : Module.Finite R V
⊢ finrank R V = 0 ↔ ↑(finrank R V) = 0

Next tactic:
norm_cast
/-- The `StrongRankCondition` is automatic. See `commRing_strongRankCondition`. -/
theorem FiniteDimensional.finrank_eq_zero_iff_isTorsion {R} [CommRing R] [StrongRankCondition R]
    [IsDomain R] [Module R V] [Module.Finite R V] :
    finrank R V = 0 ↔ IsTorsion R V :=
  Iff.trans
    (by 

Proof state:
R✝ : Type u
M : Type v
N : Type w
V : Type v
inst✝¹⁰ : AddCommGroup V
V₂ : Type v'
inst✝⁹ : AddCommGroup V₂
inst✝⁸ : Ring R✝
inst✝⁷ : StrongRankCondition R✝
inst✝⁶ : Module R✝ V
inst✝⁵ : Free R✝ V
R : Type u_1
inst✝⁴ : CommRing R
inst✝³ : StrongRankCondition R
inst✝² : IsDomain R
inst✝¹ : Module R V
inst✝ : Module.Finite R V
⊢ finrank R V = 0 ↔ Module.rank R V = 0

Next tactic:
rw [← finrank_eq_rank]
/-- The `StrongRankCondition` is automatic. See `commRing_strongRankCondition`. -/
theorem FiniteDimensional.finrank_eq_zero_iff_isTorsion {R} [CommRing R] [StrongRankCondition R]
    [IsDomain R] [Module R V] [Module.Finite R V] :
    finrank R V = 0 ↔ IsTorsion R V :=
  Iff.trans
    (by rw [← finrank_eq_rank]; 

Proof state:
R✝ : Type u
M : Type v
N : Type w
V : Type v
inst✝¹⁰ : AddCommGroup V
V₂ : Type v'
inst✝⁹ : AddCommGroup V₂
inst✝⁸ : Ring R✝
inst✝⁷ : StrongRankCondition R✝
inst✝⁶ : Module R✝ V
inst✝⁵ : Free R✝ V
R : Type u_1
inst✝⁴ : CommRing R
inst✝³ : StrongRankCondition R
inst✝² : IsDomain R
inst✝¹ : Module R V
inst✝ : Module.Finite R V
⊢ finrank R V = 0 ↔ ↑(finrank R V) = 0

Next tactic:
norm_cast
/-- A finite dimensional space has zero `finrank` iff it is a subsingleton.
This is the `finrank` version of `rank_zero_iff`. -/
theorem FiniteDimensional.finrank_zero_iff [Module.Finite R V] [NoZeroSMulDivisors R V] :
    finrank R V = 0 ↔ Subsingleton V :=
  Iff.trans
    (by 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
⊢ finrank R V = 0 ↔ Module.rank R V = 0

Next tactic:
rw [← finrank_eq_rank]
/-- A finite dimensional space has zero `finrank` iff it is a subsingleton.
This is the `finrank` version of `rank_zero_iff`. -/
theorem FiniteDimensional.finrank_zero_iff [Module.Finite R V] [NoZeroSMulDivisors R V] :
    finrank R V = 0 ↔ Subsingleton V :=
  Iff.trans
    (by rw [← finrank_eq_rank]; 

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
⊢ finrank R V = 0 ↔ ↑(finrank R V) = 0

Next tactic:
norm_cast
theorem CompleteLattice.Independent.subtype_ne_bot_le_finrank_aux [Module.Finite R V]
    [NoZeroSMulDivisors R V]
    {ι : Type w} {p : ι → Submodule R V} (hp : CompleteLattice.Independent p) :
    #{ i // p i ≠ ⊥ } ≤ (finrank R V : Cardinal.{w}) := by
  

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
K : ?m.297683
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
ι : Type w
p : ι → Submodule R V
hp : Independent p
⊢ #{ i // p i ≠ ⊥ } ≤ ↑(finrank R V)

Next tactic:
suffices Cardinal.lift.{v} #{ i // p i ≠ ⊥ } ≤ Cardinal.lift.{v} (finrank R V : Cardinal.{w}) by
    rwa [Cardinal.lift_le] at this
theorem CompleteLattice.Independent.subtype_ne_bot_le_finrank_aux [Module.Finite R V]
    [NoZeroSMulDivisors R V]
    {ι : Type w} {p : ι → Submodule R V} (hp : CompleteLattice.Independent p) :
    #{ i // p i ≠ ⊥ } ≤ (finrank R V : Cardinal.{w}) := by
  suffices Cardinal.lift.{v} #{ i // p i ≠ ⊥ } ≤ Cardinal.lift.{v} (finrank R V : Cardinal.{w}) by
    

Proof state:
R : Type u
M : Type v
N : Type w
V : Type v
inst✝⁷ : AddCommGroup V
V₂ : Type v'
inst✝⁶ : AddCommGroup V₂
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
inst✝³ : Module R V
inst✝² : Free R V
K : ?m.297683
inst✝¹ : Module.Finite R V
inst✝ : NoZeroSMulDivisors R V
ι : Type w
p : ι → Submodule R V
hp : Independent p
this : Cardinal.lift.{v, w} #{ i // p i ≠ ⊥ } ≤ Cardinal.lift.{v, w} ↑(finrank R V)
⊢ #{ i // p i ≠ ⊥ } ≤ ↑(finrank R V)

Next tactic:
rwa [Cardinal.lift_le] at this