8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että
|
|
- Aleksi Nurmi
- 8 vuotta sitten
- Katselukertoja:
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 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...
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ätiedotLAUSELOGIIKKA (1) Sanalliset ilmaisut ovat usein epätarkkoja. On ilmaisuja, joista voidaan sanoa, että ne ovat tosia tai epätosia, mutta eivät molempia. Ilmaisuja, joihin voidaan liittää totuusarvoja (tosi,
LisätiedotToinen muotoilu. {A 1,A 2,...,A n,b } 0, Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin kun 1 / 13
2 3 Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin kun {A 1,A 2,...,A n,b } 0, jatkoa jatkoa 1 / 13 2 3 Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin
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ä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ä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ätiedot-Matematiikka on aksiomaattinen järjestelmä. -uusi tieto voidaan perustella edellisten tietojen avulla, tätä kutsutaan todistamiseksi
-Matematiikka on aksiomaattinen järjestelmä -uusi tieto voidaan perustella edellisten tietojen avulla, tätä kutsutaan todistamiseksi -mustavalkoinen: asia joko on tai ei (vrt. humanistiset tieteet, ei
LisätiedotYhtä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ä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ä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ä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ätiedotT 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ä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ätiedot1. Osoita, että joukon X osajoukoille A ja B on voimassa toinen ns. de Morganin laki (A B) = A B.
HY / Avoin yliopisto Johdatus yliopistomatematiikkaan, kesä 2015 Harjoitus 3 Ratkaisuehdotuksia Tehtäväsarja I Seuraavissa tehtävissä harjoitellaan muun muassa kahden joukon osoittamista samaksi sekä joukon
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ätiedotTietotekniikan valintakoe
Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan
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ätiedotApprobatur 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ätiedotTehtävä 1. Päättele resoluutiolla seuraavista klausuulijoukoista. a. 1 {p 3 } oletus. 4 {p 1, p 2, p 3 } oletus. 5 { p 1 } (1, 2) 7 (4, 6)
Tehtävä 1 Päättele resoluutiolla seuraavista klausuulijoukoista. a. {{p 0 }, {p 1 }, { p 0, p 2 }, {p 1, p 2, p 3 }, { p 2, p 3 }, {p 3 }}, b. {{ p 0, p 2 }, {p 0, p 1 }, {{ p 1, p 2 }, { p 2 }}, c. {{p
LisätiedotVaihtoehtoinen 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ätiedotLisää kvanttoreista ja päättelyä sekä predikaattilogiikan totuustaulukot 1. Negaation siirto kvanttorin ohi
Lisää kvanttoreista ja päättelyä sekä predikaattilogiikan totuustaulukot 1. Negaation siirto kvanttorin ohi LUKUTEORIA JA TODISTAMINEN, MAA11 Esimerkki a) Lauseen Kaikki johtajat ovat miehiä negaatio ei
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ätiedotRekursio. 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ätiedotLuonnollisen 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ätiedotLogiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.
TIE303 Formaalit menetelmät, kevät 2005 Logiikan kertausta Antti-Juhani Kaijanaho antkaij@mit.jyu.fi Jyväskylän yliopisto Tietotekniikan laitos TIE303 Formaalit mentetelmät, 2005-01-27 p. 1/17 Luento2Luentomoniste
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ätiedot11/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ätiedotTodistusteoriaa. Kun kielen syntaksi on tarkasti määritelty, voidaan myös määritellä täsmällisesti, mitä pätevällä päättelyllä tarkoitetaan.
Todistusteoriaa Kun kielen syntaksi on tarkasti määritelty, voidaan myös määritellä täsmällisesti, mitä pätevällä päättelyllä tarkoitetaan. Todistusteoriassa annetaan joukko aksioomia ja päättely- sääntöjä,
LisätiedotKesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset
Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset 2000-08-03T10:30/12:00 Huomaa, että joihinkin kysymyksiin on useampia oikeita vastauksia, joten nämä ovat todellakin vain mallivastaukset. 1 Logiikkaa
LisätiedotLisää pysähtymisaiheisia ongelmia
Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti
LisätiedotZeon PDF Driver Trial
Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin
LisätiedotMatematiikan 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ätiedotReaalifunktioista 1 / 17. Reaalifunktioista
säilyy 1 / 17 säilyy Jos A, B R, niin funktiota f : A B sanotaan (yhden muuttujan) reaalifunktioksi. Tällöin karteesinen tulo A B on (aiempia esimerkkejä luonnollisemmalla tavalla) xy-tason osajoukko,
LisätiedotMiten osoitetaan joukot samoiksi?
Miten osoitetaan joukot samoiksi? Määritelmä 1 Joukot A ja B ovat samat, jos A B ja B A. Tällöin merkitään A = B. Kun todistetaan, että A = B, on päättelyssä kaksi vaihetta: (i) osoitetaan, että A B, ts.
LisätiedotMatematiikan 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ätiedotEsitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa 1. Lähdetään sieventämään epäyhtälön vasenta puolta:
MATP00 Johdatus matematiikkaan Ylimääräisten tehtävien ratkaisuehdotuksia. Osoita, että 00 002 < 000 000. Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa. Lähdetään sieventämään epäyhtälön
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ä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ätiedotAlgoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
LisätiedotLoogiset konnektiivit
Loogiset konnektiivit Tavallisimmat loogiset konnektiivit ovat negaatio ei konjunktio ja disjunktio tai implikaatio jos..., niin... ekvivalenssi... jos ja vain jos... Sulkeita ( ) käytetään selkeyden vuoksi
LisätiedotMS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I
MS-A040 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I G. Gripenberg Aalto-yliopisto. maaliskuuta 05 G. Gripenberg (Aalto-yliopisto) MS-A040 Diskreetin matematiikan perusteet Esimerkkejä. ym.,
LisätiedotFI3 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ätiedotKarteesinen tulo. Olkoot A = {1, 2, 3, 5} ja B = {a, b, c}. Näiden karteesista tuloa A B voidaan havainnollistaa kuvalla 1 / 21
säilyy Olkoot A = {1, 2, 3, 5} ja B = {a, b, c}. Näiden karteesista tuloa A B voidaan havainnollistaa kuvalla c b a 1 2 3 5 1 / 21 säilyy Esimerkkirelaatio R = {(1, b), (3, a), (5, a), (5, c)} c b a 1
LisätiedotJokaisen parittoman kokonaisluvun toinen potenssi on pariton.
3 Todistustekniikkaa 3.1 Väitteen kumoaminen vastaesimerkillä Monissa tilanteissa kohdataan väitteitä, jotka koskevat esimerkiksi kaikkia kokonaislukuja, kaikkia reaalilukuja tai kaikkia joukkoja. Esimerkkejä
LisätiedotLOGIIKKA johdantoa
LOGIIKKA johdantoa LUKUTEORIA JA TO- DISTAMINEN, MAA11 Logiikan tehtävä: Logiikka tutkii ajattelun ja päättelyn sääntöjä ja muodollisten päättelyiden oikeellisuutta, ja pyrkii erottamaan oikeat päättelyt
LisätiedotNimitys 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ätiedotMatematiikan 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ä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ätiedotHY / Matematiikan ja tilastotieteen laitos Johdatus logiikkaan I, syksy 2018 Harjoitus 5 Ratkaisuehdotukset
HY / Matematiikan ja tilastotieteen laitos Johdatus logiikkaan I, syksy 2018 Harjoitus 5 Ratkaisuehdotukset 1. Päättele resoluutiolla seuraavista klausuulijoukoista: (a) {{p 0 }, {p 1 }, { p 0, p 2 },
LisätiedotTodistusmenetelmiä Miksi pitää todistaa?
Todistusmenetelmiä Miksi pitää todistaa? LUKUTEORIA JA TO- DISTAMINEN, MAA11 Todistus on looginen päättelyketju, jossa oletuksista, määritelmistä, aksioomeista sekä aiemmin todistetuista tuloksista lähtien
LisätiedotTodistus: 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ätiedotMS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I
MS-A040 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I G. Gripenberg Aalto-yliopisto. maaliskuuta 05 G. Gripenberg (Aalto-yliopisto) MS-A040 Diskreetin matematiikan perusteet Esimerkkejä. ym.,
LisätiedotTämä tarina on Fibonaccin lukujen ongelman alkuperäinen muotoilu.
Rekursiosta ja iteraatiosta Oletetaan että meillä on aluksi yksi vastasyntynyt kanipari, joista toinen on uros ja toinen naaras. Kanit saavuttavat sukukypsyyden yhden kuukauden ikäisinä. Kaninaaraan raskaus
LisätiedotAlityypitys. 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ätiedotf(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))
Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia
LisätiedotTietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
Lisätiedot811120P 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ätiedotT 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ätiedotTietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
LisätiedotDemo 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ä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ätiedotMS-A0402 Diskreetin matematiikan perusteet
MS-A0402 Diskreetin matematiikan perusteet Osa 1: Joukko-oppi ja logiikka Riikka Kangaslampi 2017 Matematiikan ja systeemianalyysin laitos Aalto-yliopisto Kiitokset Nämä luentokalvot perustuvat Gustaf
LisätiedotJohdatus matemaattiseen päättelyyn
Johdatus matemaattiseen päättelyyn Maarit Järvenpää Oulun yliopisto Matemaattisten tieteiden laitos Syyslukukausi 2015 1 Merkintöjä 2 Todistamisesta 2 3 Joukko-oppia Tässä luvussa tarkastellaan joukko-opin
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ätiedot58131 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ä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ä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ätiedotverkkojen 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ätiedotRekursiiviset palautukset [HMU 9.3.1]
Rekursiiviset palautukset [HMU 9.3.1] Yleisesti sanomme, että ongelma P voidaan palauttaa ongelmaan Q, jos mistä tahansa ongelmalle Q annetusta ratkaisualgoritmista voidaan jotenkin muodostaa ongelmalle
LisätiedotMatematiikan 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ä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ätiedotMatematiikan 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ätiedotLaiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005
Laiska laskenta, korekursio ja äärettömyys TIEA341 Funktio ohjelmointi Syksy 2005 Muistatko graafinsievennyksen? DAG esitys ja graafinsievennys DAG esitys Lausekkeen rakennepuu, jossa yhteiset alilausekkeet
Lisätiedotb) Määritä myös seuraavat joukot ja anna kussakin tapauksessa lyhyt sanallinen perustelu.
Johdatus yliopistomatematiikkaan Helsingin yliopisto, matematiikan ja tilastotieteen laitos Kurssikoe 23.10.2017 Ohjeita: Vastaa kaikkiin tehtäviin. Ratkaisut voi kirjoittaa samalle konseptiarkille, jos
Lisätiedot1. 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ätiedotLOAD 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ä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ätiedotTyyppiluokat 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ätiedotModus 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ätiedotJohdatus 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ätiedotJFO: Johdatus funktionaaliseen ohjelmointiin
JFO: Johdatus funktionaaliseen ohjelmointiin Matti Nykänen Tietojenkäsittelytieteen laitos, Itä-Suomen yliopisto matti.nykanen@uef.fi Lukuvuosi 2010-11, IV periodi Sisältö 1 Johdanto 1 1.1 Historiaa.....................................
LisätiedotVasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:
Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: S A S B Samaan jäsennyspuuhun päästään myös johdolla S AB Ab ab: S A S B Yhteen jäsennyspuuhun liittyy aina tasan yksi vasen
LisätiedotSekalaiset 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ätiedotRajoittamattomat kieliopit (Unrestricted Grammars)
Rajoittamattomat kieliopit (Unrestricted Grammars) Laura Pesola Laskennanteorian opintopiiri 13.2.2013 Formaalit kieliopit Sisältävät aina Säännöt (esim. A -> B C abc) Muuttujat (A, B, C, S) Aloitussymboli
Lisätiedot= 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ätiedotTehtä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ätiedotMAT-13510 Laaja Matematiikka 1U. Hyviä tenttikysymyksiä T3 Matemaattinen induktio
MAT-13510 Laaja Matematiikka 1U. Hyviä tenttikysymyksiä T3 Matemaattinen induktio Olkoon a 1 = a 2 = 5 ja a n+1 = a n + 6a n 1 kun n 2. Todista induktiolla, että a n = 3 n ( 2) n, kun n on positiivinen
LisätiedotRatkaisu: (b) A = x 0 (R(x 0 ) x 1 ( Q(x 1 ) (S(x 0, x 1 ) S(x 1, x 1 )))).
HY / Matematiikan ja tilastotieteen laitos Johdatus logiikkaan I, syksy 2018 Harjoitus 3 Ratkaisuehdotukset 1. Palataan Partakylään. Olkoon P partatietokanta ja M tästä saatu malli kuten Harjoitusten 1
LisätiedotUusi 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ä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ätiedotMuita vaativuusluokkia
Muita vaativuusluokkia Käydään lyhyesti läpi tärkeimpiä vaativuusluokkiin liittyviä tuloksia. Monet tunnetuista tuloksista ovat vaikeita todistaa, ja monet kysymykset ovat vielä auki. Lause (Ladner 1975):
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ätiedot1. Universaaleja laskennan malleja
1. Universaaleja laskennan malleja Laskenta datan käsittely annettuja sääntöjä täsmällisesti seuraamalla kahden kokonaisluvun kertolasku tietokoneella, tai kynällä ja paperilla: selvästi laskentaa entä
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ätiedotTestaa: 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ätiedotTenttiin 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ätiedotDiskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8
Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8 Tuntitehtävät 1-2 lasketaan alkuviikon harjoituksissa ja tuntitehtävät 5- loppuviikon harjoituksissa. Kotitehtävät 3-4 tarkastetaan loppuviikon
LisätiedotTietorakenteet (syksy 2013)
Tietorakenteet (syksy 2013) Harjoitus 1 (6.9.2013) Huom. Sinun on osallistuttava perjantain laskuharjoitustilaisuuteen ja tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. Näiden laskuharjoitusten
Lisätiedot