
- •Глава 1. Введение в пролог
- •1. Декларативные и процедурные языки программирования
- •2. Пролог и логика предикатов. Внешние цели
- •3. Управление программой. Подцели. Механизм сопоставления
- •4. Внутренние подпрограммы унификации
- •Глава 2. Внутренние цели. Механизм возврата
- •1. Структура пролог-программы
- •2. Использование внутренних целей
- •3. Встроенный предикат fail
- •4. Сокращенные варианты внутренних запросов
- •5. Использование в запросах анонимных переменных
- •6. Механизм возврата
- •Глава 3. Типы данных и арифметика Turbo Prolog
- •1. Стандартные типы данных
- •2. Структуры, простые и составные
- •3. Структурные диаграммы
- •4. Использование в запросах анонимных переменных
- •5. Использование альтернативных доменов
- •6. Арифметика в Turbo Prolog
- •Глава 4. Предикат отсечения (!). Программирование альтернатив. Правила повтора
- •1. Повторения и возвраты
- •2. Отсечение (!)
- •3. Программирование альтернатив
- •4. Правило повтора
- •Глава 5. Методы организации рекурсии
- •1. Простая рекурсия
- •2. Метод обобщенного правила рекурсии
- •3. Граничное условие рекурсии. Нисходящая и восходящая рекурсии
- •4. Программа о подсчете числа точек
- •Глава 6. Списки
- •1. Основные понятия
- •2. Списки и турбо-пролог
- •3. Атрибуты списка
- •4. Внутреннее представление списков
- •5. Применение списков в программе
- •6. Метод разделения списка на голову и хвост
- •7. Поиск элемента в списке
- •8. Присоединение списка
- •9. Добавление и удаление элемента
- •10. Подсписок
- •11. Перестановки списка
- •Глава 7. Сортировка списков
- •1. Разделение списка на два
- •2. Сортировка списков методом вставки
- •3. Быстрая сортировка
- •4. Быстрая сортировка_1
- •5. Компоновка данных в список
- •Глава 8. Программирование алгоритмов с возвратом. Представление графов в turbo prolog
- •1. Задача о весах
- •2. Представление графов в turbo prolog
- •3. Поиск пути на неориентированном графе
- •4. Поиск гамильтоновых циклов
- •5. Поиск пути минимальной стоимости
- •Глава 9. Динамическая база данных
- •1. Турбо-пролог и реляционные базы данных
- •2. Описание предикатов динамических бд
- •3. Встроенные предикаты asserta, assertz, retract, retractall, save, consult
- •4. Создание динамической базы данных
- •5. Обсуждение проекта базы данных
- •6. Создание базы данных
- •7. Написание программных модулей
- •Глава 10. Глобальные переменные в turbo prolog
- •1. Модификация базы данных
- •2. Накопление результатов с помощью вынуждаемого возврата
- •3. Подсчет членов парторганизации
- •4. Поиск пути минимальной стоимости от a до z
- •Библиографический список
- •Оглавление
2. Сортировка списков методом вставки
Сортировка представляет собой переупорядочивание элементов списка определенным образом. Гораздо проще и гораздо эффективнее искать что-либо в отсортированном списке, нежели в неотсортированном.
Существует много способов сортировки списков. Сортирующее правило Турбо-Пролога принимает на вход неотсортированный список, и выдает отсортированный на выходе. Входной список называется ИСХОДНЫМ, выходной — ЦЕЛЕВЫМ.
Метод вставки особенно удобен для реализации его на Турбо-Прологе.
Идея этой сортировки следующая:
1. Извлекаем из списка голову H.
2. Методом вставки сортируем хвост.
3. Вносим H в подходящее место отсортированного хвоста.
Опишем предикат, производящий сортировку списка методом вставки
insert_sort(Source_list,Target_list)
Внешней целью в задаче сортировки списка [4,7,3,9] будет утверждение
insert_sort([4,7,3,9],S)
В этом утверждении отсортированный список обозначен переменной S. Правила, реализующие этот способ сортировки, имеют следующую структуру:
insert_sort([],[]).
insert_sort([H|T],Sorted_list) :-
insert_sort(T,Sorted_Tail),
insert(H,Sorted_Tail,Sorted_list).
insert(X,[H|Sorted_list],[H|Sorted_list1]) :-
X > H,!,
insert(X,Sorted_list,Sorted_list1).
insert(X,Sorted_list,[X|Sorted_list]).
Дальнейшее обсуждение продемонстрирует работу правил на примере списка [4,7,3,9].
Вначале Турбо-Пролог применяет приведенные правила к исходному списку, выходной список в этот момент еше не определен.
insert_sort([4,7,3,9],_)
Первая попытка удовлетворить правило insert_sort осуществляется с первым вариантом правила
insert_sort([],[])
Для удовлетворения правила оба списка должны быть пустыми.
Согласно второму варианту правила внутренние унификационные процедуры Турбо-Пролога пытаются сделать пустым исходный список. Рекурсия убирает элементы исходного списка, начиная с головы, и переносит их в стек. В результате применения этой процедуры список становится нулевым. Теперь первый вариант правила insert_sort производит обнуление выходного списка.
Далее, первое взятое из стека значение (9), вносится во второй список:
insert(9,[],[9])
Из стека извлекается следующий элемент (3), и при помощи второго варианта insert вставляется в выходной список слева от 9:
insert(3,[9],[3,9])
Происходит возврат к insert_sort, теперь оно имеет форму
insert_sort([3,9],[3,9])
Таким образом, все элементы извлекаются из стека и помещаются в выходной список.
/* Программа 7.2. Назначение: */
/* демонстрация сортировки списка */
/* в порядке возрастания методом вставки */
domains
list = integer *
predicates
insert_sort(list,list)
insert(integer,list,list)
clauses
insert_sort([],[]).
insert_sort([H|T,Sorted_list) :-
insert_sort(T,Sorted_Tail),
insert(H,Sorted_Tail,Sorted_list).
insert(X,[H|Sorted_list],[H|Sorted_list1]) :-
X > H, !,
insert(X,Sorted_list,Sorted_list1).
insert(X,Sorted_list,[X|Sorted_list]).
/* Конец программы */
3. Быстрая сортировка
Идея быстрой сортировки следующая:
1. Убрать голову H.
2. С помощью процедуры div1 разбить список на два:
— меньший либо равный H (Small)
— больший H (Big)
3. Методом быстрой сортировки отсортировать списки Small и Big.
4. Соединить списки Small_sort и [H|Big_sort] с помощью процедуры conc.
Опишем предикат, производящий сортировку списка методом быстрой сортировки:
supersort(list,list)
Правила, реализующие этот способ сортировки, имеют следующую структуру:
supersort([],[]).
supersort([H|T],Sorted_list) :-
div1(H,T, Small,Big),
supersort(Small,Small_sort),
supersort(Big,Big_sort),
conc(Small_sort,[H|Big_sort],Sorted_list).
Процедуры conc и div1 уже были описаны ранее.