Deklaratív programozás

A tantárgy angol neve: Declarative Programming

Adatlap utolsó módosítása: 2022. augusztus 24.

Budapesti Műszaki és Gazdaságtudományi Egyetem
Villamosmérnöki és Informatikai Kar
BSc
Tantárgykód Szemeszter Követelmények Kredit Tantárgyfélév
VISZAD01   2/2/0/f 5  
3. A tantárgyfelelős személy és tanszék Dr. Szeredi Péter,
A tantárgy tanszéki weboldala https://dp.iit.bme.hu
4. A tantárgy előadója

dr. Hanák Péter, külső munkatárs SZIT

dr. Szeredi Péter, c. egy. tanár SZIT

5. A tantárgy az alábbi témakörök ismeretére épít

Programozás, programozási technológia, matematikai logika

 

6. Előtanulmányi rend
Kötelező:
((EgyenCsoportTagja("2014_tanterv_hallgatoi_info") VAGY
EgyenCsoportTagja("2014_tanterv_hallgatoi_info_eng") )

ÉS
(NEM ( TárgyEredmény( "BMEVISZA402" , "jegy" , _ ) >= 2
VAGY
TárgyEredmény("BMEVISZA402", "FELVETEL", AktualisFelev()) > 0
VAGY
TárgyEredmény( "BMEVISZA403" , "jegy" , _ ) >= 2
VAGY
TárgyEredmény("BMEVISZA403", "FELVETEL", AktualisFelev()) > 0)))

VAGY

(Szakirany("AMIN22-INFREND/ETT", _) VAGY
Szakirany("AMIN22-INFREND/SZIT", _) VAGY
Szakirany("AMIN22-INFREND/TMIT", _) VAGY

Szakirany("AMIN22-INTHÁL/HIT", _) VAGY

Szakirany("AMIN22-INTHÁL/HVT", _) VAGY

Szakirany("AMIN22-INTHÁL/TMIT", _) VAGY
Szakirany("AMIN22-SZOFTFEJL/AUT", _) VAGY

Szakirany("AMIN22-SZOFTFEJL/IIT", _) VAGY

Szakirany("AMIN22-SZOFTFEJL/MIT", _))


ÉS (Training.Code=("5N-A8") VAGY Training.Code=("5NAA8"))

A fenti forma a Neptun sajátja, ezen technikai okokból nem változtattunk.

A kötelező előtanulmányi rend az adott szak honlapján és képzési programjában található.

7. A tantárgy célkitűzése

A deklaratív – más néven nonimperatív – programozási paradigma megismertetése, a két fő irányzat – a funkcionális és a logikai programozás – bemutatása, valamint gyakoroltatása kis-közepes feladatok megoldásával.

8. A tantárgy részletes tematikája

Az előadások részletes tematikája 

  • 1.hét: Bevezetés és funkcionális programozás: Követelmények, szakirodalom, honlap. Motivációs példa logikai és funkcionális nyelven. A deklaratív programozás fő jellemzői: függvények, ill. eljárások, nem frissíthető változók, akkumulátorok, rekurzív algoritmusok és adatstruktúrák, jobbrekurzió, magasabb rendű függvények, ill. eljárások. 

  • 2. hét: Funkcionális programozás: Programozási környezetek. Típusok, műveletek, változók, kifejezések. Szintaxis. Kifejezések mohó és lusta kiértékelése. Listák, listajelölő. Iteráció és rekurzió, lineáris és elágazó rekurzió, jobbrekurzió, akkumulátorok. Modulok. 

  • 3. hét: Funkcionális programozás: Beépített függvények. Összetett kifejezések. Listák és ennesek. Mintaillesztés. Típusspecifikáció. Modulokról bővebben. 

  • 4. hét: Funkcionális programozás: Magasabb rendű függvények, függvényértékek. Gyakori könyvtári függvények. Kivételkezelés. 

  • 5. hét: Funkcionális programozás: Összetett adatszerkezetek és kezelésük: listák, halmazok, gráfok. Kulcs-érték párok, bináris fák. Lineáris és elágazó rekurzió újra. Programhelyesség igazolása. Lusta kiértékelés, lusta lista. 

  • 6. hét: Logikai programozás: Bevezetés példákon keresztül. A nyelv alapszintaxisa, adatstruktúrák. Listakezelés. 

  • 7. hét: Logikai programozás: A végrehajtási algoritmus. Redukciós lépés, egyesítés, keresési tér. A nyomkövetés dobozmodellje. 

  • 8. hét: Logikai programozás: Operátorok. További vezérlési szerkezetek: diszjunkció, feltételes szerkezet, negáció.  

  • 9. hét: Logikai programozás: Jobbrekurzió, akkumulátorok. A keresési tér szűkítése. Determinizmus és indexelés. Vezérlési eljárások. 

  • 10. hét: Logikai programozás: Meta-logikai eljárások. Megoldásgyűjtő eljárások. Magasabb rendű eljárások. 

  • 11. hét: Deklaratív programozás: Korlát-alapú programozási módszerek. 

  • 12. hét: Deklaratív programozás: Szélességi és mélységi keresések. 

  • 13. hét: Deklaratív programozás: Megvalósítási módszerek. 

14. hét: Deklaratív programozás: Összefoglalás és kitekintés. 


 A gyakorlatok részletes tematikája

  • 1. hét: A funkcionális programozás alapelvei és módszerei. 

  • 2. hét: Listakezelés funkcionális nyelven. 

  • 3. hét: Akkumulátorok, jobbrekurzió. 

  • 4. hét: Magasabb rendű függvények, lusta listák. 

  • 5. hét: Gyakorlás az 1. nagyzárthelyire. 

  • 6. hét: A logikai programozás alapelvei és módszerei. 

  • 7. hét: Listák kezelése logikai nyelven, többirányú végrehajtás. 

  • 8. hét: Diszjunktív szerkezetek programozása. 

  • 9. hét: Hatékonyságnövelő eszközök a logikai programozásban. 

  • 10. hét: Magasabb rendű és meta-logikai eljárások programozása. 

  • 11. hét: A korlátprogramozás eszközei logikai és funkcionális nyelveken. 

  • 12. hét: Szélességi és mélységi keresések programozása. 

  • 13. hét: Gyakorlás a 2. nagyzárthelyire. 

  • 14. hét: Kis házi feladatok megbeszélése.

 

9. A tantárgy oktatásának módja (előadás, gyakorlat, laboratórium)

Előadás és gyakorlat 

10. Követelmények

a) Zárthelyi dolgozatok értékelése és elfogadása 

A félév során két zárthelyi dolgozatot iratunk, elfogadásukhoz a pontszám legalább 40%-át kell megszerezni. 

Pótlás vagy javítás esetén az utolsó zárthelyi eredménye lesz érvényes. 

b) Kis házi feladatok 

A félév során több alkalommal adunk ki kis házi feladatként programozási feladatokat. A beadás módját a tárgy honlapján közzéteendő feladatkiírás részletezi. 

A kis házi feladatokra vonatkozó követelmény teljesítéséhez az szükséges, hogy a beadható programok legalább 2/3-a lefusson mindkét programozási nyelven a tesztesetek 100%-os teljesítésével. 

c) Nagy házi feladatok, megajánlott jegy 

Mind a funkcionális, mind a logikai programozási tárgyrészből egy-egy nagy házi feladatot adunk ki. A nagy házi feladatok megoldása nem kötelező, azonban a féléves osztályzatba beszámít az eredményük, és a beadásukkal megajánlott jegy is szerezhető. 

A programokat, valamint a dokumentációkat elektronikus úton kell beadni az ütemtervben előírt oktatási héten. A beadás módját a tárgy honlapján közzéteendő feladatkiírás részletezi. A beadott megoldásokkal kapcsolatban a hallgató kérdéseket fog kapni (ez a nagy házi feladat megvédése, az önálló munkavégzés igazolása). 

A tesztesetek legalább 80%-át megoldó programokat további bonyolultabb, nagyobb méretű tesztesetekkel futtatjuk az ún. létraversenyben. A létraverseny eredményétől függ a megajánlott jegy (lásd alább). 

d) A féléves osztályzat megállapítása 

A féléves osztályzatban a zárthelyikre max. 85 pontot, a nagy házi feladatokra max. 15 pontot kaphatnak a hallgatók. A kis házi feladatok megoldására kapott és a létraversenyen szerzett ún. pluszpontokkal az összpontszám 100 pontnál nagyobb is lehet. 

A féléves összpontszám a zárthelyikre, a kis és nagy házi feladatokra, valamint a létraversenyen kapott pontok összege. Ennek alapján állapítjuk meg a félévi osztályzatot. Az egyes osztályzatok alsó határa: elégséges – 40 pont, közepes – 55 pont, jó – 70 pont, jeles – 85 pont. 

Jó (4) megajánlott jegyet kaphat az, aki a kis házi feladatokra vonatkozó követelményeket teljesíti, mindkét programozási nyelven beadja a nagy házi feladat megoldását, ezeket megfelelően dokumentálja, a programjai bejutnak a létraversenybe és a nagy házi feladatot sikeresen megvédi. Jeles (5) megajánlott jegyet kaphat az, akinek mindkét programja megoldja a létraverseny teszteseteinek legalább 40%-át. 

A megajánlott jegy elfogadása esetén a zárthelyit nem kell megírni, az esetleg megírt zárthelyi eredményét nem vesszük figyelembe. 

e) Meg nem engedett eszközök alkalmazása 

A kis és nagy házi feladatokat minden hallgatónak önállóan, egyénileg kell megoldania, másoktól ötleteken kívül egyebet – pl. teljes kódot vagy akár csak kódrészletet – nem vehet át. A programok szerkezeti hasonlóságát automatikus eszközökkel is vizsgálhatjuk. 

Mástól származó program vagy programrészlet átvétele/átadása és beadása esetén az összes kis és nagy házi feladatot érvénytelennek tekintjük. A zárthelyin a meg nem engedett eszközöket használókat az érvényes kari, ill. egyetemi rendelkezések szerint büntetjük. Egyéb kérdésekben a TVSz rendelkezései az irányadók.

11. Pótlási lehetőségek

A házi feladatokat nem lehet pótolni. A zárthelyik pótlására, illetve javítására két alkalommal lesz lehetőség. Ezen alkalmakkor is a zárthelyiken elvárt tananyagot kell tudni. Mindkét alkalommal mindkét zárthelyi pótolható.

 

12. Konzultációs lehetőségek

A levelezési listára feliratkozott hallgatók írásban feltett konzultációs kérdéseire a félév során folyamatosan válaszolunk. Előzetes egyeztetést követően személyes, illetve távjelenléti konzultációra is van lehetőség.

13. Jegyzet, tankönyv, felhasználható irodalom

Jegyzet:

Szeredi Péter, Benkő Tamás: Deklaratív programozás. Oktatási segédlet. Bevezetés a logikai programozásba. Számítástudományi és Információelméleti Tanszék, Budapest, 2005. Letölthető a tárgy honlapjáról. 

Ajánlott irodalom: 

  1. Erlang on-line documentation https://erlang.org/doc.html
  2. Erlang Programming. Wiki Books https://en.wikibooks.org/wiki/Erlang_Programming
  3. Fred Hébert: Learn you some Erlang. https://learnyousomeerlang.com/ 
  4. Erlang Tutorial. https://www.tutorialspoint.com/erlang 
  5. Elixir. https://elixir-lang.org/ 
  6. Elixir Tutorial. https://www.tutorialspoint.com/elixir
  7. An Introduction to Elm. https://guide.elm-lang.org/ 
  8. Beginning Elm. https://elmprogramming.com/ 
  9. Elm Tutorial. https://www.tutorialspoint.com/elm/ 
  10. Farkas Zsuzsa, Futó Iván, Langer Tamás, Szeredi Péter: MProlog programozási nyelv. Műszaki Könyvkiadó, Budapest, 1989. 
  11. Márkusz Zsuzsa: Prologban programozni könnyű. Novotrade, Budapest, 1988. 
  12. Richard A. O'Keefe: The Craft of Prolog. MIT Press, 1990. ISBN 0-262-15039-5 
  13. Leon Sterling, Ehud Shapiro: The Art of Prolog. Advanced Programming Techniques, 2nd Edition, MIT Press, 1994, ISBN 0-262-19338-8 
  14. Peter Flach: Logikai Programozás. Az intelligens következtetés példákon keresztül. Panem-John Wiley & Sons, 2001 
  15. Ulf Nilsson and Jan Maluszynski: Logic, Programming and Prolog (2nd ed.). Previously published by John Wiley & Sons Ltd. https://www.ida.liu.se/%7Eulfni/lpp/
14. A tantárgy elvégzéséhez átlagosan szükséges tanulmányi munka `
Kontakt óra56
Félévközi készülés órákra 26
Felkészülés zárthelyire  20
Házi feladat elkészítése  48
Kijelölt írásos tananyag elsajátítása    0
Vizsgafelkészülés    0
Összesen 150
15. A tantárgy tematikáját kidolgozta
dr. Dóbé Péter
adjunktusIrányítástechnika és Informatika Tanszék
dr. Hanák Péter
tud. munkatárs
Irányítástechnika és Informatika Tanszék
dr. Kápolnai Richárd
adjunktus
Irányítástechnika és Informatika Tanszék
dr. Szeredi Péter
c. egyetemi tanár
Számítástudományi és Információelméleti Tanszék
   
IMSc tematika és módszer Az IMSc program hallgatói számára a gyakorlatokon emelt szintű fakultatív programozási feladatokat kínálunk, valamint – részben ezen feladatokhoz kapcsolódó – önállóan tanulmányozandó irodalmat teszünk elérhetővé, fakultatív konzultációs lehetőség biztosításával.
IMSc pontozás

A tantárgyból kétféle módon szerezhető IMSc pont:

  • a zárthelyik során pluszfeladat megoldásával (maximum 18 pont),
  • a létraversenyen a megajánlott jeles érdemjegyhez szükséges 40%-os teljesítés felett minden további 10% teljesítéséért mindkét programozási nyelv esetén 1–1 pont (összesen maximum 12 pont)

 

A hallgató a fenti módokon szerzett pontok összegét, de legfeljebb 25 IMSc pontot kap.

Az IMSc pontok gyűjtése teljesen független a zárthelyikre és házi feladatokra kapott pontoktól. Ezen pontok megszerzése és a fakultatív feladatok megoldása nélkül is jeles szinten teljesíthetők a tantárgy követelményei.  

Az IMSc pontok megszerzése az IMSc programban nem résztvevő hallgatók számára is lehetséges.