
- •Методическое пособие
- •Архангельск,
- •«К 2011 году большинство программ будут писать компьютеры…».
- •История и перспективы развития языка Пролог
- •2. Краткая инструкция по работе в среде pie32
- •3. Механизм вывода в системе Пролог. Примеры Термы и объекты
- •Запросы к базе данных
- •Унификация
- •Правила
- •Рекурсивные процедуры
- •Базы знаний
- •Решение логических задач
- •Арифметические выражения
- •Примеры программ
- •Часть II. Указания к выполнению контрольной работы
- •Введение
- •Генеалогическое дерево
- •Перевод генеалогического дерева в базу фактов
- •Составление правил искомых родственных связей в базе знаний
- •Лабораторная работа №3
- •Список литературы
Арифметические выражения
В языке Пролог имеется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены в таблице.
Выражение |
Интерпретация |
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.