Theorem: AddSubmonoid.FG.map_injective
File: Mathlib/GroupTheory/Finiteness.lean

Proof steps:
state_before: M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
h : (Submonoid.map e P).FG
⊢ P.FG
state_after: case intro
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ P.FG
tactic: obtain ⟨s, hs⟩ := h
state_before: case intro
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ P.FG
state_after: case h
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ closure ↑(s.preimage ⇑e ⋯) = P
tactic: use s.preimage e he.injOn
state_before: case h
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ closure ↑(s.preimage ⇑e ⋯) = P
state_after: case h.a
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ Submonoid.map e (closure ↑(s.preimage ⇑e ⋯)) = Submonoid.map e P
tactic: apply Submonoid.map_injective_of_injective he
state_before: case h.a
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ Submonoid.map e (closure ↑(s.preimage ⇑e ⋯)) = Submonoid.map e P
state_after: case h.a
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ closure (⇑e '' (⇑e ⁻¹' ↑s)) = closure ↑s
tactic: rw [← hs, MonoidHom.map_mclosure e, Finset.coe_preimage]
state_before: case h.a
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ closure (⇑e '' (⇑e ⁻¹' ↑s)) = closure ↑s
state_after: case h.a.e_s
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ ⇑e '' (⇑e ⁻¹' ↑s) = ↑s
tactic: congr
state_before: case h.a.e_s
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ ⇑e '' (⇑e ⁻¹' ↑s) = ↑s
state_after: case h.a.e_s
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ Submonoid.map e P ≤ Submonoid.map e ⊤
tactic: rw [Set.image_preimage_eq_iff, ← MonoidHom.coe_mrange e, ← Submonoid.closure_le, hs,
      MonoidHom.mrange_eq_map e]
state_before: case h.a.e_s
M : Type u_1
N : Type u_2
inst✝² : Monoid M
inst✝¹ : AddMonoid N
M' : Type u_3
inst✝ : Monoid M'
P : Submonoid M
e : M →* M'
he : Function.Injective ⇑e
s : Finset M'
hs : closure ↑s = Submonoid.map e P
⊢ Submonoid.map e P ≤ Submonoid.map e ⊤
state_after: no goals
tactic: exact Submonoid.monotone_map le_top