Z-skeemojen animointi Haskellilla

Koko: px
Aloita esitys sivulta:

Download "Z-skeemojen animointi Haskellilla"

Transkriptio

1 Z-skeemojen animointi Haskellilla Antti-Juhani Kaijanaho 6. toukokuuta 2001 Sisältö 1 Johdanto 2 2 Joitakin funktionaalisen ohjelmoinnin käsitteitä Imperatiivinen funktionaalinen ohjelmointi Hindley-Milner-tyyppijärjestelmä 3 3 Joukot ja logiikka 4 4 Funktiot 5 5 Skeemat Tilaskeemat Operaatioskeemat Käyttöliittymä 7 6 Pääohjelma 8 7 Jatkoa 9 Formaalit menetelmät -kurssin seminaarityö 1

2 1 Johdanto Formaaleilla menetelmillä pyritään luomaan täsmällinen ja yksikäsitteinen ohjelman toiminnallisuuden määritelmä (specifications). Kun ohjelmasta on sitten tehty toteutus, on suhteellisen helppo varmistaa, että ohjelma täyttää määritelmän. Mutta kuinka voidaan olla varmoja, että määritelmä vastaa ohjelmalle asetettuja vaatimuksia (requirements), kuinka se voidaan validoida? Spesifikaation validointi voidaan tehdä esimerkiksi johtamalla siitä yleisiä lauseita, joita verrataan vaatimuksiin. Jos vaatimukset ja lauseet eivät käy yksiin, spesifikaatio on rikki. On esitetty, että tämän tulisi olla ainoa validoinnin keino [5]. Toinen tapa on animoida spesifikaatio. Tällöin spesifikaatio on joko sellaisenaan tai suhteellisen pienin muutoksin ajettavissa (executable) joko tulkin tai kääntäjän avulla. Tätä lähestymistapaa on puolustettu mm. artikkelissa [3]. Animoinnin tuottama ajattava ohjelma on vain harvoin ohjelman käypä implementaatio. Animointi on yleensä varsin suoraviivainen tai vähintäänkin mekaaninen prosessi, jonka on tarkoitus olla mahdollisimman nopea. Sen sijaan tuotettu ohjelma on usein hyvin tehoton jopa käyttökelvottomuuteen asti. Animoinnissa epätriviaalit ongelmat lakaistaan yleensä maton alle, jolloin animoinnin tulos saattaa sisältää jopa eksponentiaalisia algoritmeja. Tämä ei haittaa, koska animoinnin tulosta ei olekaan tarkoitus käyttää oikeasti, vaan sillä tarkastetaan, että spesifikaation mukainen ohjelma toimii niinkuin vaatimuksissa on määrätty. 1 Z-notaation [15] animointia on tutkittu varsin paljon. Yleensä esitetyt animointimenetelmät muuntavat spesifikaation mekaanisesti jollakin kielellä kirjoitetuksi ohjelmaksi, joka voidaan sitten ajaa tulkin avulla tai kääntää ajettavaksi, konekieliseksi ohjelmaksi. Esimerkiksi Mirandaa [1], Haskellia [4, 13, 14] ja LSL:ää [3] on käytetty Z-notaation animointiin. Tarkastelen tässä kirjoitelmassa Z:lla [15] kirjoitettujen spesifikaatioiden animointia Haskellilla [10, 11]. Oletan lukijan hallitsevan sekä Z:aa että Haskellia jonkin verran. Haskellia taitamattomat voivat tutustua seuraaviin materiaaleihin: [2, 6, 7, 12]. Tässä kirjoitelmassa käytetään esimerkkinä BlockHandler-spesifikaatiota, joka on kokonaisuudessaan luentomonisteessa [8, luku 12]. Sen animaation listaus on liitteenä. Pääosan kirjoitelmasta muodostaa sellaisen epämuodollisen ajattelutavan esittely, jota soveltamalla Z-notaatio kääntyy suhteellisen helposti Haskelliksi. Metodi on suurimmaksi osaksi täysin mekaaninen, ja uskon, että lisätutkimuksella se voidaan saattaa täysin mekaaniseksi. Metodi on kokonaisuudessaan itse muodostamani, mutta osa sen ideoista on peräsin Abdallahin et al. [1] ja Goodmanin [4] metodeista. Kumpaakaan metodia ei olisi voinut käyttää sellaisenaan: Abdallahin et al. metodin kohdekieli on Miranda, joka joissakin kohdin eroaa Haskellista, ja Goodmanin metodista, jonka kohdekieli oli varsin ratkaisevasti vanhentunut Haskellin versio, tiedossani oli vain yleinen esittely. Olen koonnut Haskell-modulin Z, joka sisältää joitakin usein tarvittavia määrittelyjä. Sen listaus on liitteenä. 1. Ehkä se on jopa hyvä asia. Onhan tunnettua, että liian hyvältä näyttävän prototyypin näyttäminen tilaajalle saattaa katkaista rahahanat, kun tilaaja kuvittelee ohjelman olevan valmis. 2

3 2 Joitakin funktionaalisen ohjelmoinnin käsitteitä Funktionaalisen ohjelmoinnin perusidea on ajatella ohjelmaa funktiona eikä käskynä: sen sijaan, että ohjelma muuttaa maailman tilaa, se ottaa maailman tilan parametrinaan ja palauttaa uuden maailman tilan. Tämän vuoksi funktionaalinen ohjelmointi soveltuu varsin hyvin Z-skeemojen animointiin, sillä niissä myös luodaan uusi tila eikä muuteta vanhaa. 2.1 Imperatiivinen funktionaalinen ohjelmointi Haskell noudattaa uudempaa imperatiivisen funktionaalisen ohjelmoinnin paradigmaa suhteessaan ulkomaailman kanssa operointiin. Tässä mallissa puhtaasti funktonaalinen ohjelma tuottaa tuloksenaan arvon, joka esittää potentiaalista tekoa. Tämän teon kuvaama teko tehdään, kun ohjelma päättyy. Näin imperatiivisesti funktionaalinen ohjelma ikäänkuin päättyy ennen kuin se on alkanutkaan. Imperatiivisen funktionaalisen ohjelmoinnin keskeinen käsite on monadi. Monadikäsite on peräisin maailman hyödyttömimmäksi kutsutusta matematiikan osa-alueesta eli kategoriateoriasta. Matemaattisesti ottaen monadi on mikä tahansa joukko Y X, jolle on määritelty operaatiot return : X Y X ja >>= : Y X (X Y X ) Y X siten, että tietyt lait [16, luku 2.5] pätevät. Ohjelmoijan kannalta monadi on geneerisesti polymorfinen tyyppi, jonka arvot esittävät potentiaalisia tekoja. Monadioperaatio return ruiskuttaa puhtaan arvon monadiin, jolloin tuloksena on potentiaalinen teko, joka aktualisoituessaan ei tee mitään muuta kuin tuottaa tuloksekseen kyseisen arvon. Operaatio >>= taas peräkkäistää kaksi tekoa: se ottaa kaksi parametria (potentiaalisen teon ja funktion, joka tuottaa potentiaalisen teon) ja tuottaa potentiaalisen teon, joka aktualisoituessaan ensin aktualisoi ensimmäisen argumentin, antaa sitten tuon teon tuloksen toiselle argumentille argumenttina ja aktualisoi lopuksi tuon argumentin palauttaman potentiaalisen teon. Haskellissa on kaksi hyödyllistä ja käytännönläheistä esimerkkiä monadista. Toinen on IOmonadi ja toinen Maybe-monadi. IO-monadi on Haskellin tapa olla yhteydessä ulkomaailmaan. Siihen kuuluu monadioperaatioiden lisäksi primitiivifunktioita kuten getline. Maybe-monadi mallittaa epävarmuutta: sen arvot ovat joko Just jotakin tai Nothing. 2.2 Hindley-Milner-tyyppijärjestelmä Haskellin edustamassa funktionaalisen ohjelmoinnin koulukunnassa käytetään Hindley-Milner-tyyppisysteemin [9] muunnelmia. Hindley-Milner-tyypitystä käyttävät kielet ovat erittäin vahvasti tyypitettyjä 2. Haskellin käyttämässä Hindley-Milner-tyypityksessä on olemassa mm. seuraavat tavat muodostaa tyyppejä: tyyppivakiot (esimerkiksi Bool), algebralliset tyypit (olennaisesti karteesisten tulojen erillisiä yhdisteitä) ja funktiotyypit. Lisäksi Haskell sisältää Hindley-Milner-tyypityksen laajennoksen, tyyppiluokat [17], jotka mahdollistavat olio-ohjelmoinnista tutun rajapinnan perinnän (mutta ei toteutuksen perintää). Näiden avulla ohjelmoija voi ilmaista minkä tahansa lausekkeen tyypin tai olla ilmaisematta, sillä kääntäjä osaa useimmissa tapauksissa päätellä ne. 2. Näihin verrattuna esimerkiksi C on heikosti tyypitetty. 3

4 Z-notaatio P tyyppi joukko1 joukko2 joukko1 joukko2 joukko1 \ joukko2 joukko1 joukko2 joukko1 = joukko2 alkio joukko Haskell-notaatio P tyyppi emptyp joukko1 $\/ joukko2 joukko1 $/\ joukko2 joukko1 $\ joukko2 joukko1 $ = joukko2 joukko1 = joukko2 alkio memberof joukko listtoset lista settolist joukko 3 Joukot ja logiikka Taulukko 1: Z-modulin joukko-operaatioita Z:n joukko voidaan esittää Haskellissa listana. Z-modulissa joukko käsitetään listaksi, joka on kapseloitu omaksi parametrisoiduksi tietotyypikseen P a. Joukoille on Z-modulissa määritelty operaatioita, jotka on esitetty taulukossa 1. Logiikka voidaan kirjoittaa Haskellilla pääosin sellaisenaan. Z-moduli määrittelee myös kvanttorit forall :: P a -> (a -> Bool) -> Bool ja exists :: P a -> (a -> Bool) -> Bool. Z-lauseke x : joukko predikaatti kirjoitetaan Haskellilla forall joukko $ \x -> predikaatti ja vastaavasti Z-lauseke x : joukko predikaatti kirjoitetaan exists joukko $ \x -> predikaatti Kvanttoreita käytettäessä on huomattava, että joukko, jonka yli kvantifioidaan, on valittava tarkasti. Aina ei voida valita samoin kuin Z-notaatiossa. Yleisesti ottaen ei voida kvantifioida yli jonkin tyypin, vaan mielummin kvantifioidaan yli jonkin konkreettisen joukon. Vaikka äärettömien joukkojen käyttö onnistuukin Haskellissa varsin hyvin, ei sellaisen yli kvantifiointi ole mahdollista kuin triviaaleissa tapauksissa. Jos tätä tarvitaan jonkin muuttujan arvon määrittelemiseen, joudutaan määritelmä kirjoittamaan hieman konstruktiivisempaan muotoon, mikä usein onnistuu helposti Haskellin standardifunktioiden kuten filter luovalla käytöllä. Tästä olkoon esimerkkinä joukkojen leikkauksen Haskell-määritelmä Z-modulista: xset $/\ yset = listtoset $ (flip filter) xs $ \x -> exists ys $ \y -> x == y where xs = settolist xset ys = settolist yset 4

5 Z-notaatio tyyppi1 tyyppi2 f x dom f ran f joukko f f joukko Haskell-notaatio F tyyppi1 tyyppi2 x dom f ran f joukko < f f > joukko 4 Funktiot Taulukko 2: Z-modulin funktio-operaatioita Z:n funktiot ovat yleensä tietorakenteita eivätkä proseduureja, joten niiden esittämiseen eivät sovi Haskellin funktiot. Sen sijaan Z-modulissa määritellään abstrakti, parametrisoitu tietotyyppi F a b. Se noudattaa osittaisfunktion invarianttia, joten kaikilla määrittelytyypin alkioilla ei ole välttämättä kuvaa. Tällaisia funktioita pääsee rakentamaan ja muuttamaan Haskell-funktioiden makef :: (Eq a, Eq b) => P (a, b) -> F a b (joka konstruoi funktion joukosta, joka on karteesisen tulon osajoukko) ja f2p :: F a b -> P (a, b) (joka toimii toisin päin) avulla. Taulukossa 2 esitellään funktioiden operaatiot, joista osan epäilemättä saisi suhteellisen helposti yleistettyä relaatioillekin. Haskellin funktioita on toki hyvä käyttää silloin, kun funktion määritelmä ei muutu ohjelman aikana. 5 Skeemat Voi olla hyvä idea kirjoittaa jokaisen skeeman käännös omaksi Haskell-modulikseen, mutta se ei ole ehdottaman välttämätöntä. 5.1 Tilaskeemat Yksinkertaiset tilaskeemat, jotka viittaavat vain omiin tilamuuttujiinsa, voidaan toteuttaa Haskellissa algebrallisena tietotyyppinä. Tällöin kutakin tilamuuttujaa varten varataan tyypissä yksi paikka. Muuttujien nimiä ei voi järkevästi kirjata tietotyyppiin standardi-haskellissa, mutta se ei käytännössä juurikaan haittaa. Tilaskeemaa vastaava algebrallinen tietotyyppi on hyvä parametrisoida ja varata tyypin viimeinen (tai ensimmäinen) paikka parametrityyppiseksi. Tällöin operaatioskeemojen syötteet ja tulosteet on helppo kuljettaa tilan mukana. Esimerkiksi BlockHandler-skeema toteutetaan tietotyyppimäärittelynä seuraavasti: data BlockHandler a = BlockHandler (P BlockType) [P BlockType] a Tilan invariantit saadaan mallinnettua niin, että konstruktorin sijaan käytetään aina erillistä luontifunktiota tila-arvon luontiin. Tällainen luontifunktio sitten tarkistaa invariantin ennen kuin luo arvon. Esimerkiksi: 5

6 makeblockhandler used blockseq more forall (listtoset blockseq) ($ = used) && (forall blockinx $ \i -> forall blockinx $ \j -> i == j (blockseq!! i) $/\ (blockseq!! j) == emptyp) = (BlockHandler used blockseq more) otherwise = error "unsatisfied invariant for BlockHandler" where blockinx = (listtoset [0.. length blockseq - 1]) Tilaskeemoja, jotka viittaavat oman tilansa ulkopuolelle, ei voi toteuttaa itsenäisinä, vaan ne on yhdistettävä johonkin toiseen tilaskeemaan. Kahden tilaskeeman yhdistämisen tapauksessa luodaan kolmen skeeman (kaksi yhdistettävää ja yhdiste) sijasta kaksi: toinen on perusskeema ja toinen on sen laajennos. Laajennoksen tilan yhdeksi komponentiksi otetaan perusskeeman tila. Esimerkiksi: data UserBlockHandler a = UserBlockHandler (BlockHandler a) (P UserType) (F BlockType UserType) a 5.2 Operaatioskeemat Operaatioskeemat mallinnetaan Haskellin funktioina, jotka ottavat tilan parametrinaan ja palauttavat sen Maybe-monadissa. Skeeman syötteet ja tulosteet välitetään tilan tyyppiparametrisoidussa paikassa. Tyypillisen operaatioskeeman tyyppimerkintä on siis Tilatyyppi Syötetyyppi -> Maybe (Tilatyyppi Tulostyyppi) Osittaiseksi operaatioskeemaksi sanotaan operaatioskeemaa, jonka esiehdot saattavat hylätä joitakin tila-syötekombinaatioita. Tällaisen skeeman animaation runko on tavallisesti seuraava: skeema (tilan-pattern-match) = precond (esiehto) (paluutilan-konstruointi) where jälkitilamuuttujien-määrittelyt Esimerkiksi: addblocks :: BlockHandler (P BlockType) -> Maybe (BlockHandler ReportType) addblocks (BlockHandler used blockseq ablocks) = precond (ablocks $ = used) (makeblockhandler used blockseq "") where used = used blockseq = blockseq ++ [ablocks] Tässä käytetty precond on Z-modulissa määritelty Haskell-funktio. Huomaa, että samaksi operaatioskeemaksi yhdistettävien osittaisten operaatioskeemojen tyyppitunnisteiden on oltava samat, joten niillä on oltava täsmälleen samat syötteet ja tulosteet osa voi 6

7 toki jäädä joiltakin skeemoilta käyttämättä, kuten edellisessä esimerkissä. Osittaiset operaatioskeemat, jotka käyttävät laajennettua tilaa, ovat hitusen monimutkaisempia sisäkkäisten tilojen vuoksi. Jokseenkin hankalia ovat tilanteet, joissa operaatioskeema laajentaa olemassaolevaa skeemaa. Tästä annan vain esimerkin: removeuserblocks :: UserBlockHandler () -> Maybe (UserBlockHandler ReportType) removeuserblocks (UserBlockHandler used blockseq _) users bl_use _) = precond ((ran hrs $ = users) && (isjust bh )) $ makeuserblockhandler ((\(Just x) -> x) bh ) users bl_use "" where hrs = head blockseq < bl_use bh = removeblocks bh users = users bl_use = makef ((f2p bl_use) $\ (f2p hrs)) Osittaisista operaatioskeemoista kootaan toisia operaatioskeemoja Z-modulissa määriteltyä \/- operaattoria käyttäen: doaddblocks :: BlockHandler (P BlockType) -> Maybe (BlockHandler ReportType) doaddblocks = addblocks \/ freeblocktoqueue 5.3 Käyttöliittymä Käyttöliittymäskeemojen animointi on kinkkistä puuhaa. Käyttämäni tapa on luultavasti epäoptimaalinen, mutta yksinkertaisen tavan löytäminen ei ole ihan helppoa. Perusidea on se, että kuten edellä komentoskeemat animoidaan erikseen. Aiemmasta poiketen kuitenkin nämä on tarkoitus yhdistää varsinaisiin operaatioskeemoihin konjunktiivisesti eikä disjunktiivisesti, joten komentoskeemojen animointistrategiakin on erilainen. Komentoskeeman animaation tyyppitunniste on seuraavanlainen: Tilatyyppi Komentotyyppi -> IO (Maybe (Tilatyyppi Operaaation-syötetyyppi)) Toisin sanoen komentoskeeman tulee komennon tarkistettuaan lukea käyttäjältä tarvittavat syötteet. Tämä tekee komentoskeeman animaatiokaavasta sotkuisen: skeema (tilan-pattern-match) = if onko-komento-oikea then return Nothing else do kysy-syötteet return $ Just $ konstruoi-paluutila Esimerkki: doblocksofusercommand :: UserBlockHandler (Command) -> IO (Maybe (UserBlockHandler (UserType))) 7

8 doblocksofusercommand (UserBlockHandler (BlockHandler used blockseq _) users bl_use cmd) = if cmd /= "bou" then return Nothing else do putstr "user> " user <- getline return $ Just $ (UserBlockHandler (BlockHandler used blockseq user) users bl_use user) Suoritusskeeman animaation tehtävänä on yhdistää komentoskeema ja vastaava operaatioskeema konjunktiivisesti. Tässä käytetään hyväksi Maybe-tyypin monadisuutta: yhdistäminen tehdään monadioperaatiolla»=. Animaatiokaava on kuitenkin hieman monimutkaisempi, koska myös IOmonadi on kuvassa mukana: Esimerkki: suoritusskeema a = do res <- komentoskeema a return $ res»= operaatioskeema codoremoveuserblocks a = do res <- doremoveuserblockscommand a return $ res >>= doremoveuserblocks Jäljelle jää enää kokonaisuus, josta näytän aluksi animaatiokaavan skeema u = try [ suoritusskeema1, suoritusskeema2,... suoritusskeeman ] u»= putstrln. show ja sitten esimerkin handleuserblocks u = try [ codoaddblocks, codoremoveuserblocks, codoblocksofuser, unknowncommand ] u >>= putstrln. show Haskell-funktio try määritellään Z-modulissa. 6 Pääohjelma Toimiakseen animoitu ohjelma tarvitsee pääohjelman. Sen animointikaava on seuraavanlainen: main :: IO () main= main initialisoi-tila where 8

9 main (tilan-pattern-match) = do putstr ": " cmd <- getline if cmd == "" then return () else do tilan-pattern-match <- luo-tila-jossa-cmd main luo-komennoton-tila Esimerkiksi: main :: IO () main = main inituserblockhandler where main (UserBlockHandler (BlockHandler a b _) c d _) = do putstr ": " cmd <- getline if cmd == "" then return () else do (UserBlockHandler (BlockHandler a b _) c d _) <- handleuserblocks (makeuserblockhandler (makeblockhandler a b cmd) c d cmd) main (makeuserblockhandler (makeblockhandler a b ()) c d ()) 7 Jatkoa Esittelemäni metodi tulisi formalisoida täysin mekaaniseksi proseduuriksi ja se tulisi todistaa oikeaksi. Viitteet [1] Ali E. Abdallah, Alexandra Barros, José B. Barros, ja Jonathan P. Bowen. Deriving correct prototypes from formal Z specifications. Tekninen raportti SBU-CISM-00-27, South Bank University School of Computing, Information Systems and Mathematics, [2] Richard Bird. Introduction to Functional Programming using Haskell. Prentice Hall, toinen laitos, [3] Norbert E. Fuchs. Specifications are (preferably) executable. IEE/BCS Software Engineering Journal, 7(5): ,

10 [4] Howard S. Goodman. The Z-into-Haskell tool-kit. Tekninen raportti, University of Birmingham School of Computer Science, huhtikuu, [5] I. J. Hayes ja C. B. Jones. Specifications are not (necessarily) executable. Tekninen raportti, Key Centre for Software Technology, Department of Computer Science, University of Queensland, St. Lucia, Queensland, Australia 4072, tammikuu [6] Paul Hudak, John Peterson, ja Joseph H. Fasel. A gentle introduction to Haskell kesäkuu [7] Antti-Juhani Kaijanaho. Haskell 98: Puhdasta funktionalismia nonstriktissä paketissa [8] Tommi Kärkkäinen. Formaalit menetelmät. Luentomoniste, Jyväskylän yliopisto, tietotekniikan laitos, [9] Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 7(3): , [10] Simon Peyton Jones, John Hughes, et al. Report on the programming language Haskell 98 a non-strict, purely functional language. helmikuu [11] Simon Peyton Jones, John Hughes, et al. Standard libraries for the Haskell 98 programming language. helmikuu [12] Fethi Rabhi ja Guy Lapalme. Algorithms A Functional Programming Approach. Addison- Wesley, toinen laitos, [13] L. B. Sherrell ja D. L. Carver. Z meets Haskell: A case study. Kirjassa 17th Annual International Computer Software and Applications Conference, ss , [14] L. B. Sherrell ja D. L. Carver. Experiences in translating Z designs to Haskell implementations. Software Practice and Experience, 24(12), [15] J. M. Spivey. The Z Notation: A Reference Manual. J. M. Spivey, Oriel College, Oxford, OX1 4EW, England, [16] Philip Wadler. How to declare an imperative. ACM Computing Surveys, 29(3), syyskuu [17] Philip Wadler ja Stephen Blott. How to make ad-hoc polymorphism less ad hoc. Kirjassa 16th ACM Symposium on Principles of Programming Languages, Austin, Texas, tammikuu

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006 Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet TIES341 Funktio-ohjelmointi 2 Kevät 2006 Alkuperäislähteitä Philip Wadler & Stephen Blott: How to make ad-hoc polymorphism less ad-hoc,

Lisätiedot

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

Haskell ohjelmointikielen tyyppijärjestelmä

Haskell ohjelmointikielen tyyppijärjestelmä Haskell ohjelmointikielen tyyppijärjestelmä Sakari Jokinen Helsinki 19. huhtikuuta 2004 Ohjelmointikielten perusteet - seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 1 Johdanto 1 Tyyppien

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 14: Monadit Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Tyyppien tyypit eli luonteet engl. kind tyyppinimet, kuten

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Aloitusluento Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 7. tammikuuta 2008 Aikataulu Luennot salissa Ag C231.1: ma klo 10 12, to klo 14-16

Lisätiedot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset 815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 5 Ympärysmitta. Puut. Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 CASE: YMPÄRYSMITTA Lasketaan kuvioiden ympärysmittoja

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 10 Todistamisesta Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Samuuden todistaminen usein onnistuu ihan laskemalla

Lisätiedot

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa 2.6. TIETOKONE LASKIMENA 23 Edellä esitetty Ydin-Haskell on hyvin lähellä sitä kieltä, jota GHCi (Glasgow Haskell Compiler, Interactive) sekä muut Haskell-järjestelmät suostuvat ymmärtämään. Esimerkiksi:

Lisätiedot

Geneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Geneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Geneeriset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 6. maaliskuuta 2007 Kysymys Mitä yhteistä on seuraavilla funktioilla?

Lisätiedot

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005 Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005 Esimerkki: Laskin Liukulukulaskentaa Yhteen, vähennys, kerto ja jakolaskut Syötteenä laskutehtävä, tulosteena tulos tai virheilmoitus

Lisätiedot

Luku 5. Monadit. 5.1 Siirrännän ongelma

Luku 5. Monadit. 5.1 Siirrännän ongelma Luku 5 Monadit There are lots of books about functional programming in Haskell. They tend to concentrate on the beautiful core of functional programming: higher order functions, algebraic data types, polymorphic

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 4 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 17. tammikuuta 2008 Modulin viimeistelyä module Shape ( Shape ( Rectangle, E l l i p

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 9 Kombinaattoreista Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Currying Haskell-funktio ottaa aina vain yhden

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA34 Funktio-ohjelmointi, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 2. tammikuuta 2008 Ydin-Haskell: Syntaksi Lausekkeita (e) ovat: nimettömät funktiot: \x

Lisätiedot

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tyyppejä ja vähän muutakin TIEA341 Funktio ohjelmointi 1 Syksy 2005 Viime luennolla... Haskellin alkeita pääasiassa Hello World!... ja muita tutunoloisia ohjelmia Haskellilla Haskellin voima on kuitenkin

Lisätiedot

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan.

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan. 3.1. LISTAT 35 destaan pisteittäisesti: init :: [α] [α] init (x : []) = [] init (x : xs) = x : init xs Varuskirjastoon kuuluu myös funktiot take ja drop, jotka ottavat tai tiputtavat pois, funktiosta riippuen,

Lisätiedot

Haskell 98. Puhdasta funktionalismia nonstriktissä paketissa. Antti-Juhani Kaijanaho

Haskell 98. Puhdasta funktionalismia nonstriktissä paketissa. Antti-Juhani Kaijanaho Haskell 98 Puhdasta funktionalismia nonstriktissä paketissa Antti-Juhani Kaijanaho Haskell 98: Puhdasta funktionalismia nonstriktissä paketissa Antti-Juhani Kaijanaho Copyright 1999 Antti-Juhani Kaijanaho

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 11 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Listakomprehensio Uusi tapa luoda (ja muokata) listoja: [ lauseke

Lisätiedot

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Abstraktit tietotyypit TIEA341 Funktio ohjelmointi 1 Syksy 2005 Data abstraktio Abstraktio on ohjelmoinnin tärkein väline Data abstraktio abstrahoi dataa Abstrakti tietotyyppi Koostuu kolmesta asiasta:

Lisätiedot

Computing Curricula 2001 -raportin vertailu kolmeen suomalaiseen koulutusohjelmaan

Computing Curricula 2001 -raportin vertailu kolmeen suomalaiseen koulutusohjelmaan Computing Curricula 2001 -raportin vertailu kolmeen suomalaiseen koulutusohjelmaan CC1991:n ja CC2001:n vertailu Tutkintovaatimukset (degree requirements) Kahden ensimmäisen vuoden opinnot Ohjelmistotekniikan

Lisätiedot

5.3 Laskimen muunnelmia 5.3. LASKIMEN MUUNNELMIA 57

5.3 Laskimen muunnelmia 5.3. LASKIMEN MUUNNELMIA 57 5.3. LASKIMEN MUUNNELMIA 57 Samaan sarjaan kuuluu seuraavakin funktio, jonka määritelmä esittelee muutenkin hyödyllisen tavan kirjoittaa ohjelmia: getline :: IO String getline = getchar λc case c of \n

Lisätiedot

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006 Taas laskin TIES341 Funktio ohjelmointi 2 Kevät 2006 Rakennepuutyyppi data Term = C Rational T F V String Term :+: Term Term : : Term Term :*: Term Term :/: Term Term :==: Term Term :/=: Term Term :

Lisätiedot

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion. Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion. Vastaavuus puolestaan on erikoistapaus relaatiosta.

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:

Lisätiedot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 811122P (5 op.) 12.12.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen

Lisätiedot

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, todistamisesta (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 7. 11. 2011 Sisältö 1 Muuttujan arvon muuttaminen: set! 2 SICP-oliot

Lisätiedot

Funktio-ohjelmoinnin hyödyntäminen peliohjelmoinnissa

Funktio-ohjelmoinnin hyödyntäminen peliohjelmoinnissa Simo Rinne Funktio-ohjelmoinnin hyödyntäminen peliohjelmoinnissa Tietotekniikan kandidaatintutkielma 28. huhtikuuta 2015 Jyväskylän yliopisto Tietotekniikan laitos Tekijä: Simo Rinne Yhteystiedot: simo.e.rinne@student.jyu.fi

Lisätiedot

5.5 Jäsenninkombinaattoreista

5.5 Jäsenninkombinaattoreista 5.5. JÄSENNINKOMBINAATTOREISTA 67 type Env α = FiniteMap String α data EnvT m α = MkE (Env Integer m (Env Integer, α)) instance Transformer EnvT where promote mp = MkE $ λenv mp λr return $(env, r) instance

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Rajoite-esimerkki, funktionaalista ohjelmointia (mm. SICP 3.3.5, 3.5) Riku Saikkonen 8. 11. 2012 Sisältö 1 SICP 3.3.5 esimerkki: rajoitteiden vyörytysjärjestelmä

Lisätiedot

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Oliot ja tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 19. maaliskuuta 2007 Olion tyyppi? attribuutti on oikeastaan metodi,

Lisätiedot

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006 Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006 Materiaalia Paras verkkomatsku: http://www.nomaware.com/monads/html/ Komentoanalogiasta vielä Monadityypin

Lisätiedot

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia Antti-Juhani Kaijanaho 16. helmikuuta 2009 Tyypitetyt ohjelmointikielet sisältävät paljon muitakin konstruktioita kuin yksinkertaisesti tyypitetyn lambda-kielen,

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset Luku 4 Tietorakenteet funktio-ohjelmoinnissa Koska funktio-ohjelmoinnissa ei käytetä tuhoavaa päivitystä (sijoituslausetta ja sen johdannaisia), eivät läheskään kaikki valtavirtaohjelmoinnista tutut tietorakenteet

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

Common Lisp Object System

Common Lisp Object System Common Lisp Object System Seminaarityö Tomi Vihtari Ohjelmointikielten periaatteet kevät 2004 Helsingin Yliopisto Tietojenkäsittelytieteen laitos Järvenpää 5. huhtikuuta 2004 Sisältö 1 Johdanto... 1 2

Lisätiedot

Tarkennamme geneeristä painamiskorotusalgoritmia

Tarkennamme geneeristä painamiskorotusalgoritmia Korotus-eteen-algoritmi (relabel-to-front) Tarkennamme geneeristä painamiskorotusalgoritmia kiinnittämällä tarkasti, missä järjestyksessä Push- ja Raise-operaatioita suoritetaan. Algoritmin peruskomponentiksi

Lisätiedot

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit TIE-20100 Tietorakenteet ja algoritmit 1 TIE-20100 Tietorakenteet ja algoritmit TIE-20100 Tietorakenteet ja algoritmit 2 Lähteet Luentomoniste pohjautuu vahvasti prof. Antti Valmarin vanhaan luentomonisteeseen

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms. Kokeellinen algoritmiikka (3 ov) syventäviä opintoja edeltävät opinnot: ainakin Tietorakenteet hyödyllisiä opintoja: ASA, Algoritmiohjelmointi suoritus harjoitustyöllä (ei tenttiä) Kirjallisuutta: Johnson,

Lisätiedot

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet Koka Ryhmä 11 Juuso Tapaninen, Akseli Karvinen 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet 1 1. Taustoja Koka on Daan Leijenin ja Microsoft:n kehittämä

Lisätiedot

Rekursiiviset tyypit

Rekursiiviset tyypit Rekursiiviset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 20. helmikuuta 2007 Hiloista Kiintopisteet (Ko)rekursio Rekursiiviset

Lisätiedot

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion. Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion. Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Funktionaalista ohjelmointia: todistamisesta, virrat ja I/O, hahmonsovitus (mm. SICP 3.5) Riku Saikkonen 8. 11. 2011 Sisältö 1 Vähän funktionaalisten

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet ) T-79144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet 11-22) 26 29102004 1 Ilmaise seuraavat lauseet predikaattilogiikalla: a) Jokin porteista on viallinen

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 8. syyskuuta 2016 Sisällys a https://tim.jyu.fi/view/kurssit/tie/ tiea241/2016/videoiden%20hakemisto Matemaattisen

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 26.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 26.1.2009 1 / 33 Valintakäsky if syote = raw_input("kerro tenttipisteesi.\n") pisteet = int(syote) if pisteet >=

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

C++11 lambdat: [](){} Matti Rintala

C++11 lambdat: [](){} Matti Rintala C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

Lisätiedot

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! eli... Hyvä kaava sanoo enemmän kuin,... tuhat riviä koodia!... sata riviä tekstiä!... kymmenen diagrammia! Sopimusohjelmointi

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 7: Funktionaalista ohjelmointia (mm. SICP 3.5) Riku Saikkonen 13. 11. 2012 Sisältö 1 Laiskaa laskentaa: delay ja force 2 Funktionaalinen I/O 3 Funktionaalista

Lisätiedot

14.1 Rekursio tyypitetyssä lambda-kielessä

14.1 Rekursio tyypitetyssä lambda-kielessä Luku 14 Rekursiiviset tyypit Edellisessä luvussa esitetyt tietue- ja varianttityypit eivät yksinään riitä kovin mielenkiintoisten tietorakenteiden toteuttamiseen. Useimmissa ohjelmissa tarvitaan erilaisia

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 19. tammikuuta 2012 Sisällys Sisällys Muistathan A B -konstruktion 0 k 1 i 2 s 3 s 4 a 5 0 k 1 o 2 i 3 r 4

Lisätiedot

Nollasummapelit ja bayesilaiset pelit

Nollasummapelit ja bayesilaiset pelit Nollasummapelit ja bayesilaiset pelit Kristian Ovaska HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Seminaari: Peliteoria Helsinki 18. syyskuuta 2006 Sisältö 1 Johdanto 1 2 Nollasummapelit 1 2.1

Lisätiedot

1 Kannat ja kannanvaihto

1 Kannat ja kannanvaihto 1 Kannat ja kannanvaihto 1.1 Koordinaattivektori Oletetaan, että V on K-vektoriavaruus, jolla on kanta S = (v 1, v 2,..., v n ). Avaruuden V vektori v voidaan kirjoittaa kannan vektorien lineaarikombinaationa:

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

Yksinkertaiset tyypit

Yksinkertaiset tyypit Yksinkertaiset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 13. helmikuuta 2007 Tyypitön puhdas λ-laskento E ::= I E 1 E 2

Lisätiedot

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

1. Mitä tehdään ensiksi?

1. Mitä tehdään ensiksi? 1. Mitä tehdään ensiksi? Antti Jussi i Lakanen Ohjelmointi 1, kevät 2010/ Jyväskylän yliopisto a) Etsitään Googlesta valmis algoritmi b) Mietitään miten itse tehtäisiin sama homma kynällä ja paperilla

Lisätiedot

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I G. Gripenberg Aalto-yliopisto 3. huhtikuuta 2014 G. Gripenberg (Aalto-yliopisto) MS-A0402 Diskreetin matematiikan perusteetesimerkkejä,

Lisätiedot

Määrittelydokumentti

Määrittelydokumentti Määrittelydokumentti Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (alkukesä) Sami Korhonen 014021868 sami.korhonen@helsinki. Tietojenkäsittelytieteen laitos Helsingin yliopisto 23. kesäkuuta

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I MS-A040 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I G. Gripenberg Aalto-yliopisto 3. huhtikuuta 014 G. Gripenberg (Aalto-yliopisto) MS-A040 Diskreetin matematiikan perusteetesimerkkejä,

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen. historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen historia

Imperatiivisten ohjelmien organisointiparadigmojen historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 19. syyskuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 19. syyskuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 19. syyskuuta 2016 Sisällys Neuvoja opintoihin tee joka päivä ainakin vähän uskalla mennä epämukavuusalueelle en

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Täydentäviä muistiinpanoja laskennan rajoista

Täydentäviä muistiinpanoja laskennan rajoista Täydentäviä muistiinpanoja laskennan rajoista Antti-Juhani Kaijanaho 10. joulukuuta 2015 1 Diagonaalikieli Diagonaalikieli on D = { k {0, 1} k L(M k ) }. Lause 1. Päätösongelma Onko k {0, 1} sellaisen

Lisätiedot

Ydin-Haskell Tiivismoniste

Ydin-Haskell Tiivismoniste Ydin-Haskell Tiivismoniste Antti-Juhani Kaijanaho 8. joulukuuta 2005 1 Abstrakti syntaksi Päätesymbolit: Muuttujat a, b, c,..., x, y, z,... Tyyppimuuttujat α, β, γ,... Koostimet (data- ja tyyppi-) C, D,...,

Lisätiedot

TIETORAKENTEET JA ALGORITMIT

TIETORAKENTEET JA ALGORITMIT TIETORAKENTEET JA ALGORITMIT Timo Harju 1999-2004 1 typedef link List; /* Vaihtoehtoisia nimiä */ typedef link Stack; /* nodepointterille */ typedef link Queue typedef struct node Node; /* itse nodelle

Lisätiedot