5 Kontekstittomat kielet ja pinoautomaatit

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

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

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

Yhteydettömät kieliopit [Sipser luku 2.1]

Rajoittamattomat kieliopit

Yhteydettömän kieliopin jäsennysongelma

Pinoautomaatit. Pois kontekstittomuudesta

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

ICS-C2000 Tietojenkäsittelyteoria

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

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

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

2. Yhteydettömät kielet

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

S BAB ABA A aas bba B bbs c

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja

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

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

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

Chomskyn hierarkia ja yhteysherkät kieliopit

Automaatit. Muodolliset kielet

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

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

Turingin koneen laajennuksia

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

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

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

1. Universaaleja laskennan malleja

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

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

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

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

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 10. kesäkuuta 2013

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

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

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

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. 5. marraskuuta 2015

Rajoittamattomat kieliopit (Unrestricted Grammars)

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

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

11.4. Context-free kielet 1 / 17

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

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

Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja

Säännöllisten kielten sulkeumaominaisuudet

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

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

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

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

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

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

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

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

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

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

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

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

Kertausta 1. kurssikokeeseen

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

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

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

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. kesäkuuta 2013

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

Muunnelmia Turingin koneista sekä muita vaihtoehtoisia malleja

Attribuuttikieliopit

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

Lisää pysähtymisaiheisia ongelmia

Muita universaaleja laskennan malleja

5.3 Ratkeavia ongelmia

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

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

Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja

follow(a) first(α j ) x

on rekursiivisesti numeroituva, mutta ei rekursiivinen.

ICS-C2000 Tietojenkäsittelyteoria

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

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. joulukuuta 2015

Chomskyn hierarkia. tyyppi 0 on juuri esitelty (ja esitellään kohta lisää) tyypit 2 ja 3 kurssilla Ohjelmoinnin ja laskennan perusmallit

Tietotekniikan valintakoe

Täydentäviä muistiinpanoja jäsennysalgoritmeista

LR-jäsennys. Antti-Juhani Kaijanaho. 3. lokakuuta 2016

Rekursiiviset palautukset [HMU 9.3.1]

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

1. Universaaleja laskennan malleja

Algoritmin määritelmä [Sipser luku 3.3]

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

Kontekstittomien kielten jäsentäminen Täydentäviä muistiinpanoja TIEA241 Automaatit ja kieliopit, syksy 2016

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 16. helmikuuta 2012

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Formalisoimme nyt edellä kuvatun laskennan.

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

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

Säännöllisen kielen tunnistavat Turingin koneet

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

Täydentäviä muistiinpanoja kontekstittomien kielioppien jäsentämisestä

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

Transkriptio:

5 Kontekstittomat kielet ja pinoautomaatit Kontekstittomat kielet (context-free languages, yhteydettömät kielet) voidaan kuvata kontekstittomilla kieliopeilla (context-free grammar) ja tunnistaa epädeterministisillä pinoautomaateilla (pushdown automaton). Verrattuna edelliseen lukuun, korvaamme säännölliset lausekkeet näillä kieliopeilla, ja epädeterministiset äärelliset automaatit näillä pinoautomaateilla. Pinoautomaatti on kuten äärellinen automaatti, johon on lisätty rajoittamattoman suuri muisti. Tämä muisti on TRA-kurssilta tuttu pino (stack). Tämä rajoittamattoman suuri muisti tarkoittaa, että pino-operaatiot eivät koskaan jumiudu virheilmoitukseen Out Of Memory error. Joskus kirjallisuudessa näitä pinoja kutsutaan nimellä pushdown store/stack: Niissä voi katsella vain pinon päällimmäistä tietoalkiota, sen alla olevat jäävät piiloon (kunnes ne nousevat päällimmäiseksi). Silloin yleisnimi stack varataankin tietorakenteelle, jota suomeksi kutsutaankin nimellä avopino: Niissä koko pinon sisältöä voi selailla, mutta vain päällimmäisen alkion voi poistaa. Tavoitteet: Opitaan mitä ovat kontekstittomat kielet ja pinoautomaatit, ja mikä on niiden välinen suhde. Opitaan muodostamaan kielioppi yksinkertaisille kontekstittomille kielille. Opitaan jäsentämisen perusideat. Johdatteleva esimerkki: Miten kuvaisit seuraavat kielet? Sisäkkäisten sulkulausekkeiden kieli: if else-parien muodostama kieli: L ( ) = { ( k ) k : k 0 } L if-else = { if k else l : l k } Ne eivät ole säännöllisiä, joten säännöllisillä lausekkeilla se ei onnistu. Ratkaisuyritys: Annetaan kielelle L ( ) rekursiivinen kuvaus: Merkitään S = mielivaltainen sisäkkäinen sulkumerkkijono. Tällöin S on sisäkkäinen sulkumerkkijono, jos 1. S = ε tai 2. S on muotoa (S ), missä myös S on sisäkkäinen sulkumerkkijono. Toinen kuvaustapa (ensimmäinen kontekstiton kielioppimme): 80

1. S ε 2. S (S) Esimerkiksi merkkijonon ((())) tuottaminen: S (S) ((S)) (((S))) (((ε))) = ((())) Vastaava jäsennyspuu (tähän palataan vielä): S S S ( ( ( ε ) ) ) Kontekstittoman kieliopin idea On annettu joukko muuttujasymboleita ja muunnossääntöjä tämän muuttujasymbolin esiintymän saa korvata tuolla merkkijonolla joka voi vuorostaan sisältää uusia muuttujasymbolien esiintymiä. Yksi näistä muuttujasymboleista on erityinen aloitussymboli josta lähdetään liikkeelle. Muunnetaan merkkijonoa näillä säännöillä, kunnes siinä ei enää esiinny muuttujasymboleita. Silloin voidaan lukea näin tuotettu lopullinen merkkijono. Esimerkki 32. Yksinkertainen kielioppi aritmeettisille lausekkeille: E T E + T T F T F F a (E). Esimerkiksi ensimmäinen rivi luetaan muuttujasymboli E voidaan korvata merkkijonolla T tai merkkijonolla E + T jossa T on toinen muuttujasymboli ja + merkki. 81

Se tuottaa vaikkapa aritmeettisen lausekkeen (a + a) a seuraavasti: E T T F F F (E) F (E + T) F (T + T) F (F + T) F (a + T) F (a + F) F (a + a) F (a + a) a Siinä alleviivattu muuttujasymbolin esiintymä on korvattu. Kontekstittoman kieliopin formaali määritelmä Määritelmä 6. Kontekstiton kielioppi on nelikko jossa G = (V, Σ, P,S) äärellinen joukko V on kieliopin aakkosto; Σ V on kieliopin päätemerkkien joukko; sen komplementti N = V \ Σ on kieliopin välikemerkkien eli -symbolien joukko (joita edellä kutsuimme muuttujasymboleiksi); äärellinen joukko P N V on kieliopin sääntöjen eli produktioiden joukko; ja S N on kieliopin lähtösymboli. Sääntöä (A, ω) P merkitään A ω. Sen voi lukea välike A voi tuottaa/johtaa merkkijonon ω. Intuitiivisesti kontekstiton kielioppi G = (V, Σ, P, S) tuottaa merkkijonoja Σ seuraavalla epädeterministisellä algoritmilla: 1 r S 2 while r sisältää yhä välikemerkkien esiintymiä 3 do valitse mikä tahansa (siis vaikkapa ensimmäinen tai viimeinen) sellainen esiintymä joten r on siis muotoa αaβ jossa A N on se valittu esiintymä, α V on sitä ennen tuleva osa, ja β V on sen jälkeen tuleva osa 4 valitse mikä tahansa tämän valitun esiintymän sääntö A ω P 5 r αωβ 6 tulosta näin saatu r Silloin kieliopin G tuottama formaali kieli L(G) = kaikki ne merkkijonot r jotka tämä algoritmi voi tulostaa valitsemalla säännöt sopivasti rivillään 4. 82

Kontekstittoman kielen formaali määritelmä Merkkijono αaβ V, jossa A N, voi tuottaa tai johtaa suoraan merkkijonon αωβ V, jos kieliopissa G on sääntö A ω P. Tätä merkitään Esimerkiksi sekä että αaβ G αωβ T F G F F T F G T a esimerkin 32 kieliopissa aritmeettisille lausekkeille. Merkkijono γ 0 V, voi tuottaa tai johtaa merkkijonon γ n V, jos on olemassa jono merkkijonoja V siten, että γ 0 G γ 1 G γ 2 G G γ n eli jos merkkijono γ 0 voi tuottaa suoraan merkkijonon γ 1 joka voi tuottaa suoraan merkkijonon γ 2 joka voi tuottaa suoraan merkkijonon...joka voi tuottaa suoraan merkkijonon γ n. Tätä merkitään Esimerkiksi koska on jono γ 0 γ n G T F (E) a G T F G F F G (E) F G (E) a esimerkin 32 kieliopissa aritmeettisille lausekkeille. Erikoistapauksena jokainen merkkijono γ V voi tuottaa itsensä eli tyhjällä jonolla (jossa n = 0). Esimerkiksi γ γ G T F T F G esimerkin 32 kieliopissa aritmeettisille lausekkeille. 83

Merkkijono γ V on kieliopin G lausejohdos, jos γ voidaan johtaa sen lähtösymbolista S: S γ. G Esimerkiksi (E) a ja (a + a) a ovat lausejohdoksia esimerkin 32 kieliopissa aritmeettisille lausekkeille. Kieliopin G lause on sellainen sen lausejohdos, joka koostuu pelkästään sen päätemerkeistä: S γ ja γ Σ. G Esimerkiksi (a + a) a on lause esimerkin 32 kieliopissa aritmeettisille lausekkeille. Kieliopin G tuottama tai kuvaama kieli koostuu sen lauseista: { } L(G) = γ Σ : S γ. G Eli L(G) on kaikkien niiden lauseiden (merkkijonojen) joukko, jotka voidaan tuottaa kieliopilla G aloittamalla sen lähtösymbolista S. Määritelmä 7. Formaali kieli L Σ on kontekstiton, jos se voidaan tuottaa jollakin kontekstittomalla kieliopilla. Kontekstista Sana konteksti (englanniksi context ) on suomeksi lauseyhteys. Siten sanan kontekstiton tilalla käytetäänkin joskus sanoja yhteydetön tai yhteysvapaa. Kontekstiton viittaa siihen, että kieliopin säännöt ovat muotoa A ω, mikä voidaan tulkita siten, että muuttuja A voi tuottaa merkkijonon ω, olipa sen ympärillä mitä tahansa. Sääntöjä siis voidaan soveltaa kontekstista riippumatta. Kontekstittoman kieliopin yleistys on konteksti(lli)nen kielioppi (context-sensitive grammar). Tällaisen kieliopin säännöt ovat muotoa αaβ αωβ jossa α, β, ω V. Tällainen sääntö tulkitaan siten, että muuttuja A voidaan korvata merkkijonolla ω jos sen edessä on α ja perässä β eli jos A on lauseyhteydessä α...β. Lisäksi vaaditaan että Esimerkiksi kieli säännön vasemman puolen pituus sen oikean puolen pituus. (4) {a n b n c n : n N} ei ole kontekstiton, mutta se voidaan esittää käyttämällä kontekstisia sääntöjä. 84

Kontekstisia kielioppeja ei käsitellä tällä kurssilla. Nekin ovat silti kiintoisia... automaattien teoriassa: Kuten jo vihjattiin, kontekstittomat kielet voidaan tunnistaa automaateilla joilla on tavallinen pino. Kontekstiset taas automaateilla joilla on avopino. laskennan vaativuusteoriassa: Kontekstiset kielet ovat ne, jotka voidaan tunnistaa käyttämällä realistinen eli polynominen määrä muistia. Jos pituusehdosta (4) luovutaan, niin saadaan edelleen rajoittamattomat kieliopit ja kielet, ja silloin saavutetaan laskettavuuden ääriraja. Vakiintuneita merkintätapoja Välikesymboleita merkitään isoilla kirjaimilla: A, B, C,..., S, T Päätemerkkeinä käytetään pieniä kirjaimia a, b,c,...,s,t; numeromerkkejä 0, 1,...,9; erikoismerkkejä; varattuja sanoja kuten if,for,end,... lihavoituina tai alleviivattuina. Mielivaltaisina merkkeinä (kun välikkeitä ja päätemerkkejä ei erotella) käytetään X, Y, Z. Päätemerkkijonoina käytetään u, v, w, x, y, z. Sekamerkkijonoina käytetään α, β, γ,...,ω. Kielioppi esitetään usein pelkkänä sääntöjoukkona: Tällöin A 1 ω 11... ω 1k1 A 2 ω 21... ω 2k2. A m ω m1... ω mkm välikesymbolit päätellään joko edellisten merkintäsopimusten mukaan tai siitä, että ne esiintyvät sääntöjen vasempina puolina lähtösymboli on ensimmäisen säännön vasempana puolena esiintyvä välike; tässä siis A 1. Esimerkki 33. Sisäkkäisten sulkujonojen muodostaman kielen L ( ) = {( k ) k k 0} tuottaa kielioppi G ( ) = ({S, (, )}, {(, )}, {S ε, S (S)}, S) Esimerkki 34. Tasapainoisten sulkujonojen muodostaman kielen tuottaa kielioppi G ( ) = ({S, (, )}, {(, )}, {S ε, S (S), S SS}, S) Esimerkiksi ()(()) on tasapainoinen muttei sisäkkäinen sulkujono. Tämän mahdollistaa uuden säännön lisäämisen edellisen esimerkin 33 kielioppiin. 85

Esimerkki 35. Kielen {a i b k c k i, k = 0, 1,...} voi tuottaa kieliopilla G = (V, Σ, P, S), jossa V = {S,A, B,a, b,c} Σ = {a, b,c} P = {S AB, A aa, A ε, B bbc, B ε}. Esimerkki 36. Yksinkertaisten aritmeettisten lausekkeiden muodostaman kielen L expr tuottaa kielioppi G expr = (V, Σ, P,E) (5) jossa V = {E,T, F,a, +,, (, )}, Σ = {a, +,, (, )}, P = {E T, E E + T, T F, T T F, F a, F (E)}. Kieliopilla (5) voidaan johtaa esim. seuraavat lausejohdokset: E G E + T G T + T G T F + T G F F + T G a F + T G a (E) + T G a (T) + T G a (F) + T G a (a) + T G a (a) + F G a (a) + a. Toinen kielioppi kielen L expr tuottamiseen on jossa V = {E,a, +,, (, )}, Σ = {a, +,, (, )}, G expr = (V, Σ, P,E) (6) P = {E E + E, E E E, E a, E (E)} Esimerkki 37. Tarkastellaan suomen kielen virkettä, joka koostuu yksinkertaisesta päälauseesta sekä nollasta tai useammasta sisäkkäisestä relatiivilauseesta: L rel = {subj( joka pred attr obj) pred attr obj} 86

Tällaisia virkkeitä voidaan tuottaa esim. seuraavilla kontekstittoman kieliopin G rel säännöillä: VIRKE SUBJ SL PRED ATTR OBJ SL joka PRED ATTR OBJ SL ε SUBJ poika tyttö jänis susi peikko PRED pelkäsi metsästi ATTR suurta pientä vihaista hirmuista arkaa OBJ poikaa tyttöä jänistä sutta peikkoa Mitä virkkeitä voit johtaa lähtösymbolista VIRKE? Esimerkiksi: Kontekstittomat kieliopit ovat luontaisia positionaalisille kielille, jossa kuka teki mitä kenelle ilmaistaan niiden paikoilla lauseessa. Esimerkiksi englannin kielessä on sanajärjestys on valtaosin subjekti-verbiobjekti (SVO) kuten yllä. Mutta suomen kielessä sanajärjestys onkin vapaa ja kuka teki mitä kenelle ilmaistaankin sijamuodoilla. Esimerkki 38. Ohjelmointikielten syntaksin kuvaus. Pascalin osajoukko: lause ehtolause koottu-lause sijoitus kutsu ehtolause if ehto then lause else lause ehto x=0 koottu-lause begin lausejono end lausejono lause lause ; lausejono sijoitus x:=0 kutsu a b c Tästä on hyötyä ohjelmoijalle (syntaksi pitää osata, jos aikoo ohjelmoida), mutta myös kääntäjä (tai yksi sen osa, jäsentäjä (englanniksi parser )) voidaan laatia suoraviivaisesti perustuen kielioppiin. Oletus on, että esim äärellisellä automaatilla (tai transduktorilla) ohjelman lähdekoodi on ensin pilkottu valmiiksi yllä kuvattuihin osiin (varatut sanat, muuttujat, aliohjelmien nimet, vakiot, jne). Tehtävä 36. Laadi kontekstiton kielioppi, joka tuottaa rajattoman monista sisäkkäisistä for-silmukoista, alkeisoperaatioista a ja kokonaislukuvakioista N koostuvat ohjelmointikielen lauseet, kuten for (i=n; i<n; i++) { for (j=n; j<n; j++) { a } } 5.1 Kontekstittomien kielten sulkeumaominaisuuksista Kontekstittomia kielioppeja on helppo tuottaa soveltamalla monia vastaavia operaatioita kuin säännöllisissä lausekkeissa. Huomaa: Kontekstittomat kielet eivät kuitenkaan ole suljettu kaikkien samojen operaatioiden suhteen kuin säännölliset! 87

Lause 8. Jos A ja B ovat kontekstittomia kieliä, niin myös niiden yhdiste A B, tulo AB ja sulkeuma A ovat. Todistus: Tarkastellaan esimerkkinä yhdistettä A B; muut kohdat menevät samaan tapaan. Olkoot siis A ja B aakkoston Σ kontekstittomia kieliä. Siis A = L(G A ) ja B = L(G B ) joillain kontekstittomilla kieliopeilla G A = (V A, Σ, P A, S A ) ja G B = (V B, Σ, P B, S B ). Olkoon S / N A N B. Määritellään G = (V A V B {S}, Σ, P, S), missä P = P A P B {S S A } {S S B }. Selvästi L(G) = A B. Toisaalta, toisin kuin säännöllisten kielten luokka, kontekstittomien kielten luokka ei ole suljettu leikkauksen ja komplementin suhteen. Toisaalta taas jos kieli A on säännöllinen, ja kieli B kontekstiton, niin niiden leikkaus A B on kontekstiton. Joitakin epäsäännöllisiä kieliä, kuten {0 n 1 n : n N} tai {w {0, 1} : w = w R } on helppo tuottaa kontekstittomalla kieliopilla. Toisaalta esimerkiksi kopiokieli {ww: w {0, 1} } ei ole kontekstiton (vaan kontekstinen). Miten keksiä annetulle kielelle kielioppi? On annettu kontekstiton kieli L, ja laadittava sen tuottava kontekstiton kielioppi G. Millaisen kielen määrittely kuvaa? Yritä esittää L useamman yksinkertaisemman kielen yhdisteenä (kuten L = L 1 L 2 L 3 ), tulona (kuten L = L 1 L 2 ) tai sulkeumana (kuten L = (L 1 L 2 ) ). Laadi näille osakielille L 1, L 2,... kieliopit. Olkoot niiden alkusymbolit S 1, S 2 ja S 3. Laadi sitten koko kielen L kielioppi seuraavasti: Muita usein toistuvia rakenteita: Kieli Säännöt L = L 1 L 2 L 3 S S 1 S 2 S 3 L = L 1 L 2 S S 1 S 2 L = (L 1 ) S S 1 S ε L = (L 1 L 2 ) S SA ε, A S 1 S 2 Sääntö Kieli A a b {a, b} A aa ε L(a ) = {ε, a,aa, aaa,...} B bbc ε {b n c n : n = 0, 1, 2,...} B bbbc ε {b 2n c n n = 0, 1,...} Tehtävä 37. Laadi kielioppi seuraaville kielille: 88

1. 01 10 2. 0 1(0 1) 3. {0 n 1 n : n N} {1 n 0 n : n N} 4. {ww R : w {0, 1} } 5. {w {0, 1} : w = w R } 5.2 Säännölliset kielet ja kontekstittomat kieliopit Säännölliset kielet sisältyvät aidosti kontekstittomiin kieliin, jotka vuorostaan sisältyvät aidosti kontekstisiin kieliin. Siis jokainen säännöllinen kieli voidaan kuvata kontekstittomalla kieliopilla jopa lineaarisella kontekstittomalla kieliopilla, jonka rakenne on yksinkertaisempi kuin yleinen kontekstiton kielioppi. tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet tunnistus: äärellinen automaatti rajallinen muisti äärelliset kielet Lineaariset kieliopit Määritelmä 8. Kontekstiton kielioppi on oikealle lineaarinen jos sen kaikki produktiot ovat muotoa A ε tai A ab, ja vasemmalle lineaarinen jos sen kaikki produktiot ovat muotoa A ε tai A Ba. Intuitiivisesti kielioppi on oikealle lineaarinen jos välikesymboli saa esiintyä vain säännön oikeassa laidassa eikä missään muualla. Oikealle lineaariset kieliopit ja epädeterministiset äärelliset automaatit vastaavat toisiaan. 5.2.1 Äärellistä automaattia vastaava lineaarinen kielipppi Lause 9. Jokainen säännöllinen kieli voidaan tuottaa oikealle lineaarisella kieliopilla. Todistus: Olkoon kieli L Σ säännöllinen, ja M = (Q, Σ, δ,q 0, F) sen tunnistava äärellinen automaatti. Ideana on muodostaa kielioppi G M joka tuottaa samat merkkijonot jotka M tunnistaa. Silloinhan L(G M ) = L(M) = L kuten halutaan. Siten kieliopin G M pääteaakkostoksi on valittava automaatin M syöteaakkosto eli Σ. 89

Luodaan kielioppiin G M oma välike A q jokaiselle automaatin M tilalle q Q. Muita välikkeitä ei kielioppiin G M tule. Kieliopin L G lähtösymboliksi tulee A q0 eli automaatin M alkutilaa q 0 vastaava välike. Kieliopin G M säännöt suunnitellaan oikealle lineaarisiksi ja siten, että siinä on lausejohdos ua p täsmälleen silloin kun automaatissa M päästään alkutilasta q 0 tilaan p lukemalla syötemerkkijono u Σ. Tai toisin merkiten, kieliopin G M lausejohdokset ovat muotoa ua δ (p 0,u). Tämä saavutetaan siten, että jokainen automaatin M siirtymä p c q tuottaa kielioppiin G M säännön A p ca q. Silloinhan ua p G M uca q kuten halusimmekin. Automaatin M pysähtyminen esitetään siten, että lausejohdoksen oikeassa laidassa oleva ainoa välike katoaa; silloinhan merkkijono u on sellainen jonka M hyväksyy, joten sen pidentäminen lisämerkeillä c voidaan lopettaa. Siis siten, että kielioppiin G M lisätään sääntö A q ε jokaiselle automaatin M hyväksyvälle tilalle q F. Kielioppi G M on nyt valmis. Esimerkki 39. Kuvassa on yksinkertainen äärellinen automaatti, joka hyväksyy kielen L = {w {a, b} : wsisältää vähintään yhden merkin b}. a a, b b 1 2 Automaattia vastaava kielioppi on: A 1 aa 1 ba 2 A 2 ε aa 2 ba 2 5.2.2 Lineaarista kielioppia vastaava äärellinen automaatti Lause 10. Jokainen oikealle lineaarisella kieliopilla tuotettava kieli on säännöllinen. Todistus: Tehdään edellisen lauseen 9 todistuksen konstruktio toiseen suuntaan. Olkoon siis G = (V, Σ, P, S) oikealle lineaarinen kielioppi. Muodostetaan kielen L(G) tunnistava epädeterministinen äärellinen automaatti M G = (Q, Σ, δ,q S, F) seuraavasti: Tilat vastaavat kieliopin välikkeitä: Q = {q A : A V \ Σ} 90

d +, d q S q A q B d Kuva 17: Kokonaislukuautomaatti niiden kieliopista. Alkutila on lähtösymbolia S vastaava tila q S. Syöteaakkosto on pääteaakkosto Σ. Siirtymäfunktio δ jäljittelee produktioita siten, että produktiosta A ab tulee siirtymä q A a q B (eli q B δ(q A, a)). Lopputiloja ovat ne tilat, joita vastaaviin välikkeisiin liittyy ε-produktio: F = {q A Q: A ε P } Yhteenvetona lineaaristen kielioppien ja äärellisten automaattien vastaavuuksista: Äärellinen automaatti Lineaarinen kielioppi tila q välikesymboli A q lähtötila q 0 lähtösymboli A q0 siirtymä q a q sääntö A q aa q hyväksyvä tila q F sääntö A q ε Esimerkki 40. Olkoon d lyhenne lukumerkille {0, 1,..., 9}. Tarkastellaan seuraavaa oikealle lineaarista kielioppia: S +A A db A db B db ε Automaattiin tulee kolme tilaa: q S, q A ja q B. Lähtösymbolia S vastaa alkutila q S ja säännöstä B ε tiedämme, että q B on (ainoa) lopputila. Muita sääntöjä vastaavat tilasiirtymät q S + q A q S q A q S d q B q A d q B q B d q B Tuloksena saadaan kuvan 17 tuttu automaatti, joka tunnistaa etumerkilliset kokonaisluvut. 91

Tehtävä 38. Piirrä seuraavia kielioppeja vastaavat äärelliset automaatit: 1. Lauseke: a, kielioppi: S as ε. 2. Lauseke: a + = aa, kielioppi: S as a. 3. Lauseke: (ab a) bb, kielioppi: S aa bb A as ba B bb ε 4. Lauseke: (aa), kielioppi: S asa ε. 5. Lauseke: (b ab ab ), kielioppi: S bs aa ε A ba ab B bb aa ε Kielioppi voisi olla myös: S BaBaBS ε B bb ε 6. Lauseke: (0 1... 9)(0 1... 9), kielioppi: S DN N DN ε D 0 1... 9 Muita sovelluksia ovat esimerkiksi pseudotiedettä suoltava puppugeneraattori http: //pdos.csail.mit.edu/scigen/......sekä kasvikieliopit (nimeltään L- eli Lindenmayer-systeemit): 92

Vastaavantapaisia, hyödyllisempiä, sovelluksia on muitakin, kuten neuroverkkojen rakenteen generointi kieliopilla (joka on voitu generoida vaikkapa geneettisillä algoritmeilla), yms. 5.3 Pinoautomaatti Pinoautomaatti (push-down automaton, PDA) on äärellinen automaatti, johon on lisätty rajoittamaton määrä muistia pinon muodossa kuvan 18 tapaan. Muistutus kurssilta TRA: Pino on tietorakenne, jolla on seuraavat operaatiot: Luo tyhjä pino. Testaa onko pino tyhjä vai onko siinä tietoalkioita. Vie pinoon jokin tietoalkio x eli operaatio push(x). Poista epätyhjästä pinosta sinne viimeiseksi viety tietoalkio eli operaatio pop. Pinon avulla voidaan pitää kirjaa luetuista merkeistä ja tehdä monia muitakin asioita... Kielen voi tunnistaa pinoautomaatilla täsmälleen silloin kun se on kontekstiton. Syöte hyväksytään jos sen lopussa ollaan hyväksyvässä tilassa. Esimerkki 41. Epäsäännöllisen kielen {0 n 1 n : n N} voi hyväksyä pinon avulla seuraavaan tapaan: 1 alussa pino on tyhjä 2 while seuraava luettu syötemerkki on 0 3 do push(0) 4 while seuraava luettu syötemerkki on 1 and pino ei ole tyhjä 5 do pop 6 return onko koko syöte luettu and pino jälleen tyhjä Sehän tutkii, vastaako jokaista syötteestä pinoon kopioitua merkkiä 0 syötemerkki 1. 93

syötenauha tutkittava syöte a a a a b b b b... nauhapää ohjausyksikkö q 0 q 3 q 1 q 2 δ A A A A_ pino Kuva 18: Kaavakuva pinoautomaatista. Pinoautomaatin formaali määritelmä Määritelmä 9. Pinoautomaatti on kuusikko M = (Q, Σ, Γ, δ,q 0, F) jossa Q on tilojen äärellinen joukko; Σ on äärellinen syöteaakkosto; Γ on äärellinen pinoaakkosto; funktio δ : Q (Σ {ε}) (Γ {ε}) P(Q (Γ {ε})) on (joukkoarvoinen) siirtymäfunktio; q 0 Q on alkutila; ja F Q on hyväksyvien tilojen joukko. Siirtymäfunktion tyyppi Siirtymäfunktiolla δ(q, σ, γ) on nyt 3 argumenttia: 1. q Q on nykyinen tila, kuten aikaisemminkin; 94

2. σ Σ on seuraava syötemerkki, kuten aikaisemminkin; ja 3. γ Γ on pinon päällimmäinen merkki. Jokaisella askeleellaan pinoautomaatti siis voi käyttää näitä kaikkia kolmea tietoa valitessaan mitä tehdä seuraavasti......mutta sen ei ole pakko käyttää seuraavaa syötemerkkiä σ ja/tai pinon päällimmäistä merkkiä γ: Jos merkkiä ei käytetä, niin sen tilalla on argumenttina ε. Jos merkki käytetään, niin se myös kulutetaan: siis seuraava syötemerkki σ luetaan pois syötteestä ja/tai pinon päällimmäinen merkki γ popataan pois pinosta. Siirtymäfunktion arvo δ(q, σ, γ) on (äärellinen) joukko pareja (q, γ ) joissa q Q on pinoautomaatin seuraava tila, ja γ Γ on pinoon seuraavaksi pushattava merkki. Kuten γ yllä, myös tämä γ voi puuttua, ja silloin sen tilalla onkin ε. Siirtymäfunktion arvot Koska seuraava syötemerkki σ, pinon päällimmäinen merkki γ ja seuraava pinoon vietävä merkki γ voivat myös puuttua, siirtymiä on yhteensä 8 erilaista: 1. (q, γ ) δ(q, σ, γ) eli mikään niistä ei puutu: 1 lue syötteestä sen seuraava merkki σ 2 poppaa γ pois pinosta 3 pushaa γ pinoon Siten merkki σ luetaan syötteestä ja merkki γ pinon päällä korvautuu merkillä γ. 2. (q, γ ) δ(q, σ, ε) eli vain γ puuttuu: Vain rivi 2 jää pois, eli merkki σ luetaan syötteestä ja pino kasvaa merkillä γ. 3. (q, γ ) δ(q, ε,γ) eli vain σ puuttuu: Vain rivi 1 jää pois, eli syötettä ei lueta mutta merkki γ korvautuu pinon päällä merkillä γ. 4. (q, ε) δ(q, σ, γ) eli vain γ puuttuu: Vain rivi 3 jää pois, eli merkki σ luetaan ja merkki γ poistuu pinon päältä. 5. (q, ε) δ(q, σ, ε) eli vain σ on jäljellä: Vain rivi 1 jää jäljelle, eli merkki σ luetaan mutta pino ei muutu. 6. (q, ε) δ(q, ε,γ) eli vain γ on jäljellä: Vain rivi 2 jää jäljelle, eli syötettä ei lueta mutta merkki γ poistuu pinon päältä. 7. (q, γ ) δ(q, ε,ε) eli vain γ on jäljellä: Vain rivi 1 jää jäljelle, eli syötettä ei lueta mutta pino kasvaa merkillä γ. 8. (q, ε) δ(q, ε,ε) eli kaikki ne puuttuvat: Automaatti siirtyy tilasta q tilaan q lukematta syötettään tai muuttamatta pinoaan eli tekee ε-siirtymän. 95

Pinoautomaatin laskennan eteneminen Pinoautomaatin M tilanne on kolmikko (q, w,α) Q Σ Γ eli siinä on nykyinen tila q Q vielä lukematon syöte w Σ pinon nykyinen sisältö α Γ kirjoitettuna merkkijonoksi siten, että sen päällimmäinen merkki tulee ensimmäisenä (vasemmalta oikealle lukiessa) jne. Alkutilanne syötteellä x on kolmikko (q 0, x,ε) eli pino on alussa tyhjä. Tilanne (q, σw, γα), jossa σ Σ {ε} γ Γ {ε}, ja voi johtaa suoraan tilanteeseen (q, w,γ α) jos Tätä merkitään (q, γ ) δ(q, σ, γ). (q, σw, γα) (q, w,γ α). M Tilanne (q 0, w 0, α 0 ) voi johtaa tilanteeseen (q n, w n, α n ) jos on olemassa tilannejono (q 0, w 0, α 0 ) (q 1, w 1, α 1 ) (q 2, w 2, α 2 ) M M M Tätä merkitään (q 0, w 0, α 0 ) (q n, w n, α n ). M Pinoautomaatti M hyväksyy syötemerkkijonon x Σ jos joillakin q F F ja α Γ. (q 0, x,ε) (q F, ε,α) M (q n, w n, α n ). M Toisin sanoen, jos sen alkutilanne syötteellä x voi johtaa johonkin sellaiseen tilanteeseen, jossa koko syöte x on luettu ja ollaan jossakin hyväksyvässä tilassa q F. Muuten M hylkää tämän syötteen x. Pinoautomaatin hyväksymä kieli on L(M) = {x Σ : M hyväksyy syötteen x} eli sen hyväksymät syötemerkkijonot x. 96

Epäoleellisia yksityiskohtia Tässä määritelmässä pinon ei tarvitse olla tyhjä laskennan päättyessä. Toisissa lähteissä taas vaaditaan pinonkin olevan tyhjä (eli α = ε) ennen kuin voidaan hyväksyä. Tämä ei kuitenkaan ole oleellinen ero, koska voimmehan lisätä loppuun silmukan joka tyhjentää pinon. Tässä määritelmässä ei ole testiä onko pino tyhjä vaiko ei? Tällainen testi on kuitenkin helppo lisätä tarvittaessa: Lisätään pinoaakkostoon Γ uusi symboli $ ja aloitetaan automaatin laskenta viemällä se pinon pohjimmaiseksi merkiksi. Sen jälkeen voidaan tämä testi suorittaa kysymällä onko pinon päällimmäinen merkki $ vaiko ei kunhan sitä ei koskaan poisteta pinosta (paitsi juuri ennen syötteen x hyväksymistä, mikäli pino pitää tyhjentää ennen sitä kuten yllä). Kaksi pinoa olisi liikaa Jos pinoaakkostossa Γ on pohjamerkin $ lisäksi vain yksi muu merkki, niin silloin kyseessä on yksilaskuriautomaatti (one-counter automaton): Sellaisella pinolla voi ylläpitää yhtä laskuria N ja kysyä onko sen arvo = 0 vaiko > 0. Käytimme tätä ominaisuutta aikaisemmassa esimerkissä 41. Yhdellä laskurilla voi tunnistaa joitakin epäsäännöllisiä kieliä, mutta ei kaikkia kontekstittomia kieliä. Olemme määritelleet automaatin, jolla on yksi pino. Entäpä jos pinoja olisikin useampia? Ehkä yllättäen: Jo kahdella pinolla hyppäisimme kontekstittomista kielistä aina rekursiivisesti lueteltaviin kieliin saakka eli laskettavuuden äärirajoille. Entäpä jos sallisimmekin useampia laskureita nehän ovat yleisiä pinoja yksinkertaisempia? Ehkä vieläkin yllättävämmin: Jo kahdella laskurillakin hyppäisimme yhtä kauas. Pinoautomaatin tilasiirtymäkaavio Pinoautomaatille voidaan piirtää muuten samanlainen tilasiirtymäkaavio kuin äärelliselle automaatillekin, mutta nyt tilasiirtymänuoli koristellaankin (pelkän syötemerkin a Σ sijaan) kolmella eri tiedolla: q σ,γ/γ q tarkoittaa, että pinoautomaatti voi siirtyä tilasta q Q tilaan q Q lukemalla seuraavan syötemerkin σ Σ ja korvaamalla pinossa sen päällimmäisen merkin γ Γ merkillä γ Γ. (Kuva 19.) Kukin näistä eri tiedoista σ, γ ja γ voi myös puuttua, jolloin sen tilalla onkin ε. 97

q Tila q q 0 Alkutila Hyväksyvä tila Hylkäävä lopputila a, γ/γ q q Tilasiirtymä δ(q, a,γ) = (q, γ ) Kuva 19: Pinoautomaatin tilasiirtymäkaavion merkinnät. Esimerkki 42. Kieli {a k b k : k 0} voidaan tunnistaa seuraavanlaisella pinoautomaatilla M = ({q 1, q 2, q 3, q 4 }, {a, b}, {a, $}, δ,q 1, {q 1, q 4 }) jossa on käytetty pinon pohjamerkkiä $. δ(q 1, ε,ε) = {(q 2, $)}, δ(q 2, a,ε) = {(q 2, a)}, δ(q 2, b,a) = {(q 3, ε)}, δ(q 3, b,a) = {(q 3, ε)}, δ(q 3, ε, $) = {(q 4, ε)}, δ(q, σ, γ) = muilla (q, σ, γ). ε, ε/$ q 1 q 2 q 4 q 3 ε, $/ε b, a/ε a, ε/a b, a/ε Esimerkiksi syötteellä aabb esimerkin 42 automaatilla on seuraava laskenta: (q 1, aabb,ε) (q 2, aabb, $) (q 2, abb,a$) (q 2, bb,aa$) (q 3, b,a$) (q 3, ε, $) (q 4, ε,ε). Koska q 4 F = {q 1, q 4 }, on siis aabb L(M). 98

5.3.1 Deterministiset ja epädeterministiset pinoautomaatit Determinismin intuitio on, että laskulaitteella on aina korkeintaan yksi mahdollinen seuraava askel Epädeterminismin intuitio taas on, että mahdollisia askeleita onkin useita, ja laskulaite arvaa tai tietää mikä niistä on tällä hetkellä se oikea valinta, joka aikanaan johtaa syötteen hyväksymiseen. Määritelmä 10. Pinoautomaatti M on deterministinen, jos jokaisella tilanteella (q, w, α) on korkeintaan yksi mahdollinen seuraaja (q, w, α ), jolla (q, w,α) (q, w, α ). M Tämän määritelmän 10 mukaan pinoautomaatti on epädeterministinen, jos siinä on kaksi eri siirtymää p σ 1,δ 1 /δ 1 p σ 2,δ 2 /δ 2 joilla σ 1 σ 2, δ 1 δ 2 ja δ 1 δ 2, missä a b tarkoittaa että merkit a ja b ovat samat tai ainakin toinen niistä on ε. Silloin automaatti voisi soveltaa sopivassa tilanteessa kuten (p, σ 1 σ 2...,γ 1 γ 2...) kumpaa tanhansa niistä ja ne johtaisivat kahteen eri seuraavaan tilanteeseen. Huomaa, että tämän määritelmän 10 mukainen epädeterministinen pinoautomaatti ei välttämättä koskaan oikeasti teekään epädeterminististä arvausta: Vaikka siinä olisikin kaksi tällaista siirtymää, niin sen rakenne voikin kokonaisuudessaan olla sellainen, ettei tällaista sopivaa tilannetta koskaan ilmene sen laskennoissa esimerkiksi jos tilassa q ei koskaan pino olekaan muotoa γ 1 γ 2.... Huomaa: Toisin kuin äärelliset automaatit, epädeterministiset pinoautomaatit ovat tunnistusvoimaltaan aidosti vahvempia kuin deterministiset! Eli on olemassa kontekstittomia kieliä, jotka voidaan tunnistaa jollakin epädeterministisellä muttei millään determistisellä pinoautomaatilla. Eräs tällainen kieli on { ww R : w {a, b} }. (7) Intuitiivisesti, epädeterministinen pinoautomaatti arvaa tai tietää syötteensä keskikohdan, jossa sen alkuosa w on luettu ja voidaan alkaa lukemaan sen loppuosaa w R. Deterministisen automaatin pitäisi jotenkin pystyä havaitsemaan tämä keskikohta omin päin ja siihen se ei pystykään. Mutta jos tämä keskikohta onkin merkitty, niin kielestä tuleekin deterministinen: { wcw R : w {a, b} }. Toinen tapa ajatella tätä eroa on, että epädeterminististä pinoautomaattia ei välttämättä pystykään determinisoimaan. Intuitiivisesti kyse on seuraavasta: Tilanne: Epädeterministisen pinoautomaatin yksi siirtymä haluaa pushata jotakin pinoonsa kun taas toinen popata jotakin pois siitä. 99

Ongelma: Mitä determinisoidun automaatin pitäisi silloin tehdä? Senhän pitäisi jotenkin pystyä seuraamaan molempia vaihtoehtoja! Esimerkki 43. Epädeterministinen kontekstiton kieli (7) voidaan tunnistaa seuraavalla periaatteella: 1. Syötteen ensimmäisen puolikkaan ajan laitetaan merkkejä pinoon. 2. Syötteen keskikohta arvataan epädeterministisesti. 3. Syötteen toisen puolikkaan ajan poimi merkkejä pinosta ja vertaa juuri luettuun merkkiin. ε, ε/$ q 1 q 2 a, ε/a b, ε/b ε, ε/ε q 4 ε, $/ε q 3 a, a/ε b, b/ε Esimerkiksi syötteellä abba esimerkin 43 epädeterministisellä pinoautomaatilla on seuraava hyväksyvä laskenta: (q 1, abba,ε) (q 2, abba, $) (vaihe 1) (q 2, bba,a$) (q 2, ba,ba$) (arvaus 2) (q 3, ba,ba$) (vaihe 3) (q 3, a,a$) (q 3, ε, $) (q 4, ε,ε) jonka lopputila q 4 F = {q 1, q 4 } on siis hyväksyvä. Deterministinen kontekstiton kieli Määritelmä 11. Kontekstiton kieli on deterministinen, jos se voidaan tunnistaa jollakin deterministisellä pinoautomaatilla, muuten se on epädeterministinen. Esimerkiksi edellä tarkasteltu kieli (7) ja kieli ovat epädeterministisiä. L 2 = { a n b m c k : n m tai m k } Deterministiset kielet ovat tärkeä kieliluokka, sillä ne voi hyväksyä eli jäsentää tehokkaammin kuin epädeterministiset kielet. Siksi jos voimme itse suunnitella kielen (kuten vaikkapa määritellessämme uutta ohjelmointikieltä) teemme siitä deterministisen. 100

1. Alusta pinon sisällöksi S$, jossa S on kieliopin lähtösymboli ja $ pinon pohjamerkki. 2. Toista seuraavaa: (a) Jos pinon huipulla on muuttujasymboli A, niin valitse epädeterministisesti jokin sääntö A w. Korvaa A merkkijonolla w. (b) Jos pinon huipulla on päätesymboli, niin poista se pinosta ja vertaa seuraavaan syötemerkkiin. Jos ne eroavat, hylkää. (c) Jos pino on tyhjä (eli sen huipulla on $) niin hyväksy jos syötekin on loppu; muuten hylkää. Kuva 20: Generoi-ja-testaa -algoritmi. 5.3.2 Pinoautomaatit ja kontekstittomat kielet Lause 11. Kaikki kontekstittomat kielet voidaan tunnistaa (epädeterministisillä) pinoautomaateilla ja kaikki pinoautomaattien tunnistamat kielet ovat kontekstittomia. Todistus: On menetelmät, joilla voi muuntaa mielivaltaisen kontekstittoman kieliopin pinoautomaatiksi ja päinvastoin. 1. Ensin esitetään muunnos kieliopista automaatiksi. 2. Sitten luonnostellaan myös päinvastainen muunnos automaatista kieliopiksi. Kieliopista pinoautomaatiksi Perusidea on laatia annetun kieliopin pohjalta pinoautomaatti, joka toteuttaa seuraavan algoritmin: Generoi: Tuota epädeterministisesti pinoon merkkijono w Σ, jolla S w. Testaa: Vertaa pinon merkkijonoa w syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin hyväksy. Toisin sanoen, generointivaihe arvaa minkä syötteen automaatti sai, ja testausvaihe tarkistaa että arvaus meni oikein. Epädeterminismi on oleellista: valitsemalla generoimisvaiheessa sovellettavat säännöt epädeterministisesti varmistetaan, että jokaisella kieleen kuuluvalla merkkijonolla w on mahdollisuus tulla tuotetuksi. 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 kuvan 20 tarkennettu algoritmi joka pitää vielä koodata pinoautomaatiksi. Tämän pinoautomaatin pinoaakkostoksi tulee siis kieliopin koko aakkosto sekä pinon pohjamerkki Γ = V {$} (jossa siis $ V ). 101

syöteaakkostoksi tulee puolestaan kieliopin päätemerkkien joukko Σ. Esimerkki 44. Tarkastellaan kielioppia S Sa T T btc ε ja merkkijonoa bbcca, joka voidaan johtaa seuraavasti: S Sa Ta btca bbtcca bbcca. Haluamme siis muodostaa esimerkissä 44 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 kuten vieressä: jäljellä oleva syöte pinon sisältö bbcca ε bbcca $ bbcca S$ bbcca Sa$ bbcca Ta$ bbcca bt ca$ bcca Tca$ bcca bt cca$ cca Tcca$ cca cca$ ca ca$ a a$ ε $ ε ε Otamme käyttöön merkinnän (q, γ ) δ(q, σ, γ) myös siinä tapauksessa, että γ = g 1 g 2 g 3...g m Γ onkin kokonainen m pinomerkin jono (kun aiemmin sallittiin vain korkeintaan yksi pinomerkki eli m 1). Tämä merkintä luetaan seuraavasti: Jos automaatti on tilassa q, niin voidaan siirtyä tilaan q lukemalla syötemerkki σ ja korvaamalla pinon päällä pinomerkki γ tällä pinomerkkijonolla g 1 g 2 g 3...g m. Automaattina tämä tulkitaan kuten alla. σ,γ/g 1...g m σ,γ/g m ε, ε/g m 1 ε, ε/g 1 q q q q Huomaa: Pinomerkkijono viedään pinoon takaperin eli push(g m ); push(g m 1 ); push(g m 2 );...; push(g 1 ) jotta pinon päälle muodostuu tämä haluttu pinomerkkijono g 1 g 2 g 3...g m etuperin. Automaattiimme tulee alkutila q start toistotila q loop, hyväksyvä tila sekä muita tiloja. 1. Toteutettavan algoritmimme kuvassa 20 ensimmäinen askel oli pinon alustus. Se voidaan toteuttaa seuraavasti: 102

start ε, ε/s$ ε, ε/$ ε, ε/s loop start loop 2. Sen toinen askel toisti seuraavaa: (a) Jos pinon huipulla on muuttujasymboli A, niin valitse epädeterministisesti sääntö A w. Korvaa A merkkijonolla w. Siis kaikilla säännöillä A w lisätään siirtymä: loop ε, A/w Nyt käytetään siis äsken käyttöön otettua merkintää, jolla pinoon viedään kokonainen pinomerkkijono w, eli silmukalle ilmestyy w 1 välitilaa, joita tässä kuvassa ei näy. (b) Jos pinon huipulla on päätesymboli, poista se pinosta ja vertaa seuraavaan syötemerkkiin. Jos ne eroavat, hylkää. Siis kaikilla päätemerkeillä a Σ tulee siirtymä: loop a, a/ε (c) Jos pinon huipulla on $, hyväksy jos syöte on loppu; muuten hylkää. loop ε, $/ε Muita siirtymiä ei tule, eli automaattimme on nyt valmis. Tehtävä 39. Muunna kielioppi S Sa T T btc ε pinoautomaatiksi. Pinoautomaatista kieliopiksi Hahmotellaan myös muunnos toiseen suuntaan eli annetusta pinoautomaatista sitä vastaavaksi kontekstittomaksi kieliopiksi. Oletetaan yksinkertaisuuden vuoksi, että automaatti tyhjentää pinonsa ennen kuin hyväksyy syötteensä. Oletetaan myös, ettei siinä ole operaatioita korvaa pinon päällä merkki γ merkillä γ. Sellainen operaatio p σ,γ/γ q voidaan nimittäin toteuttaa erillisellä poppush-yhdistelmällä p σ,γ/ε ε,ε/γ q. 103

Ajatellaan sitten, että automaatin jokaiseen siirtymään p σ,γ/γ q on liitetty sivuvaikutuksena tulosta σ, γ/γ. Tässä laatikko ilmaisee, että kunkin tulosteen ajatellaan olevan yksi (mutkikas) merkki. Automaatti siis tulostaa sivuvaikutuksenaan sen, mitä se tekee pinolleen ja syötteelleen. Sitten aletaan laatimaan kielioppia, jotka tuottaa täsmälleen nämä sivuvaikutuksena tulostuvat laatikkomerkkijonot. Laaditaan ensin kielioppi kaikille sellaisille laatikkomerkkijonoille, joissa jokaista push-operaatiota seuraa myöhemmin sen kumoava pop-operaatio. Jokainen tulostuva laatikkomerkkijono on sellainen oletusten nojalla, mutta jokaista sellaista ei automaatti välttämättä voi tulostaa. Tämän kieliopin voi muodostaa samaan tapaan kuin esimerkin 34 tasapainoiset sulkumerkkijonot. Nyt vain sulkumerkkejä on monia erilaisia: push(γ) on avaava sulkumerkki lajia γ ja sitä vastaava pop(γ) on sulkeva sulkumerkki lajia γ. Vastaavasti ASCII-aakkostossa on kolmen eri lajin sulkumerkkipareja:(...),[...] ja {...}. Kieliopiksi saadaan A ε A AA A σ,ε/ε A jokaiselle σ Σ {ε} A σ,γ/ε A σ, ε/γ jokaiselle eri lajille γ Γ. Tulkitaan sitten pinoautomaatti tavalliseksi äärelliseksi automaatiksi, jonka syöteaakkostona ovat nämä laatikot. σ,γ/γ Toisin sanoen, tulkitaan jokainen siirtymä p σ,γ/γ q siirtymäksi p q. Nyt etsimämmäe laatikkomerkkijonokieli on tämän kieliopin tuottaman kielen ja tämän äärellisen automaatin hyväksymän kielen leikkaus. Tässä vaiheessa tekisi mieli vedota aiemmin mainitsemaamme tulokseen, että kontekstittoman ja säännöllisen kielen leikkaus on kontekstiton...... mutta sen todistamisessa voimme vuorostaan tarvita tätä tulosta, jolloin tekisimme kehäpäätelmän! Siksi teemme leikkauksen tässä todistuksessa käsin onneksi kielioppi on yksinkertainen. Otetaan käyttöön välikkeet B p q joiden ylä- ja alaindeksit ovat automaatin tiloja eli p, q Q. 104

Määritellään uusi kielioppi siten, että tällainen välike B p q tarkoittaa niitä laatikkomerkkijonoja jotka voidaan tuottaa välikkeestä A ja jotka voivat esiintyä jollakin polulla tilasta p tilaan q. B p p ε B p r B p qb q r B p r σ,ε/ε B q r σ, ε/γ s sekä tiloille p, q,r, s Q ja pinomer- kaikille siirtymille p keille γ Γ. kaikilla p Q B p s σ,γ/ε B q r σ, ε/γ kaikilla p, q,r Q σ,γ/ε q ja r jokaiselle siirtymälle p σ,ε/ε q ja r Q Nyt etsimämme laatikkomerkkijonokieli voidaan tuottaa lisäämällä lähtösymboli S ja sille säännöt S B p 0 p f joissa p 0 on automaatin alkutila ja p f F mikä tahansa sen hyväksyvä tila. Lopuksi muunnamme vielä laatikkomerkkijonon vastaavaksi syötemerkkijonoksi. Tämä voidaan tehdä lisäämällä jokaiselle laatikkomerkille muuntosääntö σ, γ/γ σ eli tulkitsemalla nekin välikesymboleiksi jota tuottavat siinä luetun syötemerkin σ (tai eivät mitään kun sellaista ei ole eli kun σ = ε). Tehtävä 40. Laadi pinoautomaatti, joka tunnistaa seuraavanlaiset ohjelmointikielen rakenteet: merkkijonossa jokaista avaavaa aaltosulkua { vastaa sulkeva aaltosulku } jokaista else:ä vastaa if, mutta if:iin ei ole pakko liittyä else-haaraa if-lauseen ehto esitetään päätemerkillä c muut komennot esitetään päätemerkillä a, jota seuraa puolipiste ; Laillinen: { } if c { if c a; else a; } Laiton: } if c { if c { a; else a; } Aakkosto koostuu siis seuraavista merkkijonoista: Σ = { {, }, if, else, c, a; }. Kielioppina tämän voi esittää esim. seuraavasti: S {S} if c ST a; T else S ε 105

5.4 Kielioppien jäsennysongelma Annettu kielioppi G ja merkkijono x. Onko x L(G)? Esimerkkejä jäsennysongelmista: Kuuluuko virke jänis joka pelkäsi arkaa peikkoa metsästi suurta sutta esimerkin 37 relatiivilausekieleen L rel? Onko (11 5 + 1) 7 1 laillinen aritmeettinen lauseke? Onko seuraava funktio C-kielen syntaksin mukainen? float laske(int x, int y) { if (x >= y) return x-y; else return y-x; } Kontekstittomien kielten jäsennys on tärkeä osa ohjelmointikielten kääntämisessä. Yleisemmin, jäsentäminen on tapa testata kuuluuko annettu merkkijono annettuun kieleen, riippumatta varsinaisesta sovelluksesta. Jäsentimet Jäsennysongelma voidaan ratkaista jäsennysalgoritmilla eli jäsentimellä eli jäsentäjällä (englanniksi parser mutta suomeksi jäsentäminen ei ole parsimista!). On useita vaihtoehtoisia menetelmiä erityyppisille kieliopeille: Lineaariset kieliopit eli säännölliset kielet: äärellinen automaatti. LL(1)-kielet: Rekursiivinen LL(1)-jäsennin. Deterministiset kielet: deterministinen pinoautomaatti tai rekursiivinen LR(1)- jäsennin. Vahvemmat kontekstittomat kielet: CYK-algoritmi. Ensin tutustumme jäsennyksen peruskäsitteisiin. Johdot Olkoon merkkijono γ V kieliopin G = (V, Σ, P, S) lausejohdos. Sen johdoksi kieliopissa G kutsutaan lähtösymbolista S merkkijonoon γ johtavaa suorien johtojen jonoa S γ 1 γ 2 γ 3 γ Johdon pituus on siihen kuuluvien suorien johtojen määrä eli -askelten lukumäärä. Johto γ γ on vasen johto jos kussakin johtoaskelessa on produktiota sovellettu merkkijonon vasemmanpuoleisimpaan välikkeeseen; sitä merkitään γ γ lm 106

oikea johto jos kussakin johtoaskelessa on produktiota sovellettu merkkijonon oikeanpuoleiseen välikkeeseen; sitä merkitään γ γ. rm Johto ei välttämättä ole oikea eikä vasen, vaan se voi olla niiden sekamuoto (eli joskus lavennetaan vasemman- ja joskus oikeanpuoleisin välike) tai ei kumpaakaan (eli joskus lavennetaan välike joka on vasemman- ja oikeanpuoleisimman välissä). Esimerkki 45. Tarkastellaan kielioppia G expr : E E + T T T T F F F a (E) Lauseelle a + a a voidaan antaa esimerkiksi seuraavanlaiset johdot kieliopissa: (i) E E + T T + T F + T a + T a + T F a + F F a + a F a + a a (ii) E E + T T + T T + T F T + F F F + F F F + a F a + a F a + a a (iii) E E + T E + T F E + T a E + F a E + a a T + a a F + a a a + a a Näistä (i) on vasen johto, (iii) oikea johto ja (ii) ei ole kumpaakaan. Jäsennyspuu Eli syntaksipuu, eli johtopuu (englanniksi parse tree, syntax tree, derivation tree). Vaihtoehtoinen esitystapa johdoille. Kertoo vain, miten välikkeet on lavennettu, ei missä järjestyksessä lavennukset on tehty. Esimerkiksi kaikkia kolmea edellä esimerkissä 45 mainittua johtoa vastaa sama kuvan 21 jäsennyspuu. Määritelmä 12. Olkoon G = (V, Σ, P, S) kontekstiton kielioppi. Kieliopin G mukainen jäsennyspuu on järjestetty puu jolla on seuraavat ominaisuudet: 1. puun solmut on nimetty joukon V {ε} alkioilla siten, että sisäsolmujen nimet ovat välikkeitä (eli joukosta N = V \ Σ); juurisolmun nimenä on lähtösymboli S; lehtisolmujen nimet ovat päätemerkkejä (eli joukosta Σ {ε}); 2. jos A on puun jonkin sisäsolmun nimi, ja X 1,...,X k ovat sen jälkeläisten nimet järjestyksessä (vasemmalta oikealle) niin A X 1...X k on kieliopin G:n produktio. (Järjestetyssä puussa solmun kuten A lasten keskinäisellä järjestyksellä on väliä, eli että sillä on ensimmäinen lapsi nimeltään X 1, toinen lapsi nimeltään X 2, jne.) 107

E E T T T F F F a + a * a Kuva 21: Esimerkki jäsennyspuusta. Jäsennyspuun τ tuotos on se päätemerkkijono, joka saadaan liittämällä yhteen sen lehtisolmujen nimet esijärjestyksessä ( vasemmalta oikealle ). Esimerkiksi edellisen kuvan 21 jäsennyspuun tuotos on a + a a. Jäsennyspuu on hyvä esitys sille miten sen tuotos on saatu kieliopin säännöillä. Tehtävä 41. Muistetaan aiempi kielioppimme: Anna ohjelman johto ja jäsennyspuu. Johdot ja jäsennyspuu lause ehtolause koottu-lause sijoitus kutsu ehtolause if ehto then lause else lause ehto x=0 koottu-lause begin lausejono end lausejono lause lause ; lausejono sijoitus x:=0 kutsu a b c if x=0 then a else begin x:=0 ; b end Lausekkeen johdosta voidaan aina muodostaa jäsennyspuu ja päinvastoin: 108

1. Kun annetaan johto S γ, niin voidaan muodostaa jäsennyspuu τ, jonka tuotos on γ. 2. Kun annetaan jäsennyspuu τ, niin voidaan muodostaa sen tuotoksen γ vasen ja oikea johto S γ ja S γ. lm rm Johdosta jäsennyspuuksi Olkoon annettuna johto S = γ 0 γ 1 γ 2 γ 3 γ n = γ jonka tuotos on γ, niin siitä voidaan muodostaa jäsennyspuu τ seuraavasti: 1 aluksi τ koostuu vain juurisolmusta nimeltään S 2 for j 0, 1, 2,...,n 1 3 do olkoon seuraava johdos γ j+1 saatu nykyisestä johdoksesta γ j korvaamalla sen k:s symboli merkkijonolla g 1 g 2 g 3...g m 4 l k:s lehti puussa τ vasemmalta oikealle laskien 5 synnytä lehdelle l lapset nimiltään g 1, g 2, g 3,...,g m Tämän for-silmukan invariantti on, että nykyinen johdos γ j luettelee aina nykyisen puun τ lehtien nimet vasemmalta oikealle (lukuunottamatta ε-lehtiä). Kun käytetään esimerkin 45 vasenta johtoa (i) ja merkitään jokaisen solmun viereen monesko johdos sen synnytti, niin saadaan: 0 E 1 1 E T 2 5 5 T T F 3 F 6 F 4 1 7 5 8 a + a * a Tehtävä 42. Kielioppi S SS (S) ε tuottaa kaikki oikein muodostetut sulkulausekkeet (siis päätesymbolit ovat vasen ja oikea sulkumerkki). Sulkulauseke on oikein muodostettu, jos vasemmat ja oikeat sulkumerkit voidaan pariuttaa siten, että mikään pari ei mene ristiin. 109

Sulkulausekkeen ()(()()) eräs johto on S SS (S)S ()S ()(S) ()(SS) Piirrä vastaava jäsennyspuu. Jäsennyspuusta johdoiksi ()((S)S) ()(()S) ()(()(S)) ()(()()) Olkoon τ kieliopin G mukainen jäsennyspuu. Siitä saadaan tuotoksensa x vasen johto käymällä puun solmut läpi esi järjestyksessä ( ylhäältä alas, vasemmalta oikealle ) ja laventamalla vastaan tulevat välikkeet järjestyksessä puun osoittamalla tavalla oikea johto käymällä puu läpi käänteisessä esijärjestyksessä ( ylhäältä alas, oikealta vasemmalle ). Yleensä käytämme vasenta johtoa. Oikeaa johtoa käytetään myös tietyn tyyppisten (ohjelmointikielten) kielioppien jäsentämiseen. Tehtävä 43. Kirjoita edellisen tehtävän 42 jäsennyspuuta vastaava oikea johto. Esimerkiksi kun kuvan 21 esimerkkipuumme solmut numeroidaan esijärjestyksessä, niin saadaan 1 E 2 E 7 T 3 8 12 T T F 4 F 9 F 5 6 10 11 13 a + a * a ja vasemman johdon rakentaminen etenee siis tässä numerojärjestyksessä. 110

Menetelmät ovat yksikäsitteisiä Jos muodostetaan annetusta vasemmasta (tai oikeasta) johdosta S x (tai S x) lm rm ensin jäsennyspuu edellä mainitulla tavalla, ja sitten jäsennyspuusta vasen (oikea) johto, niin saadaan takaisin alkuperäinen johto. Lause 12. Olkoon G = (V, Σ, P, S) kontekstiton kielioppi. Tällöin: (i) jokaisella kieliopin G lausejohdoksella γ on sen mukainen jäsennyspuu τ, jonka tuotos on γ; (ii) jokaista kieliopin G mukaista jäsennyspuuta τ, jonka tuotos on päätemerkkijono x, vastaavat yksikäsitteiset vasen ja oikea johto S x ja S x. lm rm Seuraus: Jokaisella kieliopin G lauseella on vasen ja oikea johto. Tai siis kontekstittoman kieliopin tuottamien lauseiden jäsennyspuut, vasemmat ja oikeat johdot vastaavat yksikäsitteisesti toisiaan, joten riittää antaa vain yksi vaihtoehtoisista jäsennyksen esitystavoista. Kieliopin moniselitteisyys Samalla lauseella voi olla kieliopissa useita erilaisia jäsennyksiä. Esimerkiksi lauseella a + a a kieliopissa G expr: E E E + E E E a E E E + E a a a a a Määritelmä 13. Kontekstiton kielioppi G on moniselitteinen (englanniksi ambiguous ), jos jollakin sen lauseella x on kaksi erilaista sen mukaista jäsennyspuuta. Muuten kielioppi on yksiselitteinen ( unambiguous ). Kontekstiton kieli, jonka voi tuottaa vain moniselitteisellä kieliopilla, on luonnostaan moniselitteinen ( inherently ambiguous ). Esimerkki 46. Aritmeettisia lausekkeita kuvaavalle kielelle annettiin kaksi kielioppia. Niistä G expr on yksiselitteinen: E T E + T T F T F F a (E). Se toinen kielioppi G expr nähtiin edellä moniselitteiseksi: E E + E E E a (E) Itse kieli L expr = L(G expr) ei kuitenkaan ole luonnostaan moniselitteinen, koska sillä on myös yksiselitteinen kielioppi G expr. 111