Canonical bin_nat_eqMixin := EqMixin eq_binP.Canonical bin_nat_eqType := Eval hnf in EqType N bin_nat_eqMixin.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.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_addn_gt0 p q : (p + q)%positive = p + q :> nat.
Lemma nat_of_add_bin b1 b2 : (b1 + b2)%num = b1 + b2 :> nat.
Lemma nat_of_mul_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.