Операторы. Оператор — особая форма записи функтора
Оператор — особая форма записи функтора. Пример: 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.