/-- Group conjugation, `MulAut.conj g h = g * h * g⁻¹`, as a monoid homomorphism
mapping multiplication in `G` into multiplication in the automorphism group `MulAut G`.
See also the type `ConjAct G` for any group `G`, which has a `MulAction (ConjAct G) G` instance
where `conj G` acts on `G` by conjugation. -/
def conj [Group G] : G →* MulAut G where
  toFun g :=
    { toFun := fun h => g * h * g⁻¹
      invFun := fun h => g⁻¹ * h * g
      left_inv := fun _ => by simp only [mul_assoc, inv_mul_cancel_left, mul_left_inv, mul_one]
      right_inv := fun _ => by simp only [mul_assoc, mul_inv_cancel_left, mul_right_inv, mul_one]
      map_mul' := by simp only [mul_assoc, inv_mul_cancel_left, forall_const] }
  map_mul' g₁ g₂ := by
    ext h
    

Proof state:
case h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝¹ : Mul M
inst✝ : Group G
g₁ g₂ h : G
⊢ (OneHom.toFun
        {
          toFun := fun g =>
            {
              toEquiv :=
                { toFun := fun h => g * h * g⁻¹, invFun := fun h => g⁻¹ * h * g,
                  left_inv := (_ : ∀ (x : G), g⁻¹ * (g * x * g⁻¹) * g = x),
                  right_inv := (_ : ∀ (x : G), g * (g⁻¹ * x * g) * g⁻¹ = x) },
              map_mul' := (_ : ∀ (a a_1 : G), g * (a * a_1) * g⁻¹ = g * a * g⁻¹ * (g * a_1 * g⁻¹)) },
          map_one' :=
            (_ :
              (fun g =>
                    {
                      toEquiv :=
                        { toFun := fun h => g * h * g⁻¹, invFun := fun h => g⁻¹ * h * g,
                          left_inv := (_ : ∀ (x : G), g⁻¹ * (g * x * g⁻¹) * g = x),
                          right_inv := (_ : ∀ (x : G), g * (g⁻¹ * x * g) * g⁻¹ = x) },
                      map_mul' := (_ : ∀ (a a_1 : G), g * (a * a_1) * g⁻¹ = g * a * g⁻¹ * (g * a_1 * g⁻¹)) })
                  1 =
                1) }
        (g₁ * g₂))
      h =
    (OneHom.toFun
          {
            toFun := fun g =>
              {
                toEquiv :=
                  { toFun := fun h => g * h * g⁻¹, invFun := fun h => g⁻¹ * h * g,
                    left_inv := (_ : ∀ (x : G), g⁻¹ * (g * x * g⁻¹) * g = x),
                    right_inv := (_ : ∀ (x : G), g * (g⁻¹ * x * g) * g⁻¹ = x) },
                map_mul' := (_ : ∀ (a a_1 : G), g * (a * a_1) * g⁻¹ = g * a * g⁻¹ * (g * a_1 * g⁻¹)) },
            map_one' :=
              (_ :
                (fun g =>
                      {
                        toEquiv :=
                          { toFun := fun h => g * h * g⁻¹, invFun := fun h => g⁻¹ * h * g,
                            left_inv := (_ : ∀ (x : G), g⁻¹ * (g * x * g⁻¹) * g = x),
                            right_inv := (_ : ∀ (x : G), g * (g⁻¹ * x * g) * g⁻¹ = x) },
                        map_mul' := (_ : ∀ (a a_1 : G), g * (a * a_1) * g⁻¹ = g * a * g⁻¹ * (g * a_1 * g⁻¹)) })
                    1 =
                  1) }
          g₁ *
        OneHom.toFun
          {
            toFun := fun g =>
              {
                toEquiv :=
                  { toFun := fun h => g * h * g⁻¹, invFun := fun h => g⁻¹ * h * g,
                    left_inv := (_ : ∀ (x : G), g⁻¹ * (g * x * g⁻¹) * g = x),
                    right_inv := (_ : ∀ (x : G), g * (g⁻¹ * x * g) * g⁻¹ = x) },
                map_mul' := (_ : ∀ (a a_1 : G), g * (a * a_1) * g⁻¹ = g * a * g⁻¹ * (g * a_1 * g⁻¹)) },
            map_one' :=
              (_ :
                (fun g =>
                      {
                        toEquiv :=
                          { toFun := fun h => g * h * g⁻¹, invFun := fun h => g⁻¹ * h * g,
                            left_inv := (_ : ∀ (x : G), g⁻¹ * (g * x * g⁻¹) * g = x),
                            right_inv := (_ : ∀ (x : G), g * (g⁻¹ * x * g) * g⁻¹ = x) },
                        map_mul' := (_ : ∀ (a a_1 : G), g * (a * a_1) * g⁻¹ = g * a * g⁻¹ * (g * a_1 * g⁻¹)) })
                    1 =
                  1) }
          g₂)
      h

Next tactic:
show g₁ * g₂ * h * (g₁ * g₂)⁻¹ = g₁ * (g₂ * h * g₂⁻¹) * g₁⁻¹