Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Функциональное и логическое программирование.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
310 Кб
Скачать
☆

Операторы.

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

Внешняя форма синтаксиса Пролога расширяема в том смысле, что предикат или структуру с одним или двумя аргументами можно объявить оператором. Это осуществляется для улучшения читабельности программы. Для этого строится обращение к встроенному предикату «ор»:

:- ор (приоритет, тип, имя).

Имя - это атом. Использование «ор» равносильно объявлению этого имени названием оператора. Приоритет - это число, используемое для того, чтобы избежать неопределенности в выражениях, в состав которых входит более одной операции. Конкретный диапазон приоритетов зависит от реализации. Для изменения порядка выполнения операторов, определяемого их старшинством, используются скобки.

В качестве типа используются спецификаторы типов:

инфиксные операторы: xfx, xfy, yfx;

префиксные операторы: fx, fy;

постфиксные операторы: xf, yf.

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

:- ор(500, yfx, +).

Тип yfx означает, что оператор обладает свойством левой ассоциативности, т.е. одинаковые операторы выполняются в выражении слева направо. Например, операторы «+» и «-» обладают свойством левой ассоциативности. Выражение А+В+С+К , т.е. +( +( +(А , В) , С) , К) можно представить в виде дерева, растущего вниз и влево.

:- ор(1000, xfy, ,).

Тип xfy означает, что операция обладает свойством правой ассоциативности, т.е. одинаковые операторы выполняются в выражении справа налево. Например, оператор «,» обладает свойством правой ассоциативности. Выражение А, В, С, К ,т.е. ,(А , ,(В , ,(С , К))) можно представить в виде дерева, растущего вправо.

Тип xfx означает, что оператор не обладает ни правой, ни левой ассоциативностью. Например, оператор mod. Поэтому недопустимо выражение, в котором есть подвыражение с таким же оператором: 120 mod 50 mod 5.

Пример объявления оператора. Пусть есть часто используемый предикат «знает». Объявим его как инфиксный оператор:

:- ор(700, xfx, знает).

Теперь факты «знает» можно представить в программе в инфиксной форме:

маша знает паша.

коля знает оля.

Запросы к этой базе данных можно также записывать в инфиксной форме:

?- X знает оля.

X=коля.

Несколько операторов могут быть определены в одном предложении, если они имеют одинаковый приоритет и тип. Для этого их берут в скобки [ ].

Существует ряд операторов Пролога, уже определенных заранее. Это встроенные операторы или встроенные предикаты. За ними системой закреплены процедуры.