2. Laskettavuusteoriaa Kaymme lapi ratkeamattomuuteen liittyvia ja perustuloksia ja -tekniikoita [HMU luku 9]. Taman luvun jalkeen opiskelija tuntee joukon keskeisia ratkeamattomuustuloksia osaa esittaa tyypillisia Turingin koneisiin liittyvia ongelmia formaalisti ja tarkastella niiden ratkeavuutta tunnettujen tulosten valosssa osaa yhdistaa kaytannon algoritmiongelmia tunnettuihin formaaleihin ratkeamattomuustuloksiin osaa tehda yksinkertaisia ratkeamattomuustodistuksia 82
Palautetaan mieliin terminologiaa: Kieli L koneella M. on rekursiivisesti lueteltava jos A = L(M) jollain Turingin Turingin kone on totaalinen jos se pysahtyy kaikilla syotteilla. (Joissain lahteissa kaytetaan termia "algoritmi" spesisti tallaisista koneista.) Kieli L koneella M. on rekursiivinen jos A = L(M) jollain totaalisella Turingin Vastaavasti Paatosongelma :! f 0; 1 g on osittain ratkeava jos vastaava kieli A = f x 2 j (x) = 1 g on rekursiivisesti lueteltava. Paatosongelma on ratkeava jos A on rekursiivinen. 83
Termien selityksia "rekursiivinen" tulee siita etta tama kieliluokka historiallisesti vakiintui Kleenen ja Godelin rekursiokonstruktion kautta "lueteltava" tulee siita etta A on rekursiivisesti lueteltava jos ja vain jos on olemassa "algoritmi" joka "luettelee" joukon A alkiot (ja vain ne) { jos x 2 A niin x esiintyy luettelossa jonkin aarellisen ajan kuluttua ja asia on selva { jos x 62 A niin x ei tule koskaan esiintymaan luettelossa, mutta tatahan ei voi tietaa pelkastaan katsomalla jotain luettelon aarellista alkuosaa Luetteloimisidea esitetaan myohemmin yksityiskohtaisemmin. Huom. kaikista laskennallisista ongelmista vain haviavan pieni osa on edes osittain ratkeavia, mutta tietojenkasittelytieteessa tietysti yleensa keskitytaan ratkeaviin ongelmiin. 84
Churchin-Turingin teesin mukaan ratkeavuus tarkoittaa samaa, kuin etta ongelma voidaan ratkaista jollain algoritmisella menettelylla. Esitamme jatkossa joukon Turingin koneita koskevia eksakteja matemaattisia tuloksia, mutta jos uskomme C-T:n teesin, nailla on siis yleisempia seurauksia. C-T:n teesi oikeastaan motivoi koko taman tutkimusohjelman, koska muuten Turingin koneet eivat valttamatta olisi kovin kiinnostava tutkimuskohde. (Tosin voidaan kumminkin argumentoida, etta Turingin kone on oikea malli sille mita ihminen voi mekaanisesti laskea, ja mita nykyiset tietokoneet voivat laskea.) Joka tapauksessa on kuitenkin selvaa, etta jos ongelma osataan ratkaista esim. Java-kielella, se voidaan ratkaista myos Turingin koneella (vrt. RAM-malli luvussa 1). Samoin joka tapauksessa jonkin ongelman ratkeamattomuuden osoittaminen on aina ei-triviaalia, koska pitaa osoittaa etta mikaan Turingin kone ei ratkaise sita. 85
Formaalin logiikan todistuvuusongelma (Motivoiva esimerkki yleisella tasolla; yksityiskohdat ks. esim. Matemaattinen logiikka) Annettu: ensimmaisen kertaluvun predikaattilogiikan kaava Kysymys: onko kaavalle olemassa todistus predikaattilogiikan aksioomista Voidaan "helposti" luetella kaikki logiikan aakkoston merkkijonot esim. leksikograsessa jarjestyksessa ja tarkistaa, sattuuko kyseinen merkkijono olemaan todistus jollekin kaavalle. Jos kaavalle ylipaansa on olemassa todistus, se loytyy jossain aarellisessa ajassa talla menettelylla. Siis todistuksen omaavien kaavojen joukko on rekursiivisesti lueteltava, ja todistuvuusongelma osittain ratkeava. Kuitenkin osoittautuu, etta todistuvuusongelma ei ole ratkeava. Emme siis voi taysin kiertaa sita ongelmaa, etta edella hahmoteltu ratkaisu ei pysahdy, jos kaavalla ei ole todistusta. 86
Pysahtymisongelma (johdanto) [HMU 9.1] Intuitiivisesti on kysymys seuraavasta ongelmasta: Annettu: Turingin kone M, merkkijono x Kysymys: pysahtyyko kone M syotteella x Tavoitteena on osoittaa tama ongelma ratkeamattomaksi. Ensimmainen osatavoite, puhtaasti tekninen ja kasitteellisesti yksinkertainen, on esittaa Turingin koneet merkkijonoina. Muutenhan niista ei olisi formaalisti mielekasta edes puhua algoritmin syotteena tms. Esitamme siis seuraavaksi yksinkertaisen koodauksen, joka liittaa jokaiseen Turingin koneeseen M = (Q; : : : ; F) merkkijonon w 2 f 0; 1 g ja kaantaen. 87
Turingin koneiden koodaus Rajoittaudutaan yksinauhaisiin koneisiin ja syoteaakkostoon = f 0; 1 g. Lisaksi oletetaan etta hyvaksyvia tiloja on tasan yksi ja se ei ole alkutila. Numeroidaan aakkoston f 0; 1 g merkkijonot siten, etta merkkijonon w numero on 1w binaariluvuksi tulkittuna. Olkoon w i merkkijono numero i; siis w 1 = ", w 2 = 0, w 3 = 1, w 4 = 00, w 5 = 01 jne. Oletetaan nyt M = (Q; f 0; 1 g ; ; ; q 1 ; #; F ) missa jqj = k, Q = f q 1 ; : : : ; q k g ja F = f q 2 g j j = m 3, = f X 1 ; : : : ; X m g, X 1 = 0, X 2 = 1, X 3 = # suunnat on numeroitu L = D 1 ja R = D 2 88
Nyt kaikki muu paitsi on numeroitu. koodataan yksittainen siirtyma (q i ; X j ) = (q k ; X l ; D m ) jonoksi 0 i 10 j 10 k 10 l 10 m huom. i; j; k; l; m 1 joten tassa ei koskaan tule kahta ykkosta perakkain merkkijono C 1 11C 2 11 : : : C n 1 11C n on koodi koneelle jossa on n siirtymaa joiden koodit ovat C 1 ; : : : ; C n Huomaa etta samalla koneella on tyypillisesti useita eri koodeja yksi merkkijono ei kuitenkaan voi koodata useita eri koneita jotkin merkkijonot eivat ole minkaan koneen koodeja 89
Olkoon M triv jokin kiintea Turingin kone joka hylkaa kaikki syotteet. Maaritellaan kaikille w 2 f 0; 1 g Turingin kone M w seuraavasti: jos w on jonkin koneen M koodi, niin M w on tama M muuten M w = M triv Aputuloksena pysahtymisongelman ratkeamattomuustodistuksessa osoitetaan, etta "diagonaalikieli" ei ole edes rekursiivisesti lueteltava. L d = f w 2 f 0; 1 g j w 62 L(M w ) g Kieli L d on hieman keinotekoinen. Sen merkitys on lahinna, etta sen avulla voidaan osoittaa muita kiinnostavampia ongelmia ratkeamattomaksi. 90
Analogia: Koodit ja ohjelmointikielet Eras mahdollinen analogia on seuraava: Tulkitaan, etta ohjelma hyvaksyy syotteen, jos sen suoritus paattyy normaalisti, ja hylkaa jos suoritus paattyy virheeseen. Lisaksi ohjelma voi jaada silmukkaan. Nyt Turingin kone M konekieliohjelma merkkijono w 2 f 0; 1 g ASCII-merkkijono (esim. C-ohjelma) M w ohjelma w kaannettyna M triv konekieliohjelma joka aina jakaa nollalla Lisaksi sovimme, etta M w = M triv C-ohjelma. jos w ei ole syntaktisesti korrekti Nyt C-ohjelma kuuluu joukkoon L d, jos se ei pysahdy normaalisti, kun (se kaannetaan ja) siille annetaan syotteena oma lahdekoodinsa. Huom. C-kieli ja konekieli ovat yhta "laskentavoimaisia", joten analogia voitaisiin ajatella toisinkin pain: konekieliohjelmasta voidaan kaantaa C-ohjelma. 91
Lause 2.1: [HMU Thm. 9.2] Kieli ei ole rekursiivisesti lueteltava. L d = f w 2 f 0; 1 g j w 62 L(M w ) g Todistus: Tehdaan vastaoletus etta L d = L(M) jollain M. Olkoon w jokin koneen M koodi; siis L d = L(M w ). Nyt w 2 L d, w 62 L(M w ), w 62 L d missa on ensin kaytetty kielen L d maaritelmaa ja sitten koodin w valintaperustetta; ristiriita. Nyt olemme saaneet ensimmaisen konkreettisen ratkeamattomuustuloksen. Jatkossa osoitamme suurelle joukolle ongelmia X, etta jos X osattaisiin ratkaista, niin L d voitaisiin tunnistaa. Tasta seuraa ongelman X ratkeamattomuus yo. lauseen nojalla. 92
Huomaa, etta edellisessa todistuksessa ei viela puhuttu mitaan Turingin koneista. Se on vain esimerkki yleisesta diagonalisoinnista: Jos A 1 ; A 2 ; : : : on mika tahansa jono kielia, voidaan muodostaa kieli B, missa Talloin B 62 f A 1 ; A 2 ; : : : g. w i 2 B jos ja vain jos w i 62 A i : Jatkossa tulee tarkeaksi, etta olemme valinneet nimenomaan A i = L(M wi), jolloin siis B = L d. Karkeasti ottaen tasta valinnasta seuraa, etta jos osaisimme algoritmisesti vastata kysymykseen pateeko x 2 L(M w ) mielivaltaisilla x ja w, osaisimme myos vastata kysymykseen pateeko x 2 L d, joka on (negaatiota vaille) edellisen kysymyksen erikoistapaus x = w. Edellisen lauseen perusteella tama on kuitenkin mahdotonta. 93
Rekursiivisuuden perusominaisuuksia [HMU 9.2.1-9.2.2] Ennen kuin ruvetaan tarkastelemaan varsinaisen pysahtymisongelman ratkeamattomuutta, on hyodyllista tarkastella rekursiivisten kielten luokan joitain perusominaisuuksia. Oletetaan jatkossa etta Turingin koneissa on tasan yksi hyvaksyva tila, ja tasta ei mitaan siirtymia tasan yksi sellainen ei-hyvaksyva tila, josta ei ole mitaan siirtymia (hylkaava lopputila) muuten kaikki siirtymat maariteltyja On helppo muuntaa mika tahansa Turingin kone tallaiseen muotoon. 94
Lause 2.2: Olkoot A; B rekursiivisia. Nyt myos A = A, A [ B ja A \ B ovat rekursiivisia. Todistus: Olkoon A = L(M A ) ja B = L(M B ) missa M A ja M B totaalisia. ovat Esitetaan Turingin koneet kaavamaisesti: alkutila hyvaksyva M hylkaava 95
Kielen A hyvaksyva kone saadaan vaihtamalla koneen M A hyvaksyva ja hylkaava lopputila keskenaan Kielen A [ B hyvaksymiseksi simuloidaan ensin konetta M A. { jos M A hyvaksyy, niin hyvaksytaan { jos M A hylkaa, niin simuloidaan konetta M B, jonka ratkaisu jaa voimaan (kuva seuraavalla sivulla) Tapaus A \ B seuraa koska A \ B = A [ B 96
MA MB Kielen A [ B tunnistaminen koneiden M A ja M B avulla 97
Lause 2.3: Olkoot A; B rekursiivisesti lueteltavia. Nyt myos A [ B ja A \ B ovat rekursiivisesti lueteltavia. Todistus: Harjoitustehtava. Sen sijaan yleisesti ei pade etta rekursiivisesti lueteltavan kielen A komplementti A olisi rekursiivisesti lueteltava. Sen sijaan patee Lause 2.4: Kieli A on rekursiivinen jos ja vain jos seka A etta A ovat rekursiivisesti lueteltavia. 98
Todistus: Jos A rekursiivinen, niin A on rekursiivinen, joten suunta vasemmalta oikealle on selva. Olkoot toisaalta M A ja M A koneet jotka tunnistavat kielet A ja A. Muodostetaan kaksinauhainen kone M, joka on totaalinen ja tunnistaa kielen A. Kone M simuloi konetta M A kayttaen ykkosnauhaansa ja konetta M A kayttaen kakkosnauhaansa. Simulaatiot suoritetaan lomittain, aina yksi askel kerrallaan kumpaakin. Jos simuloitava M A hyvaksyy, M hyvaksyy. Jos simuloitava M A hyvaksyy, M hylkaa. Koska jokaisella x joko x 2 L(M A ) tai x 2 L(M A ), aina tasan yksi simulaatioista hyvaksyy. (kuva seuraavalla sivulla) 99
MA M A Kielen A tunnistaminen totaalisella koneella jos A ja A ovat rekursiivisesti lueteltavia 100
Formalistisemmin tulos voidaan esittaa seuraavasti: Olkoon RE rekursiivisesti lueteltavien kielten joukko: RE = f L(M) j M mielivaltainen Turingin koneg : Olkoon co-re rekursiivisesti lueteltavien kielten komplemettien joukko: co-re = A j A 2 RE : Olkoon REC rekursiivisten kielten joukko: Edella esitetyn mukaan REC = f L(M) j M totaalinen g : REC = RE \ co-re: 101
Huomaa yhteys "rekursiivisen luettelemisen" ajatukseen: Oletetaan, etta jokin "algoritmi" M A osaa luetella kielen A; samoin M A kielelle A. Kun halutaan tietaa pateeko x 2 A, listataan rinnakkain joukkoja A ja A. Koska joko x 2 A tai x 2 A, niin jonkin aarellisen ajan kuluttua x esiintyy jommassa kummassa listassa ja vastaus tiedetaan. Myos A-lista tarvitaan, jotta voidaan taata pysahtyminen myos kielteisessa tapauksessa. 102
Universaalikieli [HMU 9.2.3-9.2.4] Seuraava askel kohti pysahtymisongelman ratkeamattomuutta on universaalikieli L u joka on muutenkin hyvin tarkea: Huom. L u = f w111x 2 f 0; 1 g j x 2 L(M w ) g : mikaan Turingin koneen koodi ei sisalla merkkijonoa 111 siis merkkijono z 2 f 0; 1 g voidaan esittaa korkeintaan yhdella tavalla muodossa z = w111x siten, etta w on validi Turingin koneen koodi jos w ei ole validi koodi, edella sovitun mukaan x 62 L(M w ) kaikilla x Osoitamme nyt etta universaalikieli on rekursiivisesti lueteltava, mutta ei rekursiivinen. Kielen L u tunnistavaa Turingin konetta U sanotaan universaaliksi Turingin koneeksi. (Universaalikone ei tietenkaan ole yksikasitteinen.) 103
Lause 2.5: [HMU Thm. 9.6(a)] Universaalikieli L u on rekursiivisesti lueteltava. Todistus: Muodostetaan nelinauhainen U jolle L u = L(U). Nauhojen kaytto syotteella z = w111x missa w on koneen M koodi: Nauha 1 sisaltaa syotteen z ja siis erityisesti koneen M siirtymafunktion koodin w Nauha 2 simuloi koneen M nauhan sisaltoa kayttaen samaa koodausta kuin siirtymafunktiossa; siis esim. patkaa : : : X 3 X 1 X 4 : : : esittaisi : : : 100010100001 : : : Nauha 3 simuloi koneen M tilaa; tila q i koodataan 0 i Nauha 4 on tyotilaa 104
Koneen U laskenta: Aluksi tarkista, onko syote muotoa w111x jollain validilla koodilla w. Jos ei ole, niin hylkaa. Muuten rupea simuloimaan konetta M = M w syotteella x. Kussakin askelessa 1. Olkoon nauhalla 3 jono : : : #0 i # : : : ja nauhalla 2 nauhapaasta alkaen jono 0 j 1. 2. Etsi koneen M kuvauksesta nauhalla 1 kohta : : : 110 i 10 j 1 : : :; jos ei loydy, niin hylkaa. 3. Olkoon nauhalta 1 loytynyt jono : : : 110 i 10 j 10 k 10 l 10 m 11 : : :. 4. Vaihda nauhan 3 sisalloksi 0 k ja nauhalle 2 nauhapaasta alkaen 0 l ; siirra nauhan 2 loppuosuutta tarpeen mukaan. 5. Siirra nauhan 2 nauhapaa seuraavaan ykkoseen vasemmalla (jos m = 1) tai oikealla (jos m = 2). 6. Jos q k on hyvaksyva tila (siis k = 2), hyvaksy. 105
Lause 2.6: [HMU Thm. 9.6(b)] Universaalikieli L u ei ole rekursiivinen. Seuraavalla kalvolla on varsinainen todistus, jossa kaytetaan tasmallisemmin Turingin kone -formalismia. Todistuksen idea on seuraava: Tehdaan vastaoletus, etta kieli L u = f w111x j x 2 L(M w ) g voidaan tunnistaa totaalisella Turingin koneella. Tama tarkoittaa, etta on olemassa kaikilla syotteilla x ja w pysahtyva proseduuri p(w; x), joka palauttaa tosi joss x 2 L(M w ). Nyt seuraava proseduuri q(w) palauttaa tosi joss w 2 L d (eli w 62 L(M w )): q(w): jos p(w; w) niin palauta epatosi muuten palauta tosi Tama on ristiriita, koska L d ei ole rekursiivinen (eika edes rekursiivisesti lueteltava). 106
Todistus: Tehdaan vastaoletus etta L u = L(M) jollain totaalisella M. Muodostetaan totaalinen M 0 jolle L(M 0 ) = L d, missa L d on aiemmin ei-rekursiiviseksi osoitettu diagonaalikieli; ristiriita. Kone M 0 toimii syotteella w seuraavasti: 1. Jos w ei ole validi koodi, hyvaksy. 2. Muuten muunna nauhan sisalloksi w111w. 3. Simuloi koneen M laskentaa; oletuksen mukaan tama johtaa joko hylkaavaan tai hyvaksyvaan lopputilaan. 4. Jos M hyvaksyy, niin hylkaa; jos M hylkaa, niin hyvaksy. Nyt w 2 L(M 0 ), (w ei validi koodi tai w111w 62 L u ), w 62 L(M w ), w 2 L d : 107
Pysahtymisongelma Voimme nyt formuloida pysahtymisongelman kieleksi H = f w111x 2 f 0; 1 g j w validi koodi ja M w pysahtyy syotteella x g : Lause 2.7: Kieli H on rekursiivisesti lueteltava. Todistus: Universaalikoneen U konstruktiota on helppo muuttaa siten etta se hyvaksyy jos ja vain jos simuloitavan koneen laskenta pysahtyy. Lause 2.8: Kieli H ei ole rekursiivinen. Todistus: Tehdaan vastaoletus etta H = L(M) jollain totaalilla M. Tasta saadaan helposti sellainen totaali M 0, etta L(M 0 ) = H ja hyvaksyessaan syotteen x kone M 0 jattaa laskennan lopuksi nauhalle alkuperaisen syotteen tyhjamerkkien ymparoimana. 108
Tasta saadaan totaalinen kone M 00 seuraavasti: joka tunnistaa universaalikielen L u 1. Tarkista etta syote on muotoa w111x missa w on validi koodi; jos ei ole, niin hylkaa. 2. Simuloi sitten konetta M 0 ; jos hylkasi niin hylkaa. 3. Jos M 0 hyvaksyi, kasittele sama syote universaalikoneella U, jonka hyvaksyminen tai hylkaaminen jaa voimaan. Universaalikoneen konstruktiosta nahdaan, etta U pysahtyy syotteella w111x jos ja vain jos M w pysahtyy syotteella x. Siis M 00 on totaali ja tunnistaa saman kielen kuin U; ristiriita 109
Seuraava ongelma on oleellisesti pysahtymisongelman komplementti eika siis edes osittain ratkeava. Lause 2.9: "Pysahtymattomyysongelma" e H missa eh = f w111x j w validi koodi, M w ei pysahdy syotteella x g ei ole rekursiivisesti lueteltava. Todistus: Pysahtymisongelman komplementti H voidaan esittaa muodossa H = e H [ E missa E = f z 2 f 0; 1 g n j z ei ole w111x millaan validilla koodilla w g : Selvasti E on rekursiivinen Siis jos e H olisi rekursiivisesti lueteltava, myos H = e H [ E olisi (Lause 2.3). Kieli H on rekursiivisesti lueteltava, joten jos H myos olisi, niin H olisi rekursiivinen (Lause 2.4); ristiriita. Siis e H ei voi olle rekursiivisesti lueteltava 110
Ohjelmointikielen pysahtymisongelma Turingin koneet ovat analogisia jollain ohjelmointikielella kirjoitettujen ohjelmien kanssa: Turingin kone -formalismi jonkin ohjelmointikieli Turingin kone talla kielella kirjoitettu ohjelma Turingin koneen koodi ohjelma kaannettyna konekielelle universaali Turingin kone konekielen tulkki joitain ohjelmointikielten ratkeamattomuustuloksia voidaan katevasti osoittaa suoraan (kuten johdannossa C-kielen pysahtymisongelma) voidaan myos kayttaa hyvaksi Turingin koneiden ja minka tahansa yleisohjelmointikielen samaa ilmaisuvoimaa ja siirtaa tulokset Turingin koneista ohjelmointikieliin "sama ilmaisuvoima" tarkoittaa tassa, etta mika tahansa ongelma voida ratkaista Turingin koneella jos ja vain jos se voidaan ratkaista kyseisella ohjelmointikielella 111
Esimerkki 2.10: C-kielen pysahtymisongelma Rajoitutaan tarkastelemaan C-kielen funktioita jotka saavat parametrina yhden merkkijonon ja palauttavat 0 tai 1 tai jaavat silmukkaan. Sanotaan etta tallainen funktio f hyvaksyy merkkijonon x jos f(x) palauttaa 1, ja on totaalinen jos f(x) pysahtyy kaikilla x. Ollaan valmiit uskomaan, etta kieli A voidaan tunnistaa (totaalisella) Turingin koneella jos ja vain jos se voidaan tunnistaa tallaisella (totaalisella) C-funktiolla. Taman uskomuksen tarkka perusteleminen vaatisi tietysti C-kielen semantiikan tarkkaa lapikaymista, mutta intuitiivisesti se on "selvasti" totta (vrt. RAM-malli). Halutaan osoittaa Turingin koneiden pysahtymisongelmalle analoginen tulos: mikaan totaalinen C-funktio ei tunnista kielta H C = f w x j w on C-funktio joka syotteella x pysahtyy g 112
Argumentti menee paapiirtessaan seuraavasti: koska C on yhta ilmaisuvoimainen kuin Turingin koneet, voidaan Turingin koneiden universaalikieli L u tunnistaa jollain (ei-totaalisella) C-funktiolla univt siis kysymykset Turingin koneen M w toiminnasta syotteella x palautuvat kysymyksiksi C-funktion univt toiminnasta syotteella w111x. erityisesti jos jokin C-funktio halts ratkaisisi C-funktioiden pysahtymisongelman, niin tata kautta se ratkaisisi myos Turingin koneiden pysahtymisongelman koska toisaalta Turingin koneet ovat yhta ilmaisuvoimaisia kuin C-funktiot, funktiota halts voitaisiin simuloida Turingin koneella nain saataisiin ratkaistuksi Turingin koneiden pysahtymisongelma; ristiriita 113
Esitetaan sama hieman yksityiskohtaisemmin. Vastaoletus siis on, etta jokin totaalinen C-funktio haltsc ratkaisee C-kielen pysahtymisongelman. "Tunnetusti" on olemassa C-funktio f u joka simuloi universaalia Turingin konetta U. Siis erityisesti f u syotteella w111x pysahtyy, jos ja vain jos M w syotteella x pysahtyy. Olkoon haltst C-funktio, joka syotteella z tekee kutsun haltsc(p*z) missa p on funktion f u teksti (joka siis on jokin merkkijonovakio). Tama on helppo konstruoida, kun haltsc oletetaan annetuksi. Siis haltst on totaalinen, ja funktiota haltsc koskevan oletuksen mukaan haltst(w111x) = 1, haltsc(p w111x) = 1, f u (w111x) pysahtyy, w111x 2 H: Toisaalta on selvasti olemassa totaalinen Turingin kone M H C-funktiota haltst. Siis M H ratkaisee Turingin koneiden pysahtymisongelman; ristiriita. joka simuloi 114