%%% Representation of numbers in a generic base
%%% Authors: Frank Pfenning, Roberto Virga

%use inequality/integers.

%% equality
== : integer -> integer -> type.  %infix none 1000 ==.

id : X == X.

%% lists of numbers
list : type.

nil : list.

,   : integer -> list -> list.  %infix right 100 ,.

%% integer division
divide : integer -> integer -> integer -> integer -> type.

d0 : divide M N Q R
       <- M == Q * N + R
       <- R >= 0
       <- (N - 1) >= R.

%% split a nonnegative number into a digit plus a residual
represent : integer -> integer -> list -> type.

r0 : represent 0 B  nil.

r1 : represent X B (R , L)
       <- X >= 1
       <- divide X B Q R
       <- represent Q B L.
