Программирование на языке Пролог для искусственного интеллекта | страница 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

понимается как