
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Левому поддереву соответствует отсортированный список
[alice,fred,graham]
Правому поддереву - отсортированный список
[ray]
Следовательно, отсортированным списком для всего дерева будет
присоединить([alice,fred,graham],[jim | ray),L)
что равно
[alice,fred,graham,jim,ray]
Используя процедуру присоединить (см. разд. 5.1.2), преобразуем приведенный алгоритм в утверждения Пролога:
дерево_в_список(nil,[]).
дерево_в_список(бд(Лд,К,Пд),С) :-
дерево_в_список (Лд,СЛ),
дерево_в_список (Пд,СЛ),
присоединить(СЛ, [К | СП] ,C).
Глава 6 Операторы
В этой главе описывается связь операторов со структурами и излагаются способы объявления и использования операторов. Дается объяснение следующим трем свойствам операторов:
1) позиция;
2) приоритет;
3) ассоциативность.
6.1. Операторы и структуры синтаксис операторов
Структура в Прологе образуется из атома, называемого главным функтором, и следующей за ним последовательности термов, называемых компонентами. Последовательность компонент заключается в круглые скобки. Между главным функтором и открывающей скобкой не должно быть пробела. Компоненты разделяются запятыми. Например, +(1,2) представляет собой структуру с главным функтором + и компонентами 1 и 2;
Для некоторых типов структур допустима более удобная запись с помощью альтернативных форм синтаксиса:
а) синтаксис операторов для структур, арность которых равна одному или двум;
б) синтаксис списков для структур в виде списков;
в) синтаксис строк для списков символов, записанных в кодах ASCII или EBCDIC.
В настоящей главе мы обсудим первую форму - синтаксис операторов. Структуры с арностью, равной одному или двум, могут быть переписаны в синтаксисе операторов посредством объявления главного функтора структуры оператором с одним или двумя аргументами. Компоненты структуры записываются как аргументы оператора.
Например, если + и - объявить системными операторами, то +(1,2) принимает вид 1+2, а-(1) записывается как -1.
Если арность структуры равна единице, оператор может быть объявлен как
а) префиксный оператор. В этом случае оператор записывается перед единственным аргументом ор А;
б) постфиксный оператор. В этом случае оператор записывается после единственного аргумента А ор.
Если арность структуры равна двум, оператор может быть объявлен как инфиксный. В таком случае он записывается между двумя своими аргументами: А ор В.
Например, такие структуры, как
+(X,Y).
;(P,Q). (; обозначает'или')
< (X,Y).
является_частью(А,В).
прошло(Р).
допускают общепринятую форму записи
X+Y.
P;Q.
X<Y.
А является_частью В.
Р прошло.
Максимальное число компонент в структуре операторного типа равно двум. Следует подчеркнуть, что синтаксис операторов используется вместо обычного формата структур только для удобства.
Свойства операторов
Для точного определения оператора необходимо указать три его свойства: позицию, приоритет и ассоциативность.
Позиция оператора указывает, где он записывается по отношению к своим аргументам.
Приоритет оператора задает порядок выполнения операций в выражении, содержащем более одного оператора.
Ассоциативность оператора показывает, какая операция выполняется первой в выражении, содержащем два или более оператора с одинаковым приоритетом.
Теперь мы поясним значение свойств и их использование в объявлении оператора.