Программирование на языке Пролог для искусственного интеллекта | страница 58
>+
сложение
>-
вычитание
>*
умножение
>/
деление
>mod
модуль, остаток от целочисленного деления
Заметьте, что это как раз тот исключительный случай. когда оператор может и в самом деле произвести некоторую операцию. Но даже и в этом случае требуется дополнительное указание на выполнение действия. Пролог-система знает, как выполнять вычисления, предписываемые такими операторами, но этого недостаточно для их непосредственного использования. Следующий вопрос - наивная попытка произвести арифметическое действие:
>?- X = 1 + 2.
Пролог-система "спокойно" ответит
>X = 1 + 2
а не >X = 3
, как, возможно, ожидалось. Причина этого проста: выражение >1 + 2
обозначает лишь прологовский терм, в котором >+
является функтором, а 1 и 2 — его аргументами. В вышеприведенной цели нет ничего, что могло бы заставить систему выполнить операцию сложения. Для этого в Прологе существует специальный оператор >is
(есть). Этот оператор заставит систему выполнить вычисление. Таким образом, чтобы правильно активизировать арифметическую операцию, надо написать:
>?- X is 1 + 2.
Вот теперь ответ будет
>X = 3
Сложение здесь выполняется специальной процедурой, связанной с оператором >+
. Мы будем называть такие процедуры встроенными.
В Прологе не существует общепринятой нотации для записи арифметических действий, поэтому в разных реализациях она может слегка различаться. Например, оператор '>/
' может в одних реализациях обозначать целочисленное деление, а в других — вещественное. В данной книге под '>/
' мы подразумеваем вещественное деление, для целочисленного же будем использовать оператор >div
. В соответствии с этим, на вопрос
>?- X is 3/2,
> Y is 3 div 2.
ответ должен быть такой:
>X = 1.5
>Y = 1
Левым аргументом оператора >is
является простой объект. Правый аргумент — арифметическое выражение, составленное с помощью арифметических операторов, чисел и переменных. Поскольку оператор >is
запускает арифметические вычисления, к моменту начала вычисления этой цели все ее переменные должны быть уже конкретизированы какими-либо числами. Приоритеты этих предопределенных арифметических операторов (см. рис. 3.8) выбраны с таким расчетом, чтобы операторы применялись к аргументам в том порядке, который принят в математике. Чтобы изменить обычный порядок вычислений, применяются скобки (тоже, как в математике). Заметьте, что >+
, >-
, >*
, >/
и >div
определены, как >yfx
, что определяет порядок их выполнения слева направо. Например,
>X is 5 - 2 - 1
понимается как