Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог =).doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.69 Mб
Скачать

8.1. Операции (Операторы).

Как вы помните для некоторых структур, имеющих размерность /2, функтор может быть записан между компонентами. Например +(1,2)

можно записать как

1 + 2 .

При этом структуру легче воспринимать в программе и водить.

Пролог предоставляет возможность использовать наряду с встроенными операторами и дополнительные операторы для структур с арностью /2 и /1.

Для этого достаточно объявить эту структуру оператором используя встроенный предикат op/3.

op(Приоритет,Тип,Имя).

Имя оператора - любой атом.

8.1.1 Приоритет оператора.

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

Приоритет задается приоритетным номером - числом обычно в диапазоне 1-1500 (в нашем случае до 1200).

Вычисления начинаются с оператора имеющего наименьший номер и заканчиваются наибольшим номером.

Например, в выражении x + y * 2 приоритет * больше + и вычисления производятся как x + (y * 2). Приоритетный номер скобки равен нулю.(Самый высокий приоритет)

Поэтому скобки могут использоваться для изменения ассоциативности.

8.1.2. Тип оператора.

Тип задает позицию и ассоциативность оператора.

Позиция оператора указывает, где он записывается по отношению к своим аргументам.

Для арности 2 оператор может быть только инфиксным и располагать между аргументами.

Например 2 > 1 или Р;Q

Для арности 1 оператор может быть

  • префиксным - записываться перед единственным аргументом : not a или -1

  • постфиксным - записываться после единственного аргумента : 5! или

Ассоциативность оператора показывает, какая операция выполняется первой в выражении, содержащем два или более оператора с одинаковым приоритетом.

Тип может принимать одно из следующих значений

  • xfx xfy yfx для инфиксных операций

  • fy fx для префиксных операций

  • xf yf для постфиксных операций

Здесь

  • fff - функтор,

  • x - выражение

  • y - выражение

Для простоты следует запомнить что yfx имеет левую ассоциативность.

Например + определен как op( 500, yfx, +). + обладает левой ассоциативностью. Т.е. A + B + C + D выполняется как +(+(+(A,B),C),D) Представляется как дерево растущее в низ и налево:

Наоборот xfy имеет правую ассоциативность.

Т.е. A , B , C , D выполняется как ,(A, ,(B, ,(C,D))) Представляется как дерево растущее в низ и направо:

8.1.3 Объявление операций.

Если объявляется 2 или 1 арная процедура то для удобства использования

с т.з. читабильности программы ее можно объявить как операцию.

(Для SWI-prolog op включается в программу как цель, а не как факт). Например

 

:-op(1500,xfx, love).

bob love mary.

pam love sam.

?- bob love Y.

Y = mary.

Еще один пример

?- X=join(a,b),write(X),nl,op(500,yfx,join),

write(X).

Дает join(a, b)

a join b

X = a join b

xyx - инфиксная операция, не обладающая свойством ассоциативности

Примером может служить операция mod.

Поэтому

?- X is 120 mod 50 mod 5

является недопустимой.

Встроенные операторы для SWI-prolog представлены в таблице.

(Все операторы могут быть переопределены пользователями)

  • 1200 fx :-, ?-

  • 1150 fx dynamic , multifile, module_transparent, discontiguous, volatile, initialization

  • xfy ;, |

  • 1050 xf

  • 1000 xfy ,

  • 954 xfy \\

  • 900 fy \+, not

  • 900 fx ~

  • 700 xfx <, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<,

  • @>, @>=, \=, \==, is

  • 600 xfy :

  • 500 yfx +, -, /\, \/, xor

  • 500 fx +, -, ?, \

  • 400 yfx *, /, //, <<, >>, mod, rem

  • 200 xfx **

  • 200 xfy ^