- •Глава 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
- •Библиографический список
- •Оглавление
3. Структурные диаграммы
Диаграммы — средство анализа и наглядного представления составных структур. На рис. 3.1 показана доменная структурная диаграмма (ДСД) программы 3.1.
рис 3.1
Имя домена здесь personal_library, имя структуры — book. Структура содержит четыре объекта: title, author, publisher и year.
рис 3.2
Отметим, что ДСД является компонентой ПСД. book здесь является функтором. Как видно из рисунка, ПСД программы содержит 2 уровня.
Эти диаграммы хорошо демонстрируют организацию доменов и предикатов. ДСД и ПСД являются удобным средством при разработке и документировании программ Турбо-Пролога. Они также могут оказать помощь при написании эффективных правил.
Разработка доменных и предикатных структур облегчит пользование базой данных. Чем больше функторов, тем более определенные запросы можно адресовать базе данных, а именно такие запросы представляют наибольший интерес.
4. Использование в запросах анонимных переменных
/* Программа 3.1 «Библиотека». Назначение: */
/* демонстрация одноуровневого */
/* составного объекта */
domains
/* персональная библиотека = книга (название, автор, издательство,год издания) */
personal_library = book(title, author,
publisher, year)
name, title, author, publisher = symbol
year = integer
predicates
/* коллекция (имя коллекционера, библиотека) */
collection(name,personal_library)
clauses
collection(kahn, book("The Computer and the Brain", "von Neumann", "Yale University Press",1958)).
collection(kahn, book("Symbolic Logic", "Lewis Carroll", "Dower Publications", 1958)).
collection(johnson, book("Database: A Primer", "C.J.Date", "Addison-Wesley", 1983)).
collection(johnson, book("Problem-Solving Methods in AI", "Nils Nilsson", "McGraw Hill", 1971)).
collection(smith, book("Alice in Wonderland", "Lewis Carroll", "The New American Library", 1960)).
collection(smith, book("Fables of Aesop", "Aesop-Calder", "Dover Publications", 1967)).
/* Конец программы */
Данная программа использует внешнюю цель. Для того, чтобы узнать, какие книги принадлежат Смиту, необходимо ввести такое целевое утверждение:
collection(smith,Books).
Предположим теперь, что мы хотим знать имена владельцев и названия книг, напечатанных в 1967 году. Цель для поиска этой информации выглядит следующим образом:
collection(Collector,book(Title,_,_,1967)).
Здесь свободными переменными являются уже Collector и Title. Подчерки (_) указывают на то, что нас не интересуют объекты с типами author и publisher.
Задайте вопрос:
как зовут коллекционера, которому принадлежит книга «Database.A Primer."?
collection(Collector,book("Database:A Primer", _,_,_)).
Каковы названия книг, опубликованных после 1980 года?
collection(_,book(Title,_,_,Year)), Year > 1980.
5. Использование альтернативных доменов
Представление данных часто требует наличия большого числа структур, и все они должны быть описаны. Чтобы один и тот же предикат мог работать с объектами разных типов, Турбо-Пролог предлагает альтернативные описания доменов. Программа 3.2 «Предметы» использует эти альтернативные описания:
/* Программа 3.2 «Коллекция». Назначение: */
/* демонстрация использования конструкций */
/* альтернативных доменов. */
domains
thing = book(author,title) ;
record(artist,album,type)
name, author, title, artist, album = symbol
predicates
owns(name, thing)
clauses
owns("Bill", book("J.R.R. Tolkein", "Return of the Ring")).
owns("Bill", record("Elton John", "Ice Fair")).
/* Конец программы */
Для разделения альтернативных доменов здесь применена точка с запятой (;). Использование альтернативных доменов позволяет писать в утверждениях предикат owns применительно к различным классам вещей. В отсутствие этой конструкции требовалось бы ввести два разных предиката owns.
Упражнение 3.1.
Сформулируйте сокращенные внутренние запросы
1) перечислить названия всех книг;
show_books :-
2) перечислить все записии и их владельцев;
show_records :-
3) перечислить все предметы коллекции одного владельца, используя только предикат owns.