Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТПфунк_Лекція_05_06_07.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
214 Кб
Скачать
☆

5.2. Аксиомы ламбда-исчисления

После определения алфавита и порядка построения допустимых ламбда-выражений посредством операций аппликации и абстракции перечислим аксиомы ламбда-исчисления.

5.2.1. Конвертируемость

Отметим, что символ "=" понимается в ламбда-исчислении как обозначение отношения конвертируемости, которым связываются соединенные этим значком ламбда-выражения.

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

Следующие аксиомы задают свойства отношения конвертируемости:

Аксиома () о возможности подстановки терма z (конкретизации ?) вместо всех вхождений переменной x в ламбда-выражение a.

() λx.a = λz.[z/x]a;

Аксиома (β) о возможности редукции (то есть упрощения вида) ламбда-выражения в левой части путем подстановки b вместо всех вхождений переменной x в ламбда-выражение a.

(β) (λx.a)b = [b/x]a.

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

Перечислим правила вывода термов, которые задают характеристики отношения конвертируемости:

(μ)

если a=b, то ca=cb

(ν)

если a=b, то ac=bc

(ξ)

если a=b, то λx.a=λx.b

(ρ)

a=a

рефлексивность - конвертируемость произвольного ламбда-выражения к самому себе

(σ)

если a=b, то b=a

симметричность - двунаправленность вывода ламбда-выражений посредством конверсии

(τ)

если a=b и b=c, то a=c

транзитивность - возможность опускать промежуточные этапы конверсии для цепочек вывода

Именно в силу фундаментальности отношения конвертируемости для ламбда-исчисления эта теория известна также под другим, более точно характеризующим ее суть названием, а именно, как исчисление ламбда-конверсий.

Соглашения об упрощении

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

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

1. Скобки для операции аппликации восстанавливаются по ассоциации влево, например:

xy = (xy), xyz = ((xy)z), ...

2. Избыточные скобки могут опускаться, например:

(xy) = xy, ((xy)z) = xyz, ...

3. Скобки для операции абстракции восстанавливаются по ассоциации вправо, например:

λxy.M = (λx.(λy.M)), λxyz.M = (λx.( λy.(λz.M))), ...

Примеры формального описания исчисления ламбда-конверсий

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

1

x

переменная

2

1

константа

3

λx.x

ламбда-абстракция переменного терма x к самому себе (определяет функцию тождества)

4

λx.x + 1

добавляет* к аргументу x константу 1, т.е. определяет функцию инкремента (прибавления единицы)

5

(λx.x + 1)2 = [2/x](x + 1) = 2+1 = 3

подстановка** согласно аксиоме () константы 2 вместо всех вхождений x в выражение x+1

6

a $ b

недопустим из-за вхождения неопределенного символа "$"

*Заметим, что в алфавите ламбда-исчисления отсутствует функция сложения как таковая, так что возможны различные интрепретации символа "+" (будем считать его далее "встроенной" функцией сложения).

**Вычисление значения функции в число 3 возможно при корректной интерпретации символа "+".

Соответствие между ламбда-исчислением и функциональным языком

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

Приведем фрагменты SML-программ, соответствующих допустимым ламбда-термам из предыдущего списка:

1

x

переменная, тип которой определяется в процессе трансляции на этапе контроля типизации в соответствии с выводом типов

2

1

константа

3

fn x => x

функция тождества

4

fn x => x+1

функция инкремента

5

(fn x => x+1) 2

вычисление значения функции, в результате выполнения получается целое число 3

Продолжим иллюстрацию соответствия между программами на языке SML и ламбда-выражениями.

В общем случае функция f языка программирования SML, имеющая формальный параметр x и тело b, задается следующим описанием:

fun f x = b;

Исследуем операцию аппликации функции к аргументу. Например, описание функции инкремента имеет вид:

fun f x = 1+x;

Для вычисления значения выражения необходимо произвести аппликацию функции к данному выражению; для аппликации функции f к целому числу 4 нужно записать:

f 4;

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

f 2 + 3;

означает порядок аппликации (f2)+3, а не f(2+3), т.е. находится в полном соответствии с соглашениями о скобках, принятыми в ламбда-исчислении.

Выводы по лекции 5

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

  1. лаконичность (ограниченный необходимыми элементами алфавит, два способа построения выражений – аппликация и абстракция, небольшое количество аксиом и правил вывода);

  2. интуитивная ясность (обозначения являются краткими и понятными);

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

  4. полнота (в ламбда-исчислении можно представить произвольную, в частности, сколь угодно сложную, функцию);

  5. естественная близость к языкам функционального программирования (SML, Scheme, Haskell, Miranda, Hope, Clean) была проиллюстрирована на примерах программ на языке SML.

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [24, 32, 39, 43, 44, 47, 58, 76].

Лекция 6. Комбинаторная логика как формальная система

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

Рассмотрим построение формальной системы логики. Заметим, что важнейшим понятием для любой формы комбинаторной логики является понятие комбинатора.