(** Since [P 0] can be anything in NZ (either [-1], [0], or even other numbers, we cannot state previous lemma for [n=O]. *)
(** If we require in addition a strict order on NZ, we can prove that [ofnat] is injective, and hence that NZ is infinite (i.e. we ban Z/nZ models) *)
Module NZOfNatOrd (Import NZ:NZOrdSig').
Include NZOfNat NZ.
Include NZBaseProp NZ <+ NZOrderProp NZ.
Local Open Scope ofnat.

(* Specifications: *)
Theorem ofnat_S_gt_0 :
forall n : nat, 0 < [Datatypes.S n].
Theorem ofnat_S_neq_0 :
forall n : nat, 0 ~= [Datatypes.S n].
Lemma ofnat_injective : forall n m, [n]==[m] -> n = m.
Lemma ofnat_eq : forall n m, [n]==[m] <-> n = m.
(* In addition, we can prove that [ofnat] preserves order. *)
Lemma ofnat_lt : forall n m : nat, [n]<[m] <-> (n<m)%nat.
Lemma ofnat_le : forall n m : nat, [n]<=[m] <-> (n<=m)%nat.
End NZOfNatOrd.