Определение функций Функциональное программирование Григорьева И.В.

Презентация:



Advertisements
Похожие презентации
ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА Функциональное программирование Григорьева И.В.
Advertisements

ИМЯ И ЗНАЧЕНИЕ СИМВОЛА Функциональное программирование Григорьева И.В.
ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ Функциональное программирование Григорьева И.В.
ДРУГИЕ ФОРМЫ РЕКУРСИИ I Функциональноепрограммирование Григорьева И.В.
ВЫЧИСЛЕНИЕ В ЛИСПЕ Функциональное программирование Григорьева И.В.
Базовые функции Функциональное программирование Григорьева И.В.
Основы программирования в Лиспе. Функции. Рекурсия Лекция 11.
1 Кубенский А.А. Функциональное программирование. Глава 4. Основы лямбда-исчисления Рекурсия в лямбда-исчислении fac = λn.(if (= n 0) 1 (* n (fac.
Функциональное программирование МарГТУ2009 г. 1 Функции. Базовые функции. Лекция 2.
Другие формы рекурсии II Функциональное программирование Григорьева И.В.
Основы рекурсии Рекурсивно-логическое программирование Григорьева И.В.
1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Глава 5. Системы исполнения функциональных программ.
Функционалы. Методы обработки S-выражений. Методы обработки списков Лекция 12.
1 Кубенский А.А. Функциональное программирование. Глава 3. Стили функционального программирования. Глава 3. Стили функционального программирования 3.1.
ОТОБРАЖАЮЩИЕ ФУНКЦИОНАЛЫ. Важный класс функционалов в практическом программировании на языке Лисп образуют отображающие функции или МАР-функции. МАР-функционалы.
Функциональное программирование Лекция 2 (13) Функционалы и их разновидности.
1 Кубенский А.А. Функциональное программирование. Глава 4. Основы лямбда-исчисления. Будем задавать функции с помощью «лямбда-выражений», которые будем.
Языки и методы программирования Преподаватель – доцент каф. ИТиМПИ Кузнецова Е.М. Лекция 5.
1 Кубенский А.А. Функциональное программирование. Глава 4. Основы лямбда-исчисления Рекурсия в лямбда-исчислении fac = λn.(if (= n 0) 1 (* n (fac.
Шутилина Л.А. Процедуры в Turbo Pascal ( часть 1: процедуры с параметрами)
Транксрипт:

Определение функций Функциональное программирование Григорьева И.В.

Лямбда-выражение изображает параметризованные вычисления Лямбда-выражение изображает параметризованные вычисления Лямбда-вызов соответствует вызову функции Лямбда-вызов соответствует вызову функции Вычисление лямбда-вызова или лямбда- преобразование Вычисление лямбда-вызова или лямбда- преобразование Объединение лямбда-вызовов Объединение лямбда-вызовов Лямбда-выражение - функция без имени Лямбда-выражение - функция без имени DEFUN дает имя описанию функции DEFUN дает имя описанию функции -SYMBOL-FUNCTION выдает определение функции -SYMBOL-FUNCTION выдает определение функции Задание параметров в лямбда-списке Задание параметров в лямбда-списке Изображение функций в справочных руководствах Изображение функций в справочных руководствах Функции вычисляют все аргументы Функции вычисляют все аргументы Многозначные функции Многозначные функции Определение функции в различных диалектах Лиспа Определение функции в различных диалектах Лиспа -При вычислении NLAMBDA аргументы не вычисляются -При вычислении NLAMBDA аргументы не вычисляются

Определение функций и их вычисление в Лиспе основано на лямбда-исчислении Черча, предлагающем для этого точный и простой формализм. В лямбда-исчислении Черча функция записывается в следующем виде: lambda(xl,x2....,xn).fn В Лиспе лямбда-выражение имеет вид (LAMBDA (xl х2... хn) fn) LAMBDA означает, что мы имеем дело с определением функции.

Символы xi являются формальными параметрами определения, которые именуют аргументы в описывающем вычисления теле функции fn. Входящий в состав формы список, образованный из параметров, называют лямбда-списком. Пример: (lambda (х у) (+ (* х х) (* у у))) Формальность параметров означает, что их можно заменить на любые другие символы, и это не отразится на вычислениях, определяемых функцией.

Лямбда-вызов соответствует вызову функции Лямбда-выражение - это определение вычислений и параметров функции в чистом виде без фактических параметров, или аргументов. Для того, чтобы применить такую функцию к некоторым аргументам, нужно в вызове функции поставить лямбда-определение на место имени функции: (лямбда-выражение а1 а2... an) Здесь ai - формы, задающие фактические параметры, которые вычисляются как обычно. _((lambda (x у) (cons x (cons у nil))) 'а 'Ь) (А В) _((lambda (x у) (cons x (cons у nil))) 'а 'Ь) (А В)

Вычисление лямбда-вызова, или лямбда-преобразозание Вычисление лямбда-вызова, или применение лямбда- выражения к фактическим параметрам, производится в два этапа. Сначала вычисляются значения фактических параметров и соответствующие формальные параметры связываются с полученными значениями. Этот этап называется связыванием параметров. Сначала вычисляются значения фактических параметров и соответствующие формальные параметры связываются с полученными значениями. Этот этап называется связыванием параметров. На следующем этапе с учетом новых связей вычисляется форма, являющаяся телом лямбда- выражения, и полученное значение возвращается в качестве значения лямбда-вызова. Формальным параметрам после окончания вычисления возвращаются те связи, которые у них, возможно, были перед вычислением лямбда-вызова. Весь этот процесс называют лямбда-преобразованием. На следующем этапе с учетом новых связей вычисляется форма, являющаяся телом лямбда- выражения, и полученное значение возвращается в качестве значения лямбда-вызова. Формальным параметрам после окончания вычисления возвращаются те связи, которые у них, возможно, были перед вычислением лямбда-вызова. Весь этот процесс называют лямбда-преобразованием.

Объединение лямбда-вызовов Лямбда-вызовы можно свободно объединять между собой и другими формами. Вложен­ные лямбда-вызовы можно ставить как на место тела лямбда-выражения, так и на место фактических параметров. ((lambda (y) ((lambda (x) (list (y x)) ВНУТРЕННИЙ))ВНУТРЕННИЙ)) ВНЕШНИЙ)ВНЕШНИЙ) (ВНЕШНИЙ ВНУТРЕННИЙ)

лямбда-выражение без аргументов (фактических параметров) представляет собой лишь определение, но не форму, которую можно вычислить. Само по себе оно интерпретатором не воспринимается: _(lambda (x у) (cons x (cons у nil))) Error: Undefined function LAMBDA Лямбда-выражение - это безымянная функция, которая пропадает тотчас после вычисления значения формы.

DEFUN дает имя описанию функции Дать имя и определить новую функцию можно с помощью функции DEFUN. (DEFUN имя лямбда-список тело) Что можно представить себе как сокращение записи (DEFUN имя лямбда-выражение), из которой для удобства исключены внешние скобки лямбда-выражения и сам атом LAMBDA. Например: (defun list1 (lambda (х у) (cons x (cons у nil)))) (defun list1(x у) (cons x (cons у nil)))

Значением этой формы является имя новой функции: _(defun list1 (x y) (cons x (cons y nil))) LIST1 (list1 a b) (A B)

SYMBOL-FUNCTION выдает определение функции Предикат BOUNDP проверяет наличие у символа значения. Соответственно предикат FBOUNDP проверяет, связано ли с символом определение функции: -(boundp 'list1) Т Значение символа можно было получить при помощи функции SYMBOL-VALUE. Аналогично функция SYMBOL-FUNCTION дает определение функции, связанное с символом: _(symbol-function 'list1) (LAMBDA (X Y) (CONS X (CONS Y NIL)))

Символ может одновременно именовать некоторое значение и функцию, и эти возможности не мешают друг другу. Позиция символа в выражении определяет его интерпретацию: (setq list1 'a) А (list1 list1 'b) (А В)

Упражнения 1. Определите с помощью лямбда- выражения функцию, вычисляющую х+у- х*у. 2.Вычислите значения следующих лямбда-вызовов: a)((lambda (x) (cons x NIL)) 'у) b)((lambda (x у) (list у х)) 'х у) c)((lambda (x) (list x)) (list NIL)) d)((lambda (x) (list x)) d)((lambda (x) (list x)) e) ((lambda (x) (list x)) (list NIL)))

3.Определите функции (CADDR х) и (LIST xl х2 хЗ) с помощью базовых функций. (Используйте имена CADDR1 и LIST1, чтобы не переопределять одноименные встроенные функции системы Коммон Лисп.) 4.Определите функцию (НАЗОВИ х у), которая определяет функцию с именем, заданным аргументом х, и лямбда- выражением у. Определите с помощью этой функции функцию, вычисляющую сумму квадратов двух чисел, и саму функцию НАЗОВИ.