
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Предикаты для работы с контрольными точками
spy(F) Устанавливает контрольные точки для всех процедур с главным функтором F.
spy(F/A) Устанавливает контрольные точки для всех процедур с главным функтором F и арностью А.
spy([F/A,F1/A1,...]) Устанавливает контрольные точки для списка процедур с функторами F, F1 и арностью А, А1 соответственно.
nospy(F) Удаляет контрольные точки из всех процедур с главным функтором F.
nospy(F/A) Удаляет контрольные точки из всех процедур с главным функтором F и арностью А.
nospy([F/A,F1/A1,...]) Удаляет контрольные точки из списка процедур с функторами F, F1 и арностью А, А1 соответственно.
nospyall Удаляет все контрольные точки, существующие в базе данных Пролога.
Режимы, связанные с контрольными точками
В некоторых реализациях Пролога пользователю разрешается выбрать тот режим контрольных точек, при котором происходит останов в любой из точек CALL, FAIL, REDO и EXIT при выполнении Пролог-программы. Это дает возможность пользователю управлять количеством информации, выдаваемой на терминал.
Основные отладочные предикаты
Nodebug Отключает режим трассировки и режим контрольных точек.
Статистическая информация
Иногда пользователю требуется следующая информация:
- сколько времени Пролог-программа выполнялась в системе;
- сколько логические выводов совершила система во время выполнения программы. (Замечание. Логический вывод - выполнение одного целевого утверждения Пролога.);
- сколько места занимает база данных Пролога ?
Такую информацию обычно можно получить с помощью встроенных предикатов. Имена предикатов и их параметры зависят от реализации, но, как правило, они аналогичны именам и параметрам предикатов, описанных ниже.
Встроенный предикат statistics (T,L) конкретизирует переменную Т значением текущего процессорного времени (обычно в миллисекундах), а аргумент L - числом произведенных логических выводов. Попытка доказать целевое утверждение statistics (T,L) всегда заканчивается успехом.
Например, требуется определить, сколько времени понадобится программе степень, чтобы возвести 50 в степень 4 (см. гл.10) и выдать ответ. Зададим новый предикат время:
время (Время, Счет) :- statistics (Т1,L1),
степень (50,4),
statistics (T2,L2),
Время is T2-T1,
Счет is L2-L1.
При первом вызове предиката statistics переменные Т1 и L1 будут конкретизированы соответствующими значениями. Затем выполняются предикат степень(N,P) и определяющие его целевые утверждения. При втором вызове предиката statistics переменные Т2 и L2 конкретизируются новыми значениями, полученными после выполнения предиката степень(N,Р). Процессорное время, необходимое для выполнения, составляет T2-T1 миллисекунд, а количество вызванных целевых утверждений равно L2-L1. Число логических выводов в секунду составляет
1000*L2-L1/T2-T1.
Встроенный предикат core выводит в текущий выходной поток статистическую информацию, относящуюся к использованию памяти. Эта информация различается в зависимости от конкретной системы, но приблизительно такова:
- количество свободного пространства, оставшегося в базе данных Пролога (в словах);
- размер локального и глобального стеков (в словах). (Замечание. Локальный и глобальный стеки - динамические внутренние структуры данных, используемые в большинстве реализации Пролога.)