581336 Laskennan teoria (kevät 2006) Harjoitus 3, ratkaisuja 1. S! axc X! axc X! by c Y! by c Y! " 2. (a) Tehtävänä on konstruoida rajoittamaton kielioppi, joka tuottaa kielen f0 n 1 n jn 1g. Vaihe1: alkutilanteen tuottaminen Vaiheessa 1 tuotetaan lähtösymbolista muotoa x[q 0 x] oleva merkkijono, missä x 2 f0; 1g. Vaiheen 1 toteuttava kielioppi: S! T [q 0 ] T! T! 0T A T! 1T B A[q 0! [q 0 A A0! 0A A1! 1A A]! 0] B[q 0! [q 0 B B0! 0B B1! 1B B]! 1] Vaihe2: siirtymien simulointi Vaiheessa 2 simuloidaan turingin koneen toimintaa vaiheessa 1 generoidulla syötteellä. Jokaista Turingin koneen siirtymää kohti tulee yksi tai useampia kieliopin produktioita.
Siirtymä vastaava(t) produktio(t) (q 0 ; 0) = (q 1 ; X; R) q 0 0! Xq 1 (q 0 ; Y ) = (q 3 ; Y; R) q 0 Y! Y q 3 (q 1 ; 0) = (q 1 ; 0; R) q 1 0! 0q 1 (q 1 ; Y ) = (q 1 ; Y; R) q 1 Y! Y q 1 (q 1 ; 1) = (q 2 ; Y; L) 0q 1 1! q 2 0Y 1q 1 1! q 2 1Y Xq 1 1! q 2 XY Y q 1 1! q 2 Y Y [q 1 1! [q 2 #Y (q 2 ; Y ) = (q 2 ; Y; L) 0q 2 Y! q 2 0Y 1q 2 Y! q 2 1Y Xq 2 Y! q 2 XY Y q 2 Y! q 2 Y Y [q 2 Y! [q 2 #Y (q 2 ; 0) = (q 2 ; 0; L) 0q 2 0! q 2 00 1q 2 0! q 2 10 Xq 2 0! q 2 X0 Y q 2 0! q 2 Y 0 [q 2 0! [q 2 #0 (q 2 ; X) = (q 0 ; X; R) q 2 X! Xq 0 (q 3 ; Y ) = (q 3 ; Y; R) q 3 Y! Y q 3 (q 3 ; #) = (q 4 ; #; R) q 3 ]! #q 4 ] Vaihe3: lopputilanteen siistiminen Vaiheessa 3 "siistitään"pois Turingin koneen tilannetta kuvaava osa. Jäljelle jää "arvattu"merkkijono x. Siistimisvaihe käynnistyy vain, jos simulointi on hyväksyvässä lopputilassa. q 4! X 0 Y 0 #X 0! X 0 XX 0! X 0 Y X 0! X 0 0X 0! X 0 1X 0! X 0 [X 0! Y 0 #! Y 0 Y 0 X! Y 0 Y 0 Y! Y 0 Y 0 0! Y 0 Y 0 1! Y 0 Y 0 ]! 2
(b) Johto Merkkijonolle "01": (vaihe 1) S T [q 0 ] 0T A[q 0 ] 01T BA[q 0 ] 01BA[q 0 ] 01B[q 0 A] 01[q 0 BA] 01[q 0 B0] 01[q 0 0B] 01[q 0 01] (vaihe 2) 01[Xq 1 1] 01[q 2 XY ] 01[Xq 0 Y ] 01[XY q 3 ] 01[XY #q 4 ] (vaihe 3) 01[XY #X 0 Y 0 ] 01[XY X 0 Y 0 ] 01[XX 0 Y 0 ] 01[X 0 Y 0 ] 01Y 0 ] 01 3. (a) Merkkijono w 21 saadaan muodostamalla luvun 21 binääriesitys 10101 ja poistamalla siitä ensimmäinen ykkönen. Merkkijono on siis 0101. (b) Muodostetaan koodi kielen f0 n 1 n j n 1g tunnistavalle koneelle M = (fq 0 ; q 1 ; q 2 ; q 3 ; q 4 g; f0; 1g; f0; 1; X; Y; #g; ; q 0 ; #; fq 4 g): Koneen esitys ei ole vaaditun kaltainen, sillä tyhjä merkki # on aakkoston viimeinen merkki (pitäisi olla kolmas), tilojen numerointi alkaa nollasta (pitäisi alkaa yhdestä) ja hyväksyvä lopputila on q 4 (pitäisi olla q 2 ). Huomioidaan nämä seikat suoraan koodauksen yhteydessä. Tiloille, merkeille ja nauhapään siirroille saadaan seuraavat koodit: q 0 7! 0 q 1 7! 000 q 2 7! 0000 q 3 7! 00000 q 4 7! 00 0 7! 0 1 7! 00 X 7! 0000 Y 7! 00000 # 7! 000 L 7! 0 R 7! 00 3
Sen jälkeen koodataan siirtymät: (q 0 ; 0) = (q 1 ; X; R) 7! 010100010000100 (q 0 ; Y ) = (q 3 ; Y; R) 7! 0100000100000100000100 (q 1 ; 0) = (q 1 ; 0; R) 7! 00010100010100 (q 1 ; 1) = (q 2 ; Y; L) 7! 0001001000010000010 (q 1 ; Y ) = (q 1 ; Y; R) 7! 0001000001000100000100 (q 2 ; 0) = (q 2 ; 0; L) 7! 000010100001010 (q 2 ; X) = (q 0 ; X; R) 7! 0000100001010000100 (q 2 ; Y ) = (q 2 ; Y; L) 7! 00001000001000010000010 (q 3 ; Y ) = (q 3 ; Y; R) 7! 00000100000100000100000100 (q 3 ; #) = (q 4 ; #; R) 7! 0000010001001000100 Koneelle M saadaan koodi luettelemalla siirtymien koodit mielivaltaisessa järjestyksessä merkkijonoilla 11 eroteltuina. Yksi mahdollinen koodi on esimerkiksi 010100010000100110100000100000100000100110001010001010011000100 100001000001011000100000100010000010011000010100001010110000100 001010000100110000100000100001000001011000001000001000001000001 00110000010001001000100 4. Jos v; w 2, niin merkitään v < w jos merkkijono v on leksikograsessa järjestyksessä ennen merkkijonoa w. Olkoon w i aakkoston leksikograsessa järjestyksessä i:s merkkijono, toisin sanoen = f w 1 ; w 2 ; : : : g missä w 1 < w 2 < : : :. (a) Oletuksen mukaan siis A = f f (w 1 ); f(w 2 ); : : : g ja f on laskettava. Tarkastellaan seuraavaa algoritmia, joka saa syötteenä merkkijonon x 2 : 1. i := 1; 2. jos f (w i ) = x niin hyväksy; 3. i := i + 1 4. palaa kohtaan 2. Jos x 2 A, niin oletuksen mukaan x = f (w i ) jollain i, jolloin algoritmi hyväksyy. Muuten x 6= f (w i ) kaikilla i, ja algoritmi jää ikuiseen silmukkaan. Algoritmi voidaan toteuttaa esim. kolmenauhaisella Turingin koneella seuraavasti: Nauha 1 sisältää syötteen x. Nauha 2 on työnauha. Nauha 3 sisältää käsittelyvuorossa olevan merkkijonon w i. Olkoon M f funktion f laskeva yksinauhainen Turingin kone, joka siis oletuksen mukaan on totaalinen. Kielen A tunnistavan koneen toiminta on seuraava: 0. (Alussa nauhat 2 ja 3 ovat tyhjiä.) 1. Simuloi konetta M f nauhalla 2. 2. Kun M f pysähtyi, vertaa nauhan 2 sisältöä nauhan 1 sisältöön. Jos ne ovat samat, niin hyväksy. 3. Vaihda nauhan 3 ei-tyhjä osuus leksikograsessa järjestyksessä seuraavaan merkkijonoon. 4. Kopioi nauhan 3 sisältö nauhan 2 sisällöksi. 5. Palaa kohtaan 1. (b) Nyt siis A = f f (w 1 ); f(w 2 ); : : : g, missä f (w 1 ) < f(w 2 ) < : : :. Siis jos x < f(w k ) jollakin k, niin varmasti x 6= f (w i ) kaikilla i > k, ja x 2 A jos ja vain jos x = f (w i ) jollakin i < k. Kieli A voidaan tunnistaa seuraavalla algoritmia, joka saa syötteenä merkkijonon x 2 : 4
1. i := 1; 2. jos f (w i ) = x niin hyväksy; 3. jos f (w i ) > x niin hylkää; 3. i := i + 1 4. palaa kohtaan 2. Koska merkkijonot f (w i ) muodostavat kasvavan jonon, algoritmi pysähtyy millä tahansa x. Edellä esitetyn perusteella algoritmi hyväksyy jos ja vain jos x 2 A, ja hylkää jos ja vain jos x 62 A. (c) Oletetaan, että A on rekursiivinen ja ääretön. (Äärettömyysoletus oli virheellisesti jäänyt pois tehtävästä.) Olkoon A = f a 1 ; a 2 ; : : : g, missä a 1 < a 2 < : : :. Kun määritellään f (w i ) = a i, niin selvästi A = f f (w) j w 2 g ja f on monotoninen. Funktio f argumentilla x voidaan laskea seuraavasti: 1. määritä k, jolla x = w k ; 2. p := 0; % montako A:n alkiota on löytynyt 3. toista arvoilla i = 1; 2; : : :: 4. jos w i 2 A niin p := p + 1; 5. jos p = k niin palauta w i. Syötteellä w k algoritmi siis palauttaa sen merkkijonon w, joka on joukon A leksikograsessa järjestyksessä k:s alkio. Koska A on rekursiivinen, algoritmin jokainen yllä esitetty askel voidaan toteuttaa äärellisessä ajassa. Koska A on ääretön, laskuri p saavuttaa jossain vaiheessa arvon k, ja algoritmi pysähtyy. Se siis laskee totaalisen funktion, jolla on haluttu ominaisuus. 5