Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод пособие.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
325.12 Кб
Скачать

Арифметические выражения

В языке Пролог имеется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены в таблице.

Выражение

Интерпретация

PIE32

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 (приближенное значение числа пи)

-

е

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.