Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ФиЛП для ИВТ.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
147.27 Кб
Скачать

5.7. Поиск с возвратом

Поиск с возвратом (backtracking) – это один из основных приемов поиска решений поставленной задачи в ПРОЛОГ’е. Выполняя поиск, ПРОЛОГ может столкнуться с необходимостью выбора между альтернативными путями. Тогда он ставит маркер у места развилки (точка отката) и выбирает первую подцель. Если она не выполняется, то ПРОЛОГ возвращается в точку отката и переходит к следующей подцели.

Рассмотрим механизм поиска на примере. Пусть имеются факты:

знает (лена, таня).

знает (лена, иван).

студент (иван).

Требуется определить, есть ли у Лены знакомые студенты.

Программа:

PREDICATES

знает (symbol, symbol)

студент (symbol)

знаком_студент(symbol, symbol)

CLAUSES

знает (лена, таня). % (1)

знает (лена, иван). % (2)

студент (иван). % (3)

знаком_студент(X,Y):- знает (X,Y), студент (Y). % (4)

GOAL

знаком_студент(лена, Name).

Поиск решения:

1. Пытаясь выполнить целевое утверждение знаком_студент(лена, Name), ПРОЛОГ проверяет каждое предложение из раздела CLAUSES. В результате сопоставления с предложением (4) - X=лена. Переменная Y унифицируется с переменной Name.

2. Переход к первой подцели знает (лена,Y) и поиск соответствующего предложения. В результате сопоставления с предложением (1) – Y=таня. Возле факта знает (лена, таня) устанавливается маркер.

3. Переход ко второй подцели студент (таня) и поиск соответствующего предложения. Факт не найден – возврат в точку отката.

4. Дальнейший поиск фактов, соответствующих первой подцели знает(лена,Y). В результате сопоставления с предложением (2) – Y=иван.

5. Переход ко второй подцели студент (иван) и поиск соответствующего предложения приводит к успешному завершению поиска.

Результат:

Name=иван

1 Solition

Д ерево поиска можно представить следующим образом:

рис.2. Целевое дерево поиска с возвратом

Благодаря механизму поиска с возвратом ПРОЛОГ в состоянии находить все возможные решения, имеющиеся для данной задачи.

Основные правила поиска с возвратом:

  1. Цели должны быть доказаны по порядку, слева направо.

  2. Для доказательства некоторой цели предложения просматриваются в том порядке, в каком они появляются в тексте программы.

  3. Для того, чтобы доказать заголовочную цель правила, необходимо доказать цели в теле правила. Тело правила состоит, в свою очередь из целей, которые должны быть доказаны.

  4. Цель считается доказанной, если с помощью соответствующих фактов доказаны все цели, находящиеся в листьевых вершинах дерева целей.

5.8. Управление поиском с возвратом: предикаты fail и отсечения

Для управление поиском с возвратом используются два стандартных предиката: fail и отсечения.

1. fail – это тождественно-ложный предикат, искусственно создающий ситуацию неуспеха и заставляющий продолжить поиск. Использование предиката fail позволяет найти все решения задачи.

Пример 1. Вывести список студентов 4-го курса.

DOMAINS

name=string

kurs=integer

PREDICATES

Student(name, kurs)

spisok

CLAUSES

Student("Ира",2).

Student("Юра",4).

Student("Коля",1).

Student("Леша",4).

Student("Оля",4).

spisok:-Write("Список студентов 4 курса"), nl, Student(X,4),

Write(X), nl, fail.

GOAL

spisok.

Комментарий: nl (new line) – предикат перевода курсора на новую строку

В данном примере после первого найденного решения (Х= «Юра») и его вывода предикат fail заставляет вернуться в точку отката и продолжить поиск, просматривая другие факты. В результате будут найдены все решения, удовлетворяющие запросу.

Результат выполнения программы:

Список студентов 4 курса

Юра

Леша

Оля

2. Чтобы ограничить пространство поиска и прервать поиск решений при выполнении какого-либо условия, используется предикат отсечения (обозначается !), Однажды пройдя через отсечение, невозможно вернуться назад, т.к. этот предикат является тождественно-истинным. Процесс может только перейти к следующей подцели, если такая имеется.

Если задано предложение вида:

R:-A, B, ! , C.

то после достижения подцелей А и В процесс поиска других решений этих подцелей прекращается и вычислительный процесс перейдет к следующей подцели С.

Например, чтобы в примере 1 вывести все возможные пары одного из студентов 4-го курса со всеми остальными студентами, следует изменить правило spisok

spisok:- Student(X,4), !, Student(Y,_), X<>Y, Write(X," - ",Y), nl, fail.

Результат выполнения программы:

Юра - Ира

Юра - Коля

Юра - Леша

Юра – Оля