Rekursi anonim
Combinator titik tetap adalah fungsi tingkat tinggi fix
yang menurut definisi memenuhi kesetaraan
forall f. fix f = f (fix f)
fix f
merupakan solusi x
untuk persamaan titik tetap
x = f x
Faktorial dari bilangan alami dapat dibuktikan dengan
fact 0 = 1
fact n = n * fact (n - 1)
Menggunakan fix
, bukti konstruktif sewenang-wenang atas fungsi-fungsi umum / μ-rekursif dapat diturunkan tanpa referensialitas diri yang tidak simultan.
fact n = (fix fact') n
dimana
fact' rec n = if n == 0
then 1
else n * rec (n - 1)
seperti yang
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
Ini bukti resmi itu
fact 3 = 6
secara metodis menggunakan kesetaraan combinator titik tetap untuk penulisan ulang
fix fact' -> fact' (fix fact')
Kalkulus Lambda
The untyped lambda kalkulus formalisme terdiri dalam tata bahasa bebas konteks
E ::= v Variable
| λ v. E Abstraction
| E E Application
di mana v
rentang variabel, bersama dengan aturan pengurangan beta dan eta
(λ x. B) E -> B[x := E] Beta
λ x. E x -> E if x doesn’t occur free in E Eta
Pengurangan beta menggantikan semua kemunculan variabel bebas x
dalam tubuh abstraksi ("fungsi") B
dengan ekspresi ("argumen") E
. Reduksi Eta menghilangkan abstraksi yang berlebihan. Kadang-kadang dihilangkan dari formalisme. Sebuah tereduksi ekspresi, yang tidak ada aturan pengurangan berlaku, dalam yang normal atau bentuk kanonik .
λ x y. E
adalah singkatan
λ x. λ y. E
(aneka ragam abstraksi),
E F G
adalah singkatan
(E F) G
(aplikasi-asosiasi kiri),
λ x. x
dan
λ y. y
adalah alpha-setara .
Abstraksi dan aplikasi adalah dua-satunya "bahasa primitif" dari kalkulus lambda, tetapi mereka memungkinkan pengkodean data kompleks kompleks dan operasi.
Angka-angka Gereja adalah pengkodean bilangan alami yang mirip dengan alami-aksiomatik Peano.
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
. . .
Bukti formal itu
1 + 2 = 3
menggunakan aturan penulisan ulang reduksi beta:
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
Combinators
Dalam kalkulus lambda, kombinator adalah abstraksi yang tidak mengandung variabel bebas. Paling sederhana I
:, penggabung identitas
λ x. x
isomorfik dengan fungsi identitas
id x = x
Combinator seperti itu adalah operator primitif dari calculin combinator seperti sistem SKI.
S = λ x y z. x z (y z)
K = λ x y. x
I = λ x. x
Pengurangan beta tidak sangat normal ; tidak semua ekspresi yang dapat direduksi, “redexes”, konvergen ke bentuk normal di bawah reduksi beta. Contoh sederhana adalah aplikasi divergen ω
kombinator omega
λ x. x x
untuk dirinya sendiri:
(λ x. x x) (λ y. y y)
= (λ y. y y) (λ y. y y)
. . .
= _|_ Bottom
Pengurangan subekspresi paling kiri ("kepala") diprioritaskan. Pesanan aplikatif menormalkan argumen sebelum substitusi, pesanan normal tidak. Kedua strategi ini analog dengan evaluasi yang bersemangat, misalnya C, dan evaluasi malas, misalnya Haskell.
K (I a) (ω ω)
= (λ k l. k) ((λ i. i) a) ((λ x. x x) (λ y. y y))
menyimpang di bawah pengurangan beta aplikasi-order bersemangat
= (λ 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))
. . .
= _|_
karena dalam semantik yang ketat
forall f. f _|_ = _|_
tetapi konvergen di bawah reduksi beta normal-order malas
= (λ l. ((λ i. i) a)) ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ x. x x) (λ y. y y))
= a
Jika ekspresi memiliki bentuk normal, reduksi orde normal beta akan menemukannya.
Y
Properti penting dari Y
combinator titik tetap
λ f. (λ x. f (x x)) (λ x. f (x x))
diberikan oleh
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))
. . . . . .
Kesetaraan
Y g = g (Y g)
isomorfik untuk
fix f = f (fix f)
Kalkulus lambda yang tidak diketik dapat menyandikan bukti konstruktif sewenang-wenang atas fungsi umum / μ-rekursif.
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
(Multiplikasi tertunda, pertemuan)
Untuk kalkulus lambda Gereja yang tidak diketik, telah terbukti ada tak terhingga jumlah tak terhitung dari kombinator titik tetap 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))
. . .
Pengurangan beta orde normal membuat kalkulus lambda tanpa tulisan yang tidak dibatasi menjadi sistem penulisan ulang Turing-complete.
Di Haskell, kombinator titik tetap dapat diterapkan secara elegan
fix :: forall t. (t -> t) -> t
fix f = f (fix f)
Kemalasan Haskell menjadi normal sebelum semua subekspresi dievaluasi.
primes :: Integral t => [t]
primes = sieve [2 ..]
where
sieve = fix (\ rec (p : ns) ->
p : rec [n | n <- ns
, n `rem` p /= 0])