1. Если x и y-константы, то они унифицируемы, только если они равны.
2. Если x- константа или функция, а Y-переменная, то они унифицируемы, при этом Y принимает значение x .
3. Если x и y -функции, то они унифицируемы тогда и только тогда, когда у них одинаковые имена функций (функторы) и набор аргументов и каждая пара аргументов функций унифицируемы.
Есть особый предикат «=», который используется в Прологе для отождествления двух термов. Использование оператора «=» поможет лучше понять процесс означивания переменной. В Прологе оператор «=» интерпретируется как оператор присваивания или как оператор проверки на равенство в зависимости от того, являются ли значения термов свободными или связанными.
Пример 20: X=Y, если X и Y – связанные переменные, то производится проверка на равенство, например: если X=5 и Y=5, то результат ДА (истина); если X=6 а Y=5, то результат НЕТ(ложь). Если одна из переменных X или Y – свободная, то ей будет присвоено значение другой переменной, для Турбо-Пролога несущественно слева или справа от знака «=» стоит связанная переменная.
Оператор «=» ведет себя точно так, как внутренние подпрограммы унификации при сопоставлении целей или подцелей с фактами и правилами программы.
Каноническая форма цели (вопроса) является конъюнкцией атомарных предикатов, то есть последовательностью подцелей, разделенных запятыми:
Q=Q1, Q2,…, Qn.
Пролог пытается вычислить цель при помощи унификации термов предикатов подцелей с соответствующими элементами в фактах и заголовках правил. Поиск ответа на вопрос напоминает поиск пути в лабиринте: следует поворачивать налево в каждой развилке лабиринта до тех пор, пока не попадете в тупик. В этом случае следует вернуться к последней развилке и повернуть направо, после чего опять следует повернуть направо и так далее. Унификация выполняется слева направо, как и поиск пути в лабиринте.
Некоторые подцели при унификации с некоторыми фактами или правилами могут оказаться неуспешными, поэтому Прологу требуется способ запоминания точек отката, в которых он может продолжить альтернативные поиски решения. Прежде чем реализовать один из возможных путей вычисления подцели, Пролог фактически помещает в программу указатель, который определяет точку, в которую может быть выполнен возврат, если текущая попытка поиска цели будет неудачной.
Если некоторая подцель оказывается неуспешной, то Пролог возвращается влево к ближайшей точке возврата. С этой точки Пролог начинает попытку найти другое решение для неуспешной цели. До тех пор, пока следующая цель на данном уровне не будет успешной, Пролог будет повторять возврат к ближайшей точке возврата. Эти попытки выполняются внутренними подпрограммами унификации и механизмом возврата.
Замечание: единственным способом освободить переменную, связанную в предложении является откат при поиске с возвратом.
Алгоритм вычисления цели – частный случай правила резолюции применительно к дизъюнктам Хорна. Вопрос Q является правилом без заголовка, аналогом выражения ШQ. Пусть D – база данных (множество дизъюнктов). На вопрос Q, следует найти такую подстановку s, для которой множество s[DИ(ШQ)] невыполнимо. Стратегия выбора очередной пары дизъюнктов для резолюции здесь очень проста: подцели и предложения просматриваются в текстуальном порядке.
Пример 21: пусть есть БД семья:
1. мать( мария, анна).
2. мать(мария, юлия).
3. мать( анна, петр).
4. отец( иван, анна).
5. отец( иван, юлия).
6. дед (X, Y): - отец(X, Z), мать(Z, Y).
7. дед (X, Y): - отец(X, Z), отец(Z, Y).
8. бабка (X, Y): - мать(X, Z), мать(Z, Y).
9. бабка (X, Y): - мать(X, Z), отец(Z, Y).
Зададим сложную цель:
Q1, Q2 = отец(X, Y), мать(мария, Y).
Подцель Q1= отец(X,Y) соответствует четвертому предложению БД :отец (иван,анна). Это дает подстановку s1={X=иван,Y=анна}. Затем найденная подстановка применяется к s1[Q2]= мать(мария, анна). Этой подцели соответствует 1 предложение БД, что дает пустую подцель по правилу резолюции, следовательно ответ найден: X= иван, Y= анна.
Для получения нового ответа в БД ищется новая унификация для s1[Q2]. Так как в БД нет соответствующего предложения, то вычисления прекращаются, система вновь рассматривает последовательность Q1, Q2 и для Q1 ищется новая унификация в БД, начиная с пятого предложения. Это и есть возврат. Пятое предложение сразу же дает желаемую унификацию с подстановкой s2={X=иван,Y=юлия}. Вновь найденная подстановка применяется к s1[Q2]= мать(мария, юлия). Этой подцели соответствует второе предложение БД. Далее указанная процедура повторяется и в итоге имеем: