Laiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005

Samankaltaiset tiedostot
TIEA341 Funktio-ohjelmointi 1, kevät 2008

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Luku 3. Listankäsittelyä. 3.1 Listat

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

Ohjelmoinnin peruskurssien laaja oppimäärä

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13

Ohjelmoinnin peruskurssien laaja oppimäärä

Ydin-Haskell Tiivismoniste

Ohjelmoinnin peruskurssien laaja oppimäärä

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

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

815338A Ohjelmointikielten periaatteet

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ohjelmoinnin peruskurssien laaja oppimäärä

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin peruskurssien laaja oppimäärä

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

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

Mitä funktionaalinen ohjelmointi on

5.5 Jäsenninkombinaattoreista

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

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

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

14.1 Rekursio tyypitetyssä lambda-kielessä

815338A Ohjelmointikielten periaatteet

fix e e (fix e). fix = λf.(λx.f (x x)) (λx.f (x x)) (9)

Reaalilukuvälit, leikkaus ja unioni (1/2)

Avaruuden kolme sellaista pistettä, jotka eivät sijaitse samalla suoralla, määräävät

Kompleksilukujen kunnan konstruointi

Ohjelmoinnin peruskurssien laaja oppimäärä

Jakso 4 Aliohjelmien toteutus

Algoritmit 2. Luento 4 Ke Timo Männikkö

Ohjelmoinnin peruskurssien laaja oppimäärä

Itsestabilointi: perusmääritelmiä ja klassisia tuloksia

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

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

Tämä tarina on Fibonaccin lukujen ongelman alkuperäinen muotoilu.

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Makrojen mystinen maailma lyhyt oppimäärä

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Ohjelmoinnin peruskurssien laaja oppimäärä

mplperusteet 1. Tiedosto: mplp001.tex Ohjelmat: Maple, [Mathematica] Sievennä lauseke x 1 ( mplp002.tex (PA P1 s.2011)

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset

Ohjelmoinnin perusteet Y Python

Jakso 4 Aliohjelmien toteutus

Ensimmäisen asteen polynomifunktio

Scheme-kesäkurssi luento 3

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Ohjelmoinnin perusteet Y Python

Luku 2. Ohjelmointi laskentana. 2.1 Laskento

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Olio-ohjelmointi Syntaksikokoelma

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

Tietorakenteet ja algoritmit - syksy

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Hohde Consulting 2004

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

ETL-DEMO. Esimerkki ETL-kuvauskielen käyttöstä

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

Ohjelmoinnin perusteet Y Python

Luku 8. Aluekyselyt. 8.1 Summataulukko

Lukuteoria. Eukleides Aleksandrialainen (n. 300 eaa)

MS-A0205/MS-A0206 Differentiaali- ja integraalilaskenta 2 Luento 3: Osittaisderivaatta

Scheme-kesäkurssi luento 2

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

TIES542 kevät 2009 Rekursiiviset tyypit

Luento 4 Aliohjelmien toteutus

Transkriptio:

Laiska laskenta, korekursio ja äärettömyys TIEA341 Funktio ohjelmointi Syksy 2005

Muistatko graafinsievennyksen?

DAG esitys ja graafinsievennys DAG esitys Lausekkeen rakennepuu, jossa yhteiset alilausekkeet on samastettu x = 2 * 2 * + Graafinsievennys Sievennetään DAG esitystä tavalliseen tapaan, mutta korvataan lopuksi DAG:ssa sievennetyn alilausekkeen juurisolmu vastauksen juurisolmulla x * (2 + x) * 2

x = 2 * 2 * x * (2 + x) + * 2 Redeksi

4 * (2 + 4) * + 4 2 Redeksi

4 * 6 * 6 4 Redeksi

24 24

Laiska laskenta Laiska laskenta on toinen nimitys graafinsievennykselle Ytimekkäästi: mitään ei lasketa ennen kuin on pakko, ja mitään ei lasketa kahdesti mutta tämä on yksinkertaistus Mitään ei lasketa ennen kuin on pakko normaalijärjestys Mitään ei lasketa kahdesti viittaa DAG esityksen ominaisuuteen, jossa yhteiset alilausekkeet samastetaan ei pidä ottaa liian kirjaimellisesti

Tarvevälitys Toinen näkökulma laiskaan laskentaan Arvovälitys (call by value, innokas laskenta): funktion argumentit lasketaan ennen funktiokutsua parametrit saavat laskennan tulokset arvoikseen Nimivälitys (call by name): funktion argumentti lasketaan joka kerta, kun vastaavaa parametria käytetään funktion sisällä Tarvevälitys (call by need, laiska laskenta): kuten nimivälitys, paitsi että argumentin arvo muistetaan, kun se on kerran laskettu

Äärettömät listat succ n = n + 1 map f li = case li of Nil -> Nil Cons x xs -> Cons (f x) (map f xs) nats = Cons 0 (map succ nats) nats Cons 0 map succ

succ n = n + 1 map f li = case li of Nil -> Nil Cons x xs -> Cons (f x) (map f xs) nats = Cons 0 (Cons (succ 0) (map succ )) nats Cons 0 succ Cons map 0 succ

succ n = n + 1 map f li = case li of Nil -> Nil Cons x xs -> Cons (f x) (map f xs) nats = Cons 0 (Cons 1 (map succ )) nats Cons 0 1 Cons map succ

Äärettömät listat Lista, joka ei koskaan pääty: Cons _ (Cons _ (... ei Niliä missään Haskellissa _ : _ : _ :..., ei [] missään Listaa avataan vain sen verran kuin sitä tarvitaan muistissa on yleensä vain koko listan likiarvo likiarvon lopussa on Nilin ([]) tilalla ohje siitä, miten lisää alkioita voidaan laskea thunk tai lupaus

Solmun solmiminen Tietyt äärettömät tietorakenteet on mahdollista kirjoittaa niin, että ne vievät aina vain vakiomäärän muistia Idea: väärinkäytetään DAG esityksen ominaisuutta, jossa samastetaan yhteiset alilausekkeet lausekkeesta tulee oma alilausekkeensa ei ole enää syklitön ( DAG ) graafinsievennys toimii silti Esim. ones = 1 : ones

Eräs Haskellin kirjastofunktio Tehtoton! Ei solmun solmintaa! ( Naivi toteutus ) cycle li = li ++ cycle li cycle li = xs where xs = li ++ xs Solmu solmittu: tehokas! (Näin se toteutetaan oikeasti.)

Solmun solminnasta Solmu solmiutuu, jos: tietorakenteen itseviittaus kulkee vakiomäärittelyn kautta voi olla paikallinenkin vakio Funktio voi palauttaa solmun, jos se solmii sen paikallisella määrittelyllä joko where tai let

Kaksisuuntaisesti linkitty syklinen lista data DList a = DNode (DList a) a (DList a) fromlist :: [a] -> DList a fromlist li = let (f, l) = go l li f in f where go prev [] next = (next, prev) go prev (x:xs) next = let this = DLNode prev x rest (rest,last) = go this xs next in (this, last)

Tuottaja ja kuluttaja 1 Välitietorakenteena lista Laiskuuden ansiosta lista on aina lyhyt (kuluttajan syötyä alkion se tuhoutuu roskienkeruussa) tuottaja kuluttaja tuottaja :: [a] kuluttaja :: [a] -> b

Tuottaja ja kuluttaja 2 tuottaja suodatin kuluttaja tuottaja :: [a] suodatin :: [a] -> [b] kuluttaja :: [b] -> c

Tuottajia repeat x = xs where xs = x : xs iterate f x = xs where xs = x : map f xs randoms seed = iterate f seed where f n = (25173 * n + 13849) `mod` 65536 iterate ja repeat kuuluvat preludiin

Eratostheneen seula Suodatin Tuottaja primes = sieve [2..] where sieve (x:xs) = x : sieve (filter f xs) where f y = y `mod` x /= 0 Myös tuottaja [n..] = iterate (+1) n [n..m] = takewhile (<= m) [n..]

Striktit ja nonstriktit funktiot Yksiparametrisen funktion sanotaan olevan strikti, jos f e sievenee pohjaksi aina, kun e sievenee pohjaksi lyhyesti. f = Muuten se on nonstrikti Moniparametriset funktiot tarkastellaan parametri kerrallaan pitäen muut vakioina f a c d = Esim. && x = mutta False && = False Nonstriktit funktiot eivät ole mahdollisia applikatiivista järjestystä (arvovälitys) käytettäessä

Striktiyden aiheuttajia Jos funktio on määritelty jonkin parametrin osalta (innokkaalla) hahmontunnistuksella, se on strikti siinä parametrissaan Innokkaita hahmoja ovat kaikki konstruktorihahmot kaikki vakiohahmot Laiskoja hahmoja ovat muuttujat jokerihahmo (_) tilde hahmot (~...)

Tilde hahmoista Ns. kiistämätön hahmo ~p, missä p on toinen hahmo esim. ~(x,y) sovitus onnistuu aina tutkittavaa lauseketta ei tarvitse sieventää WHNF:ään jos ei sovitus onnistukaan, hahmon määrittelemien muuttujien arvo on pohja let lausekkeessa hahmot ovat implisiittisesti tildehahmoja let (x,y) =... in... on sama kuin let ~(x,y) =... in...