Theorem: Subgroup.fg_iff_submonoid_fg
File: Mathlib/GroupTheory/Finiteness.lean

tactic: constructor
state_before: M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
⊢ FG P ↔ Submonoid.FG P.toSubmonoid

tactic: rintro ⟨S, rfl⟩
state_before: case mp
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
⊢ FG P → Submonoid.FG P.toSubmonoid

tactic: rw [Submonoid.fg_iff]
state_before: case mp.intro
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
S : Finset G
⊢ Submonoid.FG (closure ↑S).toSubmonoid

tactic: refine' ⟨S ∪ S⁻¹, _, S.finite_toSet.union S.finite_toSet.inv⟩
state_before: case mp.intro
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
S : Finset G
⊢ ∃ S_1, Submonoid.closure S_1 = (closure ↑S).toSubmonoid ∧ Set.Finite S_1

tactic: exact (Subgroup.closure_toSubmonoid _).symm
state_before: case mp.intro
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
S : Finset G
⊢ Submonoid.closure (↑S ∪ (↑S)⁻¹) = (closure ↑S).toSubmonoid

tactic: rintro ⟨S, hS⟩
state_before: case mpr
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
⊢ Submonoid.FG P.toSubmonoid → FG P

tactic: refine' ⟨S, le_antisymm _ _⟩
state_before: case mpr.intro
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
S : Finset G
hS : Submonoid.closure ↑S = P.toSubmonoid
⊢ FG P

tactic: rw [Subgroup.closure_le, ← Subgroup.coe_toSubmonoid, ← hS]
state_before: case mpr.intro.refine'_1
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
S : Finset G
hS : Submonoid.closure ↑S = P.toSubmonoid
⊢ closure ↑S ≤ P

tactic: exact Submonoid.subset_closure
state_before: case mpr.intro.refine'_1
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
S : Finset G
hS : Submonoid.closure ↑S = P.toSubmonoid
⊢ ↑S ⊆ ↑(Submonoid.closure ↑S)

tactic: rw [← Subgroup.toSubmonoid_le, ← hS, Submonoid.closure_le]
state_before: case mpr.intro.refine'_2
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
S : Finset G
hS : Submonoid.closure ↑S = P.toSubmonoid
⊢ P ≤ closure ↑S

tactic: exact Subgroup.subset_closure
state_before: case mpr.intro.refine'_2
M : Type ?u.69638
N : Type ?u.69641
inst✝³ : Monoid M
inst✝² : AddMonoid N
G : Type u_1
H : Type ?u.69653
inst✝¹ : Group G
inst✝ : AddGroup H
P : Subgroup G
S : Finset G
hS : Submonoid.closure ↑S = P.toSubmonoid
⊢ ↑S ⊆ ↑(closure ↑S).toSubmonoid