Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие по ЛБ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
620.54 Кб
Скачать

Детальный поиск с возвратом

Пример.

domains % раздел доменов

title, autor = symbol % домены название и автор – символьные

pages = unsigned % домен страницы – беззнаковое, количественное 0-4294967259

рredicates % раздел предикатов

book (title, pages) % задание предиката книги с указанием названия и количества страниц

written_by (autor, title) % задание писатели с указанием имени автора и названия написанной книги

long_novel (title)

clauses % раздел предложений для задания пользовательских предикатов, правил, фактов

written_by (pushkin, pugahtev). % писатель Пушкин написал книгу Пугачев

written_by (lermontov, mziri). % писатель Лермонтов написал книгу Мцири

book (pugahtev, 100). % книга Пугачев содержит 320 страниц

book (mziri, 370). % книга Мцири содержит 370 страниц

long_novel (Title):-

written_by (_, Title),

book (Title, Pages),

Pages>350. % внутреннее целевое утверждение

goal % раздел целей (запросов)

Рассмотрим следующий запрос с унификацией: показать все названия книг long_novel.

long_novel (T).

Получим ответ

T=mziri

1 Solution

Для разбора этого простого примера в первую очередь построим целевое дерево процесса поиска. Целевое дерево процесса поиска строится по следующим правилам:

  1. Подцели должны быть согласованны по порядку сверху вниз.

  2. Предикатные предложения проверяются в том порядке в каком они появляются в программе, сверху вниз.

  3. Когда подцель соответствует заголовку правила, далее должно быть согласованно тело этого правила: тело правила теперь образует новое множество подцелей для согласования.

  4. Ц елевое утверждение считается согласованным, когда соответствующий факт найден для каждой оконечности листа целевого дерева.

Рис. 5. Пример насогласованного целевого дерева

Данное целевое утверждение не согласованно, выполняется поиск с возвратом начиная с точки отката.

Рис. 6. Пример согласованного целевого дерева

Целевое утверждение можно считать согласованным, т.к. найдены соответствующие факты для каждой оконечности листа целевого дерева.

Построим алгоритм работы данной программы (рисунок 7).

Поскольку _ свободная переменная, то она может быть унифицирована с любым другим аргументом. Title в заголовке long_novel так же не связан. Целевое утверждение соответствует заголовку правила, и унификация выполняется.

Visual Prolog пытается согласовать подцели с правилом. В первую очередь Visual Prolog обращается к первой подцели в теле правила written_by (_, Title) . Поскольку авторство книги является несущественным (на месте аргумента title анонимная переменная). Отношение written_by (_, Title) становится текущей подцелью, и Visual Prolog ищет решение для этого обращения. _унифицирована с любым аргументом

Title связана с pugahtev

  1. Visual Prolog ищет соответствие с данной подцелью начиная с вершины программы и до ее конца. Переменная связывается с двумя значениями и обращение к book (Title, Pages) происходит уже с этими значениями переменной.

T=pugahtev

T=mziri

  1. Visual Prolog ищет соответствие с обращением book и Pages>350. После выполнения сравнения значение переменной T=mziri.

Рассмотрим следующий пример: Показать информацию о книгах, количество страниц которых более 350.

book (M, P),

P>350.

Получим ответ

M=mziri, P=370

1 Solution

Рассмотрим пример: Показать читателей, читающих толстые книги (количество страниц которых более 350).

written_by (Autor, Title),

book (Title, Pages),

Pages>350.

Получим ответ

Autor=lermontov, Title=mziri, Pages=370

1 Solution

Рис. 7. Алгоритм работы программы (обратный вывод поиск в глубину)