представляют возможные спецификации для постфиксных операторов. Может вызвать недоумение использование двух букв для обозначения аргументов. Использование букв хи ув той или иной позиции позволяет выразить информацию об ассоциативности оператора. В предположении, что выражение не содержит скобок, буква у указывает, что соответствующий ей аргумент может содержать операторы с приоритетом, равным приоритету данного оператора или с более низким приоритетом. Напротив, буква хуказывает, что каждый оператор в соответствующем ей аргументе должен иметь строго более низкий приоритет по сравнению с приоритетом данного оператора. Рассмотрим, что это значит для оператора +, объявленного как yfx. Если имеется выражение
а + b + с
то для него возможны две следующие интерпретации:
(а + b) + с а + (b + с)
Вторая интерпретация исключается, так как при этом аргумент, стоящий после первого вхождения +, содержит оператор с тем же самым приоритетом (второй оператор +). Это противоречит тому, что в спецификации оператора + после fстоит х.
Оператор, имеющий спецификацию yfx, является левоассоциативным. Аналогично оператор со спецификацией xfyявляется правоассоциативным. Если мы знаем необходимую ассоциативность объявляемого инфиксного оператора, то это значит, что однозначно определяется соответствующая оператору спецификация.
Заметим, что использование букв хи ув двух других случаях имеет тот же смысл относительно того, какие операторы могут появляться в соответствующей позиции при отсутствии скобок. Это значит, что, например, последовательность
not not a
допустима синтаксически, если оператор notобъявлен как fy, и недопустима в случае, когда он объявлен как fx.
Если мы хотим объявить на Прологе оператор с заданными позицией, приоритетом и ассоциативностью таким образом, чтобы Пролог распознавал его при вводе и выводе термов, то мы используем встроенный предикат ор.Если Имя- это оператор, который мы желаем иметь (атом, который мы хотим сделать оператором), Приоритет- приоритет оператора (целое число в соответствующем диапазоне) и Спецификация- спецификация, определяющая положение и ассоциативность оператора (один из приведенных выше атомов), то такой оператор может быть объявлен с помощью выполнения следующего целевого утверждения
?- ор (Приоритет,Спецификация,Имя).
Если объявление оператора является допустимым, то эта цель будет достигнута.
В качестве примера объявления операторов далее приводится полный список базовых операторов, обсуждаемых в данной книге. Конкретные реализации Пролога могут иметь несколько отличный набор «стандартных» операторов; может потребоваться масштабирование указанных приоритетов. Однако взаимный порядок операторов в иерархии приоритетов обычно остается неизменным.
?-op(255,xfx,':-').
?-op(255,fx,'?-').
?-op(254,xfy,';').
?-op(253,xfy,',').
?-op(250,fx,spy).
?-op(250,fx,nospy).
?-op(60,fx,not).
?-op(51,xfy,'.').
?-op(40,xfx,is).
?-op(40,xfx,' =..').
?-op(40,xfx,=).
?-op(40,xfx,\=).
?-op(40,xfx,‹).
?-op(40,xfx,=‹).
?-op(40,xfx,›=).
?-op(40,xfx,›).
?-op(40,xfx, ==).
?-op(40,xfx,\==).
?-op(31,yfx,-).
?-op(31,yfx,+).
?-op(21,yfx,/).
?-op(21,yfx,*).
?-op(ll,xfx, mod).
ГЛАВА 6. ВСТРОЕННЫЕ ПРЕДИКАТЫ
В этой главе будут описаны некоторые
Предикаты для ввода-вывода показывают, что встроенные предикаты могут иметь «побочные эффекты». Это значит, что при доказательстве согласованности целевого утверждения, содержащего такой предикат, помимо конкретизации аргументов предиката могут возникнуть дополнительные изменения. Это, естественно, не может случиться с предикатами, определенными на чистом Прологе. Другой важный факт, касающийся встроенных предикатов, состоит в том, что они могут быть определены только для аргументов конкретного вида. Например, рассмотрим предикат '‹' определенный таким образом, что Х‹Yвыполняется, если число Xменьше, чем число Y. Подобное отношение не может быть определено в Прологе без помощи посторонних средств, использующих некоторые знания о числах. Таким образом, ‹ – это встроенный предикат, а его определение использует некоторые операции вычислительной машины, на которой реализована Пролог-система, для определения относительной величины чисел (представленных в виде двоичного кода или каким-либо иным способом).