Definition exp : Z -> U -> U.

(* Specifications: *)
Theorem exp_endo : forall (a : U) (n : Z), In U G a -> In U G (exp n a).
Lemma exp_unfold_pos : forall (a : U) (n : nat), In U G a -> exp (pos (S n)) a = star a (exp (pos n) a).
Lemma exp_unfold_neg : forall (a : U) (n : nat), In U G a -> exp (neg (S n)) a = star (inv a) (exp (neg n) a).
Lemma exp_l1 : forall (a : U) (n : nat), In U G a -> star a (exp (neg (S n)) a) = exp (neg n) a.
Lemma exp_l2 : forall (a : U) (n : Z), In U G a -> star a (exp n a) = exp (succZ n) a.
Lemma exp_l2' : forall (a : U) (n : Z), In U G a -> star (inv a) (exp n a) = exp (predZ n) a.
Theorem add_exponents : forall (a : U) (m n : Z), In U G a -> star (exp m a) (exp n a) = exp (addZ m n) a.
Lemma exp_commut1 : forall (a : U) (m : Z), In U G a -> star (exp m a) a = star a (exp m a).
Lemma tech_opp_pos_negZ1 : forall n : nat, oppZ (pos n) = neg n.
Lemma tech_opp_pos_negZ2 : forall n : nat, oppZ (neg n) = pos n.
Theorem change_exponent_sign : forall (a : U) (m : Z), In U G a -> inv (exp m a) = exp (oppZ m) a.