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

Hasonló dokumentumok
FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

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

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

2018, Funkcionális programozás

2018, Funkcionális programozás

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

2016, Funkcionális programozás

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

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:

FUNKCIONÁLIS PROGRAMOZÁS

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

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

Adatszerkezetek 7a. Dr. IványiPéter

Tisztán funkcionális adatszerkezetek

Gyakorló feladatok Gyakorló feladatok

INFORMATIKA javítókulcs 2016

Cekla. Készítette Doxygen Tue Sep :13:44

2018, Funkcionális programozás

2018, Diszkrét matematika

S2-01 Funkcionális nyelvek alapfogalmai

SZÁMÍTÁSOK A TÁBLÁZATBAN

LUSTA KIÉRTÉKELÉS, LUSTA LISTA

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

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

Tartalomjegyzék. Köszönetnyilvánítás. 1. Az alapok 1

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Felvételi tematika INFORMATIKA

Mindent olyan egyszerűvé kell tenni, amennyire csak lehet, de nem egyszerűbbé.

RSA algoritmus. P(M) = M e mod n. S(C) = C d mod n. A helyesség igazoláshoz szükséges számelméleti háttér. a φ(n) = 1 mod n, a (a 1,a 2,...

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Adatszerkezetek 2. Dr. Iványi Péter

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

Problémamegoldás kereséssel. Mesterséges intelligencia március 7.

Mindent olyan egyszerűvé kell tenni, amennyire csak lehet, de nem egyszerűbbé. (Albert Einstein) Halmazok 1

Maple. Maple. Dr. Tóth László egyetemi docens Pécsi Tudományegyetem, 2007

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

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

Shannon és Huffman kód konstrukció tetszőleges. véges test felett

Matematika javítóvizsga témakörök 10.B (kompetencia alapú )

Fordítás Kódoptimalizálás

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

MATEMATIKA TANMENET SZAKKÖZÉPISKOLA 9.A, 9.D. OSZTÁLY HETI 4 ÓRA 37 HÉT ÖSSZ: 148 ÓRA

Python tanfolyam Python bevezető I. rész

Adatszerkezetek 2. Dr. Iványi Péter

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Matematika szóbeli érettségi témakörök 2016/2017-es tanév őszi vizsgaidőszak

1. Mondjon legalább három példát predikátumra. 4. Mikor van egy változó egy kvantor hatáskörében?

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

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

2016, Diszkrét matematika

Imperatív programozás

Tartalomjegyzék Algoritmusok - pszeudókód

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

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Algoritmusok pszeudókód... 1

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Bevezetés a Python programozási nyelvbe

Függvény fogalma, jelölések 15

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

2018, Diszkre t matematika. 10. elo ada s

Programozás alapjai II. (7. ea) C++

Bevezetés az informatikába

2015, Diszkrét matematika

Gyakorló feladatok az 1. nagy zárthelyire

1.1. Definíció. Azt mondjuk, hogy a oszója b-nek, vagy más szóval, b osztható a-val, ha létezik olyan x Z, hogy b = ax. Ennek jelölése a b.

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Komputeralgebra Rendszerek

Tulajdonságalapú tesztelés

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Kaposi Ambrus. University of Nottingham Functional Programming Lab. Hackerspace Budapest január 6.

8.3. AZ ASIC TESZTELÉSE

Példatár a bevezetés a Matlab programozásába tárgyhoz

1. Részcsoportok (1) C + R + Q + Z +. (2) C R Q. (3) Q nem részcsoportja C + -nak, mert más a művelet!

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Matematika pótvizsga témakörök 9. V

Függvények int, long 1. Adott a mellékelt f alprogram.

Baran Ágnes. Gyakorlat Komplex számok. Baran Ágnes Matematika Mérnököknek Gyakorlat 1 / 16

A modellellenőrzés érdekes alkalmazása: Tesztgenerálás modellellenőrzővel

Nagy Gábor compalg.inf.elte.hu/ nagy

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

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

ABSZTRAKCIÓ FÜGGVÉNYEKKEL (ELJÁRÁSOKKAL)

Objektumorientált Programozás III.

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

A programozás alapjai 1 Rekurzió

Makrók használata az Excelben - Makróhibák kezelése, biztonságos jelszavak generálása

Hatványozás. A hatványozás azonosságai

Robotok inverz geometriája

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

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana

2018, Funkcionális programozás

17.2. Az egyenes egyenletei síkbeli koordinátarendszerben

Algoritmusok pszeudókód... 1

Ellenőrző kérdések. 36. Ha t szintű indexet használunk, mennyi a keresési költség blokkműveletek számában mérve? (1 pont) log 2 (B(I (t) )) + t

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

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

S z á m í t ó g é p e s a l a p i s m e r e t e k

Átírás:

Logikai és funkcionális programozás funkcionális programozás modul A laborfeladatok írásához a Clean nyelvet használtuk a program ingyenesen letölthető a ftp://ftp.cs.kun.nl/pub/clean illetve a http://www.cs.kun.nl/~clean link-ekről. Példaprogramok: 1. egy szám faktoriálisának a kiszámítása: Start = fakt 6 // a függvény típusának a definiciója fakt :: Int -> Int fakt 0 = 1 fakt n n>0 = n * fakt (n-1) 2. egy lista legnagyobb elemének a meghatározása: Start = maxel [10,3,2,4] // egy lista a bemenő argumentum maxel :: [Int] -> Int maxel [x] = x maxel [hx:tx] hx > mt = hx otherwise = mt where mt = maxel tx 3. Euler algoritmusa egy pozitív szám négyzetgyökének a meghatározására: 1 y az algoritmus az xn+ 1 = xn + 2 x iterációt implementálja. n Start = root 15.0 root:: Real -> Real root x = until goodenough improve 1.0 where improve y = 0.5*(y + x/y) goodenough y = y*y ~=~ x // operátordefiníció (~=~) infix 5 :: Real Real -> Bool (~=~) a b = a-b < h && b - a < h where h = 0.00000001 4. Beszúrásos rendezés: Start = IIsortF [2, 1, 5, 7, 4, 3]

// a második argumentum a hívásnál lesz beírva IIsortF = foldr Insert [] IIsort:: [a] -> [a] Ord a IIsort x = foldr Insert [] x Insert:: a [a] -> [a] Ord a Insert e [] = [e] Insert e [f:v] e<f = [e,f:v] otherwise = [f] ++ (Insert e v) 5. Generáljuk az összes prímszámot: // lambda-függvény Start = filter (\ x = (divisors x) == [1,x] ) [1..] // az argumentumának az osztóit adja vissza divisors :: Int -> [Int] divisors x = filter (\ v = (x rem v) ==0) [1..x] 6. Generáljuk a pitagórászi számhármasokat n-ig: Start = pittrio 500 pittrio :: Int -> [(Int,Int,Int)] pittrio n = map thirdnum (pit2 n) where thirdnum (x,y) = (x,y,rtint(x*x+y*y)) // PIT-I számpárosokat térít vissza pit2 :: Int -> [(Int,Int)] pit2 n = [ (x,y) \\ x<-[1..n], y<-[1..n] x<y && issq(x*x+y*y)] // egészeken definiált négyzetgyök rtint :: Int -> Int rtint x = toint (sqrt (toreal x) ) // teljes négyzet tesztje issq :: Int -> Bool issq x = (x == y*y) where y = rtint x 7. Prímszámok generálása szűréssel (a lusta kiértékelés lazy evaluation miatt fut le a program): Start = sieve [2..] // _KIszűri a lista első elemének többszöröseit sieve :: [Int] -> [Int]

sieve [] = [] sieve [elsoprim:tll] = [elsoprim:sieve (kiszur elsoprim tll)] kiszur:: Int [Int] -> [Int] kiszur _ [] = [] kiszur elsoprim [hh:fff] (hh rem elsoprim) == 0 = (kiszur elsoprim fff) otherwise = [hh:(kiszur elsoprim fff)] Laborfeladatok A laborfeladatoknál felhasználható a http://www.cs.ubbcluj.ro/~csatol lapon elérhető dokumentáció a funkcionális programozással kapcsolatban. Követelmények: 1. feladatok megoldásánál írjunk komment-eket; 2. definiáljuk a típusát minden függvénynek; 3. próbáljuk a futási időt optimálni listákat egy alkalommal járjuk csak be, ne generáljunk fölöslegesen változókat; Feladatok a. Írjunk programot, mely egy számot egy pozitív egész hatványra emel....(1pt) b. Írjunk programot, mely visszaadja egy lista két legnagyobb elemét...(1pt) c. Írjunk egy programot a komplex számokkal való műveletek végzésére. 1. A programban írjuk felül az alapműveleteket (+, -, *, /), a negációt, az egyenlőségjelet (==)...(2pt) 2. Írjuk felül a zero, one, abs, tostring függvényt (használjuk az instance parancsot)...(2pt) 3. Definiáljunk egy függvényt lásd mkq az előadásból amely egy komplex számot hoz létre (1) a komplex síkból, (2) polár koordinátákból...(2pt) 4. írjunk kódot a fenti műveletek tesztelésére (használjuk a TUPLE kiírást). A program kimenete párok, ahol megjelennek a műveletek argumentumai, illetve az eredmény (lásd másodfokú egyenlet, ea.pdf)....(2pt) d. A komplex modul használatával írjunk programot az utazóügynök feladatra. A program bemenete egy lista komplex számokkal, mely tartalmazza a városok síkbeli koordinátáit. A kimenet egy lista, melyben a városokat az adott sorrendben bejárva a legkisebb lesz a megtett út...(5pt) Összesen 15 pont.

Opcionális feladat műveletek bináris fákkal Bináris fákat keresések gyorsítására használják. Használjuk a bináris fa algebrai típusdefiníciót ::Tree a = Node a (Tree a) (Tree a) Leaf Írjunk egy függvényt, mely egy egészekből álló lista elemeiből egy bináris keresési fát épít. Egy listából fát építeni úgy lehet, hogy iteratívan beszúrunk egy már létező bináris kezdetben üres fába elemeket. A függvény típusa treefromlist :: [Int] -> Tree Int A keresési fa bal részében a gyökér-elemnél kisebb elemek vannak, a jobb oldalon az annál nagyobb elemek két egyforma elemet nem tárolunk a fában. Egy példa erre a transzformációra a mellékelt ábra, amikor a [5, 1, 4, 3, 9, 6, 7, 9, 8] listát alakítjuk keresési fává. Az ábrán a nyilak jelzik az al-fákat. A kis nyilak jelzik azt, hogy a 3 7 lista véget ért (Leaf típusú konstruktor). Az átalakítás folyamán a leveleket egészítettük ki új elemekkel a listából. Írjuk meg az inverz műveletet is: a keresési fa 8 elemeinek listába fűzését....(4pt) Definiáljuk a tostring függvényt, amely megjeleníti a bináris fát. Egy lehetséges mód az alábbi: (5 (1 _ ; (4 (3 _;_);_));(9 (6 _;(7 _;(8 _;_)));_))...(1pt) Amennyiben a keresési fa nem kiegyensúlyozott, a keresés nem hatékony. A kiegyensúlyozottság az al-fák mélységének (depth függvény az előadás során) függvénye: ha a fa bal és jobb ágának a különbsége nagyobb, mint kettő, akkor a fa nem kiegyensúlyozott. Írjunk egy rekurzív függvényt, amely a fába úgy tesz be elemeket, hogy a fa kiegyensúlyozott legyen. Egy mód erre az, hogy, amennyiben szükséges, a beszúrandó elemet a fa gyökerében tároljuk. (dokumentáljuk a megoldást)...(5pt) Írjunk egy függvényt, mely egy kiegyensúlyozatlan fából egy kiegyensúlyozott fát hoz létre. A kritérium itt is a keresési fa alegységei mélységének a különbsége mely kettőnél kisebb kell, hogy legyen. (dokumentáljuk a megoldást)...(5pt) Összesen 15 pont. 1 4 5 6 9

A laborfeladatok megoldásai: a. Írjunk programot, mely egy számot egy pozitív egész hatványra emel....(1pt) pow :: Real Int -> Real pow x 1 = x pow x y = x*pow( x y-1) b. Írjunk programot, mely visszaadja egy lista két legnagyobb elemét...(1pt) twolargest :: [Int] -> [Int] twolargest [x,y] x>y = [x,y] = [y,x] twolargest [hx:rx] m1r < hx = [hx,m1r] m2r < hx = [m1r,hx] = [m1r,m2r] where [m1r:m2list] = twolargest rx m2r = hd m2list c. Írjunk egy programot a komplex számokkal való műveletek végzésére. // komplex típus ::Z = {v::real,i:: Real} 1. A programban írjuk felül az alapműveleteket (+, -, *, /), a negációt, az egyenlőségjelet (==)...(2pt) instance + Z where (+) a b = {v=(a.v+b.v),i=(a.i+b.i)} instance Z where (-) a b = {v=(a.v-b.v),i=(a.i-b.i)} instance * Z where (*) a b = {v=(a.v*b.va.i*b.i),i=(a.v*b.i+a.i*b.v)} instance / Z where (/) a b = {v=(a.v*b.v+a.i*b.i)/mb, i=(a.i*b.v-a.v*b.i)/mb} where mb = b.v*b.v + b.i*b.i instance == Z where (==) a b = ((a.v==b.v)&&(a.i==b.i)) 2. Írjuk felül a zero, one, abs, tostring függvényt (használjuk az instance parancsot)...(2pt) instance zero Z where zero = {v=0.0,i=0.0} instance one Z where one = {v=1.0,i=0.0} instance tostring Z where tostring z = (tostring z.v) +++ "+" +++ (tostring z.i) +++ "i\n" instance abs Z where abs z = {v=(sqrt(z.v*z.v + z.i*z.i)),i=0.0}

3. Definiáljunk egy függvényt lásd mkq az előadásból amely egy komplex számot hoz létre (1) a komplex síkból, (2) polár koordinátákból...(2pt) mkz :: (Real,Real) -> Z mkz (a,b) = {v=a,i=b} mkpz:: (Real,Real) -> Z mkpz (r,theta) = { v=r*cos(theta), i=r*sin(theta)} 4. írjunk kódot a fenti műveletek tesztelésére (használjuk a TUPLE kiírást). A program kimenete párok, ahol megjelennek a műveletek argumentumai, illetve az eredmény (lásd másodfokú egyenlet, ea.pdf)....(2pt) Start = (tostring a) +++ " es " +++ (tostring b) +++ " - RE\na+b: " +++ tostring(a + b) +++ " \na-b: " +++ tostring(a - b) +++ " \na*b: " +++ tostring(a * b) +++ " \na/b: " +++ tostring(a / b) where a = mkz(1.0,3.0) b = mkz(-3.0,2.0); d. A komplex modul használatával írjunk programot az utazóügynök feladatra. A program bemenete egy lista komplex számokkal, mely tartalmazza a városok síkbeli koordinátáit. A kimenet egy lista, melyben a városokat az adott sorrendben bejárva a legkisebb lesz a megtett út...(5pt) // permutáció generáló függvényt (a tetszőleges típus) pperm :: [a] ->[[a]] pperm [] = [[]]; pperm [a] = [[a]]; pperm [hd:tt] = [ iat i hd list \\ i <- [0..lTail], list <- pprev ] where ltail = length tt pprev = pperm tt // függvény, mely egy lista adott helyére beszúr egy elemet iat:: Int a [a] -> [a] iat 0 x l = [x:l] iat n x [] = [x] iat p x [h:t] = [h:(iat (p-1) x t)]; // segédfüggvény mely a valós abszolút értéket ad abs_r::z -> Real abs_r z = b.v where b = abs(z) // a lista hossza dlist::[z] -> Real dlist [] = abort "hiba!" dlist [x] = 0.0 dlist [h1:h2:t] = abs_r(h1-h2) + (dlist [h2:t]) // függvény, mely kiválasztja a legrövidebb utat.

mlist:: [[Z]] -> [Z] mlist [[]] = abort "hiba!" mlist [x] = x mlist [h:t] hl < tl = h = mt where hl = dlist h mt = mlist t tl = dlist mt // a program futtatása Start = mlist (pperm lv) where lv = [mkz(0.0,4.0),zero,one,mkz(2.0,4.0), mkz(2.0,3.0),mkz(4.0,0.0)]