Muita universaaleja laskennan malleja Tällä kurssilla Turingin kone on valittu algoritmikäsitteen formalisoinniksi. Toisin sanoen tulkitsemme, että laskentaongelmalle on olemassa algoritmi, jos ja vain jos se voidaan ratkaista Turingin koneella. Jotta tämä valinta ei tuntuisi aivan mielivaltaiselta, käymme lyhyesti läpi edustavan kokoelman muita algoritmikäsitteelle ehdotettuja formalismeja: Random Access Machine: idealisoitu moderni tietokone Rajoittamattomat kieliopit: mahdollisimman yleinen produktiosääntöhin perustuva malli Rekursiiviset funktiot: algoritmisesti ratkeavien ongelmien joukko määritellään sellaisten sulkeumaominaisuuksien kautta, joita sillä tulisi olla ( jos ongelmalla A on ratkaisualgoritmi, niin silloin myös siitä muodostetulla ongelmalla B pitäisi olla ratkaisualgoritmi ) Osoittautuu, että kaikki nämä lähestymistavat johtavat oleellisesti samaan algoritmin käsitteeseen kuin Turingin koneet. 49
Edellä on yksinkertaisuuden vuoksi rajoituttu päätösongelmiin. Seuraavaksi esiteltävistä formalismeista Random Access Machine ja rekursiiviset funktiot ovat luontevampia ajatella osittaisten funktioden kautta. Olkoon M deterministinen Turingin kone, jonka syöteaakkosto on Σ. Oletetaan lisäksi, että M pysähtyy vain muotoa vqw olevissa tilanteissa, missä v, w Σ. Koneen M laskema osittainen funktio f: Σ Σ määritellään nyt seuraavasti: jos M syötteellä x pysähtyy tilanteeseen vqw, niin f(x) = vw Σ jos M syötteellä x ei pysähdy, niin f(x) ei ole määritelty. (Jos M jollain syötteellä pysähtyy siten, että nauhalla on ylimääräisiä syöteaakkostoon kuulumattomia merkkejä, se ei siis ylipäänsä laske mitään osittaista funktiota. Funktion laskemisessa ei kiinnitetä huomiota siihen, pysähtyykö kone hyväksyvään vai ei-hyväksyvään tilaan.) Yleisessä tapauksessa f ei ole oikea funktio, koska se ei ole määritelty kaikilla argumentin arvoilla x. Niinpä laskettavuuden teoriassa esiintyy paljon osittaisia funktioita. Jos M pysähtyy kaikilla syötteillä, asiaa usein korostetaan sanomalla että se laskee totaalisen funktion. 50
Random Access Machine (RAM) ( ) abstraktin tietokoneen konekieliohjelma koneessa rajoittamaton määrä rekistereitä jotka voivat sisältää mielivaltaisen suuren kokonaisluvun merkitään rekisterin j sisältöä r j, j = 0, 1, 2,... rekisteri 0 akku; lisäksi käskyosoitin κ syötteenä luvut i 1, i 2, i 3,... tuloste on rekisterin 0 sisältö laskennan pysähtymishetkellä; jos laskenta ei pysähdy, tuloste ei ole määritelty 51
RAMin käskykanta käsky merkitys READ j r 0 := i j READ *j r 0 := i rj STORE j r j := r 0 STORE *j r rj := r 0 LOAD x r 0 := val(x) ADD x r 0 := r 0 + val(x) SUB x r 0 := r 0 val(x) käsky merkitys HALF r 0 := r 0 /2 JUMP j κ := j JPOS j jos r 0 > 0 niin κ := j JZERO j jos r 0 = 0 niin κ := j JNEG j jos r 0 < 0 niin κ := j HALT laskenta pysähtyy r j on rekisterin numero j sisältämä kokonaisluku x voi olla jokin vaihtoehdoista %j, j tai j missä j N. val(%j) = j, val(j) = r j ja val( j) = r rj 52
Turingin koneiden ja RAMin vertaamiseksi samastetaan luonnolliset luvut ja niiden binääriesitykset. Toisin sanoen olkoon b(n) { 0, 1 } luvun n binääriesitys, kun n N. Sanomme, että Turingin kone M laskee osittaisen funktion f: N N, jos M laskee osittaisen funktion ˆf: { 0, 1 } { 0, 1 }, missä jos x = b(n) jollain n ja f(n) = m N, niin ˆf(x) = b(m) muuten ˆf(x) ei ole määritelty. Lause: Osittainen funktio f: N N voidaan laskea Turingin koneella, jos ja vain jos se voidaan laskea RAMilla. Todistushahmotelma: Vain jos -suunta on helppo: RAMilla pitää ensin muuntaa syöteluku binääriesityksekseen ja sen jälkeen simuloida Turingin konetta. Tämä on suoraviivainen ohjelmointiharjoitus. Jos -suuntaa varten kontruoidaan annetulle RAMille sitä simuloiva 7-nauhainen Turingin kone. Seuraavassa esitetään vain nauhojen sisältö, yksityiskohdat sivuutetaan. 53
Nauha 1: syöteluvut sopivasti koodattuna Nauha 2: rekisterien sisältö koodattuna jonoiksi b(j) : b(r j ) missä siis b( ) tarkoittaa binääriesitystä; näiden jonojen välillä voi olla mielivaltainen määrä tyhjämerkkejä Nauha 3: käskyosoitin κ Nauha 4: se indeksi j jota vastaavaa r j ollaan etsimässä nauhalta 2 Nauhat 5 7: työnauhoja aritmetiikkaan jne. 54
Turingin kone vs. tietokone [HMU 8.6] Edellä esitetyn perusteella Turingin kone on sopiva malli modernille tietokoneelle, jolla on käytettävissään rajoittamaton määrä muistia. Reaalisissa tietokoneissa on aina jokin kiinteä yläraja käytettävissä olevan muistin määrälle. Periaatteessa oikea malli tietokoneelle, jossa on B bittiä muistia, olisi äärellinen 2 B -tilainen automaatti. Näin monitilaisen systeemin ajatteleminen äärellisenä automaattina ei kuitenkaan ole kovin intuitiivista. Kun systeemiä ajatellaan Turingin koneena, saavutetaan se etu, että kontrolliosa on pieni, hallittavissa oleva ja sama kaiken kokoisille syötteille. Tämän takia siedetään mallissa se epärealistinen piirre, että Turingin koneen simulaatio voi joillain syötteillä vaatia enemmän muistia kuin fyysisesti on käytettävissä. Millä tahansa yksittäisellä päättyvällä laskennalla tosin tarvitaan vain jokin äärellinen määrä muistia, mutta tätä määrää ei voi tietää ennakolta. 55
Rajoittamattomat kieliopit ( ) Ohjelmoinnin ja laskennan perusmalleista muistetaan, että kieli voidaan kuvata (esim.) kieliopilla joka tuottaa sen, tai automaatilla joka tunnistaa sen. säännölliset lausekkeet äärelliset automaatit kontekstittomat kieliopit pinoautomaatit Nyt saadaan yksi vastaava pari lisää: rajoittamattomat kieliopit Turingin koneet 56
Rajoittamaton kielioppi on nelikko G = (V, Σ, P, S) missä V aakkosto Σ päätemerkit; N = V Σ välikemerkit P (V { ε }) V produktiot S N lähtösymboli Produktiota (α, β) merkitään yleensä α β. Erona kontekstittomiin kielioppeihin, että produktion vasemmalla puolella voi olla mikä tahansa epätyhjä merkkijono. 57
Merkkijono γ V johtaa suoraan merkkijonon γ V jos voidaan kirjoittaa γ = αωβ ja γ = αω β missä ω ω P. Tällöin merkitään γ G γ. Merkkijono γ V johtaa merkkijonon γ V jos on olemassa γ 0 = γ, γ 1, γ 2,..., γ n = γ joille γ i 1 G γ i. Tällöin merkitään γ G γ. Kieliopin G tuottama kieli on L(G) = { } x Σ S x. G 58
Esimerkki: muodostetaan G = (V, Σ, P, S) jolle L(G) = { a k b k c k k 0 }. (Huom. kieli { a k b k c k k 0 } ei ole kontekstiton.) Siis Σ = { a, b, c }. Valitaan N = { S, X, T, A, B, C } ja otetaan produktiot S XT S ε T ABCT T ABC BA AB CA AC CB BC XA a aa aa ab ab bb bb bc bc cc cc 59
Siis merkkijonon a k b k c k tuottamiseksi tuotetaan X(ABC) k järjestetään A-, B- ja C-merkit aakkosjärjestykseen; tuloksena XA k B k C k korvataan isot kirjaimet pienillä vasemmalta alkaen. Tämä osoittaa että rajoittamattomilla kieliopeilla voidaan tuottaa muitakin kuin kontekstisia kieliä. Seuraavaksi käydään periaatetasolla läpi konstruktiot, jotka osoittavat että itse asiassa rajoittamattomilla kieliopeilla voidaan tuottaa tasan ne kielet, jotka voidaan tunnistaa Turingin koneella. 60
Lause: Jos kieli voidaan tuottaa rajoittamattomalla kieliopilla, niin se voidaan tunnistaa Turingin koneella. Todistus (periaate): Olkoon G rajoittamaton kielioppi. Aiemmin esitetyn perusteella riittää muodostaa kaksinauhainen epädeterministinen Turingin kone M jolle L(M) = L(G). Nauha 1 sisältää vain kopion syötejonosta. Nauhalle 2 tuotetaan (epädeterministisesti) lähtösymbolista tuotettavissa olevia merkkijonoja. Laskennan aluksi nauhalle 2 kirjoitetaan pelkkä lähtösymboli. Jos jossain vaiheessa nauhojen sisällöt ovat samat, hyväksytään. 61
Laskenta koostuu vaiheista joissa kussakin viedään epädeterministisesti nauhan 2 nauhapää mielivaltaiseen paikkaan valitaan epädeterministisesti mielivaltainen kieliopin G produktio jos nauhapään kohdalta löytyy produktion vasen puoli, kirjoitetaan sen paikalle produktion oikea puoli verrataan nauhojen 1 ja 2 sisältöjä Koska produktioita on äärellinen määrä, ne voidaan koodata Turingin koneen tiloihin. Tarkemmat yksityiskohdat sivuutetaan. 62
Lause: Jos kieli voidaan tunnistaa Turingin koneella, niin se voidaan tuottaa rajoittamattomalla kieliopilla. Todistus: Olkoon M = (Q, Σ, Γ, δ, q 0, #, F ) annettu. Idea on muodostaa kielioppi G = (V, Σ, P, S) joka tuottaa koneen M tilanteita. Välikkeiksi otetaan siis ainakin koneen M tilojen symbolit. Produktiot suunnitellaan siten että [vqw] G [v q w ] jos ja vain jos vqw M v q w missä [ ja ] ovat uusia välikesymboleja. Tämä on mahdollista koska vqw M v q w edellyttää että vqw ja v q w eroavat toisistaan vain merkin q lähiympäristössä. 63
Merkkijonon x L(M) tuottaminen tapahtuu kolmessa vaiheessa: 1. tuotetaan lähtösymbolista S merkkijono x[q 0 x]. 2. muunnetaan x[q 0 x] G x[vq f w] missä q f F 3. siistitään x[vq f w] G x Varsinainen työ tapahtuu vaiheessa 2 jossa G simuloi konetta M. Jos x L(M), niin G ei pysty tuottamaan muotoa x[vq f w] olevia merkkijonoja. 64
Esitetään vielä konstruktion yksityiskohdat. Aakkostona on (huom. Σ Γ). V = Γ Q { S, T, [, ], X, Y } { A a a Σ } Produktiot jakautuvat edelläesitettyjen vaiheiden mukaisesti kolmeen osakokonaisuuteen: Vaihe 1: alkutilanteen tuottaminen S T [q 0 ] T ε T at A a A a [q 0 [q 0 A a A a b ba a A a ] a] (kaikilla a, b Σ) 65
Vaihe 2: siirtymien simulointi (nämä niille a, b, c Γ jotka ilmenevät siirtymäfunktiosta) Siirtymä δ(q, a) = (q, b, R) δ(q, a) = (q, b, L) δ(q, #) = (q, b, R) δ(q, #) = (q, b, L) δ(q, a) = (q, b, L) Vastaava produktio qa bq cqa q cb q] bq ] cq] q cb] [qa [q #b Vaihe 3: lopputilanteen siistiminen (kaikille a Γ, q f F ) q f XY ax X [X ε Y a Y Y ] ε 66
Chomskyn hierarkia Noam Chomskyn vuonna 1956 esittämä luokittelu kieliopeille niiden ilmaisuvoiman mukaan tyyppi kieli kielioppi tunnistaminen 0 rekurs. lueteltava rajoittamaton Turingin kone 1 kontekstinen kontekstinen lin. rajoitettu TM 2 kontekstiton kontekstiton pinoautomaatti 3 säännöllinen oikealle lin. äärellinen autom. tyyppi 0 on juuri esitelty (ja esitellään kohta lisää) tyypit 2 ja 3 kurssilla Ohjelmoinnin ja laskennan perusmallit kuvan täydentämiseksi käydään tässä lyhyesti läpi taso 1 67
Kontekstinen kielioppi: kuten rajoittamaton kielioppi mutta produktioiden muotoa rajoitetaan sallitaan produktiot α β missä β α lisäksi sallitaan produktio S ε olettaen että S ei esiinny minkään produktion oikealla puolella Nimi kontekstinen tulee siitä, että tällaiset kielet voidaan muuntaa muotoon jossa produktiot (pl. mahd. S ε) ovat tyyppiä αaβ αωβ missä A on välike ja ω ε. Siis intuitiivisesti produktiota A ω saadaan käyttää vain kontekstissa α β. 68
Lineaarisesti rajoitettu Turingin kone on epädeterministinen yksinauhainen Turingin kone joka ei koskaan kirjoita mitään muuta niiden tyhjämerkkien päälle jotka nauhalla on alkutilanteessa. Siis kone käyttää ainoastaan syötteen pituuden verran nauhatilaa. Lause Kieli voidaan tuottaa kontekstisella kieliopilla jos ja vain jos se voidaan tunnistaa lineaarisesti rajoitetulla Turingin koneella. (Todistus sivuutetaan.) Tämä on siis esimerkki laskennan mallista, jossa pelkästään syötteen koon perusteella saadaan yläraja sen vaatiman laskennan määrälle. Universaaleilla laskennan malleilla näin ei ole, vaan lyhytkin syöte voi johtaa pitkään laskentaan. 69
Rekursiiviset funktiot (Gödel ja Kleene 1936) ( ) Palautetaan mieliin: kieli A on rekursiivisesti lueteltava jos A = L(M) jollain Turingin koneella M A on rekursiivinen jos lisäksi M pysähtyy kaikilla syötteillä Käytetään taas luvun n binääriesitykselle merkintää b(n), ja oletetaan että A { 0, 1 } n on joukko tällaisia binääriesityksiä (jos x A niin x = b(n) jollain n N). Seuraavassa määritellään rekursiiviset funktiot f: N N joille osoittautuu pätevän A on rekursiivinen kieli jos ja vain jos π A on rekursiivinen funktio, missä π A (n) = 1 jos b(n) A ja π A (n) = 0 muuten. A on rekursiivisesti lueteltava jos ja vain jos jollain rekursiivisella f pätee A = { b(f(x)) x N } 70
Rekursiivisten funktioiden määritelmän idea on seuraava: tietyt alkeisfunktiot pitäisi ilman muuta osata laskea jos on annettu joitain perusfunktioita jotka osataan laskea, niin niistä tietyillä yksinkertaisilla operaatioilla muodostetut funktiot pitäisi myös osata laskea Rekursiivisia funktioita ovat tasan ne jotka tämän logiikan mukaan pitäisi osata laskea. Tässä on siis tavallaan deklaratiivinen määritelmä laskettavuudella, itse laskentaprosessista ei puhuta mitään. Tietysti intuitio laskentaprosesseista on vahvasti taustalla kun valitaan sopivat alkeisfunktiot ja operaatiot. 71
Määritellään ensin yleisemmin osittaisrekursiiviset funktiot N k N. Alkeisfunktiot nollafunktio Z: N N, Z(x) = 0 kaikilla x seuraajafunktio S: N N, S(x) = x + 1 kaikilla x kaikilla n N ja 1 i n projektiofunktio U n i : Nn N, U n i (x 1,..., x n ) = x i kaikilla x 1,..., x n N Nämä ovat kaikki totaalisia funktioita eli määritelty kaikilla argumenttien arvoilla 72
Määritellään nyt operaatioita uusien funktioiden muodostamiseksi. Sijoitus: kun on annettu f: N k N ja g 1,..., g k jotka ovat funktioita N m N, sijoitus tuottaa funktion h: N m N, h(x) = f(g i (x),..., g k (x)) Rekursio: kun on annettu funktiot f: N k N ja g: N k+2 N, rekursio tuottaa sen funktion h: N k+1 N jolle h(x, 0) = f(x) h(x, y + 1) = g(x, y, h(x, y)) Jos jollain argumentilla x esim. jokin g i (x) ei ole määritelty, niin myöskään sijoittamalla saatu h(x) ei ole määritelty tällä x jne. Jos annetut funktiot ovat totaalisia, myös sijoittamalla ja rekursiolla syntyvät funktiot ovat. 73
Primitiivirekursiivisten funktioiden joukko PR on pienin joukko joka sisältää funktiot Z, S ja U n i kaikilla i, n ja on suljettu sijoittamisen ja rekursion suhteen (ts. jos funktiot f ja g i ovat joukossa PR, myös niistä sijoituksella tai rekursiolla saadut funktiot ovat) Siis PR koostuu tasan niistä funktioista, jotka voidaan muodostaa alkeisfunktioista Z, S ja Ui n sijoitusta ja rekursiota käyttäen. Tästä seuraa että kaikki primitiivirekursiiviset funktiot ovat totaalisia. 74
Esimerkkejä Identiteettifunktio f(x) = x on sama kuin projektio U 1 1. Muodostetaan g yhdistämällä S ja U3 3, siis g(x, y, z) = z + 1. Yhteenlaskufunktio p(x, y) = x + y toteuttaa p(x, 0) = x p(x, y + 1) = p(x, y) + 1 joten se saadaan rekursiolla ylläolevista f ja g. Kertolaskufunktio m(x, y) = xy puolestaan toteuttaa m(x, 0) = 0 m(x, y + 1) = m(x, y) + x joten se saadaan edelleen rekursiolla yhteenlaskufunktion avulla. 75
Kaikki tavalliset aritmeettiset perusfunktiot nähdään helposti primitiivirekursiivisiksi. Yleisemmin primitiivirekursiivisia ovat täsmälleen ne funktiot, jotka voidaan laskea käyttäen vain for-silmukoita joissa iteraatioiden määrä pitää kiinnittää ennen silmukan suorituksen alkua. On kuitenkin funktioita joiden laskemiseen tarvitaan yleisempää while-silmukkaa. Esim. voidaan osoittaa että Ackermannin funktio ψ(0, y) = y + 1 ψ(x + 1, 0) = ψ(x, 1) ψ(x + 1, y + 1) = ψ(x, ψ(x + 1, y)) kasvaa nopeammin kuin mikään primitiivirekursiivinen funktio Siis universaaliin laskennan malliin tarvitaan jokin primitiivirekursiota voimakkaampi mekanismi 76
Minimointi: kun on annettu funktio f: N k+1 N, minimointi tuottaa funktion g: N N jolle 1. jos jollain y kaikki arvot f(x, 0),..., f(x, y) ovat määriteltyjä ja f(x, y) = 0, niin g(x) on pienin tällainen y 2. muuten g(x) ei ole määritelty Arvoa y = g(x) voi tietysti etsiä laskemalla järjestyksessä f(x, 0), f(x, 1), f(x, 2), f(x, 3),... ja pysähtymällä kun tulee nolla. Etukäteen ei kuitenkaan ole mitään arviota, kuinka pitkälle joudutaan laskemaan. 77
Osittaisrekursiivisten funktioiden joukko PR on pienin joukko joka sisältää funktiot Z, S ja U n i kaikilla i, n ja on suljettu sijoittamisen, rekursion ja minimoinnin suhteen Rekursiivisia ovat ne osittaisrekursiiviset funktiot jotka ovat totaalisia. Esim. Ackermannin funktio ja kaikki primitiivirekursiiviset funktiot ovat rekursiivisia. Kuten alussa todettiin, voidaan osoittaa (kun A on joukko binäärikoodeja) että A on rekursiivinen kieli jos ja vain jos π A on rekursiivinen funktio A on rekursiivisesti lueteltava jos ja vain jos jollain rekursiiviselle f pätee A = { b(f(x)) x N } lisäksi A on rekursiivisesti lueteltava jos ja vain jos π A on osittaisrekursiivinen, missä π A (x) = 1 jos b(x) A ja π A (x) ei ole määritelty muuten 78
Churchin-Turingin teesi [HMU 8.2.1] Turing esitti oman määritelmänsä matemaattisen logiikan tarpeisiin malliksi siitä, mitä ihminen voi laskea sääntöjä mekaanisesti seuraamalla. Samoihin aikoihin samoihin tarpeisiin esitettiin useita muitakin määritelmiä (Gödel & Kleene; Postin produktiojärjestelmät). Nämä kaikki osoittautuivat Turingin määritelmän kanssa yhtäpitäviksi. Myöhemmin Turingin kone osoittautui hyväksi malliksi myös nykyaikaiselle tietokoneelle. Tästä seuraava askel on Churchin-Turingin teesi: Turingin koneet on oikea malli sille, mitä ylipäänsä on mahdollista laskea mekaanisesti sääntöjä seuraamalla. Teesi ei tietenkään ole matemaattinen väittämä. Sitä voidaan pitää empiirisenä väittämänä, koska se on periaatteessa falsifioitavissa esittämällä laskulaite, joka laskee ei-rekursiivisia funktioita. Tämäkin on tosin hieman ongelmallista, koska käytännössä voidaan tarkastella vain rajoitetun kokoisia syötteitä. Nykyään teesi on varsin laajasti hyväksytty, mutta ideoita Turingin konetta voimakkaammista laskulaitteista esitetään toisinaan. 79