FP / Jazyk Lambda

Jazyk λ

Funkcionálne programovanie

Čo to je?

Motivácia

Entscheidungs­problem

Formálna definícia algoritmu

  1. Kurt Gödel
    Čiastočne rekurzívne funkcie (1933)
  2. Alonzo Church
    λ kalkul (1936)
  3. Alan Turing
    Turingov stroj (1936)

Všetky sú ekvivalentné — Churchova–Turingova téza

Turingov stroj

$$ {\displaystyle M=\langle Q,\Gamma ,b,\Sigma ,\delta ,q_{0},F\rangle } $$

Výraz λ


expression ::= name                     variable
            |  expression expression    application
            |  λ name . expression      abstraction
            |  ( expression )           grouping

Aplikácia

Abstrakcia

Haskell

Transformácie

  1. Zámena alfa (α) — premenovanie premennej
    λa.a bλy.y b
  2. Zámena beta (β) — „dosadenie“
    (λa.a b) ff b
  3. Zámena eta (η)
    (λa.f a)f

Iba pre viazané premenné. Voľné premenné musia zostať voľnými.

Konflikt mien

(λ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

Redukcia

(λa.λb.a b) (λc.c) d
(λb.(λc.c) b) d
(λc.c) d
d

A čo hodnoty?

Iba funkcie!

Church encoding

True & False

if then else

Operátory

Kombinátory

Kombinátor — abstrakcia lambda bez voľných premenných.

K I(λa.λb.a) (λa.a)λb.(λa.a)λa.(λb.b)KI

Boolovské operácie pomocou kombinátorov

Čísla

Čísla

0 = false

Ďalšie čísla

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

Operátory

Ďalší kombinátor

Rekurzia?

Faktoriál

Faktoriál

Y combinator

Y = (λh.(λx.h (x x)) (λx.h (x x)))

Y g = … = g (Y g)

Kombinátory

Kombinátory

S K I

Všetky funkcie je možné vyjadriť pomocou troch kombinátorov:

Alebo dokonca dvoch, lebo I = S K K

Haskell

GHC

Iné jazyky