
- •Глава 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
- •Библиографический список
- •Оглавление
Глава 6. Списки
1. Основные понятия
СПИСОК — это простая структура данных, широко используемая в нечисловом программировании.
Список — упорядоченный набор объектов, следующих друг за другом. В отличие от множества, для списка важен порядок его элементов, которые могут повторяться. Составляющие списка внутренне связаны между собой, поэтому с ними можно работать и как с группой (списком в целом), так и как с индивидуальными объектами (элементами списка).
Турбо-Пролог позволяет выполнять со списком целый ряд операций. Их перечень включает:
— доступ к объектам списка,
— проверка на принадлежность к списку,
— добавление и удаление элемента,
— выделение подсписка,
— слияние двух списков,
— разделение списка на два,
— сортировку элементов списка.
Списки бывают удобны при создании баз знаний (баз данных), экспертных систем, словарей.
2. Списки и турбо-пролог
Список является набором объектов ОДНОГО И ТОГО ЖЕ ДОМЕННОГО ТИПА. Объектами списка могут быть целые числа, действительные числа, символы, символьные строки и структуры.
Порядок расположения элементов является отличительной чертой списка; те же самые элементы, упорядоченные иным способом, представлеют уже совсем другой список. Порядок играет важную роль в процессе сопоставления.
Турбо-Пролог допускает списки, ЭЛЕМЕНТАМИ КОТОРЫХ ЯВЛЯЮТСЯ СТРУКТУРЫ. Если структуры принадлежат к альтернативному домену, элементы списка могут иметь разный тип. Такие списки используются для специальных целей, и их мы пока рассматривать не будем.
Совокупность элементов списка заключается в квадратные скобки ([]), а друг от друга элементы отделяются запятыми.
Примерами списков могут служить:
[1,2,3,6,9,3,4]
["YESTERDAY","TODAY","TOMORROW"]
Элементами первого списка являются целые числа, элементами третьего — символьные строки.
3. Атрибуты списка
Объекты списка называются элементами списка. Список может содержать произвольное число элементов, единственным ограничением является лишь объем оперативной памяти.
Количество элементов в списке называется его длиной.
Список может содержать всего один элемент и даже не содержать элементов вовсе:
["summer"] []
Список, не содержащий элементов, называется ПУСТЫМ или нулевым списком.
Непустой список можно рассматривать как состоящий из двух частей:
(1) первый элемент списка — его ГОЛОВА,
(2) остальная часть списка — ХВОСТ.
Голова является элементом списка, хвост есть список сам по себе. Голова — это отдельное неделимое значение. Наоборот, хвост представляет собой список, составленный из того, что осталось от исходного списка в результате «усекновения головы».
В списке [4,3,6,100], например, головой является значение 4, а хвостом — список [3,6,100].
Этот новый список можно делить и дальше. Если список состоит из одного элемента, то его можно разделить на голову, которой будет этот самый единственный элемент, и хвост, являющийся пустым списком.
У пустого списка голова и хвост не определены.
4. Внутреннее представление списков
Рассмотрим следующее утверждение:
number([66,84,12,32]).
Объектом предиката number является четырехэлементный список. Голова этого списка есть число 66, хвост — список [84,12,32]. Нумерация списка начинается с головы и заканчивается на его последнем элементе, числе 32.
Внутренним Турбо-Прологовским представлением этого списка является бинарное дерево (рис 6.1).
рис. 6.1
Функтор списка, number, является корнем этого дерева. От корня отходят две ветви. Левая заканчивается листом со значением 66. Правая ветвь кончается узлом, из которого расходятся еще две ветви. Левая кончается значением 84, правая опять разветвляется на две ветви. На левой из них располагается лист со значением 12, правая ветвится еще раз. Левая из этих ветвей ведет к листу со значением 32, правая заканчивается пустым списком.
Очередность, в которой элементы связаны друг с другом, начинается с корня дерева. Лист самой левой ветви дает первый элемент списка. Затем очередность при посредстве узла правой ветви переходит на следующую левую ветвь, на ее листе находится второй элемент списка, 84. Аналогично нумеруются и все остальные элементы вплоть до последнего, 32. Так как больше неупорядоченных элементов не остается, то дерево оканчивается ветвью с пустым списком.
Изображение в виде бинарного дерева бывает особенно полезным для нагядной интерпретации процесса возврата в виде направленного перебора ветвей дерева.
Упражнение 6.1.
1. Различаются ли с точки зрения Турбо-Пролога два таких списка:
[63,29,24,27,86]
[63,24,29,27,86]
2. Можно ли назвать корректным следующий список:
student([”МГМА”,"Смирнов",”2204”,1995])