Прерывание поиска с возвратом (отсечение)

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 % все


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: