typevar alpha, beta, gamma ;
type stream == num;

infix isin                                : 3;
infix <>, ::, :::, or, union              : 4 ;
infix +, -, and, intersect, minus, subset : 5 ;
infix =, <, >, /=, =<, >=, *, div, mod    : 6 ;

data list ( alpha ) == nil ++ alpha :: list ( alpha ) ++ alpha ::: list ( alpha ) ;

data set(alpha) == empty;

dec true, false         : truval ;        ! a nasty fudge !
dec _                   : alpha ;         ! another nasty fudge !

dec +, -, *, div, mod   : ( num # num ) -> num ;
dec =, <, =<, >, >=, /= : ( alpha # alpha) -> truval ;
dec <>                  : list ( alpha ) # list ( alpha ) -> list ( alpha ) ;
dec and, or             : ( truval # truval ) -> truval ;
dec chr                 : num -> char ;
dec ord                 : char -> num ;

dec abs : num -> num ;
--- abs n <= if n < 0 then 0 - n else n ;
dec not : truval -> truval ;
--- not ( true ) <= false ;
--- not ( false ) <= true ;


dec close       : stream -> void ;
dec eof         : char ;
dec getchar     : stream -> char ;
dec nl          : char ;
dec show        : alpha -> alpha ;
dec openin      : list ( char ) -> stream ;
dec openout     : list ( char ) -> stream ;
dec print       : list ( char ) -> void ;
dec putchar     : ( stream # char ) -> void ;
dec putlist     : ( list ( list ( char ) ) # stream ) -> void ;

dec bisect      : set ( alpha ) -> ( set ( alpha ) # set ( alpha ) ) ;
dec intersect   : ( set ( alpha ) # set ( alpha ) ) -> set ( alpha ) ;
dec isin        : ( alpha # set ( alpha ) ) -> truval ;
dec minus       : ( set ( alpha )  # set ( alpha ) ) -> set ( alpha ) ;
dec size        : set ( alpha ) -> num ;
dec split       : set ( alpha ) -> ( alpha # set ( alpha ) ) ;
dec subset      : ( set ( alpha )  # set ( alpha ) ) -> truval ;
dec union       : ( set ( alpha ) # set ( alpha ) ) -> set ( alpha ) ;
