23
Имеем ряд фактов для отношения likes и имеем целевое
утверждение:
likes(
'
Nina
'
, Х), likes(
'
Katja
'
, Х).
Необходимо определить, что одновременно любят Nina и Katja.
Цель состоит из двух подцелей. Каждая подцель содержит переменную
Х. Необходимо найти значение Х, удовлетворяющее обеим подцелям.
Чтобы вычислить первую подцель likes('Nina', Х) Турбо-Пролог
выполняет следующие действия:
1) поиск в заданной базе данных предиката likes;
2) проверка арности (количества объектов предиката) предиката,
заданного в подцели, с арностью предиката likes в базе данных;
в случае совпадения выполняется следующее действие;
3) сопоставление предикатов по правилу ''сопоставление термов''.
Первый факт из базы данных сопоставим с первой подцелью,
переменная Х получает значение pears и подцель успешно вычисляется.
Значение переменной Х распространяется на все предложение, содержа-
щее целевое утверждение, поэтому имеем likes('Katja', pears). Имеются в
базе данных другие факты для предиката likes, которые могут быть
использованы для вычисления первой подцели. Поэтому
устанавливается указатель отката на предикат likes('Nina', apples). С
этого указателя могут быть продолжены вычисления первой подцели,
если произойдет неуспешное вычисление второй подцели likes('Katja', Х)
со значением Х, равным pears.
Первая подцель likes('Nina', Х) вычислена успешно, необходимо
вычислить вторую подцель likes('Katja', pears), которая представляет собой
факт. Внутренние унификационные подпрограммы просматривают базу
данных в поисках факта, сопоставимого со второй подцелью.
Сопоставимых фактов нет, следовательно, вторая подцель
likes('Katja', pears) неуспешна. После сопоставления переменная Х
становится свободной, Турбо-Пролог возвращается в точку, которая
содержит указатель отката likes('Nina', apples), и начинает вычислять
первую подцель likes('Nina', Х). Факт из базы данных likes('Nina', apples)
сопоставим с первой подцелью likes('Nina', Х). Переменная Х получает
значение apples. Устанавливается указатель отката на предикат likes('Nina',
banana). Первая подцель likes('Nina', Х) успешно выполнена, вычисляется
вторая подцель likes('Katja', apples). Вторая подцель успешно вычисляется,
так как в базе данных имеется факт likes('Katja', apples). Исходное целевое
утверждение, состоящее из двух успешно вычисленных подцелей, также
успешно вычислено. Если целевое утверждение представляет внутреннюю
цель, то процесс вычисления останавливается после первого успешного