- •Глава 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
- •Библиографический список
- •Оглавление
5. Применение списков в программе
Для того чтобы использовать в программе список, необходимо описать предикат списка. Ниже приведены примеры таких предикатов:
num([1,2,3,6,9,3,4])
time(["YESTERDAY","TODAY","TOMORROW"])
В этих выражениях num и time представляют предикаты списков. Предикатам списков обычно присваиваются имена, которые характеризуют либо тип элемента (num), либо сами данные (time).
Введение списков в программу с необходимостью отражается на трех ее разделах. Домен списка должен быть описан в разделе domains, а работающий со списком предикат — в разделе predicates. Наконец, нужно ввести сам список; то есть, другими словами, его нужно задать где-то в программе: либо в разделе clauses, либо в разделе goal.
Покажем, как можно создавать в программе списки и как их использовать.
animals(["monkey","piton","lion","white eagle"])
Если этот список необходимо использовать в программе, то следует описать домен элемента списка; ему логично присвоить имя подобное name_animals.
Отличительной особенностью описания списка является наличие звездочки (*) после имени домена элементов. Так запись
name_animals *
следует понимать как список, состоящий из элементов домена name_animals.
Описание в разделе domains, следовательно, может выглядеть либо как
animals_list = name_animals *
name_animals = symbol
либо как
animals_list = symbol *
Домен animals_list является доменом списка элементов типа symbol.
В разделе описания предикатов predicates требуется присутствия имени предиката, а за ним заключенного в круглые скобки имени домена.
animals(animals_list)
Как видим, описание предиката списка ни в чем не отличается от описания обычного предиката. Сам список присутствует в разделе утверждений
clauses
animals(["monkey","piton","lion","white eagle"]).
Пример использования списков приведен в программе 6.1 «Списки», в которую дополнительно включены два списка из целых чисел (домен integer*) и предикат num.
/* Программа 6.1 «Списки». Назначение: */
/* демонстрация работы со списками. */
domains
animals_list = name_animals *
name_animals = symbol
predicates
animals(animals_list)
num(integer *)
goal
L=[6,7,8],write(L),nl,
animals(L1),write(L1),nl,
num(L2),write(L2).
clauses
animals(["monkey","piton","lion","white eagle"]).
num[1,2,3,4]).
/* Конец программы */
Упражнение 6.1.
Адресуйте программе следующие внешние запросы:
animals(All).
animals([_,_,B,_]).
animals([B1,B2,_,_]).
num(All).
num([F,S,T,A]).
Поясним теперь работу программы при задании каждой из этих целей, это прояснит способ работы со списками в программах на Турбо-Прологе.
Заметим, что свободная переменная All представляет весь список в целом. Он рассматривается при этом как некое целое, элементы играют роль частей этого целого.
Что касается второй цели, animals([_,_,B,_]), то процесс сопоставления начинается с первого элемента. Первые три переменные в целевом утверждении являются анонимными,переменной B присваивается значение lion.
Третья цель, animals([B1,B2,_,_]), запрашивает первые два элемента списка. На выходе можно будет увидеть B1=monkey, B2=piton, т.е. значения первого и второго элементов списка.