Theorem: FreeProduct.Word.smul_induction
File: Mathlib/GroupTheory/FreeProduct.lean

tactic: cases' w with ls h1 h2
state_before: ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.454455
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
C : Word M → Prop
h_empty : C empty
h_smul : ∀ (i : ι) (m : M i) (w : Word M), C w → C (↑of m • w)
w : Word M
⊢ C w

tactic: induction' ls with l ls ih
state_before: case mk
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.454455
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
C : Word M → Prop
h_empty : C empty
h_smul : ∀ (i : ι) (m : M i) (w : Word M), C w → C (↑of m • w)
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls
⊢ C { toList := ls, ne_one := h1, chain_ne := h2 }

tactic: cases' l with i m
state_before: case mk.cons
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.454455
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
C : Word M → Prop
h_empty : C empty
h_smul : ∀ (i : ι) (m : M i) (w : Word M), C w → C (↑of m • w)
ls✝ : List ((i : ι) × M i)
h1✝ : ∀ (l : (i : ι) × M i), l ∈ ls✝ → l.snd ≠ 1
h2✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls✝
l : (i : ι) × M i
ls : List ((i : ι) × M i)
ih :
  ∀ (h1 : ∀ (l : (i : ι) × M i), l ∈ ls → l.snd ≠ 1) (h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls),
    C { toList := ls, ne_one := h1, chain_ne := h2 }
h1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l :: ls → l_1.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) (l :: ls)
⊢ C { toList := l :: ls, ne_one := h1, chain_ne := h2 }

tactic: rw [cons_eq_smul]
state_before: case mk.cons.mk
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.454455
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
C : Word M → Prop
h_empty : C empty
h_smul : ∀ (i : ι) (m : M i) (w : Word M), C w → C (↑of m • w)
ls✝ : List ((i : ι) × M i)
h1✝ : ∀ (l : (i : ι) × M i), l ∈ ls✝ → l.snd ≠ 1
h2✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls✝
ls : List ((i : ι) × M i)
ih :
  ∀ (h1 : ∀ (l : (i : ι) × M i), l ∈ ls → l.snd ≠ 1) (h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls),
    C { toList := ls, ne_one := h1, chain_ne := h2 }
i : ι
m : M i
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := i, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := i, snd := m } :: ls)
⊢ C { toList := { fst := i, snd := m } :: ls, ne_one := h1, chain_ne := h2 }

tactic: exact h_smul _ _ _ (ih _ _)
state_before: case mk.cons.mk
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.454455
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
C : Word M → Prop
h_empty : C empty
h_smul : ∀ (i : ι) (m : M i) (w : Word M), C w → C (↑of m • w)
ls✝ : List ((i : ι) × M i)
h1✝ : ∀ (l : (i : ι) × M i), l ∈ ls✝ → l.snd ≠ 1
h2✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls✝
ls : List ((i : ι) × M i)
ih :
  ∀ (h1 : ∀ (l : (i : ι) × M i), l ∈ ls → l.snd ≠ 1) (h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls),
    C { toList := ls, ne_one := h1, chain_ne := h2 }
i : ι
m : M i
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := i, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := i, snd := m } :: ls)
⊢ C (↑of m • FreeProduct.Word.mkAux ls h1 h2)

tactic: exact h_empty
state_before: case mk.nil
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.454455
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
C : Word M → Prop
h_empty : C empty
h_smul : ∀ (i : ι) (m : M i) (w : Word M), C w → C (↑of m • w)
ls : List ((i : ι) × M i)
h1✝ : ∀ (l : (i : ι) × M i), l ∈ ls → l.snd ≠ 1
h2✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) ls
h1 : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) []
⊢ C { toList := [], ne_one := h1, chain_ne := h2 }