- •Глава 2 арифметика и структуры данных
- •2. 1. Арифметика
- •Арифметические выражения
- •Предикат "is"
- •Предикаты, выполняющие сравнение
- •Виды связи аргументов
- •2. 2. Структуры данных Типы термов
- •Примеры составных термов
- •Рекурсивные структуры
- •Процедура, которая строит рекурсивную структуру
- •2. 3. Списки Представление списков при помощи структуры "./2"
- •Другая форма представления списка, в которой употребляются квадратные скобки
- •Представление списков произвольной длины
- •Список произвольной длины при использовании формы записи с квадратными скобками
- •Унификация списков
- •Сравнение списков и простых структур
- •2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков
- •Выполнение запроса к процедуре "печатать—элементы"
- •Печать списка в обратном порядке
- •Форма записи аргументов в заголовке правила
- •Примеры процедур, предназначенных для обработки списков
- •2. 5. Способы представления базы данных Пять способов представления
- •1) Представление целостных информационных элементов в виде фактов
- •2) Представление атрибутов в виде фактов
- •3) Представление в виде списка структур
- •4) Представление в виде рекурсивной структуры
- •5) Представление в виде двоичного дерева
- •Сравнение разных видов представления базы данных
- •Библиографические заметки
- •Упражнения
Представление списков произвольной длины
Предположим, что нужно представить список, в котором первые два элемента известны, а количество остальных элементов не определено. Такой список можно представить в виде структуры "./2", если в качестве второго аргумента структуры "./2" с наибольшим уровнем вложенности взять неконкретизированную переменную:
. (один,. (два. Х))
Здесь наиболее глубоко вложенной "./2" - структурой является структура «. (два. Х)», поэтому общая длина списка будет зависеть от значения переменной X. Если
Х = []
то общая длина списка будет равна двум, а если
Х =. (три,. (четыре,. (пять, [])))
то длина получившегося списка будет равна пяти.
Список произвольной длины при использовании формы записи с квадратными скобками
Существует эквивалентный способ представления списков неопределенной длины, при котором употребляется форма записи с квадратными скобками. Для того чтобы отделить конкретные элементы, образующие начальную часть списка, от переменной, представляющей оставшуюся часть этого списка, применяется символ | . Предыдущий пример при употреблении такой формы обозначения примет вид:
[один, два | X]
Начало и остаток списка
Символ | разделяет список на две части: на начало списка, которое образуют все элементы, стоящие перед, символом | (в данном случае — элементы «один» и «два»), и остаток списка, обозначенный некоторой переменной (в данном случае X). Начало списка всегда представляется в явном виде, а остаток — в неявном виде при помощи переменной, расположенной справа от символа | .
Если
Х = []
то длина получившегося списка будет равна двум, а если
Х = [три, четыре, пять]
то длина результирующего списка станет равна пяти.
При любой из двух форм записи сочетание символов [] обозначает пустой список.
Примеры списков
Ниже приводятся примеры списков в форме записи с квадратными скобками. Во втором примере дан список структур "телефон/2". В последнем примере показано, что элемент списка может сам быть списком.
[представление, для, фразы]
[телефон (джонс, 7279112), телефон (родригес, 9421001)]
[Первый | Остаток]
[[a. b, с], [1, 2] | R]
Встроенный предикат "="
Встроенный предикат "=", имеющий два аргумента, записывается в инфиксной форме записи. Этот предикат проверяет, унифицируются ли друг с другом его аргументы. Если в одном из аргументов содержатся неконкретизированные переменные, то в случае успешной унификации они конкретизируются. Предикат "=" используется в приводимых ниже списках для того, чтобы продемонстрировать выполнение проверки совпадения с эталоном. Вначале, однако, рассмотрим запросы, иллюстрирующие применение предиката "=" для работы с несписковыми аргументами.
% унифицировать переменную Х с "привет":
|? - Х = привет.
Х = привет
% проверить, унифицируется ли "привет" с "до_свидания":
|? — привет = до_свидания.
нет
% унифицировать две структуры "клиент":
|? - клиент (смит, 29, 4) = клиент (X, Y, Z).
Х = смит
Y=29
Z=4
Унификация списков
Если воспользоваться формой записи списков с употреблением квадратных скобок, то легко можно выделить произвольное количество элементов, стоящих в начале списка. Далее показаны запросы, демонстрирующие унификацию различных списков.
% выделить первый элемент списка:
|? - [F|R] = [1, 2, 3, 4, 5].
F= 1
R = [2, 3, 4, 5]
|? - [F|R] = [a].
F=a
R= []
% взять первые два элемента списка:
|? - [F1, F2| R] = [a, b, c, d].
F1=a
F2=b
R= [c, d]
|? - [F1, F2; R] = [a].
нет
Последний запрос терпит неудачу ввиду того, что список [F1, F2 | R] будет согласовываться только со списками, содержащими два или более элементов, а в списке [а] содержится лишь один элемент.