Theorem: Module.finite_of_fg_torsion
File: Mathlib/GroupTheory/FiniteAbelian.lean

Proof steps:
state_before: M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
⊢ _root_.Finite M
state_after: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
⊢ _root_.Finite M
tactic: rcases Module.equiv_directSum_of_isTorsion hM with ⟨ι, _, p, h, e, ⟨l⟩⟩
state_before: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
⊢ _root_.Finite M
state_after: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
this : ∀ (i : ι), NeZero (p i ^ e i).natAbs
⊢ _root_.Finite M
tactic: haveI : ∀ i : ι, NeZero (p i ^ e i).natAbs := fun i =>
    ⟨Int.natAbs_ne_zero.mpr <| pow_ne_zero (e i) (h i).ne_zero⟩
state_before: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
this : ∀ (i : ι), NeZero (p i ^ e i).natAbs
⊢ _root_.Finite M
state_after: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
this✝ : ∀ (i : ι), NeZero (p i ^ e i).natAbs
this : ∀ (i : ι), _root_.Finite (ℤ ⧸ Submodule.span ℤ {p i ^ e i})
⊢ _root_.Finite M
tactic: haveI : ∀ i : ι, _root_.Finite <| ℤ ⧸ Submodule.span ℤ {p i ^ e i} := fun i =>
    Finite.of_equiv _ (p i ^ e i).quotientSpanEquivZMod.symm.toEquiv
state_before: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
this✝ : ∀ (i : ι), NeZero (p i ^ e i).natAbs
this : ∀ (i : ι), _root_.Finite (ℤ ⧸ Submodule.span ℤ {p i ^ e i})
⊢ _root_.Finite M
state_after: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
this✝¹ : ∀ (i : ι), NeZero (p i ^ e i).natAbs
this✝ : ∀ (i : ι), _root_.Finite (ℤ ⧸ Submodule.span ℤ {p i ^ e i})
this : _root_.Finite (⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i})
⊢ _root_.Finite M
tactic: haveI : _root_.Finite (⨁ i, ℤ ⧸ (Submodule.span ℤ {p i ^ e i} : Submodule ℤ ℤ)) :=
    Finite.of_equiv _ DFinsupp.equivFunOnFintype.symm
state_before: case intro.intro.intro.intro.intro.intro
M : Type u
inst✝² : AddCommGroup M
inst✝¹ : Module ℤ M
inst✝ : Finite ℤ M
hM : IsTorsion ℤ M
ι : Type
w✝ : Fintype ι
p : ι → ℤ
h : ∀ (i : ι), Irreducible (p i)
e : ι → ℕ
l : M ≃ₗ[ℤ] ⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i}
this✝¹ : ∀ (i : ι), NeZero (p i ^ e i).natAbs
this✝ : ∀ (i : ι), _root_.Finite (ℤ ⧸ Submodule.span ℤ {p i ^ e i})
this : _root_.Finite (⨁ (i : ι), ℤ ⧸ Submodule.span ℤ {p i ^ e i})
⊢ _root_.Finite M
state_after: no goals
tactic: exact Finite.of_equiv _ l.symm.toEquiv