В языке Пролог имеется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены в таблице.
X + Y | Сумма X и Y |
X - Y | Разность X и Y |
X * Y | Произведение X и Y |
X / Y | Деление X на Y |
X mod Y | Остаток от деления X на Y |
X // Y | Деление нацело X на Y |
X ** Y | Возведение X в степень Y |
- X | Смена знака X |
abs(X) | Абсолютная величина числа X |
max(X,Y) | Большее из чисел X и Y |
min(X,Y) | Меньшее из чисел X и Y |
sqrt(X) | Квадратный корень из X |
random(Int) | Случайное целое число в диапазоне от 0 до Int |
sin(X) | Синус X |
cos(X) | Косинус X |
tan(X) | Тангенс X |
log(X) | Натуральный логарифм (ln) числа X |
log10(X) | Десятичный логарифм (lg) числа X |
float(X) | Вещественное число, соответствующее целому числу X |
pi | 3.14159 (приближенное значение числа pi) |
е | 2.71828 (приближенное значение числа е) |
Еще раз отметим, что Пролог старается скрыть различие между арифметикой целых и вещественных чисел везде, где это можно.
Для вычисления арифметических выражений в Прологе используется встроенный бинарный оператор is, который интерпретирует правый терм как арифметическое выражение, после чего унифицирует (если возможно) результат вычисления с левым термом (обычно с переменной). Приоритет выполнения арифметических операций является традиционным. Круглые скобки используются для изменения порядка вычислений. В следующих примерах переменная X унифицируется со значениями арифметических выражений:
?- X is 2.5 + 2.5. X = 5 Yes ?- X is 4/(2+1). X = 1.33333 Yes ?- X is cos(3*pi). X = -1 Yes ?- 1 is sin(pi/2). Yes ?- 1.0 is sin(pi/2). No
Поясним несколько неожиданный ответ Пролога в последнем запросе. Значение sin(pi/2) автоматически округляется предикатом is до целого значения 1, которое не удается унифицировать с вещественным числом 1.0. Предикат float заставит считать значение sin(pi/2) вещественным числом:
?- 1.0 is float( sin(pi/2)). Yes
Для сравнения арифметических выражений используется ряд операторов. Цель X > Y (больше) будет успешна, если выражение X будет соответствовать большему числу, чем выражение Y.
Аналогично используются операторы < (меньше), =< (меньше или равно), >= (больше или равно), =\= (не равно) и =:= (арифметически равный). Различия между операторами =:= и = очень существенны. Первый оператор сравнивает значения арифметических выражений, тогда как последний пытается унифицировать их.
Пример
?- 2 ** 3 =:= 3 + 5. Yes ?- 2 ** 3 = 3 + 5. No ?- 1.0 = float(sin(pi/2)). No ?- 1.0 =:= sin(pi/2). Yes
Заметьте, что цель X =:= Y будет истинна, даже если один из термов есть целое число, а другой - равное ему вещественное.
Пример
Порядок подцелей в запросе влияет на его результат:
?- X is 4+Y, Y=3. ERROR: Arguments are not sufficiently instantiated ?- Y=3, X is 4+Y. Y = 3 X = 7 Yes
В первом запросе сообщение об ошибке появилось потому, что первая подцель запроса (X is 4+Y) потерпела неудачу, т. к. в момент ее обработки невозможно вычислить выражение 4+Y.
Задание
Какой ответ выдаст интерпретатор Пролога на следующие запросы?
- ?- 3 is 2+1.
- ?- X=3/2.
- ?- X is 3/2.
- ?- X is min(tan(pi/4), log(pi)).