let rec add = function
  m, n -> if is_zero (n)
            then m
            else if is_even_non_zero (n)
                   then add (add (m, inv_d0 (n)), inv_d0 (n))
                   else (* is_odd (n) *)
                        suc (add (add (m, inv_d1 (n)), inv_d1 (n)))