Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ФЛП.doc
Скачиваний:
18
Добавлен:
27.05.2015
Размер:
632.83 Кб
Скачать

2.2.2 Числовые функции

Числовые функции выполняют основные математические операции над целыми и дробными числами. К элементарным числовым функциям относятся: сложение, вычитание, умножение и деление. В языке программирования ЛИСП они являются n-арными, т.е. количество их аргументов неограниченно. Они имеют следующий синтаксис

1. (+ <num1> <num2> ... <num>). 3. (* <num1> <num2> ... <num>)

2. ( - <num1> <num2> ... <num>) 4. (/ <num1> <num2> ... <num>)

и действуют следующим образом

(+ x1 x2 ... xn) x1 + x2 + x3 + ... + xn.

(– x1 x2 ... xn) x1 – x2 – x3 – ... – xn.

(* y1 y2 ... yn) y1 * y2 * y3 * ... * yn.

(/ x1 x2 ... xn) x1/x2/... /xn.

Функции увеличения и уменьшения на единицу имеют вид (ADD1 <n>), (SUB1 <n>) и возвращают значение, которое на единицу больше (меньше) чем аргумент.

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

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

(numberp n) – число; (integerp n) – целое; (zerop n) = 0;

(plusp n) > 0; (minusp n) < 0;

(oddp n) – четное; (evenp n) – нечетное.

и прочие. Они обычно применяются для построения условных функций.

2.2.3 Базовые функции лисПа

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

(name arg1 arg2 ...), где name – имя функции, arg1,arg2,... – ее аргументы.

1. (CAR <list>) – голова списка.

2. (CDR <list>) – хвост списка.

3. (CONS <object> <list>) – присоединение объекта к списку.

4. (EQL <atom1> <atom2>) – сравнение двух атомов.

5. (ATOM <object>) – проверка, является ли <object> атомом.

CAR и CDR называются селекторными функциями, поскольку они дают возможность выбирать или уничтожать часть объекта. Результатом функции (CAR list) всегда есть первый элемент списка list, если он не пустой и NIL, в противном случае. Результатом функции (CDR list) есть список list без первого элемента, если list содержит больше одного элемента и NIL в противном случае.

(CAR ‘(a b c d)) a (CAR ‘((1 2) (2 3))) ’(1 2)

(CAR ‘()) NIL

(CDR ‘(f q h l t)) ‘( q h l t) (CDR ‘((f q h) l t)) ’( l t))

(CDR ‘(s w)) NIL (CDR ‘(( ) ( ) ( ))) (( ) ( ))

С помощью функций CAR, CDR можно находить по данному списку любой его подсписок или атом. Довольно удобны при обработке списков функции, которые являются комбинациями CAR и CDR. Имена таких функций начинаются на C и заканчиваются R, а между ними находится последовательность букв A (применение CAR) и D (применение CDR), которая указывает путь вычислений.

(CAR (CDR (CDR ‘(1 2 3 4 5 6)))) (CADDR ‘(1 2 3 4 5 6)) 3

(CAR (CAR ‘((1 2)))) (CAAR ‘((1 2))) 1

Вызовы происходят из середины наружу.

Функция конструктора CONS применяется для присоединения объекта к заданному списку. Объект, который добавляется, становится головой списка. Если второй аргумент не задан, то он считается равным NIL.

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

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

В последнем случае мы получили список с подсписками.

Для объединения двух списков в линейный список существует функция (APPEND <list> <list>), результат действия которой для этого примера был бы

(APPEND ‘(a b) ‘(c d)) (a b c d)

Функцией сравнения является EQL. Она сравнивает значение первого и второго аргумента, которые обязательно должны быть атомами, и возвращает значение истина (Т) или ложь (NIL).

(EQL ‘df ‘df) T (EQL (CAR ‘(q w)) q) T

(EQL (CAR ‘(a h)) NIL) F

При программировании на Лиспе часто возникает вопрос: является ли данный объект атомом. Этот вопрос можно решить с помощью предиката ATOM, который возвращает Т, если объект является атомом и NIL в обратном случае. Пустой список NIL считается атомом.

(ATOM one) T (ATOM ‘(s d h))F

Образовать список, который состоит из одного элемента можно с помощью функции конструктора, а именно

(CONS a ( )) (a).

В общем случае для этой цели существует функция LIST, которая имеет следующий формат записи

(LIST <s-выражение 1> <s-выражение 2>...<s-выражение N>),

а в результате вызова имеем

(LIST a b c) ’(a b c)

Разветвление вычислений в Лиспе реализуется с помощью условных функций. В частности, наиболее употребительная форма IF имеет общий формат

(IF (условие) (Then form) (Else form)).

В том случае, когда условие (предикат) не равно NIL, функция возвращает значение Then form, а в противном случае значения Else form.

(IF (minusp a) 0 1)

Поскольку случаи, когда можно ограничиться только формой Then на практике встречаются очень часто и форма Else становится не нужной, в Лиспе существует сокращенная форма условной функции, в которой слово IF опускается

((minusp a) 0).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]