
- •Предисловие
- •Глава 1 Введение в Пролог
- •Глава 2 Синтаксис и унификация
- •2.1. Синтаксис термы
- •Константы
- •Переменные
- •Область действия переменных
- •Сложные термы, или структуры
- •Синтаксис операторов
- •Синтаксис списков
- •Синтаксис строк
- •Утверждения
- •Запросы
- •Ввод программ
- •2.2 Унификация
- •Глава 3 Арифметические выражения
- •3.1. Введение
- •3.2. Арифметические выражения
- •3.3. Арифметические операторы
- •3.4. Вычисление арифметических выражений
- •3.5. Сравнение результатов арифметических выражений
- •Глава 4 Рекурсия
- •4.1. Стратегия «разделяй и властвуй»
- •Пример 4.1.1
- •Фаза разбиения
- •Фаза решения задачи
- •4.2. Восходящая стратегия
- •4.3. Рекурсия и эффективность
- •Пример 4.3.2
- •Глава 5 Структуры данных
- •5.1. Списки списковая форма записи
- •А на запрос
- •Некоторые стандартные целевые утверждения для обработки списков
- •5.2. Бинарные деревья представление бинарных деревьев
- •Бинарное дерево на рис.5.2.1 имеет левое поддерево
- •Представление множеств с помощью бинарных деревьев
- •Будем называть линейным представление такого вида, как на рис.5.2.3, и сбалансированным - такое, как на рис.5.2.2.
- •Левому поддереву соответствует отсортированный список
- •Глава 6 Операторы
- •6.1. Операторы и структуры синтаксис операторов
- •Свойства операторов
- •6.2. Позиция операторов
- •6.3. Приоритет операторов
- •6.4. Ассоциативность операторов
- •6.5. Спецификаторы
- •6.6. Операторы объявления
- •6.7. Пример: вычисление многочленов
- •6.8. Системные операторы
- •Глава 7 Механизм возврата и процедурная семантика
- •7.1. Механизм возврата
- •7.2. Пример: задача поиска пути в лабиринте
- •Целевое утверждение не удается согласовать с первым утверждением
- •Если мы введем
- •Если затем мы введем
- •7.3. Обработка фактов с помощью механизма возврата
- •7.4. Предикат repeat
- •7.5. Декларативная и процедурная семантики
- •Характеристики процедуры
- •7.6. Вопросы эффективности
- •Глава 8 Отсечение
- •8.1. Почему используют отсечение?
- •8.2. Использование отсечения
- •Выдав запрос
- •Обратившись к системе с запросом
- •8.3. Ловушки отсечения
- •Глава 9 Встроенные предикаты
- •9.1. Встроенные предикаты
- •9.2. Обновление базы данных Пролога
- •Добавление и удаление утверждений
- •Считывание утверждений в базу данных
- •Предикаты сохранения и восстановления
- •9.3. Особенности ввода и вывода чтение символов
- •Запись символов
- •Считывание термов Предикаты
- •Запись термов
- •9.4. Обработка файлов
- •Редактирование программ на прологе
- •Распечатка предикатов
- •Глава 10 Модули. Пример разработки системы
- •10.1. Модули
- •Пример 10.1.1
- •10.2. Пример разработки системы: деревья решений
- •Описание дерева решений
- •Разработка системы
- •Целевое утверждение
- •Глава 11 Отладка
- •11.1. Трассировка
- •Включение и выключение механизма трассировки
- •Необязательные параметры трассировки
- •Предикаты трассировки
- •Режимы трассировки
- •11.2. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Редактирование программ на прологе
В большинстве Пролог-систем есть встроенный редактор, позволяющий пользователю вносить изменения в программу во время сеанса работы с Прологом. Если такой возможности нет, необходимо выйти из среды Пролога, отредактировать программу и снова вернуться в Пролог-систему. Обычно для редактирования файла в Прологе используется предикат
edit(F),
где F - имя файла.
После того как файл отредактирован, он автоматически повторно вводится в базу данных Пролога для поддержания ее в актуальном состоянии.
Распечатка предикатов
Для того чтобы проверить, какие утверждения входят в программу, можно воспользоваться следующими предикатами:
listing
Предикат выводит все утверждения, содержащиеся в базе данных Пролога, в стандартный выходной поток.
listing(C)
Если С - атом, то в стандартном выходном потоке печатаются все процедуры с функтором С. Если С - терм, имеющий функтор F арности А, то печатаются только процедуры с функтором F и арностью А.
В результате выполнения предиката
listing(фред/2)
будет напечатан список всех утверждений, головой которых является функтор 'фред', а арность равна двум.
Глава 10 Модули. Пример разработки системы
Создавая систему, мы стремимся скорее завершить работу над ней и в то же время обеспечить достаточную надежность системы и удобство работы с ней пользователя. Достижению этих целей способствует использование модулей, которые поддерживаются в большинстве реализации Пролога. В первом разделе главы рассматриваются основные идеи применения модулей, общие для разных реализации. Затем следует пример разработки системы, демонстрирующий идеи и понятия, введенные в предшествующих главах.
10.1. Модули
Модуль состоит из последовательности фактов, правил и управляющих команд - директив. Начало модуля Х обозначается module(X), а конец - endmodule(X). Говорят, что процедура в модуле Х видима из другого модуля Y, если допускается ее использование в пределах Y. Мы можем контролировать видимость процедуры, экспортируя ее из модуля.
С каждой экспортируемой процедурой связан список атрибутов. Он содержит атрибут omni, определяющий, что процедура видима из всех модулей, или атрибут visa, ограничивающий видимость процедуры: она будет видима только из тех модулей, которые ее импортируют. В списке допускается и атрибут sacred, запрещающий изменение процедуры из других модулей.
Предикат visa(A,P) экспортирует список процедур Р со списком атрибутов А. а предикат impoct(M,P) импортирует список процедур Р из модуля М.
Пример 10.1.1
Приведем описание модуля, внутри которого определяется процедура прямой_факт.
:- module(факт).
:- visa([visa], [факториал]).
факториал(N,V) :- прямой_факт(0,1,N,V),!.
прямой_факт(N,V,N,V).
прямой _факт(NS,VS,N,V) :-
NS1 is NS+ 1,
VS1 is VS*NS1,
прямой _факт(NS1,VS1,N,V).
:- endmodule(факт).
На запрос
?- факториал(5,М).
будет получен ответ
нет
Тогда как при запросе
?- import(факт,[факториал]).
?- факториал(5,М).
будет вычислено значение
М=120
Ответом на запрос
?- прямой факт (0,1,5,Х).
будет
нет