Theorem: Monoid.CoprodI.lift_symm_apply
File: Mathlib/GroupTheory/CoprodI.lean

Proof steps:
state_before: ι : 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 → (Con.ker (FreeMonoid.lift fun p => (fi p.fst) p.snd)) x y
state_after: ι : 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
tactic: simp_rw [Con.ker_rel]
state_before: ι : 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
state_after: 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 ⟨i, 1⟩) = (FreeMonoid.lift fun p => (fi p.fst) p.snd) 1

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 ⟨i✝, x⟩ * FreeMonoid.of ⟨i✝, y⟩) =
    (FreeMonoid.lift fun p => (fi p.fst) p.snd) (FreeMonoid.of ⟨i✝, x * y⟩)
tactic: rintro _ _ (i | ⟨x, y⟩)
state_before: ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
⊢ Function.LeftInverse (fun f i => f.comp of) fun fi =>
    (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯
state_after: ι : 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 => f.comp of) ((fun fi => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) fi) = fi
tactic: intro fi
state_before: ι : 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 => f.comp of) ((fun fi => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) fi) = fi
state_after: 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 => f.comp of) ((fun fi => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) fi) i) x =
    (fi i) x
tactic: ext i x
state_before: 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 => f.comp of) ((fun fi => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) fi) i) x =
    (fi i) x
state_after: no goals
tactic: erw [MonoidHom.comp_apply, of_apply, Con.lift_mk', FreeMonoid.lift_eval_of]
state_before: ι : Type u_1
M : ι → Type u_2
inst✝¹ : (i : ι) → Monoid (M i)
N : Type u_3
inst✝ : Monoid N
⊢ Function.RightInverse (fun f i => f.comp of) fun fi =>
    (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯
state_after: ι : 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 => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) ((fun f i => f.comp of) f) = f
tactic: intro f
state_before: ι : 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 => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) ((fun f i => f.comp of) f) = f
state_after: 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
⊢ (((fun fi => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) ((fun f i => f.comp of) f)).comp of)
      x =
    (f.comp of) x
tactic: ext i x
state_before: 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
⊢ (((fun fi => (conGen (Rel M)).lift (FreeMonoid.lift fun p => (fi p.fst) p.snd) ⋯) ((fun f i => f.comp of) f)).comp of)
      x =
    (f.comp of) x
state_after: no goals
tactic: rfl