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

Использование операторов в Турбо Прологе

Как указывалось в предисловии, существует некоторое недопонимание

возможностей Турбо Пролога. Если система не имеет своего транслятора опе-

раторов, то это еще не значит, что ее нельзя создать.

Итак, вы хотите использовать операторы Турбо Пролога. Хорошо, мы по-

кажем вам, как это делать. Вот, что вам для этого надо:

1. Определите область термов, с которой должен будет работать

транслятор операторов.

2. Определите, какие операторы с подходящими предшественниками

потребуются.

3. Напишите транслятор для области.

В данном случае областью будет область Term, подробно описанная

раньше в этом приложении. В целом, написание транслятора (даже из имеюще-

гося под рукой материала) дело нетрудное, но для владельцев Турбо Пролога

Toolbox, включающая генеретор трансляторов, - это просто способ определе-

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

ся иметь дело.

Однако у генератора есть одно ограничение, обнаруживаемое при работе

с определениями динамических операторов. Генератор трансляторов будет ге-

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

генерации (что неудивительно, т.к. изменения в операторах в процессе вы-

полнения едва ли используются где-нибудь в мире за исключением традицион-

ного Пролога).

Однако мы включили полный транслятор для операторов с учетом их

старшинства и поместили его в файл PIE.PAR, где он работает совместно с

включенным сканнером общего назначения PIE.SCA. Транслятор генерируется с

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

деления операторов - op - для каждого встречаемого терма. Предикат объяв-

ляется так:

op(Prior, XFY, Cp)

- Приоритет - Prior - это ряд целых чисел до 1200.

- XFY - это строка с хорошо известной (из традиционного Проло-

га) связью информации.

- Ор - это строка, определяющая оператор.

В файле PIE.PRO вы найдете предложения для обычных стандартных опе-

раторов, таких как:

op(7000, xfx, "="). op(7000, xfx, "\\="). op(7000, xfx, "is").

op(7000, xfx, "<"). op(7000, xfx, "=<"). op(7000, xfx, ">").

Они в большой степени соответствуют традиционному Прологу. Если вы

не привычны к определениям операторов в таком виде, то обратите внимание,

что позиция f определяет является ли оператор префиксным, инфиксным или

суффиксным оператором. Буквы x и y опеределяют связь операторов.

Заметьте, такая реализация операторов означает отсутствие ограниче-

ний на их использование; их все можно переопределять вне зависимости от

того, являются ли они встроенными (принятыми по умолчанию) или нет (при-

чем основная программа, использующая термы, не задевается).

Для практического использования, когда транслятор считается програм-

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

а не на тип базы данных во всех случаях, за исключением тех, когда требу-

ется изменение операторов в процессе выполнения. Однако, еще большая эф-

фективность будет достигнута при компиляции сделанного вами самим транс-

лятора с помощью имеющегося в инструментарии Турбо Пролога генератора

трансляторов.