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

Hasonló dokumentumok
2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

2016, Funkcionális programozás

2018, Funkcionális programozás

2018, Funkcionális programozás

2018, Funkcionális programozás

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

2019, Funkcionális programozás. 4. el adás. MÁRTON Gyöngyvér

2018, Diszkrét matematika

A félév során előkerülő témakörök

A TANTÁRGY ADATLAPJA

2018, Diszkre t matematika. 10. elo ada s

A TANTÁRGY ADATLAPJA

Programozás nyelvek a közoktatásban 1. előadás

2015, Diszkrét matematika

2016, Funkcionális programozás

FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

2016, Diszkrét matematika

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

Imperatív programozás

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

FUNKCIONÁLIS PROGRAMOZÁS

XML adatkezelés. 11. témakör. Az XQuery nyelv alapjai. XQuery. XQuery célja egy imperatív lekérdező nyelv biztosítása. XQuery.

Egyenletek, egyenlőtlenségek VII.

Számonkérési formák a BME-n a Deklaratív programozás című tárgyban

A rész (30 pont) A.1. Vajon mit csinál? (5 pont) A generál(n) algoritmus egy n természetes számot dolgoz fel (0 < n < 100).

Oktatási segédlet 2014

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Bemutatkozás. Bemutatkozás. Bemutatkozás. Bemutatkozás. 1. előadás. A tárgy címe: A programozás alapjai 1

Bevezetés az informatikába

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Deklaratív programozás

Logikai és funkcionális programozás funkcionális programozás modul

Imperatív programozás

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Programozási nyelvek 6. előadás

Megoldott programozási feladatok standard C-ben

1. Egészítsük ki az alábbi Python függvényt úgy, hogy a függvény meghatározza, egy listába, az első n szám faktoriális értékét:

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Programozás alapjai (ANSI C)

Funkcionális Nyelvek 2 (MSc)

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

Szkriptnyelvek. 1. UNIX shell

INFORMATIKA javítókulcs 2016

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

2018, Diszkrét matematika

A C programozási nyelv III. Pointerek és tömbök.

Imperatív programozás

Programozási nyelvek a közoktatásban alapfogalmak I. előadás

Objektumorientált paradigma és a programfejlesztés

Szelekció. Döntéshozatal

A C programozási nyelv III. Pointerek és tömbök.

BASH script programozás II. Vezérlési szerkezetek

2018, Diszkrét matematika

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Programzás I gyakorlat

Diszkrét matematika II. gyakorlat

Adatbázisok elmélete

Csima Judit szeptember 6.

Logikai programozás ADMINISZTRATÍV KÉRDÉSEK KÖVETELMÉNYRENDSZER FŐBB PONTOK NÉHÁNY BIZTATÓ SZÓ

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Felvételi tematika INFORMATIKA

Java programozási nyelv

Programok értelmezése

PROGRAMOZÁS tantárgy. Gregorics Tibor egyetemi docens ELTE Informatikai Kar

Objektumorientált paradigma és programfejlesztés Bevezető

Trigonometria Megoldások. 1) Oldja meg a következő egyenletet a valós számok halmazán! (12 pont) Megoldás:

Adatstruktúrák Algoritmusok Objektumok

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

Készítette: Nagy Tibor István

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Függvények

Egyenletek, egyenlőtlenségek, egyenletrendszerek I.

A programozás alapjai 1 Rekurzió

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

Bevezetés. Dr. Iványi Péter

Komputeralgebra Rendszerek

Kifejezések. Kozsik Tamás. December 11, 2016

2018, Funkcionális programozás

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Algoritmizálás és adatmodellezés tanítása 1. előadás

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Megoldások

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

Programozási nyelvek Python

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

2016, Diszkrét matematika

2018, Diszkre t matematika. 8. elo ada s

Bevezetés a C++ programozási nyelvbe

FELVÉTELI VIZSGA, szeptember 12.

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

Mintavételes szabályozás mikrovezérlő segítségével

Átírás:

Funkcionális és logikai programozás { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem } http://www.ms.sapientia.ro/~mgyongyi ` 1

Jelenlét: Követelmények, osztályozás Az első 4 előadáson való részvétel plusz 1 pontot jelent a vizsgán. A laborgyakorlat kötelező, hiányzás esetén kötelező az óra pótlása, ellenkező esetben csak a fizetéses vizsgán lehet részt venni. Vizsga (Kollokvium): A vizsga 9 pontos elméleti tételsorból áll. A vizsgázás időpontja megegyezik az utolsó előadás időpontjával. Az összes laborfeladat bemutatása (max 2 hetes késéssel) 10-es vizsgajegyet jelent. A vizsgán való részvétel követelménye, hogy a kitűzött labor feladatok 50%-ban legyenek leadva. Akik nem érik el a 7-es osztályzatot az elméleti vizsgán, azok kötelező gyakorlati vizsgát kell tegyenek, mely közvetlenül az írásbeli után következik. A fizetéses vizsgán való részvételhez nem kötelező a laborfeladatok bemutatása. 2

Funkcionális programozás: Könyvészet Horváth Zoltán: Programnyelvek/ A funkcionális programozási nyelvek elemei http://www.cs.ru.nl/~clean/ http://people.inf.elte.hu/csz/0506/funkimp.html Logikai programozás: Szeredi Péter, Benkő Tamas: Deklaratív programozás, oktatási segédlet Ásványi Tibor: A logikai programozás és a Prolog Peter Flach: Logikai programozás J.M.Spivey: An introduction to logic programming through Prolog http://www.swi-prolog.org/ http://aszt.inf.elte.hu/~asvanyi/pl/jegyzetek ELTE:http://people.inf.elte.hu/divip/ BME: http://dp.iit.bme.hu 3

Funkcionális és logikai programozáshoz szükséges install állományok, windows alá, a belső hálózaton, az alábbi szerveren Funkcionális programozás ( Clean2.1.1 ) \\kelemen\kit\programozás\clean2.1.1 Logikai programozás ( Prolog ) \\kelemen\kit\programozás\prolog Funkcionális és logikai programozáshoz szükséges segédanyag, a belső hálózaton: \\kelemen\tanaroktoldiakoknak\martongy\funkcionális \\kelemen\tanaroktoldiakoknak\martongy\logikai 4

Bevezető Funkcionális programozás Clean 2.1. 1. környezetben Jellemzők Listák Magasabb rendű függvények Operátorok Adatszerkezetek, algoritmusok I/O műveletek Témakörök Algoritmusok hatékonysága Eseménykezelés, grafikus felület Hálózati kommunikáció Logikai programozás Prolog környezetben, bevezető Alapfogalmak: aritmetika, listák, operátorok Algoritmusok I/O műveletek 5

Bevezető Programozási módszerek: imperatív programozás programozási nyelvek: assembly, Java, C, C++, alapeszköze: a ciklus utasítás deklaratív programozás Funkcionális programozás programozási nyelvek: Lisp, Haskell, Clean alapeszköze: a függvény Logikai programozás programozási nyelvek: Prolog, SQL alapeszköze: a reláció -tények, szabályok 6

az imperatív programozás sajátosságai: felszólító mód: parancsok, utasítások a lényeg az algoritmus megtalálása ( hogyan oldjuk meg a feladatot) pontosan követhetőek a végrehajtott lépések a változó: egy adott memória helyen tárolt aktuális érték, mely ismételten újabb és újabb értéket vesz fel 7

a deklaratív programozás sajátosságai: kijelentő mód: állítások, egyenletek a lényeg: az algoritmus leírása ( mit kell megoldanunk ) a végrehajtás, a nyelv értelmező, fordító programjától függ nem mindig követhetőek a végrehajtott lépések a változó: a matematikából ismert fogalomnak felel meg, tulajdonképpen egy ismeretlen, ami segítségével felírjuk az adott relációt, rekurzív összefüggést alkalmazási terület: Cad rendszerek, telekommunikáció, mesterséges intelligencia 8

C kód: 1 változat : int fakt0 ( int n ) { int i, res; if ( n<0 ) return -1; if ( n==0n ) return 1; for( i=1, res=1; i<=n; i++) res *= i; return res; } 2 változat: int fakt1 ( int n ) { if ( n<0 ) return -1; if ( n==0 n ) return 1; else return n * fakt1(n-1); } 3 változat: int fakt2 ( int res, int n) { if ( n<0 ) return -1; if ( n==0 n ) return res; return fakt2(n*res, n-1); } függvény hívások ok: X = fakt0 (10); X = fakt1 (10); X = fakt2 (1, 10); 9

Clean kód: 1 változat : fakt1 :: Int -> Int fakt1 0 = 1 fakt1 n = n * fakt1 (n-1) függvény hívás: Start = fakt1 10 2 változat : fakt2 :: Int -> Int fakt2 n n < 0 = -1 n == 0 = 1 = n * fakt2 (n-1) 3 változat: fakt3 :: Int Int -> Int fakt3 res n n < 0 = -1 n == 0 = res = fakt3 (n*res) (n-1) függvény hívás: Start = fakt3 1 10 függvény hívás: Start = fakt2 10 10

Prolog kód: fakt(0, 1). fakt(n, Res) :- N >0, N1 is N - 1, fakt(n1, Res1), Res is N * Res1. a formula kiértékelése: fakt(10, X). 11

Funkcionális programozás Clean 2.1.1. környezetben 12

Jellemzők feltételek megadása ( definition by cases ) : a függvény értékét az első, igaz egyenlőséghez tartozó kifejezés adja, mely kifejezést az aktuális paraméter értéke alapján kapjuk Pl: az argumentum előjelének a meghatározása alapok1.icl module alapok1 import StdEnv signum :: Int -> Int signum x x < 0 = -1 x > 0 = 1 x == 0 = 0 Start = signum -10 13

rekurzivitás ( definition by recursion ): a függvények hivatkozhatnak önmagukra és kölcsönösen egymásra Pl: két egész szám legnagyobb közös osztójának a meghatározása lnko :: Int Int -> Int lnko a b a > b = lnko (a-b) b a < b = lnko a (b-a) a == b = a Start = lnko 18 56 14

az argumentumok mintaillesztése ( definition by patterns ): a függvény értékét az a függvénytörzs határozza meg, amelyre a formális paraméter egy megadott minta alapján illeszkedik Pl1: egy három elemű lista elemeinek összeadása osszeg :: [Int] -> Int osszeg [] = 0 osszeg [x] = x osszeg [x,y] = x+y osszeg [x,y,z] = x+y+z //futási hibát ad Start = osszeg [2,3,4,5] Pl2: egy szám számjegyeinek összege isum :: Int -> Int isum 0 = 0 isum szam = ( szam rem 10 ) + isum (szam /10) Start = isum 123 a mintaillesztést és a feltételek megadását lehet együttesen alkalmazni 15

szigorú, statikus típusosság : a kifejezések típusát a fordítóprogram meghatározza úgy is, ha nincs az feltüntetve Pl: az argumentum abszolut értékének a meghatározása abszolut x x < 0 = ~x //az x értékének a negáltja = x Start = abszolut -10 abszolut :: Int -> Int abszolut :: Real -> Real abszolut x abszolut x x < 0.0 = ~x x < 0 = ~x x < 0 = x = x abszolut :: a -> a zero, <, ~ a abszolut x x < zero = ~x = x 16

Zermelo-Fraenkel halmazkifejezések: iteratív adatszerkezetek (listák, halmazok, sorozatok) elemeinek megadására alkalmazott jelölésrendszer Pl: egy szam osztóink a sorozata osztok :: Int -> [ Int ] osztok n = [ i \\ i <- [1..n] n rem i ==0] Start = osztok 100 17

speciális kifejezések: #, (let-before expression) az imperatív programozási stílushoz hasonló szerkezet egy feltétel, vagy a függvénytörzs előtt definiálható alkalmazható amikor a kiértékelési sorrend jól meghatározott Pl. gyok :: Real Real Real -> (Real, Real) gyok a b c #delta = sqrt(b*b-4.0*a*c) #d = 2.0*a = ( (~b + delta) / d, (~b - delta) / d ) Start = gyok 1.0 2.0 1.0 Megjegyzés: az sqrt könyvtárfüggvény 18

margó szabály: az összetartozó kifejezések meghatározására a baloldali margó változtatását kell alkalmazni PL.: másodfokú egyenlet gyökeinek a meghatározása gyok :: Real Real Real -> (Real, Real) gyok a b c = ( (~b + delta) / d, (~b - delta) / d ) where delta = sqrt(b*b-4.0*a*c) d = 2.0*a delta a = 3*a Start = gyok 1.0 2.0 1.0 Melyik delta kifejezés értékelődik ki? Start = delta 2 19

különböző típusok együttes alkalmazása Pl. gyok :: Real Real Real -> (String, [Real]) gyok a b c #delta = sqrt(b*b-4.0*a*c) #d = 2.0*a delta < 0.0 = ("komplex gyokok", []) delta == 0.0 = ("egy gyok", [~b/d]) = ("ket gyok", [ (~b + delta) / d, (~b - delta) / d ]) Start = gyok 1.0 3.0 1.0 20

magasabb rendű függvények ( high order function ) I argumentumuk lehet függvény visszatérítési értékük lehet függvény, mely más függvénynek is szolgálhat argumentumul Pl 1. my_inc x = x+1 my_twice f x = f (f x) Start = my_twice my_inc 0 Pl 2. Start = map sqrt [ 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 ] Megjegyzés: a map könyvtárfüggvény, két argumentuma van: az első egy függvény, melyet alkalmaz a listaként megadott második argumentumára 21