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

Задание

Задача: спланировать турнир между девятилетними членами команды. Каждая пара игроков должна провести между собой две игры. Необходимо спланировать все возможные пары членов клуба, возраст которых 9 лет.

Создание программы

  1. Запустить среду визуальной разработки Visual Prolog.

  2. Создать новое окно редактирования File/New.

domains

child = symbol

age = integer

predicates

player (child, age)

clauses

player (liz, 9).

player (nik, 9).

player (don, 10).

player (sani, 9).

goal

player (Person1, 9),

player (Person2, 9),

Person1<>Person2.

  1. Запустить программу для выполнения запроса (меню Project/ Test Goal).

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

Person1=liz, Person2=nik

Person1=liz, Person2=sani

Person1=nik, Person2=liz

Person1=nik, Person2=sani

Person1=sani, Person2=liz

Person1=sani, Person2=nik

6 Solutions

  1. Сохранить файл с именем lab4.

Использование отладчика приложения (Debugger)

  1. Запустить отладчик приложения (меню Project/Debug).

  2. В появившемся окне отладчика, выбрать команду меню View/Local Variables. Стрелка указывает строку выполнения программы.

  3. Нажатием горячей клавиши F7 или пунктом меню отладчика Run/Trace Into просмотреть работу Visual Prolog при выполнении запроса.

  4. На основе наблюдений составить дерево целей и алгоритм работы программы.

Вопросы для самоконтроля

    1. Перечислите правила используемые для сопоставления.

    2. Дайте трактовку понятию унификация.

    3. Перечислите основные принципы работы механизма поиска с возвратом в Visual Prolog.

    4. Описать правила создания целевого дерева.

    5. Описать правила построения алгоритма работы программы.

Лабораторная работа «Управление поиском решения»

Тема: Управление поиском решения.

Цель работы: изучить методы управления поиском решения в Visual Prolog.

Управление поиском решений

Часто при решении реальной задачи мы придерживаемся определенного пути для ее логического завершения. Если полученный результат не дает искомого ответа, мы должны выбрать другой путь. Так, вам, возможно, приходилось играть в лабиринт. Один из верных способов найти конец лабиринта — это поворачивать налево на каждой развилке лабиринта до тех пор, пока вы не попадете в тупик. Тогда следует вернуться к последней развилке и попробовать свернуть вправо, после чего опять поворачивать налево на каждом встречающемся распутье. Путем методичного перебора всех возможных путей вы, в конце концов, найдете выход.

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

Visual Prolog начинает поиск с возвратом, когда вызов завершается неудачно. В определенных ситуациях бывает необходимо инициализировать выполнение поиска с возвратом, чтобы найти другие решения.

Для прерывания поиска с возвратом Visual Prolog предусматривает возможность отсечения, которая используется; отсечение обозначается восклицательным знаком (!). Через отсечение невозможно совершить откат (поиск с возвратом).

Отсечение помещается в программу таким же образом, как и подцель в теле правила. Когда процесс проходит через отсечение, немедленно удовлетворяется обращение к cut и выполняется обращение к очередной подцели (если таковая имеется). Однажды пройдя через отсечение, уже невозможно произвести откат к подцелям, расположенным в обрабатываемом предложении перед отсечением, и также невозможно возвратиться к другим предложениям, определяющим обрабатывающий предикат (предикат, содержащий отсечение).

Существуют два основных случая применения отсечения:

  • Если вы заранее знаете, что определенные посылки никогда не приведут к осмысленным решениям (поиск решений в этом случае будет лишней тратой времени), — примените отсечение, — программа станет быстрее и экономичнее. Такой прием называют зеленым отсечением.

  • Если отсечения требует сама логика программы для исключения из рассмотрения альтернативных подцелей. Это — красное отсечение.

Использование отсечения делает предикат детерминированным

Вызов, который может дать множество решений — недетерминированный, тогда как вызов, дающий одно и только одно решение — детерминированный.

Visual Prolog дает несколько средств для управления направлением логического поиска в программе:

  • предикат fail, использующийся для поддержания поиска с возвратом;

  • предикат !, использующийся для предотвращения поиска с возвратом.

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

  • предикат cut отменяет поиск с возвратом.