- •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. Раскрашивание плоской карты
Запоминание состояния в Прологе.
Иногда надо некоторое значение передавать от одного предиката к другому в ходе вычислений.
Передача может быть :
immutable (неизменной)
mutable (переменной)
immutable G(.. , S, ..):- g(.. , S, ..), .. h(.. , S, ..).
mutable добавляется пара: "старое значение, новое значение" иногда называют : "аккомулирующие пары"
G(.. , S0,Sn):-
g(.. , S0,S1),
...
h(.. , Sm,Sn).
Length([],L,L).
Length([_|List],L0,L):-
L1 is L0+1,
Length(List,L1,L).
Аналогично для dcg проводится
Для одной цели
P(X)-->G(X).
P(X,S0,S):-G(X,S0,S).
Для нескольких целей
P(X,Y)-->G(X),
R(X,Y),
S(Y).
P(X,Y,S0,S):-G(X,S0,S1),
R(X,Y,S1,S2),
S(Y,S2,S).
Грамматическое правило, которое раскрывает нетерминальный символ, заменяя его на другие нетерминальные символы, преобразуется в правило Пролога, заголовок которого соответствует левой части грамматического правила, а тело состоит из символов правой части, представляющий собой соединенные подцели.
При этом каждый предикат дополняется двумя аргументами. Первый аргумент заголовка правила представляет анализируемую цепочку. Он передается в качестве первого аргумента первой подцели.
В каждой подцели первый аргумент представляет цепочку, оставленную неразобранной предыдущими подцелями, а второй аргумент - остаток этой цепочки после ее разбора данным компонентом.
Например правую
noun_phrase(N) -> article(N), noun(N).
Заменяет на
noun_phrase(N,S0,S2) -> article(N,S0,S1), noun(N,S1,S2).
Подвергаемая грамматическому разбору цепочка слов, а также та цепочка, которая остается после разбора, представляются в виде списков.
Интерпретация рассмотренного правила такова :
Список S0 начинается с noun_phrase(N), а S2 это то что остается от S0 после удаления из него noun_phrase(N), если :
Cписок S0 начинается с article(N), а список S1 - это то, что остается от S0 после удаления артикля,
Cписок S1 начинается с noun(N), а список S2 - это то, что остается от S1 после удаления noun(N).
Грамматическое правило, которое раскрывает символ, заменяя его на терминальный символ, преобразуется в правило Пролога, тело которого представляет собой вызов встроенного предиката 'C', имеющего следующее определение : 'C'/3 Цель успешно согласуется, если ее первый аргумент - список, а второй - голова этого списка, а третий - его хвост.
article(singular):-'c'(s0,the,s1)
Пример преобразования грамматического правила DCG:
p-- > q, [r], t, [u]. p(s0,s4):-q(s0,s1), 'c'(s1,r,s2),t(s2,s3),'c'(s3,u,s4).
11.1. Постановка задачи
Задача о кувшинах воды состоит в следующем:
В кувшин А вмещается 5 литров, а в кувшин B входит 2 литра.
При старте 5-литровый кувшин полный, вы можете лить воду
из одного кувшина в другой или на землю, полностью наполнять
кувшины водой. Это делается до тех пор пока
вы не уверены, что кувшин B содержит ровно 1 литр.
