l3lab/ntp-mathlib huggingface dataset:
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_3
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
⊢ a✝ * 1 = a✝

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_4
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
x✝ : MulAut M
⊢ npowRec 0 x✝ = 1

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_5
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
x✝ : MulAut M
⊢ npowRec (n✝ + 1) x✝ = x✝ * npowRec n✝ x✝

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_6
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ b✝ : MulAut M
⊢ a✝ / b✝ = a✝ * b✝⁻¹

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_7
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
⊢ zpowRec 0 a✝ = 1

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_8
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
a✝ : MulAut M
⊢ zpowRec (Int.ofNat (Nat.succ n✝)) a✝ = a✝ * zpowRec (Int.ofNat n✝) a✝

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_9
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
a✝ : MulAut M
⊢ zpowRec (Int.negSucc n✝) a✝ = (zpowRec (↑(Nat.succ n✝)) a✝)⁻¹

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  

Proof state:
case refine'_10
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
⊢ a✝⁻¹ * a✝ = 1

Next tactic:
ext
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_1.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ b✝ c✝ : MulAut M
x✝ : M
⊢ (a✝ * b✝ * c✝) x✝ = (a✝ * (b✝ * c✝)) x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_1.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ b✝ c✝ : MulAut M
x✝ : M
⊢ (a✝ * b✝ * c✝) x✝ = (a✝ * (b✝ * c✝)) x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_2.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (1 * a✝) x✝ = a✝ x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_2.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (1 * a✝) x✝ = a✝ x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_3.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (a✝ * 1) x✝ = a✝ x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_3.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (a✝ * 1) x✝ = a✝ x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_4.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
x✝¹ : MulAut M
x✝ : M
⊢ (npowRec 0 x✝¹) x✝ = 1 x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_4.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
x✝¹ : MulAut M
x✝ : M
⊢ (npowRec 0 x✝¹) x✝ = 1 x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_5.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
x✝¹ : MulAut M
x✝ : M
⊢ (npowRec (n✝ + 1) x✝¹) x✝ = (x✝¹ * npowRec n✝ x✝¹) x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_5.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
x✝¹ : MulAut M
x✝ : M
⊢ (npowRec (n✝ + 1) x✝¹) x✝ = (x✝¹ * npowRec n✝ x✝¹) x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_6.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ b✝ : MulAut M
x✝ : M
⊢ (a✝ / b✝) x✝ = (a✝ * b✝⁻¹) x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_6.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ b✝ : MulAut M
x✝ : M
⊢ (a✝ / b✝) x✝ = (a✝ * b✝⁻¹) x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_7.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (zpowRec 0 a✝) x✝ = 1 x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_7.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (zpowRec 0 a✝) x✝ = 1 x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_8.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
a✝ : MulAut M
x✝ : M
⊢ (zpowRec (Int.ofNat (Nat.succ n✝)) a✝) x✝ = (a✝ * zpowRec (Int.ofNat n✝) a✝) x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_8.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
a✝ : MulAut M
x✝ : M
⊢ (zpowRec (Int.ofNat (Nat.succ n✝)) a✝) x✝ = (a✝ * zpowRec (Int.ofNat n✝) a✝) x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_9.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
a✝ : MulAut M
x✝ : M
⊢ (zpowRec (Int.negSucc n✝) a✝) x✝ = (zpowRec (↑(Nat.succ n✝)) a✝)⁻¹ x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_9.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
n✝ : ℕ
a✝ : MulAut M
x✝ : M
⊢ (zpowRec (Int.negSucc n✝) a✝) x✝ = (zpowRec (↑(Nat.succ n✝)) a✝)⁻¹ x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  

Proof state:
case refine'_10.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (a✝⁻¹ * a✝) x✝ = 1 x✝

Next tactic:
try rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try 

Proof state:
case refine'_10.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (a✝⁻¹ * a✝) x✝ = 1 x✝

Next tactic:
rfl
/-- The group operation on multiplicative automorphisms is defined by `g h => MulEquiv.trans h g`.
This means that multiplication agrees with composition, `(g*h)(x) = g (h x)`.
-/
instance : Group (MulAut M) := by
  refine'
  { mul := fun g h => MulEquiv.trans h g
    one := MulEquiv.refl M
    inv := MulEquiv.symm
    div := fun g h => MulEquiv.trans h.symm g
    npow := @npowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩
    zpow := @zpowRec _ ⟨MulEquiv.refl M⟩ ⟨fun g h => MulEquiv.trans h g⟩ ⟨MulEquiv.symm⟩
    .. } <;>
  intros <;>
  ext <;>
  try rfl
  

Proof state:
case refine'_10.h
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
a✝ : MulAut M
x✝ : M
⊢ (a✝⁻¹ * a✝) x✝ = 1 x✝

Next tactic:
apply Equiv.left_inv
/-- Monoid hom from the group of multiplicative automorphisms to the group of permutations. -/
def toPerm : MulAut M →* Equiv.Perm M := by
  

Proof state:
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
⊢ MulAut M →* Equiv.Perm M

Next tactic:
refine' { toFun := MulEquiv.toEquiv, ..}
/-- Monoid hom from the group of multiplicative automorphisms to the group of permutations. -/
def toPerm : MulAut M →* Equiv.Perm M := by
  refine' { toFun := MulEquiv.toEquiv, ..} <;> 

Proof state:
case refine'_1
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
⊢ 1.toEquiv = 1

Next tactic:
intros
/-- Monoid hom from the group of multiplicative automorphisms to the group of permutations. -/
def toPerm : MulAut M →* Equiv.Perm M := by
  refine' { toFun := MulEquiv.toEquiv, ..} <;> 

Proof state:
case refine'_2
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
⊢ ∀ (x y : MulAut M),
    OneHom.toFun { toFun := MulEquiv.toEquiv, map_one' := ?refine'_1 } (x * y) =
      OneHom.toFun { toFun := MulEquiv.toEquiv, map_one' := ?refine'_1 } x *
        OneHom.toFun { toFun := MulEquiv.toEquiv, map_one' := ?refine'_1 } y

Next tactic:
intros
/-- Monoid hom from the group of multiplicative automorphisms to the group of permutations. -/
def toPerm : MulAut M →* Equiv.Perm M := by
  refine' { toFun := MulEquiv.toEquiv, ..} <;> intros <;> 

Proof state:
case refine'_1
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
⊢ 1.toEquiv = 1

Next tactic:
rfl
/-- Monoid hom from the group of multiplicative automorphisms to the group of permutations. -/
def toPerm : MulAut M →* Equiv.Perm M := by
  refine' { toFun := MulEquiv.toEquiv, ..} <;> intros <;> 

Proof state:
case refine'_2
A : Type u_1
M : Type u_2
G : Type u_3
inst✝ : Mul M
x✝ y✝ : MulAut M
⊢ OneHom.toFun { toFun := MulEquiv.toEquiv, map_one' := (_ : 1.toEquiv = 1.toEquiv) } (x✝ * y✝) =
    OneHom.toFun { toFun := MulEquiv.toEquiv, map_one' := (_ : 1.toEquiv = 1.toEquiv) } x✝ *
      OneHom.toFun { toFun := MulEquiv.toEquiv, map_one' := (_ : 1.toEquiv = 1.toEquiv) } y✝

Next tactic:
rfl
/-- 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 

Proof state:
A : Type u_1
M : Type u_2
G : Type u_3
inst✝¹ : Mul M
inst✝ : Group G
g x✝ : G
⊢ (fun h => g⁻¹ * h * g) ((fun h => g * h * g⁻¹) x✝) = x✝

Next tactic:
simp only [mul_assoc, inv_mul_cancel_left, mul_left_inv, mul_one]