[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝ : (i : ι) → Monoid (M i)
⊢ Monoid (Monoid.CoprodI M)
[PROOFSTEP]
delta Monoid.CoprodI
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝ : (i : ι) → Monoid (M i)
⊢ Monoid (Con.Quotient (conGen (Monoid.CoprodI.Rel M)))
[PROOFSTEP]
infer_instance
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
f g : CoprodI M →* N
h : ∀ (i : ι), MonoidHom.comp f of = MonoidHom.comp g of
x✝ : (i : ι) × M i
i : ι
x : M i
⊢ ↑(MonoidHom.comp f (Con.mk' (conGen (Rel M)))) (FreeMonoid.of { fst := i, snd := x }) =
    ↑(MonoidHom.comp g (Con.mk' (conGen (Rel M)))) (FreeMonoid.of { fst := i, snd := x })
[PROOFSTEP]
rw [MonoidHom.comp_apply, MonoidHom.comp_apply, ← of_apply, ← MonoidHom.comp_apply, ← MonoidHom.comp_apply, h]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
⊢ ∀ (x y : FreeMonoid ((i : ι) × M i)), Rel M x y → Setoid.r x y
[PROOFSTEP]
simp_rw [Con.rel_eq_coe, Con.ker_rel]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
⊢ ∀ (x y : FreeMonoid ((i : ι) × M i)),
    Rel M x y → ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) x = ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) y
[PROOFSTEP]
rintro _ _ (i | ⟨x, y⟩)
[GOAL]
case of_one
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
⊢ ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) (FreeMonoid.of { fst := i, snd := 1 }) =
    ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) 1
[PROOFSTEP]
change FreeMonoid.lift _ (FreeMonoid.of _) = FreeMonoid.lift _ 1
[GOAL]
case of_one
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
⊢ ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) (FreeMonoid.of { fst := i, snd := 1 }) =
    ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) 1
[PROOFSTEP]
simp only [MonoidHom.map_one, FreeMonoid.lift_eval_of]
[GOAL]
case of_mul
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i✝ : ι
x y : M i✝
⊢ ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
      (FreeMonoid.of { fst := i✝, snd := x } * FreeMonoid.of { fst := i✝, snd := y }) =
    ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) (FreeMonoid.of { fst := i✝, snd := x * y })
[PROOFSTEP]
change FreeMonoid.lift _ (FreeMonoid.of _ * FreeMonoid.of _) = FreeMonoid.lift _ (FreeMonoid.of _)
[GOAL]
case of_mul
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i✝ : ι
x y : M i✝
⊢ ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
      (FreeMonoid.of { fst := i✝, snd := x } * FreeMonoid.of { fst := i✝, snd := y }) =
    ↑(↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd) (FreeMonoid.of { fst := i✝, snd := x * y })
[PROOFSTEP]
simp only [MonoidHom.map_mul, FreeMonoid.lift_eval_of]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
⊢ Function.LeftInverse (fun f i => MonoidHom.comp f of) fun fi =>
    Con.lift (conGen (Rel M)) (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
      (_ : conGen (Rel M) ≤ Con.ker (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd))
[PROOFSTEP]
intro fi
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
⊢ (fun f i => MonoidHom.comp f of)
      ((fun fi =>
          Con.lift (conGen (Rel M)) (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
            (_ : conGen (Rel M) ≤ Con.ker (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)))
        fi) =
    fi
[PROOFSTEP]
ext i x
[GOAL]
case h.h
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
x : M i
⊢ ↑((fun f i => MonoidHom.comp f of)
          ((fun fi =>
              Con.lift (conGen (Rel M)) (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
                (_ : conGen (Rel M) ≤ Con.ker (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)))
            fi)
          i)
      x =
    ↑(fi i) x
[PROOFSTEP]
rw [MonoidHom.comp_apply, of_apply, Con.lift_mk', FreeMonoid.lift_eval_of]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
⊢ Function.RightInverse (fun f i => MonoidHom.comp f of) fun fi =>
    Con.lift (conGen (Rel M)) (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
      (_ : conGen (Rel M) ≤ Con.ker (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd))
[PROOFSTEP]
intro f
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
f : CoprodI M →* N
⊢ (fun fi =>
        Con.lift (conGen (Rel M)) (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
          (_ : conGen (Rel M) ≤ Con.ker (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)))
      ((fun f i => MonoidHom.comp f of) f) =
    f
[PROOFSTEP]
ext i x
[GOAL]
case h.h
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
f : CoprodI M →* N
i : ι
x : M i
⊢ ↑(MonoidHom.comp
          ((fun fi =>
              Con.lift (conGen (Rel M)) (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)
                (_ : conGen (Rel M) ≤ Con.ker (↑FreeMonoid.lift fun p => ↑(fi p.fst) p.snd)))
            ((fun f i => MonoidHom.comp f of) f))
          of)
      x =
    ↑(MonoidHom.comp f of) x
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
m : M i
⊢ ↑(↑lift fi) (↑of m) = ↑(fi i) m
[PROOFSTEP]
conv_rhs => rw [← lift.symm_apply_apply fi, lift_symm_apply, MonoidHom.comp_apply]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
m : M i
| ↑(fi i) m
[PROOFSTEP]
rw [← lift.symm_apply_apply fi, lift_symm_apply, MonoidHom.comp_apply]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
m : M i
| ↑(fi i) m
[PROOFSTEP]
rw [← lift.symm_apply_apply fi, lift_symm_apply, MonoidHom.comp_apply]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
fi : (i : ι) → M i →* N
i : ι
m : M i
| ↑(fi i) m
[PROOFSTEP]
rw [← lift.symm_apply_apply fi, lift_symm_apply, MonoidHom.comp_apply]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
⊢ C m
[PROOFSTEP]
let S : Submonoid (CoprodI M) :=
  { carrier := setOf C
    mul_mem' := h_mul _ _
    one_mem' := h_one }
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
S : Submonoid (CoprodI M) :=
  { toSubsemigroup := { carrier := setOf C, mul_mem' := (_ : ∀ {a b : CoprodI M}, C a → C b → C (a * b)) },
    one_mem' := h_one }
⊢ C m
[PROOFSTEP]
have : C _ := Subtype.prop (lift (fun i => of.codRestrict S (h_of i)) m)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
S : Submonoid (CoprodI M) :=
  { toSubsemigroup := { carrier := setOf C, mul_mem' := (_ : ∀ {a b : CoprodI M}, C a → C b → C (a * b)) },
    one_mem' := h_one }
this : C ↑(↑(↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))) m)
⊢ C m
[PROOFSTEP]
convert this
[GOAL]
case h.e'_1
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
S : Submonoid (CoprodI M) :=
  { toSubsemigroup := { carrier := setOf C, mul_mem' := (_ : ∀ {a b : CoprodI M}, C a → C b → C (a * b)) },
    one_mem' := h_one }
this : C ↑(↑(↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))) m)
⊢ m = ↑(↑(↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))) m)
[PROOFSTEP]
change MonoidHom.id _ m = S.subtype.comp _ m
[GOAL]
case h.e'_1
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
S : Submonoid (CoprodI M) :=
  { toSubsemigroup := { carrier := setOf C, mul_mem' := (_ : ∀ {a b : CoprodI M}, C a → C b → C (a * b)) },
    one_mem' := h_one }
this : C ↑(↑(↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))) m)
⊢ ↑(MonoidHom.id (CoprodI M)) m =
    ↑(MonoidHom.comp (Submonoid.subtype S) (↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m)))) m
[PROOFSTEP]
congr
[GOAL]
case h.e'_1.e_a
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
S : Submonoid (CoprodI M) :=
  { toSubsemigroup := { carrier := setOf C, mul_mem' := (_ : ∀ {a b : CoprodI M}, C a → C b → C (a * b)) },
    one_mem' := h_one }
this : C ↑(↑(↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))) m)
⊢ MonoidHom.id (CoprodI M) =
    MonoidHom.comp (Submonoid.subtype S) (↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m)))
[PROOFSTEP]
ext i
[GOAL]
case h.e'_1.e_a.h.h
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
C : CoprodI M → Prop
m : CoprodI M
h_one : C 1
h_of : ∀ (i : ι) (m : M i), C (↑of m)
h_mul : ∀ (x y : CoprodI M), C x → C y → C (x * y)
S : Submonoid (CoprodI M) :=
  { toSubsemigroup := { carrier := setOf C, mul_mem' := (_ : ∀ {a b : CoprodI M}, C a → C b → C (a * b)) },
    one_mem' := h_one }
this : C ↑(↑(↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))) m)
i : ι
x✝ : M i
⊢ ↑(MonoidHom.comp (MonoidHom.id (CoprodI M)) of) x✝ =
    ↑(MonoidHom.comp
          (MonoidHom.comp (Submonoid.subtype S)
            (↑lift fun i => MonoidHom.codRestrict of S (_ : ∀ (m : M i), C (↑of m))))
          of)
      x✝
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : DecidableEq ι
i : ι
x : M i
⊢ ↑(↑lift (Pi.mulSingle i (MonoidHom.id (M i)))) (↑of x) = x
[PROOFSTEP]
simp only [lift_of, Pi.mulSingle_eq_same, MonoidHom.id_apply]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i : ι
⊢ Function.Injective ↑of
[PROOFSTEP]
classical exact (of_leftInverse i).injective
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i : ι
⊢ Function.Injective ↑of
[PROOFSTEP]
exact (of_leftInverse i).injective
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
⊢ MonoidHom.mrange (↑lift f) ≤ s
[PROOFSTEP]
rintro _ ⟨x, rfl⟩
[GOAL]
case intro
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
x : CoprodI fun i => M i
⊢ ↑(↑lift f) x ∈ s
[PROOFSTEP]
induction' x using CoprodI.induction_on with i x x y hx hy
[GOAL]
case intro.h_one
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
⊢ ↑(↑lift f) 1 ∈ s
[PROOFSTEP]
exact s.one_mem
[GOAL]
case intro.h_of
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
i : ι
x : M i
⊢ ↑(↑lift f) (↑of x) ∈ s
[PROOFSTEP]
simp only [lift_of, SetLike.mem_coe]
[GOAL]
case intro.h_of
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
i : ι
x : M i
⊢ ↑(f i) x ∈ s
[PROOFSTEP]
exact h i (Set.mem_range_self x)
[GOAL]
case intro.h_mul
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
x y : CoprodI fun i => M i
hx : ↑(↑lift f) x ∈ s
hy : ↑(↑lift f) y ∈ s
⊢ ↑(↑lift f) (x * y) ∈ s
[PROOFSTEP]
simp only [map_mul, SetLike.mem_coe]
[GOAL]
case intro.h_mul
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
s : Submonoid N
h : ∀ (i : ι), MonoidHom.mrange (f i) ≤ s
x y : CoprodI fun i => M i
hx : ↑(↑lift f) x ∈ s
hy : ↑(↑lift f) y ∈ s
⊢ ↑(↑lift f) x * ↑(↑lift f) y ∈ s
[PROOFSTEP]
exact s.mul_mem hx hy
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
⊢ MonoidHom.mrange (↑lift f) = ⨆ (i : ι), MonoidHom.mrange (f i)
[PROOFSTEP]
apply le_antisymm (lift_mrange_le f fun i => le_iSup (fun i => MonoidHom.mrange (f i)) i)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
⊢ ⨆ (i : ι), MonoidHom.mrange (f i) ≤ MonoidHom.mrange (↑lift f)
[PROOFSTEP]
apply iSup_le _
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
⊢ ∀ (i : ι), MonoidHom.mrange (f i) ≤ MonoidHom.mrange (↑lift f)
[PROOFSTEP]
rintro i _ ⟨x, rfl⟩
[GOAL]
case intro
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
i : ι
x : M i
⊢ ↑(f i) x ∈ MonoidHom.mrange (↑lift f)
[PROOFSTEP]
exact ⟨of x, by simp only [lift_of]⟩
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝¹ : Monoid N✝
N : Type u_4
inst✝ : Monoid N
f : (i : ι) → M i →* N
i : ι
x : M i
⊢ ↑(↑lift f) (↑of x) = ↑(f i) x
[PROOFSTEP]
simp only [lift_of]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
⊢ ∀ (a : CoprodI G), a⁻¹ * a = 1
[PROOFSTEP]
intro m
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
m : CoprodI G
⊢ m⁻¹ * m = 1
[PROOFSTEP]
rw [inv_def]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
m : CoprodI G
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) m) *
      m =
    1
[PROOFSTEP]
induction m using CoprodI.induction_on with
| h_one => rw [MonoidHom.map_one, MulOpposite.unop_one, one_mul]
| h_of m ih =>
  change of _⁻¹ * of _ = 1
  rw [← of.map_mul, mul_left_inv, of.map_one]
| h_mul x y ihx ihy => rw [MonoidHom.map_mul, MulOpposite.unop_mul, mul_assoc, ← mul_assoc _ x y, ihx, one_mul, ihy]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
m : CoprodI G
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) m) *
      m =
    1
[PROOFSTEP]
induction m using CoprodI.induction_on with
| h_one => rw [MonoidHom.map_one, MulOpposite.unop_one, one_mul]
| h_of m ih =>
  change of _⁻¹ * of _ = 1
  rw [← of.map_mul, mul_left_inv, of.map_one]
| h_mul x y ihx ihy => rw [MonoidHom.map_mul, MulOpposite.unop_mul, mul_assoc, ← mul_assoc _ x y, ihx, one_mul, ihy]
[GOAL]
case h_one
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) 1) *
      1 =
    1
[PROOFSTEP]

| h_one => rw [MonoidHom.map_one, MulOpposite.unop_one, one_mul]
[GOAL]
case h_one
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) 1) *
      1 =
    1
[PROOFSTEP]
rw [MonoidHom.map_one, MulOpposite.unop_one, one_mul]
[GOAL]
case h_of
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
m : ι
ih : G m
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) (↑of ih)) *
      ↑of ih =
    1
[PROOFSTEP]

| h_of m ih =>
  change of _⁻¹ * of _ = 1
  rw [← of.map_mul, mul_left_inv, of.map_one]
[GOAL]
case h_of
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
m : ι
ih : G m
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) (↑of ih)) *
      ↑of ih =
    1
[PROOFSTEP]
change of _⁻¹ * of _ = 1
[GOAL]
case h_of
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
m : ι
ih : G m
⊢ ↑of { fst := m, snd := ih }.snd⁻¹ * ↑of ih = 1
[PROOFSTEP]
rw [← of.map_mul, mul_left_inv, of.map_one]
[GOAL]
case h_mul
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
x y : CoprodI G
ihx :
  MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) x) *
      x =
    1
ihy :
  MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) y) *
      y =
    1
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) (x * y)) *
      (x * y) =
    1
[PROOFSTEP]

| h_mul x y ihx ihy => rw [MonoidHom.map_mul, MulOpposite.unop_mul, mul_assoc, ← mul_assoc _ x y, ihx, one_mul, ihy]
[GOAL]
case h_mul
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
src✝¹ : Inv (CoprodI G) := inferInstanceAs (Inv (CoprodI G))
src✝ : Monoid (CoprodI G) := inferInstanceAs (Monoid (CoprodI G))
x y : CoprodI G
ihx :
  MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) x) *
      x =
    1
ihy :
  MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) y) *
      y =
    1
⊢ MulOpposite.unop
        (↑(↑lift fun i => MonoidHom.comp (↑MonoidHom.op of) (MulEquiv.toMonoidHom (MulEquiv.inv' (G i)))) (x * y)) *
      (x * y) =
    1
[PROOFSTEP]
rw [MonoidHom.map_mul, MulOpposite.unop_mul, mul_assoc, ← mul_assoc _ x y, ihx, one_mul, ihy]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
⊢ MonoidHom.range (↑lift f) ≤ s
[PROOFSTEP]
rintro _ ⟨x, rfl⟩
[GOAL]
case intro
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
x : CoprodI fun i => G i
⊢ ↑(↑lift f) x ∈ s
[PROOFSTEP]
induction' x using CoprodI.induction_on with i x x y hx hy
[GOAL]
case intro.h_one
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
⊢ ↑(↑lift f) 1 ∈ s
[PROOFSTEP]
exact s.one_mem
[GOAL]
case intro.h_of
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
i : ι
x : G i
⊢ ↑(↑lift f) (↑of x) ∈ s
[PROOFSTEP]
simp only [lift_of, SetLike.mem_coe]
[GOAL]
case intro.h_of
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
i : ι
x : G i
⊢ ↑(f i) x ∈ s
[PROOFSTEP]
exact h i (Set.mem_range_self x)
[GOAL]
case intro.h_mul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
x y : CoprodI fun i => G i
hx : ↑(↑lift f) x ∈ s
hy : ↑(↑lift f) y ∈ s
⊢ ↑(↑lift f) (x * y) ∈ s
[PROOFSTEP]
simp only [map_mul, SetLike.mem_coe]
[GOAL]
case intro.h_mul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
s : Subgroup N
h : ∀ (i : ι), MonoidHom.range (f i) ≤ s
x y : CoprodI fun i => G i
hx : ↑(↑lift f) x ∈ s
hy : ↑(↑lift f) y ∈ s
⊢ ↑(↑lift f) x * ↑(↑lift f) y ∈ s
[PROOFSTEP]
exact s.mul_mem hx hy
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
⊢ MonoidHom.range (↑lift f) = ⨆ (i : ι), MonoidHom.range (f i)
[PROOFSTEP]
apply le_antisymm (lift_range_le _ f fun i => le_iSup (fun i => MonoidHom.range (f i)) i)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
⊢ ⨆ (i : ι), MonoidHom.range (f i) ≤ MonoidHom.range (↑lift f)
[PROOFSTEP]
apply iSup_le _
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
⊢ ∀ (i : ι), MonoidHom.range (f i) ≤ MonoidHom.range (↑lift f)
[PROOFSTEP]
rintro i _ ⟨x, rfl⟩
[GOAL]
case intro
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
i : ι
x : G i
⊢ ↑(f i) x ∈ MonoidHom.range (↑lift f)
[PROOFSTEP]
exact ⟨of x, by simp only [lift_of]⟩
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N✝ : Type u_3
inst✝² : Monoid N✝
G : ι → Type u_4
inst✝¹ : (i : ι) → Group (G i)
N : Type u_5
inst✝ : Group N
f : (i : ι) → G i →* N
i : ι
x : G i
⊢ ↑(↑lift f) (↑of x) = ↑(f i) x
[PROOFSTEP]
simp only [lift_of]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
⊢ ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w : Word M
i : ι
⊢ ¬fstIdx w ≠ some i ↔ ¬∀ (l : (i : ι) × M i), l ∈ List.head? w.toList → i ≠ l.fst
[PROOFSTEP]
simp [fstIdx]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i : ι
⊢ fstIdx empty ≠ some i
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
h : ¬p.head = 1
⊢ ∀ (l : (i : ι) × M i), l ∈ { fst := i, snd := p.head } :: p.tail.toList → l.snd ≠ 1
[PROOFSTEP]
simp only [List.mem_cons]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
h : ¬p.head = 1
⊢ ∀ (l : (i : ι) × M i), l = { fst := i, snd := p.head } ∨ l ∈ p.tail.toList → l.snd ≠ 1
[PROOFSTEP]
rintro l (rfl | hl)
[GOAL]
case inl
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
h : ¬p.head = 1
⊢ { fst := i, snd := p.head }.snd ≠ 1
case inr
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
h : ¬p.head = 1
l : (i : ι) × M i
hl : l ∈ p.tail.toList
⊢ l.snd ≠ 1
[PROOFSTEP]
exact h
[GOAL]
case inr
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
h : ¬p.head = 1
l : (i : ι) × M i
hl : l ∈ p.tail.toList
⊢ l.snd ≠ 1
[PROOFSTEP]
exact p.tail.ne_one l hl
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
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 := Monoid.CoprodI.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }
[PROOFSTEP]
rw [rcons, dif_neg]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
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 := Monoid.CoprodI.Word.mkAux ls h1 h2,
                  fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.head } ::
          { head := m, tail := Monoid.CoprodI.Word.mkAux ls h1 h2,
                fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.tail.toList,
      ne_one :=
        (_ :
          ∀ (l : (i : ι) × M i),
            l ∈
                { fst := i,
                    snd :=
                      { head := m, tail := Monoid.CoprodI.Word.mkAux ls h1 h2,
                          fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.head } ::
                  { head := m, tail := Monoid.CoprodI.Word.mkAux ls h1 h2,
                        fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.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 := Monoid.CoprodI.Word.mkAux ls h1 h2,
                      fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.head } ::
              { head := m, tail := Monoid.CoprodI.Word.mkAux ls h1 h2,
                    fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.tail.toList)) }
case hnc
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
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 := Monoid.CoprodI.Word.mkAux ls h1 h2,
          fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.head =
      1
[PROOFSTEP]
rfl
[GOAL]
case hnc
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
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 := Monoid.CoprodI.Word.mkAux ls h1 h2,
          fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) }.head =
      1
[PROOFSTEP]
exact h1 ⟨i, m⟩ (ls.mem_cons_self _)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
hm : p.head = 1
⊢ prod (rcons p) = ↑of p.head * prod p.tail
[PROOFSTEP]
rw [rcons, dif_pos hm, hm, MonoidHom.map_one, one_mul]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
p : Pair M i
hm : ¬p.head = 1
⊢ prod (rcons p) = ↑of p.head * prod p.tail
[PROOFSTEP]
rw [rcons, dif_neg hm, prod, List.map_cons, List.prod_cons, prod]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
⊢ Function.Injective rcons
[PROOFSTEP]
rintro ⟨m, w, h⟩ ⟨m', w', h'⟩ he
[GOAL]
case mk.mk
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
by_cases hm : m = 1
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : m = 1
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
by_cases hm' : m' = 1
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : ¬m = 1
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
by_cases hm' : m' = 1
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : m = 1
hm' : m' = 1
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
simp only [rcons, dif_pos hm, dif_pos hm'] at he 
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
hm : m = 1
hm' : m' = 1
he : w = w'
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
aesop
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : m = 1
hm' : ¬m' = 1
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
exfalso
[GOAL]
case neg.h
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : m = 1
hm' : ¬m' = 1
⊢ False
[PROOFSTEP]
simp only [rcons, dif_pos hm, dif_neg hm'] at he 
[GOAL]
case neg.h
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
hm : m = 1
hm' : ¬m' = 1
he :
  w =
    { toList := { fst := i, snd := m' } :: w'.toList,
      ne_one :=
        (_ :
          ∀ (l : (i : ι) × M i),
            l ∈
                { fst := i, snd := { head := m', tail := w', fstIdx_ne := h' }.head } ::
                  { head := m', tail := w', fstIdx_ne := h' }.tail.toList →
              l.snd ≠ 1),
      chain_ne :=
        (_ :
          List.Chain' (fun l l' => l.fst ≠ l'.fst)
            ({ fst := i, snd := { head := m', tail := w', fstIdx_ne := h' }.head } ::
              { head := m', tail := w', fstIdx_ne := h' }.tail.toList)) }
⊢ False
[PROOFSTEP]
rw [he] at h 
[GOAL]
case neg.h
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
hm : m = 1
hm' : ¬m' = 1
h :
  fstIdx
      { toList := { fst := i, snd := m' } :: w'.toList,
        ne_one :=
          (_ :
            ∀ (l : (i : ι) × M i),
              l ∈
                  { fst := i, snd := { head := m', tail := w', fstIdx_ne := h' }.head } ::
                    { head := m', tail := w', fstIdx_ne := h' }.tail.toList →
                l.snd ≠ 1),
        chain_ne :=
          (_ :
            List.Chain' (fun l l' => l.fst ≠ l'.fst)
              ({ fst := i, snd := { head := m', tail := w', fstIdx_ne := h' }.head } ::
                { head := m', tail := w', fstIdx_ne := h' }.tail.toList)) } ≠
    some i
he :
  w =
    { toList := { fst := i, snd := m' } :: w'.toList,
      ne_one :=
        (_ :
          ∀ (l : (i : ι) × M i),
            l ∈
                { fst := i, snd := { head := m', tail := w', fstIdx_ne := h' }.head } ::
                  { head := m', tail := w', fstIdx_ne := h' }.tail.toList →
              l.snd ≠ 1),
      chain_ne :=
        (_ :
          List.Chain' (fun l l' => l.fst ≠ l'.fst)
            ({ fst := i, snd := { head := m', tail := w', fstIdx_ne := h' }.head } ::
              { head := m', tail := w', fstIdx_ne := h' }.tail.toList)) }
⊢ False
[PROOFSTEP]
exact h rfl
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : ¬m = 1
hm' : m' = 1
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
exfalso
[GOAL]
case pos.h
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : ¬m = 1
hm' : m' = 1
⊢ False
[PROOFSTEP]
simp only [rcons, dif_pos hm', dif_neg hm] at he 
[GOAL]
case pos.h
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
hm : ¬m = 1
hm' : m' = 1
he :
  { toList := { fst := i, snd := m } :: w.toList,
      ne_one :=
        (_ :
          ∀ (l : (i : ι) × M i),
            l ∈
                { fst := i, snd := { head := m, tail := w, fstIdx_ne := h }.head } ::
                  { head := m, tail := w, fstIdx_ne := h }.tail.toList →
              l.snd ≠ 1),
      chain_ne :=
        (_ :
          List.Chain' (fun l l' => l.fst ≠ l'.fst)
            ({ fst := i, snd := { head := m, tail := w, fstIdx_ne := h }.head } ::
              { head := m, tail := w, fstIdx_ne := h }.tail.toList)) } =
    w'
⊢ False
[PROOFSTEP]
rw [← he] at h' 
[GOAL]
case pos.h
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
hm : ¬m = 1
h' :
  fstIdx
      { toList := { fst := i, snd := m } :: w.toList,
        ne_one :=
          (_ :
            ∀ (l : (i : ι) × M i),
              l ∈
                  { fst := i, snd := { head := m, tail := w, fstIdx_ne := h }.head } ::
                    { head := m, tail := w, fstIdx_ne := h }.tail.toList →
                l.snd ≠ 1),
        chain_ne :=
          (_ :
            List.Chain' (fun l l' => l.fst ≠ l'.fst)
              ({ fst := i, snd := { head := m, tail := w, fstIdx_ne := h }.head } ::
                { head := m, tail := w, fstIdx_ne := h }.tail.toList)) } ≠
    some i
hm' : m' = 1
he :
  { toList := { fst := i, snd := m } :: w.toList,
      ne_one :=
        (_ :
          ∀ (l : (i : ι) × M i),
            l ∈
                { fst := i, snd := { head := m, tail := w, fstIdx_ne := h }.head } ::
                  { head := m, tail := w, fstIdx_ne := h }.tail.toList →
              l.snd ≠ 1),
      chain_ne :=
        (_ :
          List.Chain' (fun l l' => l.fst ≠ l'.fst)
            ({ fst := i, snd := { head := m, tail := w, fstIdx_ne := h }.head } ::
              { head := m, tail := w, fstIdx_ne := h }.tail.toList)) } =
    w'
⊢ False
[PROOFSTEP]
exact h' rfl
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : ¬m = 1
hm' : ¬m' = 1
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
have : m = m' ∧ w.toList = w'.toList := by
  simpa [rcons, dif_neg hm, dif_neg hm', true_and_iff, eq_self_iff_true, Subtype.mk_eq_mk, heq_iff_eq, ←
    Subtype.ext_iff_val] using he
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : ¬m = 1
hm' : ¬m' = 1
⊢ m = m' ∧ w.toList = w'.toList
[PROOFSTEP]
simpa [rcons, dif_neg hm, dif_neg hm', true_and_iff, eq_self_iff_true, Subtype.mk_eq_mk, heq_iff_eq, ←
  Subtype.ext_iff_val] using he
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h : fstIdx w ≠ some i
m' : M i
w' : Word M
h' : fstIdx w' ≠ some i
he : rcons { head := m, tail := w, fstIdx_ne := h } = rcons { head := m', tail := w', fstIdx_ne := h' }
hm : ¬m = 1
hm' : ¬m' = 1
this : m = m' ∧ w.toList = w'.toList
⊢ { head := m, tail := w, fstIdx_ne := h } = { head := m', tail := w', fstIdx_ne := h' }
[PROOFSTEP]
rcases this with ⟨rfl, h⟩
[GOAL]
case neg.intro
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h✝ : fstIdx w ≠ some i
w' : Word M
h' : fstIdx w' ≠ some i
hm : ¬m = 1
h : w.toList = w'.toList
he : rcons { head := m, tail := w, fstIdx_ne := h✝ } = rcons { head := m, tail := w', fstIdx_ne := h' }
hm' : ¬m = 1
⊢ { head := m, tail := w, fstIdx_ne := h✝ } = { head := m, tail := w', fstIdx_ne := h' }
[PROOFSTEP]
congr
[GOAL]
case neg.intro.e_tail
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
inst✝ : (i : ι) → DecidableEq (M i)
i : ι
m : M i
w : Word M
h✝ : fstIdx w ≠ some i
w' : Word M
h' : fstIdx w' ≠ some i
hm : ¬m = 1
h : w.toList = w'.toList
he : rcons { head := m, tail := w, fstIdx_ne := h✝ } = rcons { head := m, tail := w', fstIdx_ne := h' }
hm' : ¬m = 1
⊢ w = w'
[PROOFSTEP]
exact Word.ext _ _ h
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
ne_one✝ : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
chain_ne✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) []
h✝ : w = { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ }
⊢ fstIdx w ≠ some i
[PROOFSTEP]
subst w
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
ne_one✝ : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
chain_ne✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) []
⊢ fstIdx { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ } ≠ some i
[PROOFSTEP]
simp [fstIdx]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
ne_one✝ : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
chain_ne✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) []
h✝ : w = { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ }
⊢ rcons { head := 1, tail := w, fstIdx_ne := (_ : fstIdx w ≠ some i) } =
    namedPattern w { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ } h✝
[PROOFSTEP]
subst w
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
ne_one✝ : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
chain_ne✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) []
⊢ rcons
      { head := 1, tail := { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ },
        fstIdx_ne := (_ : fstIdx { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ } ≠ some i) } =
    namedPattern { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ }
      { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ }
      (_ :
        { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ } =
          { toList := [], ne_one := ne_one✝, chain_ne := chain_ne✝ })
[PROOFSTEP]
simp [rcons]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
j : ι
m : M j
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := j, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := j, snd := m } :: ls)
h✝ : w = { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
ij : i = j
⊢ fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i
[PROOFSTEP]
cases ij
[GOAL]
case refl
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
ls : List ((i : ι) × M 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)
h✝ : w = { toList := { fst := i, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
⊢ fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i
[PROOFSTEP]
exact fstIdx_ne_iff.mpr h2.rel_head?
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
j : ι
m : M j
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := j, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := j, snd := m } :: ls)
h✝ : w = { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
ij : i = j
⊢ rcons
      { head := (_ : j = i) ▸ m, tail := Monoid.CoprodI.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) } =
    namedPattern w { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 } h✝
[PROOFSTEP]
cases ij
[GOAL]
case refl
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
ls : List ((i : ι) × M 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)
h✝ : w = { toList := { fst := i, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
⊢ rcons
      { head := (_ : i = i) ▸ m, tail := Monoid.CoprodI.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) } =
    namedPattern w { toList := { fst := i, snd := m } :: ls, ne_one := h1, chain_ne := h2 } h✝
[PROOFSTEP]
exact cons_eq_rcons.symm
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
j : ι
m : M j
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := j, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := j, snd := m } :: ls)
h✝ : w = { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
ij : ¬i = j
⊢ fstIdx w ≠ some i
[PROOFSTEP]
subst w
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i j : ι
m : M j
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := j, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := j, snd := m } :: ls)
ij : ¬i = j
⊢ fstIdx { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 } ≠ some i
[PROOFSTEP]
exact (Option.some_injective _).ne (Ne.symm ij)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
j : ι
m : M j
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := j, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := j, snd := m } :: ls)
h✝ : w = { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
ij : ¬i = j
⊢ rcons { head := 1, tail := w, fstIdx_ne := (_ : fstIdx w ≠ some i) } =
    namedPattern w { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 } h✝
[PROOFSTEP]
subst w
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i j : ι
m : M j
ls : List ((i : ι) × M i)
h1 : ∀ (l : (i : ι) × M i), l ∈ { fst := j, snd := m } :: ls → l.snd ≠ 1
h2 : List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := j, snd := m } :: ls)
ij : ¬i = j
⊢ rcons
      { head := 1, tail := { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 },
        fstIdx_ne := (_ : fstIdx { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 } ≠ some i) } =
    namedPattern { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
      { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 }
      (_ :
        { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 } =
          { toList := { fst := j, snd := m } :: ls, ne_one := h1, chain_ne := h2 })
[PROOFSTEP]
simp [rcons]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
⊢ 1 • w = w
[PROOFSTEP]
apply (equivPair i).symm_apply_eq.mpr
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
w : Word M
⊢ (let src := ↑(equivPair i) w;
    { head := 1 * (↑(equivPair i) w).head, tail := src.tail, fstIdx_ne := (_ : fstIdx src.tail ≠ some i) }) =
    ↑(equivPair i) w
[PROOFSTEP]
simp [equivPair]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m m' : M i
w : Word M
⊢ (m * m') • w = m • m' • w
[PROOFSTEP]
dsimp [instHSMul]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m m' : M i
w : Word M
⊢ rcons
      { head := m * m' * (↑(equivPair i) w).head, tail := (↑(equivPair i) w).tail,
        fstIdx_ne := (_ : fstIdx (↑(equivPair i) w).tail ≠ some i) } =
    rcons
      {
        head :=
          m *
            (↑(equivPair i)
                (rcons
                  { head := m' * (↑(equivPair i) w).head, tail := (↑(equivPair i) w).tail,
                    fstIdx_ne := (_ : fstIdx (↑(equivPair i) w).tail ≠ some i) })).head,
        tail :=
          (↑(equivPair i)
              (rcons
                { head := m' * (↑(equivPair i) w).head, tail := (↑(equivPair i) w).tail,
                  fstIdx_ne := (_ : fstIdx (↑(equivPair i) w).tail ≠ some i) })).tail,
        fstIdx_ne :=
          (_ :
            fstIdx
                (↑(equivPair i)
                    (rcons
                      { head := m' * (↑(equivPair i) w).head, tail := (↑(equivPair i) w).tail,
                        fstIdx_ne := (_ : fstIdx (↑(equivPair i) w).tail ≠ some i) })).tail ≠
              some i) }
[PROOFSTEP]
simp [mul_assoc, ← equivPair_symm, Equiv.apply_symm_apply]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 • Monoid.CoprodI.Word.mkAux ls h1 h2
[PROOFSTEP]
rw [cons_eq_rcons, of_smul_def, equivPair_eq_of_fstIdx_ne _]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 := Monoid.CoprodI.Word.mkAux ls h1 h2,
        fstIdx_ne := (_ : fstIdx (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i) } =
    rcons
      (let src := { head := 1, tail := Monoid.CoprodI.Word.mkAux ls h1 h2, fstIdx_ne := ?m.459575 };
      { head := m * { head := 1, tail := Monoid.CoprodI.Word.mkAux ls h1 h2, fstIdx_ne := ?m.459575 }.head,
        tail := src.tail, fstIdx_ne := (_ : fstIdx src.tail ≠ some i) })
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 (Monoid.CoprodI.Word.mkAux ls h1 h2) ≠ some i
[PROOFSTEP]
rw [fstIdx_ne_iff]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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? (Monoid.CoprodI.Word.mkAux ls h1 h2).toList → i ≠ l.fst
[PROOFSTEP]
exact (List.chain'_cons'.1 h2).1
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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
[PROOFSTEP]
cases' w with ls h1 h2
[GOAL]
case mk
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 }
[PROOFSTEP]
induction' ls with l ls ih
[GOAL]
case mk.nil
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 }
[PROOFSTEP]
exact h_empty
[GOAL]
case mk.cons
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 }
[PROOFSTEP]
cases' l with i m
[GOAL]
case mk.cons.mk
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 }
[PROOFSTEP]
rw [cons_eq_smul]
[GOAL]
case mk.cons.mk
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
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 • Monoid.CoprodI.Word.mkAux ls h1 h2)
[PROOFSTEP]
exact h_smul _ _ _ (ih _ _)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
m : CoprodI M
⊢ ∀ (w : Word M), prod (m • w) = m * prod w
[PROOFSTEP]
induction m using CoprodI.induction_on with
| h_one =>
  intro
  rw [one_smul, one_mul]
| h_of _ =>
  intros
  rw [of_smul_def, prod_rcons, of.map_mul, mul_assoc, ← prod_rcons, ← equivPair_symm, Equiv.symm_apply_apply]
| h_mul x y hx hy =>
  intro w
  rw [mul_smul, hx, hy, mul_assoc]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
m : CoprodI M
⊢ ∀ (w : Word M), prod (m • w) = m * prod w
[PROOFSTEP]
induction m using CoprodI.induction_on with
| h_one =>
  intro
  rw [one_smul, one_mul]
| h_of _ =>
  intros
  rw [of_smul_def, prod_rcons, of.map_mul, mul_assoc, ← prod_rcons, ← equivPair_symm, Equiv.symm_apply_apply]
| h_mul x y hx hy =>
  intro w
  rw [mul_smul, hx, hy, mul_assoc]
[GOAL]
case h_one
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ ∀ (w : Word M), prod (1 • w) = 1 * prod w
[PROOFSTEP]

| h_one =>
  intro
  rw [one_smul, one_mul]
[GOAL]
case h_one
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ ∀ (w : Word M), prod (1 • w) = 1 * prod w
[PROOFSTEP]
intro
[GOAL]
case h_one
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
w✝ : Word M
⊢ prod (1 • w✝) = 1 * prod w✝
[PROOFSTEP]
rw [one_smul, one_mul]
[GOAL]
case h_of
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i✝ : ι
m✝ : M i✝
⊢ ∀ (w : Word M), prod (↑of m✝ • w) = ↑of m✝ * prod w
[PROOFSTEP]

| h_of _ =>
  intros
  rw [of_smul_def, prod_rcons, of.map_mul, mul_assoc, ← prod_rcons, ← equivPair_symm, Equiv.symm_apply_apply]
[GOAL]
case h_of
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i✝ : ι
m✝ : M i✝
⊢ ∀ (w : Word M), prod (↑of m✝ • w) = ↑of m✝ * prod w
[PROOFSTEP]
intros
[GOAL]
case h_of
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i✝ : ι
m✝ : M i✝
w✝ : Word M
⊢ prod (↑of m✝ • w✝) = ↑of m✝ * prod w✝
[PROOFSTEP]
rw [of_smul_def, prod_rcons, of.map_mul, mul_assoc, ← prod_rcons, ← equivPair_symm, Equiv.symm_apply_apply]
[GOAL]
case h_mul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
x y : CoprodI M
hx : ∀ (w : Word M), prod (x • w) = x * prod w
hy : ∀ (w : Word M), prod (y • w) = y * prod w
⊢ ∀ (w : Word M), prod ((x * y) • w) = x * y * prod w
[PROOFSTEP]

| h_mul x y hx hy =>
  intro w
  rw [mul_smul, hx, hy, mul_assoc]
[GOAL]
case h_mul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
x y : CoprodI M
hx : ∀ (w : Word M), prod (x • w) = x * prod w
hy : ∀ (w : Word M), prod (y • w) = y * prod w
⊢ ∀ (w : Word M), prod ((x * y) • w) = x * y * prod w
[PROOFSTEP]
intro w
[GOAL]
case h_mul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
x y : CoprodI M
hx : ∀ (w : Word M), prod (x • w) = x * prod w
hy : ∀ (w : Word M), prod (y • w) = y * prod w
w : Word M
⊢ prod ((x * y) • w) = x * y * prod w
[PROOFSTEP]
rw [mul_smul, hx, hy, mul_assoc]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
m : CoprodI M
⊢ (fun w => prod w) ((fun m => m • empty) m) = m
[PROOFSTEP]
dsimp only
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
m : CoprodI M
⊢ prod (m • empty) = m
[PROOFSTEP]
rw [prod_smul, prod_empty, mul_one]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ Function.RightInverse (fun w => prod w) fun m => m • empty
[PROOFSTEP]
apply smul_induction
[GOAL]
case h_empty
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ (fun m => m • empty) ((fun w => prod w) empty) = empty
[PROOFSTEP]
dsimp only
[GOAL]
case h_empty
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ prod empty • empty = empty
[PROOFSTEP]
rw [prod_empty, one_smul]
[GOAL]
case h_smul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ ∀ (i : ι) (m : M i) (w : Word M),
    (fun m => m • empty) ((fun w => prod w) w) = w → (fun m => m • empty) ((fun w => prod w) (↑of m • w)) = ↑of m • w
[PROOFSTEP]
dsimp only
[GOAL]
case h_smul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
⊢ ∀ (i : ι) (m : M i) (w : Word M), prod w • empty = w → prod (↑of m • w) • empty = ↑of m • w
[PROOFSTEP]
intro i m w ih
[GOAL]
case h_smul
ι : Type u_1
M : ι → Type u_2
inst✝³ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝² : Monoid N
inst✝¹ : (i : ι) → DecidableEq (M i)
inst✝ : DecidableEq ι
i : ι
m : M i
w : Word M
ih : prod w • empty = w
⊢ prod (↑of m • w) • empty = ↑of m • w
[PROOFSTEP]
rw [prod_smul, mul_smul, ih]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ toList w ≠ []
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ toList (singleton x✝ a✝) ≠ []
[PROOFSTEP]
rintro ⟨rfl⟩
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : toList _w₁✝ ≠ []
_w₂_ih✝ : toList _w₂✝ ≠ []
⊢ toList (append _w₁✝ _hne✝ _w₂✝) ≠ []
[PROOFSTEP]
apply List.append_ne_nil_of_ne_nil_left
[GOAL]
case append.a
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : toList _w₁✝ ≠ []
_w₂_ih✝ : toList _w₂✝ ≠ []
⊢ toList _w₁✝ ≠ []
[PROOFSTEP]
assumption
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ List.head? (toList w) = some { fst := i, snd := head w }
[PROOFSTEP]
rw [← Option.mem_def]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ { fst := i, snd := head w } ∈ List.head? (toList w)
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ { fst := i✝, snd := head (singleton x✝ a✝) } ∈ List.head? (toList (singleton x✝ a✝))
[PROOFSTEP]
rw [Option.mem_def]
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ List.head? (toList (singleton x✝ a✝)) = some { fst := i✝, snd := head (singleton x✝ a✝) }
[PROOFSTEP]
rfl
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : { fst := i✝, snd := head _w₁✝ } ∈ List.head? (toList _w₁✝)
_w₂_ih✝ : { fst := k✝, snd := head _w₂✝ } ∈ List.head? (toList _w₂✝)
⊢ { fst := i✝, snd := head (append _w₁✝ _hne✝ _w₂✝) } ∈ List.head? (toList (append _w₁✝ _hne✝ _w₂✝))
[PROOFSTEP]
exact List.head?_append (by assumption)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : { fst := i✝, snd := head _w₁✝ } ∈ List.head? (toList _w₁✝)
_w₂_ih✝ : { fst := k✝, snd := head _w₂✝ } ∈ List.head? (toList _w₂✝)
⊢ { fst := i✝, snd := head (append _w₁✝ _hne✝ _w₂✝) } ∈ List.head? (toList _w₁✝)
[PROOFSTEP]
assumption
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ List.getLast? (toList w) = some { fst := j, snd := last w }
[PROOFSTEP]
rw [← Option.mem_def]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ { fst := j, snd := last w } ∈ List.getLast? (toList w)
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ { fst := i✝, snd := last (singleton x✝ a✝) } ∈ List.getLast? (toList (singleton x✝ a✝))
[PROOFSTEP]
rw [Option.mem_def]
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ List.getLast? (toList (singleton x✝ a✝)) = some { fst := i✝, snd := last (singleton x✝ a✝) }
[PROOFSTEP]
rfl
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : { fst := j✝, snd := last _w₁✝ } ∈ List.getLast? (toList _w₁✝)
_w₂_ih✝ : { fst := l✝, snd := last _w₂✝ } ∈ List.getLast? (toList _w₂✝)
⊢ { fst := l✝, snd := last (append _w₁✝ _hne✝ _w₂✝) } ∈ List.getLast? (toList (append _w₁✝ _hne✝ _w₂✝))
[PROOFSTEP]
exact List.getLast?_append (by assumption)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : { fst := j✝, snd := last _w₁✝ } ∈ List.getLast? (toList _w₁✝)
_w₂_ih✝ : { fst := l✝, snd := last _w₂✝ } ∈ List.getLast? (toList _w₂✝)
⊢ { fst := l✝, snd := last (append _w₁✝ _hne✝ _w₂✝) } ∈ List.getLast? (toList _w₂✝)
[PROOFSTEP]
assumption
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ ∀ (l : (i : ι) × M i), l ∈ toList w → l.snd ≠ 1
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ ∀ (l : (i : ι) × M i), l ∈ toList (singleton x✝ a✝) → l.snd ≠ 1
[PROOFSTEP]
simpa only [toList, List.mem_singleton, ne_eq, forall_eq]
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₁✝ → l.snd ≠ 1
_w₂_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₂✝ → l.snd ≠ 1
⊢ ∀ (l : (i : ι) × M i), l ∈ toList (append _w₁✝ _hne✝ _w₂✝) → l.snd ≠ 1
[PROOFSTEP]
intro l h
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₁✝ → l.snd ≠ 1
_w₂_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₂✝ → l.snd ≠ 1
l : (i : ι) × M i
h : l ∈ toList (append _w₁✝ _hne✝ _w₂✝)
⊢ l.snd ≠ 1
[PROOFSTEP]
simp only [toList, List.mem_append] at h 
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₁✝ → l.snd ≠ 1
_w₂_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₂✝ → l.snd ≠ 1
l : (i : ι) × M i
h : l ∈ toList _w₁✝ ∨ l ∈ toList _w₂✝
⊢ l.snd ≠ 1
[PROOFSTEP]
cases h
[GOAL]
case append.inl
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₁✝ → l.snd ≠ 1
_w₂_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₂✝ → l.snd ≠ 1
l : (i : ι) × M i
h✝ : l ∈ toList _w₁✝
⊢ l.snd ≠ 1
[PROOFSTEP]
aesop
[GOAL]
case append.inr
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₁✝ → l.snd ≠ 1
_w₂_ih✝ : ∀ (l : (i : ι) × M i), l ∈ toList _w₂✝ → l.snd ≠ 1
l : (i : ι) × M i
h✝ : l ∈ toList _w₂✝
⊢ l.snd ≠ 1
[PROOFSTEP]
aesop
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
⊢ List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList w)
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
⊢ List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList (singleton x✝ a✝))
[PROOFSTEP]
exact List.chain'_singleton _
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
⊢ List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList (append _w₁✝ _hne✝ _w₂✝))
[PROOFSTEP]
refine List.Chain'.append (by assumption) (by assumption) ?_
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
⊢ List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
[PROOFSTEP]
assumption
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
⊢ List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
[PROOFSTEP]
assumption
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
⊢ ∀ (x : (i : ι) × M i),
    x ∈ List.getLast? (toList _w₁✝) → ∀ (y : (i : ι) × M i), y ∈ List.head? (toList _w₂✝) → x.fst ≠ y.fst
[PROOFSTEP]
intro x hx y hy
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
x : (i : ι) × M i
hx : x ∈ List.getLast? (toList _w₁✝)
y : (i : ι) × M i
hy : y ∈ List.head? (toList _w₂✝)
⊢ x.fst ≠ y.fst
[PROOFSTEP]
rw [toList_getLast?, Option.mem_some_iff] at hx 
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
x : (i : ι) × M i
hx : { fst := j✝, snd := last _w₁✝ } = x
y : (i : ι) × M i
hy : y ∈ List.head? (toList _w₂✝)
⊢ x.fst ≠ y.fst
[PROOFSTEP]
rw [toList_head?, Option.mem_some_iff] at hy 
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
x : (i : ι) × M i
hx : { fst := j✝, snd := last _w₁✝ } = x
y : (i : ι) × M i
hy : { fst := k✝, snd := head _w₂✝ } = y
⊢ x.fst ≠ y.fst
[PROOFSTEP]
subst hx
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
y : (i : ι) × M i
hy : { fst := k✝, snd := head _w₂✝ } = y
⊢ { fst := j✝, snd := last _w₁✝ }.fst ≠ y.fst
[PROOFSTEP]
subst hy
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₁✝)
_w₂_ih✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (toList _w₂✝)
⊢ { fst := j✝, snd := last _w₁✝ }.fst ≠ { fst := k✝, snd := head _w₂✝ }.fst
[PROOFSTEP]
assumption
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w : Word M
h : w ≠ empty
⊢ ∃ i j w', toWord w' = w
[PROOFSTEP]
suffices : ∃ (i j : _) (w' : NeWord M i j), w'.toWord.toList = w.toList
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w : Word M
h : w ≠ empty
this : ∃ i j w', (toWord w').toList = w.toList
⊢ ∃ i j w', toWord w' = w
[PROOFSTEP]
rcases this with ⟨i, j, w, h⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w✝ : Word M
h✝ : w✝ ≠ empty
i j : ι
w : NeWord M i j
h : (toWord w).toList = w✝.toList
⊢ ∃ i j w', toWord w' = w✝
[PROOFSTEP]
refine' ⟨i, j, w, _⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w✝ : Word M
h✝ : w✝ ≠ empty
i j : ι
w : NeWord M i j
h : (toWord w).toList = w✝.toList
⊢ toWord w = w✝
[PROOFSTEP]
ext
[GOAL]
case intro.intro.intro.toList.a.a
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w✝ : Word M
h✝ : w✝ ≠ empty
i j : ι
w : NeWord M i j
h : (toWord w).toList = w✝.toList
n✝ : ℕ
a✝ : (i : ι) × M i
⊢ a✝ ∈ List.get? (toWord w).toList n✝ ↔ a✝ ∈ List.get? w✝.toList n✝
[PROOFSTEP]
rw [h]
[GOAL]
case this
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
w : Word M
h : w ≠ empty
⊢ ∃ i j w', (toWord w').toList = w.toList
[PROOFSTEP]
cases' w with l hnot1 hchain
[GOAL]
case this.mk
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l : List ((i : ι) × M i)
hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l → l_1.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) l
h : { toList := l, ne_one := hnot1, chain_ne := hchain } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := l, ne_one := hnot1, chain_ne := hchain }.toList
[PROOFSTEP]
induction' l with x l hi
[GOAL]
case this.mk.nil
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l : List ((i : ι) × M i)
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l → l_1.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l
h✝ : { toList := l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
hnot1 : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) []
h : { toList := [], ne_one := hnot1, chain_ne := hchain } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := [], ne_one := hnot1, chain_ne := hchain }.toList
[PROOFSTEP]
contradiction
[GOAL]
case this.mk.cons
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
x : (i : ι) × M i
l : List ((i : ι) × M i)
hi :
  ∀ (hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l → l_1.snd ≠ 1) (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) l),
    { toList := l, ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := l, ne_one := hnot1, chain_ne := hchain }.toList
hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: l → l_1.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: l)
h : { toList := x :: l, ne_one := hnot1, chain_ne := hchain } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := x :: l, ne_one := hnot1, chain_ne := hchain }.toList
[PROOFSTEP]
rw [List.forall_mem_cons] at hnot1 
[GOAL]
case this.mk.cons
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝ } ≠ empty
x : (i : ι) × M i
l : List ((i : ι) × M i)
hi :
  ∀ (hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l → l_1.snd ≠ 1) (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) l),
    { toList := l, ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := l, ne_one := hnot1, chain_ne := hchain }.toList
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ l → x.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: l)
h : { toList := x :: l, ne_one := hnot1✝, chain_ne := hchain } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := x :: l, ne_one := hnot1✝, chain_ne := hchain }.toList
[PROOFSTEP]
cases' l with y l
[GOAL]
case this.mk.cons.nil
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l → l_1.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l
h✝ : { toList := l, ne_one := hnot1✝¹, chain_ne := hchain✝ } ≠ empty
x : (i : ι) × M i
hi :
  ∀ (hnot1 : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1) (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) []),
    { toList := [], ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := [], ne_one := hnot1, chain_ne := hchain }.toList
hnot1✝ : ∀ (l : (i : ι) × M i), l ∈ [x] → l.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ [] → x.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) [x]
h : { toList := [x], ne_one := hnot1✝, chain_ne := hchain } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := [x], ne_one := hnot1✝, chain_ne := hchain }.toList
[PROOFSTEP]
refine' ⟨x.1, x.1, singleton x.2 hnot1.1, _⟩
[GOAL]
case this.mk.cons.nil
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ l → l_1.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l
h✝ : { toList := l, ne_one := hnot1✝¹, chain_ne := hchain✝ } ≠ empty
x : (i : ι) × M i
hi :
  ∀ (hnot1 : ∀ (l : (i : ι) × M i), l ∈ [] → l.snd ≠ 1) (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) []),
    { toList := [], ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := [], ne_one := hnot1, chain_ne := hchain }.toList
hnot1✝ : ∀ (l : (i : ι) × M i), l ∈ [x] → l.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ [] → x.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) [x]
h : { toList := [x], ne_one := hnot1✝, chain_ne := hchain } ≠ empty
⊢ (toWord (singleton x.snd (_ : x.snd ≠ 1))).toList = { toList := [x], ne_one := hnot1✝, chain_ne := hchain }.toList
[PROOFSTEP]
simp [toWord]
[GOAL]
case this.mk.cons.cons
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝ } ≠ empty
x y : (i : ι) × M i
l : List ((i : ι) × M i)
hi :
  ∀ (hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ y :: l → l_1.snd ≠ 1)
    (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)),
    { toList := y :: l, ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := y :: l, ne_one := hnot1, chain_ne := hchain }.toList
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: y :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1
hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: y :: l)
h : { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain }.toList
[PROOFSTEP]
rw [List.chain'_cons] at hchain 
[GOAL]
case this.mk.cons.cons
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x y : (i : ι) × M i
l : List ((i : ι) × M i)
hi :
  ∀ (hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ y :: l → l_1.snd ≠ 1)
    (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)),
    { toList := y :: l, ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := y :: l, ne_one := hnot1, chain_ne := hchain }.toList
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: y :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: y :: l)
hchain : x.fst ≠ y.fst ∧ List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)
h : { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
⊢ ∃ i j w', (toWord w').toList = { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ }.toList
[PROOFSTEP]
specialize hi hnot1.2 hchain.2 (by rintro ⟨rfl⟩)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x y : (i : ι) × M i
l : List ((i : ι) × M i)
hi :
  ∀ (hnot1 : ∀ (l_1 : (i : ι) × M i), l_1 ∈ y :: l → l_1.snd ≠ 1)
    (hchain : List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)),
    { toList := y :: l, ne_one := hnot1, chain_ne := hchain } ≠ empty →
      ∃ i j w', (toWord w').toList = { toList := y :: l, ne_one := hnot1, chain_ne := hchain }.toList
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: y :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: y :: l)
hchain : x.fst ≠ y.fst ∧ List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)
h : { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
⊢ { toList := y :: l, ne_one := (_ : ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1),
      chain_ne := (_ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)) } ≠
    empty
[PROOFSTEP]
rintro ⟨rfl⟩
[GOAL]
case this.mk.cons.cons
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x y : (i : ι) × M i
l : List ((i : ι) × M i)
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: y :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: y :: l)
hchain : x.fst ≠ y.fst ∧ List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)
h : { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
hi :
  ∃ i j w',
    (toWord w').toList =
      { toList := y :: l, ne_one := (_ : ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1),
          chain_ne := (_ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)) }.toList
⊢ ∃ i j w', (toWord w').toList = { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ }.toList
[PROOFSTEP]
obtain ⟨i, j, w', hw' : w'.toList = y :: l⟩ := hi
[GOAL]
case this.mk.cons.cons.intro.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x y : (i : ι) × M i
l : List ((i : ι) × M i)
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: y :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: y :: l)
hchain : x.fst ≠ y.fst ∧ List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)
h : { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
i j : ι
w' : NeWord M i j
hw' : toList w' = y :: l
⊢ ∃ i j w', (toWord w').toList = { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ }.toList
[PROOFSTEP]
obtain rfl : y = ⟨i, w'.head⟩ := by simpa [hw'] using w'.toList_head?
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x y : (i : ι) × M i
l : List ((i : ι) × M i)
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: y :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ y :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: y :: l)
hchain : x.fst ≠ y.fst ∧ List.Chain' (fun l l' => l.fst ≠ l'.fst) (y :: l)
h : { toList := x :: y :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
i j : ι
w' : NeWord M i j
hw' : toList w' = y :: l
⊢ y = { fst := i, snd := head w' }
[PROOFSTEP]
simpa [hw'] using w'.toList_head?
[GOAL]
case this.mk.cons.cons.intro.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x : (i : ι) × M i
l : List ((i : ι) × M i)
i j : ι
w' : NeWord M i j
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: { fst := i, snd := head w' } :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ { fst := i, snd := head w' } :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: { fst := i, snd := head w' } :: l)
hchain :
  x.fst ≠ { fst := i, snd := head w' }.fst ∧
    List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := i, snd := head w' } :: l)
h : { toList := x :: { fst := i, snd := head w' } :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
hw' : toList w' = { fst := i, snd := head w' } :: l
⊢ ∃ i_1 j_1 w'_1,
    (toWord w'_1).toList =
      { toList := x :: { fst := i, snd := head w' } :: l, ne_one := hnot1✝, chain_ne := hchain✝ }.toList
[PROOFSTEP]
refine' ⟨x.1, j, append (singleton x.2 hnot1.1) hchain.1 w', _⟩
[GOAL]
case this.mk.cons.cons.intro.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
l✝ : List ((i : ι) × M i)
hnot1✝¹ : ∀ (l : (i : ι) × M i), l ∈ l✝ → l.snd ≠ 1
hchain✝¹ : List.Chain' (fun l l' => l.fst ≠ l'.fst) l✝
h✝ : { toList := l✝, ne_one := hnot1✝¹, chain_ne := hchain✝¹ } ≠ empty
x : (i : ι) × M i
l : List ((i : ι) × M i)
i j : ι
w' : NeWord M i j
hnot1✝ : ∀ (l_1 : (i : ι) × M i), l_1 ∈ x :: { fst := i, snd := head w' } :: l → l_1.snd ≠ 1
hnot1 : x.snd ≠ 1 ∧ ∀ (x : (i : ι) × M i), x ∈ { fst := i, snd := head w' } :: l → x.snd ≠ 1
hchain✝ : List.Chain' (fun l l' => l.fst ≠ l'.fst) (x :: { fst := i, snd := head w' } :: l)
hchain :
  x.fst ≠ { fst := i, snd := head w' }.fst ∧
    List.Chain' (fun l l' => l.fst ≠ l'.fst) ({ fst := i, snd := head w' } :: l)
h : { toList := x :: { fst := i, snd := head w' } :: l, ne_one := hnot1✝, chain_ne := hchain✝ } ≠ empty
hw' : toList w' = { fst := i, snd := head w' } :: l
⊢ (toWord (append (singleton x.snd (_ : x.snd ≠ 1)) (_ : x.fst ≠ { fst := i, snd := head w' }.fst) w')).toList =
    { toList := x :: { fst := i, snd := head w' } :: l, ne_one := hnot1✝, chain_ne := hchain✝ }.toList
[PROOFSTEP]
simpa [toWord] using hw'
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i : ι
x : M i
hne_one : x ≠ 1
⊢ prod (singleton x hne_one) = ↑of x
[PROOFSTEP]
simp [toWord, prod, Word.prod]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j k l : ι
w₁ : NeWord M i j
hne : j ≠ k
w₂ : NeWord M k l
⊢ prod (append w₁ hne w₂) = prod w₁ * prod w₂
[PROOFSTEP]
simp [toWord, prod, Word.prod]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
x : M i
hnotone : x ≠ 1
w : NeWord M i j
⊢ head (replaceHead x hnotone w) = x
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
x : M i✝
hnotone : x ≠ 1
⊢ head (replaceHead x hnotone (singleton x✝ a✝)) = x
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (x : M i✝) (hnotone : x ≠ 1), head (replaceHead x hnotone _w₁✝) = x
_w₂_ih✝ : ∀ (x : M k✝) (hnotone : x ≠ 1), head (replaceHead x hnotone _w₂✝) = x
x : M i✝
hnotone : x ≠ 1
⊢ head (replaceHead x hnotone (append _w₁✝ _hne✝ _w₂✝)) = x
[PROOFSTEP]
rfl
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (x : M i✝) (hnotone : x ≠ 1), head (replaceHead x hnotone _w₁✝) = x
_w₂_ih✝ : ∀ (x : M k✝) (hnotone : x ≠ 1), head (replaceHead x hnotone _w₂✝) = x
x : M i✝
hnotone : x ≠ 1
⊢ head (replaceHead x hnotone (append _w₁✝ _hne✝ _w₂✝)) = x
[PROOFSTEP]
simp [*]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x : M i
hnotone : x * head w ≠ 1
⊢ head (mulHead w x hnotone) = x * head w
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
x : M i✝
hnotone : x * head (singleton x✝ a✝) ≠ 1
⊢ head (mulHead (singleton x✝ a✝) x hnotone) = x * head (singleton x✝ a✝)
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (x : M i✝) (hnotone : x * head _w₁✝ ≠ 1), head (mulHead _w₁✝ x hnotone) = x * head _w₁✝
_w₂_ih✝ : ∀ (x : M k✝) (hnotone : x * head _w₂✝ ≠ 1), head (mulHead _w₂✝ x hnotone) = x * head _w₂✝
x : M i✝
hnotone : x * head (append _w₁✝ _hne✝ _w₂✝) ≠ 1
⊢ head (mulHead (append _w₁✝ _hne✝ _w₂✝) x hnotone) = x * head (append _w₁✝ _hne✝ _w₂✝)
[PROOFSTEP]
rfl
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
_w₁_ih✝ : ∀ (x : M i✝) (hnotone : x * head _w₁✝ ≠ 1), head (mulHead _w₁✝ x hnotone) = x * head _w₁✝
_w₂_ih✝ : ∀ (x : M k✝) (hnotone : x * head _w₂✝ ≠ 1), head (mulHead _w₂✝ x hnotone) = x * head _w₂✝
x : M i✝
hnotone : x * head (append _w₁✝ _hne✝ _w₂✝) ≠ 1
⊢ head (mulHead (append _w₁✝ _hne✝ _w₂✝) x hnotone) = x * head (append _w₁✝ _hne✝ _w₂✝)
[PROOFSTEP]
simp [*]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x : M i
hnotone : x * head w ≠ 1
⊢ prod (mulHead w x hnotone) = ↑of x * prod w
[PROOFSTEP]
unfold mulHead
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x : M i
hnotone : x * head w ≠ 1
⊢ prod (replaceHead (x * head w) hnotone w) = ↑of x * prod w
[PROOFSTEP]
induction' w with _ _ _ _ _ _ _ _ _ _ w_ih_w₁ w_ih_w₂
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x✝¹ : M i
hnotone✝ : x✝¹ * head w ≠ 1
i✝ : ι
x✝ : M i✝
a✝ : x✝ ≠ 1
x : M i✝
hnotone : x * head (singleton x✝ a✝) ≠ 1
⊢ prod (replaceHead (x * head (singleton x✝ a✝)) hnotone (singleton x✝ a✝)) = ↑of x * prod (singleton x✝ a✝)
[PROOFSTEP]
simp [mulHead, replaceHead]
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x✝ : M i
hnotone✝ : x✝ * head w ≠ 1
i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
w_ih_w₁ :
  ∀ (x : M i✝) (hnotone : x * head _w₁✝ ≠ 1), prod (replaceHead (x * head _w₁✝) hnotone _w₁✝) = ↑of x * prod _w₁✝
w_ih_w₂ :
  ∀ (x : M k✝) (hnotone : x * head _w₂✝ ≠ 1), prod (replaceHead (x * head _w₂✝) hnotone _w₂✝) = ↑of x * prod _w₂✝
x : M i✝
hnotone : x * head (append _w₁✝ _hne✝ _w₂✝) ≠ 1
⊢ prod (replaceHead (x * head (append _w₁✝ _hne✝ _w₂✝)) hnotone (append _w₁✝ _hne✝ _w₂✝)) =
    ↑of x * prod (append _w₁✝ _hne✝ _w₂✝)
[PROOFSTEP]
specialize w_ih_w₁ _ hnotone
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x✝ : M i
hnotone✝ : x✝ * head w ≠ 1
i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
w_ih_w₂ :
  ∀ (x : M k✝) (hnotone : x * head _w₂✝ ≠ 1), prod (replaceHead (x * head _w₂✝) hnotone _w₂✝) = ↑of x * prod _w₂✝
x : M i✝
hnotone : x * head (append _w₁✝ _hne✝ _w₂✝) ≠ 1
w_ih_w₁ : prod (replaceHead (x * head _w₁✝) hnotone _w₁✝) = ↑of x * prod _w₁✝
⊢ prod (replaceHead (x * head (append _w₁✝ _hne✝ _w₂✝)) hnotone (append _w₁✝ _hne✝ _w₂✝)) =
    ↑of x * prod (append _w₁✝ _hne✝ _w₂✝)
[PROOFSTEP]
clear w_ih_w₂
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x✝ : M i
hnotone✝ : x✝ * head w ≠ 1
i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
x : M i✝
hnotone : x * head (append _w₁✝ _hne✝ _w₂✝) ≠ 1
w_ih_w₁ : prod (replaceHead (x * head _w₁✝) hnotone _w₁✝) = ↑of x * prod _w₁✝
⊢ prod (replaceHead (x * head (append _w₁✝ _hne✝ _w₂✝)) hnotone (append _w₁✝ _hne✝ _w₂✝)) =
    ↑of x * prod (append _w₁✝ _hne✝ _w₂✝)
[PROOFSTEP]
simp [replaceHead, ← mul_assoc] at *
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
i j : ι
w : NeWord M i j
x✝ : M i
hnotone✝ : ¬x✝ * head w = 1
i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord M i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord M k✝ l✝
x : M i✝
hnotone : x * head (append _w₁✝ _hne✝ _w₂✝) ≠ 1
w_ih_w₁ : prod (replaceHead (x * head _w₁✝) hnotone _w₁✝) = ↑of x * prod _w₁✝
⊢ prod (replaceHead (x * head _w₁✝) (_ : x * head _w₁✝ ≠ 1) _w₁✝) * prod _w₂✝ = ↑of x * prod _w₁✝ * prod _w₂✝
[PROOFSTEP]
congr 1
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j : ι
w : NeWord G i j
⊢ prod (inv w) = (prod w)⁻¹
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j i✝ : ι
x✝ : G i✝
a✝ : x✝ ≠ 1
⊢ prod (inv (singleton x✝ a✝)) = (prod (singleton x✝ a✝))⁻¹
[PROOFSTEP]
simp [inv, *]
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord G i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord G k✝ l✝
_w₁_ih✝ : prod (inv _w₁✝) = (prod _w₁✝)⁻¹
_w₂_ih✝ : prod (inv _w₂✝) = (prod _w₂✝)⁻¹
⊢ prod (inv (append _w₁✝ _hne✝ _w₂✝)) = (prod (append _w₁✝ _hne✝ _w₂✝))⁻¹
[PROOFSTEP]
simp [inv, *]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j : ι
w : NeWord G i j
⊢ head (inv w) = (last w)⁻¹
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j i✝ : ι
x✝ : G i✝
a✝ : x✝ ≠ 1
⊢ head (inv (singleton x✝ a✝)) = (last (singleton x✝ a✝))⁻¹
[PROOFSTEP]
simp [inv, *]
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord G i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord G k✝ l✝
_w₁_ih✝ : head (inv _w₁✝) = (last _w₁✝)⁻¹
_w₂_ih✝ : head (inv _w₂✝) = (last _w₂✝)⁻¹
⊢ head (inv (append _w₁✝ _hne✝ _w₂✝)) = (last (append _w₁✝ _hne✝ _w₂✝))⁻¹
[PROOFSTEP]
simp [inv, *]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j : ι
w : NeWord G i j
⊢ last (inv w) = (head w)⁻¹
[PROOFSTEP]
induction w
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j i✝ : ι
x✝ : G i✝
a✝ : x✝ ≠ 1
⊢ last (inv (singleton x✝ a✝)) = (head (singleton x✝ a✝))⁻¹
[PROOFSTEP]
simp [inv, *]
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
G : ι → Type u_4
inst✝ : (i : ι) → Group (G i)
i j i✝ j✝ k✝ l✝ : ι
_w₁✝ : NeWord G i✝ j✝
_hne✝ : j✝ ≠ k✝
_w₂✝ : NeWord G k✝ l✝
_w₁_ih✝ : last (inv _w₁✝) = (head _w₁✝)⁻¹
_w₂_ih✝ : last (inv _w₂✝) = (head _w₂✝)⁻¹
⊢ last (inv (append _w₁✝ _hne✝ _w₂✝)) = (head (append _w₁✝ _hne✝ _w₂✝))⁻¹
[PROOFSTEP]
simp [inv, *]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j k : ι
w : NeWord H i j
hk : j ≠ k
⊢ ↑(↑lift f) (NeWord.prod w) • X k ⊆ X i
[PROOFSTEP]
induction' w with i x hne_one i j k l w₁ hne w₂ hIw₁ hIw₂ generalizing k
[GOAL]
case singleton
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i✝ j k✝ : ι
hk✝ : j ≠ k✝
i : ι
x : H i
hne_one : x ≠ 1
k : ι
hk : i ≠ k
⊢ ↑(↑lift f) (NeWord.prod (NeWord.singleton x hne_one)) • X k ⊆ X i
[PROOFSTEP]
simpa using hpp hk _ hne_one
[GOAL]
case append
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i✝ j✝ k✝¹ : ι
hk✝ : j✝ ≠ k✝¹
i j k✝ l : ι
w₁ : NeWord H i j
hne : j ≠ k✝
w₂ : NeWord H k✝ l
hIw₁ : ∀ {k : ι}, j ≠ k → ↑(↑lift f) (NeWord.prod w₁) • X k ⊆ X i
hIw₂ : ∀ {k : ι}, l ≠ k → ↑(↑lift f) (NeWord.prod w₂) • X k ⊆ X k✝
k : ι
hk : l ≠ k
⊢ ↑(↑lift f) (NeWord.prod (NeWord.append w₁ hne w₂)) • X k ⊆ X i
[PROOFSTEP]
calc
  lift f (NeWord.append w₁ hne w₂).prod • X k = lift f w₁.prod • lift f w₂.prod • X k := by simp [MulAction.mul_smul]
  _ ⊆ lift f w₁.prod • X _ := (set_smul_subset_set_smul_iff.mpr (hIw₂ hk))
  _ ⊆ X i := hIw₁ hne
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i✝ j✝ k✝¹ : ι
hk✝ : j✝ ≠ k✝¹
i j k✝ l : ι
w₁ : NeWord H i j
hne : j ≠ k✝
w₂ : NeWord H k✝ l
hIw₁ : ∀ {k : ι}, j ≠ k → ↑(↑lift f) (NeWord.prod w₁) • X k ⊆ X i
hIw₂ : ∀ {k : ι}, l ≠ k → ↑(↑lift f) (NeWord.prod w₂) • X k ⊆ X k✝
k : ι
hk : l ≠ k
⊢ ↑(↑lift f) (NeWord.prod (NeWord.append w₁ hne w₂)) • X k =
    ↑(↑lift f) (NeWord.prod w₁) • ↑(↑lift f) (NeWord.prod w₂) • X k
[PROOFSTEP]
simp [MulAction.mul_smul]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j k : ι
w : NeWord H i j
hhead : k ≠ i
hlast : k ≠ j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
intro heq1
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j k : ι
w : NeWord H i j
hhead : k ≠ i
hlast : k ≠ j
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
⊢ False
[PROOFSTEP]
have : X k ⊆ X i := by simpa [heq1] using lift_word_ping_pong f X hpp w hlast.symm
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j k : ι
w : NeWord H i j
hhead : k ≠ i
hlast : k ≠ j
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
⊢ X k ⊆ X i
[PROOFSTEP]
simpa [heq1] using lift_word_ping_pong f X hpp w hlast.symm
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j k : ι
w : NeWord H i j
hhead : k ≠ i
hlast : k ≠ j
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
this : X k ⊆ X i
⊢ False
[PROOFSTEP]
obtain ⟨x, hx⟩ := hXnonempty k
[GOAL]
case intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j k : ι
w : NeWord H i j
hhead : k ≠ i
hlast : k ≠ j
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
this : X k ⊆ X i
x : α
hx : x ∈ X k
⊢ False
[PROOFSTEP]
exact (hXdisj hhead).le_bot ⟨hx, this hx⟩
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i : ι
w : NeWord H i i
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
obtain ⟨k, hk⟩ := exists_ne i
[GOAL]
case intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i : ι
w : NeWord H i i
k : ι
hk : k ≠ i
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
exact lift_word_prod_nontrivial_of_other_i f X hXnonempty hXdisj hpp w hk hk
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
obtain ⟨h, hn1, hnh⟩ := Cardinal.three_le hcard 1 w.head⁻¹
[GOAL]
case intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
have hnot1 : h * w.head ≠ 1 := by
  rw [← div_inv_eq_mul]
  exact div_ne_one_of_ne hnh
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
⊢ h * NeWord.head w ≠ 1
[PROOFSTEP]
rw [← div_inv_eq_mul]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
⊢ h / (NeWord.head w)⁻¹ ≠ 1
[PROOFSTEP]
exact div_ne_one_of_ne hnh
[GOAL]
case intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
hnot1 : h * NeWord.head w ≠ 1
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
let w' : NeWord H i i :=
  NeWord.append (NeWord.mulHead w h hnot1) hheadtail.symm (NeWord.singleton h⁻¹ (inv_ne_one.mpr hn1))
[GOAL]
case intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
hnot1 : h * NeWord.head w ≠ 1
w' : NeWord H i i := NeWord.append (NeWord.mulHead w h hnot1) (_ : j ≠ i) (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
have hw' : lift f w'.prod ≠ 1 := lift_word_prod_nontrivial_of_head_eq_last f X hXnonempty hXdisj hpp w'
[GOAL]
case intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
hnot1 : h * NeWord.head w ≠ 1
w' : NeWord H i i := NeWord.append (NeWord.mulHead w h hnot1) (_ : j ≠ i) (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
hw' : ↑(↑lift f) (NeWord.prod w') ≠ 1
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
intro heq1
[GOAL]
case intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
hnot1 : h * NeWord.head w ≠ 1
w' : NeWord H i i := NeWord.append (NeWord.mulHead w h hnot1) (_ : j ≠ i) (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
hw' : ↑(↑lift f) (NeWord.prod w') ≠ 1
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
⊢ False
[PROOFSTEP]
apply hw'
[GOAL]
case intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard✝ : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hheadtail : i ≠ j
h : H i
hn1 : h ≠ 1
hnh : h ≠ (NeWord.head w)⁻¹
hnot1 : h * NeWord.head w ≠ 1
w' : NeWord H i i := NeWord.append (NeWord.mulHead w h hnot1) (_ : j ≠ i) (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
hw' : ↑(↑lift f) (NeWord.prod w') ≠ 1
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
⊢ ↑(↑lift f) (NeWord.prod w') = 1
[PROOFSTEP]
simp [heq1]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
classical
cases' hcard with hcard hcard
· obtain ⟨i, h1, h2⟩ := Cardinal.three_le hcard i j
  exact lift_word_prod_nontrivial_of_other_i f X hXnonempty hXdisj hpp w h1 h2
· cases' hcard with k hcard
  by_cases hh : i = k <;> by_cases hl : j = k
  · subst hh
    subst hl
    exact lift_word_prod_nontrivial_of_head_eq_last f X hXnonempty hXdisj hpp w
  · subst hh
    change j ≠ i at hl 
    exact lift_word_prod_nontrivial_of_head_card f X hXnonempty hXdisj hpp w hcard hl.symm
  · subst hl
    change i ≠ j at hh 
    have : lift f w.inv.prod ≠ 1 := lift_word_prod_nontrivial_of_head_card f X hXnonempty hXdisj hpp w.inv hcard hh.symm
    intro heq
    apply this
    simpa using heq
  · change i ≠ k at hh 
    change j ≠ k at hl 
    obtain ⟨h, hn1, -⟩ := Cardinal.three_le hcard 1 1
    let w' : NeWord H k k :=
      NeWord.append (NeWord.append (NeWord.singleton h hn1) hh.symm w) hl (NeWord.singleton h⁻¹ (inv_ne_one.mpr hn1))
    have hw' : lift f w'.prod ≠ 1 := lift_word_prod_nontrivial_of_head_eq_last f X hXnonempty hXdisj hpp w'
    intro heq1
    apply hw'
    simp [heq1]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
cases' hcard with hcard hcard
[GOAL]
case inl
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #ι
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
obtain ⟨i, h1, h2⟩ := Cardinal.three_le hcard i j
[GOAL]
case inl.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i✝ j : ι
w : NeWord H i✝ j
hcard : 3 ≤ #ι
i : ι
h1 : i ≠ i✝
h2 : i ≠ j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
exact lift_word_prod_nontrivial_of_other_i f X hXnonempty hXdisj hpp w h1 h2
[GOAL]
case inr
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : ∃ i, 3 ≤ #(H i)
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
cases' hcard with k hcard
[GOAL]
case inr.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
by_cases hh : i = k
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i = k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
by_cases hl : j = k
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : ¬i = k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
by_cases hl : j = k
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i = k
hl : j = k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
subst hh
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hl : j = i
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
subst hl
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
j : ι
w : NeWord H j j
hcard : 3 ≤ #(H j)
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
exact lift_word_prod_nontrivial_of_head_eq_last f X hXnonempty hXdisj hpp w
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i = k
hl : ¬j = k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
subst hh
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hl : ¬j = i
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
change j ≠ i at hl 
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H i)
hl : j ≠ i
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
exact lift_word_prod_nontrivial_of_head_card f X hXnonempty hXdisj hpp w hcard hl.symm
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : ¬i = k
hl : j = k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
subst hl
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H j)
hh : ¬i = j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
change i ≠ j at hh 
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H j)
hh : i ≠ j
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
have : lift f w.inv.prod ≠ 1 := lift_word_prod_nontrivial_of_head_card f X hXnonempty hXdisj hpp w.inv hcard hh.symm
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H j)
hh : i ≠ j
this : ↑(↑lift f) (NeWord.prod (NeWord.inv w)) ≠ 1
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
intro heq
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H j)
hh : i ≠ j
this : ↑(↑lift f) (NeWord.prod (NeWord.inv w)) ≠ 1
heq : ↑(↑lift f) (NeWord.prod w) = 1
⊢ False
[PROOFSTEP]
apply this
[GOAL]
case pos
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
hcard : 3 ≤ #(H j)
hh : i ≠ j
this : ↑(↑lift f) (NeWord.prod (NeWord.inv w)) ≠ 1
heq : ↑(↑lift f) (NeWord.prod w) = 1
⊢ ↑(↑lift f) (NeWord.prod (NeWord.inv w)) = 1
[PROOFSTEP]
simpa using heq
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : ¬i = k
hl : ¬j = k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
change i ≠ k at hh 
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hl : ¬j = k
hh : i ≠ k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
change j ≠ k at hl 
[GOAL]
case neg
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i ≠ k
hl : j ≠ k
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
obtain ⟨h, hn1, -⟩ := Cardinal.three_le hcard 1 1
[GOAL]
case neg.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i ≠ k
hl : j ≠ k
h : H k
hn1 : h ≠ 1
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
let w' : NeWord H k k :=
  NeWord.append (NeWord.append (NeWord.singleton h hn1) hh.symm w) hl (NeWord.singleton h⁻¹ (inv_ne_one.mpr hn1))
[GOAL]
case neg.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i ≠ k
hl : j ≠ k
h : H k
hn1 : h ≠ 1
w' : NeWord H k k :=
  NeWord.append (NeWord.append (NeWord.singleton h hn1) (_ : k ≠ i) w) hl (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
have hw' : lift f w'.prod ≠ 1 := lift_word_prod_nontrivial_of_head_eq_last f X hXnonempty hXdisj hpp w'
[GOAL]
case neg.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i ≠ k
hl : j ≠ k
h : H k
hn1 : h ≠ 1
w' : NeWord H k k :=
  NeWord.append (NeWord.append (NeWord.singleton h hn1) (_ : k ≠ i) w) hl (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
hw' : ↑(↑lift f) (NeWord.prod w') ≠ 1
⊢ ↑(↑lift f) (NeWord.prod w) ≠ 1
[PROOFSTEP]
intro heq1
[GOAL]
case neg.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i ≠ k
hl : j ≠ k
h : H k
hn1 : h ≠ 1
w' : NeWord H k k :=
  NeWord.append (NeWord.append (NeWord.singleton h hn1) (_ : k ≠ i) w) hl (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
hw' : ↑(↑lift f) (NeWord.prod w') ≠ 1
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
⊢ False
[PROOFSTEP]
apply hw'
[GOAL]
case neg.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
k : ι
hcard : 3 ≤ #(H k)
hh : i ≠ k
hl : j ≠ k
h : H k
hn1 : h ≠ 1
w' : NeWord H k k :=
  NeWord.append (NeWord.append (NeWord.singleton h hn1) (_ : k ≠ i) w) hl (NeWord.singleton h⁻¹ (_ : h⁻¹ ≠ 1))
hw' : ↑(↑lift f) (NeWord.prod w') ≠ 1
heq1 : ↑(↑lift f) (NeWord.prod w) = 1
⊢ ↑(↑lift f) (NeWord.prod w') = 1
[PROOFSTEP]
simp [heq1]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
w : Word H
h : ↑(↑lift f) (Word.prod w) = 1
⊢ w = Word.empty
[PROOFSTEP]
by_contra hnotempty
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
w : Word H
h : ↑(↑lift f) (Word.prod w) = 1
hnotempty : ¬w = Word.empty
⊢ False
[PROOFSTEP]
obtain ⟨i, j, w, rfl⟩ := NeWord.of_word w hnotempty
[GOAL]
case intro.intro.intro
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
i j : ι
w : NeWord H i j
h : ↑(↑lift f) (Word.prod (NeWord.toWord w)) = 1
hnotempty : ¬NeWord.toWord w = Word.empty
⊢ False
[PROOFSTEP]
exact lift_word_prod_nontrivial_of_not_empty f hcard X hXnonempty hXdisj hpp w h
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
⊢ Function.Injective ↑(↑lift f)
[PROOFSTEP]
classical
apply (injective_iff_map_eq_one (lift f)).mpr
rw [(CoprodI.Word.equiv).forall_congr_left']
· intro w Heq
  dsimp [Word.equiv] at *
  · rw [empty_of_word_prod_eq_one f hcard X hXnonempty hXdisj hpp Heq]
    rfl
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
⊢ Function.Injective ↑(↑lift f)
[PROOFSTEP]
apply (injective_iff_map_eq_one (lift f)).mpr
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
⊢ ∀ (a : CoprodI fun i => H i), ↑(↑lift f) a = 1 → a = 1
[PROOFSTEP]
rw [(CoprodI.Word.equiv).forall_congr_left']
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
⊢ ∀ (y : Word fun i => H i), ↑(↑lift f) (↑Word.equiv.symm y) = 1 → ↑Word.equiv.symm y = 1
[PROOFSTEP]
intro w Heq
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X j ⊆ X i
w : Word fun i => H i
Heq : ↑(↑lift f) (↑Word.equiv.symm w) = 1
⊢ ↑Word.equiv.symm w = 1
[PROOFSTEP]
dsimp [Word.equiv] at *
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), ¬h = 1 → ↑(f i) h • X j ⊆ X i
w : Word fun i => H i
Heq : ↑(↑lift f) (Word.prod w) = 1
⊢ Word.prod w = 1
[PROOFSTEP]
rw [empty_of_word_prod_eq_one f hcard X hXnonempty hXdisj hpp Heq]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
hnontriv : Nontrivial ι
G : Type u_4
inst✝² : Group G
H : ι → Type u_5
inst✝¹ : (i : ι) → Group (H i)
f : (i : ι) → H i →* G
hcard : 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
α : Type u_6
inst✝ : MulAction G α
X : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hpp : Pairwise fun i j => ∀ (h : H i), ¬h = 1 → ↑(f i) h • X j ⊆ X i
w : Word fun i => H i
Heq : ↑(↑lift f) (Word.prod w) = 1
⊢ Word.prod Word.empty = 1
[PROOFSTEP]
rfl
[GOAL]
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝² : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
ι : Type u_4
G : ι → Type u_5
inst✝ : (i : ι) → Group (G i)
hG : (i : ι) → IsFreeGroup (G i)
⊢ MonoidHom.comp (↑lift fun i => ↑IsFreeGroup.lift fun x => FreeGroup.of { fst := i, snd := x })
      (↑FreeGroup.lift fun x => ↑of (IsFreeGroup.of x.snd)) =
    MonoidHom.id (FreeGroup ((i : ι) × IsFreeGroup.Generators (G i)))
[PROOFSTEP]
ext
[GOAL]
case h
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝² : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
ι : Type u_4
G : ι → Type u_5
inst✝ : (i : ι) → Group (G i)
hG : (i : ι) → IsFreeGroup (G i)
a✝ : IsFreeGroup.Generators (FreeGroup ((i : ι) × IsFreeGroup.Generators (G i)))
⊢ ↑(MonoidHom.comp (↑lift fun i => ↑IsFreeGroup.lift fun x => FreeGroup.of { fst := i, snd := x })
          (↑FreeGroup.lift fun x => ↑of (IsFreeGroup.of x.snd)))
      (IsFreeGroup.of a✝) =
    ↑(MonoidHom.id (FreeGroup ((i : ι) × IsFreeGroup.Generators (G i)))) (IsFreeGroup.of a✝)
[PROOFSTEP]
simp
[GOAL]
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝² : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
ι : Type u_4
G : ι → Type u_5
inst✝ : (i : ι) → Group (G i)
hG : (i : ι) → IsFreeGroup (G i)
⊢ MonoidHom.comp (↑FreeGroup.lift fun x => ↑of (IsFreeGroup.of x.snd))
      (↑lift fun i => ↑IsFreeGroup.lift fun x => FreeGroup.of { fst := i, snd := x }) =
    MonoidHom.id (CoprodI G)
[PROOFSTEP]
ext
[GOAL]
case h.h
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝² : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝¹ : Monoid N
ι : Type u_4
G : ι → Type u_5
inst✝ : (i : ι) → Group (G i)
hG : (i : ι) → IsFreeGroup (G i)
i✝ : ι
a✝ : IsFreeGroup.Generators (G i✝)
⊢ ↑(MonoidHom.comp
          (MonoidHom.comp (↑FreeGroup.lift fun x => ↑of (IsFreeGroup.of x.snd))
            (↑lift fun i => ↑IsFreeGroup.lift fun x => FreeGroup.of { fst := i, snd := x }))
          of)
      (IsFreeGroup.of a✝) =
    ↑(MonoidHom.comp (MonoidHom.id (CoprodI G)) of) (IsFreeGroup.of a✝)
[PROOFSTEP]
simp
[GOAL]
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ FreeGroup ι ≃* CoprodI fun x => FreeGroup Unit
[PROOFSTEP]
refine' MonoidHom.toMulEquiv _ _ _ _
[GOAL]
case refine'_1
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ FreeGroup ι →* CoprodI fun x => FreeGroup Unit
case refine'_2
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ (CoprodI fun x => FreeGroup Unit) →* FreeGroup ι
case refine'_3
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ MonoidHom.comp ?refine'_2 ?refine'_1 = MonoidHom.id (FreeGroup ι)
case refine'_4
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ MonoidHom.comp ?refine'_1 ?refine'_2 = MonoidHom.id (CoprodI fun x => FreeGroup Unit)
[PROOFSTEP]
exact FreeGroup.lift fun i => @CoprodI.of ι _ _ i (FreeGroup.of Unit.unit)
[GOAL]
case refine'_2
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ (CoprodI fun x => FreeGroup Unit) →* FreeGroup ι
case refine'_3
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ MonoidHom.comp ?refine'_2 (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ())) = MonoidHom.id (FreeGroup ι)
case refine'_4
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ MonoidHom.comp (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ())) ?refine'_2 =
    MonoidHom.id (CoprodI fun x => FreeGroup Unit)
[PROOFSTEP]
exact CoprodI.lift fun i => FreeGroup.lift fun _ => FreeGroup.of i
[GOAL]
case refine'_3
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => FreeGroup.of i)
      (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ())) =
    MonoidHom.id (FreeGroup ι)
[PROOFSTEP]
ext
[GOAL]
case refine'_3.h
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
a✝ : IsFreeGroup.Generators (FreeGroup ι)
⊢ ↑(MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => FreeGroup.of i)
          (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ())))
      (IsFreeGroup.of a✝) =
    ↑(MonoidHom.id (FreeGroup ι)) (IsFreeGroup.of a✝)
[PROOFSTEP]
simp
[GOAL]
case refine'_4
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
⊢ MonoidHom.comp (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ()))
      (↑lift fun i => ↑FreeGroup.lift fun x => FreeGroup.of i) =
    MonoidHom.id (CoprodI fun x => FreeGroup Unit)
[PROOFSTEP]
ext i a
[GOAL]
case refine'_4.h.h
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
i : ι
a : IsFreeGroup.Generators (FreeGroup Unit)
⊢ ↑(MonoidHom.comp
          (MonoidHom.comp (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ()))
            (↑lift fun i => ↑FreeGroup.lift fun x => FreeGroup.of i))
          of)
      (IsFreeGroup.of a) =
    ↑(MonoidHom.comp (MonoidHom.id (CoprodI fun x => FreeGroup Unit)) of) (IsFreeGroup.of a)
[PROOFSTEP]
cases a
[GOAL]
case refine'_4.h.h.unit
ι✝ : Type u_1
M : ι✝ → Type u_2
inst✝¹ : (i : ι✝) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
ι : Type u_1
i : ι
⊢ ↑(MonoidHom.comp
          (MonoidHom.comp (↑FreeGroup.lift fun i => ↑of (FreeGroup.of ()))
            (↑lift fun i => ↑FreeGroup.lift fun x => FreeGroup.of i))
          of)
      (IsFreeGroup.of PUnit.unit) =
    ↑(MonoidHom.comp (MonoidHom.id (CoprodI fun x => FreeGroup Unit)) of) (IsFreeGroup.of PUnit.unit)
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
⊢ Function.Injective ↑(↑FreeGroup.lift a)
[PROOFSTEP]
have :
  FreeGroup.lift a = (CoprodI.lift fun i => FreeGroup.lift fun _ => a i).comp (@freeGroupEquivCoprodI ι).toMonoidHom :=
  by
  ext i
  simp
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
⊢ ↑FreeGroup.lift a =
    MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivCoprodI)
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
i : IsFreeGroup.Generators (FreeGroup ι)
⊢ ↑(↑FreeGroup.lift a) (IsFreeGroup.of i) =
    ↑(MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivCoprodI))
      (IsFreeGroup.of i)
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
this :
  ↑FreeGroup.lift a =
    MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivCoprodI)
⊢ Function.Injective ↑(↑FreeGroup.lift a)
[PROOFSTEP]
rw [this, MonoidHom.coe_comp]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
this :
  ↑FreeGroup.lift a =
    MonoidHom.comp (↑lift fun i => ↑FreeGroup.lift fun x => a i) (MulEquiv.toMonoidHom freeGroupEquivCoprodI)
⊢ Function.Injective (↑(↑lift fun i => ↑FreeGroup.lift fun x => a i) ∘ ↑(MulEquiv.toMonoidHom freeGroupEquivCoprodI))
[PROOFSTEP]
clear this
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
⊢ Function.Injective (↑(↑lift fun i => ↑FreeGroup.lift fun x => a i) ∘ ↑(MulEquiv.toMonoidHom freeGroupEquivCoprodI))
[PROOFSTEP]
refine'
  Function.Injective.comp _
    (MulEquiv.injective freeGroupEquivCoprodI)
      -- Step two: Invoke the ping-pong lemma for free products
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)
[PROOFSTEP]
show
  Function.Injective
    (lift fun i : ι => FreeGroup.lift fun _ => a i)
      -- Prepare to instantiate lift_injective_of_ping_pong
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)
[PROOFSTEP]
let H : ι → Type _ := fun _i => FreeGroup Unit
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)
[PROOFSTEP]
let f : ∀ i, H i →* G := fun i => FreeGroup.lift fun _ => a i
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)
[PROOFSTEP]
let X' : ι → Set α := fun i => X i ∪ Y i
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Function.Injective ↑(↑lift fun i => ↑FreeGroup.lift fun x => a i)
[PROOFSTEP]
apply lift_injective_of_ping_pong f _ X'
[GOAL]
case hXnonempty
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ ∀ (i : ι), Set.Nonempty (X' i)
case hXdisj
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => Disjoint (X' i) (X' j)
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
show ∀ i, (X' i).Nonempty
[GOAL]
case hXnonempty
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ ∀ (i : ι), Set.Nonempty (X' i)
[PROOFSTEP]
exact fun i => Set.Nonempty.inl (hXnonempty i)
[GOAL]
case hXdisj
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => Disjoint (X' i) (X' j)
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
show Pairwise fun i j => Disjoint (X' i) (X' j)
[GOAL]
case hXdisj
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => Disjoint (X' i) (X' j)
[PROOFSTEP]
intro i j hij
[GOAL]
case hXdisj
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X' i) (X' j)
[PROOFSTEP]
simp only
[GOAL]
case hXdisj
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i ∪ Y i) (X j ∪ Y j)
[PROOFSTEP]
apply Disjoint.union_left
[GOAL]
case hXdisj.hs
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i) (X j ∪ Y j)
[PROOFSTEP]
apply Disjoint.union_right
[GOAL]
case hXdisj.ht
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (Y i) (X j ∪ Y j)
[PROOFSTEP]
apply Disjoint.union_right
[GOAL]
case hXdisj.hs.ht
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i) (X j)
[PROOFSTEP]
exact hXdisj hij
[GOAL]
case hXdisj.hs.hu
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (X i) (Y j)
[PROOFSTEP]
exact hXYdisj i j
[GOAL]
case hXdisj.ht.ht
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (Y i) (X j)
[PROOFSTEP]
exact (hXYdisj j i).symm
[GOAL]
case hXdisj.ht.hu
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ Disjoint (Y i) (Y j)
[PROOFSTEP]
exact hYdisj hij
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
show Pairwise fun i j => ∀ h : H i, h ≠ 1 → f i h • X' j ⊆ X' i
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ Pairwise fun i j => ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i
[PROOFSTEP]
rintro i j hij
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ ∀ (h : H i), h ≠ 1 → ↑(f i) h • X' j ⊆ X' i
[PROOFSTEP]
refine' FreeGroup.freeGroupUnitEquivInt.forall_congr_left'.mpr _
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
⊢ ∀ (y : ℤ),
    ↑FreeGroup.freeGroupUnitEquivInt.symm y ≠ 1 → ↑(f i) (↑FreeGroup.freeGroupUnitEquivInt.symm y) • X' j ⊆ X' i
[PROOFSTEP]
intro n hne1
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ ↑(f i) (↑FreeGroup.freeGroupUnitEquivInt.symm n) • X' j ⊆ X' i
[PROOFSTEP]
change FreeGroup.lift (fun _ => a i) (FreeGroup.of () ^ n) • X' j ⊆ X' i
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ ↑(↑FreeGroup.lift fun x => a i) (FreeGroup.of () ^ n) • X' j ⊆ X' i
[PROOFSTEP]
simp only [map_zpow, FreeGroup.lift.of]
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i
[PROOFSTEP]
change a i ^ n • X' j ⊆ X' i
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ a i ^ n • X' j ⊆ X' i
[PROOFSTEP]
have hnne0 : n ≠ 0 := by
  rintro rfl
  apply hne1
  simp; rfl
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
⊢ n ≠ 0
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm 0 ≠ 1
⊢ False
[PROOFSTEP]
apply hne1
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm 0 ≠ 1
⊢ ↑FreeGroup.freeGroupUnitEquivInt.symm 0 = 1
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm 0 ≠ 1
⊢ ↑FreeGroup.freeGroupUnitEquivInt.symm 0 = 1
[PROOFSTEP]
rfl
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hne1 : ↑FreeGroup.freeGroupUnitEquivInt.symm n ≠ 1
hnne0 : n ≠ 0
⊢ a i ^ n • X' j ⊆ X' i
[PROOFSTEP]
clear hne1
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
⊢ a i ^ n • X' j ⊆ X' i
[PROOFSTEP]
simp only
  -- Positive and negative powers separately
[GOAL]
case hpp
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i
[PROOFSTEP]
cases' (lt_or_gt_of_ne hnne0).symm with hlt hgt
[GOAL]
case hpp.inl
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hlt : n > 0
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i
[PROOFSTEP]
have h1n : 1 ≤ n := hlt
[GOAL]
case hpp.inl
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hlt : n > 0
h1n : 1 ≤ n
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i
[PROOFSTEP]
calc
  a i ^ n • X' j ⊆ a i ^ n • (Y i)ᶜ := smul_set_mono ((hXYdisj j i).union_left <| hYdisj hij.symm).subset_compl_right
  _ ⊆ X i := by
    clear hnne0 hlt
    refine Int.le_induction (P := fun n => a i ^ n • (Y i)ᶜ ⊆ X i) ?_ ?_ n h1n
    · dsimp
      rw [zpow_one]
      exact hX i
    · dsimp
      intro n _hle hi
      calc
        a i ^ (n + 1) • (Y i)ᶜ = (a i ^ n * a i) • (Y i)ᶜ := by rw [zpow_add, zpow_one]
        _ = a i ^ n • a i • (Y i)ᶜ := (MulAction.mul_smul _ _ _)
        _ ⊆ a i ^ n • X i := (smul_set_mono <| hX i)
        _ ⊆ a i ^ n • (Y i)ᶜ := (smul_set_mono (hXYdisj i i).subset_compl_right)
        _ ⊆ X i := hi
  _ ⊆ X' i := Set.subset_union_left _ _
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hlt : n > 0
h1n : 1 ≤ n
⊢ a i ^ n • (Y i)ᶜ ⊆ X i
[PROOFSTEP]
clear hnne0 hlt
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ a i ^ n • (Y i)ᶜ ⊆ X i
[PROOFSTEP]
refine Int.le_induction (P := fun n => a i ^ n • (Y i)ᶜ ⊆ X i) ?_ ?_ n h1n
[GOAL]
case refine_1
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ (fun n => a i ^ n • (Y i)ᶜ ⊆ X i) 1
[PROOFSTEP]
dsimp
[GOAL]
case refine_1
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ a i ^ 1 • (Y i)ᶜ ⊆ X i
[PROOFSTEP]
rw [zpow_one]
[GOAL]
case refine_1
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ a i • (Y i)ᶜ ⊆ X i
[PROOFSTEP]
exact hX i
[GOAL]
case refine_2
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ ∀ (n : ℤ), 1 ≤ n → (fun n => a i ^ n • (Y i)ᶜ ⊆ X i) n → (fun n => a i ^ n • (Y i)ᶜ ⊆ X i) (n + 1)
[PROOFSTEP]
dsimp
[GOAL]
case refine_2
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
h1n : 1 ≤ n
⊢ ∀ (n : ℤ), 1 ≤ n → a i ^ n • (Y i)ᶜ ⊆ X i → a i ^ (n + 1) • (Y i)ᶜ ⊆ X i
[PROOFSTEP]
intro n _hle hi
[GOAL]
case refine_2
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
h1n : 1 ≤ n✝
n : ℤ
_hle : 1 ≤ n
hi : a i ^ n • (Y i)ᶜ ⊆ X i
⊢ a i ^ (n + 1) • (Y i)ᶜ ⊆ X i
[PROOFSTEP]
calc
  a i ^ (n + 1) • (Y i)ᶜ = (a i ^ n * a i) • (Y i)ᶜ := by rw [zpow_add, zpow_one]
  _ = a i ^ n • a i • (Y i)ᶜ := (MulAction.mul_smul _ _ _)
  _ ⊆ a i ^ n • X i := (smul_set_mono <| hX i)
  _ ⊆ a i ^ n • (Y i)ᶜ := (smul_set_mono (hXYdisj i i).subset_compl_right)
  _ ⊆ X i := hi
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
h1n : 1 ≤ n✝
n : ℤ
_hle : 1 ≤ n
hi : a i ^ n • (Y i)ᶜ ⊆ X i
⊢ a i ^ (n + 1) • (Y i)ᶜ = (a i ^ n * a i) • (Y i)ᶜ
[PROOFSTEP]
rw [zpow_add, zpow_one]
[GOAL]
case hpp.inr
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i
[PROOFSTEP]
have h1n : n ≤ -1 := by
  apply Int.le_of_lt_add_one
  simpa using hgt
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
⊢ n ≤ -1
[PROOFSTEP]
apply Int.le_of_lt_add_one
[GOAL]
case H
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
⊢ n < -1 + 1
[PROOFSTEP]
simpa using hgt
[GOAL]
case hpp.inr
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ a i ^ n • (X j ∪ Y j) ⊆ X i ∪ Y i
[PROOFSTEP]
calc
  a i ^ n • X' j ⊆ a i ^ n • (X i)ᶜ :=
    smul_set_mono ((hXdisj hij.symm).union_left (hXYdisj i j).symm).subset_compl_right
  _ ⊆ Y i := by
    refine' Int.le_induction_down (P := fun n => a i ^ n • (X i)ᶜ ⊆ Y i) _ _ _ h1n
    · dsimp
      rw [zpow_neg, zpow_one]
      exact hY i
    · dsimp
      intro n _ hi
      calc
        a i ^ (n - 1) • (X i)ᶜ = (a i ^ n * (a i)⁻¹) • (X i)ᶜ := by rw [zpow_sub, zpow_one]
        _ = a i ^ n • (a i)⁻¹ • (X i)ᶜ := (MulAction.mul_smul _ _ _)
        _ ⊆ a i ^ n • Y i := (smul_set_mono <| hY i)
        _ ⊆ a i ^ n • (X i)ᶜ := (smul_set_mono (hXYdisj i i).symm.subset_compl_right)
        _ ⊆ Y i := hi
  _ ⊆ X' i := Set.subset_union_right _ _
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ a i ^ n • (X i)ᶜ ⊆ Y i
[PROOFSTEP]
refine' Int.le_induction_down (P := fun n => a i ^ n • (X i)ᶜ ⊆ Y i) _ _ _ h1n
[GOAL]
case refine'_1
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ (fun n => a i ^ n • (X i)ᶜ ⊆ Y i) (-1)
[PROOFSTEP]
dsimp
[GOAL]
case refine'_1
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ a i ^ (-1) • (X i)ᶜ ⊆ Y i
[PROOFSTEP]
rw [zpow_neg, zpow_one]
[GOAL]
case refine'_1
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ (a i)⁻¹ • (X i)ᶜ ⊆ Y i
[PROOFSTEP]
exact hY i
[GOAL]
case refine'_2
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ ∀ (n : ℤ), n ≤ -1 → (fun n => a i ^ n • (X i)ᶜ ⊆ Y i) n → (fun n => a i ^ n • (X i)ᶜ ⊆ Y i) (n - 1)
[PROOFSTEP]
dsimp
[GOAL]
case refine'_2
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n : ℤ
hnne0 : n ≠ 0
hgt : n < 0
h1n : n ≤ -1
⊢ ∀ (n : ℤ), n ≤ -1 → a i ^ n • (X i)ᶜ ⊆ Y i → a i ^ (n - 1) • (X i)ᶜ ⊆ Y i
[PROOFSTEP]
intro n _ hi
[GOAL]
case refine'_2
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
hnne0 : n✝ ≠ 0
hgt : n✝ < 0
h1n : n✝ ≤ -1
n : ℤ
a✝ : n ≤ -1
hi : a i ^ n • (X i)ᶜ ⊆ Y i
⊢ a i ^ (n - 1) • (X i)ᶜ ⊆ Y i
[PROOFSTEP]
calc
  a i ^ (n - 1) • (X i)ᶜ = (a i ^ n * (a i)⁻¹) • (X i)ᶜ := by rw [zpow_sub, zpow_one]
  _ = a i ^ n • (a i)⁻¹ • (X i)ᶜ := (MulAction.mul_smul _ _ _)
  _ ⊆ a i ^ n • Y i := (smul_set_mono <| hY i)
  _ ⊆ a i ^ n • (X i)ᶜ := (smul_set_mono (hXYdisj i i).symm.subset_compl_right)
  _ ⊆ Y i := hi
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
i j : ι
hij : i ≠ j
n✝ : ℤ
hnne0 : n✝ ≠ 0
hgt : n✝ < 0
h1n : n✝ ≤ -1
n : ℤ
a✝ : n ≤ -1
hi : a i ^ n • (X i)ᶜ ⊆ Y i
⊢ a i ^ (n - 1) • (X i)ᶜ = (a i ^ n * (a i)⁻¹) • (X i)ᶜ
[PROOFSTEP]
rw [zpow_sub, zpow_one]
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
show _ ∨ ∃ i, 3 ≤ #(H i)
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
⊢ 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
inhabit ι
[GOAL]
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ #ι ∨ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
right
[GOAL]
case h
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ ∃ i, 3 ≤ #(H i)
[PROOFSTEP]
use Inhabited.default
[GOAL]
case h
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ #(H default)
[PROOFSTEP]
simp only
[GOAL]
case h
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ #(FreeGroup Unit)
[PROOFSTEP]
rw [FreeGroup.freeGroupUnitEquivInt.cardinal_eq, Cardinal.mk_denumerable]
[GOAL]
case h
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 ≤ ℵ₀
[PROOFSTEP]
apply le_of_lt
[GOAL]
case h.a
ι : Type u_1
M : ι → Type u_2
inst✝⁴ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝³ : Monoid N
inst✝² : Nontrivial ι
G : Type u_1
inst✝¹ : Group G
a : ι → G
α : Type u_4
inst✝ : MulAction G α
X Y : ι → Set α
hXnonempty : ∀ (i : ι), Set.Nonempty (X i)
hXdisj : Pairwise fun i j => Disjoint (X i) (X j)
hYdisj : Pairwise fun i j => Disjoint (Y i) (Y j)
hXYdisj : ∀ (i j : ι), Disjoint (X i) (Y j)
hX : ∀ (i : ι), a i • (Y i)ᶜ ⊆ X i
hY : ∀ (i : ι), a⁻¹ i • (X i)ᶜ ⊆ Y i
H : ι → Type := fun _i => FreeGroup Unit
f : (i : ι) → H i →* G := fun i => ↑FreeGroup.lift fun x => a i
X' : ι → Set α := fun i => X i ∪ Y i
inhabited_h : Inhabited ι
⊢ 3 < ℵ₀
[PROOFSTEP]
exact nat_lt_aleph0 3
