1. előadásblokk
Utolsó módosítás: 2005. nov. 5. Hanák Péter
a Deklaratív
programozás c. tárgy funkcionális programozásról tartott előadásai - G.
Smolka német nyelvű jegyzetétkövetve - a következő témákról szóltak.
foglalkoztunk,
foglalkozunk az SML nyelv szintaxisával és szemantikájával: szavakkal és
mondatokkal, valamint ezek egy- és kétdimenziós ábrázolásával; értékekkel
és környezetekkel; továbbá kifejezések, eljáráshívások, deklarációk és
programok végrehajtásával; a szemantikai egyenlőség kérdésével.
G. Smolka előadásjegyzete alapján összefoglaló készült a témakörről
Az SML egy résznyelvének szintaxisa és szemantikája címen, amely
letölthető a tárgy honlapjáról:
<http://dp.iit.bme.hu/dp05a/index.html#SMLr1szintax>.
Ezt a témakört a hallgatóknak önállóan kell feldolgozniuk.
- Funkcionális vagy applikatív programozás: az elnevezés magyarázata.
- SML-értelmezők és fordítóprogramok: mosml, sml-nj, Alice, Poly/ML. A
read-eval-print ciklus.
- Egyszerű SML-programok és elemeik: deklaráció, kifejezés; azonosító,
állandó, operátor, kulcsszó; kötés.
- Típus, típusmegkötés, típuslevezetés. int, real,
string.
- SML-értelmezők használata. A pontosvessző (;) szerepe. Egy
azonosító újradeklarálása. Az it eredményazonosító. Hibák jelzése.
- Eljárások. Példa: square. Argumentum és eredmény. Eljárás feje
és törzse. Argumentumminta, argumentumváltozó. Eljárásdeklaráció.
Eljárás típusa. Fejkomment.
- Relációk és feltételes kifejezések. bool, false,
true.
- Lokális deklarációt használó kifejezés (let-kifejezés).
- Példa lokális deklarációt használó kifejezés használatára:
xa8adikon.
- Ennesek (párok, hármasok stb.). Ennes i-edik tagja;
projekció. Nullas: (); unit.
- Ennesminta. swap, val (x,y) = (y,x). min,
max.
- Típusváltozó, polimorfizmus. Operátorok többszörös terhelése.
Alapműveletek és relációk alapértelmezett típusa.
- Rekurzív eljárások. Példa: power. Rekurzív eljárás
alkalmazása, végrehajtása. Rekurzív hívás, leállási feltétel.
- Eljárásdeklaráció mintaillesztéssel. Állandó és azonosító mint minta.
- Egészosztás: div, mod, quot, rem.
Írjon három eljárást min3, mid3 és max3 néven, amelyek
három egész érték közül kiválasztják a legkisebbet, a középsőt, ill. a
legnagyobbat.
Haladóbbaknak.
Írjon olyan változatokat min3c, mid3c és max3c néven az
előző eljárásokból, amelyek argumentumként kapják meg a két érték
összehasonlítására használható, int*int -> bool típusú műveletet.
az alábbi témákról,
amelyekről a hallgatók más tárgyakban már tanultak; SML-beli
megvalósításukat önállóan kell feldolgozniuk:
- Fixpontos és lebegőpontos számok, int és real típus,
Int és Real könyvtár.
- Aritmetikai pontosság, kerekítési hiba. Négyzetgyökvonás
Newton-módszerrel.
- Szintaxis. Szavak: állandók, operátorok, kulcsszók, azonosítók.
Mondatok: kifejezések, deklarációk, minták, típusok, programok. Mondatok
egy- és kétdimenziós ábrázolása. Zárójelezés. Szabad és kötött
azonosítók, környezetek, nyitott és zárt mondatok. Eljárások ábrázolása
hármasként.
- Szemantika. Szemantikai helyesség, típusszabályok. Kifejezések,
eljáráshívások, deklarációk és programok végrehajtása.
Értelmezőprogramok feldolgozási lépései: lexikai elemzés, szintaktikai
elemzés, szemantikai elemzés, végrehajtás. Szemantikai egyenlőség.
- Névtelen eljárások (fn- vagy lambda-jelölés). Kaszkádosított
(angolul: curried), másnéven részlegesen alkalmazható
eljárások. Ennessel paraméterezett (angolul: uncurried)
eljárások.
- Magasabbrendű eljárások. Példák: sum, gauss, iter,
sqrt, first.
- Eljárások és folyamatok: rekurzív eljárásból rekurzív folyamat,
rekurzív eljárásból iteratív folyamat, iteratív eljárásból rekurzív
folyamat.
- Polimorf és monomorf eljárások. Típussémák és típusok. Típussémák
példányosítása. iter polimorf változata. iter egy
alkalmazása: power. Monomorf és polimorf deklarációk. Az id
függvény. Monomorf és polimorf azonosítók. Nem egyértelmű deklarációk,
szabad típusváltozók, érték-polimorfizmus. Polimorf eljárások
specifikálása.
- Újra a típuslevezetésről és az operátorok többszörös terheléséről.
- Egyenlőségvizsgálatot megengedő, ún. egyenlőségi típusok és
típusváltozóik.
- Azonosítók definiáló és alkalmazó előfordulása. Azonosítók kötött és
szabad előfordulása. Lexikális kötés. Kötött azonosítók szisztematikus
átnevezése. Egy mondat ,,megtisztítása''. Szemantikai elemzés, statikus
kötés, monomorf és polimorf kötés. Végrehajtás, dinamikus kötés.
- Az fn-jelölés kifejezőereje. Klózok. Szintaktikai édesítők:
e1 andalso e2, e1 orelse e2,
if e1 then e2 else e3, op+, op*,
op div, op<, op>=, op= stb.
Tesztelőeljárás egy szám prím voltának
eldöntésére.
- Lista: rekurzív lineáris adatszerkezet, egy értékből és egy listából
álló pár.
- Üres lista: nil, [] Lista elemei. Lista feje, farka.
- Listajelölések. A cons művelet: ::. Listák
összefűzése: @. Műveletek kötése, precedenciája.
- Lista típusa. Polimorf lista.
- length, append, @, naív rev, revAppend,
rev, concat, tabulate.
- map, filter, exists, all. Típusuk
levezetése.
- fold f e n és fold' f e n származtatása sum f
n-ből és prod f n-ből. Típusuk levezetése.
- fold és fold' kiértékelése fold f e 3 és
fold' f e 3 példáján.
- exp n k. iter f n származtatása exp n k-ból;
típusa.
- iter f n és fold' f e n összefüggése.
fold f e n, fold' f e n és iter f n
származtatását és néhány alkalmazását példákon keresztül mutatjuk be a
<http://dp.iit.bme.hu/dp05a/dp05a-mrelj.sml>
címről letölthető programfájlban.
fold (op*) 1 4 és
fold' (op*) 1 4, továbbá fold (op-) 0 3 és fold'
(op-) 0 3 kiértékelésének összehasonlítása. Mutassa be a jobbrekurzív és
a nemjobbrekurzív változatok kiértékelése közötti különbségeket!
- Redukciós eljárások listákra: foldl, foldr.
- plus, rev, length, append, revApp,
concat, map, filter megvalósítása foldl-lel,
ill. foldr-rel.
- Törzstényezőkre bontás: primefac.
- További eljárások listákra: hd, tl, nth,
null. Kivétel jelzése raise-zel.
- Több klózból álló eljárások. Mintaillesztés. Diszjunkt minták.
Átfedő minták. Nem minden esetet lefedő minták. Klózok, amelyek
végrehajtására soha nem kerül sor.
- case-kifejezés.
- Több klózból álló kaszkádosított eljárások.
- Listák rendezése beszúrással: insert, isort. Polimorf
változata: pisort.
- Az order típus. Rendezés fordított sorrendben: az invert
eljárás.
- Lexikális rendezések. A lex eljárás.
- Rendezés összefuttással: split, merge, msort.
partition és
quicksort definiálása.
- Adatkonstruktor ( állandó, függvény), típuskonstruktor ( állandó,
függvény).
- datatype-deklaráció.
- Adatkonstruktor mint minta.
- Felsorolásos (enumerációs) típus datatype-deklarációval.
- Típusszinoníma type definícióval.
- Kivétel deklarálása, kiváltása, kezelése: exception,
raise, handle.
- Szekvenciális kifejezés ;, ill. before operátorral.
- Példa:testDouble eljárás egyforma értékű listaelemek
előfordulásának jelzésére.
Footnotes
- ... jegyzetét
- Lásd
<http://www.ps.uni-sb.de/~smolka/programmierung.html>.
Hanák Péter
2005-12-04