
- •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.2.2 Добавление элемента без дублирования.
Чтобы добавить элемент в голову списка достаточно использовать
add(X, L, [X|L]).
Но если возникает необходимость добавлять только, если элемент отсутствует, то можно добавить правило:
|
add(X, L, L):-member(X, L), !. add(X, L, [X|L]). |
Вопрос
|
?-add(a, [b, c], L). L=[a, b, c] ?-add(b, [b, c], L). L=[b, c] |
|
|
|
|
Если сечение убрать, то
|
?-add(b, [b, c], L) L=[b, c]; L=[b, b, c] |
|
|
|
|
Таким образом, при изъятии отсечения, изменился декларативный смысл программы - отсечение "красное".
5.2.3 Классификация.
Используя отсечение, легко произвести классификацию объектов.
Например, надо классифицировать числа
|
class(X, plus):-X>0, !. class(X, minus):-X<0, !. class(X, zero):-X=0, !. |
|
?-class(4, Y). Y=plus |
5.2.4 Отсечение в численной рекурсии.
Применение отсечения в рекурсии позволяет значительно сократить использование памяти.
Определим факториал
|
factorial(0, 1):-!. factorial(N, RES) :- N1 is N-1, factorial(N1, N1fak), Res is N*N1fak. |
5.2.5 Замечания при использовании отсечения.
Применение сечения за счет сокращения перебора позволяет повысить эффективность программы. Кроме этого отсечение упрощает программирование выбора вариантов.
Вместе с тем, часто, при использовании красных отсечений может изменится декларативный смысл программы.
Поэтому отсечение требует осторожности в использовании.
Следует избегать двух ошибок:
отсечения путей вычисления, которые нельзя отбрасывать
и не отсечения тех решений, которые должны были быть отброшены.
5.3 Сортировка списков.
До сих пор средства пролога использовались при записи простых процедур и примеров. Рассмотрим более сложные примеры написания программ на прологе для различных методов сортировки:
Метод наивной сортировки
Метод пузырька
Метод вставки
Быстрая сортировка quick
5.3.1 Метод наивной сортировки.
В этом методе элементы в списке переставляются ( перемешиваются permutation/2 ),и проверяется отсортирован этот список или нет: sorted/1. Это записывается:
|
sortn(L1, L2) :- permutation(L1, L2), sorted(L2), !. |
Перестановки определим через append
|
permutation(L, [H|T]) :- append(V, [H|U], L), append(V, U, W), permutation(W, T). permutation([], []). |
Проверка того, что элементы списка расположены в возрастающем порядке выражается через два предложения. Факт означает, что список из одного элемента всегда упорядочен. Правило утверждает, что список упорядочен ,если первые два элемента расположены по порядку и остаток ,начинающийся со второго элемента тоже упорядочен:
|
sorted([L]). sorted([X,Y|T]) :- order(X,Y), sorted([Y|T]). order(X, Y) :- X =< Y. |