В главе 1 в разд. "Как пролог-система отвечает на вопросы" мы уже фактически рассмотрели, что делает процедура вычислить. В оставшейся части данного раздела приводится несколько более формальное и систематическое описание этого процесса, которое можно пропустить без серьезного ущерба для понимания остального материала книги.
Конкретные операции, выполняемые в процессе вычисления целевых утверждений, показаны на Рисунок 2.10. Возможно, следует изучить этот рисунок прежде, чем знакомиться с последующим общим описанием.
Чтобы вычислить список целевых утверждений
G1, G2, ..., Gm
процедура вычислить делает следующее:
line();Более компактная запись этой процедуры в обозначениях, близких к Паскалю, приведена на Рисунок 2.11.
Здесь следует сделать несколько дополнительных замечаний, касающихся процедуры вычислить в том виде, в котором она приводится. Во-первых, в ней явно не указано, как порождается окончательная результирующая конкретизация переменных. Речь идет о конкретизации S, которая приводит к успешному завершению и которая, возможно, уточнялась последующими конкретизациями во время вложенных рекурсивных вызовов вычислить.
line();procedure вычислить (Прогр, СписокЦелей, Успех)
Входные параметры:
Прогр: список предложений
СписокЦелей: список целей
Выходной параметр:
Успех:
истинностное значение; Успех принимает значение
истина, если список целевых утверждений
(их конъюнкция) истиннен с точки зрения Прогр
Локальные переменные:
Цель: цель
ДругиеЦели: список целей
Достигнуты: истинностное значение
Сопоставились: истинностное значение
Конкрет: конкретизация переменных
Н, Н', B1, B1', ..., Вn , Вn':
цели
Вспомогательные функции:
пycтой( L): возвращает истину, если L - пустой список
голoвa( L): возвращает первый элемент списка L
хвост( L): возвращает остальную часть списка L
конкат( L1, L2):
создает конкатенацию списков - присоединяет
список L2 к концу списка L1
сопоставление( T1, T2, Сопоставились, Конкрет): пытается
сопоставить термы Т1 и T2; если они сопоставимы, то
Сопоставились - истина, а Конкрет
представляет
собой конкретизацию переменных
подставить( Конкрет, Цели): производит подстановку переменных
в Цели согласно Конкрет
begin
if пустой( СписокЦелей) then
Успех : = истина
else
begin
Цель : = голова( СписокЦелей);
ДругиеЦели
: = хвост( СписокЦелей);
Достигнута
: = ложь;
while not
Достигнута and
"в программе есть еще предложения" do
begin
Пусть следующее предложение в Прогр есть
Н :- B1, .... Вn.
Создать вариант этого предложения
Н' :- В1', .... Вn'.
сопоставление( Цель, Н',
Сопоставились, Конкрет)
if Сопоставились then
begin
НовыеЦели : =
конкат( [В1', ..., Вn' ], Другие Цели);
НовыеЦели : =
подставить( Конкрет, НовыеЦели);
вычислить( Прогр, НовыеЦели, Достигнуты)
end
end;
Успех : =
Достигнуты
end
end;