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», обозначающее, что больше записей нет.

Работать с рекурсивными структурами языка Пролог несколько легче, чем со связными списками языков программирования, подобных языку Си. Дело в том, что интерпретатор Пролога берет, на себя все действия, связанные с обработкой указателей.

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие