говорит о том, что мы дали обозначение
пользоваться ею для удобства.
Логические значения
Суть логических значений заключается в операторе
ветвление алгоритма. Есть два терма
=
=
Термы
=
=
=
220 | Глава 14: Лямбда-исчисление
Проверим выполнение свойств:
Свойства выполнены. Логические константы кодируются постоянными функциями двух аргументов.
Функция True возвращает первый аргумент, игнорируя второй. А функция False делает то же самое, но на-
оборот. В такой интерпретации логическое отрицание можно закодировать с помощью функции flip. Также
мы можем выразить и другие логические операции:
=
=
Мы определили логические значения не конкретными значениями, а свойствами функций. Мы построили
функции, которые ведут себя как логические значения. Этот способ определения напоминает, определение
класса типов. Мы объявили три метода
творять определённым свойствам, которые накладывают взаимные ограничения на методы класса. Ни один
из методов не имеет смысла по отдельности, важно то как они взаимодействуют.
Натуральные числа
Оказывается, что с помощью термов лямбда исчисления можно закодировать и натуральные числа с
арифметическими операциями. Мы будем кодировать числа Пеано. Для этого нам понадобится нулевой
элемент и функция определения следующего элемента. Их можно закодировать так:
=
=
Как и в случае логических значений числа кодируются функциями двух аргументов. Число определяется
по терму, подсчётом цепочки первых аргументов
И мы получили два вхождения первого аргумента в теле функции. Определим сложение и умножение.
Сложение принимает две функции двух аргументов и возвращает функцию двух аргументов.
В этой функции мы применяем
мы и получаем
В умножении чисел
Лямбда исчисление без типов | 221
Конструктивная математика
В конструктивной математике существование объекта может быть доказано только описанием алгорит-
ма, с помощью которого можно построить объект. Например доказательство методом “от противного” от-
вергается.
Лямбда исчисление строит конструктивное описание функции. По лямбда-терму мы можем не только
вычислять значения функции, но и понять как она была построена. В классической теории, функция это
множество пар (
По этому определению мы ничего не можем сказать о внутренней структуре функции. Мы можем со-
бирать из одних функций другие с помощью подстановки значений, но мы никак не сможем понять, что
находится внутри функции. Лямбда исчисление решает эту проблему.
Расширение лямбда исчисления
Предположим, что мы решили написать язык программирования на основе лямбда-исчисления. Было бы
очень неэффективно представлять числа с помощью чисел Пеано. Ведь у нас есть процессор и мы можем
спросить у него чему равно значение и получить ответ очень быстро.
В этом случае пользуются расширенным лямбда исчислением. В нём два типа примитивов это перемен-
ные и константы. Для констант мы можем определять специальные правила редукции. Например мы можем
дополнить исчисление константами:
+
И ввести для них правила редукции, которые запрашивают ответ у процессора:
=
Так же мы можем определить и константы для логических значений:
И определить правила редукции:
=
=
=
=
=
=