Ltac simpl_to_nat := simpl N.to_nat; unfold Pos.to_nat; simpl Pos.iter_op.

(* Specifications: *)
Lemma to_of_lu d : to_lu (of_lu d) = lnorm d.
Lemma to_of (d:uint) : N.to_uint (Pos.of_uint d) = unorm d.
Lemma to_uint_nonzero p : Pos.to_uint p <> zero.
Lemma to_uint_nonnil p : Pos.to_uint p <> Nil.
Lemma to_uint_inj p p' : Pos.to_uint p = Pos.to_uint p' -> p = p'.
Lemma to_uint_pos_surj d : unorm d<>zero -> exists p, Pos.to_uint p = unorm d.
Lemma of_uint_norm d : Pos.of_uint (unorm d) = Pos.of_uint d.
Lemma of_inj d d' : Pos.of_uint d = Pos.of_uint d' -> unorm d = unorm d'.
Lemma of_iff d d' : Pos.of_uint d = Pos.of_uint d' <-> unorm d = unorm d'.
Lemma nztail_to_uint p : let (h, n) := Decimal.nztail (Pos.to_uint p) in Npos p = Pos.of_uint h * 10^(N.of_nat n).
Lemma of_to (p:positive) : Pos.of_int (Pos.to_int p) = Some p.
Lemma to_of (d:int)(p:positive) : Pos.of_int d = Some p -> Pos.to_int p = norm d.
Lemma to_int_inj p p' : Pos.to_int p = Pos.to_int p' -> p = p'.
Lemma to_int_pos_surj d : unorm d <> zero -> exists p, Pos.to_int p = norm (Pos d).
Lemma of_int_norm d : Pos.of_int (norm d) = Pos.of_int d.
Lemma of_inj_pos d d' : Pos.of_int (Pos d) = Pos.of_int (Pos d') -> unorm d = unorm d'.
Lemma to_of_lu d : to_lu (of_lu d) = lnorm d.
Lemma to_of (d:uint) : N.to_hex_uint (Pos.of_hex_uint d) = unorm d.
Lemma to_uint_nonzero p : Pos.to_hex_uint p <> zero.
Lemma to_uint_nonnil p : Pos.to_hex_uint p <> Nil.
Lemma to_uint_inj p p' : Pos.to_hex_uint p = Pos.to_hex_uint p' -> p = p'.
Lemma to_uint_pos_surj d : unorm d<>zero -> exists p, Pos.to_hex_uint p = unorm d.
Lemma of_uint_norm d : Pos.of_hex_uint (unorm d) = Pos.of_hex_uint d.
Lemma of_inj d d' : Pos.of_hex_uint d = Pos.of_hex_uint d' -> unorm d = unorm d'.
Lemma of_iff d d' : Pos.of_hex_uint d = Pos.of_hex_uint d' <-> unorm d = unorm d'.
Lemma nztail_to_hex_uint p : let (h, n) := Hexadecimal.nztail (Pos.to_hex_uint p) in Npos p = Pos.of_hex_uint h * 0x10^(N.of_nat n).