====== Lambda kalkul ======
[[wp>Lambda calculus]]
===== Syntaxe a konvence =====
//E// =
  * //V// -- proměnná
  * (//E//₁ //E//₂) -- aplikace
  * λ(//V//.//E//) -- abstrakce, //V// je hlavička, //E// je tělo
----
  * %%((…((%%//E//₁ //E//₂) //E//₃)…) //Eₙ//) ~ //E//₁ //E//₂ //E//₃ … //Eₙ//
  * (λ//V//.(//E//₁ … //Eₙ//)) ~ λ//V//.//E//₁ … //Eₙ//
  * (λ//V//₁.(…(λ//Vₙ//.//E//))) ~ λ//V//₁ … //Vₙ//.//E//
===== Volné a vázané proměnné =====
Proměnná je //vázaná//, pokud se vyskutuje v (nejbližší) hlavičce lambda abstrakce. V opačném případě je proměnná //volná//.
  λx.xy(λx.x)y
   | |   | |
   +-+   +-+
===== Substituce =====
//E//[//E//′%%/%%//V//] (někdy také //E//[//V// := //E//′])
Nahrazení volných výskytů //V// v //E// za //E//′.
Žádná volná proměnná v //E//′ se nesmí po substituci stát vázanou!
Příklad:
  * λ//x//.//xy//[//vw//%%/%%//y//] = λ//x//.//xvw//
  * λ//x//.//xy//[//vw//%%/%%//x//] nelze, protože //x// je vázaná proměnná!
  * λ//x//.//xy//[//x//%%/%%//y//] nelze, protože //x// je vázaná proměnná!
===== α-konverze =====
Někdy také α-přejmenování.
Přejmenovává vázané proměnné.
Nesmí dojít k navázání volných proměnných!
Příklad:
  * λ//x//.//xy// → λ//z//.//zy//
  * λ//x//.//xy// → λ//y//.//yy// Došlo k navázání volných proměnných!
  * λ//x//.//xy// → λ//x//.//xz// //y// není vázaná proměnná (šlo o substituci)
===== β-redukce =====
Aplikace funkce, %%((%%λ//V//.//E//) //E//′) → //E//[//E//′%%/%%//V//].
    +--+
    |  V
  (λxy.xy)(ab) → λy.aby
    ^      |/
    |      |
    +------+
Opět pozor na vázané a volné proměnné! Volné proměnné v //E//′ se nesmí stást vázanými! Lze si pomoct α-přejmenováním a substitucí.
Příklad:
  * %%((%%λ//n//.//n//×2) 7) → 7×2
===== η-konverze =====
λ//V//.(//EV//) → //E// (//V// není volné v //E//)
===== Ekvivalence =====
  * Výrazy jsou //identické//((≡)), když jsou zapsané stejnou posloupností symbolů.
  * Výrazy jsou si //rovné//((%%=%%)), pokud se dají konverzemi a redukcemi převést na identické výrazy.