Arithmetic is performed by built-in predicates, which take as arguments arithmetic expressions and evaluate them. An arithmetic expression is a term built from numbers, variables, and functors that represent arithmetic functions. At the time of evaluation, each variable in an arithmetic expression must be bound to a non-variable expression. An expression evaluates to a number, which may be an integer or a float.
The range of integers is [-2^2147483616, 2^2147483616).  Thus for
all practical purposes, the range of integers can be considered
infinite.
   
The range of floats is the one provided by the C double type,
typically [4.9e-324, 1.8e+308] (plus or minus). In case of
overflow or division by zero, iso execution mode will raise an
evaluation error exception. In sicstus execution mode no
exceptions will be raised, instead appropriate infinity values, as
defined by the IEEE standard, will be used.
   
Only certain functors are permitted in an arithmetic expression. 
These are listed below, together with an indication of the functions
they represent.  X and Y are assumed to be arithmetic
expressions.  Unless stated otherwise, the arguments of an
expression may be any numbers and its value is a float if any of its
arguments is a float; otherwise, the value is an integer.  Any
implicit coercions are performed with the integer/1 and
float/1 functions.
   
The arithmetic functors are annotated with [ISO], [ISO only], or [SICStus only], with the same meaning as for the built-in predicates; see ISO Compliance.
+(X)
     -X
     X+Y
     X-Y
     X*Y
     X/Y
     X//Y      ISO
     iso execution mode X and Y have to be integers.
     X rem Y        ISO
     integer(X)-integer(Y)*(X//Y). The sign of
a nonzero remainder will thus be the same as that of the dividend. 
In iso execution mode X and Y have to be integers.
     X mod Y          ISO only
     integer(X)-integer(Y)*floor(X/Y). 
The sign of
a nonzero remainder will thus be the same as that of the divisor. 
X and Y have to be integers.
     X mod Y          SICStus only
     integer(X)
     float_integer_part(X)        ISO
     float(integer(X)). In iso execution mode,
X has to be a float.
     float_fractional_part(X)        ISO
     X -
float_integer_part(X). In iso execution mode, X has
to be a float.
     float(X)        ISO
     X/\Y        ISO
     iso execution mode X and Y have to be integers.
     X\/Y        ISO
     iso execution mode X and Y have to be integers.
     X#Y
     \(X)        ISO
     iso execution mode X has to be an integer.
     X<<Y        ISO
     iso execution mode X and Y have to be integers.
     X>>Y        ISO
     iso execution mode X and Y have to be integers.
     [X]
     "A" behaves within arithmetic expressions as the integer 65. 
SICStus Prolog also includes an extra set of functions listed below. These may not be supported by other Prologs. All trigonometric and transcendental functions take float arguments and deliver float values. The trigonometric functions take arguments or deliver values in radians.
abs(X)         ISO
     sign(X)         ISO
     gcd(X,Y)
     iso execution mode X and Y have to be integers.
     min(X,Y)
     max(X,Y)
     msb(X)
     integer(log(2,X)). 
X must be greater than zero, and
in iso execution mode, X has to be an integer.
     round(X)        ISO only
     round(X)        SICStus only
     truncate(X)        ISO only
     truncate(X)        SICStus only
     floor(X)        ISO only
     floor(X)        SICStus only
     ceiling(X)        ISO only
     ceiling(X)        SICStus only
     sin(X)        ISO
     cos(X)        ISO
     tan(X)
     cot(X)
     sinh(X)
     cosh(X)
     tanh(X)
     coth(X)
     asin(X)
     acos(X)
     atan(X)        ISO
     atan2(X,Y)
     acot(X)
     acot2(X,Y)
     asinh(X)
     acosh(X)
     atanh(X)
     acoth(X)
     sqrt(X)        ISO
     log(X)        ISO
     log(Base,X)
     exp(X)        ISO
     X ** Y         ISO
     exp(X,Y)
     inf        SICStus only
     nan        SICStus only
     Variables in an arithmetic expression to be evaluated may be bound to other arithmetic expressions rather than just numbers, e.g.:
     evaluate(Expression, Answer) :- Answer is Expression.
     
     | ?- evaluate(24*9, Ans).
     Ans = 216
     
Arithmetic expressions, as described above, are just data structures. 
If you want one evaluated you must pass it as an argument to one
of the built-in predicates listed below.  Note that is/2
only evaluates one of its arguments, whereas all the comparison
predicates evaluate both of theirs.  In the following, X and
Y stand for arithmetic expressions, and Z for some
term.
     
Z is X  ISO
     X, which must be an arithmetic expression, is evaluated and the
result is unified with Z.
     
X =:= Y  ISO
     The numeric values of X and Y are equal.
     
X =\= Y  ISO
     The numeric values of X and Y are not equal.
     
X < Y  ISO
     The numeric value of X is less than the numeric value of Y.
     
X > Y  ISO
     The numeric value of X is greater than the numeric value of
Y.
     
X =< Y  ISO
     The numeric value of X is less than or equal to the numeric value
of Y.
     
X >= Y  ISO
     The numeric value of X is greater than or equal to the numeric value of Y.