Программирование на языке Пролог для искусственного интеллекта | страница 55



Имена операторов это атомы, а их приоритеты — точнее, номера их приоритетов — должны находиться в некотором диапазоне, зависящем от реализации. Мы будем считать, что этот диапазон располагается в пределах от 1 до 1200.[1]

Существуют три группы типов операторов, обозначаемые спецификаторами, похожими на >xfx:

(1) инфиксные операторы трех типов:

>xfx xfy yfx

(2) префиксные операторы двух типов:

>fx fy

(3) постфиксные операторы двух типов:

>хf yf

Спецификаторы выбраны с таким расчетом, чтобы нагляднее отразить структуру выражения, в котором '>f' соответствует оператору, а 'x' и '>y' представляют его аргументы. Расположение '>f' между аргументами указывает на то, что оператор инфиксный. Префиксные и постфиксные спецификаторы содержат только один аргумент, который, соответственно, либо следует за оператором, либо предшествует ему.

Рис. op3.7.  Две интерпретации выражения >а-b-с в предположении, что '>-' имеет приоритет 500. Если тип '>-' есть >yfx, то интерпретация 2 неверна, так как приоритет >b-с не выше, чем приоритет '>-'.

Между '>x' и '>y' есть разница. Для ее объяснения нам потребуется ввести понятие приоритета аргумента. Если аргумент заключен в скобки или не имеет структуры (является простым объектом), тогда его приоритет равен 0; если же он структурный, тогда его приоритет равен приоритету его главного функтора. С помощью '>x' обозначается аргумент, чей приоритет должен быть строго выше приоритета оператора (т e. его номер строго меньше номера приоритета оператора); с помощью '>y' обозначается аргумент, чей приоритет выше или равен приоритету оператора.

Такие правила помогают избежать неоднозначности при обработке выражений, в которых встречаются операторы с одинаковым приоритетом. Например, выражение

>а-b-с

обычно понимается как >(а-b)-с, а не как >а-(b-с). Чтобы обеспечить такую обычную интерпретацию, оператор '>-' следует определять как >yfx. На рис. 3.7 показано, каким образом исключается вторая интерпретация.

В качестве еще одного примера рассмотрим оператор >not (логическое отрицание "не"). Если >not oпределён как >fy, тогда выражение

 >not not p

записано верно; однако, если >not определен как >fx, оно некорректно, потому что аргументом первого >not является структура >not p, которая имеет тот же приоритет, что и >not. В этом случае выражение следует писать со скобками:

>not (not p)


>:- op( 1200, xfx, ':-').

>:- op( 1200, fx, [:-, ?-] ).

>:- op( 1100, xfy, ';').

>:- op( 1000, xfy, ',').

>:- op( 700, xfx, [=, is, <, >, =<, >=, ==, =\=, \==, =:=]).