Операторы. Оператор — особая форма записи функтора

Оператор — особая форма записи функтора. Пример: 1 + 2 то же, что и +(1, 2), а (1 + 2) * 3 то же, что и *(+(1, 2), 3).

Оператор характеризуется положением, ассоциативностью и приоритетом. По положению и ассоциативности выделяются следующие типы:

· префиксные операторы (операнд один, оператор перед операндом):

o fy — запись o o a допустима и эквивалентна o(o(a)); пример: – (замена знака);

o fx — запись o o a недопустима.

· инфиксные операторы (операндов два, оператор между операндами):

o yfx — запись a o b o c допустима и эквивалентна o(o(a, b), c); примеры: +, – (вычитание), и т. д.;

o xfy — запись a o b o c допустима и эквивалентна o(a, o(b, c)); пример: ** (возведение в степень).

o xfx — запись a o b o c недопустима; примеры: <, > и т. д.

· постфиксные операторы (операнд один, оператор после операнда):

o yf — запись a o o допустима и эквивалентна o(o(a)).

o xf — запись a o o недопустима.

Приоритет — это целое число. Операторы с меньшим приоритетом «выполняются» раньше, чем операторы с большим приоритетом.

Эквивалентность и унификация

Бинарный предикат = является встроенным. Цель =(X, Y) (или X = Y) удовлетворяется, если X можно унифицировать с Y. Правила унификации:

· если X — несвязанная переменная, а Y — атом или структура (или связанная переменная), то X унифицируется с Y, путем связывая X с Y. Аналогично, если Y — несвязанная переменная, то…;

?- X = mary.

X = mary.

?- mary = X.

X = mary.

?- X = likes(john, mary).

X = likes(john, mary).

?- X = likes(john, _).

X = likes(john, _G538).

?- X = 10.

X = 10.

?- X = 10+20.

X = 10+20.

· если как X, так и Y — несвязанные переменные, то X унифицируется с Y, путем связывания переменных друг с другом. Если одна переменная связана с другой и, если одна из них далее связывается с каким-либо термом, то с термом связывается и другая переменная;

?- X = Y.

X = Y.

· атомы или числа унифицируются только сами с собой;

?- mary = mary.

true.

?- mary = john.

false.

?- X = mary, X = john.

false.

?- X = mary, Y = john, X = Y.

false.

?- X = Y, X = john, Y = mary.

false.

?- 10 = 10.

true.

?- 10 = 3 + 7.

false.

· две структуры унифицируются друг с другом, если у них одинаковый функтор и одинаковое количество компонентов и если соответствующие компоненты этих структур этих структур унифицируются между собой.

?- likes(mary, john) = likes(mary, john).

true.

?- likes(mary, john) = likes(john, mary).

false.

?- likes(X, john) = likes(mary, john).

X = mary.

?- likes(X, john) = likes(mary, Y).

X = mary, Y = john.

?- likes(X, john) = likes(Y, Z).

X = Y, Z = john.

?- beliefs(X, Y) = beliefs(alice, likes(john, mary)).

X = alice, Y = likes(john, mary).

?- knows(jane, X) = knows(jane, beliefs(jane, X)).

X = beliefs(jane, X).

?- J = john, M = mary, A = alice, L = likes(J, M), B = beliefs(A, L).

J = john, M = mary, A = alice, L = likes(john, mary), B = beliefs(alice, likes(john, mary)).

?- X = knows(jane, X), X = knows(_, knows(_, knows(_, Y))).

X = Y, Y = knows(jane, Y).

?- 3 + 7 = 3 + 7.

true.

X = 3 + 7, Y + Z = X.

X = 3 + 7, Y = 3, Z = 7.