Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функционально-логическое программирование Prolog, LISP.doc
Скачиваний:
73
Добавлен:
02.05.2014
Размер:
389.63 Кб
Скачать

14. Методы обработки списков (лисп).

Списком в Лиспе называется упорядоченная последовательность S-выражений, заключенная в круглые скобки. Элементы списка отделяются друг от друга пробелами.

Одной из отличительных особенностей Лиспа является единая форма представления данных и программного кода (функций). Для обозначения списка, используемого как данные, и блокировки вычислений в Лиспе определена функция QUOTE (‘).

БАЗОВЫЕ ФУНКЦИИ ОБРАБОТКИ СПИСКОВ.

В Лиспе для построения, разбора и анализа списков существуют простые базовые функции:

1) Функции-селекторы CAR и CDR.

2) Функцию-конструктор CONS.

3) Предикаты ATOM, EQ, EQUAL.

СЕЛЕКТОРОМ называется функция, осуществляющая выборку элемента объекта данных.

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

Путем комбинации селекторов CAR и CDR можно выделять произвольный элемент списка.

КОНСТРУКТОРОМ называется функция, осуществляющая построение объекта данных. Функция CONS строит новый список из переданных ей в качестве аргументов выражения и списка. При этом первый аргумент включается в список-результат в качестве головы, второй – в качестве хвоста.

Функция LIST создает список из произвольных элементов. Вызов list эквивалентен суперпозиции вызовов CONS, причем вторым аргументом последнего вызова является nil, который служит основой для наращивания списка. (list ‘a ‘b ‘c) эквивалентно (cons ‘a (cons ‘b (cons ‘c nil))).

Для выборки элементов списков в Лиспе существуют функции выделения заданного элемента : FIRST, SECOND, THIRD, FOURTH, ... last и более общая функция NTH, выделяющая n-й элемент списка (nth n список).

ПРЕДИКАТАМИ в функциональном программировании называются функции, которые проверяют выполнение некоторого условия и возвращают логическое значение T или NIL.

ATOM, EQ и EQUAL являются базовыми предикатами Лиспа. С их помощью и используя другие базовые функции, можно задавать более сложные предикаты, которые будут проверять наличие более сложных свойств.

Предикат ATOM проверяет, является ли аргумент атомом.

Предикат EQ проверяет тождественность двух атомарных выражений.

Предикат EQUAL проверяет тождественность произвольных выражений.

.

.

15. Определение универсальной функции.

.

.

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

Хотя формальное правило записи программ вычислений в виде S-выражения предписывает, что константа Т — это (QUOTE T), было оговорено, что в системе всегда пишется Т. Кроме того, Nil оказался удобнее, чем атом F, встречавшийся в начальных предложениях по Лиспу аналог значения FALSE. Программист может либо принять это правило на веру, либо изучить следующие уточнения.

В Лисп есть два атомных символа, которые представляют истину и ложь, соответственно. Эти два атома — T и NIL. Данные символы — действительные значения всех предикатов в системе. Главная причина в удобстве кодирования. Во многих случаях достаточно отличать произвольное значение от пустого списка.

Формального различия между функцией и предикатом в Лиспе не существует. Предикат может быть определен как функция со значениями либо T либо NIL. Это верно для всех предикатов системы. Можно использовать форму, не являющуюся предикатом там, где требуется предикат: предикатная позиция условного выражения или аргумент логической операции. Семантически любое S-выражение, отличного от NIL, будет рассматриваться в таком случае как истинное. Первое следствие из этого — предикат Null и логическое отрицание Not идентичны. Второе — то, что (QUOTE T) или (QUOTE Х) практически эквивалентны Т как константные предикаты.

Предикат EQ ведет себя следующим образом:

1. Если его аргументы различны, значением EQ является NIL.

2. Если оба его аргументы являются одним и тем же атомом, то значение — Т.

3. Если значения одинаковы, но не атомы, то его значение T или NIL в зависимости от того, идентично ли представление аргументов в памяти.

4. Значение EQ всегда T или NIL. Оно никогда не бывает не определено, даже если аргументы неправильные.

.

.