- •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. Раскрашивание плоской карты
7.3 Поиск в лабиринте
Рассмотрим следующую задачу: Существует дом с комнатами b,c,d,e,f,g. Между некоторыми комнатами есть двери. В одной из комнат (g) находится клад. Требуется пройти через комнаты к кладу.
Запишем информацию о дверях:
|
|
door(a,b). door(b,c). door(b,e). door(d,e). door(d,c). door(e,g). door(e,f). |
Переход из комнаты в комнату производится через предикат:
path(X,Y,T)
X - исходная комната;
Y - конечная комната;
T - список пройденных комнат. Он необходим, чтобы не проходить дважды через одну комнату.
Терминальное условие
path(Y,Y,T)
Т.е. мы находимся в нужной комнате.
Рекурсивное правило перехода:
|
|
path(X,Y,T):-door(X,Z),not(member(Z,T)), path(Z,Y,[Z|T]). |
|
|
|
|
|
Характер рекурсии другой. Один аргумент всегда увеличивается. В этой программе каждая дверь в одну сторону. Чтобы избежать этого, есть два варианта:
добавить к door(b,c) факт door(c,b)
ввести еще одно правило:
|
|
path(X,Y,T):-door(Z,X),not(member(Z,T)), path(Z,Y,[Z|T]). |
|
|
|
|
|
Можно записать, используя
дизъюнкцию
|
|
path(X,Y,T):-(door(Z,X);door(X,Z)), not(member(Z,T)), path(Z,Y,[Z|T]). |
|
|
|
|
|
Поиск пути в комнату f
|
?-path(a,f,[]). |
|
|
|
|
Добавим факт о кладе:
money(g).
Тогда найдем путь к комнате с кладом.
Запрос
|
?-path(a,X,[]), money(X). |
|
||
|
|
|
|
|
Это вопрос типа "создать и проверить" находит достижимые комнаты, а затем проверяет наличие в них клада.
Запрос
|
?-money(X),path(a,X,[]). |
|
||
|
|
|
|
|
Здесь требуется сначала найти комнату, а затем путь к ней.
Интересные задачи:
Как вывести путь T?
Как найти самый короткий путь?
7.4 Сравнительная характеристика языков программирования.
Характеристика |
PASCAL |
LISP |
PROLOG |
тип языка |
процедурный |
функциональный |
логический |
типы данных |
скаляры,структуры |
атомы,списки |
атомы,структуры |
обработка данных |
присвоение, передача по значению, передача по ссылке |
значение функции, передача по значению |
связь переменных через унификацию |
управление программой |
последовательное, ветвление,циклы рекурсия |
вычисление функций, условные вычисления, рекурсии, циклы |
рекурсия, бэктрекинг, ! |
структуры программы |
блоки, процедуры |
функции, LET-блоки |
правила, факты |
действия переменных |
глобальные, локальные |
локальные, свободные, предложение |
область, одно |
транслятор |
компилятор, компилятор |
интерпретатор, компилятор |
интерпретатор |
длина программы |
5 |
3 |
1 |
скорость |
1 |
2 |
5 |
Область |
программы общего назначения |
символная обработка, ИИ |
ЭС, ИИ, прототипы |
