(*****************************************************)
(**                Division by 2                     *)

Definition half_aux (x : N.t) : N.t * N.t :=
  recursion (0, 0) (fun _ p => let (x1, x2) := p in (S x2, x1)) x.Definition half (x : N.t) := snd (half_aux x).#[global]
Instance half_aux_wd : Proper (N.eq ==> N.eq*N.eq) half_aux.#[global]
Instance half_wd : Proper (N.eq==>N.eq) half.

Lemma half_aux_succ : forall x, half_aux (S x) = (S (snd (half_aux x)), fst (half_aux x)).