|
Для того, чтобы представить работу механизма автоматического возврата, удобно воспользоваться понятием маркера. Маркер отмечает текущее утверждение в программе, сопоставимое с целью. Для каждой цели в запросе Пролог-система создает свой собственный маркер, который будем обозначать значком “V”. Маркеры могут передвигаться только вперед. Однако, когда цель начинает согласовываться сначала, соответствующий маркер устанавливается на первое утверждение, заголовок которого совпадает с именем предиката цели.
Рассмотрим этот процесс на примере. Пусть программа «Однокурсники» содержит следующие утверждения:
(1) student_course(X,Y): - student(X,K1),
student(Y,K2),X=Y,K1=K2.
(2) student(‘Иванов’,1).
(3) student(‘Петров’,4).
(4) student(‘Сидоров’,2).
(5) student(‘Кузнецов’,4).
Пусть требуется согласовать запрос:
? - student_course(X,Y).
Этот запрос сопоставим с первым утверждением, которое является правилом, поэтому производится редукция цели, и текущая резольвента примет вид:
ТР: student(X,K1), student(Y,K2),X=Y,K1=K2.
Создадим маркер V1 для первой цели в резольвенте student(X,K1) и маркер V2 для второй цели в резольвенте student(Y,K2).
При просмотре фактов student в программе маркеры будут передвигаться следующим образом:
(2) student(‘Иванов’,1). V1 V2 (no) V2 (no)
(3) student(‘Петров’,4). V2 (no) V V2 (no)
(4) student(‘Сидоров’,2). V2 (no) V2 (no)
(5) student(‘Кузнецов’,4). V2 (no) V2 (yes)
возврат 1-й цели успешный
вывод
при подстановке {X=‘Петров’; Y=‘Кузнецов’}.
Таким образом, ответ на запрос будет выдан в следующем виде:
? - student_course(X,Y).
X=‘Петров’
Y=‘Кузнецов’- >
Получив решение, Пролог-система предлагает пользователю решить, нужно ли искать другие решения. При нажатии клавиши «;» интерпретатор Пролога выполняет возврат на первую цель и переставляет маркер V1 на предложение 3 программы, а маркер V2 на первое предложение.
(2) student(‘Иванов’,1). V2(no) V2 (no)
(3) student(‘Петров’,4). V2(no) V2(yes)
(4) student(‘Сидоров’,2). V1 V2(no)
(5) student(‘Кузнецов’,4). V2(no) V1
возврат 1-й цели успешный
вывод
при подстановке {X=‘Петров’; Y=‘Кузнецов’}.
Не найдя второкурсников, кроме Сидорова система сама производит возврат и переставляет маркер V1 на предложение 4 программы, а маркер V2 на первое предложение.
Таким образом, ответ на запрос будет выдан в следующем виде:
? - student_course(X,Y).
X=‘Кузнецов’
|