Theorem: Group.rank_le_of_surjective
File: Mathlib/GroupTheory/Finiteness.lean

tactic: obtain ⟨S, hS1, hS2⟩ := Group.rank_spec G
state_before: M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
⊢ rank G' ≤ rank G
state_after: case intro.intro
M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ rank G' ≤ rank G

tactic: trans (S.image f).card
state_before: case intro.intro
M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ rank G' ≤ rank G
state_after: M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ rank G' ≤ (Finset.image (⇑f) S).card

M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ (Finset.image (⇑f) S).card ≤ rank G

tactic: apply Group.rank_le
state_before: M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ rank G' ≤ (Finset.image (⇑f) S).card
state_after: case hS
M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ Subgroup.closure ↑(Finset.image (⇑f) S) = ⊤

tactic: rw [Finset.coe_image, ← MonoidHom.map_closure, hS2, Subgroup.map_top_of_surjective f hf]
state_before: case hS
M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ Subgroup.closure ↑(Finset.image (⇑f) S) = ⊤
state_after: no goals

tactic: exact Finset.card_image_le.trans_eq hS1
state_before: M : Type u_1
N : Type u_2
inst✝⁶ : Monoid M
inst✝⁵ : AddMonoid N
G : Type u_3
H : Type u_4
inst✝⁴ : Group G
inst✝³ : AddGroup H
G' : Type u_5
inst✝² : Group G'
inst✝¹ : FG G
inst✝ : FG G'
f : G →* G'
hf : Function.Surjective ⇑f
S : Finset G
hS1 : S.card = rank G
hS2 : Subgroup.closure ↑S = ⊤
⊢ (Finset.image (⇑f) S).card ≤ rank G
state_after: no goals