Z-skeemojen animointi Haskellilla
|
|
- Yrjö Karvonen
- 8 vuotta sitten
- Katselukertoja:
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 Alkuperäislähteitä Philip Wadler & Stephen Blott: How to make ad-hoc polymorphism less ad-hoc,
Lisätiedottää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ätiedotHaskell 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ätiedotTIEA341 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ätiedotTIEA341 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ätiedotAlgebralliset 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ätiedot815338A 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ätiedot815338A 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ätiedotTIEA341 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ätiedotTIEA341 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ätiedotLuku 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ätiedotLaajennetaan 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ätiedotGeneeriset 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ätiedotEsimerkki: 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ätiedotLuku 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ätiedotTIEA341 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ätiedotTIEA341 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ätiedotTIEA341 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ätiedotTyyppejä 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ätiedotTä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ätiedotHaskell 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ätiedotOhjelmoinnin 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ätiedotTIEA341 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ätiedot1.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ätiedotELM 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ätiedotAbstraktit 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ätiedotComputing 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ätiedot5.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ätiedotTaas 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ätiedotKuvaus 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ätiedotOhjelmoinnin 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ätiedot1.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ätiedotOhjelmoinnin 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ätiedotTIE 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ätiedotOhjelmoinnin 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ätiedotFunktio-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ätiedot5.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ätiedotITKP102 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ätiedotTietueet. 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ätiedotOhjelmoinnin 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ätiedotSe 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ätiedotOliot 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ätiedotMonadeja 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ätiedotRekursiolause. 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ätiedotOhjelmoinnin 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ätiedotIDL - 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ätiedotTIES542 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ätiedotATK 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ätiedotLuku 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ätiedotOliosuunnitteluesimerkki: 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ätiedot815338A 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ätiedotCommon 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ätiedotTarkennamme 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ätiedotTIE 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ätiedotITKP102 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ätiedotJohnson, 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ätiedotKoka. 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ätiedotRekursiiviset 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ätiedotKuvaus 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ätiedotOhjelmoinnin 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ätiedotOhjelmoinnin 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ätiedotITKP102 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ätiedotImperatiivisen 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ätiedotOhjelmoinnin 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ätiedot7/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ätiedotT 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ätiedotOhjelmoinnin 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ätiedotTIEA241 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ätiedotOhjelmoinnin 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ätiedotOhjelmoinnin 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ätiedot15. 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ätiedotC++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ätiedotOhjelmoinnin 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ätiedotOhjelmoinnin 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ätiedotKehittää 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ätiedot815338A 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ätiedotSisä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ätiedotTietorakenteet 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ätiedotOhjelmoinnin 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ätiedot14.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ätiedotTIEA241 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ätiedotNollasummapelit 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ätiedot1 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ätiedotOsoitin 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ätiedotYksinkertaiset 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ätiedotOperaattoreiden 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ätiedot1. 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ätiedotMS-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ätiedotMäärittelydokumentti
Määrittelydokumentti Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (alkukesä) Sami Korhonen 014021868 sami.korhonen@helsinki. Tietojenkäsittelytieteen laitos Helsingin yliopisto 23. kesäkuuta
LisätiedotSisä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ätiedotMS-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ätiedot15. 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ätiedotImperatiivisten 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ätiedotImperatiivisten 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ätiedotTIEA241 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ätiedot1. 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ätiedotAlkuarvot 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ätiedotTä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ätiedotYdin-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ätiedotTIETORAKENTEET 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