- •2.2.2.1 Вызов Турбо-Пролога и главное меню системы
- •2.2.3 Редактор Турбо-Пролога
- •2.2.3.1 Создание и редактирование программного файла
- •3 Лекция №2. Элементы и конструкции языка Турбо-Пролог
- •3.1 Основные вопросы
- •3.2 Текст лекции
- •3.2.1.1 Имена (идентификаторы)
- •3.2.2.1 Предикаты
- •3.2.2.2 Факты
- •3.2.2.3 Правила
- •3.2.2.4 Цели
- •4 Лекция №3. Объекты данных. Константы, переменные, структуры, списки.
- •4.1 Основные вопросы
- •4.2 Текст лекции
- •Стандартные типы доменов Турбо-Пролога
- •4.2.2.1 Константы
- •4.2.2.2 Переменные
- •4.2.2.3 Структуры
- •4.2.2.3 Списки
- •5 Лекция №4. Структура программы на Турбо-Прологе
- •5.1 Основные вопросы
- •5.2 Текст лекции
- •5.2.2 Структура программы на Турбо-Прологе – до 10 мин.
- •5.2.3.1 Раздел опций компилятора
- •5.2.3.2 Раздел констант
- •5.2.3.3 Раздел доменов
- •5.2.3.4 Раздел предикатов
- •5.2.3.5 Раздел утверждений
- •5.2.3.6 Раздел дбд
- •5.2.3.7 Раздел целей
- •6 Лекция №5. Унификация и поиск с возвратом: программа с фактами
- •6.1 Основные вопросы
- •6.2 Текст лекции
- •7 Лекция №6. Унификация и поиск с возвратом: программа с фактами и правилом
- •7.1 Ключевые (основные) вопросы (моменты)
- •7.2 Текст лекции
- •8 Лекция №7. Унификация и поиск с возвратом: программа с фактами и несколькими правилами
- •8.1 Основные вопросы
- •8.2 Текст лекции
- •9 Лекция №8. Вопросно-ответные системы
- •9.1 Основные вопросы
- •9.2 Текст лекции
- •10 Лекция №9. Средства отладки в Турбо-Прологе
- •10.1 Основные вопросы
- •10.2 Текст лекции
- •/*Программа 5 */
- •11 Лекция №10. Простейший ввод-вывод. Окна.
- •11.1 Основные вопросы
- •11.2 Текст лекции
- •11.2.1 Простейший ввод-вывод
- •11.2.2 Окна
- •12 Лекция №11. Управление поиском решений: предикаты отсечения и возврата
- •12.1 Основные вопросы
- •12.2 Текст лекции
- •/* Программа 5 */
- •Vse_reshenia:-roditel(X,y), write(X, "родитель", y), nl, fail.
- •Vita - родитель sasha
- •/* Программа 6 */
- •/* Программа 7 */
- •13 Лекция №12. Арифметика в Турбо-Прологе. Рекурсия.
- •13.1 Основные вопросы
- •13.2 Текст лекции
- •/* Программа 8 */
- •/* Программа 9 */
- •14 Лекция №13. Динамические базы данных
- •14.1 Основные вопросы
- •14.2 Текст лекции
- •/* Программа работы с дбд*/
- •15 Лекция №14. Работа со списками
- •15.1 Основные вопросы
- •15.2 Текст лекции
- •/* Программа 10*/
- •/* Программа 11 */
- •/* Программа 12 */
- •16 Лекция №15. Экспертные системы
- •16.1 Основные вопросы
- •16.2 Текст лекции
- •/* Программа эс*/
12 Лекция №11. Управление поиском решений: предикаты отсечения и возврата
Время: 2 часа (90 мин.)
12.1 Основные вопросы
-
предикат отсечения;
-
предикат возврата.
12.2 Текст лекции
В процессе достижения цели Турбо-Пролог осуществляет автоматический перебор вариантов, выполняя возврат(откат) при неуспехе, за счёт встроенного механизма возврата. Механизм возврата является полезным программным механизмом, т.к. он освобождает пользователя от необходимости программировать данную процедуру самому.
Однако, в большинстве случает необходимо либо ограничить перебор, либо вовсе исключить его, т.е. необходимо управлять механизмом возврата при неуспехе, т.к. ничем не ограниченный перебор может стать источником неэффективности программы.
В Турбо-Прологе имеется две возможности управлять возвратом:
- с помощью предиката возврата fail, который используется для безусловного возврата и поиска всех возможных решений.
- с помощью предиката отсечения cut, который используется для предотвращения возврата (обычно в программе обозначается восклицательным знаком «!»).
Рассмотрим действие каждого из этих предикатов на примерах приводимых ниже программ.
/* Программа 5 */
domains
person = symbol
predicates
roditel(person, person)
vse_reshenia
/* goal vse_reshenia. */
clauses
roditel(ola, sasha).
roditel(vita, sasha).
roditel(vita, kata).
roditel(sasha, ana).
roditel(sasha, vera).
roditel(vera, kola).
Vse_reshenia:-roditel(X,y), write(X, "родитель", y), nl, fail.
Данная программа отличается от предыдущей программы 3 добавлением предиката vse_reshenia и правила, определяющего этот предикат. Кроме того, в данной программе имеется раздел goal, который помещён в символы комментариев и, следовательно, пока "не работает".
Поставим для программы 5 задачу "Кто чей родитель":
Goal : roditel(X,Y).
Так как данная задача определяется как внешний запрос, то Турбо-Пролог выдаёт все возможные решения, т.е:
X=ola, Y=sasha
X=vita, Y=sasha
. . .
6 Soltions
Если же снять символы комментариев с раздела goal программы, то будет решаться внутренняя задача, определяемая предикатом vse_reshenia. Она решается в соответствии с правилом, определяющим данный предикат в разделе clauses. В это правило (точнее его правую часть) входят предикаты roditel(X, Y), write(X, "родитель", Y), символ управления печатью nl, и предикат fail, который вынуждает Турбо-Пролог повторно выполнять все идущие перед ним предикаты до нахождения всех возможных альтернативных решений (если они существуют). Фактически в правой части правила, определяющего целевой предикат vse_reshenia, значимой подзадачей, имеющей альтернативные решения является идущая первой после функтора правила подзадача roditel(X, Y). Поэтому после нахождения первого решения для предиката roditel(X, Y) Турбо-Пролог, в соответствии с логикой управления поиском принятия решений, задаваемой предикатом vse_reshenia, будет возвращаться к поиску других его решений, пока они есть. В результате будут получены те же шесть решений, как и в случае внешнего запроса, однако форма выдачи на экран результата будет уже определяться используемым стандартным предикатом write, входящем в правило. Т.о. получим:
ola - родитель sasha