Опубликован: 05.02.2007 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Лекция 3:

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

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

Упражнения 3.1.: Нарисуйте диаграммы для списков вида:

((A B) C)

((A B)  (D C))

((A B)(D(C E)))

Любой список может быть построен из пустого списка и атомов с помощью CONS и любая его часть может быть выделена с помощью подходящей композиции CAR-CDR.

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

CARФункция, обеспечивающая доступ к первому элементу списка - его "голове".

CDRФункция, укорачивающая список на один элемент. Обеспечивает доступ к "хвосту" списка, т.е. к остатку списка после удаления его головы.

ATOM - Функция, различающая составные и атомарные объекты. На атомах ее значение "истина", а на более сложных структурах данных – "ложь".

EQФункция, которая проверяет атомарные объекты на равенство.

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

CONS

A и (B)

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

(A B)

((A B) C)

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

CAR

(A B C)

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

(B C)

B

CAR

CAR

(A C)

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

A

Не определен

CONS

CAR

A и (B)

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

(A B)

A

CONS

CDR

A и (B)

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

(A B)

(B)

Предикаты:
Атомарность – неделимость
ATOM VeryLongStringOfLetters T
ATOM ( A B ) Nil - выполняет роль ложного значения
CDR

ATOM

( A B )

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

(B)

Nil

ATOM Nil T
ATOM ( ) T
Равенство
EQ A A T
EQ A B Nil
EQ A (A B) Nil
EQ (A B) (A B) Не определен
EQ Nil и () T

Различие истинностных значений в Лиспе принято отождествлять с разницей между пустым списком и остальными объектами, которым программист может придать в программе некоторый другой смысл. Таким образом, значение "ложь" – это всегда Nil.

Если требуется явно изобразить значение "истина", то используется стандартная константа – атом T (true), но роль значения "истина" может выполнить любой, отличный от пустого списка, объект.

Упражнение 3.2. Посмотрите, что сделает Лисп-система с ниже приведенными выражениями2Латинский шрифт используется исключительно ради простоты набора текстов. Вполне допустима кириллица , сравнивая результаты с данными из таблицы 3.1:

(CONS 'Head  Nil )
(CONS 'Head  '(Body Tail) )
(CAR '(Head Body Tail))
(CDR '(Head Body Tail))
(ATOM  'Body)
(ATOM  '(Body))
(ATOM  ())
(ATOM  (CAR '(Head Body Tail)))
(EQ Nil ())

Точечная нотация

При реализации Лиспа в качестве единой универсальной базовой структуры для конструирования символьных выражений использовалась так называемая "точечная нотация" ( dot-nоtation ), согласно которой левая и правая части бинарного узла равноправны и могут хранить данные любой природы.

Бинарный узел, содержащий пару атомов ATOM1 и ATOM2,


можно представить как запись вида:

( ATOM1 .  ATOM2 )

Если вместо атомов " ATOM1 ", " ATOM2 " рекурсивно подставлять произвольные атомы, затем построенные из них пары и так далее, то мы получим множество всех возможных составных символьных выражений – S-выражений.

S-выражение - это или атом или заключенная в скобки пара из двух S-выражений, разделенных точкой.

Все сложные данные создаются из одинаково устроенных блоков - бинарных узлов, содержащих пары объектов произвольного вида. Каждый бинарный узел соответствует минимальному блоку памяти.

Списки – это подмножество S-выражений, движение вправо по которым завершается атомом Nil.

(A . B)

(C . (A . B))


3.3.
                    

Любое S-выражение может быть построено из атомов с помощью CONS и любая его часть может быть выделена с помощью CAR-CDR.

Упражнение 3.3. Нарисуйте диаграммы для следующих S-выражений:

((A . B) . C)
((A . B) . (D . C))
((A . B) . (D . (C . E)))
< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Роман Храпай
Роман Храпай
Россия
Роман Храпай
Роман Храпай
Украина