1.Основными средствами управления процессом вычислений в Prolog являются стандартные предикаты fail (неуспех) и ! (отсечение). Назначение этих предикатов и методы их использования рассмотрим на примере программы
domains
st = student (fam, pr, ос)
fam, pr = symbol
num, oc = integer
g= gr (num, st)
predicates
Kurs_22 (g)
Если теперь после компиляции программы в качестве внешней цепи ввести запрос: Kurs 22 (х) находит х решений, то в диалоговом окне будет выведена информация:
(1) X = gr (261, student (Петров П.Р.,программирование,5)).
X = gr (261, student (Иванов Б.О.,"ОС", 5)).
Т.е. будут найдены все варианты решений, т.к. в запросе не задано ограничений на значение переменной х.
Если теперь любой из этих запросов сделать внутренним, т.е. записать в разделе goal, откомпилировать и выполнить программу, то кроме сообщения Press the SPACE bar, в диалоговом окне не будет результатов, т.к. мы не задали предикатов вывода значений результата внутреннего запроса.
Здесь для вывода значений переменной х после сопоставления используется системный предикат write(...). Результаты такого запроса будут помещены в диалоговое окно в виде (1). Т.е. будет найдено первое подходящее решение. если теперь не меняя запроса изменить порядок, предложенный в программе, например, поменять местами первое со вторым, то результат будет другим:
gr (261, student ("Иванов Б.О.,»ОС»,5)).
Prolog чувствителен к порядку предложений в программе. Правило просматривается сверху вниз. Для того, чтобы заставить prolog осуществить поиск всех вариантов решения задачи при использовании внутренней цели в программе (в данном варианте это вывод на экран всех фактов), необходимо организовать циклический перебор всех альтернативных решений. В Prolog это можно сделать различными способами.
Один из них - использовать свойства Prolog выполнять поиск альтернативного решения. При неудачной попытке - применения текущего Prolog выполнит откат до ближайшей альтернативы. Восстанавливает первоначальные условия поиска и процесс начинается заново с найденной новой альтернативой.
Для организации таких вычислений в языке есть специальный предикат, который всегда завершается неуспехом и вызывает откат до ближайшей альтернативы (fail).
Предписать Prolog выполнять откат можно не только с помощью предиката (fail). Любой неуспешно завершенный предикат вызывает откат до ближайшей альтернативы (стоящего от него левее в теле правила).
Т.о., сравнение Z= «Программирование», выполняет двоякую роль: с одной стороны, это фильтр, который не допускает выполнение предиката WR1TE(...), при неуспешном сравнении, а с другой стороны - вызывает из-за неуспешного сравнения откат до ближайшей альтернативы. При этом если бы не было предиката fail, то было бы получено только первое решение - tail обеспечивает перебор всех альтернатив. Предикат n! является стандартным, он выполняет переход на следующую строку при выводе информации на экран.
В Turbo Prolog имеются средства, с помощью которых можно заблокировать поиск с возвратом. Для этих целей служит специальный предикат, который называется отсечением (cut) и обозначается «!».
Другими словами, отсечение ограничивает распространение аргументов для подпора новых значений возврата (Бектрекинга) из-за неудачи. Отсечение применяется так же для ускорения вычислений путём отбрасывания избыточных ветвей вычислений.
Замечания:
1. Ранее были показаны отличия выполнения внутреннего (описанного в goal) и внешнего (вводимого через приглашение системы в диалоговом окне) запросов. Теперь мы можем сказать, что перебор всех альтернативных решений для внешнего запроса обеспечивается автоматическим присоединением к нему системой Turbo Prolog стандартного предиката fail.
2. Наличие в программе раздела goal позволяет после компиляции логической программы получить логический модуль программы и использовать его независимо от среды программирования Turbo Prolog.