Повторение и откат
При поиске решений процедуры унификации используют откат как автоматический процесс, который используется, если не применяются специальные средства управления им. Как, например, для внутренней цели найти все решения? Для управления откатом используется два встроенных предиката:
- fail – неудача,
- cut – отсечение.
7.8.1. Метод отката после неудачи (ОПН)
Рассмотрим программу печати городов России. Поскольку все цели удовлетворяют условиям, то будет напечатан только первый город, а остальные не напечатаются. Чтобы заставить вывести программу все города, используют искусственное неуспешное завершение правила fail, при этом выполняется откат:
domain
name=symbol
preducates
cities(name)
showcities
goal
write(“There are the cities“), nl, showcities
clauses
cities(москва)
cities(томск)
cities(омск)
showcities:– cities (C),
write(“ “, C), nl, fail.
Если последнее правило будет иметь вид: write(“ “, C), nl, то будет напечатано название только одного города. Метод ОПН удобен для обработки служебных данных: создания платежной ведомости, начисления зарплаты, генерации отчета и т.д.
При добавлении дополнительных ограничений на значения объектов для одной или более переменных предиката можно извлекать данные только из определенных утверждений.
Например: cities(С), С=москва, выдаст только город Москву.
7.8.2. Метод отсечения и отката (ОО)
Иногда необходимо иметь доступ только к определенной части данных. В этом случае используется метод ОО для фильтрации данных, извлеченных из базы. Отсечение применяется для устранения бесконечных циклов, при программировании взаимоисключающих утверждений и при необходимости неудачного завершения доказательства цели. Средство управления откатом – предикат cut (отсечение, !)
Этот предикат всегда вычисляется успешно и заставляет забыть все указатели отката, установленные во время попыток вычислить текущую подцель, т.е. устанавливается барьер, запрещающий выполнить откат по всем альтернативным решениям текущей цели.
Но последующие подцели могут создать новые указатели отката и тем самым создать условия поиска новых решений. Но если все более поздние цели окажутся неуспешными, то барьер cut заставит механизм отката отсечь все решения в области действия cut путем немедленного отката к другим возможным решениям вне области действия cut. Метод ОО использует fail для имитации неуспешного вычисления и выполнения последующего отката до тех пор, пока не будет обнаружено определенное условие. Предикат cut служит для устранения всех последующих откатов.
Пример. Напечатать список детей до Петра включительно
domain
person=symbol – дети
preducates
child(person) – список
show – показывает список
make_cut – отсекает на Петре
gool
write(“Дети”), nl, show.
clauses
child(“Маша”)
child(“Мила”)
child(“Миша”)
child(“Петр”)
child(“Катя”)
show:– child (Name), write (“имя”, Name), nl, make_cut (Name), !.
make_cut(Name):– Name=”Петр”.7.8.3. Метод повтора, определенный пользователем
Этот метод выполняет откат всегда в отличие от метода ОО, где откат выполняется только после искусственно созданного неуспешного результата. Используется при реализации доступа к данным в базе и файлам, организации выдачи на экран и формировании меню.
repeat:– repeat (повторяй себя) – это рекурсивное правило.
Предикат repeat будет вычисляться успешно при каждой новой попытке его вызвать после отката.
Пример:
domain
name=symbol
predicacates
write_mеs
repeat
do_echo
check(name) – проверитьимя
gool
write_mеs, – получить сообщение и его напечатать
do-echo
clauses
repeat
repeat:– repeat.
Write_mеs:- nl, write (“введи слово для окончания”), nl.
do_echo:– repeat, readeln (Name) – операторы ввода строки с клавиатуры
write(Name), nl,
check(name), !.
check(stop):– nl, write (“конец”).
check(_):– fail.