Представление списков произвольной длины

Предположим, что нужно представить список, в котором первые два элемента известны, а количество остальных элементов не определено. Такой список можно представить в виде структуры "./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] будет согласовываться только со списками, содержащими два или более элементов, а в списке [а] содержится лишь один элемент.

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