Alkalmazott funkcionális és logikai programozás (AFLP)



Hasonló dokumentumok
Deklaratív Programozás

Programozás I gyakorlat

Deklaratív programozás

Programozás. A programkészítés lépései. Program = egy feladat megoldására szolgáló, a számítógép számára értelmezhető utasítássorozat.

Lineáris algebra gyakorlat

Diszkrét matematika I. gyakorlat

TANTÁRGYI ÚTMUTATÓ. Prezentáció és íráskészségfejlesztés. tanulmányokhoz

Prolog 1. Készítette: Szabó Éva

Közbeszerzési Értesítő száma: 2016/75. Eljárás fajtája: Közzététel dátuma: Iktatószám: 7466/2016 CPV Kód:

INFORMATIKAI ALAPISMERETEK

Korszerű geodéziai adatfeldolgozás Kulcsár Attila

Házi dolgozat. Minta a házi dolgozat formai és tartalmi követelményeihez. Készítette: (név+osztály) Iskola: (az iskola teljes neve)

Párhuzamos programozás

Osztály szint tagok. Krizsán Zoltán 1 [2012. március 12.] Objektumorientált programozás C# alapokon tananyag

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Programozás alapjai Bevezetés

Minta programterv a 1. házi feladathoz

Mesterséges Intelligencia. Csató Lehel. Csató Lehel. Matematika-Informatika Tanszék Babeş Bolyai Tudományegyetem, Kolozsvár 2006/2007

Szusza Ferenc labdarúgó sportlétesítmény fejlesztése

II. rész. Cékla: deklaratív programozás C++-ban. Tartalom. Imperatív és deklaratív programozási nyelvek. A deklaratív programozás jelmondata

Korrigendum - Fővárosi Önkormányzat Idősek Otthona - földgáz energia beszerzése

Digitális technika (VIMIAA01) Laboratórium 1

DLookup függvény 1. (5)

Analízis elo adások. Vajda István október 3. Neumann János Informatika Kar Óbudai Egyetem. Vajda István (Óbudai Egyetem)

HÁLÓZATSEMLEGESSÉG - EGYSÉGES INTERNET SZOLGÁLTATÁS-LEÍRÓ TÁBLÁZAT

TANTÁRGYI ÚTMUTATÓ. Logisztika. tanulmányokhoz

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉPSZINT Trigonometria

Kiterjesztett csomagolás Hiteles fogyasztói tájékoztatás

1. forduló. MEGOLDÁSOK Pontszerző Matematikaverseny 2015/2016-os tanév

KOVÁCS BÉLA, MATEMATIKA I.

3. Gyakorlat Ismerkedés a Java nyelvvel

PÁLYÁZATI FELHÍVÁS - JELENTKEZÉSI LAP

Fordítóprogramok Készítette: Nagy Krisztián

Felvételi előkészítő tájékoztató 2012.

Az éves statisztikai összegezés STATISZTIKAI ÖSSZEGEZÉS AZ ÉVES KÖZBESZERZÉSEKRŐL A KLASSZIKUS AJÁNLATKÉRŐK VONATKOZÁSÁBAN

EPER E-KATA integráció

Növelhető-e a hazai szélerőmű kapacitás energiatárolás alkalmazása esetén?

Vasúti menetrendek optimalizálása

Belépési útmutató a MIAG weboldalra

INFORMATIKAI ALAPISMERETEK

A TANTÁRGY ADATLAPJA

... ahol l 0. Minden tranzakcióhoz létezik. = f(σ i. A sorozat nem bővíthető. Ha véges, akkor az utolsó konfigurációnak nincs rákövetkezője.

V. Kétszemélyes játékok

LOGIKAI TERVEZÉS. Előadó: Dr. Oniga István egyetemi docens I félév

Az informatika oktatás téveszméi

A Közbeszerzések Tanácsa (Szerkesztőbizottsága) tölti ki A hirdetmény kézhezvételének dátuma KÉ nyilvántartási szám

TANTÁRGYI ÚTMUTATÓ. Pénzügyi-számviteli informatika 2. tanulmányokhoz

Lemezkezelés, RAID, partícionálás, formázás, defragmentálás.

A Hozzárendelési feladat megoldása Magyar-módszerrel

A SZÁMFOGALOM KIALAKÍTÁSA

MATLAB. 4. gyakorlat. Lineáris egyenletrendszerek, leképezések

JEGYZİKÖNYV RENDKÍVÜLI NYÍLT KISZOMBOR december 12.

2011. március 9. Dr. Vincze Szilvia

ADATBÁZIS-KEZELÉS. Funkcionális függés, normál formák

A C programozási nyelv VI. Parancssori argumentumok File kezelés

INFORMATIKAI ALAPISMERETEK

A zárthelyik időpontja: 1. zh: október 10. A1/128.(manuális és számítógépes) 2. zh: december 05. A1/128. (manuális és számítógépes)

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK KÖZÉPSZINT Függvények

Középiskolai felvételi eljárás tanév

Active watch MT849. Használati útmutató

Átalakuló HR szervezet, változó Business Partneri szerepek


Játékok (domináns stratégia, alkalmazása

GAZDASÁGI MATEMATIKA Gyakorlat

Vektoros elemzés végrehajtása QGIS GRASS moduljával 1.7 dr. Siki Zoltán

PONTSZÁMÍTÁSI KÉRELEM felsőfokú végzettség alapján (alap- és osztatlan képzésre jelentkezőknek)

Adatok ábrázolása, adattípusok. Összefoglalás

A HIRDETMÉNY VISSZAVONÁSÁRÓL, MÓDOSÍTÁSÁRÓL, AZ AJÁNLATTÉTELI, VAGY RÉSZVÉTELI HATÁRIDŐ MEGHOSSZABBÍTÁSÁRÓL, A DOKUMENTÁCIÓ MÓDOSÍTÁSÁRÓL I.

KOVÁCS BÉLA, MATEMATIKA I.

SZAKIRÁNYÚ TOVÁBBKÉPZÉSI SZAK. gazdasági és jogi szakfordító és lektor (A/anyanyelv/ és B/idegen nyelv/ megnevezése)

Egyre nagyobb profitot generálnak a mobiltelefonnal végzett vásárlások, és egyre többet hezitálunk vásárlás előtt

Érettségi feladatok Algoritmusok egydimenziós tömbökkel (vektorokkal) 1/6. Alapműveletek

TOVÁBBI INFORMÁCIÓT TARTALMAZÓ HIRDETMÉNY, BEFEJEZETLEN ELJÁRÁSSAL KAPCSOLATOS INFORMÁCIÓ VAGY KORRIGENDUM

Bevezetés a lágy számítás módszereibe

Tájékoztató az önkéntes nyugdíjpénztárak számára a 2012-től érvényes felügyeleti adatszolgáltatási változásokról

Budapest, február

VHDL szimuláció. Tervezés. Labor II. Dr. Hidvégi Timót

AWP TELEPÍTÉSE- WINDOWS7 64 OPERÁCIÓS RENDSZEREN

Útmutató a vízumkérő lap kitöltéséhez

Tisztítószerek és tisztító eszközök beszerzése (14669/2014.)- módosítás

Vodafone ReadyPay. Használati útmutató

Mikrokontrollerek. Tihanyi Attila május 8

A TŰZVÉDELMI TERVEZÉS FOLYAMATA. Dr. Takács Lajos Gábor okl. építészmérnök BME Építészmérnöki Kar Épületszerkezettani Tanszék

A 2015/2016-OS TANÉV RENDJE

2015, Diszkrét matematika

Nyomott - hajlított fagerenda szilárdsági méretezése ~ egy régi - új megoldás

GOP PÁLYÁZATOK. Szabó Sándor András. pályázati és innovációs tanácsadó regisztrált pályázati tréner egyetemi oktató

ingyenes tanulmány GOOGLE INSIGHTS FOR SEARCH

Az első lépések. A Start menüből válasszuk ki a Minden program parancsot. A megjelenő listában kattintsunk rá az indítandó program nevére.

Tájékoztató a szerződés módosításáról_munkaruházati termékek szállítása (5. rész)

Rendezési algoritmusok belső rendezés külső rendezés

Azonosító jel: Matematika emelt szint

Keretszerződés költöztetési, szállítási feladatok ellátására a Pécsi Tudományegyetemen-2- AF módosítás

KÖVETELMÉNYEK. Anyanyelvi tantárgy-pedagógia III. Tantárgy kódja TAB 1312 Meghirdetés féléve 4. Kreditpont 2 Heti kontaktóraszám (elm. + gyak.

(Figyelem! A kurzusok meghirdetése a mindenkori személyi állománytól függ.)

Bevezetés a C++ programozásba

Az új modulrendszer tapasztalatai

Virtuális magánhálózat, erőforrás kapacitásbérlés és üzemeltetési szolgáltatása DAKK Zrt-nél.

Művesekezelés anyagainak beszerzése a Semmelweis Egyetem Transzplantációs és Sebészeti Klinika részére

Új fejlesztéseink (NAT 2012) Középiskolai fizika, kémia

Átírás:

Alkalmazott funkcionális és logikai programozás (AFLP) Szeredi Péter 1 Buza Krisztián 1 Hanák Péter 2 1 szeredi@cs.bme.hu, chrisbuza@yahoo.com BME Számítástudományi és Információelméleti Tanszék 2 hanak@emt.bme.hu BME Egészségipari Mérnöki Tudásközpont 2012. ősz Revision exported Generated: Mon Sep 3 13:19:14 CEST 2012 Az előadók köszönetüket fejezik ki Kápolnai Andrásnak a közreműködésért.

A tárgy témája Deklaratív programozási nyelvek gyakorlati megközelítésben Két fő irány: funkcionális programozás F# (Fsharp) nyelven logikai programozás Prolog nyelven (BME) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 2 / 21

I. rész Követelmények 1 Követelmények 2 Bevezetés: deklaratív programozás

Tartalom Követelmények Követelmények, tudnivalók 1 Követelmények Követelmények, tudnivalók Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 4 / 21

Honlap Követelmények Követelmények, tudnivalók Ideiglenes honlap: http://sgate.emt.bme.hu/hanak/fsharp/ Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 5 / 21

Követelmények Követelmények, tudnivalók Magyar nyelvű Prolog szakirodalom Farkas Zsuzsa, Futó Iván, Langer Tamás, Szeredi Péter: Az MProlog programozási nyelv. Műszaki Könyvkiadó, 1989 jó bevezetés, sajnos az MProlog beépített eljárásai nem szabványosak. Márkusz Zsuzsa: Prologban programozni könnyű. Novotrade, 1988 mint fent Futó Iván (szerk.): Mesterséges intelligencia. (9.2 fejezet, Szeredi Péter) Aula Kiadó, 1999 csak egy rövid fejezet a Prologról Peter Flach: Logikai Programozás. Az intelligens következtetés példákon keresztül. Panem John Wiley & Sons, 2001 jó áttekintés, inkább elméleti érdeklődésű olvasók számára Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 6 / 21

Követelmények Követelmények, tudnivalók Angol nyelvű Prolog szakirodalom Logic, Programming and Prolog, 2nd Ed., by Ulf Nilsson and Jan Maluszynski, Previously published by John Wiley & Sons Ltd. (1995) Letölthető a http://www.ida.liu.se/~ulfni/lpp címről. Prolog Programming for Artificial Intelligence, 3rd Ed., Ivan Bratko, Longman, Paperback - March 2000 The Art of PROLOG: Advanced Programming Techniques, Leon Sterling, Ehud Shapiro, The MIT Press, Paperback - April 1994 Programming in PROLOG: Using the ISO Standard, C.S. Mellish, W.F. Clocksin, Springer-Verlag Berlin, Paperback - July 2003 Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 7 / 21

Követelmények Követelmények, tudnivalók F#-szakirodalom (angolul) F#-honlap: http://fsharp.net Wikibook: http://en.wikibooks.org/wiki/f_sharp_programming F# on-line (Silverlight/Moonlight kell hozzá): http://www.tryfsharp.org Beginning F#, by Robert Pickering: http://books.google.com F# Functional Programming on-line, http://en.csharp-online.net/fsharp_functional_programming Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 8 / 21

Követelmények Követelmények, tudnivalók Fordító- és értelmezőprogramok SICStus Prolog 4.2 verzió F# (szabad szoftver) Letöltési információ (lesz) a honlapon (Linux, Windows) Kézikönyvek HTML-, ill. PDF-változatban Más programok: SWI Prolog http://www.swi-prolog.org/, Gnu Prolog http://www.gprolog.org/ Emacs-szövegszerkesztőhöz fsharp-mode és prolog-mode Eclipse fejlesztői környezet (SPIDER) Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 9 / 21

Követelmények Követelmények, tudnivalók AFLP: félévközi követelmények A szorgalmi időszakban: 3-3 kis házi feladatot adunk ki az F#, illetve a korlát-programozási témakörből. Az aláírás feltételei: részvétel a laboratóriumi gyakorlatok 70%-án; a kis házi feladatok kétharmadának megoldása úgy, hogy a megoldott kis házi feladatok között mindkét témakörből legalább egy-egy szerepeljen. A vizsgaidőszakban: írásbeli feladatmegoldással kombinált szóbeli vizsga legalább 40%-os teljesítése. Követelmények (I. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 10 / 21

II. rész Bevezetés: deklaratív programozás 1 Követelmények 2 Bevezetés: deklaratív programozás

Tartalom Bevezetés: deklaratív programozás A deklaratív paradigma 2 Bevezetés: deklaratív programozás A deklaratív paradigma Jobbrekurzió Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 12 / 21

Bevezetés: deklaratív programozás A deklaratív paradigma A deklaratív programozás jelmondata és fő jellemzői MIT és nem HOGYAN (WHAT rather than HOW): a megoldás módja helyett inkább a megoldandó feladat leírását kell megadni A gyakorlatban mindkét szemponttal foglalkozni kell Kettős szemantika: deklaratív szemantika MIT (milyen feladatot) old meg a program; procedurális szemantika HOGYAN oldja meg a program a feladatot. Új gondolkodási stílus, dekomponálható, verifikálható programok Új, magas szintű programozási elemek rekurzió (algoritmus, adatstruktúra) mintaillesztés visszalépéses keresés magasabb rendű függvények Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 13 / 21

Bevezetés: deklaratív programozás A deklaratív paradigma Imperatív és deklaratív programozási nyelvek Imperatív program felszólító módú, utasításokból áll változó: változtatható értékű memóriahely Példa C nyelven: int pow(int A, int N) { // pow(a,n) = A N int P = 1; // Legyen P értéke 1! while (N > 0) { // Amíg N>0 ismételd ezt: N = N-1; // Csökkentsd N-et 1-gyel! P = P*A; } // Szorozd P-t A-val! return P; } // Add vissza P végértékét Deklaratív program kijelentő módú, egyenletekből, állításokból áll változó: egyetlen, fix, a programírás idején ismeretlen értékkel bír Példa funkcionális nyelven: pow(a,n) -> if % Elágazás N==0 -> 1; % Ha N == 0, akkor 1 N>0 -> A*pow(A, N-1) % Ha N>0, akkor A*A N 1 end. % Elágazás vége Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 14 / 21

Bevezetés: deklaratív programozás A deklaratív paradigma Deklaratív programozás imperatív nyelven Lehet pl. C-ben is deklaratívan programozni ha nem használunk: értékadó utasítást, ciklust, ugrást stb., amit használhatunk: konstans változók, (rekurzív) függvények, if-then-else Példa (a pow függvény deklaratív változata a powd): // powd(a,n) = A N int powd(const int A, const int N) { if (N > 0) // Ha N > 0 return A * powd(a,n-1); // akkor A N = A*A N 1 else return 1; // egyébként A N = 1 } A (fenti típusú) rekurzió költséges, nem valósítható meg konstans tárigénnyel :-( powd(10,3) : 10*powd(10,2) : 10*(10*powd(10,1)) : 10 (10 (10*1)) } {{ } tárolni kell Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 15 / 21

Tartalom Bevezetés: deklaratív programozás Jobbrekurzió 2 Bevezetés: deklaratív programozás A deklaratív paradigma Jobbrekurzió Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 16 / 21

Bevezetés: deklaratív programozás Hatékony deklaratív programozás Jobbrekurzió A rekurziónak van hatékonyan megvalósítható változata Példa: döntsük el, hogy egy A szám előáll-e egy B szám hatványaként: /* ispow(a,b) = 1 <=> létezik i, melyre B i = A. * Előfeltétel: A > 0, B > 1 */ int ispow(const int A, const int B) { // again: if (A == 1) return 1; else if (A%B==0) return ispow(a/b, B); // {A=A/B; goto again;} else return 0; } Itt a színezett rekurzív hívás átírható iteratív kódra: a kommentben megadott címkével, értékadással és ugrással helyettesíthető! Ez azért tehető meg, mert a rekurzióból való visszatérés után azonnal kilépünk az adott függvényhívásból. Az ilyen függvényhívást jobbrekurziónak, terminális rekurziónak, vagy szerencsétlenebbül farokrekurziónak nevezzük ( tail recursion ). A Gnu C fordító megfelelő optimalizálási szint mellett a rekurzív definícióból is a nem-rekurzív (jobb oldali) kóddal azonos kódot generál! Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 17 / 21

Bevezetés: deklaratív programozás Jobbrekurzív függvények Jobbrekurzió Lehet-e jobbrekurzív kódot írni a hatványozási (pow(a,n)) feladatra? A gond az, hogy a rekurzióból kifelé jövet már nem csinálhatunk semmit, Tehát a végeredménynek az utolsó hívás belsejében elő kell állnia! A megoldás: segédfüggvény definiálása, amelyben egy vagy több ún. gyűjtőargumentumot (akkumulátort) helyezünk el. A pow(a,n) jobbrekurzív (iteratív) megvalósítása: // Segédfüggvény: powi(a, N, P) = P*A N int powi(const int A, const int N, const int P) { if (N > 0) return powi(a, N-1, P*A); else return P; } int powi(const int A, const int N){ return powi(a, N, 1); } Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 18 / 21

Bevezetés: deklaratív programozás Jobbrekurzió Imperatív program átírása jobbrekurzív, deklaratív programmá Minden ciklusnak egy segédfüggvényt feleltetünk meg (Az alábbi példában: while ciklus = powi függvény) A segédfüggvény argumentumai a ciklus által tartalmazott változóknak felelnek meg (powi argumentumai az A, N, P értékek) A segédfüggvény eredménye a ciklus által az őt követő kódnak továbbadott változó(k) értéke (powi eredménye a P végértéke) Példa: a hatványszámító program int pow(int A, int N) { int P = 1; int powi(int A, int N) { return powi(a, N, 1); } } while (N > 0) { N = N-1; P = P*A; } return P; int powi(int A, int N, int P) { if (N > 0) return powi(a, N-1, P*A); else return P; } Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 19 / 21

Bevezetés: deklaratív programozás Jobbrekurzió Példák: jobbrekurzióra átírható rekurziók Általános rekurzió // fact(n) = N! int fact(const int N) { if (N==0) return 1; return N * fact(n-1); } Jobbrekurzió // facti(n, I) = N! * I int facti(const int N, const int I) { if (N==0) return I; return facti(n-1, I*N); } int facti(const int N) { return facti(n, 1); } // fib(n) = // N. Fibonacci szám int fib(const int N) { if (N<2) return N; return fib(n-1) + fib(n-2); } int fibi(const int N, // Segédfv const int Prev, const int Cur) { if (N==0) return 0; if (N==1) return Cur; return fibi(n-1, Cur, Prev + Cur); } int fibi(const int N) { return fibi(n, 0, 1); } Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 20 / 21

Mit vesztettünk? a megváltoztatható változókat, az értékadást, ciklus-utasítást stb., általánosan: a megváltoztatható állapotot Hogyan tudunk mégis állapotot kezelni deklaratív módon? az állapotot a (segéd)függvény paraméterei tárolják, az állapot változása (vagy helybenmaradása) explicit! Mit nyertünk? Állapotmentes szemantika: egy nyelvi elem értelme nem függ a programállapottól Hivatkozási átlátszóság (referential transparency) pl. ha f (x) = x 2, akkor f (a) helyettesíthető a 2 -tel. Egyszeres értékadás (single assignment) párhuzamos végrehajthatóság. A deklaratív programok dekomponálhatók: A program részei egymástól függetlenül megírhatók, tesztelhetők, verifikálhatók. A programon könnyű következtetéseket végezni, pl. helyességét bizonyítani. Bevezetés: deklaratív programozás (II. rész) Alkalmazott funkcionális és logikai programozás (AFLP) 2012. ősz 21 / 21 Bevezetés: deklaratív programozás Jobbrekurzió Deklaratív programozási nyelvek előzetes tanulságok