Анонимная рекурсия
Комбинатор с фиксированной точкой - это функция высшего порядка, fix
которая по определению удовлетворяет эквивалентности
forall f. fix f = f (fix f)
fix f
представляет собой решение уравнения x
с фиксированной точкой
x = f x
Факториал натурального числа может быть доказан
fact 0 = 1
fact n = n * fact (n - 1)
Используя fix
произвольные конструктивные доказательства над общими / µ-рекурсивными функциями, можно получить без одноименной самоссылки.
fact n = (fix fact') n
где
fact' rec n = if n == 0
then 1
else n * rec (n - 1)
такой, что
fact 3
= (fix fact') 3
= fact' (fix fact') 3
= if 3 == 0 then 1 else 3 * (fix fact') (3 - 1)
= 3 * (fix fact') 2
= 3 * fact' (fix fact') 2
= 3 * if 2 == 0 then 1 else 2 * (fix fact') (2 - 1)
= 3 * 2 * (fix fact') 1
= 3 * 2 * fact' (fix fact') 1
= 3 * 2 * if 1 == 0 then 1 else 1 * (fix fact') (1 - 1)
= 3 * 2 * 1 * (fix fact') 0
= 3 * 2 * 1 * fact' (fix fact') 0
= 3 * 2 * 1 * if 0 == 0 then 1 else 0 * (fix fact') (0 - 1)
= 3 * 2 * 1 * 1
= 6
Это формальное доказательство того, что
fact 3 = 6
методично использует эквивалентность комбинатора с фиксированной запятой для переписывания
fix fact' -> fact' (fix fact')
Лямбда-исчисление
Нетипизированная лямбда - исчисление формализм состоит в контекстно-свободной грамматике
E ::= v Variable
| λ v. E Abstraction
| E E Application
где v
колеблется над переменными, вместе с правилами сокращения бета и эта
(λ x. B) E -> B[x := E] Beta
λ x. E x -> E if x doesn’t occur free in E Eta
Бета-редукция заменяет все свободные вхождения переменной x
в теле абстракции («функция») B
выражением («аргумент») E
. Eta сокращение устраняет избыточную абстракцию. Иногда это исключается из формализма. Неприводимое выражение, к которому не применяется ни одно правило сокращения, находится в нормальной или канонической форме .
λ x y. E
это сокращение для
λ x. λ y. E
(абстракция мультиарность),
E F G
это сокращение для
(E F) G
(приложение левого ассоциативности),
λ x. x
а также
λ y. y
являются альфа-эквивалентны .
Абстракция и приложение - это только два «языковых примитива» лямбда-исчисления, но они позволяют кодировать произвольно сложные данные и операции.
Церковные цифры представляют собой кодировку натуральных чисел, сходных с пеаноаксиоматическими натуралами.
0 = λ f x. x No application
1 = λ f x. f x One application
2 = λ f x. f (f x) Twofold
3 = λ f x. f (f (f x)) Threefold
. . .
SUCC = λ n f x. f (n f x) Successor
ADD = λ n m f x. n f (m f x) Addition
MULT = λ n m f x. n (m f) x Multiplication
. . .
Формальное доказательство того, что
1 + 2 = 3
используя правило перезаписи бета-сокращения:
ADD 1 2
= (λ n m f x. n f (m f x)) (λ g y. g y) (λ h z. h (h z))
= (λ m f x. (λ g y. g y) f (m f x)) (λ h z. h (h z))
= (λ m f x. (λ y. f y) (m f x)) (λ h z. h (h z))
= (λ m f x. f (m f x)) (λ h z. h (h z))
= λ f x. f ((λ h z. h (h z)) f x)
= λ f x. f ((λ z. f (f z)) x)
= λ f x. f (f (f x)) Normal form
= 3
Комбинаторы
В лямбда-исчислении комбинаторы - это абстракции, которые не содержат свободных переменных. Проще всего: I
тождественный комбинатор
λ x. x
изоморфна тождественной функции
id x = x
Такие комбинаторы являются примитивными операторами исчислений комбинаторов, таких как система SKI.
S = λ x y z. x z (y z)
K = λ x y. x
I = λ x. x
Бета-снижение не сильно нормализуется ; не все приводимые выражения, «redexes», сходятся к нормальной форме при бета-редукции. Простой пример - расходящееся применение ω
комбинатора омега
λ x. x x
к себе:
(λ x. x x) (λ y. y y)
= (λ y. y y) (λ y. y y)
. . .
= _|_ Bottom
Сокращение крайних левых подвыражений («головы») является приоритетным. Аппликативный порядок нормализует аргументы перед заменой, нормальный порядок - нет. Эти две стратегии аналогичны активной оценке, например, C, и ленивой оценке, например, Haskell.
K (I a) (ω ω)
= (λ k l. k) ((λ i. i) a) ((λ x. x x) (λ y. y y))
расходится под стремительное снижение бета аппликативного порядка
= (λ k l. k) a ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ y. y y) (λ y. y y))
. . .
= _|_
т.к. в строгой семантике
forall f. f _|_ = _|_
но сходится при ленивом уменьшении бета нормального порядка
= (λ l. ((λ i. i) a)) ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ x. x x) (λ y. y y))
= a
Если выражение имеет нормальную форму, бета-редукция нормального порядка найдет его.
Y
Существенное свойство комбинатора с Y
фиксированной точкой
λ f. (λ x. f (x x)) (λ x. f (x x))
дан кем-то
Y g
= (λ f. (λ x. f (x x)) (λ x. f (x x))) g
= (λ x. g (x x)) (λ x. g (x x)) = Y g
= g ((λ x. g (x x)) (λ x. g (x x))) = g (Y g)
= g (g ((λ x. g (x x)) (λ x. g (x x)))) = g (g (Y g))
. . . . . .
Эквивалентность
Y g = g (Y g)
изоморфен
fix f = f (fix f)
Нетипизированное лямбда-исчисление может кодировать произвольные конструктивные доказательства над общими / µ-рекурсивными функциями.
FACT = λ n. Y FACT' n
FACT' = λ rec n. if n == 0 then 1 else n * rec (n - 1)
FACT 3
= (λ n. Y FACT' n) 3
= Y FACT' 3
= FACT' (Y FACT') 3
= if 3 == 0 then 1 else 3 * (Y FACT') (3 - 1)
= 3 * (Y FACT') (3 - 1)
= 3 * FACT' (Y FACT') 2
= 3 * if 2 == 0 then 1 else 2 * (Y FACT') (2 - 1)
= 3 * 2 * (Y FACT') 1
= 3 * 2 * FACT' (Y FACT') 1
= 3 * 2 * if 1 == 0 then 1 else 1 * (Y FACT') (1 - 1)
= 3 * 2 * 1 * (Y FACT') 0
= 3 * 2 * 1 * FACT' (Y FACT') 0
= 3 * 2 * 1 * if 0 == 0 then 1 else 0 * (Y FACT') (0 - 1)
= 3 * 2 * 1 * 1
= 6
(Умножение отложено, слияние)
Было показано, что для нетипизированного лямбда-исчисления Черча существует рекурсивно перечисляемая бесконечность комбинаторов с фиксированной запятой Y
.
X = λ f. (λ x. x x) (λ x. f (x x))
Y' = (λ x y. x y x) (λ y x. y (x y x))
Z = λ f. (λ x. f (λ v. x x v)) (λ x. f (λ v. x x v))
Θ = (λ x y. y (x x y)) (λ x y. y (x x y))
. . .
Бета-редукция нормального порядка делает нерасширенное нетипизированное лямбда-исчисление системой полного переписывания по Тьюрингу.
В Haskell элегантно реализован комбинатор с фиксированной точкой
fix :: forall t. (t -> t) -> t
fix f = f (fix f)
Лень Хаскелла нормализуется до конечности до того, как все подвыражения будут оценены.
primes :: Integral t => [t]
primes = sieve [2 ..]
where
sieve = fix (\ rec (p : ns) ->
p : rec [n | n <- ns
, n `rem` p /= 0])