(** An injection from [nat] to [Z] *)
Definition nat_to_Z_i (n:nat) := 
  match even_odd_exists_dec n with
  | inl s => let (k, _) := s in Z_of_nat k
  | inr s => let (k, _) := s in Z.opp (Z_of_nat k)
  end.

(* Specifications: *)
Lemma double_eq_half_eq:forall m n, Div2.double m = Div2.double n -> m =n.
Lemma parity_mismatch_not_eq:forall m n, Even.even m -> Even.odd n -> ~m=n.
Lemma even_double:forall n, Even.even (Div2.double n).
Lemma double_S_neq_pred:forall m n, ~Div2.double (S m) = pred (Div2.double n).
Lemma eq_add_pred : forall n m : nat, pred n = pred m -> {n = m} + {n<2/\m<2}.
Lemma nat_to_Z_to_nat_i : forall (z:Z), nat_to_Z_i (Z_to_nat_i z) = z.
Lemma Z_to_nat_to_Z_i : forall (n:nat), Z_to_nat_i (nat_to_Z_i n) = n.
Theorem Z_is_denumerable:is_denumerable Z.