Home Contents Index Summary Previous Next

4.26 Arithmetic

Arithmetic can be divided into some special purpose integer predicates and a series of general predicates for floating point and integer arithmetic as appropriate. The integer predicates are as ``logical'' as possible. Their usage is recommended whenever applicable, resulting in faster and more ``logical'' programs.

The general arithmetic predicates are optionally compiled now (see set_prolog_flag/2 and the -O command line option). Compiled arithmetic reduces global stack requirements and improves performance. Unfortunately compiled arithmetic cannot be traced, which is why it is optional.

The general arithmetic predicates all handle expressions. An expression is either a simple number or a function. The arguments of a function are expressions. The functions are described in section 4.27.

between(+Low, +High, ?Value)
Low and High are integers, High >=Low. If Value is an integer, Low =<Value =<High. When Value is a variable it is successively bound to all integers between Low and High.

succ(?Int1, ?Int2)
Succeeds if Int2 = Int1 + 1 and Int1 >= 0. At least one of the arguments must be instantiated to a natural number. This predicate raises the domain-error not_less_than_zero if called with a negative integer. E.g. succ(X, 0) fails silently and succ(X, -1) raises a domain-error. (38)

plus(?Int1, ?Int2, ?Int3)
Succeeds if Int3 = Int1 + Int2. At least two of the three arguments must be instantiated to integers.

+Expr1 > +Expr2
Succeeds when expression Expr1 evaluates to a larger number than Expr2.

+Expr1 < +Expr2
Succeeds when expression Expr1 evaluates to a smaller number than Expr2.

+Expr1 =< +Expr2
Succeeds when expression Expr1 evaluates to a smaller or equal number to Expr2.

+Expr1 >= +Expr2
Succeeds when expression Expr1 evaluates to a larger or equal number to Expr2.

+Expr1 =\= +Expr2
Succeeds when expression Expr1 evaluates to a number non-equal to Expr2.

+Expr1 =:= +Expr2
Succeeds when expression Expr1 evaluates to a number equal to Expr2.

-Number is +Expr
Succeeds when Number has successfully been unified with the number Expr evaluates to. If Expr evaluates to a float that can be represented using an integer (i.e, the value is integer and within the range that can be described by Prolog's integer representation), Expr is unified with the integer value.

Note that normally, is/2 will be used with unbound left operand. If equality is to be tested, =:=/2 should be used. For example:

?- 1.0 is sin(pi/2). Fails!. sin(pi/2) evaluates to 1.0, but is/2 will represent this as the integer 1, after which unify will fail.
?- 1.0 is float(sin(pi/2)). Succeeds, as the float/1 function forces the result to be float.
?- 1.0 =:= sin(pi/2). Succeeds as expected.