Анонімна рекурсія
Комбінатор з фіксованою точкою - це функція вищого порядку, 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])