70
fail. /* неудача */
Конструкция <предикаты и правила> в теле правила обозначает пре-
дикаты, содержащие несколько утверждений, а так же правила, определен-
ные в программе. Встроенный предикат fail (неудача) вызывает откат, так
что предикаты и правила выполняются еще раз.
Вид правила, выполняющего рекурсию, следующий:
recursive_rule :- /* правило рекурсии */
<предикаты и правила>,
recursive_rule.
Заметьте, что последним правилом в теле данного правила является
само правило recursive_rule. Правила рекурсии содержат в теле правила сами
себя.
Правила повтора и рекурсии могут обеспечивать одинаковый резуль-
тат, хотя алгоритмы их выполнения не одинаковы. Каждый из них в конкрет-
ной ситуации имеет свои преимущества.
Рекурсия, например, может потребовать
больше системных ресурсов.
Так всякий раз при рекурсивном вызове новые копии используемых значе-
ний помещаются в стек. Стек представляет собой область памяти, исполь-
зуемую в основном для передачи значений между правилами. Значения
сохраняются пока правило не завершиться либо успешно, либо неуспешно. В
некоторых ситуациях такое использование стека может быть оправдано, ес
-
ли промежуточные значения должны храниться в определенном порядке для
дальнейшего использования. В следующей главе вы увидите, какую особую
роль играет стек при обработке списков.
Турбо-Пролог имеет средства для сокращения "потребления" стека,
однако правила повтора, использующие откат, не увеличивают занятую
часть стека. В данной главе не ставилась задача обоснования выбора
того
или иного метода, это будет сделано в следующих главах. Здесь же приве-
дены программы, демонстрирующие как пользоваться этими двумя метода-
ми.
4.3 Повторение и откат
Обычно цель программы на Турбо-Прологе содержит одну или не-
сколько подцелей, которые могут быть либо фактами, либо правилами. Факт
вычисляется немедленно. Результат будет
либо успешным, либо неуспеш-
ным в зависимости от того, сопоставим ли факт в программе с фактом в
правиле. Правило, являясь связкой подправил, вычисляется путем вычисле-
ния подправил. Если подправило не может быть успешно вычислено, то Тур-
бо-Пролог выполняет откат, что бы найти другие возможные пути вычисле-
ния этого подправила.
Проанализируем понятие отката на примере простой базы данных о
спортивных увлечениях, содержащей следующие факты:
plays(tom,football) /* Том играет в американский */
/* футбол */
plays(john,soccer) /* Джон играет в европейский */