Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Функциональное и логическое программирование.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
309.57 Кб
Скачать

Функция cons включает новый элемент в начало списка:

(CONS s-выражение список) => список.

Функция строит новый список из преданных ей в качестве аргументов головы и хвоста. Для того чтобы можно было включить первый элемент функции CONS в качестве первого элемента значения второго аргумента этой функции, второй аргумент должен быть списком. Значением функции CONS всегда будет список:

(CONS ‘a ‘(b c)) => (a b c)

(CONS ‘(a b) ‘(c d)) => ((a b) c d)

(CONS (+ 1 2) ‘(+ 3)) => (3 + 3)

(CONS ‘(a b c) NIL) => ((a b c))

(CONS NIL ‘(a b c)) => (NIL a b c)

Список, разбитый с помощью CAR и CDR на голову и хвост, можно восстановить с помощью CONS:

(CONS (CAR ‘(a b c d)) (CDR ‘(a b c d))) => (a b c d)

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

(ATOM s - выражение)

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

Значением вызова ATOM будет T, если аргументом является атом, и NIL - в противном случае:

(ATOM ‘a) => T

(ATOM ‘(a b c)) => NIL

(ATOM NIL) => T

(ATOM ‘(NIL)) => NIL

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

(EQ символ символ)

Предикат EQ сравнивает два символа и возвращает значение T, если они идентичны, в противном случае - NIL. С помощью EQ сравнивают только символы или константы T и NIL:

(EQ ‘a ‘b) => NIL

(EQ ‘a (CAR ‘(a b c))) => T

(EQ NIL ()) => T

Предикат EQL сравнивает числа одинаковых типов:

(EQL число число)

Предикат EQL используется во многих встроенных функциях, осуществляющих более сложные операции сравнения.

(EQL 2 2) => T

(EQL 2.0 2.0) => T

(EQL 2 2.0) => NIL (не годится для разных типов)

Предикат = сравнивает числа разных типов:

(= число число)

Для сравнения чисел различных типов используют предикат «=». Значением предиката «=» является T в случае равенства чисел независимо от их типов и внешнего вида записи:

(= 2 2.0) => T

Предикат equal проверяет идентичность записей:

(EQUAL список список)

Предикат EQUAL работает как EQL, но дополнительно проверяет одинаковость двух списков. Если внешняя структура двух Лисповских объектов одинакова, то результатом EQUAL будет T:

_(EQUAL ‘a ‘a) => T

_(EQUAL ‘(a b c) ‘(a b c)) => T

_(EQUAL ‘(a b c) ‘(CONS ‘a ‘(b c))) => T

_(EQUAL 1.0 1) => NIL

Предикат equalp проверяет наиболее общее логическое равенство:

(EQUALP s-выражение s-выражение)

Предикат EQUALP позволяет сравнивать произвольные Лисповские объекты: числа различных типов, выражения, списки; используется в тех случаях, когда нет уверенности в типе сравниваемых объектов.

Недостатком применения подобных универсальных предикатов и функций требует большего объема системных вычислений, чем применение специализированных предикатов и функций.

Другие простейшие встроенные функции Лиспа. Функция null проверяет, является ли аргумент пустым списком:

(NULL s-выражение)

Функция NULL работает как логическое отрицание, у которого в Лиспе есть своя функция NOT:

(NULL ‘()) => T

(NULL ‘(1 2 3)) => NIL

(NOT (NULL NIL)) => NIL

Функция NULL реализована через EQ:

(NULL x) ( EQ NIL x)

Комбинации вызовов car и cdr позволяют получить любой элемент списка:

(C….R список)

Вместо многоточия записывается любая комбинация из букв А (для функции CAR) и D (для функции CDR). В один вызов можно объединять не более четырех функций CAR и CDR. Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения:

(CADAR x)  (CAR (CDR (CAR x)))

(CDDAR ‘((a b c d) e)) => (c d)

(CDDR ‘(k l m)) => (m)

Через комбинацию вызовов CAR и CDR реализованы функции, позволяющие получить произвольный элемент списка с 1-го по 10-й:

(first список) (car список)

(second список) (cadr список)

(third список) (caddr список)

(fourth список) (cadddr список)

(third (cons a (cons b (cons c nil) ) ) ) => c

(fourth ‘(a b c) ) => NIL