Section Z_compl.
Local Open Scope Z_scope.
(* Provides a way to reason directly on Z in terms of nats instead of positive *)
Inductive Z_spec (x : Z) : Z -> Type :=
| ZintNull : x = 0 -> Z_spec x 0
| ZintPos (n : nat) : x = n -> Z_spec x n
| ZintNeg (n : nat) : x = - n -> Z_spec x (- n).
End Z_compl.
Definition powerRZ (x:R) (n:Z) :=
match n with
| Z0 => 1
| Zpos p => x ^ Pos.to_nat p
| Zneg p => / x ^ Pos.to_nat p
end.
Local Infix "^Z" := powerRZ (at level 30, right associativity) : R_scope.
Hint Resolve powerRZ_O powerRZ_1 powerRZ_NOR powerRZ_add: real.
Hint Resolve powerRZ_lt: real.
Hint Resolve powerRZ_le: real.
Local Open Scope Z_scope.

Lemma powerRZ_mult_distr :
forall m x y, ((0 <= m)%Z \/ (x * y <> 0)%R) ->
(powerRZ (x*y) m = powerRZ x m * powerRZ y m)%R.