Если в Visual Prolog создать программу для автономного исполнения (то есть создать свой project-файл для разрабатываемой программы), то поиск цели в ней будет вестись так же, как для внутренней цели в PDC Prolog, то есть до первого успешного решения.
Это описание объясняет, как работает утилита TestGoal в Visual Prolog.
При реализации механизма возврата выполняются следующие правила:
1. Подцели вычисляются слева-направо.
2. Предложения при вычислении подцели проверяются в текстуальном порядке, то есть сверху-вниз.
3. Если подцель сопоставима с заголовком правила, то должно быть вычислено тело этого правила, при этом тело правила образует новое подмножество подцелей для вычисления.
4. Цель считается успешно вычисленной, когда найден соответсвующий факт для каждой подцели.
Встроенный в Пролог механизм поиска с возвратом может привести к поиску ненужных решений, в результате чего снижается эффективность программы в случае, если надо найти только одно решение. В других случаях бывает необходимо продолжить поиск, даже если решине найдено.
Пролог обеспечивает два встроенных предиката, которые дают возможность управлять механизмом поиска с возвратом: предикат fail – используется для инициализации поиска с возвратом и предикат отсечения ! – используется для запрета возврата.
Предикат fail всегда имеет ложное значение!
Пример 22: Использование предиката fail. Для примера 21 можно добавить правило для печати всех матерей, которые есть в БД:
печать_матерей:-мать(X,Y), write(X,” есть мать”,Y),nl,fail.
goal
печать_матерей.
В результате будет выдано 3 решения:
X=мария, Y= анна.
X=мария, Y= юлия.
X=анна, Y= петр.
Отсечение так же, как и fail помещается в тело правила. Однако, в отличие от fail предикат отсечения имеет всегда истинное значение.
При этом выполняется обращение к другим предикатам в теле правила, следующим за отсечением. Следует иметь в виду, что невозможно произвести возврат к предикатам, расположенным в теле правила перед отсечением, а также невозможен возврат к другим правилам данного предиката.
Существует только два случая применения предиката отсечения:
1. Если заранее известно, что определенные посылки никогда не приведут к осмысленным решениям – это так называемое «зеленое отсечение».
2. Если отсечения требует сама логика программы для исключения альтернативных подцелей – это так называемое «красное отсечение».