- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Запись термов
Рассмотрим предикаты, служащие для записи термов.
write(X)
Данный предикат выводит терм на экран. Если Х содержит конкретизированные переменные, то на экране отображаются термы, которыми эти переменные конкретизированы. Если Х содержит неконкретизированные переменные, они выводятся как уникальные целочисленные переменные. Сцепленные переменные, входящие в X, отображаются в виде одного и того же целого значения. Например, в ответ на запрос
?- write(сумма(N,S,N+1)).
на экране появится
сумма(_35,_36 is_35+l).
writeq(X)
Предикат аналогичен предикату write(X) кроме случая, когда Х содержит атом или функторы, которые в программе следует заключать в кавычки. Предикат writeq записывает такие величины на экране в кавычках. Например, в результате запроса
?- writeq('fred.txt').
на экране появится
'fred.txt'
display(X)
Предикат выводит терм Х в стандартной скобочной префиксной форме записи. Например, запрос
?- display (X+Y).
вызовет появление на экране записи:
+(X,Y).
9.4. Обработка файлов
Описанные выше предикаты ввода/вывода осуществляют считывание и запись на терминал. Клавиатура связывается со стандартным входным потоком, а экран - со стандартным выходным потоком. Входной и выходной потоки могут осуществлять связь с различными файлами пользователя, требующимися во время сеанса работы с Пролог-системой. Для этого файл объявляется в качестве стандартного входного потока, и рассмотренные выше предикаты для ввода производят считывание из файла, а не с клавиатуры. Подобным образом файл назначается в качестве стандартного выходного потока. В таком случае приведенные предикаты для вывода осуществляют запись в файл, а не на экран.
Для переопределения стандартных потоков используются следующие предикаты.
see(F)
Определяет в качестве стандартного входного потока файл F.
seen(F)
Предикат переопределяет стандартный входной поток с файла F на клавиатуру. Прежде чем с помощью предиката see(F2) определить в качестве стандартного входного потока файл F2, следует с помощью предиката seen(F1) отменить связь файла F1 со стандартным входным потоком.
tell(F)
Целевое утверждение определяет стандартным выходным потоком файл F.
told(F)
Целевое утверждение переопределяет стандартный выходной поток с файла F на экран. Перед тем как с помощью предиката tell(F2) определить в качестве выходного потока новый файл F2, необходимо с помощью предиката told(Fl) переключить текущий выходной поток с файла F1.
Помимо перечисленных в Прологе есть два предиката, позволяющие выяснить, с какими файлами связаны стандартные потоки.
seeing(F)
F отождествляется с именем файла, связанного со стандартным входным потоком.
telling(F)
F отождествляется с именем файла, связанного со стандартным выходным потоком.
Если при выполнении описанных выше предикатов оказывается, что файл F не существует или переменная F не конкретизирована, возникает ошибка.
Кроме стандартных входного и выходного потоков, в большинстве реализаций Пролога используются и другие потоки, служащие для связи с файлами.
open(F,S,A)
Предикат открывает файл F в поток S. Если значением А является read, файл открывается для чтения, а если А принимает значение write, то файл открывается для записи.
close(S)
Предикат закрывает поток S.
При выполнении рассматриваемых целевых утверждений должны быть конкретизированы переменные: S - имя потока, F - имя файла, А - режим доступа.
Если поток S открыт, мы должны использовать все имеющиеся предикаты ввода и вывода, указывая имя потока в качестве первого аргумента. Например, в результате выполнения последовательности утверждений
?- open (тестфайл,элемент,write),
write (элемент,тестпоток),
n1 (элемент), close (элемент).
в файл тестфайл будут выведены запись 'тестпоток' и признак новой строки.
