
- •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.3.2 Метод пузырька.
Это простой и эффективный метод.
Декларативное описание:
Найти в списке L два смежных элемента X и Y, таких, что X > Y, поменять их местами и получить новый список, M, затем отсортировать M. Для поиска таких элементов и перестановки используется процедура swap/2.
Если в списке нет не одной пары смежных элемента X и Y, таких, что X > Y, считать что список отсортирован.
|
busort(L, S) :- swap(L, M), !, busort(M, S). busort(L, L) :- !. swap([X, Y|R], [Y, X|R]) :- order(Y, X). swap([X|R], [X|R1]) :- swap(R, R1). |
5.3.3 Mетод вставки.
Декларативное описание:
Для того чтобы упорядочить непустой список L=[X|T] необходимо:
Упорядочить хвост Т списка L
Вставить голову X списка L в упорядоченный хвост, поместив ее таким образом, чтобы получившийся список остался упорядоченным.
|
insort([], []). insort([X|L], M) :- insort(L, N), insortx(X, N, M). insortx(X, [A|L], [A|M]) :- order(A, X), !, insortx(X, L, M). insortx(X, L, [X|L]). order(X, Y) :- X =< Y. |
5.3.4 Быстрая сортировка quick.
Описание метода:
Убираем первый элемент:
5 3 7 8 1 4 7 6
получаем: X =5. и оставшийся список:
3 7 8 1 4 7 6
Разбиваем новый список на два, помещая в первый элементы меньше X, а во второй - больше X:
( X: 3 1 4 ) X: 7 8 7 6
Сортируем оба списка:
1 3 4 6 7 7 8
Соединим первый список, X, второй список.
1 3 4 5 6 7 7 8
Декларативное описание:
Удалить из списка голову Х и разбить оставшийся список на два списка Small и Big следующим образом: все элементы большие чем Х помещаются в Big и меньшие X - в Small.
Отсортировать список Small в Small1.
Отсортировать список Big в Big1.
Соединить списки Small1 Х и Big1.
|
qsort([], []). qsort([H|Tail], S) :- split(H, Tail, Small, Big), qsort(Small, Small1), qsort(Big, Big1), append(Small1, [H|Big1], S).
order(X, Y) :- X =< Y. split(H, [A|Tail], [A|Small], Big) :- order(A, H), !, split(H, Tail, Small, Big). split(H, [A|Tail], Small, [A|Big]) :- split(H, Tail, Small, Big). split(_, [], [], []). |
6.1 Отрицание как неудача. (not as failure)
Рассмотрим сначала пример.
|
Пусть некоторая Мэри любит всех животных. Это записывается: likes(mary,X):-annimal(X). |
|
|
|
|
Мэри не любит змей: likes(mary,X):-snake(X),!,fail. fail - специальная цель, встроенный предикат, который всегда терпит неудачу. |
|
|
|
Графически предикат изображается:
|
Можно записать в виде одного правила, используя дизъюнкцию целей. likes(mary,X):-snake(X),!,fail; annimal(X). |
|
|
Посмотрим другой пример.
Отношение different(X,Y) будет истина,если X и Y различны. (не сопоставимы).
|
different(X,X):-!,fail. или different(X,Y):-X=Y,!,fail. different(X,Y). |
|
|
|
|
Если X и Y сопоставимы, то цель different терпит неудачу. Иначе X и Y различны, и цель different успешна.
Или в одном предложении
different(X,Y):-X=Y,!,fail;true.
Здесь true - встроенный педикат, который всегда истина.
И в том и другом случае более удобно указывать, что отношение истинно, если цель ложна. Для этой цели используется предикат not.
not(Goal). -истина, если Goal -ложь, и наоборот not(Goal) ложно, если Goal успешна. Это можно записать:
not(Goal):-Goal,!,fail;true.
Запись аналогична сделанным, поэтому наши примеры можно переписать:
likes(mary,X):-annimal(X),not(snake(X)). или different(X,Y):-not(X=Y).
! |
Использование not требует осторожности, т.к. определяется через отсечение. |
|
|
Рассмотрим пример:
r(a). g(b). p(X):-not(r(X)).
|
?-g(X),p(X). yes ?-p(X),g(X). no. |