Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Ydin-Haskell Tiivismoniste

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

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Yksinkertaiset tyypit

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

TIES542 kevät 2009 Aliohjelmien formalisointia lambda-kieli

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013

Luku 2. Ohjelmointi laskentana. 2.1 Laskento

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

1 Peruslaskuvalmiudet

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

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

T Kevät 2005 Logiikka tietotekniikassa: erityiskysymyksiä I Kertausta Ratkaisut

Haskell ohjelmointikielen tyyppijärjestelmä

Aloitustunti MAA22 Starttikurssi pitkän matematiikan opiskeluun

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

MATP153 Approbatur 1B Ohjaus 2 Keskiviikko torstai

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 16. toukokuuta 2011

formalismeja TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 15. joulukuuta 2015 TIETOTEKNIIKAN LAITOS

Täydentäviä muistiinpanoja kontekstittomien kielioppien jäsentämisestä

S BAB ABA A aas bba B bbs c

TIEA341 Funktio-ohjelmointi 1, kevät 2008

3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset

Rekursiiviset tyypit

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Digitaalitekniikan matematiikka Luku 5 Sivu 1 (22) Lausekkeiden sieventäminen F C F = B + A C. Espresso F = A (A + B) = A A + A B = A B

Kompleksilukujen kunnan konstruointi

TIEA341 Funktio-ohjelmointi 1, kevät 2008

niin järjestys on tämä: ensin kerto- ja jakolaskut vasemmalta oikealle, sen jälkeen plus- ja miinuslaskut vasemmalta oikealle.

Johdatus matematiikkaan

T Syksy 2006 Tietojenkäsittelyteorian perusteet T Harjoitus 7 Demonstraatiotehtävien ratkaisut

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

T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut

811120P Diskreetit rakenteet

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

1.1 Yhtälön sieventäminen

2.2.1 Ratkaiseminen arvausta sovittamalla

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

Rationaalilauseke ja -funktio

Suorista ja tasoista LaMa 1 syksyllä 2009

Ohjelmoinnin perusteet Y Python

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

14.1 Rekursio tyypitetyssä lambda-kielessä

Kompleksilukujen kunnan konstruointi

T kevät 2007 Laskennallisen logiikan jatkokurssi Laskuharjoitus 1 Ratkaisut

Ohjelmoinnin perusteet Y Python

Tekijä Pitkä matematiikka Suoran pisteitä ovat esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4).

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

SAT-ongelman rajoitetut muodot

KOMPLEKSILUVUT C. Rationaaliluvut Q. Irrationaaliluvut

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 10. joulukuuta 2015 TIETOTEKNIIKAN LAITOS.

Ohjelmoinnin perusteet Y Python

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

Numeeriset menetelmät TIEA381. Luento 6. Kirsi Valjus. Jyväskylän yliopisto. Luento 6 () Numeeriset menetelmät / 33

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

1.4 Funktioiden kertaluokat

main :: IO () main = interact (concatmap ((++"\n"). reverse). lines)

Lukuteorian kertausta

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 20. lokakuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 16. marraskuuta 2015

Reaaliarvoisen yhden muuttujan funktion raja arvo LaMa 1U syksyllä 2011

T Syksy 2005 Logiikka tietotekniikassa: perusteet Laskuharjoitus 8 (opetusmoniste, kappaleet )

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

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

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

Luku 3. Listankäsittelyä. 3.1 Listat

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Chomskyn hierarkia. tyyppi 0 on juuri esitelty (ja esitellään kohta lisää) tyypit 2 ja 3 kurssilla Ohjelmoinnin ja laskennan perusmallit

11. Javan valintarakenteet 11.1

= 3 = 1. Induktioaskel. Induktio-oletus: Tehtävän summakaava pätee jollakin luonnollisella luvulla n 1. Induktioväite: n+1

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

Dierentiaaliyhtälöistä

Matematiikan peruskurssi 2

Ohjelmoinnin peruskurssien laaja oppimäärä

Diskreetin matematiikan perusteet Malliratkaisut 2 / vko 38

Ohjelmoinnin perusteet Y Python

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

Transkriptio:

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 = lauseke funktio parametrit = lauseke esim: square x = x * x Huom! Haskellin alikieli :) Leibnitzin laki: samat voidaan korvata toisillaan ilman, että mikään muuttuu

Kertausta: Laaj. aritmetiikan laskusäännöt Normaalin aritmetiikan laskusäännöt, plus: Funktion laventaminen (ns. sievennys) Jos laskentaympäristössä on f x 1... x n = e ja lausekkeessa on osalausekkeena f e 1... e m ja n = m niin silloin osalauseke f e 1... e m voidaan korvata e:llä kunhan siinä ensin kukin x i korvataan e i :llä Vakion laventaminen funktion laventamisen erityistapaus, jossa n = m = 0.

Kertausta: Redeksit Alilauseketta, jota voidaan sieventää, sanotaan redeksiksi Funktiolauseke f e 1... e n on redeksi, jos ympäristössä on vastaava f x 1... x n =... Esim. 4 + 6 on yhteenlaskuredeksi, mutta x + 6 ei muuttujaa ei voi laskea yhteen kokonaisluvun kanssa Lausekkeessa voi olla useita redeksejä, ja redeksi voi olla toisen redeksin sisällä: f (2+2) sisältää kaksi redeksiä, jos laskentaympäristössä on f x =...

Kertausta: Normaalimuoto Normaalimuoto on sellainen lauseke, jossa ei ole yhtään redeksiä (ts. siihen ei voi soveltaa mitään sievennyssääntöä) Esimerkkejä: x + 1 f x (kun ympäristössä ei ole f x =...) 4 + x * 6 12 Mutta seuraavat eivät ole normaalimuodossa: 1 + 1, 4 + 4 * 5, f z (kun ympäristössä on f x =...)

Kertausta: Applikatiivinen järjestys Valitaan sievennettävä redeksi seuraavasti: valitaan vasemmanpuoleisin redeksi mutta jos sen sisällä on redeksi, valitaan sisälläolevista vasemmanpuoleisin mutta jos sen sisällä... jne Sisältä ulos päin strategia Argumentit ensin, sitten vasta sovelletaan funktiota Esimerkki: Kun ympäristössä on f x = 2 ja g x = g (g x): f (g 2) sievennetään g 2 ensin

Kertausta: Normaalijärjestys Valitaan uloimmista redekseistä vasemmanpuoleisin Ulkoa sisäänpäin strategia Korvaa funktiokutsut määrittelyillään ennen argumenttien sievennystä Esimerkki Kun ympäristössä on f x = 2 ja g x = g (g x): f (g 2) sievennetään ensin f (g 2) ==> 2 Teoreema (todistus sivuutetaan): Jos lausekkeella on normaalimuoto, normaalijärjestys löytää sen

Asian pihvi? Laajennettu aritmetiikka on yksinkertaistettu versio osasta Haskellia Kaikki se, mitä laajennetusta aritmetiikasta on sanottu, pätee soveltuvin osin myös Haskelliin Erityisesti: Haskell on pohjimmiltaan laskentoa kääntäjän tehtävänä on laskea meidän puolestamme silti on erittäin hyödyllistä osata tarvittaessa laskea käsin Haskell noudattaa normaalijärjestystä tai oikeastaan graafinsievennystä

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 louksi 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

Algebralliset tyypit laaj. aritmetiikassa Algebrallisen tyypin määrittely on luettavissa kontekstittomana kielioppina, joka sanoo, minkä näköisiä ko. tyypin normaalimuotoiset lausekkeet ovat data RatList = Cons Rational RatList Nil Nil Cons q Nil (jokaisella q :: Rational) Cons q1 (Cons q2 Nil) (jokaisella q1, q2 :: Rational)...

Heikko päänormaalimuoto (WHNF) Lauseke on heikossa päänormaalimuodossa, jos: se on vakio, tai se on konstruktorilauseke ei vaadita, että konstruktorin argumentit olisivat WHNF WNHF Ei WNHF 42 x Cons 42 Nil f (Cons 42 Nil) Cons (f x) y g x r Nil

Heikosta päänormaalimuodosta vielä Normaalimuotoinen lauseke on aina WHNF WHNF lauseke ei ole aina normaalimuotoinen Normaalijärjestyksessä etenevä laskenta löytää aina WHNF:n ennen normaalimuotoa toki tuo WHNF voi olla normaalimuoto itsekin :) WNHF on avainkäsite, kun mietitään hahmonsovitusta

Hahmonsovitus 1 Laajennetaan laajennettua aritmetiikkaa lisäämällä case lausekkeet nyt aluksi ilman vahteja case e of p 1 -> e 1 p 2 -> e 2... p n -> e n Hahmo p i voi olla vakio muuttuja konstruktori, jonka argumentit ovat muuttujia (huomaa poikkeus Haskellista)

Case lausekkeen sievennyssääntö case e of p 1 -> e 1 p 2 -> e 2... p n -> e n Esiehto: e on WHNF muodossa case lauseketta ei voi sieventää, jos tämä ei päde käytännössä tarkoittaa sievennä e WHNF muotoon ensin Valitse hahmoista p i ylin, johon WHNFmuotoinen e sopii jos sellaista ei ole, case lauseketta ei voi sieventää Korvaa case lauseke lausekkeella e i korvaa kuitenkin hahmossa p i esiintyvät muuttujat niillä e i :n osalausekkeilla, johon ne osuvat

f x = Cons x Nil case f 42 of Nil -> 0 Cons x y -> x+1 ==> case Cons 42 Nil of Nil -> 0 Cons x y -> x+1 ==> (x+1)[x 42,y Nil] eli 42+1 ==> 43

Haskellin case lausekkeesta 1 Haskell sieventää case lausekkeen samalla tavalla Ensiksi kuitenkin rekursiivisten hahmojen käytöt puretaan sisäkkäisiksi case lausekkeiksi: case e of Cons x (Cons y Nil) -> e' ==> case e of Cons x tmp -> case tmp of Cons y Nil -> e'

Haskellin case lausekkeesta 2 Sama tehdään vahdeille: case e of Cons x Nil x > 0 -> e1 x < 0 -> e2 ==> case e of Cons x Nil -> case x > 0 of True -> e1 False -> case x < 0 of True -> e2