Výsledky domácích úloh

Tomáš Křen Martin Jiřička David Nohejl Klára Pešková poměrná obtížnost normalizovaná poměrná obtížnost
celkem: 83,49 37,83 9,68 1,87 63,72 50,00
Normální formy termu a podtermů 2 1 1 2,38 1,87
Implementace lambda kalkulu 2 1,5 1 2,38 1,87
Normalizující strategie 2 2 2,83 2,22
Aplikativní strategie 2 2 2,83 2,22
Call-by-need strategie 2 1 2,83 2,22
Rekurze 2 1 1 2,38 1,87
Překladač z lambda kalkulu 2 1,5 2,83 2,22
Delta-redukce 2 1,5 2,83 2,22
Churchovy booleovské hodnoty 1 1,5 1 2,38 1,87
Churchovy numerály – Fibonacci 2 1 2,83 2,22
Churchovy numerály – tetrace 2 3,36 2,64
Churchovy numerály – hyperoperace 2 3,36 2,64
Vzájemná rekurze v jiném jazyce 1,5 1 2,83 2,22
Vzájemná rekurze dvou funkcí 1,5 1 2,83 2,22
α-redukce při hledání principiální WHNF 1 3,36 2,64
redukce λ-termů do principiální slabé hlavní normální formy (WHNF) 1 3,36 2,64
Převod do SK kalkulu 1 1 1 2,38 1,87
Hindley-Milnerův systém s polymorfní rekurzí 1 3,36 2,64
Unifikace 1 3,36 2,64
Piercův zákon 2 3,36 2,64
1) 2 1 2,83 2,22
A ∧ (B ∧ C) → (A ∧ B) ∧ C 2 1 2,83 2,22

Domácí úlohy

Pro mou snažší orientaci prosím předmět zprávy uveďte „FP: “. Děkuji.
Jména řešitelů, kteří odevzdali úlohu do týdne, jsou označena *, těch co odevzdali do 2 týdnů +.
Zde najdete hodnocení úloh.

Lambda kalkulus - základy - 13. října 2011

Normální formy termu a podtermů

  1. Najděte termy M a N t.ž. N nemá normální formu a MN má normální formu.
  2. Najděte termy M a N t.ž. M nemá normální formu a MN má normální formu.

Nápověda: Použijte termy K = λxy.x a Ω = (λx.xx)(λx.xx).

Vyřešili: Tomáš Křen*, Martin Jiřička, David Nohejl.

Implementace lambda kalkulu

Reprezentujte lambda termy datovou strukturou a implementujte

  • substituci (s případným přejmenováním proměnných),
  • β-redukci.

Vyřešili: Tomáš Křen*, Martin Jiřička+.

Lambda kalkulus - 20. října 2011

Normalizující strategie

Implementujte normalizující strategii, ať už pro klasický λ-kalkulus nebo pro de Bruijnovu notaci.

Vyřešili: Tomáš Křen*, Martin Jiřička*.

Aplikativní strategie

Implementujte aplikativní strategii vyhodnocování. [Pokud implementujete obě strategie, zkuste najít term(y), na kterých se výrazně liší doba vyhodnocení.]

Vyřešili: Tomáš Křen*, Martin Jiřička*.

Call-by-need strategie

Implementujte línou call-by-need strategii. Při substituci termu budou jeho jednotlivé kopie sdíleny, a budou tak sdílet i (částečné nebo úplné) vyhodnocení.

  1. Ověřte, že výsledné vyhodnocování je líné pomocí nějakého termu, který má NF a zároveň má nějakou nekonečnou posloupnost redukcí.
  2. Najděte term, na kterém je strategie call-by-name neefektivní a ověřte, že vaše implementace call-by-need je efektivní.

Můžete také použít líný programovací jazyk (např. Haskell) a využít jeho líného vyhodnocování.

Vyřešili: Tomáš Křen*, Martin Jiřička.

Rekurze

Zapiště nějaký kombinátor pevného bodu (např. Y nebo Θ) a pomocí něj zapište funkci pro výpočet Fibonacciho posloupnosti, která sama o sobě nebude rekurzivní. Poznámky:

  • Použijete-li netypovaný jazyk umožňující zapisovat anonymní funkce (Python - lambda x: …, JavaScript - function(x) { … }, apod.), zapište kombinátor přímo v podobě odpovídající λ-termu.
  • Bude-li to jazyk s aplikativním vyhodnocováním, nahraďte v kombinátoru pod-termy typu x x termy λy.x x y, (tzv. jejich η-expanzi) abyste předešli zacyklení.
  • Použijete-li silně typovaný jazyk s líným vyhodnocováním (Haskell), bude zápis x x problematický. Proto kombinátor pevného bodu zapište přímo jeho rekurzivní definicí.
  • Použijete-li silně typovaný jazyk s aplikativním vyhodnocováním (Scala, OCaml, …), zapište kombinátor pevného bodu přímo jeho rekurzivní definici, kterou zabalíte pomocí η-expanze, tedy místo y = λf.(…) bude y = λf.λx.(…)x. Tím předejdete zacyklení.
  • Můžete použít také vlastní interpret λ-kalkulu z minulých cvičení.

Vyřešili: Tomáš Křen*, Martin Jiřička, David Nohejl.

Lambda kalkulus - 27. října 2011

Překladač z λ-kalkulu

Napište překladač z lambda termů do zvoleného jazyka. Vhodné jsou netypované jazyky umožňující vytvářet anonymní funkce, např. Python nebo JavaScript. Výsledné zpracování lambda termů tak bude aplikativní.

Vyřešili: Tomáš Křen*, Martin Jiřička+.

δ-redukce

Do interpretu/překladače λ-kalkulu přidejte konstantu # a pro každé n konstanty a pravidla:

  • δ n →δ cn
  • δ (# n) →δ n+1

Konverzi z cn zpět na číslo pak provedeme cn (λn.δ(#n)) 0

Poznámka: Stručný popis originální Churchovy δ-redukce zde.

Vyřešili: Tomáš Křen*, Martin Jiřička+ (s odřenýma ušima).

Churchovy booleovské hodnoty

Implementujte operace AND, OR, a NOT na Churchových booleovských hodnotách (true = λxy.x, false = λxy.y).

Vyřešili: Martin Jiřička+, Tomáš Křen, David Nohejl.

Churchovy numerály

Každý z následujících bodů je samostatné cvičení, které můžete zpracovat nezávisle na ostatních:

  1. Pomocí Y kombinátoru implementujte funkci počítající n-tý člen Fibonacciho posloupnosti v Churchových numerálech. Vyřešili: Tomáš Křen*, Martin Jiřička.
  2. Implementujte tetraci jako λ-term na Churchových numerálech. Vyřešili: Tomáš Křen*.
  3. Implementujte ternární funkci hyper-operace jako λ-term na Churchových numerálech. Pro jednoduchost začněte od násobení, tedy H(0,x,y)=x*y, H(1,x,y)=xy, H(2,x,y) je tetrace… Vyřešili: Tomáš Křen*.

Výsledky ověřte, například na překladači/interpretu, z předchozích úloh.

Úlohy po 3. listopadu 2011

Nové úlohy jsou na fóru!

1) A ∧ B) → C) ↔ (A → (B → C
Poslední úprava: 2012/02/06 20:28