- •Глава 2 арифметика и структуры данных
- •2. 1. Арифметика
- •Арифметические выражения
- •Предикат "is"
- •Предикаты, выполняющие сравнение
- •Виды связи аргументов
- •2. 2. Структуры данных Типы термов
- •Примеры составных термов
- •Рекурсивные структуры
- •Процедура, которая строит рекурсивную структуру
- •2. 3. Списки Представление списков при помощи структуры "./2"
- •Другая форма представления списка, в которой употребляются квадратные скобки
- •Представление списков произвольной длины
- •Список произвольной длины при использовании формы записи с квадратными скобками
- •Унификация списков
- •Сравнение списков и простых структур
- •2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков
- •Выполнение запроса к процедуре "печатать—элементы"
- •Печать списка в обратном порядке
- •Форма записи аргументов в заголовке правила
- •Примеры процедур, предназначенных для обработки списков
- •2. 5. Способы представления базы данных Пять способов представления
- •1) Представление целостных информационных элементов в виде фактов
- •2) Представление атрибутов в виде фактов
- •3) Представление в виде списка структур
- •4) Представление в виде рекурсивной структуры
- •5) Представление в виде двоичного дерева
- •Сравнение разных видов представления базы данных
- •Библиографические заметки
- •Упражнения
2. 2. Структуры данных Типы термов
Аргументы фраз Пролога называются термами. Существует три типа термов:
Константа Атом (записываемый как слово, начинающееся с маленькой буквы, либо как произвольная группа символов, заключенная в апострофы) или целое число.
Переменная Записывается как слово, начинающееся с большой буквы, или как слово, начинающееся с символа _, или сам символ —.
Составной Записывается как
терм имя (арг1,..., аргn), где арг1,..., аргn сами являются
(или термами.
структура)
Сходство составных термов с записями
Читатели, которые знакомы с языками Си или Паскаль, обнаружат, что составные термы языка Пролог аналогичны записям Паскаля или структурам Си, т. е. составные термы - это определяемые программистом объекты произвольной сложности. Если придерживаться данной аналогии, то имя и количество аргументов составного терма показывают тип записи, а аргументы составного терма соответствуют полям записи. Неформальный термин структура означает то же самое, что и составной терм.
Примеры составных термов
Структура "клиент", приводимая ниже, содержит информацию о клиенте, берущем автомашину напрокат. В этой структуре содержатся сведения о фамилии, суточном тарифе и о количестве дней, на которое взята машина. Структура "дата" содержит данные о годе, месяце и дне. Обе структуры служат аргументами факта "сделка":
сделка (клиент (смит, 29, 4), дата (86, 4, 22)).
Факт "сделка" связывает информацию о сделке с клиентом и дату, когда эта сделка была заключена. Примечание: принято, что структуры записываются без пробелов между аргументами, а факты, правила, подцели и запросы записываются по крайней мере с одним пробелом между аргументами*).
Правило, в соответствии с которым вычисляется общая сумма оплаты
Ниже приводится правило, в котором аргументом служит структура "клиент", а в результате обработки правила подсчитывается общая сумма, которую должен заплатить клиент (т. е. суточный тариф, помноженный на количество дней):
% + -
итого (клиент (_, Тариф, Дни), Сумма): -
Сумма is Тариф* Дни.
Строка комментария, расположенная над правилом, следует соглашению, по которому входные аргументы помечаются в комментариях знаком +, а выходные аргументы помечаются знаком -. Здесь входным аргументом правила "итого/2" является структура "клиент", а выходным - переменная "Сумма". Фамилия клиента не требуется для вычисления суммы оплаты, поэтому первый аргумент структуры "клиент" обозначен символом —.
Запрос к правилу "итого"
Запрос к правилу "итого" можно записать так:
|? - итого (клиент ('Б. Смит', 29, 4), С).
С =116
Как Вы считаете, что произойдет, если написать запрос, в котором либо переменная «Тариф», либо переменная «Дни» будет неконкретизированной?
Рекурсивные структуры
Использование структур языка Пролог в большинстве случаев аналогично применению структур языка Си. К примеру, одним из способов представления в памяти ЭВМ записей базы данных является использование рекурсивных структур (аналогичных односвязным спискам - см. работу [2]), в которых один из аргументов каждой записи указывает на следующую запись. Для того чтобы на языке Пролог создать рекурсивную структуру, состоящую из записей "клиент", единственное, что нужно — это добавить в структуру "клиент" дополнительный аргумент, указывающий на следующую запись. Ниже приводится рекурсивная версия структуры "клиент", названная "кл":
кл (смит. 29, 4, кл (джонс, 40, 5, кл (ли, 29, 1, end)))
1-я запись 2-я запись 3-я запись
Заметьте, что уровень вложенности у каждой новой записи будет большим, чем у предыдущей. В четвертом поле последней записи, входящей в данную рекурсивную структуру, содержимся слово «end», обозначающее, что больше записей нет.
Работать с рекурсивными структурами языка Пролог несколько легче, чем со связными списками языков программирования, подобных языку Си. Дело в том, что интерпретатор Пролога берет, на себя все действия, связанные с обработкой указателей.