Оператори

Іноді зручно записувати деякі функтори як оператори. Це особлива форма синтаксису, що полегшує читання відповідних структур. Наприклад, арифметичні операції зазвичай записуються як оператори. У арифметичному виразі x+y*z знаки додавання і множення є операторами. Якщо ж цей арифметичний вираз записати в звичайному для структур виді, то воно виглядатиме таким чином: +(x*(y,z)). Важливо відмітити, що оператори не викликають виконання певних арифметичних операцій. Так, в Пролозі 3+4 і 7 означають різні об'єкти. Терм 3+4 — інший спосіб запису терма +(3,4), який є структурою.

необхідно знати, як читати арифметичні вирази, що містять оператори. Це вимагає знання трьох властивостей кожного оператора: його позиції, його пріоритету і його асоціативності.

Оператори, подібні до знаків додавання (+), віднімання (-), множення (*) і ділення (/), записуються між своїми аргументами і називаються тому інфікснимиоператорами.

Оператори, що записуються перед своїми аргументами, називаються префікснимиоператорами.

Оператори, записані після своїх аргументів, називаються постфікснимиоператорами.

Пріоритет оператора визначає, яка операція виконається першою. У Пролозі кожен оператор пов'язаний зі своїм класом пріоритету. Клас пріоритету є цілим числом, величина якого залежить від конкретної версії Прологу. Однак у будь-якій версії оператор з великим пріоритетом має клас пріоритету, ближчий до 1. Якщо класи пріоритетів набувають значень з діапазону від 1 до 255, то оператор з першим класом пріоритету виконується першим, до виконання операторів, що належать (наприклад) до класу 129. У Пролозі оператори множення і ділення належать до більш високого класу пріоритетів, ніж додавання і віднімання, тому терм а-b/c еквівалентний терму -(а,/(b,с)).

Лівоасоціативний оператор повинен мати ліворуч операції однакового або нижчого пріоритету, а справа — операції нижчого пріоритету. Наприклад, усі арифметичні операції (додати, відняти, помножити і поділити) є лівоасоціативними.

 

10. Рівність і встановлення відповідності.

У Пролозі існує особливий предикат рівність, що є інфіксним оператором, і позначається літерою '='. Коли робиться спроба довести узгодженість з базою даних цільового твердження ?— Х = У.(вимовляється X рівне У), Пролог намагається встановити відповідність між X і У; цільове твердження «доказове», якщо така відповідність є. Цю дію можна уявити собі як спробу зробити X і У рівними. Предикат рівності є вбудованим, тобто він вже визначений в Пролог-системі. Предикат рівності працює так, немов визначений наступний факт:

X = X.

Всередині всякого ствердження X завжди рівне X, і ця властивість використана нами при визначенні предиката рівності.

При узгодженні з базою даних мети виду X = У, де X і У — будь-які терми, в яких можуть міститися неконкретизовані змінні, діють наступні правила:

· якщо X є неконкретизованою змінною, а змінна У конкретизована (яке саме значення їй дано, неважливо), то X і У рівні. Крім того, X стане конкретизованою — їй буде дано те ж значення, що і У.

· цілі числа і атоми завжди дорівнюють самим собі.

· дві структури рівні, якщо вони мають один і той же функтом і однакову кількість аргументів, причому всі відповідні аргументи рівні.

Структури можуть бути вкладеними одна в одну на будь-яку глибину. Якщо такі структури перевіряються на рівність, то перевірка займе більше часу, оскільки необхідно перевірити всі структури. Спроба узгодити наступну ціль:

a(b,C,d(e,F,g(h,i,J)))=a(B,c,d(E,f,g(H,I,j))) буде успішною, а змінні В, C, F, Е, J будуть конкретизовані, їм будуть присвоєні відповідно значення b, c, f, e, j.

Що станеться, якщо ми спробуємо прирівняти дві неконкретизованs змінні? Це спеціальний випадок першого з наведених вище правил. Так, мета буде погоджена і дві змінні стануть зчепленими. Якщо дві змінні зчеплені, то при конкретизації однієї з них другій змінній буде автоматично присвоєне те ж саме конкретне значення.