Rekursiiviset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 20. helmikuuta 2007
Hiloista Kiintopisteet (Ko)rekursio Rekursiiviset tyypit Lopuksi
Osittaisjärjestys Määritelmä Olkoon X joukko ja ( ) X X sen binäärinen relaatio. Jos kaikilla x, y, z X 1. x x, 2. x y y x x = y ja 3. x y y z x z pätevät, ( ) on osittaisjärjestys ja (X, ) on osittain järjestetty joukko (engl. poset, partially-ordered set).
Esimerkkejä
Esimerkkejä 1. Joukon S osajoukkojen joukkoa eli potenssijoukkoa merkitään P(S). Osajoukkorelaatio ( ) on sen osittaisjärjestys.
Esimerkkejä 1. Joukon S osajoukkojen joukkoa eli potenssijoukkoa merkitään P(S). Osajoukkorelaatio ( ) on sen osittaisjärjestys. 2. Nostettujen kokonaislukujen joukossa Z = { } Z on relaatio ( ): n ja n m kaikilla n, m Z, n m. Se on osittaisjärjestys.
Join Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon S X epätyhjä ja olkoon j X. Jos 1. s S : s j ja 2. s S : y X : s y y j pätevät, j on S:n join (merkitään j = S). Jos X on olemassa ja on X :n alkio, se on X :n kansi (engl. top), merkitään.
Join Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon S X epätyhjä ja olkoon j X. Jos 1. s S : s j ja 2. s S : y X : s y y j pätevät, j on S:n join (merkitään j = S). Jos X on olemassa ja on X :n alkio, se on X :n kansi (engl. top), merkitään. Huomautus Jos joukon S join kuuluu joukkoon itseensä ( S S), se on tuon joukon suurin alkio (osittaisjärjestyksen suhteen).
Esimerkkejä
Esimerkkejä 1. Osittain järjestetyssä joukossa (P(X ), ) join on yleistetty yhdiste.
Esimerkkejä 1. Osittain järjestetyssä joukossa (P(X ), ) join on yleistetty yhdiste. 2. Nostettujen kokonaislukujen osittain järjestetyssä joukossa (Z, ) on seuraavat joinit: {, n} = n kaikilla n ja {n} = n kaikilla n.
Meet Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon S X epätyhjä ja olkoon m X. Jos 1. s S : m s ja 2. s S : y X : y s m y pätevät, m on S:n meet (merkitään m = S). Jos X on olemassa ja on X :n alkio, se on X :n pohja (engl. bottom), merkitään.
Meet Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon S X epätyhjä ja olkoon m X. Jos 1. s S : m s ja 2. s S : y X : y s m y pätevät, m on S:n meet (merkitään m = S). Jos X on olemassa ja on X :n alkio, se on X :n pohja (engl. bottom), merkitään. Huomautus Jos joukon S meet kuuluu joukkoon itseensä ( S S), se on tuon joukon pienin alkio (osittaisjärjestyksen suhteen).
Esimerkkejä
Esimerkkejä 1. Osittain järjestetyssä joukossa (P(X ), ) meet on yleistetty leikkaus.
Esimerkkejä 1. Osittain järjestetyssä joukossa (P(X ), ) meet on yleistetty leikkaus. 2. Nostettujen kokonaislukujen osittain järjestetyssä joukossa (Z, ) on aina meet: {n} = n kaikilla n Z, ja jos n, m Z ja n m, niin {n, m} =.
Hilat Määritelmä Olkoon (X, ) osittain järjestetty joukko ja X epätyhjä. Tällöin
Hilat Määritelmä Olkoon (X, ) osittain järjestetty joukko ja X epätyhjä. Tällöin 1. jos X :n jokaisella äärellisellä osajoukolla on join, (X, ) on join-puolihila (engl. join-semilattice);
Hilat Määritelmä Olkoon (X, ) osittain järjestetty joukko ja X epätyhjä. Tällöin 1. jos X :n jokaisella äärellisellä osajoukolla on join, (X, ) on join-puolihila (engl. join-semilattice); 2. jos X :n jokaisella äärellisellä osajoukolla on meet, (X, ) on meet-puolihila;
Hilat Määritelmä Olkoon (X, ) osittain järjestetty joukko ja X epätyhjä. Tällöin 1. jos X :n jokaisella äärellisellä osajoukolla on join, (X, ) on join-puolihila (engl. join-semilattice); 2. jos X :n jokaisella äärellisellä osajoukolla on meet, (X, ) on meet-puolihila; 3. jos (X, ) on sekä join-puolihila että meet-puolihila, se on hila (engl. lattice); ja
Hilat Määritelmä Olkoon (X, ) osittain järjestetty joukko ja X epätyhjä. Tällöin 1. jos X :n jokaisella äärellisellä osajoukolla on join, (X, ) on join-puolihila (engl. join-semilattice); 2. jos X :n jokaisella äärellisellä osajoukolla on meet, (X, ) on meet-puolihila; 3. jos (X, ) on sekä join-puolihila että meet-puolihila, se on hila (engl. lattice); ja 4. jos join ja meet on X :n jokaisella osajoukolla, (X, ) on täydellinen hila (engl. complete lattice).
Esimerkkejä
Esimerkkejä 1. (P(X ), ) on täydellinen hila.
Esimerkkejä 1. (P(X ), ) on täydellinen hila. 2. (Z, ) on meet-puolihila.
Esimerkkejä 1. (P(X ), ) on täydellinen hila. 2. (Z, ) on meet-puolihila. 3. (Z Z, ) on meet-puolihila.
Monotoniset funktiot Määritelmä Olkoon (X, ) osittain järjestetty joukko ja olkoon f : X X. Jos kaikilla x X pätee x f (x), on f järjestyksen säilyttävä eli monotoninen.
Monotoniset funktiot Määritelmä Olkoon (X, ) osittain järjestetty joukko ja olkoon f : X X. Jos kaikilla x X pätee x f (x), on f järjestyksen säilyttävä eli monotoninen. Huomautus Monotoninen funktio ei voi olla tässä yhteydessä vähenevä toisin kuin analyysissä on tapana sanoa. Vähenevää funktiota sanotaan antitoniseksi eli järjestyksen kääntäväksi funktioksi.
Kiintopiste Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon f : X X ja olkoon x X. Tällöin
Kiintopiste Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon f : X X ja olkoon x X. Tällöin 1. x on f -suljettu, jos f (x) x,
Kiintopiste Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon f : X X ja olkoon x X. Tällöin 1. x on f -suljettu, jos f (x) x, 2. x on f -konsistentti, jos x f (x) ja
Kiintopiste Määritelmä Olkoon (X, ) osittain järjestetty joukko, olkoon f : X X ja olkoon x X. Tällöin 1. x on f -suljettu, jos f (x) x, 2. x on f -konsistentti, jos x f (x) ja 3. x on f :n kiintopiste (engl. fixed point), jos se on sekä f -suljettu että f -konsistentti eli jos x = f (x).
Knasterin ja Tarskin lause Lause (Knasterin ja Tarskin hilateoreettinen kiintopistelause) Olkoon (X, ) täydellinen hila ja olkoon f : X X monotoninen. Tällöin f :llä on ainakin yksi kiintopiste, ja sen kiintopisteiden joukko P on itse täydellinen hila. Erityisesti P = { x x f (x) } ja P = { x f (x) x } pätevät ja ovat itse f :n kiintopisteitä. Todistus. Theorem 1 Alfred Tarskin artikkelissa A lattice-theoretical fixpoint theorem and its applications, Pacific Journal of Mathematics, vol. 5 no. 2 (1955). Todistus löytyy myös lukemattomista hilateorian ja sen sovellusalueiden oppikirjoista.
Pienin ja suurin kiintopiste Määritelmä Olkoon (X, ) täydellinen hila, olkoon f : X X monotoninen ja olkoon f :n kiintopisteiden joukko P. Tällöin merkitään µf = P (f :n pienin kiintopiste) ja νf = P (f :n suurin kiintopiste).
Pienin ja suurin kiintopiste Määritelmä Olkoon (X, ) täydellinen hila, olkoon f : X X monotoninen ja olkoon f :n kiintopisteiden joukko P. Tällöin merkitään µf = P (f :n pienin kiintopiste) ja νf = P (f :n suurin kiintopiste). Huomautus Toinen yleinen merkintäkäytäntö on fix f = µf ja FIX f = νf.
Pienin ja suurin kiintopiste Määritelmä Olkoon (X, ) täydellinen hila, olkoon f : X X monotoninen ja olkoon f :n kiintopisteiden joukko P. Tällöin merkitään µf = P (f :n pienin kiintopiste) ja νf = P (f :n suurin kiintopiste). Huomautus Toinen yleinen merkintäkäytäntö on fix f = µf ja FIX f = νf. Huomautus Sekä µf että νf ovat yhtälön x = f (x) ratkaisuja x:n suhteen.
Rekursio ja korekursio Määritelmä Olkoon (X, ) täydellinen hila ja olkoon f : X X monotoninen. Yhtälö x = f (x) määrittelee rekursiivisesti x = µf :n ja korekursiivisesti x = νf :n.
Esimerkki
Esimerkki Kakkosen potenssien joukko voidaan määritellä rekursiivisesti seuraavien sääntöjen avulla: 1. 1 kuuluu joukkoon. 2. Jos n kuuluu joukkoon, niin 2 n kuuluu joukkoon.
Esimerkki Kakkosen potenssien joukko voidaan määritellä rekursiivisesti seuraavien sääntöjen avulla: 1. 1 kuuluu joukkoon. 2. Jos n kuuluu joukkoon, niin 2 n kuuluu joukkoon. Nämä säännöt määrittelevät oikeastaan seuraavan joukkofunktion: f : P(N) P(N) f (S) = {1} { 2 n n S } Funktion parametrijoukossa on alkiot, joiden jo tiedetään kuuluvan kakkosen potenssien joukkoon.
Esimerkki Kakkosen potenssien joukko voidaan määritellä rekursiivisesti seuraavien sääntöjen avulla: 1. 1 kuuluu joukkoon. 2. Jos n kuuluu joukkoon, niin 2 n kuuluu joukkoon. Nämä säännöt määrittelevät oikeastaan seuraavan joukkofunktion: f : P(N) P(N) f (S) = {1} { 2 n n S } Funktion parametrijoukossa on alkiot, joiden jo tiedetään kuuluvan kakkosen potenssien joukkoon. Se, että kakkosen potenssien joukko on noiden sääntöjen rekursion tulos, tarkoittaa oikeastaan, että ko. joukko on µf!
Esimerkki
Esimerkki Puhtaan, tyypittömän λ-laskennon abstrakti syntaksi on E ::= I E 1 E 2 λi.e.
Esimerkki Puhtaan, tyypittömän λ-laskennon abstrakti syntaksi on E ::= I E 1 E 2 λi.e. Oikeastaan tuo puukielioppi määrittelee funktion rakennepuiden joukolta rakennepuiden joukolle seuraavasti: f (E) = { t t I } { t 1 t 2 t 1 E t 2 E } { λt 1.t 2 t 1 I t 2 E }
Esimerkki Puhtaan, tyypittömän λ-laskennon abstrakti syntaksi on E ::= I E 1 E 2 λi.e. Oikeastaan tuo puukielioppi määrittelee funktion rakennepuiden joukolta rakennepuiden joukolle seuraavasti: f (E) = { t t I } { t 1 t 2 t 1 E t 2 E } { λt 1.t 2 t 1 I t 2 E } Abstrakti syntaksi on oikeastaan rakennepuiden joukko µf!
Tehtävä Tarkastellaan puhtaan, tyypittömän λ-laskennon β-muunnossääntöjä: E 1 E 1 E 1 E 2 E 1 E 2 E 2 E 2 E 1 E 2 E 1 E 2 E E λi.e λi.e (λi.e 1) E 2 E 1[I := E 2] Minkälainen funktio f :n tulee olla, jotta ( ) = µf?
Esimerkki
Esimerkki Abstrakti syntaksi T ::= T T määrittelee funktion f (T ) = { t 1 t 2 t 1 T t 2 T }.
Esimerkki Abstrakti syntaksi T ::= T T määrittelee funktion f (T ) = { t 1 t 2 t 1 T t 2 T }. Jos tämä tulkitaan rekursiiviseksi määritelmäksi, T on tyhjä joukko, sillä µf =.
Esimerkki Abstrakti syntaksi T ::= T T määrittelee funktion f (T ) = { t 1 t 2 t 1 T t 2 T }. Jos tämä tulkitaan rekursiiviseksi määritelmäksi, T on tyhjä joukko, sillä µf =. Kuitenkin tuolla abstraktilla syntaksilla on luonnollinen tulkinta: T sisältää yhden äärettömän rakennepuun.
Esimerkki Abstrakti syntaksi T ::= T T määrittelee funktion f (T ) = { t 1 t 2 t 1 T t 2 T }. Jos tämä tulkitaan rekursiiviseksi määritelmäksi, T on tyhjä joukko, sillä µf =. Kuitenkin tuolla abstraktilla syntaksilla on luonnollinen tulkinta: T sisältää yhden äärettömän rakennepuun. Tarvitaan korekursiota: T = νf.
Äärettömät tyypit tavallisesti abstraktit kieliopit ovat rekursiivisia määritelmiä kun sallitaan äärettömät tyypit, tyyppien joukko määritelläänkin korekursiivisesti eikä rekursiivisesti periaatteessa edelleen samat tyypityssäännöt, niiden tulkinta vain muuttuu
µ-tyypit äärettömien puiden kanssa on käytännössä mahdotonta työskennellä siksi lyhennysmerkintä: T ::= I T T µi.t µi.t sitoo tyyppimuuttujan I samalla tavalla kuin λi.e sitoo muuttujan I µi.t tarkoittaa sitä ääretöntä tyyppiä, joka on yhtälön I = T korekursiiviseksi ratkaisuksi asetetaan lisäksi kaksi hyvinmuodostussääntöä: 1. Jos tyyppi sisältää ali-ilmaisun µi.µi 1.....µI n.t, niin T ei saa olla I. 2. Kokonaisessa tyypissä ei saa olla vapaita (tyyppi)muuttujia.
Miksi µ eikä ν?
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu korekursiivinen? miksi se ei sitten ole νi.t?
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu korekursiivinen? miksi se ei sitten ole νi.t? joukkotulkinta: tyyppi T on sentyyppisten arvojen joukko
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu korekursiivinen? miksi se ei sitten ole νi.t? joukkotulkinta: tyyppi T on sentyyppisten arvojen joukko µi.t on rekursiivisesti määriteltävien (eli äärellisten) arvojen joukko
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu korekursiivinen? miksi se ei sitten ole νi.t? joukkotulkinta: tyyppi T on sentyyppisten arvojen joukko µi.t on rekursiivisesti määriteltävien (eli äärellisten) arvojen joukko µi.t :tä (jossa I esiintyy vapaana T :ssä) sanotaan siksi rekursiiviseksi tyypiksi
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu korekursiivinen? miksi se ei sitten ole νi.t? joukkotulkinta: tyyppi T on sentyyppisten arvojen joukko µi.t on rekursiivisesti määriteltävien (eli äärellisten) arvojen joukko µi.t :tä (jossa I esiintyy vapaana T :ssä) sanotaan siksi rekursiiviseksi tyypiksi νi.t olisi korekursiivisten eli äärettömien arvojen joukko!
Miksi µ eikä ν? µi.t on yhtälön I = T korekursiivinen ratkaisu korekursiivinen? miksi se ei sitten ole νi.t? joukkotulkinta: tyyppi T on sentyyppisten arvojen joukko µi.t on rekursiivisesti määriteltävien (eli äärellisten) arvojen joukko µi.t :tä (jossa I esiintyy vapaana T :ssä) sanotaan siksi rekursiiviseksi tyypiksi νi.t olisi korekursiivisten eli äärettömien arvojen joukko! νi.t :tä sanotaan korekursiiviseksi tyypiksi
Esimerkkejä
Esimerkkejä 1. Äärellisten kokonaislukulistojen tyyppi on µt. nil : {}, cons : {car : Int, cdr : t}.
Esimerkkejä 1. Äärellisten kokonaislukulistojen tyyppi on µt. nil : {}, cons : {car : Int, cdr : t}. 2. Nälkäiset funktiot: µt.int t
Esimerkkejä 1. Äärellisten kokonaislukulistojen tyyppi on µt. nil : {}, cons : {car : Int, cdr : t}. 2. Nälkäiset funktiot: µt.int t 3. Kokonaislukuvirrat (engl. streams): µt.{} {car : Nat, cdr : t} tai νt.{car : Nat, cdr : t}
Huomautus Rekursiivisilla tyypeillä laajennettu yksinkertaisesti tyypitetty λ-laskento onkin Turing-täydellinen, sillä λf : T T.(λx : (µt.t T ).f (x x))(λx : (µt.t T ).f (x x)) on hyvin tyypitetty kiintopisteoperaattori!
Ensi maanantaina ei ole luentoa. Ensi tiistaina jatketaan rekursiivisten tyyppien kanssa.