Программирование на языке Пролог | страница 64
услуги(Читатель,Вид_услуг):-
книга_не_возвращена(Читатель,Книга),!,основные_услуги (Вид_услуг).
услуги(Читатель,Вид_услуг):-общие_услуги(Вид_услуг).
основные_услуги(пользование_каталогом).
основные_услуги(получение_справок).
дополнительные_услуги (абонемент).
дополнительные_услуги(межбиблиотечный_абонемент).
общие_услуги(X):-основные_услуги(X).
общие_услуги(X):-дополнительные_услуги(X).
книга_не_возвращена('С. Уотзер',книга10089),
книга_не_возвращена('А. Джонс', книга29907).
. . .
читатель('А.Джонс'). читатель('В.Метеск').
Зачем понадобилось использовать отсечение в этой программе и какой эффект оно оказывает? Предположим, что вы хотите просмотреть список всех читателей и определить, какие услуги им доступны. В этом случае вам надо обратиться к Прологу со следующим вопросом:
?- читатель(X), услуги(X,Y).
Начав поиск ответа, Пролог выберет первого читателя: А.Джонс. Предположим, что этот читатель имеет на руках несколько не возвращенных в указанный срок книг. Для того чтобы определить, какие услуги доступны ему, Пролог воспользуется первым утверждением для предиката услуги. Это приводит к появлению нового целевого утверждения – книга_не_возвращена. После небольшого поиска среди фактов книга_не_возвращена обнаружен факт о первой не возвращенной А. Джонсом в срок книги (второй факт для этого предиката). Следующее целевое утверждение – это отсечение. Эта цель автоматически согласуется с базой данных, и в результате этого в системе закрепляются все решения, принятые с момента выбора первого утверждения услуги.
Мы можем представить ситуацию, возникшую непосредственно перед выполнением отсечения, в виде диаграммы, приведенной на рис. 4.4. Когда в программе встречается отсечение, то оно «отсекает» путь, представляющий цепочку выполненных доказательств таким образом, что следующая цель соединяется непосредственно с исходной (см. рис. 4.5). Результат действия отсечения в правиле для предиката услуги (утверждение 1) заключается в том, что все цели, выбранные с момента, когда было выбрано это правило, запоминаются в системе как неизменяемые при обратном просмотре.
Путь, представляющий цепочку найденных доказательств, при этом изменяется так, что исключаются все маркеры, соответствующие целям, расположенным между услуги и отсечением включительно. Таким образом, если впоследствии произойдет возврат на точку! (отсечение), то попытка согласовать цель услуги немедленно потерпит неудачу. Система не будет рассматривать альтернативные решения для целевого утверждения