дХОКНЛМШЕ ПЮАНРШ, ЙСПЯНБШЕ ОПНЕЙРШ МЮ ГЮЙЮГ, ЙНМРПНКЭМШЕ ПЮАНРШ МЮ ГЮЙЮГ

 

мЮВЕПРЮРЕКЭМЮЪ ЦЕНЛЕРПХЪ оПЮЙРХЙСЛ ОН ПЕЬЕМХЧ ГЮДЮВ цЕНЛЕРПХВЕЯЙНЕ ВЕПВЕМХЕ хМФЕМЕПМЮЪ ЦПЮТХЙЮ еяйд йПЮРМШЕ ХМРЕЦПЮКШ лЮРЕЛЮРХВЕЯЙХИ ЮМЮКХГ лЮРПХЖШ оПЕДЕКШ оПНХГБНДМШЕ бЕЙРНПМЮЪ ЮКЦЕАПЮ хМРЕЦПЮКЭМНЕ ХЯВХЯКЕМХЕ ртйо ъДЕПМЮЪ ТХГХЙЮ щКЕЙРПНЯРЮРХЙЮ лЮЦМЕРХГЛ нОРХЙЮ хМТНПЛЮЖХНММШЕ РЕУМНКНЦХХ

Предыдущий разделУровень вышеСледующий раздел

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

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

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


Задание
Какой ответ выдаст интерпретатор Пролога на следующие запросы?

  1. ?- 3 is 2+1.
  2. ?- X=3/2.
  3. ?- X is 3/2.
  4. ?- X is min(tan(pi/4), log(pi)).

Предыдущий разделУровень вышеСледующий раздел