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

Понятие функции.

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

f(x) → y

ставит в соответствие каждому элементу х из множества определения единственный элемент y из множества значений функции f. Будем говорить, что функция f от аргумента х имеет значение y= f(x). У функции может произвольное число аргументов, в том числе не может совсем.

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

f (x), fun (x, y), h (x, g (y, z)).

В арифметических выражениях используется инфиксная запись, в которой имя функции, т.е. действия, располагается между аргументами:

x+у, x-y, x*(y+z).

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

(+ x y), (- x y), (* x (+ y z) ).

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

Quote блокирует вычисления

В некоторых случаях не надо вычислять значение выражения, а нужно само выражение. В таких случаях выражения, которые не нужно вычислять, помечаются апострофом «’»:

'(+ 2 3 ) => (+ 2 3)

Апостроф перед выражением это сокращение Лисповской формы QUOTE:

' s-выражение ↔ (QUOTE s-выражение)

Базовые функции языка.

В Лиспе для построения, разбора и анализа списков существуют базовые функции. Базовые функции в определенном смысле образуют систему аксиом языка, к которым сводятся символьные вычисления. Простота базовых функций и их малое число – это характерные черты Лиспа. С этим связана математическая элегантность языка.

Базисными функциями обработки символьных выражений являются:

CAR, CDR, CONS, ATOM, EQ.

Функции по принципу их использования можно разделить на функции разбора, создания и проверки:

Использование

Вызов

Результат

Разбор

(CAR, список)

(CDR, список)

s-выражение

список

Создание

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

список

Проверка

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

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

T или NIL

T или NIL

Функция car возвращает в качестве значения первый элемент списка.

(CAR список) => s - выражение (атом либо список).

Функция CAR имеет смысл только для аргументов, являющихся списками:

(CAR ‘a) => Error

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

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

(CAR ‘(a)) => a

(CAR NIL) => NIL - (голова пустого списка - пустой список).

Вызов функции CAR с аргументом (a b c d) без апострофа был бы проинтерпретирован как вызов функции «a» с аргументом «b c d», и было бы получено сообщение об ошибке.

Функция cdr - возвращает в качестве значения хвостовую часть списка, т. Е. Список, получаемый из исходного списка после удаления из него головного элемента:

(CDR список) => список

Функция CDR (произносится «кудр») определена только для списков. Функция берет остаток списка без первого элемента, т.е. хвост. Если список состоял из одного элемента, то результатом выполнения функции будет пустой список, т.е. NIL:

(CDR ‘a) => Error

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

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

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

(CDR ‘(a)) => NIL

(CDR NIL) => NIL