intros z; simpl in |- *.
unfold Z_to_group_fun in |- *.
unfold Z_to_group_nat_fun in |- *.
case (Z_gt_le_dec z 0); intros z0.
auto with *.
case (Z_le_lt_eq_dec z 0 z0); intros z1.
apply
Trans
with (nat_to_group (group_inverse G r) (nat_of_P (pos_abs (Zlemma1 z1))));
auto with *.
auto with *.
Qed.
Hint Resolve Z_to_group_fun_eq: algebra.
Definition Z_to_group : Hom (ZZ:GROUP) G.
apply (BUILD_HOM_GROUP (G:=ZZ:GROUP) (G':=G) (ff:=Z_to_group_fun)).
intros x y H'; try assumption.
apply Trans with (Z_to_group_nat r x); auto with *.
apply Trans with (Z_to_group_nat r y); auto with *.
intros x y; try assumption.
apply Trans with (Z_to_group_nat r (sgroup_law ZZ x y)); auto with *.
apply Trans with (sgroup_law G (Z_to_group_nat r x) (Z_to_group_nat r y));
auto with *.
apply Trans with (Z_to_group_nat r (monoid_unit ZZ)); auto with *.
Defined.
End Zup2.
Set Strict Implicit.
Unset Implicit Arguments.
Definition group_power (G : GROUP) (x : G) (n : ZZ) := Z_to_group x n.
Set Implicit Arguments.
Unset Strict Implicit.
Definition sgroup_powers (G : GROUP) (g : G) := coKer (Z_to_group g).

Lemma sgroup_powers_prop :
forall (G : GROUP) (g x : G),
in_part x (sgroup_powers g) -> exists n : ZZ, Equal x (group_power G g n).