123
Рассмотрим теорию Черча более подробно. Основным понятием в
лямбда-исчислении является понятие выражения или формулы. Его можно
определить рекурсивно. Прежде всего, зафиксируем набор
идентификаторов, которые в дальнейшем будем называть переменными.
Мы будем использовать в качестве имен латинские буквы x, y, f и др. В
формулах переменные обычно обозначают аргументы функций,
задаваемых лямбда-выражениями, однако сама по себе переменная
является простейшим видом выражения. Два других вида выражений – это
определение безымянной функции (лямбда-выражение) и применение
функции.
Лямбда-выражение имеет вид (λx.e), где x - имя переменной, а e -
выражение. Семантически такое выражение обозначает функцию с
аргументом x и телом e. Применение функции
записывается в виде (e1 e2),
где e1 и e2 - выражения (e1 - функция, а e2 - ее аргумент). Приведем
несколько примеров.
λx.x – простейшая функция, выдающая свой аргумент; скобки
опущены, поскольку это не вызывает неоднозначности.
λf.λx.f x – функция с двумя аргументами, применяющая свой первый
аргумент ко второму. Строго говоря, надо было бы расставить скобки
,
чтобы выражение приняло вид λf.(λx.(f x)), однако, принято соглашение, по
которому "операция" применения функции к аргументу имеет более
высокий приоритет, чем "операция" образования лямбда-выражения, при
этом функции применяются в порядке слева направо, то есть выражение f x
y понимается как применение функции f к аргументу x, и применение
полученного
результата к аргументу y.
(λx.x x)(λx.x x) – применение функции, заданной лямбда-выражением
(λx.x x), к аргументу, представляющему собой такое же лямбда-выражение.
Внутри тела, задающего лямбда-выражение, аргумент x применяется к
себе.
Мы будем рассматривать не классическое лямбда-исчисление, в
котором кроме функций и их применений к другим функциям больше
ничего нет, а некоторое его расширение. В нашем расширенном лямбда-
исчислении помимо безымянных функций, заданных лямбда-
выражениями, будут использоваться константы, смысл которых задан вне
лямбда-исчисления. Это будут привычные нам по языкам
программирования константы, обозначающие целые числа, символы и
логические значения, константа, обозначающая пустой список NIL (этим
идентификатором мы будем обозначать
объект, который ранее в языке
Haskell, всегда обозначался нами парой квадратных скобок []), а также
константы, задающие обозначения примитивных функций. Примитивные
функции нашей системы следует рассмотреть особо.
Многие примитивные функции уже хорошо нам знакомы по языку
Haskell и многим другим языкам программирования. Это обычные