% File 'arithmetic'

:- sorts
  additiveInteger >> nnAdditiveInteger.

:- macros
  minAdditive -> -(maxAdditive).

:- objects
  minAdditive..maxAdditive      :: additiveInteger;
  0..maxAdditive                :: nnAdditiveInteger.  

:- macros
  sum(#1,#2,#3) ->
        #1 is max(minAdditive, min((#2)+(#3),maxAdditive));  
  diff(#1,#2,#3) ->
        #1 is max(minAdditive, min((#2)-(#3),maxAdditive));  
  prod(#1,#2,#3) -> 
        #1 is max(minAdditive, min((#2)*(#3),maxAdditive)).

:- macros
  sum2(#1,#2) ->
        max(minAdditive, min((#1)+(#2),maxAdditive));  
  diff2(#1,#2) ->
        max(minAdditive, min((#1)-(#2),maxAdditive));  
  prod2(#1,#2) -> 
        max(minAdditive, min((#1)*(#2),maxAdditive)).


