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

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

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

Yksinkertaiset tyypit

Rekursiiviset tyypit

Luku 15. Parametripolymorfismi Kumitus

semantiikasta TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho 5. lokakuuta 2009 TIETOTEKNIIKAN LAITOS Ohjelmointikielten staattisesta

Tietojenkäsittelyteorian alkeet, osa 2

Silmukkaoptimoinnista

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

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

MS-A0402 Diskreetin matematiikan perusteet

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

MS-A0401 Diskreetin matematiikan perusteet

14.1 Rekursio tyypitetyssä lambda-kielessä

TIES542 kevät 2009 Rekursiiviset tyypit

Samanaikaisuuden hallinta

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ydin-Haskell Tiivismoniste

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

Lisää pysähtymisaiheisia ongelmia

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

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

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

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

12. Monimuotoisuus 12.1

Oletetaan, että funktio f on määritelty jollakin välillä ]x 0 δ, x 0 + δ[. Sen derivaatta pisteessä x 0 on

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

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

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

Rekursiiviset tyypit - teoria

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

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

Laskennan teoria

Johdatus matematiikkaan

DIFFERENTIAALI- JA INTEGRAALILASKENTA I.1. Ritva Hurri-Syrjänen/Syksy 1999/Luennot 6. FUNKTION JATKUVUUS

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

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

MS-A0102 Differentiaali- ja integraalilaskenta 1

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Matematiikan peruskurssi 2

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

ITKP102 Ohjelmointi 1 (6 op)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

0 kun x < 0, 1/3 kun 0 x < 1/4, 7/11 kun 1/4 x < 6/7, 1 kun x 1, 1 kun x 6/7,

IV. TASAINEN SUPPENEMINEN. f(x) = lim. jokaista ε > 0 ja x A kohti n ε,x N s.e. n n

Johdatus matemaattiseen päättelyyn

MS-A010{3,4} (ELEC*) Differentiaali- ja integraalilaskenta 1 Luento 4: Derivaatta

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Cantorin joukon suoristuvuus tasossa

Kuvauksista ja relaatioista. Jonna Makkonen Ilari Vallivaara

Seurauksia. Seuraus. Seuraus. Jos asteen n polynomilla P on n erisuurta nollakohtaa x 1, x 2,..., x n, niin P on muotoa

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Approbatur 3, demo 5, ratkaisut

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

MS-A0402 Diskreetin matematiikan perusteet Yhteenveto, osa I

Pinoautomaatit. Pois kontekstittomuudesta

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 6. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

Johdatus diskreettiin matematiikkaan Harjoitus 1,

f(x 1, x 2 ) = x x 1 k 1 k 2 k 1, k 2 x 2 1, 0 1 f(1, 1)h 1 = h = h 2 1, 1 12 f(1, 1)h 1 h 2

Toispuoleiset raja-arvot

Matematiikan tukikurssi

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

Miten osoitetaan joukot samoiksi?

Insinöörimatematiikka A

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

Derivaatat lasketaan komponenteittain, esimerkiksi E 1 E 2

Relaation ominaisuuksia. Ominaisuuksia koskevia lauseita Sulkeumat. Joukossa X määritelty relaatio R on. (ir) irrefleksiivinen, jos x Rx kaikilla x X,

12. Monimuotoisuus 12.1

TIEA341 Funktio-ohjelmointi 1, kevät 2008

LUKU 3. Ulkoinen derivaatta. dx i 1. dx i 2. ω i1,i 2,...,i k

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Joukossa X määritelty relaatio R on. (ir) irrefleksiivinen, jos x Rx kaikilla x X,

Täydellisyysaksiooman kertaus

Kielioppia: toisin kuin Javassa

811120P Diskreetit rakenteet

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

3.2.2 Tikhonovin regularisaatio

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

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

Laskennan teoria

ITKP102 Ohjelmointi 1 (6 op)

802320A LINEAARIALGEBRA OSA III

MS-A0401 Diskreetin matematiikan perusteet Yhteenveto, osa I

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

FORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus

Ratkaisuehdotukset LH 3 / alkuvko 45

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

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

Transkriptio:

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 1 : T 1,..., I n : T n } {real = 3.0, imag = 5.0} : {real : Real, imag : Real} i, j {1,..., n} : i j I i I j Γ E 1 : T 1 Γ E n : T n Γ {I 1 = E 1,..., I n = E n} : {I n : T 1,..., I n : T n} 1 k n Γ {I 1 = E 1,..., I k = E k,..., I n = E n} : {I n : T 1,..., I k : T k,..., I n : T n} Γ {I 1 = E 1,..., I k = E k,..., I n = E n}.i k : T k

Kysymys Onko seuraava lauseke hyvin tyypitetty? (λr : {x : Int, y : Int}.r.x){x = 0, y = 1} Vastaus 1. x ja y ovat eri nimet 2. r.x on sallittu, koska r:ssä on kenttä x 3. lauseke itse on sallittu, jos argumentilla ja parametrilla on sama tyyppi 4. argumentin tyyppi on {x : Int, y : Int} 5. parametrin tyyppi on {x : Int, y : Int} 6. Vastaus on siis: lauseke on hyvin tyypitetty.

Kysymys Onko seuraava lauseke hyvin tyypitetty? (λr : {x : Int}.r.x){x = 0, y = 1} Vastaus 1. x ja y ovat eri nimet 2. r.x on sallittu, koska r:ssä on kenttä x 3. lauseke itse on sallittu, jos argumentilla ja parametrilla on sama tyyppi 4. argumentin tyyppi on {x : Int, y : Int} 5. parametrin tyyppi on {x : Int} 6. Vastaus on siis: lauseke ei ole hyvin tyypitetty.

Pitäisikö se sallia? Lausekkeen (λr : {x : Int}.r.x){x = 0, y = 1} laskeminen onnistuu tyypityksen vääryydestä huolimatta: (λr : {x : Int}.r.x){x = 0, y = 1} {x = 0, y = 1}.x 0 Tyypityksen asettama rajoitus on siten turha! Yksi ratkaisu on luopua tyypityksestä...... mutta miten tyypitys korjattaisiin?

Määritelmä (Subsumptioperiaate) Tyyppi T 1 kelpaa tyypiksi T 2, jos kaikki lausekkeet E : T 1 ovat (semanttisesti) käytettävissä siellä, missä T 2 :n lausekkeita voidaan käyttää, eli seuraavat kaksi väitettä pätevät kaikilla lausekkeilla E, E 1 : T 1 ja E 2 : T 2 1. Jos E[x := E 2 ] : U 2 ja E[x := E 1 ] : U 1, niin U 1 <: U 2. 2. Jos E[x := E 2 ] ei jää jumiin, niin E[x := E 1 ] ei jää jumiin. Huomautus Jos T 1 kelpaa tyypiksi T 2, sanotaan, että T 1 on T 2 :n alityyppi (engl. subtype) ja merkitään T 1 <: T 2. Alityyppirelaatiota kutsutaan myös subsumptiorelaatioksi.

Riittää laajentaa tyypityssääntöjä seuraavalla lisäsäännöllä (subsumptiosääntö): Γ E : T 1 T 1 <: T 2 Γ E : T 2

Määritelmä Merkitään tyypin T arvojen joukkoa V(T ). Väite (Osajoukkotulkinta) Jos T 1 <: T 2 niin V(T 1 ) V(T 2 ). Todistus. Seuraa subsumptioperiaatteesta, subsumptiosäännöstä ja siitä, että tyypin arvot ovat (ainakin luennoilla tarkastelluissa λ-laskennon laajennuksissa) tyypin lausekkeita.

Lienee selvää, että alityypitys on refleksiivinen ja transitiivinen: T <: T T 1 <: T 2 T 2 <: T 3 T 1 <: T 3

Tarkastellaan lauseketta E.I k. Sen tyyppi riippuu ainoastaan E:n I k -kentän tyypistä Tietuetyypin lopusta saadaan unohtaa kenttiä vapaasti: n m {I 1 : T 1,..., I n : T n } <: {I 1 : T 1,..., I m : T m } Tietuetyypin kentät saavat alityypittyä vapaasti: T 1 <: T 1 T n <: T n {I 1 : T 1,..., I n : T n } <: {I 1 : T 1,..., I n : T n}

Saako kenttiä permutoida, ts. onko seuraava hyväksyttävä sääntö? f : {1,..., n} {1,..., n} f on bijektio {I 1 : T 1,..., I n : T n } <: {I f (1) : T f (1),..., I f (n) : T f (n) } Formaalin semantiikan kautta tulkittuna subsumptiosääntö sallii tämän. Jos sääntö hyväksytään, (<:) ei ole antisymmetrinen eikä siten myöskään osittaisjärjestys. Kääntäjän toteutus menee hankalaksi Ilman permutaatiosääntöä kentän etäisyys tietueen alusta on käännösaikainen vakio. Permutaation kanssa kenttä pitää etsiä joka kerta erikseen, koska sen paikka ei ole etukäteen tiedossa. Tietueisiin pitää tallettaa tieto siitä, missä mikäkin kenttä on.

Kysymys Onko seuraava lauseke hyvin tyypitetty? (λr : {x : Int}.r.x){x = 0, y = 1} Vastaus 1. x ja y ovat eri nimet 2. r.x on sallittu, koska r:ssä on kenttä x 3. lauseke itse on sallittu, jos argumentilla ja parametrilla on sama tyyppi 4. argumentin tyyppi on {x : Int, y : Int} 5. argumentin tyyppi on myös {x : Int} (susumptiosääntö) 6. parametrin tyyppi on {x : Int} 7. Vastaus on siis: lauseke on hyvin tyypitetty.

Kysymys Milloin T 1 T 2 <: T 1 T 2? Vastaus 1. Olkoon f : T 1 T 2 ja f : T 1 T 2. 2. Kysymys on siitä, milloin f kelpaa f :n paikalle? 3. Sen tulee ottaa vastaan ainakin kaikki f :lle kelpaavat argumentit, mutta enemmänkin saa sille kelvata: T 1 <: T 1. alityypitys on parametrin osalta kontravariantti 4. Se saa palauttaa mitä vain mitä f palauttaa, mutta ei enempää; se saa toke palauttaa vähemmän: T 2 <: T 2 alityypitys on paluutyypin osalta kovariantti 5. Näin ollen: T 1 <: T 1 T 2 <: T 2 T 1 T 2 <: T 1 T 2

Kysymys Milloin variantti on toisen variantin alityyppi? Vastaus Keskeinen kysymys on case-lausekkeen käyttäytyminen: case E of I 1 = I 1 E 1,..., I 1 = I 1 E n vaatii, että E:llä on enintään kentät I 1,..., I n. Kenttiä saadaan lisätä: n m I 1 : T 1,..., I n : T n <: I 1 : T 1,..., I m : T m Kentät saavat alityypittyä vapaasti: T 1 <: T 1 T n <: T n I 1 : T 1,..., I n : T n <: I 1 : T 1,..., I n : T n

Permutaatio f : {1,..., n} {1,..., n} f on bijektio I 1 : T 1,..., I n : T n <: I f (1) : T f (1),..., I f (n) : T f (n) on varianttien kanssa melko välttämätön. Kääntäjäteknistä ongelmaa ei ole: variantin kentät alkavat aina samasta kohtaa Permutaatio rikkoo edelleen antisymmetrian ja siten osittaisjärjestys-ominaisuuden Yksi ratkaisu tähän on käyttää eksplisiittistä tyyppiyhtäläisyysrelaatiota T 1 T 2 ja määritellä se seuraavasti: T 1 <: T 2 T 2 <: T 1 T 1 T 2

Top Top-tyyppi on hyödyllinen laajennus: tällöin kaikilla lausekepareilla on yhteinen tyyppi (niiden tyyppien join). Top-tyyppisellä arvolla ei voi juuri mitään tehdä. T ::= Top T <: Top

Bottom Bottom-tyyppi on myös hyödyllinen laajennus: se kelpaa kaikkiin konteksteihin Bottom-tyypissä ei ole arvoja Bottom-tyyppinen lauseke jää ikuiseen silmukkaan tai keskeyttää ohjelman Bottom-tyypin palauttava funktio ei koskaan palaa Monimutkaistaa tyyppitarkastusta T ::= Bottom T <: Bottom

Askriptio Muistathan: E : T on lauseke, joka väittää, että E:n tyyppi on T Varianttien kanssa oli pakollinen, ei enää Lauseke a = 5 voidaan tyypittää rauhassa a : Int Alityypitys huolehtii siitä, että se kelpaa sinne minne pitääkin ilman askriptiota Alityypityksen kanssa askriptio on ns. upcast: sillä saa tehdä tyyppimuunnoksen tyypistä sen ylityyppiin Myös downcast on mahdollinen valinta, mutta se vaatii ajonaikaisen tyyppitarkastuksen: Γ E : T 1 T 2 <: T 1 Γ (E : T 2 ) : T 2