Visual Prolog начинает поиск с возвратом, когда вызов завершается неудачно. В определенных ситуациях бывает необходимо инициализировать выполнение поиска с возвратом, чтобы найти другие решения.
Для прерывания поиска с возвратом Visual Prolog предусматривает возможность отсечения, которая используется; отсечение обозначается восклицательным знаком (!). Через отсечение невозможно совершить откат (поиск с возвратом).
Отсечение помещается в программу таким же образом, как и подцель в теле правила. Когда процесс проходит через отсечение, немедленно удовлетворяется обращение к cut и выполняется обращение к очередной подцели (если таковая имеется). Однажды пройдя через отсечение, уже невозможно произвести откат к подцелям, расположенным в обрабатываемом предложении перед отсечением, и также невозможно возвратиться к другим предложениям, определяющим обрабатывающий предикат (предикат, содержащий отсечение).
Существуют два основных случая применения отсечения:
- Если вы заранее знаете, что определенные посылки никогда не приведут к осмысленным решениям (поиск решений в этом случае будет лишней тратой времени), — примените отсечение, — программа станет быстрее и экономичнее. Такой прием называют зеленым отсечением.
|
|
- Если отсечения требует сама логика программы для исключения из рассмотрения альтернативных подцелей. Это — красное отсечение.
Использование отсечения делает предикат детерминированным
Вызов, который может дать множество решений — недетерминированный, тогда как вызов, дающий одно и только одно решение — детерминированный.
Visual Prolog дает несколько средств для управления направлением логического поиска в программе:
- предикат fail, использующийся для поддержания поиска с возвратом;
- предикат!, использующийся для предотвращения поиска с возвратом.
- предикат not дает успех, когда связанная с ним подцель не может быть доказана.
- предикат cut отменяет поиск с возвратом.
Использование предиката Fail
Visual Prolog поддерживает специальный предикат fail, вызывающий неуспешное завершение, и, следовательно, инициализирует возврат. Действие предиката fail равносильно эффекту от сравнения 2 = 3 или другой невозможной подцели.
Domains
name = symbol
Predicates
father(name, name)
everybody % все