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

Управление вычислениями.

1. Основные средства управления.

2. Средства Prolog в программировании.

1.Основными средствами управления процессом вычислений в Prolog являются стандартные предикаты fail (неуспех) и ! (отсечение). Назначение этих предикатов и методы их использования рассмотрим на примере программы

domains

st = student (fam, pr, ос)

fam, pr = symbol

num, oc = integer

g= gr (num, st)

predicates

Kurs_22 (g)

Если теперь после компиляции программы в качестве внешней цепи ввести запрос: Kurs 22 (х) находит х решений, то в диалоговом окне будет выведена информация:

(1) X = gr (261, student (Петров П.Р.,программирование,5)).

X = gr (261, student (Иванов Б.О.,"ОС", 5)).

Т.е. будут найдены все варианты решений, т.к. в запросе не задано ограничений на значение переменной х.

Если теперь любой из этих запросов сделать внутренним, т.е. записать в разделе goal, откомпилировать и выполнить программу, то кроме сообщения Press the SPACE bar, в диалоговом окне не будет результатов, т.к. мы не задали предикатов вывода значений результата внутреннего запроса.

Здесь для вывода значений переменной х после сопоставления используется системный предикат write(...). Результаты такого запроса будут помещены в диалоговое окно в виде (1). Т.е. будет найдено первое подходящее решение. если теперь не меняя запроса изменить порядок, предложенный в программе, например, поменять местами первое со вторым, то результат будет другим:

gr (261, student ("Иванов Б.О.,»ОС»,5)).

Prolog чувствителен к порядку предложений в программе. Правило просматривается сверху вниз. Для того, чтобы заставить prolog осуществить поиск всех вариантов решения задачи при использовании внутренней цели в программе (в данном варианте это вывод на экран всех фактов), необходимо организовать циклический перебор всех альтернативных решений. В Prolog это можно сделать различными способами.

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

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

Предписать Prolog выполнять откат можно не только с помощью предиката (fail). Любой неуспешно завершенный предикат вызывает откат до ближайшей альтернативы (стоящего от него левее в теле правила).

Т.о., сравнение Z= «Программирование», выполняет двоякую роль: с одной стороны, это фильтр, который не допускает выполнение предиката WR1TE(...), при неуспешном сравнении, а с другой стороны - вызывает из-за неуспешного сравнения откат до ближайшей альтернативы. При этом если бы не было предиката fail, то было бы получено только первое решение - tail обеспечивает перебор всех альтернатив. Предикат n! является стандартным, он выполняет переход на следующую строку при выводе информации на экран.

В Turbo Prolog имеются средства, с помощью которых можно заблокировать поиск с возвратом. Для этих целей служит специальный предикат, который называется отсечением (cut) и обозначается «!».

Другими словами, отсечение ограничивает распространение аргументов для подпора новых значений возврата (Бектрекинга) из-за неудачи. Отсечение применяется так же для ускорения вычислений путём отбрасывания избыточных ветвей вычислений.

Замечания:

1. Ранее были показаны отличия выполнения внутреннего (описанного в goal) и внешнего (вводимого через приглашение системы в диалоговом окне) запросов. Теперь мы можем сказать, что перебор всех альтернативных решений для внешнего запроса обеспечивается автоматическим присоединением к нему системой Turbo Prolog стандартного предиката fail.

2. Наличие в программе раздела goal позволяет после компиляции логической программы получить логический модуль программы и использовать его независимо от среды программирования Turbo Prolog.