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

Samankaltaiset tiedostot
Yksinkertaiset tyypit

Rekursiiviset tyypit

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

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

TIES542 kevät 2009 Rekursiiviset tyypit

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Luku 15. Parametripolymorfismi Kumitus

14.1 Rekursio tyypitetyssä lambda-kielessä

Ydin-Haskell Tiivismoniste

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

Staattinen tyyppijärjestelmä

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

Ominaisarvo-hajoitelma ja diagonalisointi

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

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

TIES542 kevät 2009 Tyyppiteorian alkeet

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

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

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

Haskell ohjelmointikielen tyyppijärjestelmä

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

Samanaikaisuuden hallinta

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Luku 2. Ohjelmointi laskentana. 2.1 Laskento

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

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

Rekursiiviset tyypit - teoria

jäsentämisestä TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 27. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

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

5.5 Jäsenninkombinaattoreista

Ohjelmoinnin peruskurssien laaja oppimäärä

5 Differentiaaliyhtälöryhmät

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

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 6. maaliskuuta 2012 TIETOTEKNIIKAN LAITOS.

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

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Vastaavasti, jos vektori kerrotaan positiivisella reaaliluvulla λ, niin

Tietojenkäsittelyteorian alkeet, osa 2

TIES542 kevät 2009 Aliohjelmien formalisointia lambda-kieli

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

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 20. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS.

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

Laskennan rajoja. Sisällys. Meta. Palataan torstaihin. Ratkeavuus. Meta. Universaalikoneet. Palataan torstaihin. Ratkeavuus.

1.4 Funktioiden kertaluokat

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

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

Vektorit, suorat ja tasot

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

Luku 3. Listankäsittelyä. 3.1 Listat

5/20: Algoritmirakenteita III

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

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

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

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

1 Lineaariavaruus eli Vektoriavaruus

Cantorin joukon suoristuvuus tasossa

Lisää pysähtymisaiheisia ongelmia

802320A LINEAARIALGEBRA OSA I

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

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

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 6. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS. Pinoautomaatit.

Insinöörimatematiikka D

1 Sisätulo- ja normiavaruudet

Pinoautomaatit. Pois kontekstittomuudesta

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

802320A LINEAARIALGEBRA OSA II

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

811120P Diskreetit rakenteet

Ohjelmoinnin peruskurssien laaja oppimäärä

Tietotekniikan valintakoe

MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt

3.1 Lineaarikuvaukset. MS-A0004/A0006 Matriisilaskenta. 3.1 Lineaarikuvaukset. 3.1 Lineaarikuvaukset

Insinöörimatematiikka D

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

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

MS-C1340 Lineaarialgebra ja

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

Miten osoitetaan joukot samoiksi?

Transkriptio:

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

Kysymys Mitä yhteistä on seuraavilla funktioilla? isnilint = λx : µt. nil : (), cons : (int, t).case x of nil true, cons false isnilfloat = λx : µt. nil : (), cons : (float, t).case x of nil true, cons false Vastaus Ne ovat sama funktio, vain tyypit ovat tiellä! Kysymys Hylätäänkö tyypit? Vastaus Voisi niinkin tehdä, mutta katsotaan ensin, saadaanko tämä korjattua!

Idea! Otetaan tyyppi parametriksi! isnil = Λt 1.λx : µt 2. nil : (), cons : (t 1, t 2).case x of nil true, cons false isnilint = isnil[int] isnilfloat = isnil[float] Onnistuuko? No totta kai!

Systeemi F: (Abstrakti) syntaksi E ::= I (lauseke)muuttuja E 1 E 2 applikaatio λi : T.E abstraktio E[T ] tyyppiapplikaatio ΛI.E tyyppiabstraktio T ::= I tyyppimuuttuja T 1 T 2 funktiotyyppi I.T universaali tyyppi Γ := Γ, I : T Γ, I

Systeemi F: Tyypityssäännöt Γ, I : T I : T Γ E 1 : T 1 T 2 Γ E 2 : T 1 Γ E 1 E 2 : T 2 I Γ Γ, I : T 1 E : T 2 Γ λi : T 1.E : T 1 T 2 (I, T ) Γ Γ, I E : T (I, T ) Γ : I ei esiinny vapaana T :ssa Γ ΛI.E : I.T Γ E : ΛI.T 1 Γ E[T 2] : T 1[I := T 2]

Systeemi F: Laskentasäännöt Samat säännöt kuin yksinkertaisesti tyypitetyssä λ-laskennossa. Lisäksi seuraavat: E E E[T ] E [T ] (ΛI.E)[T ] E [I := T ]

Esimerkkejä 1. (ΛX.λx : X.x) : X.X X 2. (ΛX.λx : X.x)[Int] (λx : Int.x) 3. (λx : ( X : X X ).x[ X.X X ] x) : ( X.X X ) ( X.X X )

Määritelmä (Kumitus) Määritellään funktio erase Systeemi F:n lausekkeista tyypittömän λ-laskennon lausekkeille seuraavasti: erase(i ) = I erase(λi : T.E) = λi.e erase(e 1 E 2 ) = erase(e 1 ) erase(e 2 ) erase(λi.e) = λi. erase(e) erase(e[t ]) = erase(e) (λx.x) I uusi Tätä funktiota sanotaan tyyppien kumitukseksi (engl. type erasure, turkulaisittain tyyppitypistys).

Lause Olkoon ( F ) Systeemi F:n laskentarelaatio ja olkoon ( λ ) tyypittömän λ-laskennon laskentarelaatio. 1 Olkoot lisäksi E ja E Systeemi F:n lausekkeita. Tällöin, jos E F E niin erase(e) λ erase(e ). Todistus. Jääköön jokaisen itse mietittäväksi. Huomautus Kumitus voidaan muotoilla yksinkertaisillekin tyypeille siten, että vastaava lause pätee. Huomautus Kumitus osoittaa, että Systeemi F:n (ja yksinkertaisten tyyppien) laskenta on tyypeistä riippumatonta. 1 Näitä on toki molemmissa useita, mutta valitaan toisiaan vastaavat, esim. molemmissa normaalijärjestys tai molemmissa β-muunnos.)

Esimerkki Olkoon meillä tyyppi List t kaikilla tyypeillä t. Joitakin sen käsittelyssä hyödyllisiä funktioita ovat: empty : t.list t prepend : t.t List t List t isempty : t.list t Bool first : t.list t t rest : t.list t List t Näiden avulla voidaan kirjoittaa funktio map : t. u.(t u) List t List u seuraavasti: map = Λt.Λu.λf : (t u).λs : List t.fix(λm : (List t List u). if isempty[t] s then empty[u] else prepend[u](f (first[t] s))(m (rest[t] s)))

Kysymys List t ei ole Systeemi F:n tyyppi! Voiko tämän korjata? Vastaus List on tyyppitoimitus (engl. type operator), tyyppitasolla toimiva funktio (eli siis funktio tyypeiltä tyypeille. Lisäämällä Systeemi F:ään tyyppitoimitukset, saadaan Systeemi F ω.

Systeemi F ω lisätään tyyppeihin tuki abstraktiolle ja applikaatiolle List = λt.µs. nil : (), cons : (t, s) jotta tyyppijärjestelmä olisi ratkeava (engl. decidable), tulee tyypeillä olla tyypit engl. kinds, suomennetaan vaikka luonteet luonne : tavalliset tyypit luonne : yksinkertaiset tyyppitoimitukset tyyppilausekkeella T on luonne K merkitään T :: K List :: ns. korkean kertaluokan tyyppitoimitukset ovat varsin esoteerisia luonteiltaan esim. ( ) esim. Haskellin monadit nyt viimeistään on pakko tehdä tyyppiyhtäläisyydestä eksplisiittistä

Systeemi F ω : (Abstrakti) syntaksi E ::= I (lauseke)muuttuja E 1 E 2 applikaatio λi : T.E abstraktio E[T ] tyyppiapplikaatio ΛI :: K.E tyyppiabstraktio T ::= I tyyppimuuttuja T 1 T 2 funktiotyyppi I :: K.T universaali tyyppi T 1 T 2 tyyppitason applikaatio λi :: K.T tyyppitason abstraktio K ::= tavallisen tyypin luonne K 1 K 2 tyyppitoimitusluonne Γ := Γ, I : T Γ, I :: T

Systeemi F ω : Luonnehdintasäännöt Γ, I :: K I :: K Γ, I :: K 1 T :: K 2 Γ (λi :: K 1.T ) :: K 1 K 2 Γ T 1 :: K 1 K 2 Γ T 2 :: K 1 Γ T 1 T 2 :: K 2 Γ T 1 :: Γ T 2 :: Γ T 1 T 2 :: Γ, I :: K T :: Γ ( I :: K.T ) ::

Systeemi F ω : Tyyppiyhtäläisyys T T T 2 T 1 T 1 T 2 T 1 T 2 T 2 T 3 T 1 T 3 T 1 T 1 T 2 T 2 T 1 T 2 T 1 T 2 T 1 T 2 I : K.T 1 I : K.T 2 T 1 T 1 T 2 T 2 T 1 T 2 T 1 T 2 (λi :: K.T 1) T 2 T 1[I := T 2]

Systeemi F ω : Tyypityssäännöt Γ, I : T I : T Γ E 1 : T 1 T 2 Γ E 2 : T 1 Γ E 1 E 2 : T 2 (I, K) Γ Γ T 1 :: Γ, I : T 1 E : T 2 Γ λi : T 1.E : T 1 T 2 (I, T ) Γ Γ, I :: K E : T (I, T ) Γ : I ei esiinny vapaana T :ssa Γ ΛI :: K.E : I :: K.T Γ E : ΛI :: K.T 1 Γ T 2 :: K Γ E[T 2] : T 1[I := T 2] Γ E : T Γ T :: T T Γ E : T

Systeemi F ω : Laskentasäännöt Samat säännöt kuin yksinkertaisesti tyypitetyssä λ-laskennossa. Lisäksi seuraavat: E E E[T ] E [T ] (ΛI :: K.E)[T ] E [I := T ]

Once more unto the breach lisätään Systeemi F ω :aan alityypitys idea: tyyppikvantifiointi on rajoittunutta voidaan sanoa vaikkapa, että jokin funktio toimii geneerisesti vain tietyn tyypin alityypeillä periaatteessa voidaan rajoittaa myös tyyppitoimituksia, mutta jätetään se nyt väliin

Systeemi F ω <: (Abstrakti) syntaksi E ::= I (lauseke)muuttuja E 1 E 2 applikaatio λi : T.E abstraktio E[T ] tyyppiapplikaatio ΛI <: T.E tyyppiabstraktio T ::= I tyyppimuuttuja T 1 T 2 funktiotyyppi I <: K.T universaali tyyppi T 1 T 2 tyyppitason applikaatio λi :: K.T tyyppitason abstraktio Top kansityyppi K ::= tavallisen tyypin luonne K 1 K 2 tyyppitoimitusluonne Γ ::= Γ, I : T Γ, I <: T

Systeemi F ω <: Yleistetty Top Määritelmä Määritellään lyhennysmerkintä rekursiivisesti: Top[ ] = Top Top[K 1 K 2] = ΛI :: K 1.Top[K 2] I uusi Väite Γ T <: Top[K] jos ja vain jos Γ T :: K. Todistus. Induktiolla, sivuutetaan.

Systeemi F ω <: Luonnehdintasäännöt Γ T :: K Γ, I <: T I :: K Γ Top :: Γ, I <: Top[K 1] T :: K 2 Γ (λi :: K 1.T ) :: K 1 K 2 Γ T 1 :: K 1 K 2 Γ T 2 :: K 1 Γ T 1 T 2 :: K 2 Γ T 1 :: Γ T 2 :: Γ T 1 T 2 :: Γ, I <: T 1 T 2 :: Γ ( I <: T 1.T 2) ::

Systeemi F ω <: Tyyppiyhtäläisyys T T T 2 T 1 T 1 T 2 T 1 T 2 T 2 T 3 T 1 T 3 T 1 T 1 T 2 T 2 T 1 T 2 T 1 T 2 U 1 U 2 T 1 T 2 I <: U 1.T 1 I <: U 2.T 2 T 1 T 1 T 2 T 2 T 1 T 2 T 1 T 2 (λi :: K.T 1) T 2 T 1[I := T 2]

Systeemi F ω <: Alityypitys Γ T 1 <: T 2 Γ T 2 <: T 3 Γ T 1 <: T 3 Γ T :: Γ T 1 <: Top Γ T 1 <: T 1 Γ T 2 <: T 2 Γ T 1 T 2 <: T 1 T 2 Γ, I <: T I <: T Γ T 1 :: K Γ, I <: T 1 T 2 <: T 2 Γ ( I <: T 1.T 2) <: ( I <: T 1.T 2) Γ, I <: Top[K] T 1 <: T 2 Γ (λi :: K.T 1) <: (λi :: K.T 2) Γ T 1 <: T 2 Γ T 1 T 2 <: T 1 T 2 Γ T 1 :: K Γ T 2 :: K T 1 T 2 Γ T 1 <: T 2

Systeemi F ω <: Tyypityssäännöt Γ, I : T I : T Γ E 1 : T 1 T 2 Γ E 2 : T 1 Γ E 1 E 2 : T 2 (I, K) Γ Γ T 1 :: Γ, I : T 1 E : T 2 Γ λi : T 1.E : T 1 T 2 (I, T ) Γ Γ, I <: U E : T (I, T ) Γ : I ei esiinny vapaana T :ssa Γ ΛI <: U.E : I <: U.T Γ E : ΛI <: U.T 1 Γ T 2 <: U Γ E[T 2] : T 1[I := T 2] Γ E : T Γ T :: T <: T Γ E : T

Systeemi F ω <: Laskentasäännöt Samat säännöt kuin yksinkertaisesti tyypitetyssä λ-laskennossa. Lisäksi seuraavat: E E E[T ] E [T ] (ΛI <: U.E)[T ] E [I := T ]