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``)`

- The value is
`X`. `-`

`X`- The value is the negative of
`X`. ISO `X``+`

`Y`- The value is the sum of
`X`and`Y`. ISO `X``-`

`Y`- The value is the difference of
`X`and`Y`. ISO `X``*`

`Y`- The value is the product of
`X`and`Y`. ISO `X``/`

`Y`- The value is the
*float*quotient of`X`and`Y`. ISO `X``//`

`Y`ISO- The value is the
*integer*quotient of`X`and`Y`. The result is always truncated towards zero. In`iso`

execution mode`X`and`Y`have to be integers. `X``rem`

`Y`ISO- The value is the
*integer*remainder after dividing`X`by`Y`, i.e.`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- The value is
`X`modulo`Y`, i.e.`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- The value is the same as that of
`X`rem`Y`. `integer(`

`X``)`

- The value is the closest integer between
`X`and 0, if`X`is a float; otherwise,`X`itself. `float_integer_part(`

`X``)`

ISO- The same as
`float(integer(`

`X``))`

. In`iso`

execution mode,`X`has to be a float. `float_fractional_part(`

`X``)`

ISO- The value is the fractional part of
`X`, i.e.`X``- float_integer_part(`

`X``)`

. In`iso`

execution mode,`X`has to be a float. `float(`

`X``)`

ISO- The value is the float equivalent of
`X`, if`X`is an integer; otherwise,`X`itself. `X``/\`

`Y`ISO- The value is the bitwise conjunction of the integers
`X`and`Y`. In`iso`

execution mode`X`and`Y`have to be integers. `X``\/`

`Y`ISO- The value is the bitwise disjunction of the integers
`X`and`Y`. In`iso`

execution mode`X`and`Y`have to be integers. `X``#`

`Y`- The value is the bitwise exclusive or of the integers
`X`and`Y`. `\(`

`X``)`

ISO- The value is the bitwise negation of the integer
`X`. In`iso`

execution mode`X`has to be an integer. `X``<<`

`Y`ISO- The value is the integer
`X`shifted left by`Y`places. In`iso`

execution mode`X`and`Y`have to be integers. `X``>>`

`Y`ISO- The value is the integer
`X`shifted right by`Y`places. In`iso`

execution mode`X`and`Y`have to be integers. `[`

`X``]`

- A list of just one number
`X`evaluates to`X`. Since a quoted string is just a list of integers, this allows a quoted character to be used in place of its character code; e.g.`"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- The value is the absolute value of
`X`. `sign(`

`X``)`

ISO- The value is the sign of
`X`, i.e. -1, if`X`is negative, 0, if`X`is zero, and 1, if`X`is positive, coerced into the same type as`X`(i.e. the result is an integer, iff`X`is an integer). `gcd(`

`X``,`

`Y``)`

- The value is the greatest common divisor of the two integers
`X`and`Y`. In`iso`

execution mode`X`and`Y`have to be integers. `min(`

`X``,`

`Y``)`

- The value is the lesser value of
`X`and`Y`. `max(`

`X``,`

`Y``)`

- The value is the greater value of
`X`and`Y`. `msb(`

`X``)`

- The value is the position of the most significant nonzero bit of the integer
`X`, counting bit positions from zero. It is equivalent to, but more efficient than,`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- The value is the closest integer to
`X`.`X`has to be a float. If`X`is exactly half-way between two integers, it is rounded up (i.e. the value is the least integer greater than`X`). `round(`

`X``)`

SICStus only- The value is the float that is the closest integral value to
`X`. If`X`is exactly half-way between two integers, it is rounded to the closest even integral value. `truncate(`

`X``)`

ISO only- The value is the closest integer between
`X`and 0.`X`has to be a float. `truncate(`

`X``)`

SICStus only- The value is the float that is the closest integer between
`X`and 0. `floor(`

`X``)`

ISO only- The value is the greatest integer less or equal to
`X`.`X`has to be a float. `floor(`

`X``)`

SICStus only- The value is the float that is the greatest integral value less or
equal to
`X`. `ceiling(`

`X``)`

ISO only- The value is the least integer greater or equal to
`X`.`X`has to be a float. `ceiling(`

`X``)`

SICStus only- The value is the float that is the least integral value greater or
equal to
`X`. `sin(`

`X``)`

ISO- The value is the sine of
`X`. `cos(`

`X``)`

ISO- The value is the cosine of
`X`. `tan(`

`X``)`

- The value is the tangent of
`X`. `cot(`

`X``)`

- The value is the cotangent of
`X`. `sinh(`

`X``)`

- The value is the hyperbolic sine of
`X`. `cosh(`

`X``)`

- The value is the hyperbolic cosine of
`X`. `tanh(`

`X``)`

- The value is the hyperbolic tangent of
`X`. `coth(`

`X``)`

- The value is the hyperbolic cotangent of
`X`. `asin(`

`X``)`

- The value is the arc sine of
`X`. `acos(`

`X``)`

- The value is the arc cosine of
`X`. `atan(`

`X``)`

ISO- The value is the arc tangent of
`X`. `atan2(`

`X``,`

`Y``)`

- The value is the four-quadrant arc tangent of
`X`and`Y`. `acot(`

`X``)`

- The value is the arc cotangent of
`X`. `acot2(`

`X``,`

`Y``)`

- The value is the four-quadrant arc cotangent of
`X`and`Y`. `asinh(`

`X``)`

- The value is the hyperbolic arc sine of
`X`. `acosh(`

`X``)`

- The value is the hyperbolic arc cosine of
`X`. `atanh(`

`X``)`

- The value is the hyperbolic arc tangent of
`X`. `acoth(`

`X``)`

- The value is the hyperbolic arc cotangent of
`X`. `sqrt(`

`X``)`

ISO- The value is the square root of
`X`. `log(`

`X``)`

ISO- The value is the natural logarithm of
`X`. `log(`

`Base``,`

`X``)`

- The value is the logarithm of
`X`in the base`Base`. `exp(`

`X``)`

ISO- The value is the natural exponent of
`X`. `X``**`

`Y`ISO`exp(`

`X``,`

`Y``)`

- The value is
`X`raised to the power of`Y`. `inf`

SICStus only- The value is infinity as defined in the IEEE standard.
`nan`

SICStus only- The value is not-a-number as defined in the IEEE standard.

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`.