let nat_of_int =
  let rec f = function
    n -> (* n >= 0 *)
         if n = 0
           then zero ()
           else (if n mod 2 = 0 then d0 else d1) (f (n / 2))
in
  function
    z -> if z >= 0
           then f (z)
           else failwith ("nat_of_int : requires a non-negative integer as its argument")