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

Samankaltaiset tiedostot
Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

Ydin-Haskell Tiivismoniste

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

5.5 Jäsenninkombinaattoreista

Luku 2. Ohjelmointi laskentana. 2.1 Laskento

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIES542 kevät 2009 Aliohjelmien formalisointia lambda-kieli

1 Peruslaskuvalmiudet

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

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

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

Yksinkertaiset tyypit

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

5.3 Laskimen muunnelmia 5.3. LASKIMEN MUUNNELMIA 57

Johdatus matematiikkaan

Lukuteorian kertausta

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

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

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

Luku 7. Aliohjelmat. 7.1 Kutsusekvenssit. Aliohjelma (subroutine) on useimpien kielten tärkein kontrollivuon ohjausja abstrahointikeino.

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

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

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin perusteet Y Python

1.1 Yhtälön sieventäminen

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

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

Ohjelmoinnin perusteet Y Python

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

MATP153 Approbatur 1B Ohjaus 2 Keskiviikko torstai

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

811120P Diskreetit rakenteet

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

TIEA341 Funktio-ohjelmointi 1, kevät 2008

13. Loogiset operaatiot 13.1

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

Joukot. Georg Cantor ( )

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

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

8.1 Murtoluvun määritelmä - murtoluvulla tarkoitetaan aina osaa (osia) jostakin kokonaisuudesta

Haskell ohjelmointikielen tyyppijärjestelmä

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. joulukuuta 2015

T Tietojenkäsittelyteorian seminaari

Kompleksilukujen kunnan konstruointi

ITKP102 Ohjelmointi 1 (6 op)

Aloitustunti MAA22 Starttikurssi pitkän matematiikan opiskeluun

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

Ohjelmointi 1 C#, kevät 2013, 2. tentti

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Johdatus matematiikkaan

Laskentaa kirjaimilla

KOMPLEKSILUVUT C. Rationaaliluvut Q. Irrationaaliluvut

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

Java-kielen perusteet

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

Ohjelmoinnin perusteet Y Python

Sisällys JAVA-OHJELMOINTI Osa 3: Laskennan ohjaus. Lohkolause (block) Peräkkäinen laskenta. Lohkon käyttö. Esimerkki

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

Ohjelmointi 1 C#, kevät 2013,

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

Tutoriaaliläsnäoloista

Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet

Ohjelmoinnin peruskurssien laaja oppimäärä

1. Olio-ohjelmointi 1.1

Algoritmit 1. Demot Timo Männikkö

802328A LUKUTEORIAN PERUSTEET OSA III BASICS OF NUMBER THEORY PART III. Tapani Matala-aho MATEMATIIKKA/LUTK/OULUN YLIOPISTO

k-kantaisen eksponenttifunktion ominaisuuksia

4.1 Kaksi pistettä määrää suoran

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

13. Loogiset operaatiot 13.1

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Johdatus matematiikkaan

Sisällys. 15. Lohkot. Lohkot. Lohkot

Java-kielen perusteet

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 19. syyskuuta 2016

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Ohjelmoinnin perusteet, 1. välikoe

Matematiikan peruskurssi 2

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Transkriptio:

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 lopulta hahmottamaan, mistä funktio ohjelmoinnissa oikein on kyse: Funktio ohjelmointi on pohjimmiltaan laskentoa

Kohdekieli ja metakieli 1 Kohdekielellä tarkoitetaan kieltä, jota tarkastellaan Tällä kurssilla Haskell, laskinesimerkissä aritmetiikka Metakieli on kieli, jolla kohdekieltä tarkastellaan Tällä kurssilla suomi, laskinesimerkissä Haskell Toisaalta: kohdekieli esiintyy metakielisessä tekstissä suorina lainauksina. Hän sanoi: I like it here. englanti on tässä kohdekieli suomi on tässä metakieli

Kohdekieli ja metakieli 2 Jotta metakielellä voidaan puhua kohdekielestä, pitää metakielessä voida esittää kohdekielisiä ilmaisuja Hän sanoi: I like it here. jasenna 1 + 1 Yhteen (Luku 1) (Luku 1) On mahdollista, että metakieli ja kohdekieli ovat samat ns. metasirkulaarinen tilanne Kappas vain, sanoi mörökölli.

Eräs kohdekieli: 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

Laskento nojaa Leibnitzin lakiin square x = x * x Laskentaympäristö: Vakioiden ja funktioiden määrittelyt, joita voi laskiessa käyttää 2 * square 3 + x ==> 2 * (3 * 3) + x ==> 2 * 9 + x ==> 18 + x

Laajennetun 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.

Muuttujan korvaaminen lausekkeella Yllättävän yleinen toimenpide Merkintä: e[x 1 e 1,..., x n e n ] Tarkoittaa: lausekkeessa e korvataan kukin x i vastaavalla e i :llä Merkintä kuuluu metakieleen, ei kohdekieleen! Ts. (x + 1)[x 2] on metakielinen ilmaisu, joka tarkoittaa samaa kuin 2 + 1.

Esimerkki cube a = a * double a double a = a * a cube 42 ==> ( sievennys/cube) 42 * double 42 ==> ( sievennys/double) 42 * (42 * 42) ==> 42 * 1764 ==> 74088

Sievennyksestä vielä 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 =...

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 =...)

Laskentajärjestys Monet lausekkeet voidaan laskea monessa eri järjestyksessä Jos lausekkeessa on useita redeksejä, voidaan valita, kumpi sievennetään ensin Esim. (2 * 3) + (4 * 6) kaksi * redeksiä Joskus valinnalla on merkitystä: Kun ympäristössä on f x = 2 ja g x = g (g x): f (g 2) kaksi redeksiä: f (g 2) ja g 2 jos sievennetään ulompi ensin: f (g 2) ==> 2 jos sisempi ensin: f (g 2) ==> f (g (g 2)) ==> f (g (g (g 2))) ==>...

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

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

Ohjelmoidaanpa edellinen data Expr = Const Rational App String [Expr] Add Expr Expr Sub Expr Expr Mul Expr Expr Div Expr Expr type Env = Map String ([String], Expr) sievenna :: Env > Expr > Expr

Sievennys, normaalijärjestyksessä sievenna _ (Add (Const n) (Const m)) = Const (n+m) sievenna _ (Sub (Const n) (Const m)) = Const (n m) sievenna _ (Mul (Const n) (Const m)) = Const (n*m) sievenna _ (Div (Const n) (Const m)) = Const (n/m) sievenna e (Add e1 e2) = apu e Add e1 e2 sievenna e (Sub e1 e2) = apu e Sub e1 e2 sievenna e (Mul e1 e2) = apu e Mul e1 e2 sievenna e (Div e1 e2) = apu e Div e1 e2... apu e op e1 e2 e1 /= e1' e2 /= e2' = sievenna e (op e1' e2') where e1' = sievenna e e1 e2' = sievenna e e2 apu _ op e1 e2 = op e1 e2

Sievennys jatkuu sievenna env (App f args) = case Map.lookup f env of Just (pars, e) length pars == length arg > sievenna env' e where env' = Map.union mp env args' = map (\a > ([],a)) args mp = zip pars args' _ > App f (map (sievenna env) args)