- •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. Раскрашивание плоской карты
4.2.3 Применение append
Процедуру арреnd можно использовать для поиска комбинаций элементов. Например можно выделить списки слева и справа от элемента
|
?-append(L, [3|R], [1, 2, 3, 4, 5]). L=[1, 2] R=[4, 5] |
|
|
|
|
Можно удалить все, что следует за данным элементом и этот элемент тоже:
|
?-L1=[a, b, c, d, e], append(L2, [c|_], L1). L1=[a, b, c, d, e] L2=[a, b] |
|
|
|
|
Можно определить процедуру ,выделяющую последний элемент в списке:
|
last(X, L):-append(_, [X], L). |
4.2.4 reverse
Процедура reverse обращает список.
Пустой список после обращения - пустой.
reverse([], []).
Обратить список [X|L1] и получить список L2 можно, если обратить список L1 в L3 и в хвост ему добавить X
reverse([X|L1], L2):-reverse(L1, L3), append( L3, [X], L2).
reverse([X|L1], L2):-reverse(L1, L3), append( L3, [X], L2).
4.2.5 Длина списка
Можно, используя рекурсивный вызов, легко посчитать длину списка:
|
length([], 0). length([X|L], N):-length(L, M), N is M+1. |
|
?-length([a, b, c], N). N=3 |
|
|
|
|
4.2.6 remove
Удаление элемента X из списка L можно запрограммированть в виде отношения remove(X, L, L1). где L1 совпадает со списком L, у которого удален элемент X. Имеем два случая:
Если X является головой списка, тогда результатом удаления будет хвост этого списка.
Если X находится в хвосте списка, тогда его нужно удалить оттуда.
|
remove(X, [X | Tail], Tail). remove(X, [Y | Tail], [Y | Tail1]):-remove(X, Tail, Tail1). |
Отношение remove по природе своей недетерминировано. Если в списке встречается несколько вхождений элемента X, то remove сможет исключить их все при помощи возвратов. Конечно, вычисление по каждой альтернативе будет удалять лишь одно вхождение X, оставляя остальные в неприкосновенности. Например:
|
?-remove(a, [a, b, a, a], L). L = [b,a,a]; L = [a,b,a]; L = [a,b,a]; no |
|
|
|
|
При попытке исключить элемент, не содержащийся в списке, отношение remove потерпит неудачу.
Отношение remove можно использовать в обратном направлении для того, чтобы добавлять элементы в список, вставляя их в произвольные места. Например, если мы хотим во все возможные места списка [1,2,3] вставить атом a, то мы можем это сделать, задав вопрос: "Каким должен быть список L, чтобы после удаления из него элемента a получился список [1,2,3]?"
|
?-remove(a, L, [1,2,3]). L = [a,1,2,3]; L = [1,a,2,3]; L = [1,2,a,3]; L = [1,2,3,a]; no |
|
|
|
|
