Funkcionálne programovanie
Všetky sú ekvivalentné — Churchova–Turingova téza
$$ {\displaystyle M=\langle Q,\Gamma ,b,\Sigma ,\delta ,q_{0},F\rangle } $$
expression ::= name variable
| expression expression application
| λ name . expression abstraction
| ( expression ) grouping
f a
f (g b)
f a b
≡ (f a) b
λa.b
λa.f x
λa.λb.a
≡ λa.(λb.a)
(λa.b) x
(λa.λb.a) x y
≡ ((λa.(λb.a)) x) y
\a -> b
\a -> f x
\a -> \b -> a
≡ \a -> (\b -> a)
(\a -> b) x
(\a -> \b -> a) x y
≡ ((\a -> (\b -> a)) x) y
λa.a b
↔ λy.y b
(λa.a b) f
↔ f b
(λa.f a)
↔ f
Iba pre viazané premenné. Voľné premenné musia zostať voľnými.
(λa.λb.a b) b c
→ (λb.b b) c
— nesprávne
(λa.λb.a b) b c
— zámena alfa
→ (λa.λx.a x) b c
— zámena beta
→ (λx.b x) c
— zámena beta
→ b c
(λa.λb.a b) (λc.c) d
→ (λb.(λc.c) b) d
→ (λc.c) d
→ d
true = λx.λy.x
false = λx.λy.y
ifThenElse = λp.λt.λe.p t e
ifThenElse = λp.p
and = λa.λb.a b False = λa.λb.a b a
or = λa.λb.a True b = λa.λb.a a b
not = λp.λa.λb.p b a
Kombinátor — abstrakcia lambda bez voľných premenných.
I = λa.a
— funkcia id
M = D = λf.f f
K = λa.λb.a
— funkcia const
KI = λa.λb.b
C = λf.λa.λb.f b a
— funkcia flip
K I
→ (λa.λb.a) (λa.a)
→ λb.(λa.a)
→ λa.(λb.b)
→ KI
true = λx.λy.x = K
false = λx.λy.y = KI
ifThenElse = λp.p = I
not = λp.λa.λb.p b a = C
0 = λf.λx.x
1 = λf.λx.f x
2 = λf.λx.f (f x)
3 = λf.λx.f (f (f x))
4 = λf.λx.f (f (f (f x)))
0 = false
succ = λn.λf.λx.f (n f x)
succ 2
→ (λn.λf.λx.f (n f x)) (λf.λx.f (f x))
→ alfa
→ (λn.λf.λx.f (n f x)) (λa.λb.a (a b))
→ λf.λx.f ((λa.λb.a (a b)) f x)
→ λf.λx.f ((λb.f (f b)) x)
→ λf.λx.f (f (f x))
= 3
add = λn.λk.n succ k
mult = λn.λk.λf.n (k f)
pow = λn.λk.k n
B = λf.λg.λa.f (g a)
— kompozícia (.
)succ = λn.λf. B f (n f)
mult = B
fact = λn. (isZero n) 1 (mult n (fact (pred n)))
fact' = λf.λn. (isZero n) 1 (mult n (f (pred n)))
fact = Y fact'
Y = (λh.(λx.h (x x)) (λx.h (x x)))
Y g = … = g (Y g)
Všetky funkcie je možné vyjadriť pomocou troch kombinátorov:
S = λf.λg.λa.f a (g a)
K = λa.λb.a
I = λa.a
Alebo dokonca dvoch, lebo I = S K K
λa.a
≡ \a -> a
id = \a -> a
≡ id a = a
const = \a -> \b -> a
≡ const a b = a