/-- 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
    

Proof state:
A : Type u_1
M : Type u_2
G : Type u_3
inst✝¹ : Mul M
inst✝ : Group G
g₁ g₂ : 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₂) =
    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₂

Next tactic:
ext h