Турбо-Пролог пытается вычислить цель при помощи сопоставления цели с утверждениями базы данных. Сопоставление выполняется СЛЕВА НАПРАВО, причем, в процессе доказательства основной цели,Турбо-Пролог сам генерирует подцели. Некоторые сопоставления подцелей с какими-то утверждениями, вероятно, будут неуспешными.
ПоэтомуТурбо-Прологу требуется способ запоминания точек, в которые он может вернуться, чтобы продолжить альтернативные попытки найти решение. Прежде чем выбрать один из возможных путей доказательства подцели, Турбо-Пролог фактически помещает в программу «указатель».
Указатель определяет точку, в которую может быть выполнен возврат, если текущая попытка будет неуспешной. По мере того, как Турбо-Пролог успешно заканчивает свои попытки вычисления подцелей слева направо, указатели возврата расставляются во всех точках, которые могут привести к альтернативному решению.
Если некоторая подцель оказывается неуспешной, то Турбо-Пролог возвращается влево и останавливается у ближайшего указателя возврата. С этой точки Турбо-Пролог начинает попытку найти другое решение для неуспешной цели.
До тех пор, пока следующая цель на данном уровне не будет успешной, Турбо-Пролог будет повторять возврат к ближайшему указателю возврата. Эти попытки выполняются внутренними подпрограммами унификации и механизмом возврата. Окончательным результатом будет либо успешное, либо неуспешное вычисление цели. Рассмотрим механизм возврата на примере программы 2.1.
/* Программа 2.1 «РОДСТВЕННИКИ».
Назначение: демонстрация механизма возврата */
domains
name=symbol
predicates
pearent(name,name)
feminin(name)
male(name)
sister(name,name)
clauses
pearent(mary,bob).
(2) pearent(mary,beth).
(1) pearent(tom,beth).
(4)(5) pearent(tom,bob).
(6) pearent(tom,liz).
(7) pearent(bob,ann).
pearent(bob,pat).
pearent(pat,jim).
feminin(mary).
feminin(beth).
(3) feminin(liz).
feminin(ann).
feminin(pat).
male(tom).
male(bob).
male(jim).
sister(X,Y):-
pearent(Z,X),
pearent(Z,Y),
feminin(X),
X<>Y .
/* Конец программы */
Будем вычислять цель
Goal: sister(beth,X)
Первым правилом, сопоставимым с нашей целью, является правило sister(X,Y). Так как других утверждений для предиката sister нет, то нет и альтернативных путей. Поэтому указатель возврата не ставится, а система генерирует первую подцель pearent(Z,beth). Эта подцель успешно согласуется с фактом pearent(mary,beth). Так как для предиката pearent есть другие утверждения, то указатель возврата (1) устанавливается на факт, следующий за фактом pearent(mary,beth).
Затем система генерирует подцель pearent(mary,Y) и начинает просматривать сначала всю базу данных. Первым утверждением, согласующим данную подцель, будет pearent(mary,bob). Указатель возврата (2) при этом устанавливается на следующее за ним утверждение pearent(mary,beth). Подцели feminin(beth) и beth<>bob успешно согласуются, цель вычисляется со значением X=bob.
Так как для feminin есть другие утверждения, то указатель возврата (3) устанавливается на feminin(liz) и к нему возвращается система, пытаясь передоказать feminin(beth). Передоказать его не удается, указатель (3) снимается, а система возвращается на указатель (2). X означивается beth, успешно доказывается feminin(beth), но beth<>beth неуспешно.Так как для pearent(mary,_) больше утверждений нет, то возвращаемся на (1). Цель pearent(tom,beth) успешно согласуется, на следующее утверждение устанавливается указатель (4), система генерирует подцель pearent(tom,Y).
Эта цель успешно доказывается с Y=beth, указатель (5) устанавливается на pearent(tom,bob), и к нему мы возвращаемся, потерпев неудачу при доказательстве beth<>beth. (5) снимается, на pearent(tom,liz) устанавливается (6). Так как beth<>bob цель успешно доказывается (получаем повторно X=bob) и возвращаемся на (6). Y получает значение liz, указатель (7) устанавливается на pearent(bob,ann). Успешно получив решение X=liz, возвращаемся на (7), потерпев неудачу, возвращаемся еще на шаг назад — на (4). bob не согласуется с beth, больше указателей нет, выходим из системы.