Анонімна рекурсія
Комбінатор з фіксованою точкою - це функція вищого порядку, 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. Зниження етапи виключає зайву абстракцію. Іноді від формалізму опускається. Неприводимого вираз, до якого не застосовується ні одне правило скорочення, знаходиться в нормальній або канонічної формі .
λ 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])