Theorem: Group.image_closure
File: Mathlib/Deprecated/Subgroup.lean

tactic: rintro _ ⟨x, hx, rfl⟩
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
⊢ f '' closure s ≤ closure (f '' s)
state_after: case intro.intro
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ f x ∈ closure (f '' s)

tactic: exact InClosure.recOn hx
  (by intros _ ha; exact subset_closure (mem_image_of_mem f ha))
  (by
    rw [hf.map_one]
    apply IsSubmonoid.one_mem (closure.isSubgroup _).toIsSubmonoid)
  (by
    intros _ _
    rw [hf.map_inv]
    apply IsSubgroup.inv_mem (closure.isSubgroup _))
  (by
    intros _ _ _ _ ha hb
    rw [hf.map_mul]
    exact (closure.isSubgroup (f '' s)).toIsSubmonoid.mul_mem ha hb)
state_before: case intro.intro
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ f x ∈ closure (f '' s)
state_after: no goals

tactic: intros _ ha
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ ∀ {a : G}, a ∈ s → f a ∈ closure (f '' s)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝ : G
ha : a✝ ∈ s
⊢ f a✝ ∈ closure (f '' s)

tactic: exact subset_closure (mem_image_of_mem f ha)
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝ : G
ha : a✝ ∈ s
⊢ f a✝ ∈ closure (f '' s)
state_after: no goals

tactic: rw [hf.map_one]
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ f 1 ∈ closure (f '' s)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ 1 ∈ closure (f '' s)

tactic: apply IsSubmonoid.one_mem (closure.isSubgroup _).toIsSubmonoid
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ 1 ∈ closure (f '' s)
state_after: no goals

tactic: intros _ _
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ ∀ {a : G}, InClosure s a → f a ∈ closure (f '' s) → f a⁻¹ ∈ closure (f '' s)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝¹ : G
a✝ : InClosure s a✝¹
⊢ f a✝¹ ∈ closure (f '' s) → f a✝¹⁻¹ ∈ closure (f '' s)

tactic: rw [hf.map_inv]
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝¹ : G
a✝ : InClosure s a✝¹
⊢ f a✝¹ ∈ closure (f '' s) → f a✝¹⁻¹ ∈ closure (f '' s)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝¹ : G
a✝ : InClosure s a✝¹
⊢ f a✝¹ ∈ closure (f '' s) → (f a✝¹)⁻¹ ∈ closure (f '' s)

tactic: apply IsSubgroup.inv_mem (closure.isSubgroup _)
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝¹ : G
a✝ : InClosure s a✝¹
⊢ f a✝¹ ∈ closure (f '' s) → (f a✝¹)⁻¹ ∈ closure (f '' s)
state_after: no goals

tactic: intros _ _ _ _ ha hb
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ ∀ {a b : G},
    InClosure s a → InClosure s b → f a ∈ closure (f '' s) → f b ∈ closure (f '' s) → f (a * b) ∈ closure (f '' s)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
ha : f a✝² ∈ closure (f '' s)
hb : f b✝ ∈ closure (f '' s)
⊢ f (a✝² * b✝) ∈ closure (f '' s)

tactic: rw [hf.map_mul]
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
ha : f a✝² ∈ closure (f '' s)
hb : f b✝ ∈ closure (f '' s)
⊢ f (a✝² * b✝) ∈ closure (f '' s)
state_after: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
ha : f a✝² ∈ closure (f '' s)
hb : f b✝ ∈ closure (f '' s)
⊢ f a✝² * f b✝ ∈ closure (f '' s)

tactic: exact (closure.isSubgroup (f '' s)).toIsSubmonoid.mul_mem ha hb
state_before: G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
ha : f a✝² ∈ closure (f '' s)
hb : f b✝ ∈ closure (f '' s)
⊢ f a✝² * f b✝ ∈ closure (f '' s)
state_after: no goals