logo
TurboProlog / Документация / TOM_2

Операторы традиционного Пролога

Традиционный Пролог имеет удобный способ работы с термами. Однако,

всякие удобства теряются, когда вы допускаете ошибку и обработчик ошибок

начинает забрасывать вас сообщениями:

Precedance Error message.

(сообщение об ошибке старшинства).

Мы все хорошо знакомы с опреаторами из повседневого общения с ариф-

метическими выражениями; и было бы несколько неудобно, если бы операторы

не использовали этой выгоды; 1 + 2 * 3 надо было писать в виде +(1, * (2,

3), который является префиксной нотацией.

С объявлениями операторов в традиционном Прологе дело обстоит так,

имея определение нескольких предикатов, вы можете объявить его операто-

ром, а затем записать в инфиксной, а не в префиксной нотации. Например,

предположим у вас есть определение знакомого предиката member; вы могли

бы объявить "member" оператором и вместо записи

..., member(Person, Club), ...

где Club является списком того, чем является тип Person, можно было бы

написать:

...Person member Club, ...

Он выглядит ясным, и это все, что он может делать. В операторах нет

ничего таинственного; они только дают некоторую синтактическую красоту.

Хотя это все выглядит очень симпатичным, но открывается огромное поле для

непониманий: установите приоритеты неправильно, и результат трансляции

термов окажется неожиданным. В худшем случае столкнутся приоритеты обоих

операторов, породив столь знакомые хакерам традиционного Пролога сообще-

ния Priority Error или Precedance Error (ошибка приоритета или ошибка

старшинства). Добавьте к этому трудности понимания объявлений операторов

и приписанным им приоритетам, написанных кем-либо другим. Только предс-

тавьте вот такую фразу:

X = (-B+-sqrt(B^2 - 4*A*C))/(2*A)

, если бы вы были незнакомы со значениями и старшинством традиционных

операций.

Но кто-нибудь может утверждать, что очень сложно создать предшеству-

ющий пример без помощи операторов. И он будет абсолютно прав. В префикс-

ной нотации выражение будет выглядеть так:

=(X, /+-(-(B),sqrt(^(B,2), *(4, *(A,C)))), *(2,A)))

Из такой фразы очень трудно извлечь что-нибудь полезное. Однако, за-

быт один пункт:

ОПЕРАТОРЫ ОЧЕНЬ УДОБНЫ, КОГДА ИХ ХОРОШО ЗНАЮТ,

ОНИ СТАНДАРТИЗОВАНЫ И НЕ МЕНЯЮТСЯ В ХОДЕ РАБОТЫ.

Если операторы не стандартизованы или мало знакомы, или если они не-

ожиданно изменяют течение работы, то они вносят больше путаницы чем яс-

ности. Выражение может принять одно из возможных значений в зависимости

от действующей в процессе транслирования декларации операторов. С другой

стороны, эта префиксная форма весьма двусмысленна и фактически является

интерпретацией, которая дается выражению, когда обычные значения связыва-

ются с арифметическими операторами.

Кроме того, едва ли может возникнуть ситуация, в которой сложность

обычных постоянно используемых сложных объктов, используемых в Турбо Про-

логе, может сравниться с предшествующим выражением, это значит, что нез-

накомые операторы совершенно бесполезны.