TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Luku 3. Listankäsittelyä. 3.1 Listat

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Miten osoitetaan joukot samoiksi?

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

DFA:n käyttäytyminen ja säännölliset kielet

Rekursiiviset tyypit

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

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

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

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 8. maaliskuuta 2012

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Johdatus matemaattiseen päättelyyn

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Yksinkertaiset tyypit

811120P Diskreetit rakenteet

Ydin-Haskell Tiivismoniste

Johdatus matematiikkaan

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

Ohjelmoinnin peruskurssien laaja oppimäärä

4 Matemaattinen induktio

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tietojenkäsittelyteorian alkeet, osa 2

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 22. toukokuuta 2013

Matemaattisten työvälineiden täydentäviä muistiinpanoja

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

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

1. Osoita, että joukon X osajoukoille A ja B on voimassa toinen ns. de Morganin laki (A B) = A B.

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

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

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

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

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

Todistusmenetelmiä Miksi pitää todistaa?

(2n 1) = n 2

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

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

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

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 29. toukokuuta 2013

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

Johdatus matematiikkaan

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

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

Johdatus diskreettiin matematiikkaan (syksy 2009) Harjoitus 3, ratkaisuja Janne Korhonen

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ensimmäinen induktioperiaate

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 26. tammikuuta 2012

14.1 Rekursio tyypitetyssä lambda-kielessä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ensimmäinen induktioperiaate

SAT-ongelman rajoitetut muodot

Matematiikan tukikurssi, kurssikerta 5

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

1 Lineaariavaruus eli Vektoriavaruus

Derivaatat lasketaan komponenteittain, esimerkiksi E 1 E 2

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Jokaisen parittoman kokonaisluvun toinen potenssi on pariton.

Tehtävä 4 : 2. b a+1 (mod 3)

802320A LINEAARIALGEBRA OSA I

LUKUTEORIA johdantoa

1.4 Funktioiden kertaluokat

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa 1. Lähdetään sieventämään epäyhtälön vasenta puolta:

TIES542 kevät 2009 Rekursiiviset tyypit

Johdatus diskreettiin matematiikkaan Harjoitus 2, Osoita että A on hyvin määritelty. Tee tämä osoittamalla

Pinoautomaatit. Pois kontekstittomuudesta

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

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

V ar(m n ) = V ar(x i ).

Turingin koneet. Sisällys. Aluksi. Turingin koneet. Turingin teesi. Aluksi. Turingin koneet. Turingin teesi

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

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

Algoritmit 1. Luento 5 Ti Timo Männikkö

Luonnollisen päättelyn luotettavuus

Näin ollen saadaan tulos rad(g) diam(g). Toisaalta huomataan, että verkon G kaikilla solmuilla x ja y pätee kolmioepäyhtälön nojalla havainto

Matematiikan peruskurssi 2

(iv) Ratkaisu 1. Sovelletaan Eukleideen algoritmia osoittajaan ja nimittäjään. (i) 7 = , 7 6 = = =

Matematiikan tukikurssi

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

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

Matemaattisen analyysin tukikurssi. 1. Kurssikerta ( )

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

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

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

Transkriptio:

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 (kuten kurssin alussa tehtiin) ei kuitenkaan aina esim. miten todistaa, että kaikille äärellisille listoille xs pätee foldr (:) [] xs = xs?

Rakenneinduktio listojen tapauksessa Tarkasteltavana väite P, joka on parametrisoitu listan suhteen: 1. Jos P([]) on tosi,... 2.... ja jos P(x : xs) on tosi kaikilla x aina kun P(xs) on tosi,... 3.... niin P(xs) on tosi kaikilla äärellisillä listoilla xs. Todistus tällä tekniikalla on todistus listan xs rakenteen suhteen. Askel 1 on perustapaus. Askel 2 on induktioaskel, ja siinä P(xs) on induktio-oletus.

Väite: foldr (:) [] xs = xs kaikilla äärellisillä xs Muista: f o l d r f z [ ] = z (D1) f o l d r f z ( x : x s ) = f x ( f o l d r f z x s ) (D2) Todistus induktiolla xs:n rakenteen suhteen: Perustapaus Induktiotapaus foldr (:) [] [] = [] (D1) foldr (:) [] (x : xs) = (:) x (foldr (:) [] xs) (D2) = (:) x xs induktio-oletus = x : xs syntaksi

Väite: length (xs ++ ys) = length xs + length ys kaikilla äärellisillä xs ja ys l e n g t h [ ] = 0 ( L1 ) l e n g t h (_: l ) = 1 + l e n g t h l ( L2 ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Todistus induktiolla xs:n rakenteen suhteen, kun ys on mielivaltainen äärellinen lista: Perustapaus Induktioaskel... length ([] ++ ys) = length ys (C1) = 0 + length ys aritm. = length [] + length ys (L1)

Väite: length (xs ++ ys) = length xs + length ys kaikilla äärellisillä xs ja ys l e n g t h [ ] = 0 ( L1 ) l e n g t h (_: l ) = 1 + l e n g t h l ( L2 ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Todistus induktiolla xs:n rakenteen suhteen, kun ys on mielivaltainen äärellinen lista: Perustapaus... Induktioaskel length ((x : xs) ++ ys) = length (x : (xs ++ ys)) (C2) = 1 + length (xs ++ ys) (L2) = 1 + (length xs + length ys) induktio-oletus = (1 + length xs) + length ys aritm. = length (x : xs) + length ys (L2)

Väite: reverse xs = foldl (flip (:)) [] xs kaikilla äärellisillä listoilla xs r e v e r s e [ ] = [ ] ( R1 ) r e v e r s e ( x : x s ) = r e v e r s e x s ++ [ x ] ( R2 ) f o l d l f z [ ] = z ( F1 ) f o l d l f z ( x : x s ) = f o l d l f ( f z x ) x s ( F2 ) f l i p f x y = f y x ( FL ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Todistus induktiolla xs:n rakenteen suhteen: Perustapaus: Induktioaskel:... reverse [] = [] (R1) = foldl (flip (:)) [] [] (F 1)

Väite: reverse xs = foldl (flip (:)) [] xs kaikilla äärellisillä listoilla xs r e v e r s e [ ] = [ ] ( R1 ) r e v e r s e ( x : x s ) = r e v e r s e x s ++ [ x ] ( R2 ) f o l d l f z [ ] = z ( F1 ) f o l d l f z ( x : x s ) = f o l d l f ( f z x ) x s ( F2 ) f l i p f x y = f y x ( FL ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Todistus induktiolla xs:n rakenteen suhteen: Perustapaus:... Induktioaskel:... tarvitaan lemma reverse (x : xs) = reversexs ++[x] (R2) = foldl (flip (:)) [] xs ++[x] induktio-oletus = foldl (flip (:)) [] (x : xs)??? foldl (flip (:)) [] xs ++[x] = foldl (flip (:)) [] (x : xs)

Lemma: foldl (flip (:)) [] xs ++[x] = foldl (flip (:)) [] (x : xs) f o l d l f z [ ] = z ( F1 ) f o l d l f z ( x : x s ) = f o l d l f ( f z x ) x s ( F2 ) f l i p f x y = f y x ( FL ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Todistus laskemalla: foldl (flip (:)) [] xs ++[x] = foldl (flip (:)) ([] ++[x]) xs??? = foldl (flip (:)) [x] xs (C1) = foldl (flip (:)) (flip (:) [] x) xs (FL) = foldl (flip (:)) [] (x : xs) (F 2) Ensimmäisessä askeleessa tarvitaan uutta lemmaa: foldl (flip (:)) ys xs ++[y] = foldl (flip (:)) (ys ++[y]) xs kaikilla äärellisillä listoilla xs ja ys sekä kaikilla y.

Lemma: foldl (flip (:)) ys xs ++[y] = foldl (flip (:)) (ys ++[y]) xs f o l d l f z [ ] = z ( F1 ) f o l d l f z ( x : x s ) = f o l d l f ( f z x ) x s ( F2 ) f l i p f x y = f y x ( FL ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Induktio xs:n rakenteen suhteen: Perustapaus: Induktioaskel:... foldl (flip (:)) ys [] ++[y] = ys ++[y] (F 1) = foldl (flip (:) (ys ++[y]) [] (F 1)

Lemma: foldl (flip (:)) ys xs ++[y] = foldl (flip (:)) (ys ++[y]) xs f o l d l f z [ ] = z ( F1 ) f o l d l f z ( x : x s ) = f o l d l f ( f z x ) x s ( F2 ) f l i p f x y = f y x ( FL ) [ ] ++ y s = y s ( C1 ) ( x : x s ) ++ y s = x : ( x s ++ y s ) ( C2 ) Induktio xs:n rakenteen suhteen: Perustapaus:... Induktioaskel: foldl (flip (:)) ys (x : xs) ++[y] = foldl (flip (:)) (flip (:) ys x) xs ++[y] (F 2) = foldl (flip (:)) (x : ys) xs ++[y] (FL) = foldl (flip (:)) ((x : ys) ++[y]) xs induktio-oletus = foldl (flip (:)) (x : (ys ++[y])) xs (C2) = foldl (flip (:)) (flip (:) (ys ++[y]) x) xs (FL) = foldl (flip (:)) (ys ++[y]) (x : xs) (F 2)

map n ominaisuuksia Seuraavat pätevät kaikilla funktioilla f ja g sekä kaikilla äärellisillä listoilla xs ja ys, kunhan tyypit menevät oikein: map (\x x) = \x x map (f. g) = map f. map g map f. tail = tail. map f map f. reverse = reverse. map f map f. concat = concat. map f map f (xs ++ ys) = map f xs ++ map f ys f. head = head. map f jos f on strikti 1 1 Määritellään myöhemmin.

foldien ominaisuuksia Seuraavat pätevät kaikilla operaattoreilla ja ja kaikilla e, kunhan tyypit menevät oikein: 1. Jos (x y) z = x (y z) ja e x = x ja x e = x pätevät kaikilla x, y ja z, niin kaikilla äärellisillä listoilla xs pätee foldr ( ) e xs = foldl ( ) e xs 2. Jos (x y) z = x (y z) ja x e = e x pätevät kaikilla x, y ja z, niin kaikilla äärellisillä listoilla xs pätee foldr ( ) e xs = foldl ( ) e xs 3. Kaikilla äärellisillä listoilla xs pätee foldr ( ) e xs = foldl (flip ( )) e (reverse xs)

Muita ominaisuuksia Kaikilla äärellisillä xs ja ys sekä kaikilla ei-negatiivisilla n ja m pätee: (xs ++ ys) ++ zs = xs ++(ys ++ zs) xs ++[] = [] take n xs ++ drop n xs = xs take m. take n = take (min m n) drop m. drop n = drop (m + n) take m. drop n = drop n. take (m + n) drop m. take n = take (n m). drop m reverse (reverse xs) = xs head (reverse xs) = last xs last (reverse xs) = head xs jos n m

Striktiys Otetaan käyttöön merkintätapa: jos lausekken laskenta ei koskaan pääty tai se päättyy virheeseen, lausekkeen arvoksi merkitään (pohja). Vastaavasti :ia voidaan käyttää merkitsemään lauseketta, jonka laskenta ei pääty tai jonka laskenta päättyy virheeseen. Määritellään, että funktio f on strikti, jos f = pätee ja nonstrikti, jos f pätee.

Esimerkkejä (+1) on strikti funktio. (+) on strikti funktio molempien parametriensa suhteen. id on nonstrikti funktio.

Striktiys Haskellissa Haskell-funktiot ovat aina lähtökohtaisesti nonstriktejä. Haskell-funktio on strikti jonkin parametrinsa suhteen, jos: 1. kyseistä parametria sovitetaan koettelevaan (engl. refutable) hahmoon, tai 2. kyseinen parametri annetaan jollekin striktille funktiolle argumenttina. Kaikki muut hahmot ovat koettelevia paitsi muuttujat, jokerit (_) ja ~-hahmot.

Esimerkki True && x = x False && _ = False (&&) on ensimmäisen parametrinsa suhteen strikti, koska ko. parametria sovitetaan koettelevaan hahmoon True. (&&) on toisen parametrinsa suhteen nonstrikti, koska sitä ei soviteta koettelevaan hahmoon eikä sitä myöskään anneta millekään striktille funktiolle argumentiksi.

Ekstensioperiaate Kaksi funktiota f ja g ovat samat, jos f x = g x pätee kaikilla x.

Väite: f. head = head. map f jos f on strikti head ( x :_) = x (HE) f. g = \ x > f ( g x ) (CO) map f [ ] = [ ] (M1) map f ( x : x s ) = f x : map f x s (M2) Ekstensioperiaatteen perusteella induktio parametrilistan rakenteen suhteen: Perustapaus: (f. head) [] Induktioaskel:... = (\x f (head x)) [] (CO) = f (head []) funktion soveltaminen = f (HE) ja epäonninen sovitus = oletus: f on strikti = head [] (HE) ja epäonninen sovitus = head (map f []) (M1) = (\x head (map f x)) [] funktion abstrahoiminen = (head. map f ) [] (CO)

Väite: f. head = head. map f jos f on strikti head ( x :_) = x (HE) f. g = \ x > f ( g x ) (CO) map f [ ] = [ ] (M1) map f ( x : x s ) = f x : map f x s (M2) Ekstensioperiaatteen perusteella induktio parametrilistan rakenteen suhteen: Perustapaus:... Induktioaskel: (f. head) (x : xs) = (\y f (head y)) (x : xs) (CO) = f (head (x : xs)) funktion soveltaminen = f x (HE) = head (f x : map f xs) (HE) = head (map f (x : xs)) (M2) = (\y head (map f y)) (x : xs) funktion abstrahoiminen = (head. map f ) (x : xs) (CO) Entä äärettömät parametrilistat?

Rakenneinduktio äärettömillä listoilla Tarkasteltavana yhtälö E 1 (xs) = E 2 (xs), joka on parametrisoitu listan xs suhteen: 1. Jos E 1 ( ) = E 2 ( ) on tosi,... 2.... ja jos E 1 (x : xs) = E 2 (x : xs) on tosi kaikilla x aina kun E 1 (xs) = E 2 (xs) on tosi,... 3.... niin E 1 (xs) = E 2 (xs) on tosi kaikilla äärettömillä listoilla xs. Todistus tällä tekniikalla on todistus äärettömän listan xs rakenteen suhteen. Askel 1 on pohjatapaus. Askel 2 on induktioaskel, ja siinä E 1 (xs) = E 2 on induktio-oletus. Jos lisäksi todistetaan perustapaus E 1 ([]) = E 2 ([]), niin yhtälö on tosi kaikilla listoilla (niin äärellisillä kuin äärettömillä).

Väite: f. head = head. map f jos f on strikti head ( x :_) = x (HE) f. g = \ x > f ( g x ) (CO) map f [ ] = [ ] (M1) map f ( x : x s ) = f x : map f x s (M2) Ekstensioperiaatteen perusteella induktio parametrilistan rakenteen suhteen: Pohjatapaus: (f. head) = (\x f (head x)) (CO) = f (head ) funktion soveltaminen = f (HE), koetteleva hahmonsovitus = Oletus: f on strikti = head (HE), koetteleva hahmonsovitus = head (map f ) (M1), koetteleva hahmonsovitus = (\x head (map f x)) funktion abstrahoiminen = (head. map f ) (CO) Perustapaus:... Induktioaskel:...

Rakenneinduktio muilla Haskellin rekursiivisilla tyypeillä käydään läpi kaikki tyypin koostimet yksi kerrallaan rekursiivisten koostimien kohdalla saadaan käyttää induktio-oletusta jos halutaan, voidaan käydä läpi pohjatapauskin, jolloin todistus toimii äärettömilläkin