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.