Rekursiivinen Derives on periaatteessa aivan toimiva algoritmi, mutta erittäin tehoton. Jos tarkastellaan esim. kieliopinpätkää

Samankaltaiset tiedostot
Yhteydettömän kieliopin jäsennysongelma

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

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

Pinoautomaatit. Pois kontekstittomuudesta

T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut

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

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

M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)

Chomskyn hierarkia ja yhteysherkät kieliopit

Olkoon G = (V,Σ,P,S) yhteydetön kielioppi. Välike A V Σ on tyhjentyvä, jos A. NULL := {A V Σ A ε on G:n produktio};

Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja

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

Säännöllisten kielten sulkeumaominaisuudet

Turingin koneen laajennuksia

S BAB ABA A aas bba B bbs c

Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja

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

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

Yllä osoitettiin, että säännöllisten kielten joukko on suljettu yhdisteen

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 6. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

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

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

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

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

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

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

uv n, v 1, ja uv i w A kaikilla

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

Automaatit. Muodolliset kielet

1. Universaaleja laskennan malleja

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

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

T Syksy 2006 Tietojenkäsittelyteorian perusteet T Harjoitus 7 Demonstraatiotehtävien ratkaisut

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

2. Yhteydettömät kielet

Algoritmin määritelmä [Sipser luku 3.3]

Pysähtymisongelman ratkeavuus [Sipser luku 4.2]

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

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

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

Rajoittamattomat kieliopit (Unrestricted Grammars)

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

Osoitamme, että jotkut kielet eivät ole säännöllisiä eli niitä ei voi tunnistaa äärellisellä automaatilla.

Kertausta 1. kurssikokeeseen

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

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

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

Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

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

Formalisoimme nyt edellä kuvatun laskennan.

Yhteydettömät kieliopit [Sipser luku 2.1]

Lisää pysähtymisaiheisia ongelmia

1. Universaaleja laskennan malleja

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

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

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

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Muunnelmia Turingin koneista sekä muita vaihtoehtoisia malleja

ICS-C2000 Tietojenkäsittelyteoria. Tähän mennessä: säännölliset kielet. Säännöllisten kielten pumppauslemma M :=

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

Säännöllisten operaattoreiden täydentäviä muistiinpanoja

3. Turingin koneet. osaa esittää yksinkertaisia algoritmeja täsmällisesti käyttäen Turingin konetta ja sen muunnelmia

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

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

Täydentäviä muistiinpanoja laskennan rajoista

ICS-C2000 Tietojenkäsittelyteoria

5.3 Ratkeavia ongelmia

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

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

Laskennan mallit (syksy 2008) 2. kurssikoe , ratkaisuja

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

Rekursiiviset palautukset [HMU 9.3.1]

on rekursiivisesti numeroituva, mutta ei rekursiivinen.

Laskennan mallit (syksy 2010) 2. kurssikoe, ratkaisuja

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

kaikki kielet tunnistettavat A TM HALT TM { a n } { a n b n } { a n b n c n } TOTAL TM EQ TM

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

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

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

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Tietotekniikan valintakoe

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

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

ICS-C2000 Tietojenkäsittelyteoria

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Automaattiteoria diskreetin signaalinkäsittelyn perusmallit ja -menetelmät ( diskreettien I/O-kuvausten yleinen teoria)

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

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

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

Muita vaativuusluokkia

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

2. Laskettavuusteoriaa

5 Kontekstittomat kielet ja pinoautomaatit

Säännöllisen kielen tunnistavat Turingin koneet

Laskennan mallit

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Turingin koneet. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 7. joulukuuta 2015 TIETOTEKNIIKAN LAITOS.

Transkriptio:

Rekursiivinen Derives on periaatteessa aivan toimiva algoritmi, mutta erittäin tehoton. Jos tarkastellaan esim. kieliopinpätkää S AB CA... A CB...... ja kutsua Derives(S, abcde), niin kutsu Derives(B, de) tulee toistetuksi ainakin kolme kertaa: Derives(S, abcde) Derives(A, abc) Derives(B, de) Derives(C, a) Derives(A, bcde) Derives(C, bc) Derives(B, de) Derives(C, ab) Derives(A, cde) Derives(C, c) Derives(B, de) Ongelma muuttuu vielä paljon pahemmaksi pitkillä merkkijonoilla. Algoritmin aikavaativuus on eksponentiaalinen merkkijonon w pituuden suhteen. Sitä voidaan oleellisesti tehostaa käyttämällä taulukointia eli dynaamista ohjelmointia (dynamic programming). 173

Turhaa laskentatyötä voidaan vähentää pistämällä kerran lasketut välitulokset taulukkoon. Muodostetaan siis n n taulukko table(1.. n, 1.. n), missä n = w on alkuperäisen merkkijonon pituus ja taulukon alkio table(i, j) listaa kaikki ne muuttujat, joista voidaan johtaa merkkijono w i... w j : { } table(i, j) = A V A w i... w j. Edellä käytetty periaate tapauksessa i < j tulee nyt seuraavaan muotoon: jos kieliopissa on sääntö A BC ja tiedetään B table(i, k) (eli B w i... w k ) ja tiedetään C table(k + 1, j) (eli C w k+1... w j ) niin voidaan päätellä A table(i, j) (eli A w i... w j ). Tapauksessa i = j pätee A table(i, i), jos ja vain jos kieliopissa on sääntö A w i. 174

Edellä esitetyn perusteella arvo table(i, j) osataan laskea, jos tunnetaan table(p, q) indekseille (p, q) joilla q p < j i. Taulukko siis kannattaa täyttää seuraavasti: vaiheessa 1 täytetään alkiot (1, 1), (2, 2), (3, 3),..., (n, n). vaiheessa 2 täytetään alkiot (1, 2), (2, 3), (3, 4)..., (n 1, n). vaiheessa 3 täytetään alkiot (1, 3), (2, 4), (3, 5)..., (n 2, n).... vaiheessa l täytetään alkiot (1, l), (2, l + 1), (3, l + 2)..., (n l + 1, n).... vaiheessa n 1 täytetään alkiot (1, n 1) ja (2, n) vaiheessa n täytetään alkio (1, n). Siis vaiheessa l täytetään alkiot table(i, j), missä j = i + l 1. Lopuksi todetaan w L(G), jos ja vain jos S table(1, n). 175

Taulukon table täyttämisjärjestys tapauksessa w = 8. Alkioita table(i, j) missä j < i ei käytetä. j i 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 vaihe 8 vaihe 7 vaihe 6 vaihe 5 vaihe 4 vaihe 3 vaihe 2 vaihe 1 : ei käytetä 176

Alkion table(i, j) täyttämiseen tarvitaan alkiot table(i, i),..., table(i, j 1) ja alkiot table(i + 1, j),..., table(j, j). i j 1 2 3 4 5 6 7 8 Säännön A BC perusteella A table(3, 7), jos jokin seuraavista pätee: B table(3, 3) ja C table(4, 7) B table(3, 4) ja C table(5, 7) B table(3, 5) ja C table(6, 7) B table(3, 6) ja C table(7, 7) 1 2 3 4 5 6 7 8 177

Saadaan seuraava algoritmi [Sipser s. 267]: CYK(G, w) Oletus: G = (V, Σ, R, S) on Chomskyn normaalimuodossa if w = ε and S ε on sääntö then return True alusta table(i, j) kaikilla i ja j for i 1 to w vaihe 1 do for kaikille muuttujille A V do if A w i on sääntö then table(i, i) table(i, i) { A } for l 2 to n vaiheet 2,..., n do for i 1 to n l + 1 do j i + l 1 for k i to j 1 do for kaikille säännöille A BC do if B table(i, k) and C table(k + 1, j) then table(i, j) table(i, j) { A } if S table(1, n) then return True else return False 178

Esimerkki 2.18: Tarkastellaan merkkijonoa w = abba ja kielioppia S AB BC A AC a B AB b C a b Seuraavan taulukon mukaan S table(1, 4) eli w kuuluu kieleen. Taulukkoon on lisäksi merkitty, mitkä välivaiheet ovat tuoneet muuttujan S joukkoon table(1, 4). i j 1 2 3 4 1 A C S A B S A B S A 2 B C S 3 B C S 4 A C 179

Yhteenveto: Chomskyn normaalimuoto takaa, että lyhyille merkkijonoille myös johdot ovat lyhyitä (vrt. sivu 151), joten jäsentäminen on ainakin periaateessa mahdollista syötteen pituuden suhteen polynomisessa ajassa. Naiivi rekursiivinen Derives toimii oikein, mutta ei tehokkaasti. Varsinainen CYK-algoritmi laskee samat asiat kuin Derives, mutta organisoi laskennan tehokkaammin. CYK on esimerkki keskeisestä algoritmisuunnittelutekniikasta, jota kutsutaan taulukoinniksi eli dynaamiseksi ohjelmoinniksi: Ongelma jaetaan osaongelmiin. Ensin ratkaistaan kaikki pienemmät osaongelmat. Niiden ratkaisuista voidaan koota ratkaisut suurempiin osaongelmiin. Lopuksi saadaan ratkaisu koko ongelmaan. Turhalta näyttävä pienempien osaongelmien ratkaiseminen vähentää kuitenkin kokonaistyömäärää. 180

CYK-algoritmissa kolme sisäkkäistä for-silmukkaa, joita kutakin iteroidaan O(n) kertaa. Siis algoritmin aikavaativuus on O(n 3 ), jos kieliopin koko lasketaan vakioksi. Korollaari 2.19: [Sipser Thm. 7.16] Millä tahansa yhteydettömällä kielellä L kysymys päteekö w L? voidaan ratkaista ajassa O( w 3 ). Kuten edellä mainittiin, CYK-algoritmi ei ole realistinen vaihtoehto ohjelmointikielen jäsentämiseen tms. Sovelluksissa käytetään tehokkaampia algoritmeja, jotka kuitenkin toimivat vain sopivasti rajatulle luokalle kielioppeja. 181

Pinoautomaatit (pushdown automaton, PDA) [Sipser luku 2.2] Pinoautomaatti on äärellinen automaatti, johon on lisätty rajoittamaton määrä muistia pinon (stack) muodossa. Näemme jatkossa, että kielen voi tunnistaa pinoautomaatilla, jos ja vain jos se on yhteydetön. Esimerkki 2.20: Kielen { 0 n 1 n n N } voi hyväksyä pinon avulla seuraavaan tapaan: 1: jos seuraava merkki on 0 niin Push(0) mene kohtaan 1 muuten Pop mene kohtaan 2 2: jos seuraava merkki on 1 niin Pop mene kohtaan 2 Merkkijono hyväksytään, jos pino on tyhjä kun merkkijono loppuu. 182

Ryhdymme nyt formalisoimaan pinoautomaattia. Tarkastelemme alusta alkaen epädeterministisiä pinoautomaatteja. Äärellisistä automaateista poiketen epädeterministinen pinoautomaatti on aidosti determinististä vahvempi laskennan malli (ks. esim. 2.22). Pinoautomaatti on kuusikko (Q, Σ, Γ, δ, q 0, F ), missä 1. Q on äärellinen tilajoukko, 2. Σ on äärellinen syöteaakkosto, 3. Γ on äärellinen pinoaakkosto, 4. δ : Q Σ ε Γ ε P(Q Γ ε ) on siirtymäfunktio, 5. q 0 Q on alkutila ja 6. F Q on hyväksyvien tilojen joukko. Määritelmä muistuttaa epädeterministisen äärellisen automaaton määritelmää; eroina ovat pinoaakkosto ja siirtymäfunktio. 183

Siirtymäfunktio on siis funktio δ : Q Σ ε Γ ε P(Q Γ ε ). Muistetaan, että Σ ε = Σ { ε } ja P tarkoittaa potenssijoukkoa. Siirtymäfunktion tulkinta on seuraava: Jos (q, c) δ(q, a, b), niin tilassa q voidaan lukea syötemerkki a, poimia pinon päältä merkki b, siirtyä tilaan q ja painaa pinoon merkki c. Tässä a, b tai c voi olla myös ε, jolloin tulkinta on: jos a = ε, niin seuraavaa syötemerkkiä ei lueta; jos b = ε, niin pinosta ei poimita (eikä lueta) mitään; ja jos c = ε, niin pinoon ei paineta mitään. 184

Muodollisesti pinoautomaatti M = (Q, Σ, Γ, δ, q 0, F ) hyväksyy merkkijonon w Σ, jos jollain m N on olemassa w 1 Σ ε,..., w m Σ ε, joilla w = w 1... w m ; tilat r 0 Q,..., r m Q ja merkkijonot s 0 Γ,..., s m Γ ( pinon sisällöt ), missä r 0 = q 0 ja s 0 = ε (aluksi pino tyhjä) kaikilla i = 0,..., m 1 voidaan kirjoittaa s i = at ja s i+1 = bt, missä (r i+1, b) δ(r i, w i+1, a), ja r m F. Tuttuun tapaan automaatti hylkää merkkijonot, joita se ei hyväksy. Automaatin tunnistama kieli koostuu sen hyväksymistä merkkijonoista. 185

Esimerkki 2.21: [Sipser Ex. 2.14] Kieli { 0 n 1 n n N } voidaan tunnistaa pinoautomaatilla M 1 = (Q, Σ, Γ, δ, q 1, F ), missä Q = { q 1, q 2, q 3, q 4 }, Σ = { 0, 1 }, Γ = { 0, $ }, F = { q 1, q 4 } ja δ on seuraava: syöte: 0 1 ε pino: 0 $ ε 0 $ ε 0 $ ε q 1 { (q 2, $) } q 2 { (q 2, 0) } { (q 3, ε) } q 3 { (q 3, ε) } { (q 4, ε) } q 4 Siis esim. δ(q 3, ε, $) = { (q 4, ε) }. Koska formalismissa ei ole sisäänrakennettua pinon tyhjyystestiä, pinon pohjan merkiksi laitetaan $. Sama tekniikka toistuu jatkossa. 186

Esitetään sama havainnollisemmin tilakaaviona. Merkintä q a,b c q tarkoittaa (q, c) δ(q, a, b). ε, ε $ q 1 q 2 0, ε 0 1, 0 ε q 4 ε, $ ε q 3 1, 0 ε 187

Esimerkki 2.22: [Sipser Ex. 2.18] Kieli { ww R w { 0, 1 } } voidaan tunnistaa seuraavalla periaatteella: 1. Syötteen ensimmäisen puolikkaan ajan paina merkkejä pinoon. 2. Syötteen toisen puolikkaan ajan poimi merkkejä pinosta ja vertaa juuri luettuun. Syötteen keskikohta arvataan epädeterministisesti. Itse asiassa tätä kieltä ei edes ole mahdollista tunnistaa PDA:n deterministisellä variantilla. ε, ε $ q 1 q 2 0, ε 0 1, ε 1 ε, ε ε q 4 ε, $ ε q 3 0, 0 ε 1, 1 ε 188

Esimerkki 2.23: Seuraava PDA hyväksyy ne merkkijonot, joissa on yhtä monta nollaa kuin ykköstä. Pinoaakkosto on Γ = { A, B, $ }. Pinossa pidetään kirjaa tähän mennessä luettujen nollien ja ykkösten määrien erosta. Esim. AAA$ tarkoittaa, että nollia on ollut kolme enemmän, ja BBBBB$, että ykkösiä on ollut viisi enemmän. 0, A A 0, $ $ ε, ε $ ε, ε A 0, B ε 1, A ε 1, B B 1, $ $ ε, ε B ε, $ ε 189

Yhteydettömien kielioppien ja pinoautomaattien yhteys [Sipser s. 117 124] Näemme, että yhteydettömien kielioppien tuottamat kielet ovat tasan samat kuin ne, jotka voidaan tunnistaa pinoautomaatilla. Aloitetaan helpommasta suunnasta. Lemma 2.24: [Sipser Lemma 2.21] Jos kieli on yhteydetön, se voidaan tunnistaa pinoautomaatilla. Todistuksen perusidea on laatia annetun kieliopin pohjalta pinoautomaatti, joka toteuttaa seuraavan algoritmin: Generoi: Tuota epädeterministisesti pinoon merkkijono w Σ, jolla S w. Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin hyväksy. Epädeterminismi on oleellista: valitsemalla generoimisvaiheessa sovellettavat säännöt epädeterministisesti varmistetaan, että jokaisella kieleen kuuluvalla merkkijonolla w on mahdollisuus tulla tuotetuksi. 190

Toteutusta rajoittaa, että automaatin tietorakenne on pino, josta vain huippu on kulloinkin näkyvissä. Siksi generointi- ja testausvaihe pitää lomittaa: aina kun pinon huipulle saadaan päätesymboleita, käydään vertaamassa niitä syötteeseen ennen generoinnin jatkamista. Saadaan tarkennettu algoritmi: 1. Alusta pinon sisällöksi S$, missä S on lähtösymboli ja $ merkitsee pinon pohjaa. 2. Toista seuraavaa: (a) Jos pinon huipulla on muuttujasymboli A, valitse epädeterministisesti sääntö A w. Korvaa A merkkijonolla w. (b) Jos pinon huipulla on päätesymboli, poista se pinosta ja vertaa seuraavaan syötemerkkiin. Jos ne eroavat, hylkää. (c) Jos pinon huipulla on $, hyväksy jos syöte on loppu; muuten hylkää. Tämä pitää vielä koodata pinoautomaatiksi. 191

Esimerkki 2.25: Tarkastellaan kielioppia ja merkkijonoa bbcca, jolla on johto S Sa T T bt c ε S Sa T a bt ca bbt cca bbcca. Haluamme muodostaa pinoautomaatin, joka syötteellä bbcca vuorotellen soveltaa pinoon ylläolevan johdon sääntöjä ja poistaa pinosta syötettä vastaavia päätemerkkejä. Pinon käyttäytymisen pitäisi siis olla seuraava: 192

jäljellä oleva syöte pinon sisältö bbcca ε bbcca $ bbcca S$ bbcca Sa$ bbcca T a$ bbcca bt ca$ bcca T ca$ bcca bt cca$ cca T cca$ cca cca$ ca ca$ a a$ ε $ ε ε 193

Jatkossa sallimme merkinnän (r, u) δ(q, a, s) myös, kun u = u 1... u l Γ (siis myös kun l > 1). Merkintä tarkoittaa tilassa q Q automaatti saa siirtyä tilaan r Q lukemalla syötemerkin a Σ ja poimimalla pinosta merkin s Γ ja painamalla pinoon merkit u l,..., u 1. Myös tapaukset a = ε ja s = ε sallitaan kuten ennenkin. 194

Muodollisesti merkintä tarkoittaa, että automaatissa on tilat q 1,..., q l 1, joilla (q 1, u l ) δ(q, a, s) δ(q 1, ε, ε) = { (q 2, u l 1 ) } δ(q 2, ε, ε) = { (q 3, u l 2 ) } δ(q l 1, ε, ε) = { (r, u 1 ) } ja joihin ei liity muita siirtymiä. Merkinnän (r, u 1 u 2 u 3 ) δ(q, a, s) kaavioesitys: q a, s u 1 u 2 u 3 r q a, s u 3 ε, ε u 2 q 1 q 2 ε, ε u 1 r 195

Lemman 2.24 todistus: Olkoon G = (V, Σ, R, S) yhteydetön kielioppi. Konstruoimme edellä esitetyn idean mukaisesti pinoautomaatin, joka tunnistaa kielen L(G). Automaatin runkona on kolme tilaa q start, q loop ja q accept. Alkutilana on q start ja ainoa hyväksyvä tila q accept. Aluksi viedään pinoon loppumerkki $ ja alkusymboli S siirtymällä kuvana δ(q start, ε, ε) = { (q loop, S$) } ; start ε, ε S$ loop Lopuksi pinosta poimitaan loppumerkki $ siirtymällä kuvana δ(q loop, ε, $) = { (q accept, ε) } ; loop ε, $ ε acc 196

Varsinainen laskenta tapahtuu kahdenlaisilla siirtymillä tilasta q loop itseensä: Kaikilla joukon R säännöillä A w tulee (q loop, w) δ(q loop, ε, A); kuvana loop ε, A w Tässä siis pinon huipulla olevasta muuttujasta A tuotetaan pinon huipulle merkkijono w. Kaikilla a Σ tulee (q loop, ε) δ(q loop, a, a); kuvana loop a, a ε Tässä siis pinon huipulla oleva päätemerkki a poistetaan ja samalla luetaan vastaava syötemerkki. Muita siirtymiä ei ole. Selvästi automaatti toteuttaa esitetyn epädeterministisen algoritmin kielen L(G) tunnistamiseksi. 197

Esimerkki 2.26: Edellisen esimerkin kielioppista saadaan seuraava pinoautomaatti: S Sa T T bt c ε start ε, ε $ ε, ε S ε, T c ε, ε T ε, ε b ε, T ε ε, S T a, a ε b, b ε c, c ε loop ε, $ ε ε, S a ε, ε S acc 198

Haluamme todistaa myös käänteisen suunnan: Lemma 2.27: [Sipser Lemma 2.27] Pinoautomaatin tunnistama kieli on yhteydetön. Tämä suunta on hankalampi: meidän pitää osata purkaa mikä tahansa pinoautomaatti M ja kuvata sen tunnistama kieli yhteydettömänä kielioppina. Hahmottelemme seuraavassa lemman 2.27 todistuksen esimerkkinä hieman monimutkaisemmasta automaattiteoreettisesta konstruktiosta. Lemman todistus kuitenkaan ei kuulu koealueeseen. 199

Teknisten yksityiskohtien helpottamiseksi todetaan ensin, että automaatista M on helppo muodostaa sellainen saman kielen tunnistava pinoautomaatti M, että 1. automaatissa M on tasan yksi hyväksyvä tila (merkitään sitä q accept ) 2. ennen hyväksymistä M aina tyhjentää pinonsa ja 3. siirtymiä on vain seuraavia lajeja: pop-siirtymä: poimii pinosta yhden merkin, ei paina mitään (a, s ε missä a Σ ε ja s Γ) ja push-siirtymä: painaa pinoon yhden merkin, ei poimi mitään (a, ε s missä a Σ ε ja s Γ). Ehdot 1 ja 2 saadaan helposti voimaan lisäämällä pinon loppumerkki ja ylimääräiset pinontyhjennystila ja hyväksyvä tila. Ehto 3 saadaan voimaan korvaamalla kukin siirtymä a, s s pop-push-yhdistelmällä ja kukin siirtymä a, ε ε push-pop-yhdistelmällä (yksi uusi tila per korjattava siirtymä). 200