
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
6.6. Операторы объявления
Пролог предоставляет пользователю возможность определять свои собственные операторы. Для этого служит встроенный оператор ор. Функтор ор имеет три аргумента: приоритет, спецификатор и имя функтора:
op(P,S,N)
Здесь Р - приоритет оператора, S - спецификатор, а N - имя атома, который будет использоваться в качестве главного функтора в соответствующей структуре.
Пролог имеет ряд встроенных операторов, которые перечислены в конце главы. Все они определены так, как если бы для каждого объявления было успешно выполнено целевое утверждение
?- op(P,S,N).
Покажем на примере, как можно написать оператор для преобразования температуры по Цельсию в температуру по Фаренгейту. Сначала зададим предикат, который преобразует температуру С(по Цельсию) в температуруF(по Фаренгейту).
(consult)
/* приглашение пользователю ввести предложение:
?- [user]
/* ввод предложения
:t(C,F) :- F is (С*9/5+32).
:$ /* окончание работы пользователя
Теперь объявим предикат t как инфиксный левоассоциативный оператор с приоритетом 100:
?- op(100,yfx,t).
Если в программе на Прологе возникает необходимость преобразования температуры, то надо только включить целевое утверждение с оператором t и двумя аргументами: переменной С, конкретизированной некоторым целым числом, и неозначенной переменной F.
Например:
tabulate(C,F) :- write(C),tab(3),C t F, tab(3),write(F).
6.7. Пример: вычисление многочленов
В предыдущей главе мы использовали представление многочлена в виде списка термов. Для создания более удобного представления воспользуемся операторной формой записи. Объявим 'х' как инфиксный оператор:
:- op(550,xfx,x).
Теперь многочлены
1+3х^2-2х^4+х^5
записываются в виде
1х0+3х2-2х4+1х5.
Операторы + и - объявлены как
:- op(500,yfx,+).
:- op(500,yfx,-).
Применяя эти объявления, процедуру вычисления многочлена можно записать следующим образом:
вычислить(CxP,X,V) :-
степень_быстро(Х,P,ХP),
V is l*XP.
вычислить(P+Q,X,V) :-
вычислить(P,X,Vp),
вычислить(Q,X,Vq),
V is Vp + Vq.
вычислить(P-Q,Х,V) :-
вычислить(P,X,Vp),
вычислить(Q,X,Vp),
V is Vp - Vq.
где степень_быстро - процедура, определенная в разд. 5.4. Конечно, если в вашей реализации Пролога имеется экспоненциальный оператор, вы можете использовать его вместо степень_быстро.
Обратившись к системе с запросом
?- вычислить(1*0+3*2-2*4+1*5-1,V).
получим:
V=1.
6.8. Системные операторы
Обычно в реализации языка Пролог системные операторы, их позиция / ассоциативность и приоритет объявляются следующим образом:
Имя |
Спецификатор |
Приоритет |
:- |
xfx |
1200 |
?- |
fx |
1200 |
; |
xfy |
1100 |
, xfy |
1000 |
|
spy |
fx |
900 |
nospy |
fx |
900 |
not |
fx |
800 |
. |
xfv |
750 |
=.. |
xfx |
700 |
= |
xfx |
700 |
\= |
xfx |
700 |
is |
xfx |
700 |
=:= |
xfx |
700 |
=\= |
xfx |
700 |
< |
xfx |
700 |
= < |
xfx |
700 |
> |
xfx |
700 |
> = |
xfx |
700 |
= = |
xfx |
700 |
\= = |
xfx |
700 |
- |
yfx |
500 |
+ |
yfx |
500 |
/ |
yfx |
400 |
* |
yfx |
400 |
div |
yfx |
400 |
mod |
xfx |
300 |