Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Samankaltaiset tiedostot
Pysähtymisongelman ratkeavuus [Sipser luku 4.2]

Lisää pysähtymisaiheisia ongelmia

on rekursiivisesti numeroituva, mutta ei rekursiivinen.

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen.

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Rekursiiviset palautukset [HMU 9.3.1]

Täydentäviä muistiinpanoja laskennan rajoista

Chomskyn hierarkia ja yhteysherkät kieliopit

M = (Q, Σ, Γ, δ, q 0, q acc, q rej )

Säännöllisen kielen tunnistavat Turingin koneet

Kielenä ilmaisten Hilbertin kymmenes ongelma on D = { p p on polynomi, jolla on kokonaislukujuuri }

5.3 Ratkeavia ongelmia

Rajoittamattomat kieliopit (Unrestricted Grammars)

Säännöllisten kielten sulkeumaominaisuudet

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin

Laskennan teoria (kevät 2006) Harjoitus 3, ratkaisuja

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

Satunnaisalgoritmit. Topi Paavilainen. Laskennan teorian opintopiiri HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Äärellisten automaattien ja säännöllisten lausekkeiden minimointi

2. Laskettavuusteoriaa

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

Laskennan teoria

Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja

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

2. Laskettavuusteoriaa

Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja

Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys.

Algoritmin määritelmä [Sipser luku 3.3]

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

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

δ : (Q {q acc, q rej }) (Γ k {, }) Q (Γ k {, }) {L, R}.

Epädeterministisen Turingin koneen N laskentaa syötteellä x on usein hyödyllistä ajatella laskentapuuna

TKT20005 Laskennan mallit (syksy 2018) Kurssikoe, malliratkaisut

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

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

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

(0 1) 010(0 1) Koska kieli on yksinkertainen, muodostetaan sen tunnistava epädeterministinen q 0 q 1 q 2 q3

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

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

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

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

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

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

Ratkeavuus ja efektiivinen numeroituvuus

6.5 Turingin koneiden pysähtymisongelma Lause 6.9 Kieli. H = {c M w M pysähtyy syötteellä w}

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

Yhteydettömän kieliopin jäsennysongelma

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

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

Laskennan teoria

4. Tehtävässä halutaan todistaa seuraava ongelma ratkeamattomaksi:

Turingin koneen laajennuksia

Äärellisten automaattien ja säännöllisten kielten ekvivalenssi

1 Lukujen jaollisuudesta

1 Kertaus. Lineaarinen optimointitehtävä on muotoa:

9.5. Turingin kone. Turingin koneen ohjeet. Turingin kone on järjestetty seitsikko

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

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

Ei-yhteydettömät kielet [Sipser luku 2.3]

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

Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa.

Output. Input Automaton

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

Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }?

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

ongelma A voidaan ratkaista ongelman B avulla, joten jossain mielessä

Algebra I, harjoitus 5,

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Matematiikan tukikurssi

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

Ohjelmoinnin jatkokurssi, kurssikoe

Diofantoksen yhtälön ratkaisut

Ennakkotehtävän ratkaisu

Ominaisvektoreiden lineaarinen riippumattomuus

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

1. Universaaleja laskennan malleja

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 7. joulukuuta 2009

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

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

Muodolliset kieliopit

Automaatit. Muodolliset kielet

Johdatus logiikkaan I Harjoitus 4 Vihjeet

Esimerkki 2.28: Tarkastellaan edellisen sivun ehdot (1) (3) toteuttavaa pinoautomaattia, jossa päätemerkit ovat a, b ja c ja pinoaakkoset d, e ja $:

Rajoittamattomat kieliopit

Cantorin joukon suoristuvuus tasossa

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Matemaattisten työvälineiden täydentäviä muistiinpanoja

Harjoitus 4 (viikko 47)

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

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

Luonnollisten lukujen ja kokonaislukujen määritteleminen

Miten osoitetaan joukot samoiksi?

Salausmenetelmät LUKUTEORIAA JA ALGORITMEJA. Veikko Keränen, Jouko Teeriaho (RAMK, 2006) 3. Kongruenssit. à 3.4 Kongruenssien laskusääntöjä

Jos sekaannuksen vaaraa ei ole, samastamme säännöllisen lausekkeen ja sen esittämän kielen (eli kirjoitamme R vaikka tarkoitammekin L(R)).

Laskennan mallit (syksy 2008) 2. kurssikoe , ratkaisuja

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Matematiikan tukikurssi, kurssikerta 5

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

Harjoitus 2 (viikko 45)

Transkriptio:

Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause, jonka avulla mikä tahansa Turingin kone voi saada käyttöönsä oman kuvauksensa. Lisäksi työssä todistetaan rekursiolauseen avulla muutamia ratkeamattomuustuloksia. Johdanto Rekursiolause on tärkeä matemaattinen tulos tietojenkäsittelytieteessä, ja se liittyy vahvasti mm. itsereplikoitumiseen. Voisi hyvin kuvitella, että kone joka luo toisia koneita on itse monimutkaisempi kuin koneet jotka se luo, koska senhän täytyy sisältää kuvaukset luomistaan koneista. Rekursiolauseen avulla voidaan kuitenkin osoittaa, että mikä tahansa kone pystyy myös replikoimaan itseään, eli se ei välttämättä ole sen monimutkaisempi kuin sen luomat koneet. Yksi konkreettinen rekursiolauseen sovellus on tietokonevirus, ohjelma joka levittää itseään koneesta toiseen ja mahdollisesti tekee tuhoa. Työ seuraa suurilta osin Sipserin kirjan Introduction to the Theory of Computation ([1]) lukua 6.1 (s. 221-228). Itsereplikoituvista ohjelmista, joita englanniksi kutsutaan nimellä quine, löytyy runsaasti esimerkkejä Internetistä ([2], [3]). 1

Itsereplikoituvan ohjelman olemassaolo Itsereplikoituvalla ohjelmalla tarkoitetaan ohjelmaa, joka käynnistyessään tulostaa oman kuvauksensa (eli lähdekoodinsa) ja pysähtyy. Esitämme miten itsereplikoituva ohjelma voidaan luoda Turingin koneen avulla; konstruktiota soveltamalla voimme luoda itsereplikoituvan ohjelman millä tahansa Turingtäydellisellä ohjelmointikielellä. Tavoitteenamme on siis luoda Turingin kone joka tulostaa oman kuvauksensa kun se ajetaan. Kutsutaan tätä konetta nimellä SELF. Ideana on luoda kone SELF kahdesta osasta A ja B, jotka ovat itsekin Turingin koneita. Koneen A tehtävänä on tulostaa koneen B kuvaus ja toisinpäin. Tämän toteuttamiseksi tarvitaan seuraavaa määritelmää ja apulausetta: Määritelmä 1. Olkoon w merkkijono. Turingin kone P w on kone, joka palauttaa jonon w kaikilla syötteillä. Tässä jonon w palauttamisella tarkoitetaan sitä, että koneen pysähtyessä sen nauhalla on jono w. Turingin koneesta P w löytyy siis sisäänohjelmoituna jono w. Seuraava apulause sanoo, että pystymme aina luomaan koneen P w : Apulause 2. Olkoon w mikä tahansa merkkijono. On olemassa Turingin kone Q, joka syötteellä w palauttaa kuvauksen koneesta P w. Todistus. [1, Lemma 6.1] Määritellään Turingin kone Q seuraavasti: Q = Syötteellä w: 1. Luo seuraavanlainen Turingin kone P w : P w = Kaikilla syötteillä: 1. Poista syöte. 2. Tulosta jono w nauhalle ja pysähdy. 2. Palauta jono P w. Saamme nyt helposti rakennettua koneen SELF ensimmäisen osan: määrittelemme A = P B, eli A on kone, joka käynnistyessään tulostaa kuvauksen koneesta B. Koska B on merkkijono, pystymme luomaan koneen P B edeltävän apulauseen avulla. Huomaamme, että koneen A määritelmä riippuu koneesta B, eli koneen A määritelmä ei ole valmis ennen kuin olemme määritelleet koneen B. Täten emme myöskään voi vain määritellä B = P A, sillä tästä seuraisi kehäpäätelmä. 2

Kone B määritelläänkin hieman eri tavalla: B laskee koneen A kuvauksen saamastaan syötteestä. Formaalisti kone B määritellään seuraavasti: B = Syötteellä M, missä M on jokin Turingin kone: 1. Simuloi apulauseen 2 konetta Q syötteellä M. Palautuu kuvaus P M. 2. Yhdistä kuvaukset P M ja M yhdeksi Turingin koneeksi T. 3. Tulosta kuvaus koneesta T nauhalle. Katsotaan mitä tapahtuu, jos koneelle B annetaan syötteeksi sen oma kuvaus B : 1. B simuloi konetta Q syötteellä B. Palautuu kuvaus P B = A! 2. B yhdistää kuvaukset A ja B yhdeksi koneeksi AB. 3. B tulostaa kuvauksen AB. Täten, jos ajamme ensiksi koneen A, tulostaa se jonon B nauhalle. Kun ajamme koneen B, katsoo se nauhaa ja saa sieltä syötteen B, jolloin B tulostaa kuvauksen AB nauhalle kuten yllä nähtiin. Koska muodostamme koneen SELF koneista A = P B ja B, joista A ajetaan ensin, tulee SELF tulostamaan oman kuvauksensa SELF = AB. Esimerkkejä itsereplikoituvista ohjelmista Edellisen kappaleen koneen SELF rakennetta matkimalla voimme luoda itsereplikoituvan ohjelman millä tahansa Turing-täydellisellä ohjelmointikielellä. Voimme myös antaa esimerkkejä itsereplikoituvista ohjelmista suomen kielellä. Tällöin itsereplikoituvalla ohjelmalla tarkoitetaan suomen kielen lausetta, joka ohjeistaa lukijaa kirjoittamaan lukemansa lauseen. Eräs esimerkki on seuraava: Kirjoita tämä lause. Tällaista suoraa itseviittausta ei yleensä ole mahdollista toteuttaa suoraan ohjelmointikielissä. On toki mahdollista tehdä ohjelma joka lukee tiedostosta oman lähdekoodinsa, mutta pystymme myös luomaan itsereplikoituvan ohjelman joka ei tarvitse mitään syötettä. Suomen kielellä kone SELF voidaan toteuttaa seuraavasti: 3

Kirjoita seuraava lause kahdesti, toisen kerran lainausmerkeissä: Kirjoita seuraava lause kahdesti, toisen kerran lainausmerkeissä: Tässä siis konetta B vastaa lause Kirjoita seuraava lause kahdesti, toisen kerran lainausmerkeissä: Kun koneelle B annetaan sen oma kuvaus ajamalla kone A, saadaan aikaiseksi itsereplikoituva kone. Alla on lähdekoodi itsereplikoituvasta Java-ohjelmasta [2]: 1 public class S e l f { 2 public s t a t i c void main ( S t r i n g [ ] a r g s ) { 3 char l = 3 4 ; // Lainausmerkki 4 S t r i n g [ ] k = { // Kooditaulukko 5 p u b l i c c l a s s S e l f {, 6 p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {, 7 char l = 3 4 ; // Lainausmerkki, 8 S t r i n g [ ] k = { // Kooditaulukko, 9, 10 } ;, 11 f o r ( i n t i = 0 ; i < 4 ; i ++) {, 12 System. out. p r i n t l n ( k [ i ] ) ;, 13 }, 14 f o r ( i n t i = 0 ; i < k. l e n g t h ; i ++) {, 15 System. out. p r i n t l n ( k [ 4 ] + l + k [ i ] + l +, ) ;, 16 }, 17 f o r ( i n t i = 5 ; i < k. l e n g t h ; i ++) {, 18 System. out. p r i n t l n ( k [ i ] ) ;, 19 }, 20 }, 21 }, 22 } ; 23 for ( int i = 0 ; i < 4 ; i ++) { 24 System. out. p r i n t l n ( k [ i ] ) ; 25 } 26 for ( int i = 0 ; i < k. l e n g t h ; i ++) { 27 System. out. p r i n t l n ( k [ 4 ] + l + k [ i ] + l +, ) ; 28 } 29 for ( int i = 5 ; i < k. l e n g t h ; i ++) { 30 System. out. p r i n t l n ( k [ i ] ) ; 31 } 32 } 33 } Koko ohjelman lähdekoodi sisältyy rivillä 4 määriteltävään taulukkoon. Taulukon sisällä ei toki neljännen rivin jälkeen sisällytetä taulukkoa uudestaan, sillä koko ohjelman koodihan on jo saatavilla. Riveillä 23-25 tulostetaan ohjelman neljä ensimmäistä riviä. Tämän jälkeen riveillä 26-28 tulostetaan koko lähdekooditaulukko lainausmerkkien sisällä. Lopuksi riveillä 29-31 tulostetaan loput lähdekoodista, eli rivit mitkä sisältävät for-loopit sekä lopun kaarisulut. Sivulta [3] löytyy runsaasti esimerkkejä itsereplikoituvista ohjelmista eri ohjelmointikielillä. 4

Rekursiolause Turingin kone voi rekursiolauseen avulla tehdä omalla kuvauksellaan muutakin kuin tulostaa sen, esimerkiksi käyttää omaa kuvaustaan laskennassa. Formaalisti rekursiolause on seuraava: Lause 3. Olkoon T Turingin kone, joka saa syötteenä kaksi aakkoston Σ merkkijonoa. Tällöin on olemassa Turingin kone R, joka syötteellä w Σ, missä w voi olla mikä tahansa aakkoston merkkijono, tekee samaa kuin kone T syötteellä R, w. Jos siis haluamme luoda koneen joka käyttää omaa kuvaustaan ajon aikana, meidän pitää ainoastaan luoda kone T, joka saa ylimääräisenä syötteenä koneen kuvauksen. Rekursiolause antaa meille tällöin koneen R, johon on sisäänrakennettuna sen oma kuvaus R ja joka toimii kuten T. Todistus. [1, Thm 6.3] Rekursiolauseen todistus muistuttaa hyvin paljon koneen SELF rakennetta. Rakennamme Turingin koneen R kolmessa osassa A, B ja T, ja määrittelemme ensiksi A = P BT. Tätä tarkoitusta varten muutamme apulauseen 2 koneen Q määritelmää siten, että kone P BT kirjoittaa jonon BT saamansa syötteen perään. Kun A on ajettu, nauhalla on siis jono w BT, missä w on koneen R saama syöte. Kone B määritellään jälleen koneeksi, joka simuloi konetta Q saamallaan syötteellä. Kone Q palauttaa tällöin jonon P BT = A. Tämän jälkeen B yhdistää koneet A, B ja T yhdeksi koneeksi ABT = R, ja lopuksi B yhdistää koneen R ja jonon w jonoksi R, w ja pysähtyy. Täten kun kone T käynnistyy, saa se syötteen R, w. Voimme nyt luoda koneen SELF rekursiolauseen avulla määrittelemällä seuraavanlainen kone T : T = Syötteellä M, w : 1. Tulosta kuvaus M ja pysähdy. Tällöin rekursiolauseen nojalla löytyy kone R, joka toimii syötteellä w kuten T toimii syötteellä R, w, eli saamme seuraavanlaisen koneen: R = Syötteellä w: 1. Tulosta kuvaus R ja pysähdy. Kone R siis tulostaa oman kuvauksensa. 5

Rekursiolauseen sovelluksia Rekursiolausetta käyttämällä voimme missä tahansa kohtaa Turingin koneen kuvauksessa hankkia koneen oman kuvauksen ja laskea sillä, koska pystymme aina muodostamaan rekursiolauseen vaatiman koneen T joka saa kuvauksen syötteenä. Tällä tavalla voimme todistaa tiettyjä ratkeamattomuustuloksia hyvin helposti. Palautetaan mieleen että hyväksymisongelmassa kysytään, onko olemassa Turingin konetta H, joka pystyy syötteellä M, w sanomaan hyväksyykö vai hylkääkö Turingin kone M syötteen w. Hyväksymisongelman ratkeamattomuus todistetaan yleensä diagonaalimetodilla, mutta esitämme nyt toisenlaisen todistuksen rekursiolausetta käyttämällä. Lause 4. Hyväksymisongelma on ratkeamaton. Todistus. [1, Thm 6.5] Tehdään vastaoletus, eli oletetaan, että Turingin kone H ratkaisee hyväksymisongelman. Muodostetaan seuraavanlainen kone B: B = Syötteellä w: 1. Hanki rekursiolauseen avulla oma kuvaus B. 2. Simuloi konetta H syötteellä B, w. 3. Jos H hyväksyy, hylkää. Jos H hylkää, hyväksy. Nyt kone B tekee millä tahansa syötteellä w päinvastaista kuin mitä H väittää sen tekevän, eli H ei ratkaise hyväksymisongelmaa. Voimme siis ikäänkuin huijata konetta H vastaamaan väärin, sillä pääsemme käsiksi koneen B kuvaukseen sen ajon aikana. Esitetään selvennykseksi vielä rekursiolauseen vaatima kone T, johon lauseen 4 todistus pohjautuu: T = Syötteellä M, w : 1. Simuloi konetta H syötteellä M, w. 2. Jos H hyväksyy, hylkää. Jos H hylkää, hyväksy. Käsittelin kurssin toisessa työssäni Kolmogorov-kompleksiteettia. Jonon n Kolmogorov-kompleksiteetti määriteltiin jonon lyhimmän kuvauksen pituudeksi, missä jonon n lyhin kuvaus on lyhin merkkijono M, w jolle pätee, että Turingin kone M palauttaa jonon n syötteellä w. Työssä esitin erään todistuksen sille, että Kolmogorov-kompleksiteettia ei voida yleisesti laskea. Rekursiolauseen avulla saamme tälle lyhyemmän todistuksen: 6

Lause 5. Mikään algoritmi ei pysty laskemaan Kolmogorov-kompleksiteettia kaikille merkkijonoille. Todistus. Tehdään vastaoletus, eli oletetaan että kone K osaa laskea kaikkien jonojen Kolmogorov-kompleksiteetin. Muodostetaan seuraavanlainen Turingin kone N: N = Kaikilla syötteillä: 1. Hanki rekursiolauseen avulla oma kuvaus N. 2. Käy läpi jonoja lyhimmästä alkaen kunnes löytyy jono w jolle pätee että K(w) > N. 3. Palauta jono w. Kaikenpituisia tiivistymättömiä jonoja on olemassa [1, Thm 6.29], joten kone N löytää varmasti jonon w, jolle pätee K(w) > N. Jos annamme koneelle N tyhjän syötteen, palauttaa se jonkin jonon w, eli jono N on eräs jonon w kuvaus. Tämä on ristiriita, sillä jonon w lyhimmän kuvauksen pituudelle K(w) pätee K(w) > N. Viitteet [1] Sipser, M. Introduction to the Theory of Computation, second edition. Thomson, 2006. [2] http://en.wikipedia.org/wiki/quine_%28computing%29#examples Viitattu 22.02.2014 [3] http://www.nyx.net/~gthompso/quine.htm Viitattu 23.02.2014 7