Zadanie

Vaším zadaním je vymyslieť a vyriešiť príklady pre nasledujúce tematické okruhy:

1.) Netypovaný jazyk NBL. (1 príklad)

  • Formulácia vzorového termu t.
  • Konštruovanie stromu abstraktnej syntaxe.
  • Overenie, či term t patrí do jazyka termov NBL.
  • Identifikácia konštánt termu t.
  • Zistenie veľkosti termu t.
  • Výpočet hĺbky stromu abstraktnej syntaxe termu t.
  • Vyhodnotenie termu t.

2.) Netypovaný λ-kalkul.

  • Doplňte resp. odstráňte čo najviac zátvoriek z termov netypovaného λ-kalkulu. (2 príklady).
    • Vzor: (λx.x z) (λy.w) (λw.w y z x) = ((λx.(x z)) (λy.w)) (λw.(((w y) z) x))
  • Vyhodnotenie termov netypovaného λ-kalkulu (beta-redukcia). (2 príklady, aspoň jeden term s využitím alfa-redukcie a minimálne 4 kroky redukcie).
  • Vyhodnotiť 3 termy využitím Churchových kombinátorov. (aspoň 1 pre aritmetické operácie, 1 pre booleovské operácie, zároveň definujte aspoň jednu vlastnú funkciu a použite ju vo výpočte).
  • Rekurzia v netypovanom λ-kalkule. 1 príklad na rekurzívnu funkciu vypočítanú kombinátorom fixného bodu v netypovanom λ-kalkule (nie faktoriál a sčítanie - príklady z prednášky, resp. cvičenia).

3.) Typovaný jazyk NBL. (1 príklad)

  • Formulácia vzorového termu t.
  • Overenie, či term t je správne typovaný.
  • Vyhodnotenie termu t.

4.) Jednoducho typovaný λ-kalkul.

Jednoducho typovaný λ-kalkul

  • Rozšírte množinu základných typov o nový typ.
  • Rozšírte syntax $\lambda_\to$ o prvky takéhoto typu.
  • Rozšírte syntax $\lambda_\to$ o aspon 3 operácie nad takýmto typom a definujte k ním príslušné typovacie a vyhodnocovacie pravidlá.

Jednoducho typovaný λ-kalkul s NBL.

  • Overenie či term t jednoducho typovaného λ-kalkulu s funkčným typom a s NBL je správne typovaný.
  • Vyhodnotenie termu t pre argument n.

Jednoducho typovaný λ-kalkul so súčinovým typom.

  • Formulácia termu t s využitím binárneho súčinového typu.
  • Overenie, či term t je správne typovaný.
  • Vyhodnotenie termu t.

Jednoducho typovaný λ-kalkul so súčtovým typom.

  • Formulácia termu t s využitím binárneho súčtového typu.
  • Overenie, či term t je správne typovaný.
  • Vyhodnotenie termu t.

5.) Údajové štruktúry v jednoducho typovanom λ-kalkule.

  • Definícia a vzorové riešenie úlohy na údajovú štruktúru záznam.
  • Definícia a vzorové riešenie úlohy na údajovú štruktúru variant.
  • Definícia a vzorové riešenie úlohy na údajovú štruktúru variant s využitím enumeračného typu.

Pri každej údajovej štruktúre overte, či je formulovaný term t správne typovaný a vyhodnoťte ho.

6.) Odvodené tvary termov jednoducho typovaného λ-kalkulu.

Vymyslieť a vyriešiť po 1 príklad na každý z definovaných odvodených tvarov termov jednoducho typovaného λ-kalkulu:

  • Let väzba (let binding).
  • Zoradenie (sequencing).
  • Zastúpenie (wildcards).
  • Pripísanie (ascription).

Následne:

  • Overiť typ termu t.
  • Vyhodnotiť term t.
  • Prepísať term t do základného jazyka λ-kalkulu.

7.) Rekurzia v jednoducho typovanom λ-kalkule.

Rozšírte rekurzívnu funkciu z úlohy 2 pridaním typov.

  • Definícia funkcie vyššieho rádu, ktorej parametrom bude daná rekurzívna funkcia.
  • Aplikácia operátora $fix$ na funkciu vyššieho rádu.
  • Overiť typ termu.
  • Vyhodnotiť term.
  • Prepísať term t do konštrukcie $let~rec$.

8.) Zoznamy v jednoducho typovanom λ-kalkule.

Zvoľte si jednu z funkcií v knižnici List jazyka OCaml (nie $is\_empty, length, append, cons, hd, tl$), resp. vymyslite si vlastnú funkciu. Nasledne Vašou úlohou je:

  • Napísať zvolenú funkciu ako term $t$ nášho jazyka.
  • Overte typ $t$.
  • Vyhodnotiť $t$ pre ľubovoľný vhodný argument.
  • V prípade rekurzívnej definície $t$, prepísať $t$ do konštrukcie $let~rec$.

9.) Rekurzívne typy.

Navrhnite rekurzívny typ na reprezentáciu ľubovoľnej rekurzívnej štruktúry: (napr. prirodzené čísla, binárne stromy, zoznamy, binárne čísla...) či už ako variantový typ alebo ako súčtový typ, a definujte:

  • Príslušné hodnoty resp. konštruktory nad nimi.
  • Aspoň jednu funkciu nad hodnotami daného typu.
  • Aplikujte danú funkciu na ľubovoľnú hodnotu daného typu, overte či je takýto program správne typovaný a ak áno, vyhodnoťte ho.

9.) Typová rekonštrukcia - odvodenie typu.

  • Pokúste sa nájsť najvšeobecnejší typ, pre jednu z Vami formulovaných termov z úlohy č. 2 (v prípade rozsiahlej komplexnosti navrhnutých termov, ich môžete zjednodušiť, prípadne upraviť pre potreby tejto úlohy).

10.) Let polymorfizmus.

  • Odstrante typové anotácie z termu let väzby z úlohy č.6 a najdite najvšeobecnejší typ daného termu.

Forma odovzdania

Termín pre odovzdanie finálnej verzie zadania je koniec 12. týždňa semestra v systéme moodle v kurze TT.

Odovzdávanie zadania bude prebiehať priebežne, prostredníctvom systému moodle.

  • Pre priebežné odovzdávky v 4. 8. a 12. týždni bude vytvorená aktivita na odovzdanie vypracovanej časti zadania.
  • V danom týždni je potrebné vypracovať časť zadania, podľa obsahu cvičenia z predchádzajúcich týždňov.
  • Zadanie nie je potrebné rozdeliť do viacerých projektov ale priebežne dopĺňať.
  • V aktuálnej odovzdávke sú povolené zmeny aj v už odovzdaných častiach zadania.
  • Neospravedlnené nedodržanie termínu odovzdávky bude sankcionované stratou 3 bodov.

V 13. týždni semestra prebehne obhajoba zadania.

Zadanie je možné vypracovať dvoma spôsobmi:

  • Využitím typografického systému LaTeX (max. 30 bodov).
  • Ručne s možnosťou získania max. 20 bodov.

Zadanie v úvodnej časti bude obsahovať titulnú stranu a súhrn rozsahu vyriešených úloh.

  • V prípade zvolenia 1. možnosti poprosím vo finálnom odovzdávaní o nahratie vypracovaného zadania spolu so zdrojovými kódmi (2 subory: pdf subor a zip subor), pričom v priebežných odovzdávkach 4. a 8. týždni je potrebné nahrať len pdf súbor.
  • V prípade voľby 2. možnosti vás poprosím o odovzdanie zadania vo forme jedného pdf súboru.