Theorem: Submonoid.closure_induction_left
File: Mathlib/Algebra/Group/Submonoid/Membership.lean

tactic: simp_rw [closure_eq_mrange] at h
state_before: M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : M
h : x ∈ closure s
⊢ p x h
state_after: M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : M
h✝ : x ∈ closure s
h : x ∈ mrange (FreeMonoid.lift Subtype.val)
⊢ p x h✝

tactic: obtain ⟨l, rfl⟩ := h
state_before: M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : M
h✝ : x ∈ closure s
h : x ∈ mrange (FreeMonoid.lift Subtype.val)
⊢ p x h✝
state_after: case intro
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
l : FreeMonoid { x // x ∈ s }
h : (FreeMonoid.lift Subtype.val) l ∈ closure s
⊢ p ((FreeMonoid.lift Subtype.val) l) h

tactic: induction' l with x y ih
state_before: case intro
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
l : FreeMonoid { x // x ∈ s }
h : (FreeMonoid.lift Subtype.val) l ∈ closure s
⊢ p ((FreeMonoid.lift Subtype.val) l) h
state_after: case intro.h0
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
h : (FreeMonoid.lift Subtype.val) 1 ∈ closure s
⊢ p ((FreeMonoid.lift Subtype.val) 1) h

case intro.ih
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : { x // x ∈ s }
y : FreeMonoid { x // x ∈ s }
ih : ∀ (h : (FreeMonoid.lift Subtype.val) y ∈ closure s), p ((FreeMonoid.lift Subtype.val) y) h
h : (FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y) ∈ closure s
⊢ p ((FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y)) h

tactic: exact one
state_before: case intro.h0
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
h : (FreeMonoid.lift Subtype.val) 1 ∈ closure s
⊢ p ((FreeMonoid.lift Subtype.val) 1) h
state_after: no goals

tactic: simp only [map_mul, FreeMonoid.lift_eval_of]
state_before: case intro.ih
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : { x // x ∈ s }
y : FreeMonoid { x // x ∈ s }
ih : ∀ (h : (FreeMonoid.lift Subtype.val) y ∈ closure s), p ((FreeMonoid.lift Subtype.val) y) h
h : (FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y) ∈ closure s
⊢ p ((FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y)) h
state_after: case intro.ih
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : { x // x ∈ s }
y : FreeMonoid { x // x ∈ s }
ih : ∀ (h : (FreeMonoid.lift Subtype.val) y ∈ closure s), p ((FreeMonoid.lift Subtype.val) y) h
h : (FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y) ∈ closure s
⊢ p (↑x * (FreeMonoid.lift Subtype.val) y) ⋯

tactic: refine mul_left _ x.prop (FreeMonoid.lift Subtype.val y) _ (ih ?_)
state_before: case intro.ih
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : { x // x ∈ s }
y : FreeMonoid { x // x ∈ s }
ih : ∀ (h : (FreeMonoid.lift Subtype.val) y ∈ closure s), p ((FreeMonoid.lift Subtype.val) y) h
h : (FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y) ∈ closure s
⊢ p (↑x * (FreeMonoid.lift Subtype.val) y) ⋯
state_after: case intro.ih
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : { x // x ∈ s }
y : FreeMonoid { x // x ∈ s }
ih : ∀ (h : (FreeMonoid.lift Subtype.val) y ∈ closure s), p ((FreeMonoid.lift Subtype.val) y) h
h : (FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y) ∈ closure s
⊢ (FreeMonoid.lift Subtype.val) y ∈ closure s

tactic: simp only [closure_eq_mrange, mem_mrange, exists_apply_eq_apply]
state_before: case intro.ih
M : Type u_1
A : Type u_2
B : Type u_3
inst✝ : Monoid M
a : M
s : Set M
p : (m : M) → m ∈ closure s → Prop
one : p 1 ⋯
mul_left : ∀ (x : M) (hx : x ∈ s) (y : M) (hy : y ∈ closure s), p y hy → p (x * y) ⋯
x : { x // x ∈ s }
y : FreeMonoid { x // x ∈ s }
ih : ∀ (h : (FreeMonoid.lift Subtype.val) y ∈ closure s), p ((FreeMonoid.lift Subtype.val) y) h
h : (FreeMonoid.lift Subtype.val) (FreeMonoid.of x * y) ∈ closure s
⊢ (FreeMonoid.lift Subtype.val) y ∈ closure s
state_after: no goals