Anonim özyineleme
Sabit noktalı bir birleştirici, fix
tanım gereği denkliği karşılayan daha üst düzey bir işlevdir
forall f. fix f = f (fix f)
fix f
x
sabit nokta denklemine bir çözümü temsil eder
x = f x
Doğal bir sayının faktöriyeli,
fact 0 = 1
fact n = n * fact (n - 1)
fix
Genel / μ-özyinelemeli işlevler üzerinde keyfi yapıcı kanıtlar kullanılarak , adsız öz-referans olmadan türetilebilir.
fact n = (fix fact') n
nerede
fact' rec n = if n == 0
then 1
else n * rec (n - 1)
öyle ki
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
Bu resmi kanıt,
fact 3 = 6
yeniden yazma için yöntemsel olarak sabit nokta birleştirici eşdeğerini kullanır
fix fact' -> fact' (fix fact')
Lambda hesabı
Türlenmemiş lambda taşı formalizm bir serbest içerik oluşur
E ::= v Variable
| λ v. E Abstraction
| E E Application
burada v
birlikte, değişkenler üzerinde değişmektedir , beta ve eta indirgeme kuralları
(λ x. B) E -> B[x := E] Beta
λ x. E x -> E if x doesn’t occur free in E Eta
Beta indirgeme x
, soyutlamanın ("işlev") gövdesindeki değişkenin tüm serbest oluşumlarını B
ifade ("argüman") ile değiştirir E
. Eta azaltımı gereksiz soyutlamayı ortadan kaldırır. Bazen formalizmden çıkarılır. Bir indirgenemez azalma kuralı geçerli olduğu ifade, içinde , normal veya kanonik formu .
λ x y. E
için kestirme
λ x. λ y. E
(soyutlama çok yönlülüğü),
E F G
için kestirme
(E F) G
(başvuru sol ilişkilendirilebilirliği),
λ x. x
ve
λ y. y
olan alfa-eşdeğeri .
Soyutlama ve uygulama, lambda hesabının sadece iki “ilkel” i olmakla birlikte , keyfi olarak karmaşık verilerin ve işlemlerin kodlanmasına izin verir .
Kilise rakamları, Peano-aksiyomatik doğallara benzer doğal sayıların bir kodlamasıdır.
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
. . .
Resmi bir kanıt
1 + 2 = 3
beta indirgeme yeniden yazma kuralını kullanarak:
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
Lambda hesabında, birleştiriciler serbest değişken içermeyen soyutlardır. En basit haliyle: I
kimlik birleştirici
λ x. x
kimlik fonksiyonuna izomorfik
id x = x
Bu tür birleştiriciler , SKI sistemi gibi birleştirici taşlarının ilkel operatörleridir .
S = λ x y z. x z (y z)
K = λ x y. x
I = λ x. x
Beta azaltımı güçlü bir şekilde normalleştirilmemektedir ; indirgenebilir ifadelerin tümü değil, "redexes" beta indirgeme altında normal forma dönüşür. Basit bir örnek, omega ω
birleştiricinin farklı uygulamasıdır
λ x. x x
kendisine:
(λ x. x x) (λ y. y y)
= (λ y. y y) (λ y. y y)
. . .
= _|_ Bottom
En soldaki alt ifadelerin ("kafalar") azaltılmasına öncelik verilir. Geçerli emir ikame edilmeden önce argümanları normalleştirir, normal emir vermez. İki strateji, istekli değerlendirmeye, örneğin C'ye ve tembel değerlendirmeye, örneğin Haskell'e benzer.
K (I a) (ω ω)
= (λ k l. k) ((λ i. i) a) ((λ x. x x) (λ y. y y))
istekli uygulama siparişi beta indirgeme altında ayrılıyor
= (λ 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))
. . .
= _|_
katı anlambilimden beri
forall f. f _|_ = _|_
ancak tembel normal sıra beta azaltma altında yakınsar
= (λ l. ((λ i. i) a)) ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ x. x x) (λ y. y y))
= a
Bir ifadenin normal bir formu varsa, normal sıralı beta azaltma ifadeyi bulur.
Y
Sabit nokta birleştiricisinin temel özelliğiY
λ f. (λ x. f (x x)) (λ x. f (x x))
tarafından verildi
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))
. . . . . .
Denklik
Y g = g (Y g)
izomorfik
fix f = f (fix f)
Türlenmemiş lambda hesabı genel / μ-özyinelemeli işlevler üzerinde keyfi yapıcı kanıtları kodlayabilir.
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
(Çarpma gecikti, izdiham)
Kilisenin türetilmemiş lambda hesabı için, sabit nokta birleştiricilerinin tekrar tekrar numaralandırılabilir bir sonsuzluğu olduğu gösterilmiştir 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))
. . .
Normal dereceli beta azaltma, genişletilmemiş türsüz lambda hesabını bir Turing-complete yeniden yazma sistemi yapar.
Haskell'de sabit nokta birleştirici zarif bir şekilde uygulanabilir
fix :: forall t. (t -> t) -> t
fix f = f (fix f)
Haskell'in tembellikleri, tüm alt ifadeler değerlendirilmeden önce ince bir hal alır.
primes :: Integral t => [t]
primes = sieve [2 ..]
where
sieve = fix (\ rec (p : ns) ->
p : rec [n | n <- ns
, n `rem` p /= 0])