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

tactic: rw [rcons, dif_neg]
state_before: ι : Type u_2
M : ι → Type u_1
inst✝² : (i : ι) → Monoid (M i)
N : Type ?u.391229
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
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 } =
    rcons
      { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }

tactic: rfl
state_before: ι : Type u_2
M : ι → Type u_1
inst✝² : (i : ι) → Monoid (M i)
N : Type ?u.391229
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
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 } =
    {
      toList :=
        { fst := i,
            snd :=
              { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
                  fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.head } ::
          { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
                fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.tail.toList,
      ne_one :=
        (_ :
          ∀ (l : (i : ι) × M i),
            l ∈
                { fst := i,
                    snd :=
                      { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
                          fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.head } ::
                  { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
                        fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.tail.toList →
              l.snd ≠ 1),
      chain_ne :=
        (_ :
          List.Chain' (fun l l' => l.fst ≠ l'.fst)
            ({ fst := i,
                snd :=
                  { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
                      fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.head } ::
              { head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
                    fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.tail.toList)) }

case hnc
ι : Type u_2
M : ι → Type u_1
inst✝² : (i : ι) → Monoid (M i)
N : Type ?u.391229
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
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)
⊢ ¬{ head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
          fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.head =
      1

tactic: exact h1 ⟨i, m⟩ (ls.mem_cons_self _)
state_before: case hnc
ι : Type u_2
M : ι → Type u_1
inst✝² : (i : ι) → Monoid (M i)
N : Type ?u.391229
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
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)
⊢ ¬{ head := m, tail := FreeProduct.Word.mkAux ls h1 h2,
          fstIdx_ne := (_ : fstIdx (FreeProduct.Word.mkAux ls h1 h2) ≠ some i) }.head =
      1