Новосибирский Государственный Университет
Опубликован: 05.02.2007 | Доступ: свободный | Студентов: 2117 / 361 | Оценка: 4.30 / 4.23 | Длительность: 10:15:00
Лекция 3:

Списки и атомы

< Лекция 2 || Лекция 3: 123 || Лекция 4 >

Расширение типа данных, допускаемых в качестве второго аргумента " CONS ", ни в малейшей степени не усложняет реализацию этой функции, равно как и реализацию функций " CAR " и " CDR ", зато их описания становятся проще:

CONS - Функция, которая строит бинарный узел и заполняет его парой объектов, являющихся значениями пары ее аргументов. Первый аргумент размещается в левой части бинарного узла, а второй - в правой.

CARФункция, обеспечивающая доступ к объектам, расположенным слева от точки в точечной нотации, т.е. в левой части бинарного узла.

CDR - Функция, обеспечивающая доступ к объектам, расположенным справа от точки в точечной нотации, т.е. в правой части бинарного узла.

Таблица 3.2. Элементарные функции над произвольными S-выражениями
Функция Аргументы Результат
Конструирование структур данных
CONS A и B (A . B)
CONS (A . B) и C ((A . B) . C)
CONS

CONS

A B

(Результат предыдущего CONS) и C

(A . B)

((A . B) . C)

Доступ к компонентам структуры данных:
Слева
CAR (A . B) A
CAR ((A . B) . C) (A . B)
Справа
CDR (A . B) B
CDR (A . (B . C)) (B . C)
Обработка данных:
CDR

CAR

(A . (B . C))

Результат предыдущего CDR

(B . C)

B

CDR

CAR

(A . C)

Результат предыдущего CDR

C

Не определен

CONS

CAR

A и B

Результат предыдущего CONS

(A . B)

A

CONS

CDR

A и B

Результат предыдущего CONS

(A . B)

B

Тождества:(на произвольных объектах)
CONS

CAR

Два произвольных объекта x и y.

Результат предыдущего CONS

Исходный объект x

(первый аргумент CONS )

CONS

CDR

Два произвольных объекта x и y.

Результат предыдущего CONS.

Исходный объект y

(второй аргумент CONS )

CAR

CDR

CONS

Произвольный составной объект x - не атом.

Тот же самый объект x.

Результаты предыдущих CAR и CDR

Исходный объект x
Предикаты:
Атомарность – неделимость
ATOM ( A . B ) Nil - выполняет роль ложного значения
CDR

ATOM

( A . B )

Результат предыдущего CDR

B

T

Равенство
EQ (A . B) (A . B) Не определен

Точечная нотация может точно представлять логику хранения любых структур данных в памяти и доступа к компонентам структур данных. В виде списков можно представить лишь те S-выражения, в которых при движении вправо в конце концов обнаруживается атом Nil, символизирующий завершение списка.

Упражнение 3.4. Посмотрите, что делает Лисп-система с ниже приведенными выражениями, сравнивая результаты с данными из таблицы 3.2:

(CONS 'Head  'Tail )
(CAR '(Head . Tail))
(CDR '(Head . Tail))
(ATOM  'Atom)
(ATOM  ())
(ATOM  (CAR '(Head . Tail)))
(EQ Nil ())

Атом Nil, рассматриваемый как представление пустого списка (), выполняет роль ограничителя в списках. Одноэлементный список (A) идентичен S-выражению (A . Nil). Список (A1 A2 … Ak) может быть представлен как S-выражение вида:

(A1 . (A2 . ( … . (Ak . Nil) … ))).

В памяти это фактически одна и та же структура данных.

Таблица 3.3. Соответствие списков и равнозначных им S-выражений
List-notation - списочная запись объекта Dot-notation - точечная запись того же объекта
(A B C ) (A . (B . (C . Nil)))
((A B) C ) ((A . (B . Nil)) . (C . Nil))
(A B (C E)) (A . (B . ((C . (E . Nil)). Nil)))
(A) (A . Nil)
((A)) ((A . Nil) . Nil)
(A (B . C)) (A . ((B . C) . Nil))
(()) (Nil . Nil)
(A B . C) (A . (B . C))

Для многошагового доступа к отдельным элементам такой структуры удобно пользоваться мнемоническими обозначениями композиций из многократных CAR-CDR. Имена таких композиций устроены как цепочки из " a " или " d ", задающие маршрут движения из шагов CAR и CDR соответственно, расположенный между " c " и " r ". Указанные таким способом CAR-CDR исполняются с ближайшего к аргументу шага, т.е. в порядке, обратном записи.

Таблица 3.4. Примеры многошагового доступа к элементам структуры.
Композиции CAR-CDR Вычисляются в порядке, обратном записи:
CAAR ((A ) B C) A
CADR (A B C) B - CDR, затем CAR
CADDR (A B C) C - (дважды CDR), затем CAR
CADADR (A (B C) D) C - два раза:(CDR, затем CAR)

Упражнение 3.5. Посмотрите, что делает Лисп-система с ниже приведенными выражениями, сравнивая результаты с данными из таблицы 3.3:

(cAAr '((A) B C) )
(cADr '(A B C))
(cADDr '(A B C) )
(cADADr '(A (B C) D))
Таблица 3.5. Clisp: Функции для работы с данными
(Append Список … ) Сцепляет списки, полученные как аргументы
(Assoc Атом А-список) Находит в А-списке пару, левая часть которой – Атом
Atom Проверка на атомарность
Car Первый элемент списка или левый элемент структуры
Cdr Результат удаления первого элемена из списка или правый элемент структуры
Cons Создание узла из двух элементов
(Eq Данное1 Данное2) Истина при идентичных данных
(Equal Структура1 Структура2 ) Истина при эквивалентных структурах
(Delete Объект Список ) Строит копию Списка без заданного объекта
(Intersection Список … ) Пересечение списков
(Last Список ) Последний элемент структуры, представляющей список. Можно задавать длину завершающего отрезка списка.
(Length Список ) Длина списка
(List Форма … ) Строит список из значений Форм
(Member Объект Список ) Ищет Объект в Списке
(Null Форма) Истина для Nil
(Pairlis Атомы Данные А-спиок) Пополняет А-список парами из Атомов и значений, соответствующих Данных.
(Reverse Список ) Копия Списка с обратным порядком элементов
(Set-difference Список … ) Разность множеств, представленных Списками
(Sort Список Предикат ) Упорядочивает Список согласно Предикату
(Sublis А-список Структура ) Преобразует Структуру согласно А-списку методом подстановки данных вместо связанных с ними атомов.
(Subst Новое Старое Структура ) Преобразует Структуру, заменяя Старое на Новое.
(Union Список … ) Объединение множеств, представленных Списками.

Выводы:

  • Список – это перечень произвольного числа элементов, разделенных пробелами, заключенный в круглые скобки.
  • Элементы списка могут быть любой природы.
  • S-выражение - это или атом или заключенная в скобки пара из двух S-выражений, разделенных точкой. Список – частный случай S-выражения.
  • Любое S-выражение может быть построено из атомов с помощью CONS и любая его часть может быть выделена с помощью CAR-CDR.
  • Для изображения S-выражений используют различные нотации: графическую, точечную и списочную.
  • Базис Лиспа содержит элементарные функции CAR, CDR, CONS, EQ, ATOM.
< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Юрий Семевский
Юрий Семевский
Россия, Санкт-Петербург
Атанас Маринов
Атанас Маринов
Болгария