
- •1.1 Пример программы: родственные отношения.
- •1.2 Факты.
- •1.3 Вопросы.
- •1.4 Переменные.
- •1.5 Конъюнкция целей.
- •1.6 Правила.
- •1.7 Конъюнкция в правилах.
- •1.8 Переменные в теле правила.
- •1.9 Cтруктура пролог-программы.
- •2.1 Синтаксис пролога.
- •2.1.1 Константы.
- •2.1.2 Переменные.
- •2.1.3 Структуры.
- •2.1.4 Операторы - тоже функторы.
- •2.2 Арифметика.
- •2.3 Операции сравнения.
- •2.4 Сопоставление.
- •2.6 Примеры сопоставления структур.
- •3.1 Декларативная семантика Пролог-программ
- •3.2 Дизъюнкция целей
- •3.3 Процедурная семантика
- •3.3.1 Пример вычисления
- •3.3.2 Формальное описание процедуры вычисления целей.
- •3.4 Соотношение между процедурным и декларативным смыслом
- •4.1 Списки
- •4.1.1 Представление списка диаграммой.
- •4.1.2 Выделение головы и хвоста списка
- •4.1.3 Шаблоны списков.
- •4.1.4 Определения отношений через cons форму списка
- •4.1.4 Определения отношений через cons форму списка
- •4.2 Процедуры обработки списков
- •4.2.3 Применение append
- •4.2.5 Длина списка
- •4.3 Встроенные предикаты
- •4.3.1 Простые встроенные предикаты ввода-вывода.
- •4.3.2 Процедурный смысл встроенных предикатов ввода-вывода.
- •4.4 Ввод-вывод списков.
- •4.4.1 Ввод-вывод списка как терма.
- •4.4.2 Поэлементный ввод-вывод списка.
- •5.1 Отсечение.
- •5.1.1 Графическая иллюстрация действия cut.
- •5.1.2 Пример действия cut.
- •5.1.3 Применение cut при выборе альтернатив.
- •5.1.4 Формальное описание действия отсечения.
- •5.2 Применение отсечения.
- •5.2.2 Добавление элемента без дублирования.
- •5.2.3 Классификация.
- •5.2.4 Отсечение в численной рекурсии.
- •5.2.5 Замечания при использовании отсечения.
- •5.3 Сортировка списков.
- •5.3.1 Метод наивной сортировки.
- •5.3.2 Метод пузырька.
- •5.3.3 Mетод вставки.
- •5.3.4 Быстрая сортировка quick.
- •6.1 Отрицание как неудача. (not as failure)
- •6.2 Алгоритм поиска на Прологе. ( Логический подход к задаче о фермере, волке, козе и капусте.)
- •6.3 Чтение и запись информации с файлов.
- •6.3.1 Обработка входных потоков.
- •6.3.2 Обработка выходных потоков.
- •6.4 Обработка символов.
- •7.1 Встроенные предикаты
- •7.1.2 Проверка типа терма
- •7.2 Метапредикаты.(Встроенные предикаты обработки термов.)
- •7.2.1 Создание и декомпозиция термов.
- •7.2.2 Предикаты работы с базой данных
- •7.3 Поиск в лабиринте
- •7.4 Сравнительная характеристика языков программирования.
- •8.1. Операции (Операторы).
- •8.1.1 Приоритет оператора.
- •8.1.2. Тип оператора.
- •8.1.3 Объявление операций.
- •8.2. Поиск.
- •8.2. Поиск.
- •8.2.1 Поиск в Прологе.
- •8.2.2 Поиск в глубину.
- •8.2.3 Поиск в ширину.
- •8.2.4 Резюме Поиска.
- •9.1. Введение
- •9.2 Поиск с предпрочтением.
- •10.1. Постановка задачи
- •10.2. Пример грамматики
- •10.3. Пример разбора вручную.
- •10.4. Реализация грамматического разбора на Прологе.
- •Как должны выглядеть утверждения Пролога ?
- •Запоминание состояния в Прологе.
- •Аналогично для dcg проводится
- •11.1. Постановка задачи
- •Две емкости
- •11.2. Решение задачи
- •12.1. Постановка задачи
- •12.2. Решение
- •13.1. Введение
- •Метод "образовать и проверить"
- •13.2. Раскрашивание плоской карты
5.1.3 Применение cut при выборе альтернатив.
Рассмотрим функцию Y(X):
/ ? 0 , X < 3 ? Y= < 2 , 3 = < X < 6 ? ? 4 , X >= 6 \
|
|
|
|
|
|
На прологе это запишется через бинарное отношение f(X, Y).
Процедура выглядит:
|
f(X, 0):- X < 3. f(X, 2):- 3 =< X, X < 6. f(X, 4):- 6 =< X. |
Зададим вопрос:
|
?-f(1,Y),Y>2. |
|
|
|
|
Таким образом последовательно проверяются все три предложения, хотя сразу ясно, что выполняется только одно. Как убрать неэффективность? Надо использовать отсечение-cut. Перепишем
|
f( X, 0):-X<3, !. f(X, 2):- 3=<X, X<6, !. f(X, 4):-6 =<X, !. |
! указывает, что возврат из этой точки проводить не надо.
Что произойдет теперь? Для цели
|
?-f(1, Y), Y>2. no |
|
|
|
|
После выполнения цели X<3 цель Y>2, не достигается, но откат не может произойти, так как стоит cut.
Таким образом сокращается перебор.
Аналогично для цели
|
?-f(5, Y), Y=0. |
|
|
|
|
Здесь введение cut повышает эффективность программы, сокращая время перебора и объем памяти, не влияет на декларативное чтение программы.
После изъятия ! декларативный смысл не изменится.
Такое применение cut называют "зеленым отсечением".
"Зеленые отсечения" лишь отбрасывают те пути вычисления, которые не приводят к новым решениям.
Бывают и "красные отсечения", при изъятии которых меняется декларативный смысл программы.
5.1.4 Формальное описание действия отсечения.
Рассмотрим предложение
Н:-B1, B2,..., Bm, !,..., Bn.
Это предложение активизируется, когда некоторая цель G, будет сопоставляться с H.
Тогда G называют целью-родителем.
Если B1, B2,..., Bm выполнены, а после !, например в Bi, i>m, произошла неудача и требуется выбрать альтернативные варианты, то для B1, B2,..., Bm такие альтернативы больше не рассматриваются и все выполнение окончится неудачей. Кроме этого G будет связана с головой H, и другие предложения процедуры во внимание не принимаются.
Т.е. отсечение в теле предложения отбрасывает все предложения , расположенные после этого предложения.
Формально действие отсечения описывается так:
Пусть цель -родитель сопоставляется с головой предложения, в теле которого содержится отсечение.
Когда при просмотре целей тела предложения встречается в качестве цели отсечение, то такая цель считается успешной и все альтернативы принятым решениям до отсечения отбрасываются и любая попытка найти новые альтернативы на промежутке между целью-родителем и сut оканчиваются неудачей. Процесс поиска возвращается к последнему выбору, сделанному перед сопоставлением цели родителя.
5.2 Применение отсечения.
5.2.1 minimum(X, Y, M).
Найти минимальный элемент из двух.
|
minimum(X, Y, X):- X<=Y, !. minimum(X, Y, Y):- Y<X, !. |
|
?-minimum(2, 5, Y). |
|
|
|
|