582206 Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja 1. Tarkastellaan yhteydetöntä kielioppia S SAB ε A aa a B bb ε Esitä merkkijonolle aa kaksi erilaista jäsennyspuuta ja kummallekin siitä vastaava vasen johto. Ratkaisu: S S A B ε a A ε S S A B S A B a ε a ε a ε 2. Muunna kielioppi S SAB AB aab aab aa S SAB SABAB ABAB abab aab aab aa. S ASB B C cc ε A CaAC a B abc A. Chomskyn normaalimuotoon luennolla esitetyllä menetelmällä: ensimmäiset kahdet vaiheet (a) ε- sääntöjen poisto ja (b) yksikkösääntöjen poisto. Ratkaisu: (a) Selvästi C on ainoa nollautuva muuttuja eli NULL = { C }. Erityisesti S ε. Poistamalla ε-säännöt saamme kieliopin S 0 S S ASB B C cc c A CaAC CaA aac aa a B abc A. (b) Yksikkösääntöjen poistamiseksi todetaan UNIT(S 0 ) = { S 0, S, B, A } UNIT(S) = { S, B, A } UNIT(A) = { A } UNIT(B) = { B, A } UNIT(C) = { C }.
Siis yksikkösääntöjen poistaminen antaa S 0 ASB abc CaAC CaA aac aa a S ASB abc CaAC CaA aac aa a C cc c A CaAC CaA aac aa a B abc CaAC CaA aac aa a. Annettu tehtävä loppui tähän. Jos kuitenkin jatketaan muuntamista Chomskyn normaalimuotoon vielä pilkkomalla liian pitkät säännöt saadaan S 0 AV 1 X a V 2 CV 3 CV 5 X a V 6 X a A a V 1 SB V 2 X b X c V 3 X a V 4 V 4 AC V 5 X a A V 6 AC S AW 1 X a W 2 CW 3 CW 5 X a W 6 X a A a W 1 SB W 2 X b X c W 3 X a W 4 W 4 AC W 5 X a A W 6 AC C X c C c A CU 1 CU 3 X a U 4 X a A a U 1 X a U 2 U 2 AC U 3 X a A U 4 AC B X a U 9 CU 5 CU 7 X a U 8 X a A a U 5 X a U 6 U 6 AC U 7 X a A U 8 AC U 9 X b X c X a a X b b X c c 2
3. [Sipser Exercise 2.9] Anna yhteydetön kielioppi kielelle { a i b j c k i = j tai j = k }. Onko kielioppisi yksiselitteinen? Perustele. Ratkaisu: S XC AY A aa ε C cc ε X axb ε Y by c ε. Kielioppi on moniselitteinen, sillä esim. merkkijonolla abc on kaksi vasenta johtoa 4. Osoita seuraava kielioppi moniselitteiseksi: S XC axbc abc abcc abc S AY aay ay aby c abc. lause if-then-else if-then p if-then-else if b then lause else lause Laadi yksiselitteinen kielioppi samalle kielelle. if-then if b then lause. Ratkaisu: Kielioppi on moniselitteinen, sillä merkkijono if b then if b then p else p voidaan tuottaa vasemmalla johdolla niin, että else liittyy joko ensimmäiseen tai toiseen päätesymboliin if. lause if-then if b then lause if b then if-then-else if b then if b then lause else lause if b then if b then p else lause if b then if b then p else p lause if-then-else if b then lause else lause if b then if-then else lause if b then if b then lause else lause if b then if b then p else lause if b then if b then p else p 3
Yksiselitteinen kieliopista saadaan muuttamalla sitä niin, että kukin else yhdistetään sisimpään vapaaseen symboliin if: <lause> <tasapainoton> <tasapainoinen> <tasapainoton> if b then <lause> if b then <tasapainoinen> else <tasapainoton> <tasapainoinen> if b then <tasapainoinen> else <tasapainoinen> p 5. Sanotaan, että yhteydettömän kieliopin muuttuja A on saavuttamaton, jos kieliopissa ei lähtösymbolista voi johtaa mitään muuttujan A sisältävää merkkijonoa ja tuottamaton, jos kieliopissa ei muuttujasta A voi johtaa yhtään päätemerkkijonoa. (a) algoritmi, joka etsii yhteydettömästä kieliopista kaikki saavuttamattomat muuttujat: SAAVUTTAMATTOMAT(V, Σ, R, S) VanhatSaavutetut Saavutetut { S } while VanhatSaavutetut Saavutetut do VanhatSaavutetut Saavutetut for kaikilla säännöillä A w do if A Saavutetut then lisää joukkoon Saavutetut kaikki muuttujat merkkijonosta w return V Saavutetut (b) algoritmi, joka etsii yhteydettömästä kieliopista kaikki tuottamattomat muuttujat: TUOTTAMATTOMAT(V, Σ, R, S) VanhatTuottavat Tuottavat for kaikilla säännöillä A w do if w on päätemerkkijono then lisää A joukkoon Tuottavat while VanhatTuottavat Tuottavat do VanhatTuottavat Tuottavat for kaikilla säännöillä A w do if kaikki merkkijonon w muuttujat ovat joukossa Tuottavat then lisää A joukkoon Tuottavat return V Tuottavat (c) Yritetään poistaa kieliopista kaikki turhat muuttujat siten, että ensin poistetaan kaikki tuottamattomat muuttujat ja niihin liittyvät säännöt, ja sitten saadusta kieliopista poistetaan kaikki saavuttamattomat muuttujat ja niihin liittyvät säännöt. Johtaako tämä haluttuun lopputulokseen? Entä jos poistetaan ensin saavuttamattomat ja sitten tuottamattomat? Perustele. Perustele. Ratkaisu: Aloitetaan toisesta tapauksesta: ensin poistetaan saavuttamattomat ja sitten tuottamattomat. Sovelletaan menettelyä tehtävänannossa olleeseen esimerkkiin. Ensimmäisessä vaiheessa havaitaan saavuttamattomiksi muuttujat D ja E. Poistamalla ne sääntöineen saadaan kielioppi S A BC A aa ε B bb ε. 4
Toisessa vaiheessa havaitaan tuottamattomaksi C. Poistamalla muuttujaan C liittyvät säännöt saadaan lopputulokseksi S A A aa ε B bb ε. Tässä kuitenkin on jäljellä turha muuttuja B. Esitetty menettely siis ei sellaisenaan toimi. Sen sijaan jos ensin poistetaan tuottamattomat muuttujat ja sitten saavuttamattomat, jäljelle ei jää mitään turhaa. Tarkastellaan nimittäin jotain kieliopin muuttujaa X. Jos X on mukana vielä tuottamattomien poiston jälkeen, niin X w jollain päätemerkkijonolla w. Jos X on mukana vielä saavuttamattomien poiston jälkeen, niin S uxv, missä u ja v voivat sisältää päätemerkkejä ja tuottavia muuttujia. Siis u w ja v w joillain päätemerkkijonoilla w ja w, joten S uxv w ww. Koska nyt X on osana johtoa lähtösymbolista päätemerkkijonoksi, se ei ole (ainakaan tässä tehtävässä tarkastellussa mielessä) turha. 6. [Sipser Problem 2.25] Määritellään aakkoston Σ kieleen A kuuluvien merkkijonojen loppuosien joukko SUFFIX(A) = { v Σ uv A jollakin u Σ }. Lause: Jos A on yhteydetön, niin myös SUFFIX(A) on. Todistus: Olkoon W yhteydetön kieli. Valitaan jokin sen tuottava yhteydetön kielioppi, muunnetaan Chomskyn normaalimuotoon ja poistetaan turhat muuttujat (ks. tehtävä 5); tämä yksinkertaistaa merkintöjä jatkossa. Olkoon saatu kielioppi G = (V, Σ, R, S). Määritellään kielioppi G = (V, Σ, R, S ), jolle L(G ) = SUFFIX(W ). Määritellään jokaista alkuperäistä muuttujaa A V kohti kaksi uutta muuttujaa A ja A. Uudeksi muuttujien joukoksi tulee V = V { A A V } { A A V }. Ideana on määritellä säännöt siten, että jos jollekin päätemerkkijonolle w pätee alkuperäisessä kieliopissa A w, niin uudessa kieliopissa pätee A w kaikille merkkijonon w loppuosille w. Muuttujat A ovat apumuuttujia, jotka eivät tuota muuta kuin tyhjän merkkijonon. Tätä varten jos alkuperäisessä kieliopissa on sääntö A a, niin uuteen tulee säännöt A a, A ε ja A ε. Jos alkuperäisessä kieliopissa on sääntö A BC, niin uuteen tulee säännöt A B C ja A B C sekä A B C. Lisäksi uuteen kielioppiin tulee sellaisenaan kaikki alkuperäisen kieliopin säännöt. Perustellaan vielä, miksi konstruktio toimii oikein. Käytetään jatkossa uuden kieliopin muuttujille merkintää à korostamaan, että se voi olla jotain tyypeistä A, A tai A, missä A on alkuperäisen kieliopin muuttuja. Tarkastellaan nyt jotain merkkijonoa w = w 1... w n W. Koska alkuperäinen kielioppi on Chomskyn normaalimuodossa, w voidaan johtaa 2n 1 askelella erityisesti siten, että ensimmäisissä n 1 askelessa tuotetaan n muuttujan jono A 1... A n ja viimeisissä n askelessa muuttujat A i korvataan yksi kerrallaan päätemerkeillä w i. Uudessa kieliopissa voidaan vastaavasti n 1 askelessa uudesta lähtösymbolista S johtaa erilaisia muuttujajonoja Ã1... Ãn, missä Ãi on joko A, A tai A. Tarkastelemalla uuden kieliopin sääntöjä nähdään, että johdetuissa muuttujajonoissa on aina tasan yksi tyyppiä A oleva muuttuja. Kaikki sen vasemmalla puolella olevat muuttujat ovat tyyppiä A ja oikealla puolella olevat tyyppiä A. Pilkullisen muuttujan A sijainti voidaan valita vapaasti. (Siis jos alkuperäinen muuttujajono oli ABC, uudessa kieliopissa saadaan jonot A BC, A B C ja A B C.) Näistä uuden kieliopin muuttujajonoista saadaan puolestaan n askelella johdetuksi kaikki merkkijonon w loppuosat tuottamalla sopivasti alkupään muuttujista tyhjää. Siis uusi kielioppi tuottaa kaikki alkuperäisen kielen loppuosat. Oletetaan toisaalta, että w kuuluu uuden kieliopin tuottamaan kieleen. Muodostetaan merkkijonolle w uuden kieliopin mukainen johto, jossa tehdään ensin kaikkien muotoa à B C olevien sääntöjen soveltamiset ja vasta sitten aletaan soveltaa muotoa à a ja à ε olevia sääntöjä. Ensimmäisen vaiheen 5
lopuksi saadaan jokin muuttujajono Ã1... Ãn, jossa taas on tasan yksi muuttuja tyyppiä A, sen vasemmalla puolella vain tyyppiä A ja oikealla puolella vain tyyppiä A. Lisäksi alkuperäisessä kieliopissa voidaan johtaa vastaava pilkuton muuttujajono A 1... A n. Kaikki uuden kieliopin muuttujajonosta Ã1... Ãn johdettavat merkkijonot, erityisesti w, ovat vanhassa kieliopissa muuttujajonosta A 1... A n johdettavan päätemerkkijonon loppuosia. Siis uusi kielioppi ei tuota mitään muuta kuin alkuperäisen kielen loppuosia. Esimerkki: Kielioppi S AB A a B AB b tuottaa kielen L = {a i b i 1}. Selvästi SUFFIX(L) = {a i b i 0} {ε}. Yllä olevan konstruktion mukaan kieltä SUFFIX(L) tuottava kielioppi sisältää alkuperäisten sääntöjen lisäksi säännöt S A B A B A B A a ε A ε B A B A B A B b ε B ε ja S on lähtösymboli. Esimerkiksi alkuperäisen merkkijonon aab johtoa S AB ab aab aab aab vastaa loppuosan ab johto S A B εb εa B εab εab. 6