• Ei tuloksia

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

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

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

Copied!
5
0
0

Kokoteksti

(1)

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 f0n1njn 1g.

Vaihe1: alkutilanteen tuottaminen Vaiheessa 1 tuotetaan lähtösymbolista muotoa x[q0x] oleva merkkijono, missä x 2 f0; 1g. Vaiheen 1 toteuttava kielioppi:

S ! T [q0] T ! T ! 0T A T ! 1T B A[q0! [q0A A0 ! 0A A1 ! 1A A] ! 0]

B[q0! [q0B B0 ! 0B B1 ! 1B B] ! 1]

Vaihe2: siirtymien simulointi Vaiheessa 2 simuloidaan turingin koneen toimintaa vai- heessa 1 generoidulla syötteellä. Jokaista Turingin koneen siirtymää kohti tulee yksi tai useampia kieliopin produktioita.

(2)

Siirtymä vastaava(t) produktio(t) (q0; 0) = (q1; X; R) q00 ! Xq1

(q0; Y ) = (q3; Y; R) q0Y ! Y q3 (q1; 0) = (q1; 0; R) q10 ! 0q1

(q1; Y ) = (q1; Y; R) q1Y ! Y q1 (q1; 1) = (q2; Y; L) 0q11 ! q20Y

1q11 ! q21Y Xq11 ! q2XY Y q11 ! q2Y Y [q11 ! [q2#Y (q2; Y ) = (q2; Y; L) 0q2Y ! q20Y 1q2Y ! q21Y Xq2Y ! q2XY Y q2Y ! q2Y Y [q2Y ! [q2#Y (q2; 0) = (q2; 0; L) 0q20 ! q200

1q20 ! q210 Xq20 ! q2X0 Y q20 ! q2Y 0 [q20 ! [q2#0 (q2; X) = (q0; X; R) q2X ! Xq0

(q3; Y ) = (q3; Y; R) q3Y ! Y q3 (q3; #) = (q4; #; R) q3] ! #q4]

Vaihe3: lopputilanteen siistiminen Vaiheessa 3 "siistitään"pois Turingin koneen ti- lannetta kuvaava osa. Jäljelle jää "arvattu"merkkijono x. Siistimisvaihe käynnistyy vain, jos simulointi on hyväksyvässä lopputilassa.

q4! X0Y0

#X0! X0 XX0! X0 Y X0! X0 0X0! X0 1X0! X0 [X0! Y0# ! Y0 Y0X ! Y0 Y0Y ! Y0 Y00 ! Y0 Y01 ! Y0 Y0] !

(3)

(b) Johto Merkkijonolle "01":

(vaihe 1) S T [q0] 0T A[q0] 01T BA[q0] 01BA[q0] 01B[q0A]

01[q0BA]

01[q0B0]

01[q00B]

01[q001]

(vaihe 2) 01[Xq11]

01[q2XY ] 01[Xq0Y ] 01[XY q3] 01[XY #q4] (vaihe 3)

01[XY #X0Y0] 01[XY X0Y0] 01[XX0Y0] 01[X0Y0] 01Y0] 01

3. (a) Merkkijono w21 saadaan muodostamalla luvun 21 binääriesitys 10101 ja poistamalla siitä ensimmäinen ykkönen. Merkkijono on siis 0101.

(b) Muodostetaan koodi kielen f0n1n j n 1g tunnistavalle koneelle

M = (fq0; q1; q2; q3; q4g; f0; 1g; f0; 1; X; Y; #g; ; q0; #; fq4g):

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 q4(pitäisi olla q2). Huomioidaan nämä seikat suoraan koodauksen yhteydessä.

Tiloille, merkeille ja nauhapään siirroille saadaan seuraavat koodit:

q0 7! 0 q1 7! 000 q2 7! 0000 q3 7! 00000 q4 7! 00

0 7! 0 1 7! 00 X 7! 0000 Y 7! 00000

# 7! 000

L 7! 0 R 7! 00

(4)

Sen jälkeen koodataan siirtymät:

(q0; 0) = (q1; X; R) 7! 010100010000100

(q0; Y ) = (q3; Y; R) 7! 0100000100000100000100 (q1; 0) = (q1; 0; R) 7! 00010100010100

(q1; 1) = (q2; Y; L) 7! 0001001000010000010 (q1; Y ) = (q1; Y; R) 7! 0001000001000100000100

(q2; 0) = (q2; 0; L) 7! 000010100001010 (q2; X) = (q0; X; R) 7! 0000100001010000100

(q2; Y ) = (q2; Y; L) 7! 00001000001000010000010 (q3; Y ) = (q3; Y; R) 7! 00000100000100000100000100 (q3; #) = (q4; #; 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 wi aakkoston leksikograsessa järjestyksessä i:s merkkijono, toisin sanoen = f w1; w2; : : : g missä w1< w2< : : :.

(a) Oletuksen mukaan siis A = f f(w1); f(w2); : : : g ja f on laskettava. Tarkastellaan seuraavaa algoritmia, joka saa syötteenä merkkijonon x 2 :

1. i := 1;

2. jos f(wi) = x niin hyväksy;

3. i := i + 1 4. palaa kohtaan 2.

Jos x 2 A, niin oletuksen mukaan x = f(wi) jollain i, jolloin algoritmi hyväksyy. Muuten x 6= f(wi) 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 wi.

Olkoon Mf 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 Mf nauhalla 2.

2. Kun Mf 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(w1); f(w2); : : : g, missä f(w1) < f(w2) < : : :. Siis jos x < f(wk) jollakin k, niin varmasti x 6= f(wi) kaikilla i > k, ja x 2 A jos ja vain jos x = f(wi) jollakin i < k.

(5)

1. i := 1;

2. jos f(wi) = x niin hyväksy;

3. jos f(wi) > x niin hylkää;

3. i := i + 1 4. palaa kohtaan 2.

Koska merkkijonot f(wi) 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 a1; a2; : : : g, missä a1< a2< : : :. Kun määritellään f(wi) = ai, 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 = wk;

2. p := 0; % montako A:n alkiota on löytynyt 3. toista arvoilla i = 1; 2; : : ::

4. jos wi2 A niin p := p + 1;

5. jos p = k niin palauta wi.

Syötteellä wk algoritmi siis palauttaa sen merkkijonon w, joka on joukon A leksikogra- sessa 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.

Viittaukset

LIITTYVÄT TIEDOSTOT

Oletetaan, että ohjelmat (oikeammin niiden C-kieliset lähdekoodit) ja syötteet ovat (esim.) ASCII- merkistön merkkijonoja. Ohjelma ja syöte on pystyttävä erottamaan toisistaan

Kysymys: kun Turingin kone M suorittaa laskennan syötteellä x, niin siirtyykö se koskaan tilaan numero 52. Jos sinulla olisi algoritmi tämän ongelman ratkaisemiseksi, miten

Palautus tapahtuu muuttamalla syötteenä saadun koneen M w tilojen numerointia niin, ettei tilaa numero 5 käytetä mihinkään, ja vaihtamalla kaikki siirtymät johonkin lopputilaan

Osoita, että ongelma Siirtääkö annettu Turingin kone annetulla syötteellä koskaan nauhapää- tään vasemmalle on ratkeava1. (Vihje: palautus (a)-kohdan ongelmasta.)

Tehdään taas vastaoletus, että proseduuri Minimoi(M) palauttaa tilamäärältään pienimmän Turingin koneen, joka hyväksyy saman kielen kuin M ja käyttää samaa

Koska algoritmi voi tuottaa minkä tahansa osajoukon A, se löytää myös tällaisen osajoukon, jos sellainen on olemassa.. Toisaalta algoritmi ei hyväksy syötettä, ellei se löydä

Kuvaa, minkä tyyppisiä arvoja tällainen palautus saa syötteenään ja millaisia palauttaa, ja mitä ehtoja sen pitää toteuttaa.. (c) Esitä varsinainen palautus ja osoita, että

Sanomme, että palautusfunktion syötteitä ovat muotoa hG; ki olevat merkkijonot, ja tulos- teita muotoa hG 1 ; G 2 i olevat merkkijonot... Polynomisen laskenta-ajan takaa se,