Canonical bin_nat_eqType := Eval hnf in EqType N bin_nat_eqMixin.
Arguments N.eqb !n !m.
Section NumberInterpretation.
Section Trec.
Fixpoint nat_of_pos p0 :=
match p0 with
| xO p => (nat_of_pos p).*2
| xI p => (nat_of_pos p).*2.+1
| xH   => 1
end.
End Trec.
Local Coercion nat_of_pos : positive >-> nat.
Coercion nat_of_bin b := if b is Npos p then p : nat else 0.
Fixpoint pos_of_nat n0 m0 :=
match n0, m0 with
| n.+1, m.+2 => pos_of_nat n m
| n.+1,    1 => xO (pos_of_nat n n)
| n.+1,    0 => xI (pos_of_nat n n)
|    0,    _ => xH
end.
Definition bin_of_nat n0 := if n0 is n.+1 then Npos (pos_of_nat n n) else 0%num.

(* Specifications: *)
Lemma bin_of_natK : cancel bin_of_nat nat_of_bin.
Lemma nat_of_binK : cancel nat_of_bin bin_of_nat.
Lemma nat_of_succ_gt0 p : Pos.succ p = p.+1 :> nat.
Lemma nat_of_add_bin b1 b2 : (b1 + b2)%num = b1 + b2 :> nat.
Lemma nat_of_exp_bin n (b : N) : n ^ b = pow_N 1 muln n b.
End NumberInterpretation.