Vaje#

Naloga 1#

Lambda račun razširite z učinkoma za branje in pisanje (IO). Pri tem se osredotočimo zgolj na branje in pisanje celih števil.

Da lahko beležimo v katerem koraku program nekaj prebere oz. izpiše, naj nova operacijska semantika uporablja označene puščice.

  • Če se v koraku ni zgodilo nič, potem uporabimo navadno puščico.

  • Če smo v koraku izpisali število n, potem puščico označimo z !n.

  • Če smo v koraku prebrali število n, potem puščico označimo z ?n.

Sedaj je potrebno tudi stara pravila dopolniti z označenimi puščicami. Da se število pravil ne potroji, lahko uporabljate spremenljivke za tip oznake na puščici.

Naloga 2#

Napišite program, ki prebere dve števili in izpiše njuno vsoto. Narišite drevo vseh možnih izvajanj programa.

Naloga 3#

Sedaj, ko imamo na voljo razširitev Lambda računa s pomnilnikom, lahko v Lambda računu modeliramo IMP. Napišite prevajalnik, ki sprejme program v IMPu in vrne program v Lambda računu.

Naloga 4#

Lambda račun s pomnilnikom razširite še s hkratnim izvajanjem. Izračun c1 || c2, za c1 : unit in c2 : unit, lahko naredi korak v prvi ali drugi komponenti. Ko izračuna obe komponenti, vrne unit (torej je izvajanje zanimivo le v kombinaciji z drugimi učinki).

Je naš programski jezik še determinističen? Če ni, napišite program, ki bo imel več možnih rezultatov.