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

Лекция 5

ФУНКЦИОНАЛЬНАЯ КОНЦЕПЦИЯ ПРОГРАММИРОВАНИЯ

Вычислительная модель, в которой программа рассматривается как множество определений функций, называется функциональной моделью ([3]). Эта модель основана на языке равенств и на операционном понимании равенств как правил редукций или правил переписывания термов. Равенствами называются формулы специального вида p=q, где p и q - термы. Под термами понимаются выражения, построенные синтаксически правильным способом из символов (имен) функций, переменных и констант (например, f(x)=x2-x+5). Программа предстает как пара (Е,Т), где Е - конечный набор равенств, Т - исходный терм, а вычислительный процесс, порождаемый этой программой состоит из повторяющихся переписываний исходного терма до тех пор, пока это возможно. В последнем случае говорят о нормализуемости терма в его нормальную форму (т.е. итоговый терм,к которому неприменима никакая аксиома из Е) рассматривается как итоговый результат вычислений.

В равенства могут вкладываться самые различные математические смыслы [90], [101]. На равенства можно смотреть, например, как на утверждения, описывающие свойства объектов или как на уравнения. Заметим, что в последнем случае неизвестными могут считаться функции, и тогда равенства выступают в роли определений функций. Подобное многообразие смыслов порождает многообразие дескриптивных семантик языка равенств. Можно смотреть на равенства как на формулы некоторого логического (эквационального) исчисления, если нас интересует факт выводимости формулы из заданного набора аксиом, либо факт ее истинности в соответствующей математической структуре (теоретико-модельная семантика).

Эквациональной называется логика, в которой формулами являются только равенства. Законы (аксиомы и правила вывода) эквациональной логики выражают естественные свойства равенства - рефлексивность, симметричность, транзитивность и подстановочность:

1. p=p

2. p=q => q=p

3. p=q, q=t => p=t

4. p1=q1, ..., pn=qn => f(p1,...,pn)=f(q1,...,qn),

где p, q, t, pi, qi - выражения, f - символ функции, а символ => обозначает логический вывод.

Взгляд на равенства как на определения функций позволяет определить другую дескриптивную семантику - семантику наименьшей неподвижной точки или как ее еще называют денотационную семантику [6], [45], [53], [68], [88], [91], [152], [153]. Денотационная семантика рассматривает равенство как функциональное уравнение относительно функциональной переменной f и определяет соответствующую функцию не процессом ее вычисления, а как решение этого уравнения (если решений несколько, то выбирается одно - "наименьшее").

Среди функциональных моделей наиболее известной является бестиповое лямбда-исчисление [6], используемое в программировании главным образом в двух целях: для описания точных семантик (денотационная и операционная) языков программирования высокого уровня и для построения различных моделей вычисления языков программирования (например, Лисп [46], SHEME [154], GEDANCEN [147], ML [130], [141], HOPE [119] и др. ([156]...).

Бестиповое лямбда-исчисление ([17], [151]) является одним из первых логико-математических формализмов, где функции трактуются как вычислительные предписания. Применение функции к аргументам дает единственный определенный результат. В лямбда-исчислении все вычислительные предписания образуют единую неструктурированную совокупность, где основной операцией является операция применения (аппликации) функции к аргументу (имеется еще операция лямбда-абстракции).

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

С точки зрения моделирования семантики предметной области функциональная модель обладает как операционной, так и дескриптивной семантикой: функциональную программу можно рассматривать как вычислительное предписание и как конструктивное определение искомого объекта. В отличие от процедурного, функциональное программирование имеет теоретико-доказательное происхождение. Модель предметной области при функциональном подходе представляется набором определений функций, как правило, рекурсивных. Как и в процедурной модели, программа представляет собой запрос на решение одной задачи.

Привлекательны следующие особенности функционального программирования:

- языки функционального программирования относятся к "что-языкам" [36], в отличие от процедурных "как-языков" (см. описание процедурной модели);

- функциональное программирование обладает свойством прозрачности по ссылкам (функциональности), означающим, что каждое выражение языка определяет единственную величину, которую нельзя изменить ни путем вычисления, ни путем совместного использования различными функциями; в функциональных языках отсутствуют "побочные эффекты" - динамические изменения значений переменных в процессе вычислений;

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

- функциональные программы пригодны для формальных преобразований с целью их оптимизации;

- системы функционального программирования поддаются естественному распараллеливанию и могут реализовываться на параллельных ЭВМ.

Языки программирования.

Lisp

LISP

1) Алфавит.

Буквы: a-z, A-Z.

Цифры: 0-9.

Ограничители: ( ) . пробел nl

Прочие литеры: + - * / , : ; =

2) Атомы.

Атомом называется произвольная последовательность букв, цифр и/или прочих литер, заключенная между двумя ограничителями (не включая самих ограничителей). Атомы служат для обозначения объектов (констант, переменных, функций) в лисп-программах.

3) Списки.

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

Примеры: (A B C D E) (CAR (QUOTE (P Q R))) (1 (2 3) 7) ()

4) Выражения.

Выражение - это атом или список. Некоторые выражения (константы, переменные, наименования функций и обращения к функциям) могут иметь значения. Значениями выражений являются сами выражения.

5) Функции.

Обращение к функции F(X, Y, Z) в Лиспе записывается так: (F X Y Z). Оно имеет вид списка, первым элементом которого является атом - наименование функции, а следующими - аргументы данного обращения. Функции могут не иметь аргументов.

6) Функция QUOTE.

Функция QUOTE возвращает в качестве значения свой аргумент. Служит для обозначения списков, которые не являются обращениями к функциям.

Примеры: (QUOTE A) Ґ A (QUOTE (P Q R)) Ґ (P Q R)

7) Функция CAR.

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

Примеры: (CAR(QUOTE (P Q R))) Ґ P

8) Функция CDR.

Аргументом функции CDR является список. Функция CDR возвращает в качестве значения этот список без первого элемента (хвост списка).

Примеры: (CDR(QUOTE (P Q R))) Ґ R (CDR(QUOTE (P))) Ґ ()

9) Пустой список.

Пустой список обозначается () или NIL. Значения функций CAR(NIL) и CDR(NIL) не определены.

10) Функция CONS.

Аргументами функции CONS являются два списка. Функция CONS возвращает в качестве значения список, составленный из последовательного соединения списков-аргументов.

Примеры: (CONS (QUOTE (A B C)) (QUOTE (P Q R))) Ґ (A B C P Q R)

11) Логические значения и предикаты.

Логические значения обозначаются специальными атомами-константами: истина - T, ложь - NIL. Функции, вырабатывающие логические значения называются предикатами, выражения, принимающие только эти значения - логическими выражениями. Во всех случаях использования логических выражений за истину принимается любое значение, отличное от NIL, а не только значение T. Благодаря этому соглашению фактически любая функция может служить предикатом, а любое выражение можно считать логическим.

12) Функция ATOM.

Аргументом предиката ATOM является любое выражение. Функция ATOM возвращает T, если ее аргумент - атом, в противном случае - NIL.

Примеры: (ATOM (QUOTE (A B C))) Ґ T

13) Функция EQ.

У предиката EQ два аргумента, значение по крайней мере одного из которых должно быть атомом. Функция EQ возвращает T, если второй аргумент тоже атом и их значения совпадают, во всех других случаях - NIL.

Примеры: (EQ T NIL) Ґ NIL (EQ T (QUOTE T)) Ґ T

14) Условные выражения. Функция COND.

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

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

(COND (p1 e1) (p2 e2) ... (pn en)),

где p1, p2, ..., pn - логические, а e1, e2, ..., en - произвольные выражения.

Вычисление значения функции COND происходит следующим образом. Вначале вычисляется значение предиката p1. Если оно не равно NIL, то значение функции COND принимается равным e1. В противном случае вычисляем p2 и т. д. Если значения всех логических выражений p1, p2, ..., pn равны NIL, то значение функции COND принимается равным NIL.

Примеры: (COND ((ATOM Y) NIL) (T T)) Ґ T, если значение переменной Y не атом, в противном случае NIL.

15) Определяющие выражения функций.

Общий вид определяющего выражения функции:

(LAMBDA (x1 x2 ... xm) e),

где x1, x2, ..., xm - связанные переменные (аргументы) функции, а e - выражение, служащее для вычисления значения функции (тело функции).

Примеры: (LAMBDA (Y) (COND ((ATOM Y) NIL) (T T))).

16) Функции SEXPR и SFEXPR.

Эти функции связывают наименования функций с определяющими выражениями. Обращения к ним имеют вид:

(SEXPR fn de)

(SFEXPR fn de)

где fn - определяемое наименование функции (атом), а de - определяющее выражение.

Пусть одна из этих функций связала наименование fn с определяющим выражением de, которое имеет вид

(LAMBDA (x1 x2 ... xm) e)

Тогда становится возможным обращение к функции fn с помощью выражения вида

(fn a1 a2 ... am)

если fn была связана с de функцией SEXPR то обращение (fn a1 a2 ... am) обозначает

(de a1 a2 ... am)

если fn была связана с de функцией SFEXPR то обращение (fn a1 a2 ... am) обозначает

(de (QUOTE a1) (QUOTE a2) ... (QUOTE am))

Примеры: факториал

(SEXPR fac

(LAMBDA(x) (

COND ((EQ x (QUOTE 0)) (QUOTE 1))

(T (* x (fac (- x (QUOTE 1)))))

)))