8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että

Koko: px
Aloita esitys sivulta:

Download "8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että"

Transkriptio

1 85 Takarekursiosta Sanoimme luvun 83 foldl -esimerkissämme että foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs olisi pelkkä silmukka Tämä johtuu siitä, että sen rekursiivinen kutsu on erityistä muotoa: takarekursiota (tail recursion) Kutsu on funktion koodissa takapaikalla (in tail position, tail call) jos se on viimeinen askel jonka tämä funktionkoodihaara ottaa Tässä rekursiivinen foldl-kutsu on takapaikalla: Kun siitä rekursiokutsusta palataan, niin sen jälkeen tämä foldl-kutsu ei enää tee mitään muuta kuin vain palauttaa sieltä saamansa arvon omalle kutsujalleen Silloin kuin takapaikalla kutsutaan funktiota itseään, niin kyseessä on takarekursiivinen kutsu kuten siis tässä Takapaikalla olevat kutsut ovat mielenkiintoisia koska ohjelmointikielen toteutus voi optimoida niitä (tail call optimization, TCO): Toteutus ylläpitää tyypillisesti pinoa jonka avulla tiedetään, mihin pitää palata jatkamaan suoritusta, kun tämän nykyisen aliohjelman suoritus päättyy Tavallinen kutsu lisää ensin tähän pinoon nämä riittävät paluutiedot ennen kuin siirtyy kutsuttavaan aliohjelmaan, jotta se aikanaan osaa palata takaisin tänne mistä sitä kutsuttiin Siis tavallinen kutsu kasvattaa tätä pinoa Takapaikalla oleva kutsu voidaankin sen sijaan toteuttaa kasvattamatta tätä pinoa: Takapaikalla kutsuttava aliohjelma voikin palata suoraan sinne, johon tämä aliohjelma itse palaisi joka tapauksessa heti tämän viimeisen aliohjelmakutsunsa jälkeen lukemalla suoraan sen paluutiedot Koska funktionaalisissa kielissä kuten ei ole erillisiä toistorakenteita kuten whilesilmukkaa, vaan toistokin on rekursiota, niin niissä TCO on välttämätöntä muuten while-simukan funktionaalinen toteutus täyttäisi hiljalleen koko muistin pinon kasvaessa kierros kierrokselta Aiemmassa luvun 72 esimerkissämme kutsuimme funktiota laskin takarekursiivisesti TCO ja muistin ahkeruus takaavat, että se voisi jatkaa mielivaltaisen pitkään täyttämättä koneen muistia Näimme yhtälössä (16) TCO:n vaikutuksen silloin, kun laskentaa tarkastellaan sieventämisenä: Lausekkeessa oli koko ajan vain yksi foldl jonka parametrit muuttuivat eli laskenta pyöri foldl-silmukassa 130

2 Verrataan sitä aidosti rekursiiviseen foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs) jolla laskenta etenisikin foldr (+) 0 [x 1, x 2, x 3,,x n ] = βx 1 + (foldr (+) 0 [x 2, x 3,,x n ]) = βx 1 + (x 2 +foldr (+) 0 [x 3,,x n ]) = βx 1 + (x 2 + (x 3 + ( + (x n + (foldr (+) 0 []))))) = βx 1 + (x 2 + (x 3 + ( + (x n + 0)))) Tässä foldr-laskennassa seuraava redex menee yhä syvemmälle ja syvemmälle tuloslausekkeessa Tämä polku seuraavaan redeksiin (tai paremminkin: polku sieltä takaisin) on se, jota ylläpidetään pinossa Yhtälön (16) foldl-laskennassa seuraava redex pysyi sen sijaan aina lausekkeen alussa Kun vielä tehostimme tämän laiskan foldl-laskennan ahkeraksi foldl -laskennaksi, niin saimme haluamamme vakiomuistitilassa pyörivän silmukan Tällaisen foldr-laskennan muistintarve ei riipu funktion f laiskuudesta tai ahkeruudesta, vaan siitä että f joutuu odottamaan foldr-rekursiokutsun tulosta Toisaalta laiskassa foldr-laskennassa f voikin jossakin vaiheessa päättää, ettei se tarvitsekaan foldr-rekursiokutsun tulosta, ja siten lopettaa syötelistan läpikäynnin jo ennen sen päättymistä Tähän foldl-laskenta taas ei pysty, vaan sen on aina käytävä syötelistansa loppuun saakka Laiskassa funktionaalisessa ohjelmoinnissa käytetäänkin tavallisesti funktiota foldr elleivät ajan- tai muistinkäyttö vaadi funktion foldl tai foldl käyttöä Eräs usein toimiva tapa saada aidosti rekursiivisesta koodista takarekursiivista on lisätä siihen sopiva kerääjäparametri Aiemmin luvussa 412 lähdimme optimoimaan funktiota, jossa oli kaksi aitoa rekursiokutsua: Ensin syötteenä saadun hakupuun vasen ja oikea alipuu käsiteltiin rekursiivisesti Sitten näiden rekursiokutsujen antamat osatulokset vielä yhdistettiin operaatiolla (++) koko tulokseksi Lisäämällä kerääjäparametrin a saimme optimoitua sen sellaiseen muotoon, jossa oikea alipuu käsiteltiin yhä aidolla rekursiolla, mutta vasen takarekursiolla Siis silmukaksi joka etenee hakupuun vasenta haaraa pitkin ja käsittelee mennessään sen oikeat haarat rekursiivisesti 131

3 Samassa yhteydessä huomautimme myös, että foldl voidaan nähdä funktion foldr kerääjäparametriversiona silloin kun f on liitännäinen ja z sen neutraalialkio Yhtälössä (16) taas nähtiin, että tällainen kerääjäparametri kannattaa usein laskea ahkerasti, jotta saavutettaisiin oikeasti se haluttu muistinsäästö Siten funktiosta foldl saatiin foldl 86 Tyypinpäättelyn periaatteista Haskell sisältää siis ns Hindley-Milner-tyypinpäättelyn, johon on lisätty tyyppiluokat Tutustutaan nyt sen perusperiaatteisiin yleisellä tasolla Tutustutaan myös tyypinpäättelyn ja loogisen päättelyn välisiin yhteyksiin hyvin yleisellä tasolla Otetaan Preludesta esimerkiksemme listan pituuden laskeva funktio length [] = 0 length (_:l) = 1 + length l Haskell-ohjelmoija voisi päätellä sen tyypin intuitiivisesti vaikkapa seuraavasti: Tämä length saa yhden parametrin, eli se on tyyppiä funktio parametrinsa tyypiltä a tuloksensa tyypille b jotka selviävät tarkemmin myöhemmin Koska Numero 0 on yksi sen mahdollinen tulos, niin tämän tyypin b pitää olla jokin Numerotyyppi eli Num b Koska tyhjä lista [] on yksi mahdollinen arvo sen parametrille, niin tämän tyypin a pitää olla muotoa [c] Koska length ei välitä syötelistansa alkioista, sillä alkion kohdalla on hahmossa _, niin tämä alkiotyyppi c saa olla mitä tahansa eli se saa olla monimuotoinen Siis kaiken kaikkiaan tyypiksi saadaan length :: (Num b) => [c] -> b Prelude antaa sille hieman täsmällisemmän tyypin length :: [c] -> Int jossa b = Int koska se riittää yleensä listan pituudelle on nopeampi käsitellä kuin mielivalintainen Numero Vakiokirjastossa on myös tämä yleisempi funktio nimellä DataListgenericLength Samoin sieltä löytyy myös DataListgenericTake jne 132

4 Tehdään sitten vastaava päättely hieman tarkemmin siten kuin Haskell sen voisi suorittaa Otetaan käyttöön logiikasta (tuttu?) notaatio oletukset lausekkeen osien tyypeistä johtopäätös koko lausekkeen tyypistä niille säännöille, joita tyypinpäättelyssä käytetään Olemme jo nähneet tällaisia sääntöjä epäformaalisti eri lausekkeiden yhteydessä Esimerkiksi lausekkeessa case valinta of hahmo 1 -> tulos 1 hahmo k -> tulos k vaadittiin, että 1 valinta lausekkeen ja kaikkien hahmojen pitää olla keskenään samaa tyyppiä 2 valinta lausekkeiden pitää olla keskenään samaa tyyppiä, ja niiden yhteinen tyyppi on myös koko case-lausekkeen tyyppi Tämä voidaan ilmaista sääntönä h 1 :: t h k :: t v, h 1,,h k :: t jossa t on ehdon 1 ja u ehdon 2 tyyppi w 1 :: u w k :: u case v of {h 1 ->w 1 ; ;h k ->w k } :: u (17) Merkintä h i :: t w i :: u tarkoittaa että jos tehdään lisäoletus h i :: t niin silloin siitä voidaan todistaa johtopäätös w i :: u eli että näiden kolmen pisteen kohdalle voidaan laatia jokin todistus Vasemmanpuoleiset oletukset taas takaavat, että nämä lisäoletukset ovat voimassa joten nämä johtopäätöksetkin ovat voimassa Esimerkkimme alkaa tyypitettävän funktion sisäisestä esitysmuodosta ilman syntaktista sokeria: length = \ p -> case p of 133

5 [] -> 0 _:xs -> ((+) 1) (length xs) Voidaan aloittaa funktioiden säännöllä Tällaista sääntöä voidaan käyttää x :: t e :: u (\ x -> e) :: t -> u (18) edeten säännössä alhaalta ylös eli johtopäätöksestä oletuksiin koristellen funktiota säännön mukaisilla tyyppitarkenteilla :: Tyyppi Haskell salliikin tällaisten tyyppitarkenteiden kirjoittamisen varsin moneen kohtaan lähdekoodia Niillä ohjelmoija voi määrätä tyypin tarkemmaksi kuin se, jonka Haskell päättelee ei tietenkään väljemmäksi, sehän vaarantaisi tyyppiturvallisuuden! Käytimme sitä luvun 524 Isqrt-tyyppiluokkaesimerkissämme takaamaan, että laitetason neliöjuuri sqrt lasketaan tarkemmilla liukuluvuilla Double Näin saadaan length :: a -> b = \ (p :: a) -> (case p of [] -> 0 _:xs -> (((+) 1) (length xs))) :: b jossa a, b, c, ovat vielä tällä hetkellä tuntemattomia, eli uusia tyyppimuuttujia, eli sellaisia joita ei vielä ole käytetty Sitten voimme siirtää tämän b case-lausekkeen sisään vastaavalla säännöllä (17): length :: a -> b = \ (p :: a) -> case (p :: a) of [] :: a -> 0 :: b (_:xs) :: a -> (((+) 1) (length xs)) :: b 134

6 Tämän casen valinta lausekkeen p tyypiksi on jo edellisessä vaiheessa sovittu a Laajennetaan tämä sopimus myös sen hahmoihin Tiedämme, että 0 on Numerovakio: jonka perusteella length :: (Num b) => a -> b = \ (p :: a) -> case (p :: a) of [] :: a -> 0 :: b (_:xs) :: a -> (((+) 1) (length xs)) :: b 0 :: (Num t) => t joka tuo mukanaan lisärajoitteen Num b eli tyypin b pitää olla Numeerinen Tämä lisärajoite liittyy siis joka tyyppiin, jossa tyyppimuuttuja b esiintyy, mutta nyt merkitään se vain ensimmäiseen sellaiseen tyyppiin eikä toisteta sitä enää muualla Tarkemmin sanoen tapahtuu seuraavaa: Vakion 0 sisäinen sokeroimaton muoto onkin (frominteger :: (Num b) => Integer -> b) (0 :: Integer) eli Integer-vakio 0 ja sen konversio mihin tahansa Numerotyyppiin Kun siihen sovelletaan funktion kutsun tyypityssääntöä sen tyypiksi saadaan se väitetty (Num b) => b f :: t -> u x :: t f x :: u (19) Tiedämme myös, että tyhjä lista [] on vakio jonka alkiotyyppi t on monimuotoinen [] :: [t] Sen perusteella tyyppi a on siis listatyyppi [c] jossa emme tunne alkiotyyppiä c: 135

7 length :: (Num b) => [c] -> b = \ (p :: [c]) -> case (p :: [c]) of [] :: [c] -> 0 :: b (_:xs) :: [c] -> (((+) 1) (length xs)) :: b Listahahmoilla on tyypityssääntö jonka perusteella length :: (Num b) => [c] -> b = \ (p :: [c]) -> case (p :: [c]) of [] :: [c] -> 0 :: b (_ :: c) : (xs :: [c]) -> (((+) 1) (length xs)) :: b y :: c z :: [c] y:z :: [c] Nyt on jäljellä enää viimeisen rivin käsittely Se koostuu funktionkutsuista, ja ne siis käsitellään tyypityssäännöllä (19) Etenemme ulkoa sisään koska tiedämme koko lausekkeen tyypin olevan b, ja haluamme viedä tämä tiedon sen osiin Ulommaisen kutsun käsittely tuottaa joten uusi tyyppi e onkin vanha tyyppi [c] d onkin vanha tyyppi b length :: e -> d xs :: e ((+) 1) :: d -> b (length xs) :: d (((+) 1) (length xs)) :: b aiempien tyypitysvaiheiden perusteella Siten jäljelle jää pääteltäväksi enää jonka oletuksista (+) :: f -> (b -> b) 1 :: f ((+) 1) :: b -> b vasen antaa metodin (+) tyypin nojalla että uusi tyyppi f onkin sama kuin vanha tyyppi b oikea voidaan käsitellä kuten vakio 0 136

8 Yhteenvetona siis length :: (Num b) => [c] -> b = \ (p :: [c]) -> case (p :: [c]) of [] :: [c] -> 0 :: b (_ :: c) : (xs :: [c]) -> ((((+) :: b -> (b -> b)) (1 :: b)) ((length :: [c] -> b) (xs :: [c]))) :: b Lopuksi tehdään vielä yleistysaskel (generalization): Koska tyypitys on nyt saatettu onnistuneesti loppuun, niin jätetään jäljelle jääneet tyyppimuuttujat b ja c monimuotoisiksi kunhan muistetaan säilyttää mukana myös se lisärajoite, että Num b Jos käyttäisimme Haskell-laajennuksena olevaa tyyppikvanttoria niin voisimme esittää tämän yleistysaskeleen sen tuomisena koko tyypin eteen: length :: forall b c (Num b) => [c] -> b Parametrinen monimuotoisuus tarkoittaakin että mikä tahansa tyyppi käy, koska tyypityksen ei tarvinnut olettaa siitä tämän enempää Prelude siis antaa tälle funktiolle tarkemman tyypin length :: [c] -> Int joka tarkentaa tätä pääteltyä tulosta siten, että b = Int: length :: [c] -> Int = \ (p :: [c]) -> case (p :: [c]) of [] :: [c] -> 0 :: Int (_ :: c) : (xs :: [c]) -> ((((+) :: Int -> (Int -> Int)) (1 :: Int)) ((length :: [c] -> Int) (xs :: [c]))) :: Int Lisärajoite saa muodon Num Int joka on totta ja voidaan poistaa: on olemassa vastaava instance Num Int Samoin aiemmin monimuotoinen metodin (+) kutsu on nyt täsmentynyt kutsumaan juuri sitä versiota, joka löytyy juuri tästä instanssista 137

9 Esimerkissämme ei ollut paikallisia määrittelyjä Lauseke let määrittelyt in runko tyypitetään seuraavasti: 1 Ensin tyypitetään nämä paikalliset määrittelyt kuten edellä Jos sen kuluessa todetaan, että kaksi tyyppimuuttujaa (vaikkapa x ja y) ovat itse asiassa sama tyyppi, ja niistä yksi (vaikkapa x) on kotoisin tämän let-lausekkeen ulkopuolelta toinen (vaikkapa y) syntyi vasta näitä paikallisia määrittelyjä tyypittäessä niin silloin jälkimmäinen korvataan edellisellä eikä päinvastoin (eli y korvataan muuttujalla x eikä päinvastoin) eli uudempi vanhemmalla 2 Sitten yleistetään monimuotoisiksi vain ne uudet tyyppimuuttujat, jotka syntyivät tyypitysaskeleen 1 aikana mutta joita ei korvattu vanhemmilla 3 Lopuksi tyypitetään runko käyttäen näitä paikallisia ja yleistettyjä määrittelyjä Näin saatu rungon tyyppi on samalla koko let-lausekkeen tyyppi Myös while-lauseke tyypitetään näin Tällainen tyypinpäättely on ns PSPACE-täydellistä (PSPACE-complete) eli intuitiivisesti yksi vaikeimmista laskentaongelmista, joka voidaan ratkaista järkevällä määrällä muistia mutta johon voi silti kulua järjettömän paljon aikaa Kaikki kurssilla LAP esitellyt NP-täydelliset laskentaongelmat kuuluvat myös tähän luokkaan PSPACE, ja yleisesti uskotaan että PSPACE sisältää paljon muutakin kuin ne Onneksi tällainen tyypinpäättely on osoittautunut olevan nopeaa ohjelmakoodin pituuteen verrattuna ja hidasta vain sen sisennyssyvyyteen eli leveyteen verrattuna ja onneksi ohjelmat ovat tavallisesti hyvin pitkiä mutteivät kovinkaan leveitä 87 Ohjelmoinnin ja logiikan suhteesta Edellä luvussa 86 on kuvattu Haskellin tyypinpäättelyä samaan tapaan kuin tehtäisiin päättelyä logiikassa Niillä onkin läheinen yhteys; tarkastellaan sitäkin hieman Tarkastellaan sellaisia Haskell-lausekkeita, joissa ei käytetä paikallisia let- eikä where-määrittelyjä ei käytetä arvoa undefined ainoana perustyyppinä on vain () muista monikoista käytetään monikoista vain pareja 138

10 algebrallisista tyypeistä käytetään vain tyyppiä data Either a b = Left a Right b ja tarkastellaan niiden tyypittämistä Tämä yhteys on nähty alun perin λ-lausekkeilla, mutta pysymme nyt niiden sijaan Haskell-lausekkeissä Parien tyypityssääntö on x :: s y :: t (x,y) :: (s,t) (20) ja parityypeille case-sääntö (17) saa muodon v :: (s,t) x :: s y :: t x :: s, y :: t w :: u case v of {(x,y)->w} :: u (21) mutta tavallisesti käytetään Preludestakin löytyviä funktioita fst v = case v of {(x,_)->x} snd v = case v of {(_,y)->y} Either-tyyppikonstruktorilla on kaksi sääntöä, yksi sen kummallekin arvokonstruktorille: x :: s Left x :: Either s t (22) y :: t Right y :: Either s t (23) Tämän tyyppikonstruktorin case-sääntö (17) saa muodon v :: Either s t x :: s y :: t x :: s w L :: u y :: t w R :: u case v of {Left x->w L ;Right y->w R } :: u (24) mutta tavallisesti käytetään Preludestakin löytyvää funktiota either :: (s -> u) -> (t -> u) -> Either s t -> u either f g v = case v of {Left x->f x;right y->g y} Unohdetaan hetkeksi tyypityssäännöistämme osat jos lauseke on tyyppiä eli osat lauseke :: Mitä jää? (20): Jos on todistettu sekä s että t niin voidaan todistaa myös (s,t) Tämähän on loogisen konjunktion sääntö kunhan vain kirjoitetaan(s,t) muodossa s t 139

11 Ohjelmoijan intuitio onkin että parissa on yksi kenttä tyyppiä s ja toinen tyyppiä t Tästä näkökulmasta fst esittää päättelysäännön s t s eli jos on todistettu konjunktio, niin on todistus myös sen ensimmäiselle konjunktille Vastaavasti snd on toisen konjunktin t päättelysääntö Näistä case-säännöistä jätetään lukematta myös niiden hahmojen tyypitykset, ja luetaankin vain lausekkeiden tyypitykset Tyyppi () on siis tyhjä konjunktio eli tosi (18): Jos oletuksella t voitiin todistaa u niin voidaan todistaa myös t -> u Tämähän on loogisen implikaation sääntö kunhan vain kirjoitetaan t -> u muodossa t u Funktioihin ei voi soveltaa case-lausekkeita mutta sen sijaan niitä voi kutsua: Kutsun tyypityssääntö (19) voidaan lukea jos on todistettu sekä t -> u että t niin voidaan todistaa myös u Tämähän on puolestaan päättelysääntö modus ponens eli implikaation käyttö : t u t u (25) (22): Jos on todistettu s niin voidaan todistaa myös Either s t Tämähän on loogisen disjunktion yksi sääntö kunhan vain kirjoitetaan Either s t muodossa s t Vastaavasti (23) on se toinen sääntö, joka todistaakin saman disjunktion jos t onkin todistettu Ohjelmoijan intuitio onkin että tässä tietueessa on joko kenttä tyyppiä s tai kenttä tyyppiä t, ja lisäksi tieto kumpi näistä kentistä siinä on Vastaava case-lauseke (24) on puolestaan päättelysääntö s t s u t u u eli jos on todistettu että s tai t ja että kummastakin seuraa u niin sitten voidaan todistaa myös u eli funktio either Siten tyypityssääntömme Tyyppi osat muodostavatkin propositionaalisen eli lauselogiikan (propositional logic) Tämä logiikka ei kuitenkaan olekaan se tuttu klassinen (classical) joka puhuu totuudesta, vaan konstruktiivinen (constructive) joka puhuukin todistuvuudesta Konstruktiivista logiikkaa nimitetään myös intuitionistiseksi (intuitionistic) Siis tyyppi onkin konstruktiivisen lauselogiikan kaava Väite Marsissa joko on elämää tai siellä ei ole elämää on 140

12 tosi klassisesti koska sen totuusarvo ei riipu Marsin todellisuudesta avoin konstruktiivisesti koska meillä ei ole vielä todistusta kummallekaan sen osaväitteelle Siis kolmannen poissuljetun laki φ φ on tautologia(na pätevä) klassisessa logiikassa mutta ei konstruktiivisessa Konstruktiivinen logiikka antaakin omalle implikaatiolleen Brouwer-Heyting- Kolmogorov-tulkinnan: Implikaatio t u pätee konstruktiivisesti, jos on olemassa jokin tapa muuntaa mikä tahansa todistus T kaavalle t todistukseksi U kaavalle u konstruoida U todistuksesta T Brouwer kehitti matematiikan perusteiden filosofiaa 1900-luvun alussa Heyting taas kehitti silloin sellaisen algebran, joka on konstruktiivisen logiikan taustalla samaan tapaan kuin binäärialgebra on klassisen logiikan taustalla Kolmogorov oli monipuolinen matemaatikko: tätä logiikkaa, todennäköisyyslaskennan aksiomatisointi, kompleksisuuden mitta, Klassisessa logiikassa taas implikaatio oli sama kuin mutta ei siis konstruktiivisessa φ ψ φ ψ Lausekkeet tyyppiä t ja u voidaan puolestaan nähdä esitystapoina näille todistuksille T ja U: Funktiot fst, snd ja either edustavat päättelysääntöjä, samoin funktion määrittely ja sen kutsu Siten lauseke onkin todistus tyyppinsä ilmaisemalle konstruktiivisen lauselogiikan kaavaille ja tyypintarkistus onko T :: t? todistuksen T tarkistamista ja halutun tyyppisen lausekkeen ohjelmointi onkin tällaisen todistuksen laatimista! Silloin BHK-tulkinnan vaatimaksi tavaksi puolestaan käy mikä tahansa lauseke, jonka tyyppi on F :: t u koska silloin lauseke F T antaa sopivan tuloksen U: Koska lausekkeissamme ei ole rekursiota, niin onnistunut tyypitys takaa normalisoinnin pysähtymisen Lausekkeissamme ei ole myöskään mitään, joka johtaisi suoritusaikaiseen virheeseen Siten funktion arvon laskenta eli ohjelman suoritus onkin tällaisen todistuksen sieventämistä kohden normaalimuotoaan, jossa sen sisältämät päättelyaskeleet kuten erityisesti (25) onkin oikaistu 141

13 Yhteenvetona edellä (hyvin epätarkasti ) luonnosteltu Curryn-Howardin vastaavuus (the Curry-Howard correspondence, the proofs-as-programs correspondence) on: käsite ohjelmoinnissa tyyppi jokin sen tyyppinen lauseke sen tyyppisen lausekkeen arvon laskenta eli suorittaminen eli sieventäminen halutun tyyppisen lausekkeen ohjelmointi näin ohjelmoidun lausekkeen tyypin tarkistus parametrinen monimuotoisuus sama käsite logiikassa kaava jokin sitä tyyppiä vastaavan kaavan todistus vastaavan todistuksen yksinkertaistaminen todistuksen laatiminen sen tyyppiä vastaavalle kaavalle näin laaditun todistuksen tarkistaminen yleistys kaikilla kaavoilla pätee, että Tämä vastaavuus inspiroi ohjelmoinnin ja ohjelmointikielten teoriaa kehittämään yhä ilmaisuvoimaisempia tyyppijärjestelmiä jotta tyypeillä voitaisiin ilmaista yhä enemmän ohjelmien spesifikaatioiden sisältämästä informaatiosta menetelmiä, joilla formaaleista loogisista todistuksista voisi generoida niihin liittyvän ohjelmakoodin (puoli)automaattisesti Silloin ohjelmoijasta tulisikin loogikko, joka todistaa konstruktiivisesti, että tyypeillä/kaavoilla esitetty spesifikaatio on todellakin mahdollista toteuttaa ja tietokone generoisi automaattisesti hänen todistuksestaan sitä vastaavan eli spesifikaation mukaisen ohjelmatoteutuksen Käytännössä tällainen äärimmäisen formaali korrektiuteen keskittyvä ohjelmointitapa rajoittuisi varmaankin sellaisiin ohjelmistoihin ja ohjelmistojen ydinosiin, joiden luotettavuus on aivan välttämätöntä Ehkäpä jonain päivänä 142

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

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

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014 Yhtälönratkaisusta Johanna Rämö, Helsingin yliopisto 22. syyskuuta 2014 Yhtälönratkaisu on koulusta tuttua, mutta usein sitä tehdään mekaanisesti sen kummempia ajattelematta. Jotta pystytään ratkaisemaan

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

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

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

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

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet ) T-79.144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet 9.1 9.5) 30.11. 3.12.2004 1. Osoita lauselogiikan avulla oheisten ehtolausekkeiden ekvivalenssi. (a)!(a

Lisätiedot

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat. Approbatur 3, demo 1, ratkaisut 1.1. A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat. Käydään kaikki vaihtoehdot läpi. Jos A on rehti, niin B on retku, koska muuten

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

Vaihtoehtoinen tapa määritellä funktioita f : N R on

Vaihtoehtoinen tapa määritellä funktioita f : N R on Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: 1 (Alkuarvot) Ilmoitetaan funktion arvot

Lisätiedot

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: Rekursio Funktio f : N R määritellään yleensä

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

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista Matematiikan johdantokurssi, syksy 06 Harjoitus, ratkaisuista. Valitse seuraaville säännöille mahdollisimman laajat lähtöjoukot ja sopivat maalijoukot niin, että syntyy kahden muuttujan funktiot (ks. monisteen

Lisätiedot

Luonnollisen päättelyn luotettavuus

Luonnollisen päättelyn luotettavuus Luonnollisen päättelyn luotettavuus Luotettavuuden todistamiseksi määrittelemme täsmällisesti, milloin merkkijono on deduktio. Tässä ei ole sisällytetty päättelysääntöihin iteraatiosääntöä, koska sitä

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

Matematiikan tukikurssi, kurssikerta 3

Matematiikan tukikurssi, kurssikerta 3 Matematiikan tukikurssi, kurssikerta 3 1 Epäyhtälöitä Aivan aluksi lienee syytä esittää luvun itseisarvon määritelmä: { x kun x 0 x = x kun x < 0 Siispä esimerkiksi 10 = 10 ja 10 = 10. Seuraavaksi listaus

Lisätiedot

Nimitys Symboli Merkitys Negaatio ei Konjuktio ja Disjunktio tai Implikaatio jos..., niin... Ekvivalenssi... jos ja vain jos...

Nimitys Symboli Merkitys Negaatio ei Konjuktio ja Disjunktio tai Implikaatio jos..., niin... Ekvivalenssi... jos ja vain jos... 2 Logiikkaa Tässä luvussa tutustutaan joihinkin logiikan käsitteisiin ja merkintöihin. Lisätietoja ja tarkennuksia löytyy esimerkiksi Jouko Väänäsen kirjasta Logiikka I 2.1 Loogiset konnektiivit Väitelauseen

Lisätiedot

Matematiikan tukikurssi, kurssikerta 2

Matematiikan tukikurssi, kurssikerta 2 Matematiikan tukikurssi kurssikerta 1 Relaatioista Oletetaan kaksi alkiota a ja b. Näistä kumpikin kuuluu johonkin tiettyyn joukkoon mahdollisesti ne kuuluvat eri joukkoihin; merkitään a A ja b B. Voidaan

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

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen.

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen. Lause: Tyhjyysongelma ei ole osittain ratkeava; ts. kieli ei ole rekursiivisesti lueteltava. L e = { w { 0, 1 } L(M w ) = } Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia,

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 9 1 Implisiittinen derivointi Tarkastellaan nyt yhtälöä F(x, y) = c, jossa x ja y ovat muuttujia ja c on vakio Esimerkki tällaisesta yhtälöstä on x 2 y 5 + 5xy = 14

Lisätiedot

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten Ratkaisuehdotelma Tehtävä 1 1. Etsi lukujen 4655 ja 12075 suurin yhteinen tekijä ja lausu se kyseisten lukujen lineaarikombinaationa ilman laskimen

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

FI3 Tiedon ja todellisuuden filosofia LOGIIKKA. 1.1 Logiikan ymmärtämiseksi on tärkeää osata erottaa muoto ja sisältö toisistaan:

FI3 Tiedon ja todellisuuden filosofia LOGIIKKA. 1.1 Logiikan ymmärtämiseksi on tärkeää osata erottaa muoto ja sisältö toisistaan: LOGIIKKA 1 Mitä logiikka on? päättelyn tiede o oppi muodollisesti pätevästä päättelystä 1.1 Logiikan ymmärtämiseksi on tärkeää osata erottaa muoto ja sisältö toisistaan: sisältö, merkitys: onko jokin premissi

Lisätiedot

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin Yhteydettömien kielioppien ja pinoautomaattien yhteys [Sipser s. 117 124] Todistamme, että yhteydettömien kielioppien tuottamat kielet ovat tasan samat kuin ne, jotka voidaan tunnistaa pinoautomaatilla.

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

Matematiikan peruskurssi 2

Matematiikan peruskurssi 2 Matematiikan peruskurssi Tentti, 9..06 Tentin kesto: h. Sallitut apuvälineet: kaavakokoelma ja laskin, joka ei kykene graaseen/symboliseen laskentaan Vastaa seuraavista viidestä tehtävästä neljään. Saat

Lisätiedot

1. Otetaan perusjoukoksi X := {0, 1, 2, 3, 4, 5, 6, 7}. Piirrä seuraaville kolmelle joukolle Venn-diagrammi ja asettele alkiot siihen.

1. Otetaan perusjoukoksi X := {0, 1, 2, 3, 4, 5, 6, 7}. Piirrä seuraaville kolmelle joukolle Venn-diagrammi ja asettele alkiot siihen. Joukko-oppia Matematiikan mestariluokka, syksy 2010 Harjoitus 1, vastaukset 20.2.2010 1. Otetaan perusjoukoksi X := {0, 1, 2, 3, 4, 5, 6, 7}. Piirrä seuraaville kolmelle joukolle Venn-diagrammi asettele

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

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

Sekalaiset tehtävät, 11. syyskuuta 2005, sivu 1 / 13. Tehtäviä

Sekalaiset tehtävät, 11. syyskuuta 2005, sivu 1 / 13. Tehtäviä Sekalaiset tehtävät, 11. syyskuuta 005, sivu 1 / 13 Tehtäviä Tehtävä 1. Johda toiseen asteen yhtälön ax + bx + c = 0, a 0 ratkaisukaava. Tehtävä. Määrittele joukon A R pienin yläraja sup A ja suurin alaraja

Lisätiedot

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120 Tehtävä 1 : 1 Merkitään jatkossa kirjaimella H kaikkien solmujoukon V sellaisten verkkojen kokoelmaa, joissa on tasan kolme särmää. a) Jokainen verkko G H toteuttaa väitteen E(G) [V]. Toisaalta jokainen

Lisätiedot

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

Alityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Alityypitys TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 5. maaliskuuta 2007 Muistatko tietueet? {I 1 = E 1,..., I n = E n } : {I

Lisätiedot

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari Tehtävä 9 : 1 Merkitään kirjaimella G tehtäväpaperin kuvan vasemmanpuoleista verkkoa sekä kirjaimella H tehtäväpaperin kuvan oikeanpuoleista verkkoa. Kuvan perusteella voidaan havaita, että verkko G on

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

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100 Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).

Lisätiedot

T Logiikka tietotekniikassa: perusteet Kevät 2008 Laskuharjoitus 5 (lauselogiikka ) A ( B C) A B C.

T Logiikka tietotekniikassa: perusteet Kevät 2008 Laskuharjoitus 5 (lauselogiikka ) A ( B C) A B C. T-79.3001 Logiikka tietotekniikassa: perusteet Kevät 2008 Laskuharjoitus 5 (lauselogiikka 6.1 7.2) 27. 29.2.2008 Ratkaisuja demotehtäviin Tehtävä 6.1 a) A (B C) Poistetaan lauseesta ensin implikaatiot.

Lisätiedot

Tehtäväsarja I Seuraavissa tehtävissä harjoitellaan erilaisia todistustekniikoita. Luentokalvoista 11, sekä voi olla apua.

Tehtäväsarja I Seuraavissa tehtävissä harjoitellaan erilaisia todistustekniikoita. Luentokalvoista 11, sekä voi olla apua. HY / Avoin yliopisto Johdatus yliopistomatematiikkaan, kesä 2015 Harjoitus 2 Ratkaisuehdotuksia Tehtäväsarja I Seuraavissa tehtävissä harjoitellaan erilaisia todistustekniikoita. Luentokalvoista 11, 15-17

Lisätiedot

58131 Tietorakenteet ja algoritmit (syksy 2015)

58131 Tietorakenteet ja algoritmit (syksy 2015) 58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen

Lisätiedot

3. Kirjoita seuraavat joukot luettelemalla niiden alkiot, jos mahdollista. Onko jokin joukoista tyhjä joukko?

3. Kirjoita seuraavat joukot luettelemalla niiden alkiot, jos mahdollista. Onko jokin joukoista tyhjä joukko? HY / Avoin yliopisto Johdatus yliopistomatematiikkaan, kesä 2015 Harjoitus 1 Ratkaisuehdotuksia Tehtäväsarja I Seuraavat tehtävät liittyvät luentokalvoihin 1 14. Erityisesti esimerkistä 4 ja esimerkin

Lisätiedot

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Uusi näkökulma TIEA341 Funktio ohjelmointi 1 Syksy 2005 Aloitetaan alusta... Otetaan uusi näkökulma Haskelliin ohjelmointi laskentana kertausta toisaalta, uusia käsitteitä toisaalta helpottanee sitten

Lisätiedot

Modus Ponens. JosAjaA B ovat tosia, niin välttämättä myösb on tosi 1 / 15. Modus Ponens. Ketjusääntö. Päättelyketju.

Modus Ponens. JosAjaA B ovat tosia, niin välttämättä myösb on tosi 1 / 15. Modus Ponens. Ketjusääntö. Päättelyketju. JosAjaA B ovat tosia, niin välttämättä myösb on tosi 1 / 15 JosAjaA B ovat tosia, niin välttämättä myösb on tosi (A (A B)) B on tautologia eli (A (A B)) B. 1 / 15 JosAjaA B ovat tosia, niin välttämättä

Lisätiedot

Tenttiin valmentavia harjoituksia

Tenttiin valmentavia harjoituksia Tenttiin valmentavia harjoituksia Alla olevissa harjoituksissa suluissa oleva sivunumero viittaa Juha Partasen kurssimonisteen siihen sivuun, jolta löytyy apua tehtävän ratkaisuun. Funktiot Harjoitus.

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

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos: 8 Kanta Tässä luvussa tarkastellaan aliavaruuden virittäjävektoreita, jotka muodostavat lineaarisesti riippumattoman jonon. Merkintöjen helpottamiseksi oletetaan luvussa koko ajan, että W on vektoreiden

Lisätiedot

Kaikki kurssin laskuharjoitukset pidetään Exactumin salissa C123. Malliratkaisut tulevat nettiin kurssisivulle.

Kaikki kurssin laskuharjoitukset pidetään Exactumin salissa C123. Malliratkaisut tulevat nettiin kurssisivulle. Kombinatoriikka, kesä 2010 Harjoitus 1 Ratkaisuehdotuksia (RT (5 sivua Kaikki kurssin laskuharjoitukset pidetään Exactumin salissa C123. Malliratkaisut tulevat nettiin kurssisivulle. 1. Osoita, että vuoden

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

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

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

Esko Turunen Luku 9. Logiikan algebralisointi

Esko Turunen Luku 9. Logiikan algebralisointi Logiikan algebralisointi Tässä viimeisessä luvussa osoitamme, miten algebran peruskäsitteitä käytetään logiikan tutkimuksessa. Käsittelemme vain klassista lauselogiikkaa ja sen suhdetta Boolen algebraan,

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005 Demo 7 (14.12.2005) Antti-Juhani Kaijanaho 9. joulukuuta 2005 Liitteenä muutama esimerkki Ydin-Haskell-laskuista. Seuraavassa on enemmän kuin 12 nimellistä tehtävää; ylimääräiset ovat bonustehtäviä, joilla

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

3.1 Väliarvolause. Funktion kasvaminen ja väheneminen

3.1 Väliarvolause. Funktion kasvaminen ja väheneminen Väliarvolause Funktion kasvaminen ja väheneminen LAUSE VÄLIARVOLAUSE Oletus: Funktio f on jatkuva suljetulla välillä I: a < x < b f on derivoituva välillä a < x < b Väite: On olemassa ainakin yksi välille

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2 Johdatus diskreettiin matematiikkaan Harjoitus 4, 7.10.2015 1. Olkoot c 0, c 1 R siten, että polynomilla r 2 c 1 r c 0 on kaksinkertainen juuri. Määritä rekursioyhtälön x n+2 = c 1 x n+1 + c 0 x n, n N,

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 3. Logiikka 3.1 Logiikka tietojenkäsittelyssä Pyritään formalisoimaan terveeseen järkeen perustuva päättely Sovelletaan monella alueella tietojenkäsittelyssä, esim.

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

Lause 5. (s. 50). Olkoot A ja B joukkoja. Tällöin seuraavat ehdot ovat

Lause 5. (s. 50). Olkoot A ja B joukkoja. Tällöin seuraavat ehdot ovat jen Kahden joukon A ja B samuutta todistettaessa kannattaa usein osoittaa, että A on B:n osajoukko ja että B on A:n osajoukko. Tällöin sovelletaan implikaation ja ekvivalenssin yhteyttä. Lause 5. (s. 50).

Lisätiedot

16. Ohjelmoinnin tekniikkaa 16.1

16. Ohjelmoinnin tekniikkaa 16.1 16. Ohjelmoinnin tekniikkaa 16.1 Sisällys For-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. If-else-lause vaihtoehtoisesti

Lisätiedot

Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys.

Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys. Ei-säännöllisiä kieliä [Sipser luku 1.4] Osoitamme, että joitain kieliä ei voi tunnistaa äärellisellä automaatilla. Tulos ei sinänsä ole erityisen yllättävä, koska äärellinen automaatti on äärimmäisen

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

4 Matemaattinen induktio

4 Matemaattinen induktio 4 Matemaattinen induktio Joidenkin väitteiden todistamiseksi pitää näyttää, että kaikilla luonnollisilla luvuilla on jokin ominaisuus P. Esimerkkejä tällaisista väitteistä ovat vaikkapa seuraavat: kaikilla

Lisätiedot

12. Näppäimistöltä lukeminen 12.1

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

Lisätiedot

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =

Lisätiedot

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 1.1. (a) Jaettava m, jakaja n. Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena. Jos jäljelle jää nolla, jaettava oli tasan jaollinen. int m,

Lisätiedot

1 + b t (i, j). Olkoon b t (i, j) todennäköisyys, että B t (i, j) = 1. Siis operaation access(j) odotusarvoinen kustannus ajanhetkellä t olisi.

1 + b t (i, j). Olkoon b t (i, j) todennäköisyys, että B t (i, j) = 1. Siis operaation access(j) odotusarvoinen kustannus ajanhetkellä t olisi. Algoritmien DP ja MF vertaileminen tapahtuu suoraviivaisesti kirjoittamalla kummankin leskimääräinen kustannus eksplisiittisesti todennäköisyyksien avulla. Lause T MF ave = 1 + 2 1 i

Lisätiedot

Diskreetit rakenteet. 3. Logiikka. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1

Diskreetit rakenteet. 3. Logiikka. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1 811120P 3. 5 op Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1 ja laskenta tarkastelemme terveeseen järkeen perustuvaa päättelyä formaalina järjestelmänä logiikkaa sovelletaan

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

(2n 1) = n 2

(2n 1) = n 2 3.5 Induktiotodistus Induktiota käyttäen voidaan todistaa luonnollisia lukuja koskevia väitteitä, jotka ovat muotoa väite P (n) on totta kaikille n =0, 1, 2,... Tässä väite P (n) riippuu n:n arvosta. Todistuksessa

Lisätiedot

1 Lineaariavaruus eli Vektoriavaruus

1 Lineaariavaruus eli Vektoriavaruus 1 Lineaariavaruus eli Vektoriavaruus 1.1 Määritelmä ja esimerkkejä Olkoon K kunta, jonka nolla-alkio on 0 ja ykkösalkio on 1 sekä V epätyhjä joukko. Oletetaan, että joukossa V on määritelty laskutoimitus

Lisätiedot

missä on myös käytetty monisteen kaavaa 12. Pistä perustelut kohdilleen!

missä on myös käytetty monisteen kaavaa 12. Pistä perustelut kohdilleen! Matematiikan johdantokurssi Kertausharjoitustehtävien ratkaisuja/vastauksia/vihjeitä. Osoita todeksi logiikan lauseille seuraava: P Q (P Q). Ratkaisuohje. Väite tarkoittaa, että johdetut lauseet P Q ja

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1 Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin Sisällys 17. Ohjelmoinnin tekniikkaa for-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. if-else-lause vaihtoehtoisesti

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

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö Johdatus diskreettiin matematiikkaan Harjoitus 5, 14.10.2015 1. Ratkaise rekursioyhtälö x n+4 2x n+2 + x n 16( 1) n, n N, alkuarvoilla x 1 2, x 2 14, x 3 18 ja x 4 42. Ratkaisu. Vastaavan homogeenisen

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 8 Väliarvolause Oletetaan, että funktio f on jatkuva jollain reaalilukuvälillä [a, b] ja derivoituva avoimella välillä (a, b). Funktion muutos tällä välillä on luonnollisesti

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 1 Määrittelyjoukoista Tarkastellaan funktiota, jonka määrittelevä yhtälö on f(x) = x. Jos funktion lähtöjoukoksi määrittelee vaikkapa suljetun välin [0, 1], on funktio

Lisätiedot

17. Ohjelmoinnin tekniikkaa 17.1

17. Ohjelmoinnin tekniikkaa 17.1 17. Ohjelmoinnin tekniikkaa 17.1 Sisällys for-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. if-else-lause vaihtoehtoisesti

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 8 1 Funktion kuperuussuunnat Derivoituva funktio f (x) on pisteessä x aidosti konveksi, jos sen toinen derivaatta on positiivinen f (x) > 0. Vastaavasti f (x) on aidosti

Lisätiedot

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Lisää laskentoa TIEA341 Funktio ohjelmointi 1 Syksy 2005 Kertausta: Laajennettu aritmetiikka Lasketaan rationaaliluvuilla vakiot yhteen, vähennys, kerto ja jakolasku Laajennetaan sitä määrittelyillä: vakio

Lisätiedot

M = (Q, Σ, Γ, δ, q 0, q acc, q rej )

M = (Q, Σ, Γ, δ, q 0, q acc, q rej ) 6. LASKETTAVUUSTEORIAA Churchin Turingin teesi: Mielivaltainen (riittävän vahva) laskulaite Turingin kone. Laskettavuusteoria: Tarkastellaan mitä Turingin koneilla voi ja erityisesti mitä ei voi laskea.

Lisätiedot

Ensimmäinen induktioperiaate

Ensimmäinen induktioperiaate 1 Ensimmäinen induktioperiaate Olkoon P(n) luonnollisilla luvuilla määritelty predikaatti. (P(n) voidaan lukea luvulla n on ominaisuus P.) Todistettava, että P(n) on tosi jokaisella n N. ( Kaikilla luonnollisilla

Lisätiedot

Injektio (1/3) Funktio f on injektio, joss. f (x 1 ) = f (x 2 ) x 1 = x 2 x 1, x 2 D(f )

Injektio (1/3) Funktio f on injektio, joss. f (x 1 ) = f (x 2 ) x 1 = x 2 x 1, x 2 D(f ) Injektio (1/3) Määritelmä Funktio f on injektio, joss f (x 1 ) = f (x 2 ) x 1 = x 2 x 1, x 2 D(f ) Seurauksia: Jatkuva injektio on siis aina joko aidosti kasvava tai aidosti vähenevä Injektiolla on enintään

Lisätiedot

11. Javan toistorakenteet 11.1

11. Javan toistorakenteet 11.1 11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin

Lisätiedot

Logiikka 1/5 Sisältö ESITIEDOT:

Logiikka 1/5 Sisältö ESITIEDOT: Logiikka 1/5 Sisältö Formaali logiikka Luonnollinen logiikka muodostaa perustan arkielämän päättelyille. Sen käyttö on intuitiivista ja usein tiedostamatonta. Mikäli logiikka halutaan täsmällistää esimerkiksi

Lisätiedot

1. Logiikan ja joukko-opin alkeet

1. Logiikan ja joukko-opin alkeet 1. Logiikan ja joukko-opin alkeet 1.1. Logiikkaa 1. Osoita totuusarvotauluja käyttäen, että implikaatio p q voidaan kirjoittaa muotoon p q, ts. että propositio (p q) ( p q) on identtisesti tosi. 2. Todista

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 4 Jatkuvuus Jatkuvan funktion määritelmä Tarkastellaan funktiota f x) jossakin tietyssä pisteessä x 0. Tämä funktio on tässä pisteessä joko jatkuva tai epäjatkuva. Jatkuvuuden

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VII Logiikkaohjelmointi Sisältö 1. Johdanto 2. Predikaattilogiikan käsitteistöä 3. Prolog 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 2

Lisätiedot

Nopea kertolasku, Karatsuban algoritmi

Nopea kertolasku, Karatsuban algoritmi Nopea kertolasku, Karatsuban algoritmi Mikko Männikkö 16.8.2004 Lähde: ((Gathen and Gerhard 1999) luku II.8) Esityksen kulku Algoritmien analysointia (1), (2), (3), (4) Klassinen kertolasku Parempi tapa

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

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdoituksia harjoituksiin 8 (7 sivua)

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdoituksia harjoituksiin 8 (7 sivua) Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdoituksia harjoituksiin ( sivua).... Nämä ovat kurssin Algebra I harjoitustehtävien ratkaisuehdoituksia. Ratkaisut koostuvat kahdesta osiosta,

Lisätiedot