26 - Lambda kalkul (definice všech pojmů, operací...) Flashcards

1
Q

co je to Lambda kalkul

A
  • formální systém a výpočetní model používaný v teoretické informatice a matematice pro studium funkcí a rekurze
  • Lambda kalkul je teoretickým základem funkcionálního programování a příslušných programovacích jazyků, obzvláště Lispu
  • Dá se chápat jako jednoduchý univerzální programovací jazyk - lze pomocí tohoto formalismu vyjádřit libovolnou rekurzivně spočetnou funkci
  • lambda kalkul je tedy výpočetní silou ekvivalentní Turingovu stroji a parciálně rekurzivním funkcím
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Základní přehled lambda kalkul

A

každý výraz popisuje funkci jednoho argumentu, který je sám funkcí jednoho argumentu, a jejímž výsledkem je opět funkce jednoho argumentu

  • Funkce lze definovat bez pojmenování, uvedením lambda výrazu, který popisuje, jak se z hodnoty argumentu vypočte hodnota funkce
  • „přičti dvojku“, f(x) = x + 2. V lambda kalkulu se taková funkce zapíše jako λ x. x + 2 (nebo, beze změny významu λ y. y + 2, jméno argumentu není podstatné).
  • Aplikace takové funkce na číslo 3 se zapíše jako (λ x. x + 2) 3.
  • Aplikace je asociativní zleva: f x y = (f x) y
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

3 typy výrazů λ-kalkul

A

proměnné - Obyčejné proměnné, tak jak je známe z jiných jazyků, většinou se značí x, y, z. Definují vazbu s okolím

abstrakce (definice funkce) - reprezentuje funkci s JEDNOU vázanou proměnnou (hlavička) a tělem, které je tvořené λ − výrazem (např. λ x.x+2)
- pokud jich má mít víc, např. máme funkci g(x, y) = x − y, tak se to zapíše λ x. λ y . x − y. Toto se zkracuje (vnoření abstrakcí) na λ x y . x − y

aplikace (volání funkce) - f(x) = x + 2 se místo f(3) volá jako (f 3) tzn. nejdříve je uvedena funkce a poté její argumenty.
- Funkce f se v λ-kalkulu tedy zavolá takto: (λ x . x + 2) 3

Každý z těchto tří prvků se označuje jako λ-výraz – ty budu značit velkými písmeny
např. E a znamená to, že pod E se může skrývat buď proměnná, abstrakce (definice funkce) nebo aplikace (volání funkce).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Volné a vázané proměnné

A
vázaná = jedná se o parametr funkce
volná = pokud není vázaná

Proměnná se vždycky váže na nejbližsí lambdu směrem doleva!
takže ve výrazu (λ x ((λ x . x) w)) se proměnná x uprostřed výrazu váže na lambdu co je hned vlevo od ní a ne na tu úplně vlevo!
Proměnná w je samozřejmě volná

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Zjednodušování zápisu lambda kalkul

A
  • místo (A B) lze napsat A B
    • místo (λ V .(A B C)) lze napsat λ V . A B C
    • místo (λ F(λ G(λ H . x))) lze napsat jen λ F G H . x

pomocí LET. Např. LET K = λ x y . x a poté můžu K používat v jiných výrazech, např. to může být argument při volání funkce atd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Redukce (konverze)

A

Výraz, který je možné podle nějaké redukce změnit se nazývá redex podle zkratky z reducible expression. Jedná-li se o redex podle příslušné konverze, tak se nazývá α-, β-, či η-redexem.

α-konverze (alfa) - substituce (názvy proměnných nejsou důležité)

- Ovšem pozor, daná substituce musí být platná, což znamená, že se žádná volná proměnná nesmí stát vázanou (to by ve výsledku znamenalo změnu významu daného výrazu)
- Zapisujeme jako λ W . E [W/V ] (W za V)

	* Správně - λx.xy→_(α  ) λz.zy 
	* Špatně  - λx.xy→_(α  ) λy.yy 

β-konverze (beta) - volání funkce (substituce proměnné za parametr volané funkce :D)

- pozor, substituce musí být stále platná (nemůže se změnit význam funkce)
- (λ V . W) M - lze konvertovat na W [M/V ]

	* Správně - (λ xy.xy)(xy) →_α  (λ xz.xz)(xy) →_β (λ z.(xy)z) =λ z.xyz
	* Špatně - (λ xy.xy)(xy) →_β λ y.(xy)y

η-konverze (eta) - ekvivalence (odstranění abstrakce) - vlastně konvertujeme výraz s parametrem, který není vázaný
• Správně - λx.(uv)x→(η ) (uv), můžeme to udělat, jelikož ve výrazu (uv) není x volná.
• Špatně - λx.(xy)x→
(η ) (xy), nelze, jelikož x je ve výrazu (xy) volná.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Identita/Rovnost/Relace a normální forma

A
  • Identita: E_1≡E_2, stejné stringy
  • Rovnost: E_1=E_2, stejné výsledky
  • Relace: E_1→E_2, E_1 lze zredukovat na E_2

Normální forma (= vypočítání (maximální redukce))
• Výraz je v normální formě, pokud neobsahuje žádné β- ani η- redexy (výrazy, ktoré je možné změnit podle β- alebo η- konverze). Takže jediná konverze, kterou je možné vykonat je α-konverze.
• Výraz se převede do normální formy opakovanou redukcí (konverzí) nejlevějšího β- alebo η- redexu, případně α-konverzí abychom zabránili neplatné substituci.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Operátor pevného bodu

A

slouží k definování rekurze. (a platí pro něj: Y E = E(Y E))
• Definice: LET Y=λf.(λx.f(xx))(λx.f(xx))
• Bottom LET⊥=Y(λfx.f)

Bottom je výraz, který bude na výstup neustále produkovat sám sebe. V podstatě modeluje nekonečnou smyčku v programu.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Reprezentace pravdivostních hodnot a operací nad nimi

A
  • LET True=λxy.x
    • LET False=λxy.y
    • LET Not=λt.t False True (Not True=(λt.t False True)True→_β True False True→(λxy.x) False True→_β (λy.False)True→_β False)
    • AND = λuv.uv False (pokud je první hodnota True, tak vrať výsledek další hodnoty, jinak vrať False)
    • OR = λuv.u True v (pokud je první hodnota True, tak vracím rovnou True, jinak vracíme druhou hodnotu)
    ○ Ternární operátor (?:) = λctf.ctfPříklady
    • AND True False→(λuv.uv False)True False→True False False→(λxy.x) False False→False
    • OR False True→(λuv.u True v) False True→(λv.False True v)True→False True True→(λxy.y)True True→(λy.y)True→True
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Reprezentace čísel a operací nad nimi

A

Pro reprezentaci čísel v lambda kalkulu se používají Peanova (Pínova) čísla:
○ LET 0 = λfn.n = λfn.f^0 n
○ LET 1 = λfn.fn = λfn.f^1 n
○ LET 2 = λfn.f(fn) = λfn.f^2 n

LET succ = λxgm.xg(gm), následník musí přidat k číslu jedno f navíc.
LET iszero=λm.m(λv.False) True

How well did you know this?
1
Not at all
2
3
4
5
Perfectly