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

tactic: rw [cons_eq_rcons, of_smul_def, equivPair_eq_of_fstIdx_ne _]
state_before: ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ { toList := { fst := i, snd := m } :: ls, ne_one := h1, chain_ne := h2 } = ↑of m • FreeProduct.Word.mkAux ls h1 h2

tactic: . simp
state_before: ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ rcons
      { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) } =
    rcons
      (let src := { head := 1, tail := FreeProduct.Word.mkAux ls h1 h2, fstIdx_ne := ?m.453010 };
      { head := m * { head := 1, tail := FreeProduct.Word.mkAux ls h1 h2, fstIdx_ne := ?m.453010 }.head,
        tail := src.tail, fstIdx_ne := (_ : fstIdx src.tail ≠ some i) })

ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i

tactic: . rw [fstIdx_ne_iff]
  exact (List.chain'_cons'.1 h2).1
state_before: ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i

tactic: simp
state_before: ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ rcons
      { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) } =
    rcons
      (let src := { head := 1, tail := FreeProduct.Word.mkAux ls h1 h2, fstIdx_ne := ?m.453010 };
      { head := m * { head := 1, tail := FreeProduct.Word.mkAux ls h1 h2, fstIdx_ne := ?m.453010 }.head,
        tail := src.tail, fstIdx_ne := (_ : fstIdx src.tail ≠ some i) })

tactic: rw [fstIdx_ne_iff]
state_before: ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i

tactic: exact (List.chain'_cons'.1 h2).1
state_before: ι : Type u_2
M : ι → Type u_1
inst✝³ : (i : ι) → Monoid (M i)
N : Type ?u.440478
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
ls : List ((i : ι) × 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)
⊢ ∀ (l : (i : ι) × M i), l ∈ List.head? (FreeProduct.Word.mkAux ls h1 h2).toList → i ≠ l.fst