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

6.2. Позиция операторов

Позиция оператора в выражении определяет его тип. Как было сказано выше, оператор может относиться к одному из трех типов.

Инфиксный - оператор располагается между двумя аргументами, например: X+Y или Х < Y.

Префиксный - оператор располагается перед единственным аргументом, например: not Х или - X.

Постфиксный - оператор располагается после единственного аргумента, например: Х факториал или Р прошло.

6.3. Приоритет операторов

Каждый оператор имеет приоритетный номер, указываемый при объявлении оператора. Номер является целым числом и обычно находится в пределах от 1 до 1500.

Если выражение содержит более одного оператора, например

X + Y * 2,

то возникает неопределенность в порядке выполнения операций. Эта проблема разрешается посредством назначения всем операторам приоритетного номера. Вычисления осуществляются, начиная с опе­ратора, имеющего наименьший номер, и заканчивая оператором с наибольшим номером. В нашем примере Х + Y * 2 оператор * имеет более низкий приоритетный номер, чем оператор +. Поэтому, как и следовало ожидать, выражение вычисляется так: Х + (Y * 2).

Тео戲етический приоритетный номер скобок меньше нуля. Выра­жение, заключенное в скобки, рассматривается как один терм. Скобки могут использоваться для того, чтобы изменить правила установления ассоциативности и сделать синтаксис выражений более четким.

6.4. Ассоциативность операторов

Ассоциативность оператора указывает, как следует интерпре­тировать выражение, содержащее несколько операторов с одинаковым приоритетом. Покажем на примере необходимость такой инфор­мации.

Рассмотрим выражение а/b/с. Результат его вычисления зависит от расстановки скобок:

(а/b)/с или а/(b/с)

Арифметические операции +, -(минус), * и / определены в Про­логе как левоассоциативные. Это означает, что они должны иметь слева операторы равного или низшего приоритета, а справа - опера­торы строго низшего приоритета.

Следовательно, приведенное выше выражение в соответствии с правилом можно вычислить только как (а/b)/с, а не как а/(b/с).

6.5. Спецификаторы

Позицию и ассоциативность оператора удобно задавать с по­мощью спецификатора. Перечислим виды спецификаторов:

fx для определения постфиксного оператора;

fv “”

xf для определения префиксного оператора;

yf “”

xfx для определения инфиксного оператора;

xfy “” (правоассоциативного оператора);

yfx “” (левоассоциативного оператора);

yfy “”

В такой форме записи приняты следующие соглашения:

f представляет оператор. Им может быть системный оператор или оператор, объявленный с помощью предиката ор;

х представляет выражение, содержащее операторы только ни­зшего приоритета по отношению к приоритету f;

у представляет выражение, которое может содержать операторы равного или низшего приоритета по отношению к приоритету f.

Если оператор объявлен со спецификатором yfx, то он является левоассоциативным и подвыражение у вычисляется первым. Возь­мем в качестве примера

5 + 4 * 10 / 5.

Здесь операторы * и / имеют одинаковый приоритет, но, посколь­ку они определяются в Прологе как левоассоциативные, выражение будет вычисляться следующим образом:

y f х

(5+4*10) / 5

(5+(4*10)) / 5

Следовательно, (5+(4*10))/5 равно 9, если использовать правило определения приоритета.

Если оператор объявлен со спецификатором xfy, то он является правоассоциативным и подвыражение у, стоящее справа, вычисляет­ся первым.

Спецификатор yfy недопустим в Прологе, так как выражения, содержащие операторы с такой ассоциативностью, окажутся неопре­деленными. Если бы * и / были объявлены со спецификаторами yfy, тогда выражение из предыдущего примера 5+4*10/5 можно было бы вычислить либо как прежде

(5+(4*10))/5=9,

либо как

5+(4*(10/5))=13

(суммирование + объявлено с большим приоритетом, чем * или /).

Применение спецификатора xfx в Прологе допустимо. Он ис­пользуется, например, при объявлении операторов сравнения, таких, как < и >. Обычно трудностей не возникает, так как для операторов < и > в Прологе определяется более высокий приоритет, чем для арифметических операторов. Следовательно, правая и левая части выражения должны быть вычислены до того, как будет произведена попытка выполнить функцию сравнения, например,

5+2 < 6+3

будет вычисляться как

(5+2) < (6+3)

Однако существует возможность построить синтаксически пра­вильное выражение, которое не подчиняется потенциально неопре­деленным правилам установления приоритета и ассоциативности.

Примером может служить выражение Х opr Y opr Z, где оператор opr имеет позицию и ассоциативность xfx.

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

Поэтому предыдущее выражение будет вычислено следующим образом:

(а opr b) opr c.

Если * > объявлен как левоассоциативный, а < * - как правоассоциативный оператор с помощью управляющих команд (директив)

?- op(60,yfy,*>).

?- op(60,xfy,<*).

то выражение а*>b*>с вычисляется как (а*>b)*>с, а<*b<*с вычисля­ется как а<*(b<*с) и а<*b*>с вычисляется как (а<*b)*>с по умолча­нию.

Некоторые реализации Пролога в таких неясных случаях выдают сообщение об ошибке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]