Laskennan perusmallit (LAP)
|
|
|
- Kaisa Tikkanen
- 9 vuotta sitten
- Katselukertoja:
Transkriptio
1 Laskennan perusmallit (LAP) Pekka Kilpeläinen Tietojenkäsittelytieteen laitos, Itä-Suomen yliopisto sähköposti: Lukuvuosi , III periodi
2 Kurssin asema opetuksessa Tietojenkäsittelytieteen pääaineopiskelijoille pakollinen aineopintokurssi (3 op). Esitietovaatimukset: Johdatus tietojenkäsittelytieteeseen (JTT): Laskennan, algoritmin ja tietokoneen käsitteet. Diskreetit rakenteet (DSR): Sovelletaan diskreetin matematiikan peruskäsitteitä, kuten joukkoja, relaatioita, funktioita, puita ja verkkoja. Lisäksi molemmilla kursseilla lähestymistapa ja ajatusmaailma on matemaattinen (eikä esimerkiksi ohjelmointitekninen). Tietorakenteet 1 (TRA1): Käytetään joitakin siellä selostettuja perustietorakenteita, kuten pinoja ja puita. Lisäksi viitataan joihinkin siellä esiteltyihin käsitteisiin, kuten asymptoottiseen aikavaativuuteen.
3 Kiinnostuneille lisää valinnaisilla syventävien opintojen jatkokursseilla: Algoritmien suunnittelu ja analyysi (ASA): Tätä kurssia laajemmat perustiedot ns. P? = NP-ongelmasta sekä teoreettisesta että algoritmisuunnittelun näkökulmasta. Laskennan teoria (LAT): Syvällisemmin tästä ongelmasta ja muistakin tällä kurssilla esitellyistä asioista.
4 Tämä P? = NP-ongelma onkin tunnetuin esimerkki laskennan vaativuusteorian käsittelemistä ongelmista. Yksi (mutta ei läheskään ainoa!) tapa lukea se on: P = sellaiset laskentaongelmat, joiden vastaukset voi laskea tavallisella tietokoneella tehokkaasti NP = voisi jos koneeseen lisättäisiin maaginen konekäsky valitse hyppäätkö nyt riville X vaiko riville Y joka jotenkin aina osaisi valita juuri oikein. Silloin kysymys on: Voisiko tavallinen tietokone aina löytää itsekin oikean valinnan nopeasti? Yleisesti uskotaan, että ei voisi: Uskotaan, että on sellaisia ongelmia ja tilanteita, joissa on väistämättä hidasta löytää se oikea valinta.
5 Tämä P? = NP-ongelma on kuitenkin osoittautunut teoriassa hyvin vaikeaksi ratkaista se on yhä avoin, ja on saatu tuloksia ainakaan menetelmällä X sitä ei voi ratkaista erilaisille lähestymistavoille X. käytännössä merkittäväksi, koska monet käytännön ongelmat ovat osoittautuneet ns. NP-vaikeiksi, eli sellaisiksi että jos yksikin niistä voitaisiin ratkaista tehokkaasti (eli se kuuluisi luokkaan P) niin sen avulla ne kaikki muutkin voitaisiin ratkaista tehokkaasti. Clay Mathematics Institute onkin valinnut sen yhdeksi seitsemästä Millennium-ongelmastaan, ja antaa sen ratkaisusta palkinnoksi USD! ( Jo tietojenkäsittelijän yleissivistykseen kuuluu tuntea peruskäsitteet kuten laskentaongelma jne., ja tämän kurssin tavoitteena onkin tutustuttaa niihin.
6 Kurssin suorittaminen Luennot: Harjoitukset: tuntia viikossa, yhteensä 22 tuntia. Videoidaan Kuopion kampukselta. 2 tuntia viikossa, yhteensä 5 viikkoa. 20% kurssin pisteistä tulee tehdyistä laskuharjoituksista lineaarisesti. Tehtävät tulevat Wikiin edellisen viikon aikana. Luentokuulustelu ja sen uusintakuulustelu: Loput 80% kurssin pisteistä. Koealue: ne asiat, joita on käsitelty luennoilla tai harjoituksissa. Arvostelu: Alimpaan hyväksyttyyn arvosanaan 1/5 vaaditaan vähintään 50% kokonaispisteistä, korkeimpaan 5/5 vähintään 90%, ja muut lineaarisesti. Niiden jälkeiset yleiset tentit: Koealue käsittää vain luennot ja arvostelussa huomioidaan vain koepisteet. Harjoituksia ei enää huomioida.
7 Oppimateriaali Nämä luentomuistiinpanot ovat wikissä: tkt-wiki Kurssien kotisivuja - Course homepages LAP - Laskennan perusmallit ( , 3op). Pohjautuvat Kimmo Fredrikssonin ja Matti Nykäsen luentoihin edellisiltä vuosilta. Pelkät muistiinpanot eivät välttämättä riitä itseopiskeluun, vaan voivat vaatia tuekseen joko luentojen tai jonkun oppikirjan seuraamista. Esimerkiksi kirjan Hopcroft, John E., Motwani, Rajeev ja Ullman, Jeffrey D.: Introduction to Automata Theory, Languages and Computation, 2. painos (Addison Wesley, 2001) luvut 1 8.2, ja 10 kattavat valtaosan kurssin asioista (näitä luentoja yksityiskohtaisemmin).
8 Kurssin asema tietojenkäsittelytieteessä Erään määritelmän mukaan tietojenkäsittely tutkii 1. millaiset tietojenkäsittelytehtävät on mahdollista automatisoida ja 2. miten tämä automatisointi tulisi suorittaa. Useimpien kurssien lähestymistapa on yleensä konstruktiivinen, eli kohta 2. Esimerkiksi TRA: Kehitetään annetun laskentaongelman tehokkaasti ratkaiseva algoritmi ja sen tarvitsemat tietorakenteet. Tällä kurssilla painoalue onkin kohdassa 1. Osoittautuu, että on olemassa erilaisia tehtäviä; sellaisia 1. joita ei edes periaatteessa voi automatisoida algoritmin olemassaolo on looginen mahdottomuus. 2. jotka voi automatisoida, mutta vain tehottomasti tehokasta algoritmia ei voi olla olemassa. 3. jotka voi automatisoida ja tehokkaasti tehokaskin algoritmi on keksitty: luokka P. 4. joista emme vielä tiedä ovatko ne tehokkaasti ratkaistavissa vai aidosti työläitä; erityisesti päteekö NP P?
9 Historiaa Laskentaongelman käsitteen muotoilu sekä ongelmien erottelu automatisoitumattomiin (eli tyyppiin 1) ja automatisoituviin tehtiin 1930-luvulla. Siis jo ennen tietokoneita! (Ensimmäiset yleiskäyttöiset tietokoneet rakennettiin pian II maailmansodan jälkeen.) Motivaationa oli matematiikan filosofian ja formaalin logiikan kehitys: Haluttiin erottaa toisistaan sellaiset matemaattiset ja loogiset ongelmat, jotka vaativat aitoa luovuutta, sellaisista joihin riitti pelkkä laskeminen siis antaa tarkka formaali määritelmä arkikielen käsitteelle mekaaninen laskenta. Näin syntyi laskettavuuden teoria yhdeksi keskeiseksi osaksi matemaattista logiikkaa.
10 Tällä kurssilla esitetään mekaaniselle laskennalle tarkka formaali määritelmä käyttäen ns. Turingin koneita tietokonepioneeri Alan M. Turingin vuonna 1936 esittämää abstraktia matemaattista mallia hypoteettiselle laskulaitteelle. Samaan aikaan oli muitakin loogikkojen ehdotuksia mekaanisen laskennan määritelmäksi, esimerkiksi: Kurt Gödel kehitti 1930-luvun alusta alkaen rekursiivisten funktioiden teoriaa osana kuuluisan (ensimmäisen) epätäydellisyyslauseensa todistusta. Ideana oli induktio: funktion seuraava arvo f (n + 1) voidaan määritellä edellisen arvon f (n) avulla, jossa n N. Alonzo Church esitti vuonna 1936 oman λ-laskentansa. Ideana oli laskenta lausekkeen sievennyksenä. Nämä taas olivat tärkeitä ohjelmoinnin ja ohjelmointikielten kehitykselle. Tällä kurssilla niitä ei käsitellä, mutta kurssilla Johdatus funktionaaliseen ohjelmointiin (FOH) sivutaan λ-laskentaa.
11 Miksi valittiin Turingin laitelähtöinen lähestymistapa mekaanisen laskennan määritelmäksi eikä Gödelin tai Churchin ohjelmointilähtöistä? Eksplisiittinen laite joka kulkea raksuttaa kuin kello on konkreettisempi käsite kuin induktio tai sievennys joiden voisi epäillä sittenkin vaativan sitä aitoa luovuutta... Laskentaan kuluva aika ja tila on helpompi määritellä laitteen kuin siinä pyörivän ohjelman kautta. Tietokoneiden yleistymisen myötä alettiin huomata, että tämä mekaaninen laskenta jakautui edelleen vaivalloiseen (eli tyypin 2) ja vaivattomaan (eli tyypin 3) mekaaniseen laskentaan. Yksi tapa selventää tätä jakoa on tutkia vielä yksinkertaisempia laskulaitteita kuin Turingin kone. Tätä automaattien teoriaa on kehitetty 1960-luvulta lähtien. Tällä kurssilla tutustummekin sen keskeisiin käsitteisiin kuten äärellisiin ja pinoautomaatteihin. Toinen tapa on asettaa resurssirajoja Turingin koneille. Tätä laskennan vaativuusteoriaa on kehitetty 1970-luvulta lähtien. Sen keskeinen ongelma on juuri edellä mainittu P? = NP. Vaativuusteoria kuitenkin jätetään valtaosin kursseille ASA ja LAT.
12 Kurssin sisältö tästä eteenpäin 1. Johdanto: Yleiskatsaus laskennan teoriaan, laskennan vaativuusteoriaan ja laskennan malleihin. Kurssilla käytettävien käsitteiden ja notaatioiden määritelmiä. 2. Säännölliset kielet: äärelliset automaatit ja säännölliset lausekkeet. Äärelliset automaatit ovat mahdollisimman yksinkertaisia laskulaitteita. Säännölliset kielet taas ovat sellaisia merkkijonojoukkoja, joihin kuuluminen voidaan ratkaista näillä laitteilla. Säännölliset lausekkeet taas ovat notaatio, jolla niitä voidaan kuvata lyhyesti. Kun esimerkiksi kirjoitat Linuxin komentoriville ls *.jar niin käytät säännöllistä lauseketta *.jar kuvailemaan säännöllisen kielen kaikki sellaiset ASCII-merkkijonot, jotka päättyvät merkkijonoon.jar ja kone listaa sinulle kaikki ne tämän hakemiston tiedostonimet, jotka tämän kielen tunnistava automaatti hyväksyy sen jäseniksi. Käytännössä niihin törmää esimerkiksi merkkijonoalgoritmeissa, hajautettujen järjestelmien mallintamisessa sekä dokumenttirakenteiden kaaviokielissä (kuten XML DTD ja XML Schema).
13 3. Kontekstittomat kielet ja kieliopit sekä pinoautomaatit. Vastaavasti pinoautomaatit ovat hieman mutkikkaampia laskulaitteita ja kontekstittomat kielet niitä, joita ne voivat tunnistaa. Ne ovat käytännössä tärkeitä rakenteisen syötteen käsittelyssä. Esimerkiksi HTML, XML sekä rakenteisella ohjelmointikielellä kirjoitettu lähdekoodi ovat rakenteisia syötteitä, koska niissä on mielivaltaisen mutkikkaita sisäkkäisyyksiä, joista syötettä lukevan ohjelman pitää ottaa selvää. Esimerkiksi HTML-syötettä lukevan ohjelman pitää löytää korostuksen aloittavalle tagille <em> juuri oikea sitä vastaava lopettava tag </em>, ja niiden välissä voi olla muita senkaltaisia tagipareja, jotka pitää samoin parittaa. Kontekstittomat kieliopit taas ovat näiden kielten kuvailutapa, vastaavasti kuin säännölliset lausekkeet ovat säännöllisille kielille. Laskettavuuden ja varsinkaan laskennan vaativuuden teoriaa emme valitettavasti ennätä käsitellä juuri lainkaan. Laskennallisesti vaativiin tai jopa kokonaan ratkeamattomiin ongelmiin törmää esimerkiksi tekoälyssä sekä ohjelmien ja järjestelmien formaalissa verifioinnissa.
14 Oikeaa palautetta... Kaikenkaikkiaan mielenkiintoinen kurssi, kunhan selvisi ensimmäisen luennon alkujärkytyksestä, joka asian puolesta tuntui sellaiselta ettei tästä selviä millään keinoin. Mutta onneksi sitä ei heti tullut tiputettua rukkasia, sillä kurssin edetessä asiat alkoivat selkiintymään ja niitä jopa ymmärtääkin (paljon jäi vielä opittavaksi)... Anonyymi opiskelija, kevät 2009
15 Johdanto I Laskennan teoria (theory of computation) käsittelee sitä, miten ongelma luokitellaan ratkeavuuden, vaikeuden ja tehokkuuden perusteella ennen kuin se ratkaistaan. Se jaetaan perinteisesti kahteen osa-alueeseen: Laskettavuuden teoria (theory of computability) tutkii, mitä tietokoneella ylipäänsä voidaan ratkaista ja kuinka vaikea annettu ongelma on. Ongelmien vaikeus määritellään melko karkealla tasolla sen perusteella, kuinka monimutkaista laskennan mallia ratkaisussa tarvitaan. Lisäksi laskettavuuden teoria antaa hyviä eväitä itse ratkaisun laatimiseen. (LAP, LAT)
16 Johdanto II Laskennan vaativuusteoria (theory of computational complexity) tutkii, kuinka tehokkaasti ongelma voidaan ratkaista. Laskennan vaativuusteoria muistuttaa algoritmien analyysia, mutta siinä ei määritellä yksittäisen ratkaisualgoritmin aika- tai tilavaativuutta, vaan itse ongelman pahimman tapauksen aika- ja tilavaativuusluokka. Laskennan vaativuusteoria antaa myös hyvät eväät ongelmien palauttamiseksi toisiin, jo tunnettuihin ongelmiin. (LAT, ASA)
17 Tällä kurssilla käsitellään jonkin verran laskennan teorian ensimmäistä osa-aluetta eli laskettavuuden teoriaa. Aihepiirinä ovat laskennalliset ongelmat ja niiden ratkaisun mekaaniset mallit, joita kutsutaan laskennan malleiksi. Käsittelemme kahta eri laskennan mallia äärellisiä automaatteja ja pinoautomaatteja sekä tutkimme, mitä kullakin mallilla voidaan ratkaista. Kurssin loppupuolella esitellään lyhyesti myös Turingin koneet (joista enemmän kurssilla LAT).
18 Laskettavuuden teoriasta Laskennan mekaaninen malli, automatisointi, tarkoittaa tämän kurssin kannalta algoritmin esittämistä. Intuitiivisesti algoritmi kuvaa tietojenkäsittelyprosessin niin täsmällisesti, että se voidaan tämän kuvauksen perusteella suorittaa mekaanisesti (ilman luovaa ajattelua ). Mekaanisen laskennan tarkemmaksi määrittelemiseksi, eli algoritmikäsitteen matemaattiseksi formalisoimiseksi, on kaksi lähestymistapaa: 1. Lähdetään liikkeelle tyhjästä ja mietitään, mitä voidaan pitää mekaanisena laskentana. 2. Otetaan lähtökohdaksi nykyiset tietokoneet, jotka selvästi suorittavat mekaanista laskemista, ja pelkistetään pois epäolennaisuudet.
19 Koska mekaaninen laskenta on keskeistä matematiikan perusteiden tarkastelussa, matemaatikot ja loogikot miettivät asiaa paljon 1930-luvulla. He sovelsivat luonnollisesti lähestymistapaa 1 koska tietokoneita ei silloin vielä ollut. Jos taas halutaan soveltaa tuloksia käytännön tietojenkäsittelyyn, lähestymistapa 2 tuntuisi lupaavammalta. Tämä on oleellisesti se tapa, jota käytettiin esimerkiksi kurssilla TRA, kun siellä laskettiin asymptoottisia resurssitarpeita eli O-arvioita. Onneksi osoittautuu, että lähestymistavat 1 ja 2 johtavat samaan algoritmikäsitteen formalisointiin. Siis matemattista logiikkaa ja tietokoneita koskevilla periaatteellisilla rajoituksilla on syvällinen yhteys. Laskettavuuden teoria tarkastelee näitä rajoituksia, eli sitä millaisille ongelmille on olemassa ratkaisualgoritmi.
20 Automaattiteoria Kun on saatu valmiiksi abstrakti malli tietokoneelle, voidaan kysyä, mikä muuttuu, jos mallista jätetään jokin piirre pois. Rajoitettujen mallien tarkasteleminen auttaa ymmärtämään yleisempiä malleja. Äärellinen automaatti on hyvin yksinkertainen (abstrakti) laskentalaite, jolla kuitenkin voi tehdä mielenkiintoisia asioita. Teoreettisen mielenkiinnon lisäksi se on hyödyllinen käytännössä ohjelmointi- ja mallinnustekniikkana. Kontekstittomat kieliopit ovat hieman äärellisiä automaatteja ilmaisuvoimaisempi mekanismi, jolla on tärkeitä sovelluksia esimerkiksi ohjelmointikielten määrittelemisessä ja kääntämisessä ja luonnollisen kielen mallintamisessa.
21 Laskennalliset ongelmat Laskennallinen ongelma = mikä tahansa tehtävä, joka voidaan mallintaa ratkaistavaksi digitaalisella tietokoneella. Laskennallisia ongelmia: kokonaislukujen kertolasku kirjastokortiston aakkostaminen yrityksen palkanlaskenta yliopistollisen kurssin kurssitietojen ylläpito annetun kokonaislukulistan järjestäminen... Ongelman ratkaiseva ohjelma on sen yksi esitystapa.
22 ONGELMA LASKENNALLINEN ONGELMA EI LASKENNALLINEN ONGELMA RATKEAVA ONGELMA RATKEAMATON ONGELMA TEHOKKAASTI RATKAISTAVISSA TEHOKASTA RATKAISUA EI OLE MISSÄ NÄIDEN VÄLINEN RAJA KULKEE? OSITTAIN RATKEAVA TÄYSIN RATKEAMATON (useita eri asteita) Kuva : Ongelmien hyvin karkea luokittelu
23 Mihin sijoittuu ongelma Onko oikein huijata tentissä? Jos mielestäsi tentissä huijaaminen on kaikissa olosuhteissa väärin, niin silloin ongelma on triviaalisti laskennallinen ja tehokkaasti ratkaistavissa: Tietenkin voidaan kirjoittaa ohjelma, joka ei lue syötettään, vaan tulostaa heti Ei!. Jos taas mielestäsi tentissä huijaaminen voi olla oikein joissakin lieventävissä olosuhteissa niin silloin on mietittävä jatkokysymystä Voiko nämä olosuhteet kuvailla tyhjentävästi sanallisesti?
24 Jos mielestäsi näiden olosuhteiden kaikki relevantit aspektit voi kuvailla vaikkapa jollakin sopivalla logiikalla, niin silloin ongelma on laskennallinen: Jos olosuhteet ovat kuten tämä kaava φ kuvailee, niin onko silloin oikein huijata tentissä vaiko ei? Tämä φ on se syöte, joka luetaan, ja jonka perusteella ratkaistaan onko vastaus Kyllä! vaiko Ei!. Ongelma on ratkeava, jos tämä käytetty logiikka on riittävän yksinkertainen; muuten ratkeamaton. Esimerkiksi lauselogiikka on ratkeava, predikaattilogiikka ratkeamaton. Vaikka ongelma olisikin ratkeava, se tuskin on tehokkaasti ratkaistavissa; looginen päättely on yleensä työlästä tietokoneellekin. Esimerkiksi lauselooginen päättely on NP-vaikeaa eli luultavasti työlästä.
25 Jos taas katsot todellisuuden olevan niin monimutkainen ja hienosyinen, että on mahdotonta kuvailla loogisesti kaikkia tällaiseen moraaliseen päätöksentekoon vaikuttavia aspekteja, niin silloin ongelma ei ole laskennallinen: Silloin meillä ei ole riittävän ilmaisuvoimaista kieltä jolla voisimme kuvailla olosuhteet riittävän kattavasti ja tarkasti syötekaavaksi φ. Siis algoritminen tietojenkäsittely eli laskenta on oleellisesti syntaktista manipulointia.
26 Ongelman esitys Laskennallinen ongelma = kuvaus äärellisesti esitettävien tapausten joukosta äärellisesti esitettävien vastausten joukkoon Ongelmalla on potentiaalisesti ääretön joukko tapauksia ( syötteitä ). Ongelman ratkaisu on algoritmi, joka liittää kuhunkin tapaukseen sen oikean vastauksen ( tulosteen ). Jokaisen yksittäisen tapauksen ja sen vastauksen on oltava äärellisesti esitettäviä (muutenhan laskenta ei päättyisi). Esimerkki Kokonaislukujen kertolaskuongelmassa tapauksia ovat kaikki kokonaislukuparit (p, q) (merkkijonoiksi koodattuna) vastaus annetulle tapaukselle on kyseisen lukuparin tulo p q (merkkijonoksi koodattuna) ratkaisu on mikä tahansa yleinen kertolaskualgoritmi (esimerkiksi koulussa opittu alakkain laskeminen ).
27 Syötteet Tulosteet π (1,1) (1,3)... (2,2) (2,4)... (1,2) (2,3) jne Kuva : Kertolaskuongelman syötteet ja tulosteet.
28 Äärellinen esitys Kaikki tietokoneen käsittelemä tieto täytyy viime kädessä koodata bittijonoiksi. On luontevaa sallia koodaukseen käytettävän myös muita merkkejä kuin bitit 0 ja 1 (koska nämä muut merkit voidaan tietenkin tarvittaessa edelleen esittää bittijonoina). Määritelmä: äärellinen esitys = äärellisen pituinen merkkijono (eli jono merkkejä) jossakin äärellisessä aakkostossa.
29 Peruskäsitteitä: Aakkosto Aakkosto on äärellinen, epätyhjä joukko alkeismerkkejä eli symboleita. Esimerkiksi binääriaakkosto B = {0, 1} ja latinalainen aakkosto {A, B, C,..., Z}. Aakkosto voidaan määritellä ihan miten halutaan, esim: {HiiriVasenNappi, HiiriOikeaNappi, HiiriKeskiNappi, HiiriRullaYlös, HiiriRullaAlas}.
30 Peruskäsitteitä: Merkkijonot Merkkijono (eli sana) on äärellinen järjestetty jono jonkin aakkoston merkkejä. Esim ja 000 ovat binääriaakkoston B merkkijonoja, ja LAP ja XYZZY ovat latinalaisen aakkoston merkkijonoja. Merkintä Σ tarkoittaa kaikkien niiden merkkijonojen joukkoa, jotka voidaan muodostaa annetun aakkoston Σ eli merkkien merkeistä. Siis B = {ε, 0, 1, 00, 01, 10, 11, 000,... }. Tyhjä merkkijono ε ei sisällä yhtään merkkiä. (Huom! Eri asia kuin välilyönti ). Merkkijonon x pituus x on siihen sisältyvien merkkien määrä. Esim = XYZZY = 5 ja ε = 0.
31 Merkkijonojen katenointi ja kääntäminen Katenaatio on merkkijonojen kirjoittamista peräkkäin, esimerkiksi: jos x = 00 ja y = 11, niin xy = 0011 ja yx = 1100; kaikilla x on xε = εx = x; kaikilla x ja y on xy = x + y. Toisto eli merkkijonon katenaatio itsensä kanssa voidaan merkitä potenssina: a 3 = aaa (ab 2 ) 3 = (abb) 3 = abbabbabb. Itse asiassa merkintä (...) voidaankin lukea toisto mielivaltaisen (mutta äärellisen) monta kertaa. Käänteismerkkijono x R on merkkijono x kirjoitettuna takaperin. Esim. (abbc) R = cbba.
32 Päätösongelmat ja formaalit kielet I Yleisesti laskennallinen ongelma π on kuvaus eli funktio π : Σ Γ jossa Σ ja Γ ovat aakkostoja: syöteaakkosto Σ on se jolla kysymys, ja tulosaakkosto Γ on se jolla vastaus kirjoitetaan. Päätösongelmat ovat laskennallisten ongelmien aliluokka, jossa kunkin ongelman tapauksen vastaus on kyllä tai ei. Formaalisti päätösongelma on muotoa π : Σ B. Intuitio: Yksinkertaistetaan mutkikasta yleiskäsitettä tietokoneohjelma sellaiseksi, joka lukee syötteenä saamaansa tekstitiedostoa 2. käsittelee sitä (eräajona, siis omin päin keskustelematta käyttäjän kanssa tms.) 3. tulostaa lopuksi vastauksenaan kyllä tai ei.
33 Esimerkiksi päätösongelma onko annettu kymmenjärjestelmän luku alkuluku? voidaan esittää syöteaakkoston Σ = {0, 1, 2,..., 9} kuvauksena π : Σ B { 1 jos merkkijonon x esittämä luku on alkuluku, π(x) = 0 jos ei. Yleisesti, jokaista päätösongelmaa π : Σ B vastaa merkkijonojoukko A π = {x Σ π(x) = 1} eli niiden ongelman tapausten joukko, joihin vastaus on kyllä. Kääntäen, jokaista merkkijonojoukkoa A Σ vastaa päätösongelma { 1, jos x A; π A : Σ {0, 1}, π A (x) = 0, jos x / A. Tätä π A kutsutaan joukon A karakteristiseksi funktioksi koska se kertoo kuuluuko annettu x Σ joukkoon A vaiko ei.
34 Σ A π A 0 1 Kuva : Kielen A Σ päätös- eli tunnistusongelma π A.
35 Aakkoston Σ (formaali) kieli on mikä tahansa merkkijonojoukko A Σ Olemme kiinnostuneita siitä, kuuluuko annettu merkkijono annettuun merkkijonojoukkoon, eli kuuluuko annettu sana annettuun kieleen. Kielen A Σ tunnistusongelma on merkkijonojoukkoon A liittyvä päätösongelma π A : Tässä on merkkijono x Σ. Päteekö x A? Jatkossa käsittelemme vain päätösongelmia. Huomaa että tämä ei periaatteessa ole rajoitus, koska monimutkaisemmat kysymykset voi aina pilkkoa joukoksi kyllä-ei -kysymyksiä... Esimerkiksi monimutkaisempi kysymys Mikä on lukujen x ja y tulo? voidaan pilkkoa kysymyksiin Onko lukujen x ja y tulo = z vaiko ei?
36 Esimerkki Olkoon A aakkoston {+,, 0, 1, 2,..., 9} kieli, joka koostuu yksinkertaisista kokonaislukuvakioista (esim. Java-kielessä). Siis 0 A, A ja 32 A, mutta A. Tämä kieli A on esimerkki säännöllisestä kielestä. Esimerkki Olkoon B aakkoston {+,,, (, ), 0, 1, 2,..., 9} kieli, joka koostuu laillisista kokonaislukulausekkeista. Esim B ja ( ) 4 5 B, mutta (1 + 2)) B ja 3+ B. Tämä kieli B on esimerkki kontekstittomasta kielestä.
37 Esimerkki Muodostukoon ASCII-aakkoston kieli C niistä Java-kielisistä ohjelmista, jotka tyhjällä syötetiedostolla joutuvat ikuiseen silmukkaan. Kieli C on esimerkki ratkeamattomasta kielestä. Sitä siis ei voida tunnistaa millään tietokoneohjelmalla. Esimerkki Kieli { a k k N } on säännöllinen; kieli { a k b k k N } on kontekstiton; kieli { a k b k c k k N } on kontekstillinen (eli sen kuvaaminen vaatii kontekstitonta voimakkaamman kieliopin).
38 Ongelman vaikeuden arviointi päätösongelmalla Tarkastellaan mielivaltaista laskentaongelmaa π: Syötteellä x, palauta y = π(x) ja vastaavaa päätösongelmaa: Päteekö syötteellä (x, y), että y = π(x)? Tätä vastaa kielen L π = {(x, y) y = π(x)} tunnistamisen ongelma. Ongelma π voisi esim. olla neliöjuuren laskenta (vaikka alaspäin pyöristäen, eli π(x) = x ). Tiedämmekö yleisesti jotain näiden välisestä suhteesta?
39 Jos laskentaongelma π on ratkeava, on sitä vastaava päätösongelma myös ratkeava: Syötteellä (x, y) voidaan ensin laskea z = π(x), minkä jälkeen riittää tarkistaa onko z = y. Kääntäen: Jos päätösongelma ei ole ratkeava, myöskään vastaava laskentaongelma ei ole ratkeava.
40 Laskentaongelman palauttaminen päätösongelmaan Toisaalta laskentaongelman voi ratkaista soveltamalla vastaavan päätösongelman ratkaisua (M 3 ). input x M 1 M 3 Aseta Onko y = 0 π(x) = y on M 4 Tulosta ratkaisu y ei Generoi seuraava y M 2 Kuva : Laskentaongelma päätösongelmana.
41 Jos päätösongelma (komponentti M 3 ) on ratkeava niin ongelmakin on ratkeava helppo (jossakin mielessä) niin ongelmakin on helppo (samassa mielessä; ainakin jos testattavia ratkaisuehdokkaita y ei ole liikaa).
42 Kurssin ratkeavuustuloksia Erityisesti, jos kieli A kuuluu säännöllisiin kieliin, niin sen tunnistusongelma π A voidaan ratkaista helposti rakentamalla sen ratkaiseva äärellinen automaatti; kontekstittomiin niin rakentamalla pinoautomaatti; rekursiivisiin niin rakentamalla Turingin kone. Jos kieli A ei kuulu edes rekursiivisiin kieliin, niin sen π A ei ole ratkeava lainkaan. Silloin se voi olla joko osittain ratkeava eli voidaan tehdä Turingin kone joka osaa vastata kyllä mutta ei -vastauksen sijasta voi myös jäädä ikuiseen silmukkaan, tai sitten vieläkin vaikeampi jolloin se ei enää ole tietojenkäsittelyn vaan esimerkiksi matemaattisen logiikan ongelma.
43 Päätösongelmien ratkaisemisesta käytännössä Käytännössä päätösongelman ratkaiseminen ei useinkaan poikkea paljon vastaavan laskentaongelman ratkaisemisesta. Harvoin esim. voidaan tehdä päätöstä vaikkapa jonkin reitin olemassaolosta ilman että löydetään sellainen (mikäli on olemassa). Kurssilla käsiteltäviin tunnistusmenetelmiin liitetään käytännössä yleensä myös muuta laskentaa. Esimerkiksi tietokoneohjelman syntaksin tarkistaminen kontekstittoman kielen tunnistusongelma. Ohjelman jäsennyksen yhteydessä kuitenkin yleensä myös tuotetaan käännöksen kohdekoodi (tai siihen tarvittavat tietorakenteet).
44 Kielten vaikeusluokat Chomskyn kielihierarkia määrittelee seuraavat kielten vaikeusluokat: Tyyppi 3: säännölliset kielet (erikoistapauksenaan äärelliset kielet). Tyyppi 2: kontekstittomat kielet (tai yhteysvapaat tai yhteydettömät ). Tyyppi 1: kontekstilliset kielet (tai kontekstiset tai yhteyksiset ). Tyyppi 0: rajoittamattomat kielet = rekursiiviset ja rekursiivisesti lueteltavat (tai rekursiivisesti numeroituvat ) kielet. Noam Chomsky on merkittävä kielitieteilijä. Niinpä hänen hierarkiassaan on vastaava kieliopillinen näkökulma: esimerkiksi kontekstittomilla kielillä on suora yhteys tietynlaisiin formaaleihin kielioppeihin ja kontekstillisillä kielillä sellaisiin kielioppeihin, joissa huomioidaan myös lauseyhteys.
45 ratkeamattomat ongelmat tyyppi 0: rajoittamattomat kielet rekursiivisesti lueteltavat kielet tunnistus: universaali Turingin kone (pysähtyy "kyllä" tapauksessa) rekursiiviset kielet tunnistus: Turingin kone + riittävän mittainen työnauha (pysähtyy aina), RAM kone, ohjelmointikielet tyyppi 1: kontekstiset kielet tunnistus: Turingin kone + kohtuullisen (eli polynomisen) mittainen työnauha tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet; tunnistus: äärellinen automaattivakiomäärä muistia äärelliset kielet Kuva : Chomskyn kielihierarkia.
46 Esimerkki Joillekin yksinkertaisille ohjelmointikielille (kuten Pascal) pätee Leksikaalisesti oikeiden ( muodostuu oikeista sanoista ) ohjelmien joukko voidaan esittää säännöllisillä kielillä ( oikealle lineaarinen kielioppi ). Syntaktisesti oikeiden ( sanat järkevässä järjestyksessä ) ohjelmien joukko voidaan esittää kontekstittomilla kielillä. Kontekstilliset ja rekursiiviset kielet eivät kuulu kurssin alueeseen, mutta näillä voitaisiin kuvata ohjelman suorittama laskenta... Toisaalta kaikkien ohjelmien joukkoa jotka ratkaisevat jonkin ongelman ei voi kuvata kieliopilla. Rajoittamattomat kielet koostuvat rekursiivisista kielistä, joiden tunnistusongelma on ratkeava rekursiivisesti lueteltavista kielistä, joiden tunnistusongelma on osittain ratkeava. Sellaisella kielellä on ohjelma, joka tulostaa sen merkkijonot luettelona x 0, x 1, x 2,....
47 Laskennallisten ongelmien ratkeavuus Läheskään kaikkia laskennallisia(kaan) ongelmia ei voida ratkaista tietokoneella yksinkertaisesti jo siksi, että ongelmia on ylinumeroituvan monta ( yhtä monta kuin reaalilukuja R ) mutta ratkaisuohjelmia vain numeroituvan monta ( yhtä monta kuin luonnollisia lukuja N ). Laskennalliset ongelmat Kaikki binäärijonot Σ={0,1} Päätösongelmat Lailliset konekieliohjelmat Ratkeavat päätösongelmat Päätösongelmien ratkaisuohjelmat
48 Perustelu Tietokoneohjelmat ovat merkkijonoja. 2. Minkä tahansa aakkoston merkkijonojen joukko on numeroituva. 3. Ongelman ratkaisevia tietokoneohjelmia on korkeintaan numeroituva määrä. 4. Laskennallisia ongelmia on vähintään yhtä paljon kuin päätösongelmia. 5. Minkä tahansa aakkoston päätösongelmien joukko on ylinumeroituva. 6. Laskennallisia ongelmia on ylinumeroituvan monta. 7. Jokaiselle laskennalliselle ongelmalle ei millään riitä sen ratkaisevaa tietokoneohjelmaa.
49 Aakkoston merkkijonoja on numeroituva määrä Lause Minkä tahansa aakkoston Σ merkkijonojen joukko Σ on numeroituva. Todistus: Olkoon Σ = {a 1, a 2,..., a n }. Kiinnitetään merkeille jokin aakkosjärjestys, esim. a 1 < a 2 < < a n. Joukon Σ merkkijonot voidaan järjestää seuraavasti (kanoniseen järjestykseen): 1. Ensin luetellaan 0:n mittaiset merkkijonot (= ε), sitten 1:n (= a 1, a 2,..., a n ), sitten 2:n (= a 1 a 1, a 1 a 2, a 1 a 3,..., a 1 a n, a 2 a 1, a 2 a 2, a 2 a 3,... ) jne. 2. Kunkin pituusryhmän sisällä merkkijonot luetellaan aakkosjärjestyksessä. Jokaiseen merkkijonoon voidaan siis liittää yksikäsitteinen luonnollinen luku, joten Σ on numeroituva.
50 Kuvattu luonnollisten lukujen ja merkkijonojen vastaavuus: 0 ɛ 1 a 1 2 a 2. n a n n + 1 a 1 a 1 n + 2 a 1 a 2. 2n a 1 a n 2n + 1 a 2 a 1. 3n a 2 a n. n 2 + n a na n n 2 + n + 1 a 1 a 1 a 1 n 2 + n + 2 a 1 a 1 a 2.
51 Päätösongelmia on ylinumeroituva määrä I Lause Minkä tahansa aakkoston Σ päätösongelmien joukko on ylinumeroituva. Todistus: Merkitään aakkoston Σ kaikkien päätösongelmien kokoelmaa Π = {π π on kuvaus Σ B}. Tehdään vastaväite: Oletetaan, että Π onkin numeroituva, eli että on olemassa numerointi Π = {π 0, π 1, π 2,...}. Olkoot Σ :n merkkijonot kanonisessa järjestyksessä lueteltuina x 0, x 1, x 2,...
52 Päätösongelmia on ylinumeroituva määrä II Muodostetaan uusi päätösongelma ˆπ: ˆπ : Σ B, ˆπ(x i ) = { 1, jos πi (x i ) = 0; 0, jos π i (x i ) = 1. Koska oletuksen mukaan ˆπ Π (koska Π on kaikkien päätösongelmien joukko), niin ˆπ = π k jollakin k N. Tällöin { 1, jos πk (x ˆπ(x k ) = k ) = ˆπ(x k ) = 0; 0, jos π k (x k ) = ˆπ(x k ) = 1. Tämä on ristiriita. Siis vastaoletus, että joukko Π on numeroituva, on väärä.
53 Todistus kuvana: Ajatellaan (ääretöntä) taulukkoa ongelmista π 0, π 1, π 2,... ja merkkijonoista x 0, x 1, x 2,.... Ongelma ˆπ poikkeaa kaikista muista ongelmista π i taulukon diagonaalilla, vaikka i kasvaisi äärettömään: ˆπ π 0 π 1 π 2 π 3 x x x x Suomeksi: ˆπ ei voi esiintyä taulukon millään sarakkeella, joten päätösongelmia (ja yleisemmin laskennallisia ongelmia) on ylinumeroituva määrä. (Eli ˆπ eroaa jokaisesta sarakkeesta ainakin yhdessä kohtaa.) Tämä todistustekniikka on ns. Cantorin diagonaaliargumentti, jolla hän todisti, että reaalilukuja 0 x < 1 on aidosti enemmän kuin luonnollisia lukuja.
54 Käytännössä tämä merkitsee sitä, että kaikista laskentaongelmista voidaan esimerkiksi Java-ohjelmilla ratkaista vain häviävän pieni osa: ylinumeroituvan joukon numeroituva osajoukko. Sama pätee kaikilla ohjelmointikielillä, sillä kaikki riittävän vahvat ohjelmointikielet määrittävät täsmälleen saman ratkeavien ongelmien luokan (ns. Churchin Turingin teesi; Tämä teesi pätee jopa hypoteettisiin kvanttitietokoneisiin, vaikka ne vaikuttavatkin ratkaisevan joitakin laskentatehtäviä oleellisesti tehokkaammin kuin muut laskentamallit.). Useimmat laskennalliset ongelmat ovat siis absoluuttisesti ratkeamattomia. Valitettavasti ratkeamattomat ongelmat käsittävät myös monia mielenkiintoisia / käytännöllisiä ongelmia, erityisesti pysähtymisongelman: jos on annettu ohjelma P ja sen syöte w, niin pysähtyykö ohjelman P laskenta syötteellä w vai jääkö se ikuiseen silmukkaan? (Tämä ongelma on kuitenkin osittain ratkeava... )
55 Pysähtymisongelman ratkeamattomuus Näimme edellä, että valtaosa päätösongelmista on ratkeamattomia laskemalla, että niitä on paljon enemmän kuin ratkaisualgoritmeja. Osoitetaan nyt yksi konkreettinen päätösongelma ratkeamattomaksi eli että ratkeamattomuus on joidenkin oikeidenkin ongelmien piirre, eikä pelkkä matemaattinen ilmiö. Kiinnitetään laskentamalliksemme vaikkapa C-ohjelmointikieli. Church Turingin teesin nojalla sama pätee myös muillakin yhtä ilmaisuvoimaisilla laskentamalleilla. Pysähtymisongelman C-kielinen tulkinta on: Ei ole olemassa totaalista (aina pysähtyvää) C-ohjelmaa, joka ratkaisisi, pysähtyykö annettu C-ohjelma P annetulla syötteellä w.
56 Tehdään vastaoletus, että voitaisiinkin kirjoittaa totaalinen C-funktio bool h(char p[],char w[]) jonka syöteparametrit ovat p: merkkijono, joka sisältää tutkittavan C-kielisen ohjelman P lähdekoodin w: merkkijono, joka sisältää tutkittavan syötteen w ja jonka tulos on true jos ohjelman p suoritus syötteellä w pysähtyisi false jos se jäisi ikuiseen silmukkaan. Vastaoletusta käyttäen voitaisiin kirjoittaa toinen C-funktio void g(char p[]){ if (h(p,p)) while (true); } joka siis pysähtyy täsmälleen silloin, kun C-lähdekoodi p ei pysähtyisi saadessaan syötteenään oman itsensä.
57 Olkoon q tämän funktion g lähdekoodi merkkijonona. Mitä tapahtuu kutsussa g(q)? Saadaan haluttu ristiriita: Niinpä tehty vastaoletus ei pädekään. g(q) pysähtyy h(q,q) palauttaa false g(q) ei pysähdykään! Tässä todistuksessa istutetaan ns. valehtelijan paradoksi Tämä lause on valhetta! totuuden sijasta laskennan pysähtymiseen. Samaa ideaa käytti jo Kurt Gödel kuuluisissa epätäydellisyyslauseissaan istuttamalla se totuuden sijasta todistuvuuteen: Tällä väitteellä ei ole todistusta!
58 Säännölliset kielet ja äärelliset automaatit Äärellinen automaatti on hyvin yksinkertainen laskennan malli (eli abstrakti laskentalaite). Säännölliset kielet on se luokka laskentaongelmia, jonka näin yksinkertaisella laitteella pystyy ratkaisemaan. Näillä on sovelluksia esim. tekstihaussa ja ohjelmien syötteiden tunnistamisessa. Tavoitteet: oppia mitä ovat äärelliset automaatit ja säännölliset lausekkeet ja mikä on niiden välinen suhde muodostamaan yksinkertaisia äärellisiä automaatteja ja säännöllisiä lausekkeita tekemään muunnoksia determinististen ja epädeterminististen äärellisten automaattien ja säännöllisten lausekkeiden välillä. osoittamaan kieli joko säännölliseksi tai ei-säännölliseksi.
59 Esimerkki Kahviautomaatti, joka ei anna vaihtorahaa, hyväksyy vain 50 sentin ja yhden euron kolikoita ja minimimaksu on 2 euroa. Millaisia syötejonoja kahviautomaatti hyväksyy? Kelvollisia syötejonoja ovat esim. seuraavat (yksikkönä snt): Ts. kahviautomaatti hyväksyy syötejonot, jotka ovat muotoa 50 senttiä + 50 senttiä + 50 senttiä + 50 senttiä + [0 tai useampia 50 sentin tai 1 euron kolikoita] 1 euro + 1 euro + [0 tai useampia 50 sentin tai 1 euron kolikoita] 50 senttiä + 1 euro + 1 euro + [1 tai useampia 50 sentin tai 1 euron kolikoita] 1 euro + 50 senttiä + 50 senttiä + 1 euro + [1 tai useampia 50 sentin tai 1 euron kolikoita]
60 Kahviautomaatin toiminta voidaan kuvata äärellisenä automaattina. Automaatin syötteitä ovat 50 sentin ja 1 euron kolikot ja automaatti hyväksyy syötejonon, jos siihen sisältyvien rahojen summa on vähintään 2 euroa Automaatti voidaan esittää tilasiirtymäkaaviona. Tämä kaavio on suunnattu verkko jonka kaaret on painotettu syöteaakkosilla. 50, 100 q q q , 100 q q 3 Kuva : Kahviautomaatti.
61 Automaatilla on tiloja (5 kappaletta), jotka on esitetty ympyröinä ja nimetty q 0,... q 4, siirtymiä jotka on esitetty tilojen välisinä kaarina; aakkosto jonka symboleilla siirtymät on merkitty; alkutila (tila q 0 ) joka on merkitty tyhjästä tulevalla kaarella; ja lopputila (tila q 4 ) joka on rengastettu. Tilojen nimet ovat vapaavalintaisia, automaatin toimintaan ne eivät vaikuta.
62 50, 100 q q q , 100 q q 3 Jokaiseen kahviautomaatin tilaan liittyy se tilanne, johon syötetyt lantit ovat koneen asettaneet: q 0 : Asiakas ei ole syöttänyt vielä yhtään rahaa alkutila(nne) jossa laite on, kun asiakas tulee sen luo ja alkaa syöttää siihen lanttejaan q 1 : Asiakas on syöttänyt tasan 50 senttiä rahaa. q 2 : Asiakas on syöttänyt tasan 1 euroa rahaa. q 3 : Asiakas on syöttänyt tasan 1 euro 50 senttiä rahaa. q 4 : Asiakas on syöttänyt vähintään 2 euroa rahaa joten laite voi hyväksyä saaneensa tarpeeksi rahaa, ja ryhtyä annostelemaan kahvia.
63 Kun annetaan tehtäväksi suunnitella automaatti hyväksymään jonkin formaalin kielen A Σ niin kannattaa miettiä 1. ensiksi mitä tilanteita automaatin pitää muistaa, jotta se voisi tehdä oikean päätöksen siitä, kuuluuko sen nykyinen syöte x Σ kieleen A vaiko ei. Näin saadaan automaattiin tarvittavat tilat. Kahviautomaatissa muistetaan tähän mennessä syötetty rahasumma. 2. toiseksi miten näiden tilanteiden välillä siirrytään, kun syötettä x luetaan merkki merkiltä. Näin saadaan automaattiin tarvittavat siirtymät. Kahviautomaatissa jokainen lantti on oma merkkinsä, ja se vie nykyisestä rahasummasta seuraavaan.
64 Äärellisen automaatin esitystapoja Tilasiirtymäkaaviona eli piirroksena. q Tila q q 0 Alkutila Lopputila eli hyväksyvä tila a q q Tilasiirtymä δ(q, a) = q Kuva : Tilasiirtymäkaavion merkinnät.
65 Tilasiirtymätaulukkona jossa jokaisella tilalla on oma rivinsä jokaisella syöteaakkosella on oma sarakkeensa tilan p sarake c ilmoittaa tilan (eli rivin) jonne siirrytään tilasta p merkillä c. 50 snt 1 euro q 0 q 1 q 2 q 1 q 2 q 3 q 2 q 3 q 4 q 3 q 4 q 4 q 4 q 4 q 4 q q q q 3 50, q 4 50, 100
66 Esimerkki Etumerkillisen kokonaisluvun tunnistaminen. Tilasiirtymäkaaviona (jossa d = {0, 1,..., 9} ovat 10-järjestelmän lukumerkit): d +, d q 0 q 1 q 2 d Tilasiirtymätaulukkona: d +, q 0 q 2 q 1 q 1 q 2 q 2 q 2 Taulukon puuttuvat kohdat vastaavat virhetilaa Error.
67 Tehtävä C-kielessä 0-alkuiset luvut tulkitaan oktaaliluvuiksi (jolloin merkkejä 8 ja 9 ei sallita lainkaan), ja alkuiset 10-kantaisiksi luvuiksi. Muuta esimerkin automaattia siten, että nämä tapaukset erotellaan, eli että ne johtavat eri hyväksyviin tiloihin. Tehtävä C-kielessä 0x-alkuiset luvut tulkitaan heksadesimaaliluvuiksi. Ota tämäkin huomioon.
68 Ohjelmana (esim. C:llä): int q=0; int c; while ((c=fgetc(stdin))!= EOF) switch (q) { case 0: if (c== + c== - ) q=1; else if (isdigit(c)) q=2; else q=3; break; case 1: if (isdigit(c)) q=2; else q=3; break; case 2: if (isdigit(c)) q=2; else q=3; break; case 3: break; } d q 0 +, q 1 d q 2 d
69 Esimerkki C-kielen etumerkittömän liukulukuvakion tunnistus: 1. d 2 3 d. d e,e 4 d e,e 5 +, 6 d d 7 d d. E, e +,
70 Äärellisen automaatin formaali määrittely Äärellinen automaatti M koostuu seuraavista osista: ohjausyksiköstä jossa on äärellinen määrä tiloja ja jonka toimintaa ohjaa automaatin siirtymäfunktio δ syötenauhasta joka on jaettu yhden syötemerkin kokoisiin paikkoihin. nauhapäästä joka kullakin hetkellä osoittaa yhtä syötenauhan merkkipaikkaa. i n p u t q1 q2 q0 δ
71 Automaatin toiminta Automaatti käynnistetään erityisessä alkutilassa q 0, siten että tarkasteltava syöte on kirjoitettuna syötenauhalle ja nauhapää osoittaa sen ensimmäistä merkkiä. Yhdessä toiminta-askelessa automaatti lukee nauhapään kohdalla olevan syötemerkin, päättää ohjausyksikön tilan ja luetun merkin perusteella siirtymäfunktion mukaisesti ohjausyksikön uudesta tilasta, ja siirtää nauhapäätä yhden merkin eteenpäin. Automaatti pysähtyy, kun viimeinen syötemerkki on käsitelty. Jos ohjausyksikön tila tällöin kuuluu erityiseen (hyväksyvien) lopputilojen joukkoon, niin automaatti hyväksyy syötteen, muuten hylkää sen. Automaatin tunnistama kieli on sen hyväksymien merkkijonojen joukko.
72 Määritelmä Äärellinen automaatti on viisikko M = (Q, Σ, δ, q 0, F ), missä Q on automaatin tilojen äärellinen joukko; Σ on automaatin syöteaakkosto; δ : Q Σ Q on automaatin siirtymäfunktio; q 0 Q on automaatin alkutila; F Q on automaatin hyväksyvien tilojen joukko. Siirtymäfunktio δ on määritelmän kiinnostavin osa. Intuitiivisesti: Jos automaatti on nyt tilassa q ja seuraavaksi tulee merkki c niin silloin siirrytään tilaan δ(q, c), eli siihen jonka siirtymäfunktio ilmoittaa. Toisin sanoen: Siirtymäfunktion arvo δ(q, c) = tilasiirtymätaulukon sisältö sen rivillä q ja sarakkeella c.
73 Esimerkki Kokonaislukuautomaatin formaali esitys on d +, d q 0 q 1 q 2 d d +, q 0 q 2 q 1 q 1 q 2 q 2 q 2 M = ({q 0, q 1, q 2, error}, {0, 1,..., 9, +, }, δ, q 0, {q 2 }), jossa δ on kuten taulukossa; esim. jne. δ(q 0, 0) = δ(q 0, 1) = δ(q 0, 2) = = δ(q 0, 9) = q 2 δ(q 0, +) = δ(q 0, ) = q 1 δ(q 1, +) = δ(q 1, ) = error
74 Automaatin laskennan matemaattinen esitys Automaatin tilanne on pari (q, w) Q Σ jossa q = automaatin nykyinen tila w = syötemerkkijonon vielä käsittelemätön loppuosa. Erityisesti automaatin alkutilanne syötteellä x on pari (q 0, x) jossa q 0 on automaatin alkutila. Tilanne (q, cw), jossa c Σ on seuraava syötemerkki, johtaa suoraan tilanteeseen (δ(q, c), w). Tätä merkitään lyhyesti (q, cw) (δ(q, c), w). Tilanne (q, w) johtaa tilanteeseen (q, w ) jos on olemassa tilannejono (q 0, w 0 ) (q 1, w 1 ) (q 2, w 2 ) (q 3, w 3 ) (q n, w n ) missä (q 0, w 0 ) = (q, w) ja (q n, w n ) = (q, w ) (jollakin n N). Tätä merkitään lyhyesti (q, w) (q, w ).
75 Jos halutaan merkitä näkyviin minkä automaatin M tilannejonoista on kyse, niin voidaan käyttää alaindeksiä: siis M ja M. Automaatti M hyväksyy syötemerkkijonon x Σ, jos ja muuten hylkää sen. (q 0, x) (q f, ε) jollain q f F Toisin sanoen, automaatti M hyväksyy syötteen x, jos sen vastaava alkutilanne (q 0, x) johtaa johonkin hyväksyvään lopputilanteeseen, jossa koko syöte on luettu. Vastaavaa tilannejonoa (q 0, x) M (q, ε) kutsutaan automaatin M laskennaksi syötteellä x. Se on siis hyväksyvä laskenta jos lopputila q F ja hylkäävä jos q F.
76 Vaihtoehtoisesti voidaan laajentaa siirtymäfunktion δ yksittäisiltä merkeiltä a Σ kokonaisille merkkijonoille w Σ (ja niin teemmekin jatkossa): δ (q, w) = q silloin kun (q, w) (q, ε). (1) Siis δ (q, w) on se tila, johon päästään aloittamalla tilasta q ja lukemalla merkkijono w loppuun saakka. Erityisesti δ (q, ε) = q ja δ (q, a) = δ(q, a), kun a Σ. Automaatti siis hyväksyy merkkijonon w, jos δ (q 0, w) F.
77 Tämä on helppo määritellä myös rekursiivisesti: { δ q jos w = ε (q, w) = δ (δ(q, a), v) jos w = av jossa a Σ Tästä saadaan suoraan rekursiivinen algoritmi, jonka rekursio on niin yksinkertaista (ns. häntärekursiota), että se on helppo toteuttaa while-silmukkana.
78 Säännöllinen kieli Automaatti M tunnistaa kielen { } L(M) = x Σ (q 0, x) (q f, ε) jollakin q f F M = {x Σ δ (q 0, x) F } eli niiden merkkijonojen x joukon, jotka M hyväksyy. Sanomme, että kieli A on säännöllinen, jos jokin äärellinen automaatti tunnistaa sen, ts. A = L(M) jollain M. Huomaa, että säännöllisyys on kielen, eli merkkijonojoukon ominaisuus, ei yksittäisen merkkijonon. Ei ole mielekästä kysyä yksittäisestä merkkijonosta, onko se säännöllinen. (Mistä tahansa merkkijonosta w Σ voidaan toki muodostaa yksialkioinen kieli {w} Σ, joka on selvästi säännöllinen.)
79 Esimerkki Merkkijonon hyväksyminen kokonaislukuautomaatilla: d +, d q 0 q 1 q 2 d (q 0, +1210) (q 1, 1210) (q 2, 210) (q 2, 10) (q 2, 0) (q 2, ε) Nyt jäätiin hyväksyvään lopputilaan q 2 eli L(M). Laittoman merkkijonon laskenta onkin hylkäävä: (q 0, ) (q 2, ) (q 2, + 10) (error, 10)
80 Äärelliseen automaattiin voidaan helposti lisätä muutakin tulostusta ja toimintoja kuin pelkkä hyväksyminen tai hylkääminen. Nämä ovat pelkkiä sivuvaikutuksia eivätkä ne vaikuta automaatin toimintaan siihen, miten se valitsee tilasiirtymänsä tai jos ne vaikuttavat, niin silloin kyseessä ei enää olekaan äärellinen automaatti, vaan jokin muu sitä vahvempi laskennan malli. Tällaiset modifikaatiot eivät tämän kurssin kannalta tuo mitään kovin oleellista uutta asiaan. Muissa yhteyksissä ne voivat kuitenkin olla hyvinkin hyödyllisiä.
81 Esimerkki Lisätään etumerkillisen kokonaisluvun tunnistamiseen toiminto, joka laskee luvun arvon muuttujaan value eli muuntaa syötemerkkijonon sitä vastaavaksi kokonaisluvuksi. d q 0 +, q 1 d q 2 d int q=0; int c; int sign=1; int value=0; while ((c=fgetc(stdin))!= EOF) switch (q) { case 0: if (c== + ) q=1; else if (c== - ) { q=1; sign=-1; } else if (isdigit(c)) { q=2; value=c- 0 ; } else q=3; break; case 1: if (isdigit(c)) { q=2; value=sign*(c- 0 ); } else q=3; break; case 2: if (isdigit(c)) { q=2; value=10*value+sign*(c- 0 ); } else q=3; break; case 3: break; }
82 Sivuhuomautus: Äärellisen automaatin tämän tapainen formaalimpi laajennus on nimeltään äärellinen transduktori (finite state transducer). Tässä jokaiseen tilaan liittyy paitsi yhden syötemerkin lukeminen, niin myös yhden (tai useamman) tulostemerkin kirjoittaminen erilliselle tulostenauhalle (tai syötteen päälle). Ohjelmointikielten kääntämisessä ensimmäinen vaihe on leksikaalinen analyysi eli selaus. Tarkoituksena on poimia ja erotella ohjelman lähdekoodista erityyppiset alkiot, kuten kokonaislukuvakiot (arvoineen), varatut sanat (if, else, while, jne.), muuttujien nimet, jne. Siis esimerkiksi nähtyään merkit for tällainen selain lukee vielä yhden merkin c eteenpäin. Jos tämä c on jokin muuttujan nimessä sallittu merkki, niin se tietää kokoavansa nyt muuttujan nimeä muotoa forc... ; muuten se tietääkin löytäneensä varatun sanan for ja tämä c kuuluukin seuraavaan alkioon.
83 Selain voidaan toteuttaa (ja usein toteutetaan) yhtenä äärellisenä transduktorina, joka lukee lähdekooditiedostoa merkki merkiltä ja nähtyään jonkin kokonaisen alkion tulostaa vastaavan tiedon. Selainta ei kuitenkaan (yleensä) koodata käsin, vaan sen koodi voidaan tuottaa automaattisesti ohjelmointikielen kuvauksesta jollain sopivalla työkalulla (esim. lex ja sen GNU-versio flex), joka myös voi automaattisesti liittää hyväksyviin tiloihin käyttäjän määrittelemän toimintokoodin (tulostuksen yms.).
84 ~$ cat ex.lex %{ #include <stdio.h> %} %option noyywrap %% [0-9]+ { printf("kokonaisluku: %s\n",yytext); } lap { printf("lap!\n"); } /* Tunnistetaan "lap" */. { } /* Sivuutetaan muu */ %% int main(void) { yylex(); return 0; } fredriks@cs ~$ flex ex.lex fredriks@cs ~$ gcc lex.yy.c -o foo fredriks@cs ~$./foo abc123def456lapxxxxx Kokonaisluku: 123 Kokonaisluku: 456 LAP!
85 Tehtävä Tee paranneltu versio kahviautomaatista: automaatti hyväksyy vain tasarahan, mutta lisäksi siihen on lisätty sellainen peruutusnappi, joka palauttaa kaikki syötetyt kolikot (antamatta kahvia). Tehtävä Laadi aakkoston Σ = {a, b} äärellinen automaatti joka tunnistaa kielen {w w sisältää täsmälleen kaksi a:ta}. Tehtävä Edellisen komplementti: laadi äärellinen automaatti joka tunnistaa kielen {w w ei sisällä täsmälleen kahta a:ta}. Tehtävä Laadi automaatti kielelle: {w w ei muodostu pelkästä a:sta tai b:stä}
86 Tehtävä Laadi automaatti kielelle: {w w ei sisällä jonoa aab} Tehtävä Osoita että kieli {(aba) n n > 0} on säännöllinen. Tehtävä Tarkastellaan kieltä, joka koostuu niistä merkkijonoista, joissa jokainen pariton (eli ensimmäinen, kolmas, viides,... ) merkki on a. Osoita, että se on säännöllinen. Tehtävä Laadi äärellinen automaatti, joka tunnistaa kielen L = {0 n 1 m n, m N} {1 n 0 m n, m N}.
87 Äärellisen automaatin laskentavoimasta Kieli L 1 = {0 n 1 m n, m N} on helppo tunnistaa äärellisellä automaatilla, eli se on säännöllinen. Äärellinen automaatti on hyvin rajoittunut laskennan malli. Vaikkapa niinkin yksinkertainen kieli kuin L 2 = {0 n 1 n n N} (eli merkkijonot joissa on ensin jono nollia ja sitten saman verran ykkösiä) ei olekaan säännöllinen! (Tähän palataan.) Mikä on se perustava ero näiden kielten välillä, joka tekee toisesta helpon ja toisesta mahdottoman tunnistaa äärellisellä automaatilla?
88 Intuitiivisesti, kielen L 1 = {0 n 1 m n, m N} tunnistaminen vaatii vain vakiomäärän muistia. Kieli L1 = merkkijonot jossa on ensin pelkkiä nollia ja sitten pelkkiä ykkösiä. Siis niiden lukumäärällä ei ole väliä, ja riittää muistaa mikä oli edellinen merkki (tila). Toisaalta, kielen L 2 = {0 n 1 n n N} tunnistamiseen ei riitäkään vakiomäärä muistia. L 2 = merkkijonot jossa on ensin jokin määrä n nollia ja sitten yhtä monta ykköstä. Tässä tämä yhteinen n voi olla kuinka suuri tahansa sehän riippuu syötteen pituudesta. Äärellinen automaatti -parka ehtii unohtaa montako nollaa se on nähnyt ennen kuin ykköset alkavat, kun n on riittävän suuri. Formalisoimme tämän myöhemmin niin sanottuna pumppauslemmana.
89 Toisaalta ominaisuutta vakiomäärä muistia käyttävät kaikki automaattimme, esim. kahviautomaattimme 50, 100 q q q , 100 q q 3 muistaa syötetyn kokonaisrahasumman, jos se on < 200 senttiä. Muuten se muistaa vain että syötetty summa on 200 senttiä. Eli se muistaa vain äärellisen monta eri vaihtoehtoa.
90 Esimerkki Tunnistetaan binäärijonot, joiden toiseksi viimeinen merkki on nolla: 0?? 1 0? ? Automaatti muistaa kaksi viimeistä lukemaansa bittiä. Tilat on nimetty näiden mukaan: tilassa 01 viimeisin luettu bitti oli 1 ja edeltävä oli 0. 1
91 Aakkostot Aakkosto Σ voidaan määritellä varsin vapaasti ja sovellukseen sopivaksi. Esim. Γ = {omena,päärynä,appelsiini} tai Σ = {[ ], [ ], [ ], [ ],..., [ ]}. Aakkoston Σ muodostavat siis kolmebittiset binäärivektorit; Σ = 2 3 = 8. Aakkoston Σ syötteitä voidaan kutsua kolmiuraisiksi. Esimerkiksi 4-merkkisessä syötteessä [ ] [ ] [ ] [ ] voidaan mieltää kolme rinnakkaista uraa: ylin, keskimmäinen ja alin.
92 Automaatti lukee näitä uria samaan tahtiin rinnakkain, sillähän on vain yksi lukupää. Tehtävä Jono aakkoston Σ symboleja määrittelee kolme riviä ykkösiä ja nollia. Tulkitaan nämä binäärilukuina, joissa eniten merkitsevä bitti on oikealla. Olkoon L = {w Σ alin rivi on kahden ylemmän rivin summa} Esimerkiksi [ eli ] [ ] [ ] L mutta [ ] [ ] L Osoita että tämä kieli L on säännöllinen = 4 mutta
93 Ratkaisu: Todistetaan kieli (määritelmän mukaan) säännölliseksi osoittamalla, että sillä on sen tunnistava äärellinen automaatti: A D {[ 0 ] [ 1 ] [ 0 ]} {[ 1 ]} B A = 0, 0, 1 B = C D = {[ ], [ ], [ ]} C = {[ ]} Tilan nimi = muistibitin arvo. Siirtymä suoritetaan, kun muistibitin + ylimmän uran bitin + keskiuran bitin summassa vähemmän merkitsevä bitti = alimman uran bitti, ja enemmän merkitsevä bitti = seuraava muistibitti eli kohdetila.
94 Tehtävä Olkoon Σ = {[ 0 0 ], [ 0 1 ], [ 1 0 ], [ 1 1 Jono aakkoston Σ symboleja määrittelee kaksi uraa ykkösiä ja nollia. Tulkitaan nämä binäärilukuina, joissa eniten merkitsevä bitti on oikealla. Olkoon ]}. L = {w Σ alin rivi on kolme kertaa ylin rivi} Esimerkiksi [ 1 1 ] [ 0 1 ] [ 1 1 ] [ 1 0 ] [ 0 0 ] [ 0 1 ] L ja [ 1 1 ] [ 0 1 ] L eli Osoita että tämä kieli L on säännöllinen = 39 ja 1 3 = 3.
95 Ratkaisu: Samaan tapaan kuin edellinen tehtävä, mutta nyt muistibittejä voi olla kaksi: = 0, 1 3 = 3 = (11) 2, eli tulokseen tulee 1 ja muistiin laitetaan 1. Jos muistissa on 1, ja lasketaan 0 3, tulokseksi tulee 1 (muistista), jos taas 1 3, tulos on 4 = (100) 2, joten tulosbitti on 0 ja muistiin jää 10, jne...
96 Tämän (ja edellisen) tehtävän ratkaisu tunnistaa kuuluuko syöte kieleen. Jos haluaisi oikeasti tehdä yhteenlaskukoneen (tai syötteen vakiolla kertovan koneen), niin ratkaisu voidaan helposti muuttaa transduktoriksi, jonka syötteenä luettaisiin vain ylintä (ja keskimmäistä) uraa, ja tulosteena kirjoitettaisiin alinta uraa. (Kahden syöteluvun kertolaskua ei kuitenkaan voine toteuttaa äärellisenä automaattina.) Jos ei käytettäisikään ura-aakkostoa, vaan aakkostona olisikin Σ = {0, 1, +, =}, niin kieli L = {x + y = z x, y ja z ovat binäärilukuja ja luku z on lukujen x ja y summa} ei olekaan säännöllinen: jos x ja y ovat tarpeeksi suuria lukuja, niin äärellinen automaatti ehtii unohtaa ne lukiessaan syötettä.
97 Sovelluksista Äärelliset automaatit sellaisenaan ovat hyödyllisiä merkkijonojen käsittelyssä, mistä myöhemmin lisää... Lisäämällä tilasiirtymiin satunnaisuutta saadaan Markovin ketjut eli satunnaisprosessit, joilla on äärellinen muisti. Perusversiossa Markovin ketjuihin ei tosin liity mitään syötettä. Markovin piilomallit (hidden Markov models) ovat lähempänä tässä esitettyjä äärellisiä automaatteja. Tilasiirtymäjärjestelmiä käytetään (etenkin hajautettujen järjestelmien) spesifioinnissa ja verifioinnissa.
98 Sovellus: viestinvälitysprotokollat Erilaisia protokollia voidaan kuvata äärellisinä automaatteina tai tilakoneina. Tarkastellaan yksikertaista vuorottelevan bitin protokollaa, jossa lähettäjäprosessi S ja vastaanottajaprosessi R kommunikoivat. S lähettää paketteja d 0, d 1, d 2,.... Paketti voi hukkua matkalla (kuten kuvassa d 1 ). R kuittaa saadun paketin (viestillään a) ja S lähettää seuraavan paketin lähetetään vasta kun on saanut edellisestä kuittauksen. Jos kuittausta ei kuulu sovitussa ajassa, niin paketti lähetään uudestaan: S timeout d 0 d 1 d 1 d 2 R a a a
99 Ongelma: Jos kuittaus a hukkuu, niin R voi saada duplikaattiviestin: S timeout d 0 d 1 d 1 d 2 R a a a a
100 Ongelma: Jos kuittaus a hukkuu, niin R voi saada duplikaattiviestin: S timeout d 0 d 1 d 1 d 2 R a a a a Ratkaisu 1: Numeroidaan viestit ja kuittaukset: timeout S d 0, 0 d 1, 1 d 1, 1 d 2, 2 R a, 0 a, 1 a, 1 a, 2
101 Ongelma: Jos kuittaus a hukkuu, niin R voi saada duplikaattiviestin: S timeout d 0 d 1 d 1 d 2 R a a a a Ratkaisu 1: Numeroidaan viestit ja kuittaukset: timeout S d 0, 0 d 1, 1 d 1, 1 d 2, 2 R a, 0 a, 1 a, 1 a, 2 Mutta tällöin tarvittaisiin yhä suurempia ja suurempia numeroita 0, 1, 2...
102 Protokollan parannus Riittää käyttää kahta numeroa (0 ja 1 parillinen/pariton viesti ): S timeout d 0, 0 d 1, 1 d 1, 1 d 2, 0 R a, 0 a, 1 a, 1 a, 0 S ja R voidaan mallintaa tilasiirtymäjärjestelminä:
103 Vuorottelevan bitin protokolla tilakoneina lähettäjä S a, 1 vastaanottaja R a, 1 d, 1 timeout timeout d, 0 d, 1 d, 1 d, 0 d, 1 d, 0 a, 0 d, 0 a, 0 Jos S ei saa ajoissa symbolia a, niin se lukee sen sijaan timeout-symbolin.
104 Epädeterministiset äärelliset automaatit Epädeterminismi tarkoittaa, ettei koskaan tarvitse myöntää olevansa väärässä. Anon. Epädeterministisellä automaatilla siirtymäfunktio δ liittää nykyisen tilan ja syötemerkin pariin (q, x) äärellisen joukon vaihtoehtoisia seuraavia tiloja. Epädeterministinen automaatti hyväksyy merkkijonon x jos sille on olemassa jokin hyväksyvä laskenta. Siis se hylkää merkkijonon x vain jos kaikki sen laskennat ovat hylkääviä. Ihan loogisesti: koska niin kääntäen x hyväksytään sille on jokin hyväksyvä laskenta x hylätään ei niin, että sille olisi jokin hyväksyvä laskenta sen kaikki laskennat hylkäävät.
105 Esimerkiksi epädeterministinen automaatti a a a b a q 0 q 1 q 2 q 3 b b hyväksyy syötemerkkijonon abbaba, koska sillä on hyväksyvä laskenta (q 0, abbaba) (q 0, bbaba) (q 0, baba) (q 0, aba) (q 1, ba) (q 2, a) (q 3, ε). Sillä on myös hylkääviä laskentoja kuten (q 0, abbaba) (q 0, bbaba) (q 0, baba) (q 0, aba) (q 0, ba) (q 0, a) (q 0, ε) mutta niitä ei siis oteta huomioon.
106 Determinismi vs. epädeterminismi Deterministisessä automaatissa siirtymä tarkoittaa, että nykyisestä tilasta mennään aina kohdetilaan sen δ(q, a). Epädeterministisessä automaatissa siirtymä r δ(q, a) tarkoittaakin, että tilasta q syötemerkillä a on mahdollista mennä tilaan r. Mutta voi olla muitakin mahdollisuuksia s δ(q, a). Deterministinen automaatti hyväksyy, jos se ainoa mahdollinen lopputilanne on hyväksyvä. Epädeterministinen automaatti hyväksyy, jos on mahdollista päätyä hyväksyvään lopputilanteeseen. Eli jos on jokin tapa valita aina sopivasti nykyiselle tilalle q i seuraava tila q i+1 δ(q i, a i ) siten, että syötteen a 0 a 1 a 2... a n loputtua ollaan jossakin hyväksyvässä tilassa q n. Tämä näyttää epäilyttävän epämekaaniselta: miten nykyisessä tilassa q i voitaisiin osata tehdä juuri oikea valinta näkemättä syötteen loppuosaa a i+1 a i+2 a i+3... a n? Epädeterminismillä onkin erilaisia tulkintoja, kuten:
107 Spesifikaationa, jossa kuvaillaan minkälaiset merkkijonot pitäisi hyväksyä, kertomatta tarkasti miten niiden hyväksyntä etenisi askel askeleelta. Etsintänä, jossa on operaatio etsi reitti tästä tilanteesta johonkin hyväksyvään lopputilanteeseen. Tämä voitaisiin mekanisoida vaikkapa TRA-kurssin keinoin syvyyssuuntaisena etsintänä kaikkien tilanteiden verkosta: DFS(q, x) : 1 if merkkijono x = ε 2 then return onko tila q hyväksyvä vaiko hylkäävä 3 else olkoon x = ay jossa a Σ ja y Σ 4 for each r δ(q, a) 5 do if DFS(r, y) 6 then return true 7 return false Epädeterministinen automaatti M = (..., q 0, F ) hyväksyy syötteen w jos kutsu DFS(q 0, w) palauttaa arvon true.
108 Rinnakkaisuutena, jossa epädeterministinen automaatti seuraa mahdollisia laskentojaan rinnakkain: Deterministinen Epädeterministinen laskenta laskenta hyväksy tai hylkää hyväksy hylkää Epädeterministiset laskennat muodostavat siis kokonaisen laskentapuun, jonka haarat vastaavat eri valintakohtia.
109 Ilmaisena neuvona. Epädeterministisen automaatin voidaan ajatella saavan jokaisessa valintatilanteessaan Mihinköhän seuraavista mahdollisista tiloista δ(q, a) minun kannattaisi siirtyä? jostakin ulkopuolelta vastauksen Siirry tilaan r, luota minuun! Silloin automaatin itsensä tehtäväksi jää vain varmentaa että sen saamat neuvot olivat oikein. Tai jos ajatellaan etsintää, niin automaatti ei itse joudu tekemään raskasta työtä, vaan työn tekee neuvonantaja ja automaatti saa työn tulokset ilmaiseksi. Tämän tulkinta tulee erityisen kiinnostavaksi silloin kun tarkastellaan automaatteja vahvempia laskentamalleja mutta rajoitetaan niille annettavien resurssien määrää esimerkiksi P? = NP-ongelma saa silloin tulkinnan jos jokin vastaus voidaan varmentaa nopeasti, niin voisiko sen myös laskea nopeasti ilman neuvojakin?.
110 Tärkeä tulos Deterministiset (Deterministic Finite Automata, DFA) ja epädeterministiset (Nondeterministic Finite Automata, NFA) automaatit tunnistavat täsmälleen samat kielet (eli säännölliset kielet). DFA ja NFA ovat ilmaisuvoimaltaan yhtä vahvoja laskennan malleja niillä voidaan hyväksyä samat kielet. Epädeterminismiä käyttämällä kielen esitystä voidaan kuitenkin usein selkeyttää ja yksinkertaistaa.
111 Epädeterministisessä automaatissa sallitaan myös ε-siirtymiä kuten kuvassa. Tällaisen ε-siirtymän kuten 1 ε 2 tulkinta on, että sitä pitkin pääsee tilasta 1 tilaan 2 lukematta yhtään syötemerkkiä. a a a 0 b b ε b Kuva : Epädeterministinen automaatti jossa on siirtymä tyhjällä merkkijonolla.
112 a a a a 0 0 b b 0 b ε b b Esimerkkinä syöte abbab Automaatti hyväksyy syötteen, koska sillä on kaksikin hyväksyvää laskentaa. a b
113 Seuraava NFA hyväksyy aakkoston {a, b, c} merkkijonot, joissa on osajonona ensin abb ja sen jälkeen ca tai ac. Huomaa ε-siirtymien mahdollistama modulaarisuus. a,b,c a,b,c ε "abb moduuli" a b b "mitä tahansa moduuli" ε ε "ca moduuli" c a ε a,b,c ε a c ε "ac moduuli"
114 Määritelmä Epädeterministinen äärellinen automaatti on viisikko M = (Q, Σ, δ, q 0, F ) jossa Q on äärellinen tilojen joukko, Σ on äärellinen syöteaakkosto, δ : Q Σ P(Q) on joukkoarvoinen siirtymäfunktio siis sen arvot δ(q, a) Q ovat tilajoukon Q osajoukkoja q 0 Q on alkutila ja F Q hyväksyvien lopputilojen joukko. Muista: Matematiikassa merkintä P(S) tarkoittaa joukon S potenssijoukkoa {X X S} eli kaikkien niiden joukkojen X joukkoa, jotka voidaan muodostaa joukon S alkioista. Esimerkiksi P({,, }) = {, { }, { }, { }, {, }, {, }, {, }, {,, }}.
115 Esimerkki a a q 0 a q 1 b q 2 a q 3 b b a b q 0 {q 0, q 1 } {q 0 } q 1 {q 2 } q 2 {q 3 } q 3 {q 3 } {q 3 } Nyt virhetilanne on helposti ilmaistavissa tyhjän seuraajatilajoukon avulla. Siirtymätaulukossa voidaan jättää joukkosulut poiskin: siis joukkoa {q 0, q 1 } voidaan merkitä myös suoraan sen alkioiden listana q 0, q 1. Tilanne (q, w) voi johtaa suoraan tilanteeseen (q, w ), jota merkitään samoin kuin ennen eli (q, w) (q, w ), jos w = aw ja q δ(q, a). Silloin (q, w ) on M tilanteen (q, w) mahdollinen välitön seuraaja. Muutoin määritelmät epädeterministisille automaateille ovat samat kuin aiemmin.
116 Tärkeän tuloksemme DFA NFA perustelua : Selvästikin deterministiset automaatit ovat epädeterminististen erikoistapaus jossa aina δ(q, a) 1. Siten kaikki edellisillä tunnistettavat kielet ovat tunnistettavissa myös jälkimmäisillä. : Mutta myös kääntäen (ja tämä on se yllättävämpi ja vaikeampi suunta): Jokaiselle epädeterministiselle automaatille M on olemassa saman kielen tunnistava deterministinen automaatti M. Tämä osoitetaan myöhemmin kehittämällä menetelmä, jolla syötteenä saadusta automaatista M voidaan muodostaa sitä vastaava M eli menetelmä determinisoida M.
117 Tehtävä Laadi sellainen aakkoston Σ = {a, b} epädeterministinen automaatti, joka hyväksyy täsmälleen ne merkkijonot, joissa esiintyy sekä merkkijono abba että merkkijono baba. Huomaa, että nämä esiintymät saavat olla päällekkäinkin: siis esimerkiksi merkkijono aaaabbababbb hyväksytään, koska siinä on alle- ja ylleviivauksella merkityt esiintymät. Tehtävä Laadi deterministinen automaatti edellisen tehtävän kielelle.
118 Epädeterministisen automaatin simulointi Palataan aiempaan esimerkkiin: a a a 0 b b ε b Kirjoitetaan algoritmi, joka ylläpitää muuttujassa NykyisetTilat listaa niistä tiloista, joissa automaatti voi olla.
119 0 Algoritmi käy laskentapuuta läpi leveyssuuntaisesti. NykyisetTilat = laskentapuun taso Kullakin askeleella sitä päivitetään laskemalla 1. saatua syötemerkkiä vastaavat seuraajatilat ja 2. ne tilat, joihin niistä päästään ε-siirtymillä. a b b a b
120 Tilajoukon R Q ε-sulkeuma E(R) koostuu niistä tiloista, joihin tilajoukosta R pääsee ε-kaaria pitkin. Siis R E(R) koska jokaisesta tilasta pääsee suoraan itseensä ilman yhtään (edes ε-)siirtymää, ja jos tilasta s E(R) on ε-siirtymä s ε t niin myös sen kohdetila t E(R). SimulateNFA(M, syöte): 1 NykyisetTilat E(q 0 ) // alkutilan ε-sulkeuma 2 while syötettä on yhä jäljellä 3 do a lue seuraava syötemerkki 4 SeuraajaTilat 5 for q NykyisetTilat 6 do SeuraajaTilat SeuraajaTilat δ M (q, a) 7 SeuraajaTilat E(SeuraajaTilat) 8 NykyisetTilat SeuraajaTilat 9 return F NykyisetTilat // onko saavutettu joku lopputila?
121 Algoritmi SimulateNFA tulkkaa epädeterministisen laskennan deterministiseksi. Yksittäinen syötemerkki käsitellään (pahimmassa tapauksessa) ajassa O( Q 2 ). Tästä tulkkauksesta päästään eroon kääntämällä, eli muodostamalla deterministinen automaatti, joka tunnistaa saman kielen. Menetelmä muodostaa DFA:n siirtymätaulukon siis etukäteen. Muuttujan NykyisetTilat arvot kuuluvat potenssijoukkoon P(Q). Siten sillä on korkeintaan P(Q) = 2 Q mahdollista arvoa joten voimme muodostaa äärellisen DFA:n laittamalla kukin mahdollinen NykyisetTilat-arvo omaksi tilakseen ja siirtymät kuten SimulateNFA ne laskisi.
122 Siis muodostamme NFA:sta M DFA:n M seuraavasti: Aakkosto on molemmilla sama Σ. Tilajoukko Q bm = P(Q M ). Siirtymäfunktio koostuu siirtymistä NykyisetTilat a SeuraajaTilat jossa nämä muuttujat NykyisetTilat, a ja SeuraajaTilat ovat kuten tulkkialgoritmin SimulateNFA riveillä 4 7. Eli kun annetaan tila NykyisetTilat Q bm ( P(Q M )), niin käydään läpi jokainen a Σ, ja lasketaan sille vastaava SeuraajaTilat P(Q M ) ( Q bm ). Alkutila on kuten sen rivillä 1: E(q 0 ), missä q 0 on NFA:n M alkutila. Hyväksyvät tilat ovat kuten sen rivillä 9: ne tilat, joihin sisältyy ainakin yksi NFA:n M lopputila.
123 1 Alusta tulos M sisältämään alkutila nimeltä E(NFA:n M alkutila q 0 ) ilman yhtään kaarta, ja merkitse se uudeksi 2 while tuloksessa M on uusia tiloja 3 do NykyisetTilat ota jokin niistä ja merkitse se vanhaksi 4 if joukkoon NykyisetTilat kuuluu ainakin yksi epädeterministisen automaatin M hyväksyvä tila 5 then merkitse NykyisetTilat hyväksyväksi tilaksi 6 else merkitse NykyisetTilat hylkääväksi tilaksi 7 for each a Σ 8 do laske SeuraajaTilat kuten algoritmin SimulateNFA riveillä if tila nimeltä SeuraajaTilat puuttuu tuloksesta M 10 then luo sellainen ja merkitse se uudeksi 11 Lisää tulokseen M siirtymä NykyisetTilat a SeuraajaTilat
124 Esimerkki Determinisoidaan epädeterministinen automaatti M a a a b a q 0 q 1 q 2 q 3 b b Esimerkiksi tilan s 2 = {q 0, q 2 } seuraaja syötemerkillä a on tila s 3 = {q 0, q 1, q 3 }, sillä s 3 sisältää täsmälleen kaikki joukkoon s 2 kuuluvien alkioiden seuraajat merkillä a: s 3 s 2 a q 0 a q 2 a q 0 q 3 q 1
125 a a a b a q 0 q 1 q 2 q 3 b b 1. Aloitetaan lisäämällä alkutila {q 0 } ja laskemalla siitä lähtevät siirtymät. a b {q 0 } = s 0 {q 0, q 1 } {q 0 } Jatketaan uudella tilalla {q 0, q 1 }.
126 a a a b a q 0 q 1 q 2 q 3 b b 2. Lasketaan tilan {q 0, q 1 } siirtymät: Jatketaan uudella tilalla {q 0, q 2 }. a b {q 0 } = s 0 {q 0, q 1 } {q 0 } {q 0, q 1 } = s 1 {q 0, q 1 } {q 0, q 2 }
127 a a a b a q 0 q 1 q 2 q 3 b b 3. Lasketaan tilan {q 0, q 2 } siirtymät: a b {q 0 } = s 0 {q 0, q 1 } {q 0 } {q 0, q 1 } = s 1 {q 0, q 1 } {q 0, q 2 } {q 0, q 2 } = s 2 {q 0, q 1, q 3 } {q 0 } 4. Saatiin uusi tila {q 0, q 1, q 3 } ja jatketaan sillä...
128 5.... ja aikanaan saadaan lopputulos: a b {q 0 } = s 0 {q 0, q 1 } {q 0 } {q 0, q 1 } = s 1 {q 0, q 1 } {q 0, q 2 } {q 0, q 2 } = s 2 {q 0, q 1, q 3 } {q 0 } {q 0, q 1, q 3 } = s 3 {q 0, q 1, q 3 } {q 0, q 2, q 3 } {q 0, q 2, q 3 } = s 4 {q 0, q 1, q 3 } {q 0, q 3 } {q 0, q 3 } = s 5 {q 0, q 1, q 3 } {q 0, q 3 } b a a a q 0 a q b 0, q 1 q 0, q 2 a q 0, q 1, q b 3 q 0, q 2, q 3 b a q 0, q 3 b b
129 Esimerkki Determinisoidaan aakkoston Σ = {M, I, U} seuraava epädeterministinen automaatti: M,I,U M,I,U M I U
130 Ratkaisu: Kun generoidaan koko potenssijoukko eli käytetään suoraa matemaattista määritelmää eikä while-algoritmia niin saadaan tulokseksi: M I U A {0} {0, 1}=E {0}=A {0}=A B {1} {2}=C C {2} {3}=D D {3} {3}=D {3}=D {3}=D E {0, 1} {0, 1}=E {0, 2}=F {0}=A F {0, 2} {0, 1}=E {0}=A {0, 3}=G G {0, 3} {0, 1, 3}=L {0, 3}=G {0, 3}=G H {1, 2} {2}=C {3}=D I {1, 3} {3}=D {2, 3}=J {3}=D J {2, 3} {3}=D {3}=D {3}=D K {0, 1, 2} {0, 1}=E {0, 2}=F {0, 3}=G L {0, 1, 3} {0, 1, 3}=L {0, 2, 3}=M {0, 3}=G M {0, 2, 3} {0, 1, 3}=L {0, 3}=G {0, 3}=G N {1, 2, 3} {3}=D {2, 3}=J {3}=D O {0, 1, 2, 3} {0, 1, 3}=L {0, 2, 3}=M {0, 3}=G jossa S P(Q) ovat saavutettavat tilat ne jotka myös while-algoritmi tuottaisi P(Q) \ S ovat saavuttamattomat tilat ne jotka while-algoritmi jättäisi tuottamatta.
131 Tulos tilasiirtymäkaaviona johon on piirretty vain saavutettavat tilat: I,U M I,U M I A E F U M U G I L M U I M I,U M M Sama minimoituna: I,U M M,I,U A M I E U M F I U G
132 Tehtävä Determinisoi seuraava automaatti: a 1 a, b b 2
133 Esimerkki Determinisoidaan 0 0 a ε c ε b d 1. Alkutilaksi saadaan E({a}) = {a, c, d}
134 Alkutilasta päästään tiloihin δ({a, c, d}, 0) = E(δ(a, 0) δ(c, 0) δ(d, 0)) a ε c = E({a, b} {c} ) ε = E({a, b, c}) = {a, b, c, d} ensimmäinen uusi tila b d δ({a, c, d}, 1) = {d} toinen uusi tila. 3. Käsitellään uudet tilat {a, b, c, d} ja... δ({a, b, c, d}, 0) = {a, b, c, d} δ({a, b, c, d}, 1) = {c, d} sama vanha tila kolmas uusi tila. 4. sitten tila {d}: δ({d}, 0) = δ({d}, 1) = neljäs uusi tila.
135 Sitten tilan {c, d} seuraajat: a ε c δ({c, d}, 0) = {c, d} sama vanha tila ε δ({c, d}, 1) = {d} toinen vanha tila. b d 6. Ei enää uusia tiloja; Lopputulos: tila 0 1 {a, c, d} {a, b, c, d} {d} {a, b, c, d} {a, b, c, d} {c, d} {c, d} {c, d} {d} {d} {a, b, c, d} 1 {c, d} {a, c, d} 1 1 {d}
136 Tehtävä Determinisoi automaatti: b 1 ε a a 2 3 a, b Tehtävä Determinisoi automaatti: ε 1 2 a a a, b 3 b
137 Hahmonsovituksesta Epädeterministisellä automaatilla voi helposti kuvata hahmonsovitusongelmia: esiintyykö annettu merkkijono y syötteessä x? Mikä tahansa yksittäinen merkkijono (eli yksialkioinen kieli) y = y 1 y 2 y 3... y m Σ voidaan tunnistaa yksinkertaisella epädeterministisellä automaatilla: y 1 y 2 y 3 y m... Σ Σ Kun tällainen automaatti determinisoidaan, tilojen lukumäärä m + 1 ei muutu. (Vrt. edellinen MIU-esimerkki.) Tällaisen epädeterministisen automaatin kaikkia laskentapolkuja voi myös simuloida tehokkaasti, jos m = O(tietokoneen bittisyys eli nykyään 32 tai 64) ns. shift-or/shift-and algoritmilla.
138 Mutta yleisessä tapauksessa (eli kun kyseessä on mielivaltainen säännöllinen kieli) voi tilojen määrä kasvaa pahimmillaan eksponentiaaliseksi, onhan P(Q) = 2 Q. Toisaalta yksinkertaiselle hahmonsovitusongelmalle osataan muodostaa deterministinen automaatti suoraankin ajassa O(m), ns. Knuth-Morris-Pratt algoritmi.
139 Ensimmäinen ekskursio: NFA:n simulointi Olkoon pitkä teksti t ja lyhyt merkkijono p ASCII-aakkoston merkkijonoja, ja n = t, m = p, ja m w, missä w on bittien lukumäärä int-muuttujassa (esim. 32 tai 64). Seuraava C-kielinen funktio kertoo kaikki kohdat missä p esiintyy t:ssä. Algoritmi perustuu NFA:n simuloimiseen, ja se toimii ajassa O(n) (nyt kun m w). Yleisesti ottaen mielivaltaisen NFA:n tehokas simuloiminen on kuitenkin avoin ongelma. Miten algoritmi toimii??? Tämä ei kuulu kurssiin. Ongelma on mahdollista ratkaista myös keskimääräisessä ajassa O(n log Σ (m)/m)... void shift_or (char * t, int n, char * p, int m) { unsigned b [256], d = ~0, mm = 1 << (m - 1); int i; } for (i = 0; i < 256; i++) b [i] = ~0 >> (sizeof (int) * 8 - m); for (i = 0; i < m; i++) b [p [i]] &= ~(1 << i); for (i = 0; i < n; i++) { d = (d << 1) b [t [i]]; if ((d & mm)!= mm) printf("löytyi, kohdasta %d\n", i); }
140 Toinen ekskursio: Knuth Morris Pratt Olkoot edelleen t ja p ASCII aakkoston merkkijonoja, ja n = t, m = p. Seuraava C-kielinen funktio kertoo kaikki kohdat missä p esiintyy t:ssä. Algoritmi perustuu deterministiseen automaattiin. Tässä on kuitenkin ε-siirtymiä, mutta näitä ei seurata jos on toinenkin vaihtoehto, joten haarautumista ei tapahdu... Algoritmi toimii ajassa O(n + m). Miten se täsmällisesti ottaen toimii??? Tämäkään ei kuulu kurssiin. void kmp (char * t, int n, char * p, int m) { int i = 0, j = -1, b [m]; b [i] = j; while (i < m) { while (j >= 0 && p [i]!= p [j]) j = b [j]; b [++i] = ++j; } i = j = 0; while (i < n) { while (j >= 0 && t [i]!= p [j]) j = b [j]; i++; j++; if (j == m) { printf("löytyi, kohdasta %d\n", i); j = b [j]; } } }
141 Epädeterminismin sovelluksia Näemme pian, että epädeterminismi yksinkertaistaa huomattavasti monia automaattikonstruktioita. Sillä on käyttöä tietojenkäsittelytieteessä laajemminkin, esim. Rinnakkaisjärjestelmät: Asynkronisessa laskennassa eri prosessien suoritusjärjestys ei ole tiukasti kontrolloitavissa. Ajattelemme siis, että suoritusjärjestys määräytyy epädeterministisesti ja vaadimme esim. että järjestelmä ei saa lukkiutua millään suoritusjärjestyksellä. Laskennan vaativuus: Monille tärkeille etsintä- ja optimointiongelmille on helppo esittää epädeterministinen ratkaisu, mutta sen tehokas simuloiminen deterministisellä (eli oikealla) tietokoneella on avoin ongelma. Vrt. edellä: NFA:n muuntaminen DFA:ksi saattaa aiheuttaa tilojen lukumäärän eksponentiaalisen kasvun. (Mutta ei aina, kuten nähtiin.)
142 Säännölliset lausekkeet ja kielet Säännöllisellä lausekkeella (regular expression) voi kuvailla, minkä muotoisia merkkijonoja hyväksytään. XML-dokumenttien kaavioformalismeissa käytetyt elementtien sisältömallit ovat oleellisesti säännöllisiä lausekkeita. Esim. XHTML-kielen taulukkoelementtien rakennekuvaus: <!ELEMENT table (caption?, (col* colgroup*), thead?, tfoot?, (tbody+ tr+))> XHTML-taulukko voi sisältää alla olevassa järjestyksessä valinnaisen otsikon mielivaltaisen jonon sarake- tai sarakeryhmä-elementtejä valinnaisen ylä- ja alatunnisteen epätyhjän jonon body- tai rivielementtejä.
143 Tekstinhaku säännöllisillä lausekkeilla Unix-komennolla grep (=global regular expression parser) voidaan etsiä tiedostosta säännöllisellä lausekkeella kuvailtuja rivejä. Esim. Etsi tekstitiedostosta lap.txt rivit, joilla esiintyy sana automaatti : egrep automaatti lap.txt Etsi tekstitiedostosta lap.txt rivit, joilla esiintyy sana automaatti tai sana kieli : egrep \(automaatti\ kieli\) lap.txt Etsi tekstitiedostosta lap.txt rivit, joilla esiintyy äärellinen automaatti tai kahviautomaatti : egrep \(äärellinen \ kahvi\)automaatti lap.txt Etsi tekstitiedostosta tiedosto.txt osoitteita, jotka ovat muotoa... katu tai... tie jota seuraa asunnon numero: egrep [A-ZÅÄÖ][a-zåäö]*\(katu\ tie\) [0-9][0-9]* tiedosto.txt
144 Monien editoreiden search ja search & replace -komennot sallivat myös säännölliset lausekkeet; samoin jotkut ohjelmointikielet sisältävät regexp kirjastoja. Eräs mahdollisuus grep-toiminnon toteuttamiseksi olisi seuraava: 1. Muodostetaan äärellinen automaatti, joka hyväksyy tasan sellaiset merkkijonot, joissa esiintyy annettu hahmo. 2. Selataan syöte rivi kerrallaan käyttämällä tätä automaattia, ja tulostetaan hyväksytyt rivit. Kysymys: Kuinka monimutkaisia hahmoja tällä periaatteella voidaan käsitellä? Esim. edellä muodostettiin hahmoista automaatti ja kieli uusi hahmo tai-operaattorilla. Samoin sallittiin hahmon iterointi eli katenointi itsensä kanssa ([0-9]*). Kuinka voimakkaat operaattorit voidaan siis sallia?
145 Kielten yhdiste, tulo ja sulkeuma Olkoot A ja B aakkoston Σ kieliä, eli A, B Σ. Kielten A ja B yhdiste on kieli A B = {x Σ x A tai x B} suoraan joukko-opista. Jos yhdistettä ajattelee eräänlaisena yhteenlaskuna niin sen nolla on koska sen lisäämisellä ei ole vaikutusta: X = X = X.
146 Kielten A ja B katenaatio eli tulo on kieli AB = {xy Σ x A, y B} eli ne merkkijonot xy jotka alkavat jollakin kielen A merkkijonolla x ja jatkuvat jollakin kielen B merkkijonolla y. Jos tuloa ajattelee eräänlaisena kertolaskuna niin sen ykkönen on {ε} koska Vastaavasti nollalla kertominen nollaa : {ε} X = X {ε} = X. X = X =. Tyhjä kieli ja tyhjä merkkijono ε ovat eri asioita, niillähän on eri tyyppikin. Kielessä {ε} on yksi alkio, nimittäin ε, joten se ei ole tyhjä.
147 Kielen A potenssit A k, jossa k N, määritellään iteratiivisesti: A 0 = {ε} A k = AA k 1 = AAA... A } {{ } k kertaa = {x 1 x 2 x 3... x k x i A kaikilla i = 1, 2, 3,..., k} (k 1) Kielen A sulkeuma on kieli A = k N A k = {ε} A AA AAA... = {x 1... x k k 0, x i A kaikilla i = 1, 2, 3,..., k} Tässä vihdoin on monissa paikoissä käyttämämme merkinnän potenssiin tarkoitettu sisältö: (...) koostuu niistä merkkijonoista, jota saadaan liimailemalla yhteen äärellisen monta tämän kuvauksen (...) mukaista merkkijonoa.
148 Erikoistapauksena = {ε}... = {ε} koska nolla(kin) potenssiin nolla on yksi. Esimerkki Tarkastellaan aakkoston {a,... z, 0,..., 9} kieliä A = {aa, bb} ja B = {01, 02}. Nyt A B = {aa, bb, 01, 02} AB = {aa01, aa02, bb01, bb02} A = {ε, aa, bb, aaaa, aabb, bbaa, bbbb, aaaaaa, aaaabb, aabbaa, aabbbb, bbaaaa,...}
149 Säännöllinen lauseke (syntaksi) Määritelmä Aakkoston Σ säännölliset lausekkeet (regular expressions) määritellään induktiivisesti säännöillä: Vakiot ja ε ovat jokaisen aakkoston säännöllisiä lausekkeita; aakkoston jokainen merkki a Σ on sen säännöllinen lauseke; jos r ja s ovat aakkoston Σ säännöllisiä lausekkeita, niin myös (r s), (rs) ja r ovat sen säännöllisiä lausekkeita; ja muita aakkoston Σ säännöllisiä lausekkeita ei ole.
150 Säännöllisen lausekkeen merkitys Määritelmä Aakkoston Σ säännöllinen lauseke r kuvaa kielen L(r) Σ : L( ) = L(ε) = {ε} L(a) = {a} kaikilla a Σ L((r s)) = L(r) L(s) L((rs)) = L(r)L(s) L(r ) = (L(r))
151 Esimerkki Aakkoston {a, b} säännöllisiä lausekkeita ovat esimerkiksi r 1 = ((ab)b), r 2 = (ab), r 3 = (ab ), r 4 = (a(b (bb))). näiden lausekkeiden kuvaamat kielet ovat L(r 1 ) = ({a}{b}){b} = {ab}{b} = {abb}; L(r 2 ) = {ab} = {ε, ab, abab, ababab,...} = {(ab) i i 0}; L(r 3 ) = {a}({b}) = {a, ab, abb, abbb,...} = {ab i i 0}; L(r 4 ) = ({a}{b, bb}) = {ab, abb} = {ε, ab, abb, abab, ababb,...} = {x {a, b} kutakin a-kirjainta x:ssä seuraa 1 tai 2 b-kirjainta }
152 Lyhennysmerkintäsopimuksia Sulkumerkkejä voidaan vähentää seuraavilla säännöillä: Operaattoreista sitoo vahvimmin, sitten tulo, ja heikoimmin. Yhdiste- ja tulo-operaatioiden assosiatiivisuus: L(((r s) t)) = L((r (s t))) L(((rs)t)) = L((r(st))). Käytetään tavallisia kirjasimia mikäli sekaannuksen vaaraa merkkijonoihin ei ole. Esim. edellisen esimerkin lausekkeet r 1 = ((ab)b), r 2 = (ab), r 3 = (ab ), r 4 = (a(b (bb))) yksinkertaisemmin: r 1 = abb, r 2 = (ab), r 3 = ab, r 4 = (a(b bb)) Lyhennysmerkintä r + tarkoittaa toista r ainakin kerran. Siten r + = rr = r r. Esim. jos d = (0... 9), niin d + (tai dd ) tarkoittaa, että merkkijono koostuu yhdestä tai useammasta numeromerkistä.
153 Säännöllinen kieli (uudelta kannalta) Voimme määritellä säännöllisen kielen A myös sellaisena, joka voidaan kuvata jollakin säännöllisellä lausekkeella r, eli A = L(r). Osoitamme pian, että tämä on yhtenevää aiemman määritelmämme ( äärellisen automaatin hyväksymä kieli ) kanssa. Esimerkki Olkoon aakkosto Σ = {a, b, c,...}. Säännöllisen lausekkeen Σ automaattiσ kuvaama kieli on niiden merkkijonojen joukko jotka sisältävät osamerkkijonon automaatti. Siis tämä kieli on säännöllinen.
154 Esimerkki Olkoon Σ = {A, B, C,..., Ö, a, b, c,..., ö, 0, 1, 2,..., 9, }. Osoite on muotoa (Ll )(katu tie) dd (l ε)(dd ε) ddddd Ll jossa d on lyhenne lausekkeelle ( ) l on lyhenne lausekkeelle (a b c... ö) eli pienille kirjamille ( letters ), ja L on lyhenne lausekkeelle (A B C... Ö) eli suurille kirjaimille ( LETTERS ). Huomaa: Monet regexp -kirjastot ja -työkalut lisäävät ominaisuuksia jotka eivät ole säännöllisiä (kuten esimerkiksi rajoittamattomat viitteet taaksepäin, NP-täydellinen ongelma... ). Tällä kurssilla käsitellään vain aitoja säännöllisiä lausekkeita ilman tällaisia lisäyksiä.
155 Esimerkki Ohjelmointikielen C etumerkittömät liukuluvut (jotka ovat tyyppiä float, double tai long double) määritellään seuraavasti: (kokonaisosa).(desimaaliosa) (e tai E) [+ tai ] (eksponentti) [suffiksi] merkintä [... ] tarkoittaa että kyseinen osa voi myös puuttua kokonaisosa ja desimaaliosa koostuvat numeroista joko kokonaisosa tai desimaaliosa voi puuttua (mutta eivät molemmat) joko (i) desimaalipiste tai (ii) (e tai E) ja eksponentti voivat puuttua (mutta eivät molemmat) suffiksi: F tai f: float, L tai l: long double, muuten double Säännöllinen lauseke (ilman suffikseja): (d +.d.d + )(ε ((e E)(+ ε)d + )) d + (e E)(+ ε)d + Kieleen kuuluvat esim. seuraavat merkkijonot: 12.,.12, 1.2, 1.2E3, 1.2e3, 1E2, 1e E-3,
156 Tehtävä Tarkastellaan seuraavia aakkoston Σ = {a, b} säännöllisiä lausekkeita. Esitä kunkin lausekkeen kuvaamasta kielestä kaksi merkkijonoa, jotka kuuluvat kieleen, ja kaksi, jotka eivät kuulu kieleen! 1. a b 2. a(ba) b 3. a b 4. (aaa) 5. (ε a)b 6. Σ aσ aσ aσ Tehtävä Etsi lyhyin merkkijono, joka kuuluu seuraavan lausekkeen kuvaamaan kieleen! 1. a (b abb)b b 2. a b b(a (ab) ) b 3. (a ab)(a ab) b
157 Tehtävä Muodosta seuraavia kieliä vastaavat säännölliset lausekkeet: 1. {w {a, b} w:n kolmanneksi viimeinen merkki on a} 2. {w {a, b} w sisältää joko merkkijonon ab tai ba} 3. {w {a, b} w sisältää parillisen määrän merkkiä a} 4. {w {a, b} w:n pituus on pariton} 5. {w {a, b} w:ssä on 3:lla jaollinen määrä merkkiä b} Tehtävä Esitä yksinkertaisemmassa muodossa seuraavat lausekkeet (eli anna lauseke, joka yhä kuvaa saman kielen, mutta jossa on vähemmän operaattoreita): 1. ( ) 2. (0 10 ) 3. 1 (011 ) 1 (011 ) 0
158 Säännöllisten lausekkeiden sieventäminen Säännöllisillä kielillä on yleensä useita vaihtoehtoisia kuvauksia, esim.: Σ = L((a b) ) = L((a b ) ) = L(a b (a b) ba(a b) ) =... Merkitään r s, kun L(r) L(s), eli kun säännollisen lausekkeen r kuvaama kieli on osa säännöllisen lausekkeen s kuvaamaa kieltä. Säännölliset lausekkeet r ja s ovat ekvivalentit, merkitään r = s, silloin kun r s ja s r, eli kun L(r) = L(s). Lausekkeen sievennys = yksinkertaisimman ekvivalentin lausekkeen määritys. Tässä luonteva yksinkertaisuuden mitta on sen sisältämien operaattoreiden lukumäärä sen pituus kirjoitettuna.
159 Sievennyssääntöjä I Muistisääntö: on hieman kuin yhteenlasku, ja on hieman kuin 0. Tulo on hieman kuin kertolasku, ja ε on hieman kuin 1.
160 Sievennyssääntöjä II r r = r (mutta rr r kun r, ε) r (s t) = (r s) t r(st) = (rs)t r s = s r r(s t) = rs rt (r s)t = rt st r = r = r εr = r (mutta ε r = r vain jos ε L(r))
161 Sievennyssääntöjä III = ε r = r r ε = r + ε r = (r ε) (r ) = r
162 Tavalliset joukko-operaatiot vs. säännöllisten kielten operaatiot Olkoot A = {a, b} ja B = {c, d}. Joukot Kielet A B = {a, b, c, d} A B = {a, b, c, d} karteesinen tulo A B = tulo AB = {(a, c), (a, d), (b, c), (b, d)} {ac, ad, bc, bd} potenssijoukko P(A) = sulkeuma A = {, {a}, {b}, {a, b}} {ε, a, b, aa, ab, ba, bb, aaa, aab, aba, abb, baa, bab, bba, bbb, aaaa, aaab, aaba, aabb,...} P(X ) = 2 n, kun X = n X =, jos X {ε}
163 Miten osoittaa, että L(r) = L(s)? Matemaattinen ratkaisutapa on osoittaa, että 1. L(r) L(s) eli r s, ja 2. L(s) L(r) eli s r. Tai helpommin (mutta ehkä työläämmiin) vastaavilla automaateilla: 1. Muodosta lausekkeille r ja s deterministiset automaatit M r ja M s. 2. Tutki hyväksyvätkö automaatit saman kielen. (Tämän voi tehdä joko tutkimalla tuottaako niiden minimointi identtisen tuloksen sivuutamme minimoinnin tai tarkastelemalla niiden ns. tuloautomaattia.) Miten lausekkeesta voidaan muodostaa automaatti?
164 Säännölliset lausekkeet ja äärelliset automaatit Osoitetaan seuraava tärkeä tulos: 1. Jokaisen säännöllisen lausekkeen r kuvaama kieli voidaan tunnistaa äärellisellä automaatilla M r : Muodostetaan lauseketta r vastaava (epädeterministinen) ε-automaatti. Haluttaessa tämä epädeterministinen automaatti voidaan vielä determinisoida (ja minimoida). 2. Jokaisen äärellisen automaatin M tunnistama kieli L(M) voidaan kuvata säännöllisellä lausekkeella r M : Redusoidaan automaatti 2-tilaiseksi ns. lausekeautomaatiksi, josta voidaan lukea vastaava säännöllinen lauseke.
165 Säännöllisestä lausekkeesta automaatti Säännöllinen lauseke on käytännöllinen tapa määritellä esim. tekstinhaku- tai tyypintarkistustehtäviä. Miten näin määritelty tehtävä saadaan suoritettua? Lause Säännöllisen lausekkeen kuvaama kieli voidaan tunnistaa äärellisellä automaatilla. Todistus: Annetaan eräs menetelmä, jolla voidaan muodostaa mielivaltaista säännöllistä lauseketta r vastaava ε-automaatti M r, jolla L(M r ) = L(r). (Tämä on ns. Thompson-konstruktio. Muitakin menetelmiä on.)
166 r = : r = s t: r = ε: ε ε M s ε r = a, a Σ a ε M t ε r = st: r = s : ε M s M t ε M s ε ε Kuva : Säännöllisestä lausekkeesta äärelliseksi automaatiksi.
167 Esimerkki Muodostetaan säännöllistä lauseketta ((ab ) (b a)) vastaava äärellinen automaatti. a a a b b a, b ε ε ε ε ε ε ε ε ε ε a a ε ε b b ε ε M ab M b a ε ε ε ε ε ε M (ab ) (b a) b
168 Tehtävä Muodosta säännöllistä lauseketta (0 1) 0 (0 1) 01 = (0 1) (0 01) = (0 1 ) (0 01) vastaava äärellinen automaatti. Tehtävä Muodosta C-kielen liukuluvut tunnistava automaatti säännöllisestä lausekkeesta (d +.d.d + )(ε ((e E)(+ ε)d + )) d + (e E)(+ ε)d + jossa d = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ovat 10-järjestelmän numeromerkit. Toisaalta ekvivalentti säännöllinen lauseke voidaan esittää monella tapaa, ja osa-automaatit josta lopullinen ratkaisu saadaan voivat olla erilaisia. Eli ratkaisuja on erilaisia (siihen saakka kunnes on determinisoitu ja minimoitu).
169 Automaatista säännöllinen lauseke Lause Jokainen säännöllinen kieli voidaan kuvata säännöllisellä lausekkeella. Todistus: Esitetään menetelmä, jolla automaatista M voidaan kirjoittaa ekvivalentti säännöllinen lauseke r M, eli jolla L(r M ) = L(M).
170 Menetelmä toimii poistamalla välitiloja, jotka esiintyvät automaatin alkutilasta lopputilaan johtavilla poluilla. Menetelmän edetessä polku tilasta i tilaan j korvataan oikotiellä eli yhdellä suoralla siirtymällä. Tällaisen oikotien pitää yhä kuvata kaikki samat merkkijonot jotka kerätään kuljettaessa tilasta i tilaan j alkuperäisiä siirtymiä pitkin. r Niinpä oikotie i j nimetään säännöllisellä lausekkeella r, joka kuvaa nämä merkkijonot.
171 Menetelmässä käytetään siis ns. lausekeautomaatteja, joissa siirtymillä on yksittäisen syötemerkin sijasta kokonainen säännöllinen lauseke r intuitio on, että siirtymässä i j 1. luetaan jäljellä olevan syötteen alusta jokin lausekkeen r mukainen merkkijono, ja 2. jatketaan jäljelle jääneen syötteen loppuosan käsittelyä tilasta j. Tavalliset automaatit ja ε-automaatit ovat lausekeautomaattien erikoistapauksia, koska yksittäiset merkit ja ε ovat myös säännöllisiä lausekkeita. Ohitamme formaalin määritelmän (vaikkei se olekaan hankala).
172 Olkoon automaatin alkutila s. Yksinkertaistetaan käsittelyä olettamalla, että automaatilla on täsmälleen yksi lopputila, josta lisäksi ei lähde siirtymiä eikä se myöskään ole alkutila s. (Jos näin ei ole, korvataan vanhat lopputilat yhdellä uudella, johon lisätään ε-siirtymät vanhoista lopputiloista. Ks. kuva.) ε ε f ε Kuva : Lopputilojen korvaaminen yhdellä uudella.
173 Oikoteiden muodostaminen: 1. Poistetaan ensin kaikki rinnakkaiset siirtymät: Jos on kaksi samojen tilojen välistä p q p q siirtymää i j ja i j, korvaa ne yhdellä yhteisellä siirtymällä i j kuten kuvassa. Selvästi tämä säilyttää samoina ne merkkijonot, jotka kerättäisiin kulkemalla näitä siirtymiä pitkin solmusta i solmuun j. p i j = i p q j q Kuva : Kaksi rinnakkaista siirtymää yhdeksi.
174 2. Sitten poistetaan automaatista välitilat: Sanotaan, että tila k s on välitila, tila i sen edeltäjä ja tila j sen seuraaja, jos p automaatissa on siirtymät i i r j k ja k j, ja k i, j. (Edeltäjä ja seuraaja voivat kuitenkin keskenään olla sama tila.) Millaisia merkkijonoja pitää välitilan k ohittavan oikopolun i R i,j j hyväksyä? V: Niitä, joiden alkuosa hyväksytään kaarella (i, k) ja loppuosa kaarella (k, j). p i.r j Lähtökohtaisesti saadaan siis suora siirtymä i j. Jos välitilasta k on lisäksi silmukkasiirtymä k q k takaisin itseensä, tällaista voidaan kulkea mielivaltaisen monta kertaa. Tällöin oikopoluksi tulee kuten kuvassa. i p i.q.r j j (2)
175 Jos välitilan edeltävän i ja seuraajan j välillä oli jo suora siirtymä i oikopolun lauseke lisätään siihen uutena vaihtoehtona: tai (jos välitilalla oli silmukkasiirtymä) i i r i,j j, niin r i,j p i r j j (3) r i,j p i q r j j (4) Jos välitilan edeltäjä ja seuraaja ovat sama tila, niin oikopolku on silmukkasiirtymä.
176 Kun välitilalle on muodostettu oikopolku sen jokaisesta edeltäjästä sen jokaiseen seuraajaan, niin tämä välitila k ja kaikki siihen liittyvät siirtymät voidaan poistaa. Kun rinnakkaiset siirtymät ja välitilat on poistettu, niin: Automaatissa on jäljellä sen alkutila s ja lopputila f. Jos alkutilasta ei ole siirtymää lopputilaan, automaattia vastaava lauseke on : Alkuperäisessä automaatissa ei ole millään syötteellä lopputilaan johtavaa polkua. r Muussa tapauksessa redusoidussa lausekeautomaatissa on siirtymä s f. Jos tilasta s on lisäksi silmukka s lauseke alkaa iteraatiolla q. Tällöin tulos on q s takaisin itseensä, tunnistettua kieltä kuvaava q r (5) Jos tällaista alkutilan silmukkaa ei ole, niin sitä vastaava osa q jää pois lopputuloksesta (5).
177 q i. p i k r j. j p i q r j Kuva : Oikotie välisolmun k ohi.
178 q r s r f q Kuva : Lauseke kutistuneesta automaatista.
179 Esitetään tämä menetelmä vielä algoritmina: 1 Lisää kuvan mukainen uusi hyväksyvä tila f ellei sellaista jo ole p q 2 while on rinnakkaiset siirtymät i j ja i j 3 do korvaa ne yhdellä siirtymällä i p q j 4 while on välitiloja s, f 5 do k jokin (mikä tahansa) välitila p i 6 for each siirtymä i k jossa i k 7 do for each siirtymä k r j j jossa j k q 8 do if on siirtymä k k 9 then t p i q r j 10 else t p i r j 11 u if on siirtymä i j 12 then päivitä se muotoon i 13 else lisää siirtymä i t j u t j 14 poista tila k ja kaikki nämä siihen liittyvät siirtymät 15 r if on siirtymä s f 16 q then if on siirtymä s s 17 then return q r 18 else return r 19 else return
180 Otetaan esimerkki tästä menetelmästä: (i) alkuperäinen automaatti: (ii) lisätään uusi lopputila: s 1 s (iii) yhdistetään rinnakkaiset: 1 1 ε 1 f (iv) poistetaan tila: ε s s ε f ε 0 1 ε (0 1)ε f
181 (v) poistetaan tila: (vi) poistetaan tila: s 1 (0 1)(ε (0 1)ε) s 1(0 1)(ε (0 1)ε) 0 1 Nyt voidaan lukea lopputulos f 0 1 f (0 1) 1(0 1)(ε (0 1)ε) jota voidaan vielä hieman sieventää muotoon (0 1) 1(0 1)(ε 0 1) josta voidaan lukea vastaus: alkuperäinen automaatti hyväksyy ne binäärijonot, joiden toiseksi tai kolmanneksi viimeinen merkki on 1. Lausekkeita voi ja kannattaakin sievennellä jo menetelmän aikana.
182 Tehtävä Muodosta seuraavan automaatin tunnistamaa kieltä kuvaava säännöllinen lauseke: a, b 1 2 a a b 3 b
183 Säännöllisten kielten sulkeumaominaisuudet Matematiikassa sanotaan että joukko X on suljettu jonkin operaation suhteen, jos soveltamalla operaatiota joukon X alkioihin saadaan tulokseksi aina joukon X alkioita eli jos operaatio ei vie pois joukosta X. Esimerkiksi luonnollisten lukujen joukko N on suljettu yhteenlaskun suhteen, koska m + n N jokaisella m, n N. Se ei kuitenkaan ole suljettu vähennyslaskun suhteen, koska esimerkiksi 5 8 N, vaikka 5, 8 N. Tarkastellaan säännöllisten kielten joukkoa (s.o. merkkijonojoukkojen joukkoa). Minkälaisten operaatioiden suhteen se on suljettu?
184 Lause Olkoot L 1 ja L 2 aakkoston Σ säännöllisiä kieliä. Tällöin myös seuraavat ovat säännöllisiä kieliä: yhdiste L 1 L 2 leikkaus L 1 L 2 katenaatio eli tulo L 1 L 2 komplementti L 1 = Σ \ L 1 erotus L 1 \ L 2 (Kleenen) sulkeuma (L 1 ) käänteiskieli (L 1 ) R = {w R w L 1 } eli kielen L 1 merkkijonot takaperin kirjoitettuina. Toisin sanoen säännöllisten kielten joukko on suljettu kaikkien näiden operaatioiden suhteen. Todistus: Perustellaan alla.
185 Huomaa että lause on yksisuuntainen: Esimerkiksi yhdiste L 1 L 2 voi olla säännöllinen, vaikka sen osat L 1 ja L 2 eivät ole. Esimerkiksi säännöllinen kieli voidaan muodostaa osista ja L(a b ) = L 1 L 2 L 1 = {a i b j i j} L 2 = {a i b j i > j} joista kumpikaan ei ole säännöllinen (mikä voidaan osoittaa pumppauslemmalla ).
186 Sulkeuma säännöllisten operaattoreiden suhteen Sännölliset kielet nähdään helposti suljetuiksi säännöllisten lausekkeiden operaattoreiden suhteen: Olkoot A ja B säännöllisiä kieliä, eli A = L(p) ja B = L(q) joillain säännöllisillä lausekkeilla p ja q. Tällöin A B = L((p q)) AB = L((pq)) ja A = L(p ) Kukin on ilmaistavissa säännöllisellä lausekkeella, eli kukin on säännöllinen kieli.
187 Sulkeuma komplementoinnin suhteen Esimerkki Laaditaan automaatti, joka tunnistaa kielen L(M) = {w {a, b} w ei sisällä merkkijonoa bab}. Laaditaan ensin deterministinen automaatti, joka tunnistaa sen komplementtikielen L(M) = {w {a, b} w sisältää merkkijonon bab}. Haluttu automaatti saadaan vaihtamalla hyväksyvät tilat hylkääviksi ja päinvastoin. a b a,b a b a,b b a b b a b a a Huom: virhetilojen on oltava mukana, koska niistä tulee hyväksyviä tiloja. Sama voidaan tehdä jokaiselle säännölliselle kielelle.
188 Muistutus: De Morganin säännöt Tuttuja koulumatematiikasta tai diskreeteistä rakenteista tai matemaattisesta logiikasta. Ilmaisevat joukko-opissa, että komplementointi kääntää yhdisteet leikkauksiksi ja päinvastoin: A B = A B A B = A B. Osoitetaan näiden nojalla, että säännöllisten kielten A ja B leikkaus on säännöllinen: 1. A B = A B 2. De Morgan: A B = A B 3. Säännöllisten kielten komplementteina A ja B ovat säännöllisiä. 4. Siten myös niiden yhdiste A B on säännöllinen, ja samoin sen komplementti. Säännölliset kielet nähdään edellisen nojalla suljetuiksi myös joukkoerotuksen suhteen, kun lähdetään liikkeelle tiedosta A \ B = A B.
189 Säännöllisten kielten leikkaus/yhdiste/erotus automaatilla Vaihtoehtoisesti säännöllisten kielten A ja B joukko-opillinen yhdistelmä L (yhdiste, leikkaus tai erotus) voidaan tunnistaa ns. tuloautomaatilla. Olkoot M 1 = (Q 1, Σ, δ 1, q 1, F 1 ) ja M 2 = (Q 2, Σ, δ 2, q 2, F 2 ) deterministiset automaatit, joilla A = L(M 1 ) ja B = L(M 2 ). Muodostetaan uusi automaatti M, jonka tiloja ovat alkuperäisten automaattien tilojen parit (p, q) Q 1 Q 2 siirtymäfunktio δ muodostuu komponenttitilojen siirtymistä: δ ((p, q), a) = (δ 1 (p, a), δ 2 (q, a)) lopputilat F valitaan sen mukaan mitä joukko-operaatiota toteutetaan: Jos L = A B, niin F = {(p, q) p F 1 tai q F 2 } Jos L = A B, niin F = {(p, q) p F 1 ja q F 2 } Jos L = A \ B, niin F = {(p, q) p F 1 ja q F 2 }.
190 Säännöllisen kielen käänteiskieli Miksi säännöllisen kielen L käänteiskieli (L) R olisi säännöllinen? Olkoon M = (Q, Σ, δ, q 0, F ) kielen L tunnistava DFA. Kuten aiemmin, voidaan olettaa (sallimalla ε-siirtymiä), että automaatilla on yksikäsitteinen lopputila f. Muodostetaan käänteiskielen hyväksyvä NFA M asettamalla sen alkutilaksi f ja lopputilaksi q 0 ja kääntämällä automaatin M siirtymät päinvastaisiksi. Formaalisti automaatin M siirtymäfunktio δ : Q (Σ {ε}) P(Q) määräytyy säännöllä δ (q, a) := {p Q δ(p, a) = q}.
191 Säännöllisten kielten rajoituksista Kysymys: Kuinka voidaan havaita, ettei ongelma ratkeakaan äärellisillä automaateilla? Eli ettei vastaava formaalikieli olekaan säännöllinen?
192 Esimerkki Onko sisäkkäisten sulkulausekkeiden muodostama kieli L ( ) = {( k ) k k 0} säännöllinen? Yritetään tehdä sille automaatti: ( ( ( ( q 0 q 1 q n 1 q n ) ) ) ) q 2n q 2n 1 q n+2 q n+1 ) ( ( ( ( q 0 q 1 q n 1 q n ) ) ) ) Mutta entäpä jos sisäkkäisiä sulkupareja onkin n + 1 kpl?
193 Automaattien rajallinen muisti Ääärellinen automaatti muistaa syötteen alkuosan vain tilojensa avulla. Se ei siis voi pitää kirjaa kaikista näkemistään merkeistä. Ääretön kieli voi olla säännöllinen vain jos siinä on jokin toistuva rakenne. Automaatissa silmukka, säännöllisessä lausekkeessa sulkeuma (...). Säännöllisten kielten pumppauslemma formalisoi tämän havainnon. Kielen osoittaminen säännölliseksi ei ole laskennallisesti ratkeava ongelma, vaan siihen tarvitaan ihmisen matemaattista intuitiota on keksittävä sille automaatti tai lauseke tai todistettava se sulkeumaominaisuuksien avulla säännöllisiksi tiedetyistä kielistä tai...
194 Saattaa näyttää ilmeiseltä, että äärellisen muistin ajatuksen soveltaminen olisi jotenkin intuitiivisesti selvää, eli että muistivaatimukset näkisi jotenkin suoraan. Kieli A = {w {0, 1} w sisältää yhtä monta nollaa ja ykköstä} ei ole säännöllinen (todistetaan pian... ). Mutta kieli onkin säännöllinen. B = {w {0, 1} w:ssä esiintyy 01 ja 10 yhtä monta kertaa} Tehtävä Todista että tämä kieli B on säännöllinen. Vihje: Mieti millä merkillä jono w B voi alkaa ja millä loppua.
195 Lause Kieltä C = {0 n 1 n n N} ei voi tunnistaa äärellisellä automaatilla. Todistus: Osoitetaan, että vastaoletuksesta C = L(M) jollain äärellisellä automaatilla M seuraa ristiriita: Olkoon M vastaoletuksen mukainen automaatti ja siinä k = Q tilaa, ja m = k/2. Koska L(M) = C, niin silloin myös syöte s = 0 m 1 m L(M). Tämän syötteen s pituus s = 2m k. Merkitään sen merkkejä s = s 1 s 2... s 2m. Syötteellä s automaatti käy yhteensä 2m + 1 tilassa, mukaan lukien alkutila (joista osa (tai kaikki) voivat olla samoja). Toisin sanoen, automaatti käy tiloissa: r 1 0 r2 0 0 rm+1 1 rm r2m+1. Eli alkutila q 0 = r 1 ja δ(r i, s i ) = r i+1, missä r i Q. Havainto: Q = k < 2m + 1 joten jonossa r 1... r 2m+1 ainakin yksi tila esiintyy useammin kuin kerran, eli r i = r j jollain i < j.
196 Automaatti tekee merkkijonolla s i... s j 1 silmukan tilasta r i takaisin tilaan r i = r j : x = s 1... s i 1 r i = r j z = s j... s 2m r 1 r 2m+1 y = s i... s j 1 Automaatti siis hyväksyy alkuperäisen jonon s = xyz = xy 1 z kiertämällä silmukan yhden kerran. Merkitään vastaavaa hyväksyvää laskentaa lyhyesti: r 1 x ri y ri z r2m+1.
197 Silmukan sisältävästä hyväksyvästä laskennasta saadaan uusi hyväksyvä laskenta ohittamalla silmukka: r 1 x ri z r2m+1 Siis automaatti hyväksyy myös merkkijonon xy 0 z = xz. Silmukkaa voidaan myös toistaa mielivaltaisen monta kertaa: r 1 x ri y ri y ri z r2m+1. r 1 x ri y ri y ri y ri z r2m+1. Siis automaatti hyväksyy myös merkkijonot xy 2 z = xyyz, xy 3 z = xyyyz, xy 4 z = xyyyyz,... Kysymys: Kuuluuko merkkijono xy l z kieleen C = {0 n 1 n mahdollisella toistokertojen lukumäärällä l N? n N} jokaisella
198 Tarkastellaan silmukan mahdollisia sijainteja merkkijonon s keskikohdan suhteen: x = s 1... s i 1 r 1 r i = r j r 2m+1 z = s j... s 2m 1. i < j m + 1: nyt y = 0 j i. 2. i < m + 1 < j: nyt y = 0 m+1 i 1 j m m + 1 i < j: nyt y = 1 j i. y = s i... s j 1 Missään näistä tapauksista esimerkiksi xy 2 z ei kuulu kieleen C: tapauksessa 1 siinä on liikaa nollia tapauksessa 2 se on muotoa tapauksessa 3 siinä on liikaa ykkösiä.
199 Koska automaatti kuitenkin hyväksyy merkkijonon xy 2 z, tämä on ristiriita oletuksen C = L(M) kanssa. Siis kieltä C ei voi tunnistaa k-tilaisella äärellisellä automaatilla millään k, eli kieli C ei ole säännöllinen.
200
201 Edellisen todistuksen perusidea oli osoittaa, että jos M on k-tilainen automaatti, niin kielellä L(M) on pumppauspituus k: Määritelmä Kielellä A on äärellinen pumppausominaisuus, jos on olemassa sellainen p, että mikä tahansa s A, jolla s p, voidaan esittää muodossa s = xyz, missä 1. xy i z A kun i = 0, 1, 2,..., 2. y > 0 ja 3. xy p. Tällöin p on (eräs) kielen A pumppauspituus. Siis x = ε ja z = ε ovat sallittuja, mutta y ε (ehto 2, koska muuten pumpattavuus olisi triviaalia). Kun kielellä on äärellinen pumppausominaisuus, millä tahansa riittävän pitkällä merkkijonolla s on epätyhjä keskiosa y, jota pumppaamalla saadaan uusia kieleen kuuluvia merkkijonoja xy 2 z, xy 3 z,...
202 Lause (Säännöllisten kielten pumppauslemma) Jokaisella säännöllisellä kielellä on äärellinen pumppausominaisuus. Todistus: Sivuutetaan; vastaava kuin edellisen lauseen todistuksessa. Intuitiivisesti: Äärettömän säännöllisen kielen tunnistavassa automaatissa on silmukka siten, että 1. xy i z A: silmukka voidaan kiertää mielivaltaisen monta (i) kertaa, ja silti voidaan päästä jonolla z hyväksyvään tilaan. 2. y > 0: silmukka ei ole tyhjä, vaan siihen kuuluu vähintään yksi ei-tyhjä siirtymä. 3. xy p: laskennan täytyy joutua silmukkaan ennen kuin automaatista loppuvat tilat. x = s 1... s i 1 r i = r j z = s j... s 2m r 1 r 2m+1 y = s i... s j 1
203 Pumppautuvuusehto 1 tarkoittaa, että kieli sisältää merkkijonot xz, xyz, xyyz, xyyyz,... Ehdosta 2 seuraa, että nämä jonot ovat toinen toistaan pidempiä. Siis merkkijonoa y pumppaamalla saadaan rajattomasti uusia kieleen kuuluvia merkkijonoja. Ehdon 3 nojalla tämä osajono y löytyy sanan s alkuosasta, jonka pituus on p. Kielen pumppautuvuus tarkoittaa, että jokainen tarpeeksi pitkä kieleen kuuluva merkkijono on pumppautuva jollain ehdot täyttävällä osajonollaan y.
204 Pumppauslemman soveltaminen Kiinnostavaa vain äärettömille kielille (äärelliset kielet ovat aina säännöllisiä). Pumppauslemman mukaan millä tahansa säännöllisellä kielellä A on pumppausominaisuus, toisin sanoen jollakin p N mille tahansa sellaiselle s A joka on riittävän pitkä eli s p on olemassa jako s = xyz jolla pumppausehdot 1 3 toteutuvat. Pumppauslemmalla ei voi osoittaa kielen säännöllisyyttä, vain ei-säännöllisyyden. (Eikä aina sitäkään, koska on olemassa ei-säännöllisiä kieliä, joilla on äärellinen pumppauspituus... ) Ideana todistus kontrapositiolla, eli lemmaa käytetään käänteisesti ; A on säännöllinen A on pumpattavissa A ei ole pumpattavissa A ei ole säännöllinen
205 Toisin sanoen, on osoitettava, että mille tahansa p N on olemassa sellainen s A, että s p ja mille tahansa sen jaolle s = xyz jokin pumppausehdoista 1 3 jää toteutumatta. Siis aluksi voimme itse valita sanan s sopivasti helpottamaan todistusta, mutta sitten meidän pitää käydä läpi kaikki mahdolliset tavat jakaa se osiin x, y ja z ja osoittaa, että mikään jako ei toteuta pumppausehtoja. Toisin sanoen, kun halutaan todistaa kieli ei-säännölliseksi, tehdään vastaoletus että se olisikin säännöllinen, ja osoitetaan että tästä seuraa ristiriita jonka voi osoittaa käyttämällä pumppauslemmaa mutta jonka voi osoittaa muutenkin: Esimerkiksi sulkeumaominaisuuksien avulla ( palautetaan ongelma tunnettuun kieleen).
206 Esimerkki Kieli C = {0 n 1 n Todistus: n N} ei ole säännöllinen. Tehdään vastaoletus että C olisikin säännöllinen. Silloin sillä olisi äärellinen pumppausominaisuus, eli jokin vakio p siten, että jokainen ainakin niin pitkä merkkijono s C (eli s p) jakautuu jotenkin osiin s = xyz jotka täyttävät ominaisuuden 3 ehtoa. 1. xy i z C kun i = 0, 1, 2,..., 2. y > 0 ja 3. xy p. Me emme tiedä vakion p arvoa, mutta me saamme valita sellaisen merkkijonon s kuin haluamme (kunhan valitsemme tarpeeksi pitkän). Kun olemme valinneet merkkijonomme s, niin me emme tiedä sen jaosta s = xyz muuta kuin nämä 3 ominaisuutta. Koska tavoittelemme ristiriitaa, niin useimmiten kannattaa valita s siten, että ehdot 2 ja 3 ovat voimassa, ja osoittaa että silloin ehtoa 1 ei enää saadakaan voimaan.
207 Tässä todistuksessa kannattaa valita s = 0 p 1 p (tai jokin vielä pidempi) koska silloin ehdot 2 ja 3 kertovat meille paljon osien xy rakenteesta: jossa k > 0 mutta j + k p. x = 0 j y = 0 k z = 0 p (j+k) 1 p Koska tämä järkeilymme ei oleta näistä arvoista j ja k mitään muuta, niin olemme tulleet käyneeksi läpi samalla kertaa kaikki mahdolliset jaot. Nyt ehdon 3 mukaan (vaikkapa) i = 0 kertaa pumpattu merkkijono 0 j 0 p (j+k) 1 p = 0 p k 1 p C. Mutta toisaalta kielen C määritelmän mukaan pitäisi olla koska k > 0. samalla merkkijonolla 0 p k 1 p C Tässä on etsimämme ristiriita joka todistaa, että vastaväite olikin väärin, eli että alkuperäinen väite olikin oikein.
208 Pumppauslemman ohella käytössämme ovat myös säännöllisten kielten sulkeumaominaisuudet ja muut säännöllisiksi ja ei-säännöllisiksi tunnetut kielet. Esimerkki Osoita, että D = {w {0, 1} w sisältää yhtä monta nollaa ja ykköstä} ei ole säännöllinen. Todistus: Tehdään taas vastaoletus: D on säännöllinen. Kieli 0 1 on selvästi säännöllinen (joko kuvaavan lausekkeensa tai tunnistavan automaattinsa kautta). Siten kieli (0 1 ) D on säännöllinen (tunnettu sulkeumaominaisuus). Tämä on ristiriita, koska (0 1 ) D on sama kuin C = {0 n 1 n on aiemmin todistettu ei-säännölliseksi. n N}, joka
209 Esimerkki Osoita (toistamiseen), että kieli D = {w {0, 1} w sisältää yhtä monta nollaa ja ykköstä} ei ole säännöllinen. Todistus: Tehdään jälleen se vastaoletus että D on säännöllinen. Edetään tällä kertaa pumppauslemmalla: Valitaan s = 0 p 1 p. Olkoon s = xyz D, missä y ε ja xy p. Nyt y koostuu yhdestä tai useammasta nollasta. Koska xyz D, niin xyyz sisältää nollia enemmän kuin ykkösiä, joten xyyz D. Ristiriita. Miten valitaan sopiva s? Jos olisi valittu s = (01) p, ei olisi saatu ristiriitaa, koska tätä voidaan pumpata (esim. x = ε, y = 01, z = (01) p 1 ). Pitäisi siis keksiä (sille tuntemattomalle) automaatille hankalia tapauksia.
210 Heuristisia ohjeita ei-säännöllisyystodistuksiin Mikä ominaisuus tekee kielen ei-säännölliseksi?. Usein ominaisuus koskee kahta sanan osaa, joiden välillä vallitsee jokin ehto. Tämä ominaisuus voi koskea esim. tiettyjen merkkien lukumäärien keskinäistä suhdetta, esim. L 1 = {a k b m c m k, m = 0, 1, 2,...} L 2 = {a m b 2m m = 0, 1, 2,...} sanan eri osia, esim. sanan alku- ja loppuosa riippuvat jotenkin toisistaan: L 3 = {ww R w Σ } L 4 = {ww w Σ }.
211 Mikä on yksinkertaisin, mielivaltaisen pituinen merkkijono, jossa tämä ominaisuus esiintyy? Joskus kielessä on todistuksen kannalta täysin turhia (säännöllisiä) osia, esim. kielessä L 1 merkin a lukumäärällä ei ole mitään väliä voidaan valita merkkijono b m c m. Mutta jos ehdon osapuolten välissä on tuollainen säännöllinen osa, se saattaa olla tarpeen osapuolien erottamiseen toisistaan, esim. kielessä L 5 = {a m b k a m m, k = 0, 1, 2,...} tarvitaan ainakin yksi b erottamaan alkuosan ja loppuosa merkit a. Valitaan esim. a m ba m. Jos kielen alku- ja loppuosa riippuvat jotenkin toisistaan, mutta muuten ne saavat olla mitä tahansa, riittää erottaa alku- ja loppuosa toisistaan. Esim. kielen L 4 kohdalla voidaan valita a m ba m b tai ba m ba m.
212 Valitse sana s siten, että pumpattava osajono y kuuluu sen ensimmäiseen p merkkiin. Testaa kaikki pumppauslemman mukaiset jaot s = xyz, xy p ja y ε. Jokaisella jaolla kokeile pumppausta kierroslaskurin i arvoilla 0, 2, 3,... kunnes löytyy sellainen arvo i, että xy i z ei kuulu kieleen yleensä i = 0 tai i = 2 riittää. Tutkittavien tapausten vähentämiseksi kannattaa valita sana s siten, että sen erilaisia jakoja osiin xyz olisi mahdollisimman vähän. Tätä käytimme todistaessamme, että kieli C = {0 n 1 n n N} ei ole säännöllinen: valitsimme merkkijonon s niin pitkäksi, että alkuosa x ja pumppautuva osa y olivat molemmat 0-jonoja.
213 Säännöllisten kielten luokka on suljettu (erityisesti) leikkauksen ja komplementin suhteen. On annettu kieli A, joka pitäisi osoittaa ei-säännölliseksi. Valitaan jokin säännöllinen kieli B, Jos nyt A B ei ole säännöllinen, niin myöskään A ei ole säännöllinen. (On kuitenkin oltava tarkkana, esim. kahden ei-säännöllisen kielen leikkaus voi olla säännöllinen.) Jos A (komplementti) on ei-säännöllinen, niin myös A on ei-säännöllinen. Voidaan siis soveltaa pumppauslemmaa kieliin C = A B tai D = A mutta jos C tai D on jokin tunnetusti ei-säännöllinen kieli, erillistä pumppauslemma-todistusta ei tarvita.
214 Pikakertaus: tähän mennessä... Deterministinen äärellinen automaatti (DFA): yksinkertainen laskentalaite, muistia vain vakiomäärä, syötteen pituudesta riippumatta. Säännölliset kielet: niiden kielten luokka, joka voidaan tunnistaa DFA:lla. Epädeterministinen äärellinen automaatti (NFA): kieli voidaan tunnistaa DFA:lla jos ja vain jos se voidaan tunnistaa NFA:lla. NFA on hyödyllinen kuvausformalismi. DFA voi vaatia eksponentiaalisesti enemmän tiloja kuin NFA. Kieli voidaan tunnistaa DFA:lla jos ja vain jos se voidaan kuvata säännöllisellä lausekkeella. Kaikki kielet eivät ole säännöllisiä. Pumppauslemmaa voidaan käyttää kielen epäsäännöllisyyden osoittamiseen. Eräs esimerkki ei-säännöllisestä kielestä on {w {a, b} w = w R }
215 Tähän mennessä: säännölliset kielet, tunnistus äärellisellä automaatilla Seuraavaksi: kontekstittomat kielet, tunnistus pinoautomaatilla Myöhemmin (LAT-kurssilla): kontekstilliset ja rekursiiviset kielet: tunnistus Turingin koneella ( tietokoneella ) Kaikki muut kielet: vain osittain ratkeavia ( kyllä -tapauksessa) tai täysin ratkeamattomia.
216 ratkeamattomat ongelmat tyyppi 0: rajoittamattomat kielet rekursiivisesti lueteltavat kielet tunnistus: universaali Turingin kone (pysähtyy "kyllä" tapauksessa) rekursiiviset kielet tunnistus: Turingin kone + riittävän mittainen työnauha (pysähtyy aina), RAM kone, ohjelmointikielet tyyppi 1: kontekstiset kielet tunnistus: Turingin kone + kohtuullisen (eli polynomisen) mittainen työnauha tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet; tunnistus: äärellinen automaattivakiomäärä muistia äärelliset kielet
217 Koetehtäviä? Yleisesti, samantyylisiä kuin luentojen esimerkit ja kotitehtävät. Perustehtäväprototyyppi: Tehtävä Laadi DFA / NFA joka tunnistaa kielen X. Determinisoi automaatti käyttäen luennoilla annettua menetelmää. Mikä on automaattia / kieltä vastaava säännöllinen lauseke? Muunna säännöllinen lauseke automaatiksi tai automaatti lausekkeeksi käyttäen luennoilla annettua menetelmää. Jne...
218 Soveltavampaa: Tehtävä Säännöllinen kieli A voidaan tunnistaa deterministisellä äärellisellä automaatilla M A. Kielen A komplementtikieli A voidaan tunnistaa automaatilla M A, joka saadaan automaatista M A vaihtamalla hyväksyvät tilat ei-hyväksyviksi, ja ei-hyväksyvät hyväksyviksi. Toisin sanoen säännöllisten kielten luokka on suljettu komplementin suhteen. Edelleen, olkoon M A epädeterministinen automaatti, joka tunnistaa kielen A. Voidaanko automaatista M A vaihtaa hyväksyvien ja ei-hyväksyvien tilojen roolit edellä kuvatulla tavalla, ja saada tulokseksi epädeterministinen äärellinen automaatti joka tunnistaa kielen A? Onko epädeterminististen automaattien tunnistamien kielten luokka suljettu komplementoinnin suhteen?
219 Tehtävä Miten mielivaltaisesta NFA:sta saadaan NFA jossa on vain yksi hyväksyvä tila? Tehtävä Voiko säännöllistä kieltä 0 1 tunnistaa deterministisellä äärellisellä automaatilla, jossa on vain yksi hyväksyvä tila? Perustele. Tehtävä Osoita, että säännöllisten kielten luokka on suljettu leikkauksen suhteen. Tehtävä Olkoon A säännöllinen kieli. Osoita, että myös A R = {w R w A} on säännöllinen. Tehtävä Olkoot kielet A ja B säännöllisiä. Onko kieli C = A B = (A B) (B A) säännöllinen? (Siis w C, jos w kuuluu joko kieleen A tai B, mutta ei molempiin.) Perustele.
220 Tehtävä Mitkä seuraavat aakkoston Σ = {a, b} kielistä ovat säännöllisiä? 1. E = {a n a n n N} 2. F = {wuw R w, u Σ + } 3. G = {ww w Σ } 4. H = {a i b j i j}
221 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.
222 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.
223 Johdatteleva esimerkki: Miten kuvaisit seuraavat kielet? Sisäkkäisten sulkulausekkeiden kieli: L ( ) = { ( k ) k k 0 } { } if else-parien muodostama kieli: 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 sulkulauseke. Tällöin S on sisäkkäinen sulkulauseke, jos 1. S = ε tai 2. S on muotoa (S ), missä myös S on sisäkkäinen sulkumerkkijono. Toinen kuvaustapa (ensimmäinen kontekstiton kielioppimme): 1. S ε 2. S (S) Esimerkiksi merkkijonon ((())) tuottaminen: S (S) ((S)) (((S))) (((ε))) = ((()))
224 Vastaava jäsennyspuu (tähän palataan vielä): S S S ( ( ( ε ) ) )
225 Kontekstittoman kieliopin idea Joukko muuttujasymboleita ja muunnossääntöjä tämän muuttujan esiintymän saa korvata tuolla merkkijonolla joka voi vuorostaan sisältää uusia muuttujasymbolien esiintymiä. Yksi näistä muuttujasymboleista on erityinen aloitussymboli. Muunnetaan merkkijonoa näillä säännöillä, kunnes siinä ei enää esiinny muuttujasymboleita. Näin on tuotettu lopullinen merkkijono.
226 Esimerkki 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. 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 Kussakin vaiheessa on korvattu alleviivattu muuttujasymbolin esiintymä.
227 Kontekstittoman kieliopin formaali määritelmä Määritelmä 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 ω.
228 Intuitiivisesti kontekstiton kielioppi G = (V, Σ, P, S) tuottaa merkkijonoja Σ seuraavalla epädeterministisellä algoritmilla: 1 r S 2 while r sisältää välikesymboleja 3 do valitse jokin A N (siis vaikka ensimmäinen tai viimeinen) jonosta r = αaβ, missä α V on sitä ennen tuleva osa, ja β V on sen jälkeen tuleva osa 4 valitse jokin välikkeen A sääntö A ω P 5 r αωβ 6 tulosta näin saatu r Silloin kieliopin G tuottama formaali kieli L(G) muodostuu merkkijonoista r, jotka tämä algoritmi voi tulostaa valitsemalla säännöt sopivasti rivillään 4.
229 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 kieliopissa G aritmeettisille lausekkeille.
230 Merkkijono γ 0 V, voi tuottaa tai johtaa merkkijonon γ n V, jos on olemassa jono merkkijonoja V siten, että γ 0 γ 1 γ 2 γ n G G G G 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 γ 0 γ n G Esimerkiksi aritmeettisten lausekkeiden kieliopilla G pätee T F (E) a G
231 koska siinä voidaan johtaa T F G F F G (E) F G (E) a. Erikoistapauksena jokainen merkkijono γ V voi tuottaa itsensä eli γ γ G tyhjällä jonolla (jossa n = 0). Esimerkiksi T F T F. G
232 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 kieliopissa aritmeettisille lausekkeille. Kieliopin G lause on sen pelkistä päätemerkeistä koostuva lausejohdos: S γ ja γ Σ. G Esimerkiksi (a + a) a on lause esimerkin kieliopissa aritmeettisille lausekkeille.
233 Kieliopin G tuottama tai kuvaama kieli koostuu sen lauseista: { } L(G) = γ Σ S γ. G L(G) on siis kaikkien niiden lauseiden (merkkijonojen) joukko, jotka voidaan tuottaa kieliopilla G aloittamalla sen lähtösymbolista S. Määritelmä Formaali kieli L Σ on kontekstiton, jos se voidaan tuottaa jollakin kontekstittomalla kieliopilla.
234 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.
235 Kontekstittoman kieliopin yleistys on konteksti(lli)nen kielioppi (context-sensitive grammar). Tällaisen kieliopin säännöt ovat muotoa αaβ αωβ jossa α, β V ja ω V +. Tällainen sääntö tulkitaan siten, että muuttuja A voidaan korvata (epätyhjällä) merkkijonolla ω jos sen edessä on α ja perässä β eli jos A on lauseyhteydessä jotakinαaβmuuta niin silloin siitä voidaan johtaa jotakinαωβmuuta. Lisäksi voidaan sallia produktio S ε, jotta kielioppi voi hyväksyä myös tyhjän merkkijonon.
236 Esimerkiksi kieli {a n b n c n n N} ei ole kontekstiton, mutta se voidaan esittää käyttämällä kontekstisia sääntöjä. 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.
237 Jos sallitaan rajoittamattomat produktiot α β, missä α V + ja β V, niin saadaan rajoittamattomat kieliopit, joilla voidaan kuvata kaikki algoritmisesti generoitavissa olevat kielet.
238 ratkeamattomat ongelmat tyyppi 0: rajoittamattomat kielet rekursiivisesti lueteltavat kielet tunnistus: universaali Turingin kone (pysähtyy "kyllä" tapauksessa) rekursiiviset kielet tunnistus: Turingin kone + riittävän mittainen työnauha (pysähtyy aina), RAM kone, ohjelmointikielet tyyppi 1: kontekstiset kielet tunnistus: Turingin kone + kohtuullisen (eli polynomisen) mittainen työnauha tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet; tunnistus: äärellinen automaattivakiomäärä muistia äärelliset kielet
239 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 α, β, γ,..., ω.
240 Kielioppi esitetään usein pelkkänä sääntöjoukkona: A 1 ω ω 1k1 A 2 ω ω 2k2. A m ω m1... ω mkm Tällöin 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.
241 Esimerkki Sisäkkäisten sulkujonojen muodostaman kielen L ( ) = {( k ) k k 0} tuottaa kielioppi G ( ) = ({S, (, )}, {(, )}, {S ε, S (S)}, S) Esimerkki 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 kielioppiin.
242 Esimerkki 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 ε}.
243 Esimerkki Yksinkertaisten aritmeettisten lausekkeiden muodostaman kielen L expr tuottaa kielioppi jossa V = {E, T, F, a, +,, (, )}, Σ = {a, +,, (, )}, G expr = (V, Σ, P, E) (6) P = {E T, E E + T, T F, T T F, F a, F (E)}.
244 Kieliopilla G expr voidaan johtaa esim. seuraavat lausejohdokset: P : 1. E T 2. E E + T 3. T F 4. T T F E E + T T F + T a F + T a (T ) + T T + T F F + T a (E) + T a (F ) + T 5. F a a (a) + T a (a) + F 6. F (E) a (a) + a
245 Toinen kielioppi kielen L expr tuottamiseen on G expr = (V, Σ, P, E), (7) jossa V = {E, a, +,, (, )}, Σ = {a, +,, (, )}, P = {E E + E, E E E, E a, E (E)}
246 Esimerkki XML-dokumenttien kaavioformalismit kuten DTD (Document Type Definition) muistuttavat kontekstittomia kielioppeja. Dokumenttikaavio kuvaa dokumentin elementtirakennetta, joka näkyy sen XML-koodauksessa käytettävistä elementtitunnisteista (eli tägeistä ) kuten <lasku> ja </lasku> alla: <lasku><asiakas><etunimi>kalle</etunimi> <sukunimi>könönen</sukunimi> </asiakas> <tuote><nimi>suksi</nimi><hinta>99</hinta><lkm>2</lkm></tuote> <tuote><nimi>pitoteippi</nimi><hinta>5</hinta><lkm>1</lkm></tuote> </lasku>
247 Dokumenttikaavioiden välikesymboleina käytetään elementtien nimiä kuten alla: <!ELEMENT lasku (asiakas, tuote+)> <!ELEMENT asiakas (etunimi, sukunimi, osoite?)> <!ELEMENT tuote (nimi, hinta, lkm)> Validi elementti on tällöin sitä vastaavan välikesymbolin tuottama lause. Elementtisisällölle tyypillinen valinnaisuus ja toisto kuvataan säännöllisillä lausekkeilla. Sikäli dokumenttikaaviot muistuttavat ns. laajennettuja kontekstittomia kielioppeja (ECFG), joiden produktiot voivat samoin sisältää säännöllisiä lausekkeita. Oleellisin ero kontekstittomiin kielioppeihin: Kontekstittomat kieliopit kuvaavat merkkijonoja. Dokumenttikaaviot sitä vastoin kuvaavat konkreettisen tekstiesityksen sijasta hierarkkista elementtirakennetta. Siten dokumenttikaaviot vastaavat pikemmin ns. säännöllisiä puukielioppeja, joita vastaavat laskentamallit ovat ns. puuautomaatteja.
248 Esimerkki 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} Tällaisia virkkeitä voidaan tuottaa esim. seuraavilla kontekstittoman kieliopin G rel VIRKE SUBJ SL PRED ATTR OBJ SL joka PRED ATTR OBJ SL ε säännöillä: 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
249 Mitä virkkeitä voit johtaa lähtösymbolista VIRKE? Esimerkiksi: VIRKE SUBJ SL PRED ATTR OBJ peikko SL PRED ATTR OBJ peikko joka PRED ATTR OBJ SL PRED ATTR OBJ peikko joka PRED ATTR OBJ SL metsästi ATTR OBJ peikko joka PRED ATTR OBJ SL metsästi hirmuista OBJ peikko joka PRED ATTR OBJ SL metsästi hirmuista jänistä peikko joka pelkäsi ATTR OBJ SL metsästi hirmuista jänistä peikko joka pelkäsi vihaista OBJ SL metsästi hirmuista jänistä peikko joka pelkäsi vihaista tyttöä SL metsästi hirmuista jänistä peikko joka pelkäsi vihaista tyttöä metsästi hirmuista jänistä. Kontekstittomat kieliopit ovat luontaisia positionaalisille kielille, jossa kuka teki mitä kenelle ilmaistaan niiden paikoilla lauseessa. Esimerkiksi englannin kielessä on sanajärjestys on valtaosin subjekti-verbi-objekti (SVO) kuten yllä. Mutta suomen kielessä sanajärjestys onkin vapaa ja kuka teki mitä kenelle ilmaistaankin sijamuodoilla.
250 Esimerkki 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äsennin (englanniksi parser )) voidaan laatia suoraviivaisesti perustuen kielioppiin. Jäsennystä edeltää yleensä selausvaihe, jossa ohjelman lähdekoodi pilkotaan yllä kuvattuihin osiin ( varatut sanat, muuttujat, aliohjelmien nimet, vakiot, jne) käyttäen äärelliseen automaattiin perustuvaa transduktoria.
251 Tehtävä 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 } }
252 Muita sovelluksia ovat esimerkiksi pseudotiedettä suoltava puppugeneraattori
253 ... sekä kasvikieliopit (nimeltään L- eli Lindenmayer-systeemit): Niiden ideana on mallintaa sitä biologista kontrollimekanismia, joka määrää, että tähän kohtaan kasvaa uusi oksa, tuohon kohtaan taas uusi lehti. Vastaavantapaisia, hyödyllisempiä, sovelluksia on muitakin, kuten neuroverkkojen rakenteen generointi kieliopilla (joka on voitu generoida vaikkapa geneettisillä algoritmeilla), yms.
254 Induktiivisista notaation määritelmistä Usein määritellään jokin notaatio induktiivisesti eli itseensä viittaavasti kuvailemalla se luonnollisella kielellä. Itse asiassa silloin määritelläänkin usein notaatiolle kontekstiton kielioppi, sitä vain ei lausuta ääneen. Esimerkiksi edellä määriteltiin aakkoston Σ säännölliset lausekkeet: Vakiot ja ε ovat jokaisen aakkoston säännöllisiä lausekkeita siis kieliopissa on säännöt S ja S ε. aakkoston jokainen merkki a Σ on sen säännöllinen lauseke siis kieliopissa on oma sääntönsä S a jokaiselle a Σ jos r ja s ovat aakkoston Σ säännöllisiä lausekkeita, niin myös (r s), (rs) ja r ovat sen säännöllisiä lausekkeita siis kieliopissa on säännöt S (S S) S (SS) S S joissa on käytetty sitä mahdollisuutta viitata tähän parhaillaan määriteltävänä olevaan notaatioon myös sitä määrittelevien sääntöjen oikeilla puolilla.
255 Sitten usein jatketaan määrittelemällä säännöt, joilla sulkuja voi jättää pois. Sen vastine kieliopissa on hierarkkinen rakenne. Esimerkiksi säännöllisille lausekkeille määriteltiin että Operaattoreista sitoo vahvimmin, sitten tulo, ja heikoimmin. Vastaava hierarkkinen rakenne esitetään uusilla välikkeillä ja säännöillä jotka korvaavat entiset: S T S T UT S T T U U U U V U (S) V V ε V a jokaisella merkillä a Σ jossa U sitoo vahvimmin, sitten T ja heikoimmin S. Sulkuja tarvitaan vain silloin, kun hypätään vahvemmasta takaisin heikompaan. Ideana on, että notaatiolla kirjoitettujen ilmausten rakenne eli ns. jäsennyspuu säilyy yksiselitteisenä vaikka sulkuja ei olekaan. Tähän palataan myöhemmin.
256 Myös induktiivisesti määritellyn notaation merkitys määritellään induktiivisesti, eli suhteessa tähän ääneen lausumattomaan kielioppiin. Esimerkiksi säännöllistä lauseketta r vastaava kieli L(r) Σ määriteltiin tähän tapaan: L( ) = L(a) = {a} jokaisella a Σ L((rs)) = L(r)L(s) L(ε) = {ε} L((r s)) = L(r) L(s) L(r ) = (L(r)) Kieliopillisesti tällainen määritelmä tarkoittaa esimerkiksi että Kun käytetään sääntöä S (S S) niin silloin 1. ensin luodaan näillä samoilla periaatteilla se kieli L 1 jonka määrittelee säännön oikean puolen ensimmäinen S jota edellä merkittiin r 2. sitten se L 2 jonka määrittelee jälkimmäinen S jota merkittiin s 3. lopuksi sovitaan, että säännön vasemmalla puolella oleva S määrittelee niistä rakennetun kielen L 1 L 2.
257 Näin kielioppisääntöihin voidaan liittää ominaisuuksia eli attribuutteja sekä niille laskusääntöjä, ja saadaan määriteltyä notaatiolle yhtä aikaa syntaksi eli miten notaation ilmaukset pitää kirjoittaa semantiikka eli miten nämä oikein kirjoitetut ilmaukset pitää ymmärtää. Tällaiset attribuuttikieliopit ovat keskeinen työväline silloin kun tietokone ohjelmoidaan käsittelemään notaatiota syntaktisesti eli tarkistamaan että ilmaus on oikein kirjoitettu tätä jäsennysongelmaa käsitellään tällä kurssilla semanttisesti eli laskemaan oikein kirjoitetun ilmauksen merkitys sen jäsennyspuusta näillä laskusäännöillä tätäkin sivutaan. (Tämä on kuitenkin syntaktista semantiikkaa eihän tietokone todellisuudessa mitään ymmärrä... ) Kehitimmekin laskusäännöt tämän säännöllisen lausekkeen määrittelemää kieltä vastaava äärellinen automaatti!
258 r = : r = s t: r = ε: ε ε M s ε r = a, a Σ a ε M t ε r = st: r = s : ε M s M t ε M s ε ε Kuva : Säännöllisestä lausekkeesta äärelliseksi automaatiksi.
259 Kontekstittomien kielten sulkeumaominaisuuksista Kontekstittomia kielioppeja on helppo tuottaa soveltamalla monia vastaavia operaatioita kuin säännöllisissä lausekkeissa. Huomaa: Kontekstittomien kielten luokka ei kuitenkaan ole suljettu kaikkien samojen operaatioiden suhteen kuin säännöllisten kielten luokka! Lause Jos A ja B ovat kontekstittomia kieliä, niin myös niiden yhdiste A B, tulo AB ja sulkeuma A ovat kontekstittomia kieliä. 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.
260 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 ei-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).
261 Miten keksiä annetulle kielelle kielioppi? On annettu kontekstiton kieli L, ja laadittava sen tuottava kontekstiton kielioppi G. Lähtökohta: Millaisen kielen L 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: 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
262 Muita usein toistuvia rakenteita: Kieli Säännöt {a, b} A a b L(a ) = {ε, a, aa, aaa,...} A aa ε {b n c n n = 0, 1, 2,...} B bbc ε {b 2n c n n = 0, 1,...} B bbbc ε Tehtävä Laadi kielioppi seuraaville kielille: (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 }
263 Säännölliset ja kontekstittomat kielet 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 rakenteeltaan yksinkertaisella lineaarisella kieliopilla. tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet tunnistus: äärellinen automaatti rajallinen muisti äärelliset kielet; tunnistus: ns. "trie"
264 Lineaariset kieliopit Määritelmä 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 ja vasemmalle lineaarisilla kieliopeilla voi kuvata täsmälleen samat (säännölliset) kielet. Osoitetaan seuraavaksi, että 1. jokaista äärellistä automaattia vastaa oikealle lineaarinen kielioppi ja 2. jokaista oikealle lineaarista kielioppia vastaa äärellinen automaatti.
265 Äärellistä automaattia vastaava lineaarinen kielioppi Lause 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. Muodostetaan kielioppi G M, joka tuottaa samat merkkijonot, jotka M hyväksyy. Silloin L(G M ) = L(M) = L. Kieliopin G M pääteaakkostoksi valittaan automaatin M syöteaakkosto eli Σ. Luodaan kielioppiin G M oma välike A q jokaiselle automaatin M tilalle q Q. (Muita välikkeitä kielioppiin ei tule.) Kieliopin L G lähtösymboli on A q0 eli automaatin M alkutilaa q 0 vastaava välike.
266 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 lopputilalle q F. Kielioppi G M on nyt valmis.
267 Esimerkki Kuvassa on yksinkertainen äärellinen automaatti, joka tunnistaa kielen L = {w {a, b} w sisä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
268 Lineaarista kielioppia vastaava äärellinen automaatti Lause Jokainen oikealle lineaarisella kieliopilla tuotettava kieli on säännöllinen. Todistus: Tehdään edellisen lauseen 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 \ Σ} 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 a siirtymä q A qb (eli q B δ(q A, a)).
269 Lopputiloja ovat ne tilat, joita vastaaviin välikkeisiin liittyy ε-produktio: F = {q A Q A ε P} Yhteenveto lineaaristen kielioppien ja äärellisten automaattien vastaavuuksista: Äärellinen automaatti Lineaarinen kielioppi tila q välikesymboli A q alkutila 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 ε
270 Esimerkki 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 + qa q S qa q S d qb q A d qb q B d qb Saadaan tuttu automaatti, joka tunnistaa etumerkilliset kokonaisluvut. Huomaa: Kielioppia voi usein olla luontevampi lukea kuin äärellistä automaattia tai säännöllistä lauseketta. Tässäkin välike B voidaan lukea 0 tai useampia numeromerkkejä jne.
271 d +, d q S q A q B d Kuva : Kokonaislukuautomaatti niiden kieliopista.
272 Tehtävä 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: 4. Lauseke: (aa), kielioppi: S asa ε. 5. Lauseke: (b ab ab ), kielioppi: S aa bb A as ba B bb ε S BaBaBS ε B bb ε
273 6. Lauseke: ( )( ), kielioppi: S DN N DN ε D
274 Pinoautomaatti Pinoautomaatti (push-down automaton, PDA) on äärellinen automaatti, johon on lisätty rajoittamaton määrä muistia pinon muodossa. Kuten ennenkin, syöte hyväksytään jos sen loputtua ollaan hyväksyvässä tilassa. Muistutus kurssilta TRA: Pino on tietorakenne, jolla on seuraavat operaatiot: Luo tyhjä pino. Testaa onko pino tyhjä vai onko siinä tietoalkioita. Lisää 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... Osoitamme, että pinoautomaateilla voidaan tunnistaa täsmälleen kontekstittomat kielet.
275 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 : Kaavakuva pinoautomaatista.
276 Esimerkki Ei-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ä
277 Pinoautomaatti vs äärellinen automaatti Äärellisen automaatin siirtymää esitimme a q q mikä tarkoittaa, että tilasta q voi siirtyä tilaan q kun luetaan ja ohitetaan a. Pinoautomaatin siirtymä huomioi lisäksi kaksi pinomerkkiä: a, γ/γ q q Merkitys: tilasta q voi samoin siirtyä tilaan q, jos lisäksi pinon huipulla on merkki γ, joka korvataan merkillä γ. Kukin merkeistä a, γ ja γ voi olla myös ε: jos a = ε, syötettä ei lueta jos γ = ε, pinon vanhaa huippua ei lueta eikä poisteta jos γ = ε, uutta merkkiä ei lisätä pinon päälle
278 Pinoautomaatin formaali määritelmä Määritelmä Pinoautomaatti on kuusikko jossa Q on äärellinen tilojen joukko; Σ on äärellinen syöteaakkosto; Γ on äärellinen pinoaakkosto; funktio M = (Q, Σ, Γ, δ, q 0, F ), δ : Q (Σ {ε}) (Γ {ε}) P(Q (Γ {ε})) on (joukkoarvoinen) siirtymäfunktio; q 0 Q on alkutila; ja F Q on hyväksyvien lopputilojen joukko.
279 Siirtymäfunktion tyyppi Siirtymäfunktiolla δ(q, σ, γ) on nyt kolme argumenttia: 1. q Q on nykyinen tila, kuten aikaisemminkin; 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 σ ohitetaan ja/tai pinon päällimmäinen merkki γ poistetaan pinosta. Siirtymäfunktion arvo δ(q, σ, γ) on joukko pareja (q, γ ), joissa q Q on automaatin seuraava tila, ja γ Γ on pinon päälle lisättävä merkki. Kuten γ yllä, myös tämä γ voi puuttua, ja silloin sen tilalla onkin ε.
280 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, jossa päällimmäinen merkki on ensimmäisenä (eli vasemmanpuoleisimpana) jne. Alkutilanne syötteellä x on kolmikko (q 0, x, ε) eli pino on alussa tyhjä.
281 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 ) M (q 1, w 1, α 1 ) (q 2, w 2, α 2 ) M M (q n, w n, α n ). M Tätä merkitään (q 0, w 0, α 0 ) M (q n, w n, α n ). (Tilanne voi johtaa myös itseensä; siis sallitaan, että johdon pituus n = 0.)
282 Pinoautomaatti M hyväksyy syötemerkkijonon x Σ jos (q 0, x, ε) (q F, ε, α) M joillakin q F F ja α Γ. 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 tunnistama kieli on L(M) = {x Σ M hyväksyy syötteen x} eli sen hyväksymät syötemerkkijonot x.
283 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ä).
284 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ä. Yhdellä laskurilla voi tunnistaa joitakin ei-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.
285 ratkeamattomat ongelmat tyyppi 0: rajoittamattomat kielet rekursiivisesti lueteltavat kielet tunnistus: universaali Turingin kone (pysähtyy "kyllä" tapauksessa) rekursiiviset kielet tunnistus: Turingin kone + riittävän mittainen työnauha (pysähtyy aina), RAM kone, ohjelmointikielet tyyppi 1: kontekstiset kielet tunnistus: Turingin kone + kohtuullisen (eli polynomisen) mittainen työnauha tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet; tunnistus: äärellinen automaattivakiomäärä muistia äärelliset kielet
286 Pinoautomaatin tilasiirtymäkaavio Pinoautomaateille käytämme vastaavia kaavioita kuin äärellisille automaatille. Nyt lisätään tilasiirtymänuoleen vanha ja uusi pinonhuippumerkki γ ja γ. q Tila q q 0 Alkutila Hyväksyvä tila a, γ/γ q q Tilasiirtymä (q, γ) δ(q, a, γ) Kuva : Pinoautomaatin tilasiirtymäkaavion merkinnät.
287 Esimerkki 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/ε
288 Esimerkiksi syötteellä aabb esimerkin automaatilla on seuraava laskenta: ε, ε/$ q 1 q 2 a, ε/a (q 1, aabb, ε) (q 2, aabb, $) (q 2, abb, a$) b, a/ε (q 2, bb, aa$) q 4 q 3 b, a/ε (q 3, b, a$) (q 3, ε, $) ε, $/ε (q 4, ε, ε) Koska q 4 F = {q 1, q 4 }, pätee siis aabb L(M).
289 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ä Pinoautomaatti M on deterministinen, jos jokaisella tilanteella (q, w, α) on korkeintaan yksi mahdollinen seuraaja (q, w, α ), jolla (q, w, α) (q, w, α ). M
290 Määritelmän mukaan pinoautomaatti on epädeterministinen, jos siinä on samasta tilasta p kaksi eri siirtymää p σ 1,γ 1 /γ 1 q 1 ja p σ 2,γ 2 /γ 2 q 2, joilla σ 1 σ 2, γ 1 γ 2 ja q 1 q 2 tai γ 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 tahansa niistä ja ne johtaisivat kahteen eri seuraavaan tilanteeseen. Tämän määritelmän 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....
291 Huom: Toisin kuin äärelliset automaatit, epädeterministiset pinoautomaatit ovat tunnistusvoimaltaan deterministisiä vahvempia! Osoitamme pian, että jokainen kontekstiton kieli voidaan tunnistaa jollakin epädeterministisellä pinoautomaatilla. Toisaalta joitain niistä ei voi tunnistaa millään determistisellä pinoautomaatilla. Eräs tällainen on parillisen pituisten palindromien muodostama kieli { ww R w {a, b} }. (8) Intuitiivisesti, epädeterministinen pinoautomaatti arvaa syötteensä keskikohdan, jonka jälkeen voidaan voidaan alkaa lukea sen loppuosaa w R. (Ks. kuva.) Deterministinen automaatti ei pysty havaitsemaan tämä keskikohta omin päin. Mutta jos tämä keskikohta on merkitty, niin kielestä tuleekin deterministinen: { wcw R w {a, b} }.
292 ε, ε/$ q 1 q 2 a, ε/a b, ε/b ε, ε/ε q 4 ε, $/ε q 3 a, a/ε b, b/ε Kuva : Palindromin keskikohdan arvaava pinoautomaatti.
293 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ä painaisi jotain pinoon kun taas toinen siirtymä poistaisi pinon huippualkion. Ongelma: Mitä determinisoidun automaatin pitäisi silloin tehdä? Senhän pitäisi jotenkin pystyä seuraamaan molempia vaihtoehtoja!
294 Esimerkki Palindromien muodostama kieli voidaan tunnistaa seuraavasti: 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.
295 Esimerkiksi syötteellä abba kuvan epädeterministisellä pinoautomaatilla on seuraava laskenta: ε, ε/$ q 1 q 2 ε, ε/ε a, ε/a b, ε/b (q 1, abba, ε) (q 2, abba, $) (vaihe 1) (q 2, bba, a$) (q 3, a, a$) a, a/ε q 4 q 3 b, b/ε (q 3, ε, $) ε, $/ε (q 4, ε, ε) Koska q 4 F = {q 1, q 4 }, laskenta on hyväksyvä. (q 2, ba, ba$) (arvaus 2) (q 3, ba, ba$) (vaihe 3)
296 Deterministinen kontekstiton kieli Määritelmä Kontekstiton kieli on deterministinen, jos se voidaan tunnistaa jollakin deterministisellä pinoautomaatilla, muuten se on epädeterministinen. Esimerkiksi palindromikieli {ww R } ja kieli { } L 2 = a n b m c k n m tai m k ovat epädeterministisiä. Deterministiset kielet ovat tärkeä kieliluokka, sillä ne voi tunnistaa eli jäsentää tehokkaammin kuin epädeterministiset kielet. Siksi jos voimme itse suunnitella kielen (kuten vaikkapa määritellessämme uutta ohjelmointikieltä) teemme siitä deterministisen.
297 Pinoautomaatit ja kontekstittomat kielet Lause Kaikki kontekstittomat kielet voidaan tunnistaa (epädeterministisillä) pinoautomaateilla ja kaikki pinoautomaattien tunnistamat kielet ovat kontekstittomia. Todistus: Mielivaltaisen kontekstittoman kieliopin voi muuntaa pinoautomaatiksi, ja kääntäen: 1. Esitetään ensin muunnos kieliopista automaatiksi. 2. Sitten luonnostellaan myös käänteinen muunnos automaatista kieliopiksi.
298 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.
299 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 joka pitää vielä koodata pinoautomaatiksi. 1. Alusta pinon sisällöksi S$, jossa S on kieliopin lähtösymboli ja $ pinon pohjamerkki. 2. Toista seuraavaa: 2.1 Jos pinon huipulla on muuttujasymboli A, niin valitse epädeterministisesti jokin sääntö A w. Korvaa A merkkijonolla w. 2.2 Jos pinon huipulla on päätesymboli, niin poista se pinosta ja vertaa seuraavaan syötemerkkiin. Jos ne eroavat, hylkää. 2.3 Jos pino on tyhjä (eli sen huipulla on $) niin hyväksy jos syötekin on loppu; muuten hylkää. Kuva : Generoi-ja-testaa -algoritmi.
300 Tämän pinoautomaatin pinoaakkostoksi Γ = V {$} tulee siis kieliopin aakkosto V sekä pinon pohjamerkki $ V. syöteaakkostoksi tulee puolestaan kieliopin päätemerkkien joukko Σ. Esimerkki Tarkastellaan kielioppia S Sa T T btc ε ja merkkijonoa bbcca, joka voidaan johtaa seuraavasti:
301 S Sa (S Sa) Ta (S T ) btca bbtcca (T btc) (T btc) bbcca (T ε) Haluamme siis muodostaa pinoautomaatin, joka syötteellä bbcca vuorotellen soveltaa pinoon ylläolevan johdon sääntöjä ja poistaa pinosta syötettä vastaavia päätemerkkejä. Pino käyttäytyy siis kuten vieressä: jäljellä oleva syöte pinon sisältö bbcca ε bbcca $ bbcca S$ bbcca Sa$ bbcca Ta$ bbcca btca$ bcca Tca$ bcca btcca$ cca Tcca$ cca cca$ ca ca$ a a$ ε $ ε ε
302 Otamme käyttöön lyhennysmerkinnän (q, γ ) δ(q, σ, γ) missä γ = g 1 g 2 g 3... g m Γ on jono pinomerkkejä (kun aiemmin sallittiin 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: Jonon merkit viedään pinoon takaperin eli push(g m ); push(g m 1 ); push(g m 2 );... ; push(g 1 ), jotta pinon päälle muodostuu haluttu pinomerkkijono g 1 g 2 g 3... g m etuperin.
303 Automaattiin tulee alkutila q start, toistotila q loop, hyväksyvä tila sekä muita tiloja. 1. Algoritmin ensimmäinen askel, pinon alustus, voidaan toteuttaa seuraavasti: start ε, ε/s$ ε, ε/$ ε, ε/s loop start loop 2. Algoritmin toinen askel toistaa seuraavaa: 2.1 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 Käytämme äsken käyttöön otettua merkintää, jolla pinoon viedään kokonainen pinomerkkijono w. Silmukalle ilmestyy siis w 1 välitilaa, joita tässä kuvassa ei näy.
304 2.2 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/ε 2.3 Jos pinon huipulla on $, hyväksy jos syöte on loppu; muuten hylkää: loop ε, $/ε Muita siirtymiä ei tule, eli automaattimme on nyt valmis.
305 Tehtävä Muunna kielioppi S Sa T T btc ε pinoautomaatiksi.
306 Pinoautomaatista kieliopiksi Hahmotellaan myös muunnos toiseen suuntaan eli annetusta pinoautomaatista sen tunnistamaa kieltä kuvaavaksi 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ä pop-push-yhdistelmällä p σ,γ/ε ε,ε/γ q. 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. (Lopullisessa kieliopissa kukin laatikko σ, γ/γ toimii välikkeenä, joka generoi vastaavan päätesymbolin σ.)
307 Sitten aletaan laatia 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. Jokaisen hyväksyvän laskennan tulostama laatikkomerkkijono on oletusten nojalla sellainen, mutta automaatti ei välttämättä tulosta jokaista sellaista jonoa. Tämän kieliopin voi muodostaa samaan tapaan kuin tasapainoiset sulkumerkkijonot. Nyt vain sulkumerkkejä on monia erilaisia: push(γ) on avaava sulkumerkki lajia γ ja sitä vastaava pop(γ) on sulkeva sulkumerkki lajia γ. (Vrt. normaalin merkistön erilaiset sulkuparit (...), [...] ja {...}.)
308 Saadaan kielioppi, jossa on toistaiseksi vain yksi välike A ja sillä seuraavat säännöt: A ε A AA A σ, ε/ε A jokaiselle σ Σ {ε} ja A σ, γ/ε A σ, ε/γ jokaiselle pinomerkille γ Γ. 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ämme laatikkomerkkijonokieli on tämän kieliopin tuottaman kielen ja tämän äärellisen automaatin tunnistaman kielen leikkaus.
309 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.
310 Otetaan käyttöön välikkeet B p q joiden ylä- ja alaindeksit ovat automaatin tiloja eli p, q Q. 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 ε kaikilla p Q B p r B p q B q r kaikilla p, q, r Q B p r σ, ε/ε B q r jokaiselle siirtymälle p σ, ε/ε q ja r Q B p s σ, γ/ε B q r σ, ε/γ σ, γ/ε kaikille siirtymille p q ja r pinomerkeille γ Γ. σ, ε/γ s sekä tiloille p, q, r, s Q ja
311 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 σ = ε).
312 Tehtävä 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 ;
313 Laillinen: { } if c { if c a; else a; } Laiton: } if c { if c { a; else a; } Aakkosto Σ koostuu siis merkkijonoista { {, }, if, else, c, a; }. Kielioppina tämän voi esittää esim. seuraavasti: S {S} if c ST a; T else S ε
314 Kielioppien jäsennysongelma Annettu kielioppi G ja merkkijono x. Onko x kieliopin lause, eli päteekö x L(G)? Esimerkkejä jäsennysongelmista: Kuuluuko virke jänis joka pelkäsi arkaa peikkoa metsästi suurta sutta esimerkin relatiivilausekieleen L rel? Onko ( ) 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.
315 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. Jäsennyksen tarkoitus on yleensä oikeellisuustarkastuksen x L(G) lisäksi liittää lauseeseen x (esim. lähdekieliseen ohjelmaan) sen semantiikka (esim. vastaava konekoodi). Tätä varten jäsennin tuottaa yleensä lauseen x rakennetta kuvaavan jäsennyspuun. (Ks. alla.) Ensin tutustumme jäsennyksen peruskäsitteisiin.
316 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 johtoaskeleessa on produktiota sovellettu merkkijonon vasemmanpuoleisimpaan välikkeeseen; sitä merkitään γ γ lm oikea johto jos kussakin johtoaskeleessa on produktiota sovellettu merkkijonon oikeanpuoleisimpaan välikkeeseen; sitä merkitään γ γ. rm
317 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ä).
318 Näistä (i) on vasen johto, (iii) oikea johto ja (ii) ei ole kumpaakaan. Esimerkki Tarkastellaan kielioppia G expr : E E + T T T T F F F a (E) Lauseelle a + a a voidaan antaa esimerkiksi seuraavanlaiset johdot: (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
319 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ä mainittua johtoa vastaa sama jäsennyspuu.
320 E E T T T F F F a + a * a Kuva : Esimerkki jäsennyspuusta.
321 Määritelmä 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ä (joukosta N = V \ Σ); juurisolmun nimenä on lähtösymboli S; lehtisolmujen nimet ovat päätemerkkejä (joukosta Σ {ε}); 2. jos A on puun jonkin sisäsolmun nimi, ja X 1,..., X k ovat sen lapsisolmujen 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.) Jäsennyspuun τ tuotos on se päätemerkkijono, joka saadaan liittämällä yhteen sen lehtisolmujen nimet vasemmalta oikealle.
322 Esimerkiksi edellisen jäsennyspuun tuotos on a + a a. Jäsennyspuu on hyvä esitys sille miten sen tuotos on saatu kieliopin säännöillä. Tehtävä Muistetaan aiempi kielioppimme: Anna ohjelman johto 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
323 Johdot ja jäsennyspuu Lausekkeen johdosta voidaan aina muodostaa jäsennyspuu ja päinvastoin: 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
324 Johdosta jäsennyspuuksi Kun on annettu 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 liitä lehteen 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ä).
325 Kun käytetään esimerkin vasenta johtoa (i) ja merkitään jokaisen solmun viereen monesko johdos sen synnytti, niin saadaan: (i) E E + T T + T F + T a + T a + T F a + F F a + a F a + a a 0 E 1 1 E T 2 T 5 T 5 F 3 F 6 F 4 a a * a
326 Tehtävä 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. Sulkulausekkeen ()(()()) eräs johto on S SS (S)S ()S ()(S) ()(SS) Piirrä vastaava jäsennyspuu. ()((S)S) ()(()S) ()(()(S)) ()(()())
327 Jäsennyspuusta johdoiksi Kieliopin mukaisesta jäsennyspuusta saadaan puun tuotoksen vasen johto käymällä solmut läpi esijä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ä Kirjoita edellisen tehtävän jäsennyspuuta vastaava oikea johto.
328 Numeroimalla esimerkkipuumme solmut esijärjestyksessä saadaan 1 E 2 E 7 T T T F 4 F 9 F a + a * a Vasemman johdon rakentaminen etenee siis tässä numerojärjestyksessä.
329 Menetelmät ovat yksikäsitteisiä Jos muodostetaan annetusta vasemmasta (tai oikeasta) johdosta S x (tai S rm x) ensin jäsennyspuu edellä mainitulla tavalla, ja sitten jäsennyspuusta vasen (oikea) johto, niin saadaan takaisin alkuperäinen johto. Lause 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. lm
330 Kieliopin moniselitteisyys Samalla lauseella voi olla kieliopissa useita erilaisia jäsennyksiä. Esimerkiksi lauseella a + a a kieliopissa G expr: E E + E E E a (E): E E E E E E E E E E a + a a a + a a Määritelmä 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 ).
331 Esimerkki 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.
332 Aritmeettisen lausekkeen jäsennyspuun avulla voidaan helposti laskea lausekkeen arvo, kun muuttujien arvot tunnetaan. Yleisemmin, kääntäjä voi jäsennyspuun avulla generoida koodia lausekkeen evaluoimiseksi. Tätä sovellusta silmällä pitäen edellisen esimerkin yksiselitteinen kielioppi G expr noudattaa koulusta tuttua presedenssisääntöä, jonka mukaan kertolaskut lasketaan ennen yhteenlaskuja. Kieliopilla G expr ei ole tätä ominaisuutta, vaan sille kelpaisi kumpi tahansa laskujärjestys. Kärjistäen: jos kielioppi tai kieli on moniselitteinen, niin on myös sen merkityskin. Siksi yksiselitteisyys on hyve! Jäsennyspuun hyödyntämiseksi pitää tietysti ensinnäkin osata muodostaa annetulle merkkijonolle jäsennyspuu (eli yhtäpitävästi johto) annetussa kieliopissa, tai todeta, että merkkijono ei kuulu kieleen. Palaamme tähän pian...
333 Esimerkki Kieli {a i b j c k i = j tai j = k} on luonnostaan moniselitteinen. Kieliopin moniselitteisyys on algoritmisesti ratkeamaton ongelma. Eli sen osoittaminen edellyttää ihmisen laatimaa todistusta. Kieliopin moniselitteisyyden osoittaminen on helppoa: Riittää keksiä yksikin merkkijono, jolla on useita erilaisia jäsennyspuita. Kielen osoittaminen luonnostaan moniselitteiseksi taas on hankalaa: Onhan osoitettava, ettei mikään kieltä kuvaava kielioppi ole yksiselitteinen. Voidaan todistaa, että kaikki determinististen pinoautomaattien tunnistamat kielet ovat yksiselitteisiä. Toisaalta... Luonnostaan moniselitteiset kielet voidaan tunnistaa vain epädeterministisillä pinoautomaateilla. Lisäksi on olemassa myös yksiselitteisiä kieliä, jotka vaativat epädeterministisen pinoautomaatin.
334 Esimerkki Kielelle L = {ww R w {a, b} } voidaan antaa yksiselitteinen kielioppi S asa bsb ε mutta sitä ei voida tunnistaa deterministisellä automaatilla. (Ongelma: automaatin täytyy arvata, milloin on tultu merkkijonon keskikohtaan.)
335 Kontekstittomien kielten aliluokilla pätee siis seuraavat aidot sisältyvyydet: tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti yksiselitteiset kielet tunnistus:?? deterministiset kielet tunnistus: deterministinen pinoautomaatti tyyppi 3: säännölliset kielet tunnistus: äärellinen automaatti
336 Esimerkki Myös kieli L = {a n b m n/2 m n} on yksiselitteinen, mutta epädeterministinen. Yksinkertaisin kielen tuottava kielioppi on S asb aasb ε joka on kuitenkin moniselitteinen. (Anna esimerkki vaihtoehtoisista jäsennyksistä.) Saman kielen voi kuitenkin kuvata yksiselitteisellä kieliopilla: S asb A ε A aaab aab Kielelle voidaan laatia epädeterministinen pinoautomaatti, mutta determinististä automaattia ei pystytä laatimaan.
337 a, ε/a ε, ε/$ a, ε/a q 1 q 2 a, ε/ε ε, $/ε b, A/ε q 3 q 5 ε, $/ε q 4 b, A/ε Kuva : Esimerkin epädeterministinen pinoautomaatti.
338 Esimerkki Tarkastellaan seuraavaa sääntöä ehtolauseiden jäsentämiseksi: S if B then S else S if B then S P Tässä B voi olla mikä tahansa ehtolauseke ja P mikä tahansa proseduurinkutsu. Kun jäsennetään merkkijono if sireenisoi() then if onharjoitus() then huuda( OK ) else huuda( Kutsu palokunta! ) niin voidaan saada kaksi erilaista jäsennyspuuta. Miten käy erilaisilla jäsennyksillä:
339 S if B then S sireenisoi() if B then S else S onharjoitus() P P huuda("ok") huuda("kutsu palokunta!") S if B then S else S sireenisoi() if B then S P onharjoitus() P huuda("kutsu palokunta!") huuda("ok")
340 Tätä esimerkkiä kutsutaan roikkuvan else-haaran ongelmaksi (englanniksi the dangling else problem : Kumpaan if-ehdoista tämä yksinäinen else-haara pitäisi liittää? Ohjelmointikielen syntaksimäärittelyt ratkaisevat tämän lausumalla else-haara liittyy aina lähimpään sellaiseen edeltävään if-ehtoon jolla ei vielä ole omaa else-haaraa. Ohjelmointikielen kieliopin (eli syntaksin) tulee olla yksiselitteinen, jotta sillä kirjoitettu ohjelma voidaan kääntää yksiselitteisesti toimivaksi ohjelmaksi. Siksi niissä käytetään formaaleja esitystapoja ja tällaisia lausumia. Sama olisi toivottavaa myös ohjelmointikielen merkitysopille (eli semantiikalle), eli siinäkään ei saisi olla asioita joiden käyttäytymistä ei ole määritelty. Myös merkitysopissa voidaan käyttää formaaleja esitystapoja, mutta valitettavasti läheskään kaikille ohjelmointikielille niin ei tehdä. Kärjistäen: Ohjelmointikielen määrittelyn pitäisi poistaa eikä lisätä ohjelmoijan epätietoisuutta siitä, mitä hänen kirjoittamansa ohjelma tarkoittaa!
341 Kontekstittomien kielten rajoituksista Jäsennyspuita tarkastelemalla voi osoittaa että esim. kieli L = {a n b n c n n N} ei ole kontekstiton. Tämä perustuu samatapaiseen pumppausideaan kuin epäsäännöllisyyttä osoitettaessa: Jos s on kielen L merkkijono, sillä on jäsennyspuu sopivassa kielen L kieliopissa G. Jos lisäksi s on kovin pitkä, niin sen jäsennyspuussa on oltava ainakin yksi pitkä haara. Kun jäsennyspuun haara on riittävän pitkä, niin ainakin yhden muuttujan A on pakko esiintyä ainakin kaksi kertaa. Muuttujan A esiintyminen omana jälkeläisenään jäsennyspuussa tarkoittaa, että A vax joillakin v, x Σ. Voimme pumpata tätä johtoa: A vax vvaxx vvvaxxx... Vertaa säännöllisten kielten pumppauslemmaan: tilat vs. muuttujat silmukka automaatissa vs. johto A vax.
342 S S A A A A u v w x y u v v. A A A x x y v w x Kuva : Toistuvan välikkeen pumppaus.
343 Kontekstittomien kielten pumppauslemma Saman tapainen kuin säännöllisten kielten pumppauslemma. Nyt kuitenkin pumpataan kahta osamerkkijonoa v ja x samaan tahtiin. Hyvin karkea pinoautomaatti-intuitio: v = pyöritään silmukassa, jossa painetaan merkkejä pinoon x = pyöritään silmukassa, jossa poistetaan pinosta se, mitä v-silmukka sinne vei. Lause Jos L on kontekstiton kieli, niin sille on olemassa pumppauspituus p N, jolle seuraava pätee: Jos s L ja s p, niin voidaan kirjoittaa s = uvwxy, jossa 1. uv i wx i y L kaikilla i N, 2. vx > 0 ja 3. vwx p. Todistus: Sivuutetaan.
344 Pumppauslemmalla voidaan todistaa, että kieli {a n b n c n n N} ei ole kontekstiton. Todistus: (Luonnos.) Kun valitaan merkkijonoksi s = a p b p c p niin sen osassa vwx ei voi olla kaikkia kolmea merkkiä. Siten sen osien v ja x pumppaaminen ei voi lisätä jokaista kolmea merkkiä kuten pitäisi.
345 Kuten jo on todettu, kontekstittomille kielille pätee joitain samantapaisia sulkeumaominaisuuksia kuin säännöllisille kielille: Lause Olkoot L 1 ja L 2 kontekstittomia kieliä. Tällöin myös 1. L 1 L 2 (kielten yhdiste) 2. L 1 L 2 (kielten katenaatio) 3. (L 1 ) (kielen sulkeuma) 4. (L 1 ) R (kielen käänteiskieli) ovat kontekstittomia. Kontekstittomat kielet eivät kuitenkaan ole suljettuja leikkauksen ja komplementin suhteen.
346 Kielet { L 1 = a n b n c k { L 2 = a k b n c n } n, k N } n, k N ja ovat kontekstittomia, mutta niiden leikkaus L 1 L 2 = {a n b n c n n N} ei siis olekaan kontekstiton. Todistimme juuri: Lause Kontekstittomien kielten luokka ei ole suljettu leikkauksen suhteen.
347 ratkeamattomat ongelmat tyyppi 0: rajoittamattomat kielet rekursiivisesti lueteltavat kielet tunnistus: universaali Turingin kone (pysähtyy "kyllä" tapauksessa) rekursiiviset kielet tunnistus: Turingin kone + riittävän mittainen työnauha (pysähtyy aina), RAM kone, ohjelmointikielet tyyppi 1: kontekstiset kielet tunnistus: Turingin kone + kohtuullisen (eli polynomisen) mittainen työnauha tyyppi 2: kontekstittomat kielet tunnistus: pinoautomaatti tyyppi 3: säännölliset kielet tunnistus: äärellinen automaatti vakiomäärä muistia äärelliset kielet
348 Ohjelmointikielen kääntämisestä I Ohjelmointikielen kääntäjän vaiheet periaatteellisella tasolla: 1. Selaaminen (scanning, lexical analysis): jakaa syötteen tekstialkioiksi (token) kuten muuttujanimiin, liukulukuvakioihin, varattuihin sanoihin,... jotta jäsennyksen ei enää tarvitse edetä yksi tekstimerkki kerrallaan Tekniikka pohjautuu tekstialkioden tunnistamiseen äärellisillä automaateilla. UNIX-työkalu lex jonka GNU-versio on flex. 2. Jäsentäminen (parsing): Muodostaa selauksen tuottamalle tekstialkiojonolle jäsennyspuun joka perustuu ohjelmointikielen määrittelyn osana laadittuun kontekstittomaan kielioppiin. Tässä on ohjelmointikielen kieliopin yksikäsitteisyysvaatimus: jäsennyspuita tehdään vain yksi! UNIX-työkalu yacc jonka GNU-versio on bison on ns. kääntäjäkääntäjä (englanniksi compiler compiler ): Se lukee sisäänsä kieliopin kuvauksen ja generoi siitä jäsennystä tekevän aliohjelman, jonka ohjelmoija voi liittää osaksi sitä kääntäjää, jota hän on nyt toteuttamassa.
349 Ohjelmointikielen kääntämisestä II Selaus ja jäsennys ovat ne vaiheet, joista kääntäjää käyttävä sovellusohjelmoija saa ne virheilmoitukset, jotka alkavat "Syntax Error...". 3. Semanttinen analyysi: tyypitys jne. Esimerkiksi kielioppi ilmaisee vain, että se osa ohjelmakoodia, jossa muuttujat esitellään, edeltää sitä osaa, jossa niitä käytetään. Esittelyosaa jäsentäessään kääntäjä kerää esitellyt muuttujat ja niiden tyypit symbolitauluun. Kun se myöhemmin kohtaa jonkin muuttujan kuten i käytön, niin se kysyy tästä taulusta mikä sen tyypiksi on määritelty. Jos muuttujaa ei ole taulussa, niin tulee virheilmoitus "Error: undefined variable...". Tyyppi on yksi muuttujan attribuuteista eli ominaisuuksista. Semanttisen analyysin voi ajatella koristelevan jäsennyksen tuottaman jäsennyspuun tällaisilla attribuuteilla ja niiden arvoilla. Esimerkiksi while-silmukan testin tyyppiattribuutiksi pitää tulla totuusarvo, muuten tulee semanttinen virhe kuten "Error: type mismatch...". Kielioppia, johon on yhdistetty attribuuttien määrittelyt ja niiden laskusäännöt, kutsutaan attribuuttikieliopiksi (englanniksi attribute grammar ). Itse asiassa yacc-työkalu lukeekin sisään tällaisen attribuuttikieliopin ja tuottaa siitä sellaisen jäsennysaliohjelman, joka samalla laskee nämä attribuuttiarvot.
350 Ohjelmointikielen kääntämisestä III 4. Koodin tuottaminen ja optimointi. Suoritetaan käymällä läpi tätä jäsennyspuuta, joka on koristeltu koodin tuottamiseen tarvittavilla attribuuteilla. Tässä vaiheessa ei enää tule virheilmoituksia.
351 Syntax error... Aluksi lähdekoodi ASCII merkkijonona while(i>0)... Lopuksi konekoodina 00 FF 1A 8C 17 1F 05 5E AA C0 7F koodin generointi selaus (scanning) while tyyppi: kokonaisluku jonona pidempiä yksiköitä varattu sana: muuttujan nimi: operaattori: kokonaislukuvakio:... komento while komento lauseke > i 0 while i > 0 täydennettynä jäsennyspuuna komento tyyppi: totuusarvo jäsennys (parsing) attribuuttien laskenta while jäsennyspuuna komento while komento lauseke > i 0 Error: undefined variable... Error: type mismatch komento Kuva : Ohjelmointikielen kääntäjän vaihejako.
352 Käytännössä jäsennys ja muut vaiheet limittyvät ajallisesti: Esimerkiksi jäsennin pyytää selaimelta anna minulle seuraava tekstialkio. Vastaavasti jäsenninkään ei yleensä tuota koko jäsennyspuuta kerralla muistiin, vaan ainoastaan sen osan, jota semanttinen analyysi kullakin hetkellä tarvitsee. Ohjelmointikielen jäsentämiseen on useita tekniikoita. Lähtökohtana on tyypillisesti ohjelmointikielen määrittelyssä eli spesifikaatiossa annettu kontekstiton kielioppi. Tehokkaat jäsennysmenetelmät edellyttävät, että kielioppi on jossain rajoitetussa muodossa. Näistä tärkeimmät ovat LL(k) ja LR(k).
353 Ohjelmointikelten syntaktinen käsittely (eli vaiheet 1 ja 2) on hallittu jo pitkään, ja siihen on laajalti levinneitä apuvälineitä kuten lex ja yacc. Ohjelmointikielten kehitys ja tutkimus painottuukin nykyään erityisesti niiden tyyppijärjestelmiin (eli vaiheeseen 3). Esimerkiksi funktionaalisten ja olio-ohjelmointikielten tyyppijärjestelmät voivat olla hyvinkin monipuolisia ja -mutkaisia... Tuotetun konekoodin optimointi (vaiheessa 4) taas on kiinnostavaa erityisesti mikroprosessoreiden ja tietokonelaitteistojen valmistajille. Esimerkiksi nykyaikainen mikroprosessori sisältää useita ytimiä, jotka voivat laskea rinnakkain jos vain käännetty ohjelmakoodi osaa hyödyntää tätä mahdollisuutta...
354 Cocke-Younger-Kasami-algoritmi Mille tahansa kontekstittomalla kieliopilla G kysymys päteekö w L(G)? voidaan ratkaista ajassa O( w 3 ) Cocken, Youngerin ja Kasamin kehittämällä ja heidän mukaansa nimetyllä CYK-algoritmilla. CYK-algoritmia ei kuitenkaan käytetä ohjelmointikielille, koska niiden kieliopit G voidaan suunnitella kieltä määriteltäessä siten, että jäsennys onnistuu tehokkaammin mieluiten lineaarisessa ajassa. Rajoitumme jatkossa tämän mahdollistaviin ns. LL(1)-kielioppeihin.
355 LL(1)-kieliopit ja rekursiivisesti etenevä jäsennys Tarkastellaan sellaisia kielioppeja, joissa seuraava sovellettava sääntö on aina yksikäsitteisesti määrätty, kun nykyinen välike ja seuraava syötemerkki tunnetaan. Näitä kielioppeja ja niillä jäsentyviä kieliä kutsutaan LL(1)-kieliopeiksi ja -kieliksi: Left to right scan, producing a Left parse with 1 symbol lookahead. Siis ne lukevat syötemerkkijonon vasemmalta oikealle eli kirjoitusjärjestyksessä. Tämä on tärkeää esimerkiksi ohjelmointikielten kääntäjissä: lähdekooditiedosto luetaan yhden kerran alusta loppuun. Ne tuottavat aina vasemmanpuoleisimman johdon. Ne käyttävät 1 kurkistussymbolia eli katsovat vain seuraavaa syötemerkkiä. Yleisemmin voi määritellä LL(k)-kieliopit ja -kielet, joissa katsotaan k > 0 syötemerkkiä eteenpäin, eli ylläpidetään k merkin syötepuskuria.
356 LL(1)-kieliopeille voidaan laatia yksinkertainen rekursiivinen jäsennin, jonka aliohjelmat vastaavat kieliopin sääntöjä. Siksi niitä suositaan, kun jäsennin pitää kirjoittaa käsin. LL(1) riittää useimmille ohjelmointikielissä esiintyville rakenteille. LL(1)-jäsennin on tehokas: se toimii lineaarisessa ajassa O( w ) syötteen w pituuden suhteen. LL(1)-kielet ovat determinististen kielten osajoukko, joten voitaisiin käyttää rekursion sijasta myös determinististä pinoautomaattia. LL(1)-kielioppeihin kuuluvat siis ainakin sellaiset kieliopit, joissa jokaisen välikkeen A säännöt ovat muotoa A a 1 α 1 a 2 α 2 a 3 α 3... a k α k jossa jokainen haara i alkaa eri päätemerkillä a i Σ (siis a i a j aina kun i j).
357 Esimerkki Tarkastellaan seuraavaa kielioppia G: E T + E T E T T a (E) Välike T on OK: seuraava syötemerkki ratkaisee, kumpaa sen säännöistä pitää käyttää. Mutta välike E ei, joten tekijöidään se: E TE E +E E ε T a (E) Esimerkiksi lauseen a (a + a) vasen johto voidaan nyt muodostaa seuraavan syötemerkin ohjaamana: E TE ae a E a TE a (E)E a (TE )E a (ae )E a (a + E)E a (a + TE )E a (a + ae )E a (a + a)e a (a + a).
358 LL(1)-kielioppien yleinen muoto LL(1)-kielioppien yleisessä muodossa sallitaan myös produktioita, joiden oikeat puolet alkavat päätemerkin sijasta välikkeellä, sekä tyhjentyviä eli nollautuvia välikkeitä A, joilla siis A ε mutta kumpiakin näistä vain rajoitetusti. Esimerkiksi kielen a b c d tuottava kielioppi: S Ab Cd A aa ε C cc ε Kielioppi on LL(1)-muotoa, vaikka ensimmäiseksi sovellettavaa produktiota ei voikaan päätellä pelkästään alkusymbolin S produktioiden perusteella. Kuitenkin, jos merkkijono alkaa merkeillä a tai b, niin on sovellettava sääntöä S Aa, jos taas merkillä c tai d, niin sääntöä S Cd. Siis sovellettava sääntö on kuin onkin yksikäsitteisesti määrätty seuraavan merkin perusteella. Kehittelemme pikkuhiljaa tämän tavoitteen mukaisen LL(1)-muodon määritelmän ja testin.
359 Kielioppien muokkaaminen LL(1)-muotoon Kaikkia kontekstittomia kielioppeja ei voi muuntaa LL(1)-muotoon. Joskus kieli on LL(1)-luokassa, mutta sen kuvaava kielioppi ei ole oikeassa muodossa. Tällaiset melkein LL(1)-kieliopit voi muokata oikeaan muotoon seuraavilla operaatioilla: 1. vasen tekijöinti 2. vasemman rekursion poisto.
360 Vasen tekijöinti Kielioppi, jossa on säännöt A αβ 1 αβ 2 jossa α ε, β 1 β 2 ei voi olla LL(1)-muotoinen, koska nämä haarat alkavat yhteisellä epätyhjällä osalla α. Otetaan käyttöön uusi välike A ja korvataan nämä produktiot produktioilla A αa A β 1 β 2, jossa α on jonojen αβ 1 ja αβ 2 pisin yhteinen alkuosa. Toisin sanoen uusia produktioita käyttäen ensin jäsennetään niiden yhteinen alkuosa α sitten vasta tutkitaan, jatkuuko syöte haaralla β 1 vaiko β 2.
361 Esimerkki Kielioppi N DN D D muutetaan muotoon N DN N N ε D
362 Välittömän vasemman rekursion poisto Kielioppi on vasemmalle rekursiivinen, jos jollakin välikkeellä A ja merkkijonolla γ on A + Aγ. Välikettä A jäsentävä rekursiivinen proseduuri kiertäisi kehää lukematta syötettään. Välitön vasen rekursio, siis suorat johdot A Aγ, voidaan poistaa seuraavasti: Muotoa A A olevat produktiot voidaan yksinkertaisesti jättää pois.
363 Tämän jälkeen välikkeellä A voi vielä olla sääntöjä A Aα i, missä α i ε. Näistä päästään eroon korvaamalla produktioilla jossa A on uusi välike. A Aα 1 Aα 2 Aα 3... Aα m } {{ } poistettavat produktiot β 1 β 2 β 3... β n } {{ } muut produktiot A β 1 A β 2 A β 3 A... β n A (9) A α 1 A α 2 A α 3 A... α m A ε (10)
364 Miksi muunnos toimii oikein? Alkuperäisen välikkeen A johdot ovat muotoa A Aα Aαα Aααα βααα... α eli βα. Lopulta on siis valittava sääntö A β tai rekursio ei pääty ikinä. Korvatut säännöt tuottavat uuden välikkeen A avulla täsmälleen samat johdokset, mutta toisella tavalla: A βa βαa βααa βαααa βααα... α.
365 Esimerkki Allaoleva kielioppi G 1 on välittömästi vasemmalle rekursiivinen: Siitä saadaan kielioppi G 2 : N ND D D N DN N DN ε D Saman tuottaisi tosin myös kielioppi G 3 : N 0N 1N... 9N
366 Yleinen vasemman rekursion poisto Oletetaan, että kieliopissamme G ei ole ε-sääntöjä A ε eikä myöskään kehiä A B C A. Tarvittaessa niistä pääsee eroon Chomskyn normaalimuodon tuottamisessa sovellettavilla menetelmillä (jotka sivuutamme). Silloin kaikesta vasemmasta rekursiosta pääsee eroon seuraavasti: 1 Merkitse kaikki välikkeet käsittelemättömiksi; 2 while (kaikkia välikkeitä ei ole käsitelty) 3 do Valitse käsittelemätön välike A; 4 while (on sääntö A Bγ, jossa välike B on jo käsitelty) 5 do Korvaa se kaikilla säännöillä A δγ, joilla kieliopissa on sääntö B δ 6 Poista välikkeen A välitön vasen rekursio säännöillä (9) ja (10); 7 Merkitse A käsitellyksi;
367 Esimerkki Sovelletaan vasemman rekursion poistoproseduuria allaolevaan kielioppiin: S Aa b A Ac Sd e Käsitellään välikkeet järjestyksessä S, A. Jälkimmäisen säännössä A Sd olevan S-välikkeen laventaminen tuottaa produktiot A Ac Aad bd e. Välittömän vasemman rekursion poisto tuottaa tulokseksi kieliopin S Aa b A bda ea A ca ada ε.
368 Yleinen LL(1)-ehto Esitetään nyt yleinen LL(1)-ehto. Käytetään seuraavia kahta apukäsitettä: first(α) = {a Σ α aβ jollain β V } {ε α ε} : Siis ne päätemerkit, jotka voivat aloittaa jonkin sellaisen merkkijonon, joka voidaan johtaa tästä α V. Lisäksi myös ε, jos jono α on kokonaisuudessaan nollautuva. follow(a) = {a Σ S αaaβ joillain α, β V } : Siis kaikki ne päätemerkit a Σ, jotka voivat seurata välikettä A N jossakin johdossa. Päätemerkkien lisäksi tähän joukkoon voi kuulua erityinen symboli EOF ( End of File ), jolla merkitään syötteen loppua. Selain palauttaa merkin EOF ohitettuaan viimeisen todellisen syötemerkin.
369 Olkoot sitten A N kieliopin G mielivaltainen välike ja sen kaikki säännöt. A α 1 α 2 α 3... α k Ensimmäinen osa LL(1)-ehtoa vaatii, että näiden sääntöjen oikeiden puolten tuottamat merkkijonot alkavat eri tavoin, eli että aina kun i j. Nimittäin jos olisi jokin first(α i ) first(α j ) = (11) x first(α i ) first(α j ), niin kumpaa säännöistä pitäisi käyttää vuorossa olevalla syötemerkillä x? Tästä ensimmäisestä LL(1)-ehdosta (11) seuraa erityisesti, että korkeintaan yksi välikkeen A säännöistä voi tuottaa tyhjän merkkijonon ε eli tehdä välikkeestä A tyhjentyvän (eli nollautuvan).
370 Toinen osa LL(1)-ehtoa koskee vain tyhjentyviä välikkeitä: Olkoon välike A N tyhjentyvä ja sen säännöistä viimeinen eli A α k se ainoa, joka voi tuottaa tyhjän merkkijonon ε. Silloin ehto vaatii, että follow(a) first(α j ) = (12) kaikilla muilla sen säännöillä 1 j < k. Nimittäin jos olisi jokin x follow(a) first(α j ) niin kumpaako säännöistä j vai k pitäisi käyttää kun kohdataan syötemerkki x? Kielioppi G on yleisessä LL(1)-muodossa, jos sen kaikki välikkeet ja säännöt täyttävät molemmat ehdot (11) ja (12). LL(1)-kielioppi ei voi olla moniselitteinen. LL(1)-kielioppi ei voi sisältää vasenta rekursiota. (Tämä pätee käytännössä järkeville kieliopeille, joiden välikkeet generoivat epätyhjiä merkkijonoja.)
371 First- ja Follow-joukkojen laskenta Jokaiselle välikkeelle A jolla on produktiot A α 1 α k määritellään first(a) = first(α 1 ) first(α 2 )... first(α k ) (13) eli sen first-joukko koostuu sen sääntöjen oikeiden puolten first-joukoista. Sääntöjen oikeiden puolten α V first-joukot lasketaan seuraavasti: Jos α = ε, niin first(α) = {ε}. Jos α alkaa päätemerkillä b Σ, niin first(α) = {b}. Jos α alkaa välikkeellä B, joka ei ole tyhjentyvä, niin first(α) = first(b). Ks. (13). Jos α on muotoa Bβ missä B on tyhjentyvä välike, niin first(α) = (first(b) \ {ε}) first(β) eli otetaan mukaan jonon α loppuosan first-alkiot. Vasemman rekursion poisto takaa, ettei tämä ole kehämääritelmä.
372 Välikkeiden follow-joukot voidaan puolestaan laskea seuraavasti: 1. Alusta lähtösymbolin S joukko: follow(s) {EOF}. 2. Lisää jokaisella säännöllä A αbβ joukkoon follow(b) kaikki joukon first(β) päätesymbolit. (Eli ei mahdollista tyhjää merkkijonoa ε). 3. Toistaa seuraavaa kunnes mikään follow-joukko ei enää kasva: Jos kieliopissa on sääntö A αb tai sääntö A αbβ jossa ε first(β), niin lisää joukkoon follow(b) kaikki joukon follow(a) alkiot.
373 Esimerkki Tarkastellaan paria vasemmalle rekursiivista kielioppia (joissa A + Aα): Kieliopissa A Bb a B A pätee first(bb) = {a} = first(a). Tämä rikkoo ensimmäistä LL(1)-ehtoa. Kieliopissa A Bb ε B A pätee follow(a) = {b} = first(bb). Tämä rikkoo toista LL(1)-ehtoa.
374 Kun kielioppi G on tätä yleistä LL(1)-muotoa, niin sille voidaan laatia rekursiivisesti etenevä jäsennin seuraavin periaattein: Pidetään yllä muuttujassa next seuraavaa syötemerkkiä. error(... ) tarkoittaa lopeta jäsennys virheilmoitukseen... Käytännön ohjelmoinnissa se voisi vaikkapa nostaa poikkeuksen (exception). Tehdään tässä esimerkissä sellainen jäsennin, joka tuottaa syötettä vastaavan jäsennyspuun. Tätä kusutaan ennustavaksi jäsentämiseksi, koska jäsennin osaa seuraavan syötemerkin next nojalla ennustaa oikein, mitä produktiota seuraavaksi pitää soveltaa. Jokaiselle päätesymbolille a Σ kirjoitetaan oma aliohjelma: Proc a(): 1 if next = a 2 then next getnext(); // pyydä selaimelta seuraava syötemerkki 3 return uusi lapseton solmu nimeltään a 4 else error( tässä olisi pitänyt olla a )
375 Jokaiselle välikkeelle A jolla on produktiot A α 1 α k kirjoitetaan oma aliohjelma. Jos A ei ole tyhjentyvä, niin tämä aliohjelma on: Proc A(): 1 if next first(α 1 ) then return haara(α 1 ) 2 elseif next first(α 2 ) then return haara(α 2 ). elseif next first(α k ) then return haara(α k ) else error( tästä olisi pitänyt alkaa A ) Nämä first-joukot ovat vakioita, joten ne on voitu laskea jo jäsentimen muodostusvaiheessa.
376 Jokainen haara(x 1 X 2 X 3... X m ) on oma ohjelmanpätkänsä 1 y 1 Proc X 1 () 2 y 2 Proc X 2 (). y m Proc X m () return uusi solmu nimeltään A lapsinaan y 1, y 2, y 3,..., y m joka siis 1. ensin kutsuu rekursiivisesti muita jäsentimen aliohjelmia X 1, X 2, X 3,..., X m oikeassa järjestyksessä 2. sitten palauttaa tuloksenaan jäsennyspuun, jonka juurena on nykyinen välike A ja sen lapsina näiden kutsujen palauttamat puut. (Tai jos jäsentimen halutaan tekevän jotakin muuta kuin jäsennyspuun, niin sitten tekee mitä halutaan pohjautuen siihen, mitä rekursiokutsut ovat ensin tehneet ja palauttaneet.)
377 Jos välike A on tyhjentyvä niin vain sen viimeinen sääntö A α k tuottaa tyhjän merkkijonon ε. Silloin sen aliohjelma päättyykin. elseif next first(α k 1 ) then return haara(α k 1 ) else return haara(α k ) eli virheilmoituksen sijasta kutsutaan tyhjentyvää viimeistä haaraa. Toisin sanoen, jos nextin mukaan kyseessä ei ollut mikään tyhjentymättömistä haaroista A α 1 α 2 α 3... α k 1 niin sitten ainoa mahdollisuus on tyhjentyvä haara A α k.
378 Jäsentimen pääohjelma: 1 next getnext(); 2 τ Proc S(); // kutsutaan lähtösymbolia vastaavaa aliohjelmaa 3 if next = EOF 4 then return τ; // syötteen jäsennyspuu 5 else error( syötteen olisi pitänyt loppua tähän ) Usein halutaan sellainen jäsennysohjelma, joka ei pysähdy heti ensimmäiseen virheeseen, vaan jatkaa ja raportoi muitakin syötteessä olevia virheitä. Silloin kirjoitetaan kunkin tyhjentymättömän välikkeen A aliohjelman päättävän errorin tilalle tulosta( tästä olisi pitänyt alkaa A ); while next follow(a) do next getnext(); return uusi lapseton virhesolmu nimeltään A joka siis selaa ohi virheellisen A ja jatkaa jäsennystä sitä seuraavasta merkistä.
379 LL(1): Kertausta Tavoite: Syötemerkkijonon ohjaama top-down-jäsennys s.e. lavennusvaihtoehdoista A α 1 α 2 α 3... α k voidaan aina valita oikea sääntö vuorossa olevan päätesymbolin perusteella. Siksi (I) vaihtoehtoisten sääntöjen tuotosten täytyy alkaa eri päätemerkeillä: first(α i ) first(α j ) = kun i j (II) Jos A ε, niin ei saa olla epäselvää sovelletaanko jotain sen ei-nollautuvaa vaihtoehtoa vai kuuluuko päätesymboli sen tyhjän esiintymän perässä tulevaan osaan syötettä, eli follow(a) first(α i ) = jokaisella välikkeen A ei-nollautuvalla säännöllä α i
380 Esimerkki Tarkastellaan seuraavaa kielioppia: S AB A ac C ε C b cd B bd e Kielioppi toteuttaa ehdon (I). Esim. välikkeen A sääntöjen tuotokset alkavat eri tavoin: first(ac) = {a}; first(c) = {b, c}; first(ε) = {ε} Kielioppi ei kuitenkaan ole LL(1)-muodossa, koska rikkoo ehtoa (II): follow(a) = first(b) = {b, e} first(c) = {b, c}
381 Esimerkki Aritmeettisten lausekkeiden tekijöidyssä kieliopissa tarvitaan LL(1)-jäsennintä varten seuraavat joukot: E TE E +E E ε T a (E) first(t ) = {a, (} first(e ) = {+,, ε} first(e) = first(t ) follow(e ) = follow(e) = {EOF, )} Näiden perusteella voidaan kirjoittaa jäsennin edellä kuvattuun tapaan.
382 Lyhennetään koodia kirjoittamalla yksi yhteinen aliohjelma kaikille päätemerkeille b { +,, (, ),a}: Terminaali(b): 1 if next = b 2 then next getnext(); 3 return uusi lehtisolmu nimeltään b; 4 else error( tässä olisi pitänyt olla b ); Pääohjelmaksi tulee: 1 next getnext(); 2 τ Proc E(); 3 if next = EOF 4 then return τ; 5 else error( syötteen olisi pitänyt loppua tähän );
383 Välikkeen E aliohjelmaksi tulee: Proc E(): 1 if next { (, a} then y 1 Proc T() y 2 Proc E () return uusi solmu nimeltään E ja lapsinaan y 1, y 2 2 else error( tästä olisi pitänyt alkaa E )
384 Välikkeen E aliohjelmaksi tulee: Proc E (): 1 if next { + } then y 1 Terminaali( + ) y 2 Proc E() return uusi solmu nimeltään E ja lapsinaan y 1, y 2 2 elseif next { } then y 1 Terminaali( ) y 2 Proc E() return uusi solmu nimeltään E ja lapsinaan y 1, y 2 3 else return uusi lapseton solmu nimeltään E (Tässä siis on haara säännölle E ε.)
385 Välikkeen T aliohjelmaksi tulee: Proc T(): 1 if next {a} then y 1 Terminaali(a) return uusi solmu nimeltään T ja lapsenaan y 1 2 elseif next { ( } then y 1 Terminaali( ( ) y 2 Proc E() y 3 Terminaali( ) ) return uusi solmu nimeltään T ja lapsinaan y 1, y 2, y 3 3 else error( tästä olisi pitänyt alkaa T ) Tätä systemaattisesti kirjoitettua jäsennintä voi selvästi vielä parannella paikallisin muutoksin: esimerkiksi aliohjelman Proc T() rivillä 2 tarkastetaan kahdesti, että next on (. Tehdään parempi C-pseudokoodilla:
386 void E() { tulosta("e TE ") T (); E (); } void E () { if (next == + ) { tulosta( "E +E") next = getnext(); E(); } else if (next == - ) { tulosta( "E -E") next = getnext(); E(); } else tulosta( "E ε") }
387 void T () { if (next == a ) { tulosta( "T a") next = getnext(); } else if (next == ( ) { tulosta( "T (E)") next = getnext(); E(); if (next ) ) error( sulkeva sulku puuttuu ); next = getnext(); } else error( T ei voi alkaa merkillä next ); }
388 Pääohjelma käynnistää ja päättää jäsennyksen: next = getnext(); E(); if (next EOF) error( ylimääräistä syötettä lausekkeen perässä ) Katsotaan esimerkki sen toiminnasta. Sitten korvataan sen tulosteet yksinkertaisella koodingeneroinnilla.
389 Esimerkki Syötejonon a-(a+a) jäsennys tulostaa: E TE T a E -E E TE T (E) E TE T a E +E E TE T a E ε E ε Tulostus vastaa vasenta johtoa: E TE ae a E a TE a (E)E a (TE )E a (ae )E a (a + E)E a (a + TE )E a (a + ae )E a (a + a)e a (a + a). Oikeassa ohjelmassa tulosta-komennot voivat tehdä jotain hyödyllisempää (kuten laskea lausekkeen arvoa, generoida koodia,... ).
390 Alla yksinkertaistettu esimerkki oikeasta kääntämisestä EI kysytä tentissä! Käskykanta: push x laita x pinoon pop ri poista pinon huippu rekisteriin ri add r1,r2 r1 r1 + r2 sub r1,r2 r1 r1 r2 Syötteen (x + y) (a + b) käännös: push x push y pop r1 pop r2 add r1, r2 push r1 push a push b pop r1 pop r2 add r1, r2 push r1 pop r2 pop r1 sub r1, r2 push r1 pop r1
391 // E s i m e r k k i pinokoneen koodin g e n e r o i n n i s t a // e d e l l i s e n mukaisten l a u s e k k e i d e n e v a l u o i m i s e k s i // r e k i s t e r i i n r1... ; TESTAAMATON, v a s t u u l u k i j a l l a : void Ep ( ) { i f ( next == + ) { next = g e t n e x t ( ) ; T( ) ; p r i n t f ( pop r1 \npop r2 \nadd r1, r2 \ npush r1 \n ) ; Ep ( ) ; } e l s e i f ( next == ) { next = g e t n e x t ( ) ; T( ) ; p r i n t f ( pop r2 \npop r1 \ nsub r1, r2 \ npush r1 \n ) ; Ep ( ) ; } }
392 void T( ) { i f ( n u m e r o t a i m u u t t u j a ( next ) ) { p r i n t f ( push %c \n, next ) ; next = g e t n e x t ( ) ; } e l s e i f ( next == ( ) { next = g e t n e x t ( ) ; T( ) ; Ep ( ) ; i f ( next!= ) ) p r i n t f ( V i r h e : s u l k u puuttuu \n ) ; next = g e t n e x t ( ) ; } e l s e p r i n t f ( V i r h e : T e i v o i a l k a a %c \n, next ) ; } i n t main ( ) { next = g e t n e x t ( ) ; T( ) ; Ep ( ) ; p r i n t f ( pop r1 \n ) ; return 0 ; }
393 Edellisessä koodissa välike E on oleellisesti poistettu, ja se on korvattu sääntöjen oikealla puolella suoraan johdolla TE : S TE E +TE TE ε T a (TE ) Pääohjelma (main) vastaa siis lähtösymbolia S.
394 LR-kieliopeista LL-jäsennystä vastaavasti voidaan määritellä jäsennystekniikka, joka muodostaa kieliopin mukaiselle syötteelle oikean johdon. Saadaan LR(1)-kieliopit ja -kielet: Left to right scan, producing Right parse with 1 symbol lookahead. LR(1) = deterministiset kielet, joten LR(k)-kielet kurkistupituudella k > 1 ovat enää teoreettisesti kiinnostavia. LR-jäsennys sisältää LL-jäsennyksen sillä lim LL(k) = LR(1). k LR-jäsennys on intutiivisesti voimakkaampi, koska siinä syötettä nähdään enemmän ennen kuin valitaan, mikä produktio on voinut sen tuottaa. Nämä ovat tärkeitä työkaluja kääntäjien laatimisessa automaattisesti. Esimerkiksi yacc-työkalu tuottaa LALR- eli lookahead LR -jäsentimen, joka on hieman yksinkertaisempi kuin täysi LR(1)-jäsennin.
395 Yhteenveto kontekstittomien kielten jäsennyksestä Kuuluuko annettu merkkijono kieleen? on peruskysymys kaikkien formaalikielten kohdalla. Säännöllisten kielten yhteydessä äärelliset automaatit ovat sekä teoriassa että käytännössä erinomainen menetelmä jäsenyystestin ratkaisemiseen. Kontekstittomien kielten jäsentäminen onnistuu pinoautomaatilla, mutta se on teoreettinen työkalu. Käytännössä epädeterminististä pinoautomaattia ei voi toteuttaa tietokoneella. Rajoittamattomien CF-kielioppien jäsennykseen käytetään sen sijaan esim. CYK-algoritmia. Erikoistapaukset voidaan jäsentää / tunnistaa helpommin: oikealle lineaariset kieliopit vastaavat säännöllisiä kieliä: tunnistetaan siis äärellisellä automaatilla. Monet käytännössä tärkeät erityisesti ohjelmointikielille määritellyt kieliopit ovat tyyppiä LL(k) tai LR(k). Näille on olemassa yksinkertaisia ja tehokkaita rekursioon perustuvia jäsennysmenetelmiä. Työkaluja: Bison, Yacc: syötteenä (rajoitettu) kontekstiton kielioppi, tuloksena jäsentimen lähdekoodi...
396 Summa summarum Kurssin sisältöä voidaan tarkastella (ainakin) kahdesta näkökulmasta: Perustiedot formaaleista kielistä ja niiden tunnistamisesta; esim. kielen määritteleminen äärellisenä automaatina, säännöllisen lausekkeen tai kontekstittoman kieliopin avulla, näiden formalismien väliset yhteydet, (Turingin kone yleisenä algoritmin mallina ja) (ratkeamattomuuden alkeet, kuten pysähtymisongelma). Johdatus tietojenkäsittelyteoriaan ja sen metodiikkaan; erityisesti matematiikan soveltaminen laskennan mallintamiseen ja miten väitteet perustellaan täsmällisesti.
397 Säännölliset kielet Käytännössä tärkeä tietää: Teoreettisia ajatusmalleja: tilasiirtymäkone laskennan mallina säännölliset lausekkeet ja äärelliset automaatit epädeterministinen laskenta (joitain käytännön sovelluksiakin on) mallien väliset konversiot (NFA DFA) laskulaitteen ja kuvausformalismin ekvivalenssi (DFA vs. säännöllinen lauseke) luokan sulkeumaominaisuudet mahdottomuustodistukset (pumppauslemma)
398 Kontekstittomat kielet Käytännössä tärkeä tietää: kielen kuvaaminen kieliopilla jäsentämisen peruskäsitteet, erityisesti jäsennyspuu Teoreettisia ajatusmalleja: samat kuviot kuin säännöllisillä kielillä, teknisesti haastavammassa tilanteessa Algoritmisia tekniikoita: iteratiiviset algoritmit (nollautuvat muuttujat jne.) CYK-algoritmi ja taulukointi (dynaaminen ohjelmointi) rekursion käyttö yksinkertaisen kieliopin jäsentämiseksi Jatkoaiheita: sovellukset ohjelmointikielissä ja luonnollisessa kielessä
399 Turingin koneet ja laskettavuus Käytännössä tärkeä tietää: Churchin-Turingin teesi ratkeamattomuuden käsite Teoreettisia ajatusmalleja: vaikka mitä (introssa mainittu ainakin: numeroituvuus vs. ylinumeroituvuus; diagonalisointi) Jatkoaiheita: laskennan teoria, laskennan vaativuus; (matemaattinen) logiikka (ei se kurssi... )
400 Teoria ja käytäntö Kurssi oli teoreettinen, mutta asiat pitää ymmärtää syvällisesti, jotta opittua voi tehokkaasti soveltaa. THE BEST THEORY IS INSPIRED BY PRACTICE and THE BEST PRACTICE IS INSPIRED BY THEORY. Donald Knuth. In theory practice and theory are the same. In practice they are not. Anonyymi (?)
401 Tentti Jotain tämän tapaista: 1. Vastaa / selitä lyhyesti mitä tarkoittaa Determinisoi automaatti Muodosta 3.1 säännöllistä lauseketta vastaava epädeterministinen äärellinen automaatti 3.2 automaatista vastaava säännöllinen lauseke luennolla esitetyllä menetelmällä. 4. Olkoon annettu kontekstiton kielioppi G. 4.1 Laadi kieliopin kuvaaman kielen tunnistava äärellinen automaatti (jos kielioppi on oikealle lineaarinen) tai pinoautomaatti (jos ei). 4.2 Onko kielioppi moniselitteinen? Perustele! 4.3 Onko kielioppi LL(1)-muodossa? Perustele!
402 Yleisesti: kuten harjoitustehtävät, luentojen esimerkit ja tehtävät. Siis kysymyksiä seuraavien kertaustehtävien tyyliin: Tehtävä Esitä kullekin seuraavista aakkoston Σ = {a, b, c} kielistä kielen tunnistava deterministinen automaatti ja vastaava säännöllinen lauseke: 1. merkkijonot, joissa a-merkkien lukumäärä on korkeintaan kolme 2. merkkijonot, jotka loppuvat abc 3. merkkijonot, jotka eivät sisällä osamerkkijonoa abc 4. merkkijonot, joissa ei ole kahta samaa merkkiä peräkkäin. 5. merkkijonot, jotka sisältävät kolmella jaollisen lukumäärän merkkiä c.
403 Tehtävä Muodosta epädeterministinen äärellinen automaatti kielelle (0 11). Muodosta tästä edelleen deterministinen äärellinen automaatti. Käytä luentomateriaalissa esitettyä täsmällistä menetelmää, ja esitä myös välivaiheet.
404 Tehtävä Tarkastellaan oheista äärellistä automaattia: b 1 a 2 a b b a 0 b a,b a b 7 a a 6 b b 8 a b 9 10 a 1. Determinisioi automaatti kurssilla opeteltua menetelmää käyttäen. 2. Millaisen kielen automaatti tunnistaa? Muodosta automaatista vastaava säännöllinen lauseke.
405 Tehtävä Tarkastellaan oheista äärellistä automaattia: b 1 a b a 2 a 3 a b b b b a a 1. Millaisen kielen automaatti tunnistaa? Muodosta automaatista vastaava säännöllinen lauseke.
406 Tehtävä Tarkastellaan oheista äärellistä automaattia: 1 b a 2 a 3 a a b b b 4 b 5 b b b b b 6 1. Determinisoi automaatti kurssilla opeteltua menetelmää käyttäen. 2. Millaisen kielen automaatti tunnistaa? Muodosta automaatista vastaava säännöllinen lauseke.
407 Tehtävä Erään ohjelmointikielen funktiomäärittelyt ovat seuraavanlaisia: ensin annetaan paluuarvo, joka voi olla int, float tai void. Sitä seuraa funktion nimi. Suluissa ennetaan parametrit, ensin tyyppi (joko int tai float) ja sitten parametrin nimi. Parametrit erotetaan pilkulla. Parametrien puuttuminen ilmaistaan varatulla sanalla void. Funktioiden ja muuttujien nimet koostuvat kirjaimista a,b,c,...,z sekä numeromerkeistä 0,1,2,...,9, ja alkavat aina kirjaimella. Laillisia määrittelyjä ovat esimerkiksi: int calc2(int x, int y), void print(float meanvalue), float generate(void). 1. Anna kielen kuvaava säännöllinen lauseke. 2. Muodosta kielen tunnistava deterministinen äärellinen automaatti lausekkeesta. 3. Anna kielen kuvaava kontekstiton kielioppi.
408 Tehtävä Olkoon aakkosto Σ = {a, b}. Tarkastellaan kieltä L = {x x ei sisällä merkkijonoa aba}. 1. Laadi äärellinen automaatti, joka tunnistaa kyseisen kielen. (Vihje: Laadi ensin automaatti sen komplementille.) 2. Lue automaatista vastaava säännöllinen lauseke. Anna kaikki välivaiheet! 3. Anna kontekstiton kielioppi, joka tuottaa kyseisen kielen. Tehtävä Mitä tarkoittaa Äärellisen automaatin determinisointi? 2. Äärellisen automaatin muodostus säännöllisestä lausekkeesta? 3. Todistus Pumppauslemmalla?
409 Tehtävä Ovatko seuraavat väittämät oikein vai väärin? Perustele lyhyesti. 1. Jos kieli ei ole säännöllinen, on se kontekstiton. 2. Jos kieli on kontekstiton, on se myös säännöllinen. 3. Jos kieli on säännöllinen, on se myös kontekstiton. 4. On olemassa kieliä jotka ovat säännöllisiä mutta eivät kontekstittomia. 5. On olemassa kieliä jotka voidaan tunnistaa epädeterministisellä äärellisellä automaatilla mutta joita ei voida kuvata säännöllisellä lausekkeella. 6. Jos annettuna kielioppi G ja merkkijono w {a, b}, niin w L(G) on algoritmisesti ratkeava ongelma.
410 Tehtävä Ovatko allaolevat väitteet tosia vai epätosia, kun tarkastellaan seuraavaa kielioppia G: S aa bb ε A bb b B aa a 1. Merkkijonot a ja b kuuluvat kieliopin kuvaamaan kieleen L(G). 2. Säännöllinen lauseke ab(ab) aba(ba) ba(ba) bab(ab) kuvaa kielen L(G). 3. Säännöllinen lauseke a(ba) b b(ab) a kuvaa kielen L(G). 4. G on vasemmalle lineaarinen. 5. G kuvaa saman kielen kuin kielioppi G : S aa bb ε A ba A B ε B ab B A ε
411 Tehtävä Ovatko seuraavat formaalikielet säännöllisiä? Jos joku niistä ei ole säännöllinen, osoita että se on kontekstiton. 1. {a i b j i = , j = } 2. {w w on a:sta ja b:stä koostuva merkkijono, jonka pituus on 3:lla jaollinen} 3. {ww w {a, b} } 4. {a n ba n n 0} 5. {w {a, b} w sisältää parillisen määrän a:ta sekä vähintään yhden b:n}. 6. {a i b j j i 0} 7. {w {a, b} w sisältää parillisen määrän b:tä} 8. {w {a, b} w sisältää parillisen määrän b:tä} {w {a, b} w sisältää kolmella jaollisen määrän a:ta}. 9. {w {a, b} w sisältää parillisen määrän a:tä sekä vähintään yhden b:n}. 10. {a i b j {a, b} 2 i = j 4} 11. {a i b j i = 2j} 12. {a i b j i on parillinen ja j on pariton} 13. {awa bwb w {a, b} } 14. {w {a, b} w sisältää merkkijonon ab sekä parittoman määrän a:ta}. 15. {a m b n 0 m n 2m}
412 Tehtävä Olkoon annettu säännölliset kielet L, L 1 ja L 2. Osoita että myös seuraavat kielet ovat säännöllisiä: 1. L 1 L 2 (kielten katenaatio) 2. L 1 L 2 3. L 1 L 2 4. L
413 Tehtävä Olkoon annettu kielioppi S aa bb A as ba B bb ε 1. Laadi kieliopin kuvaaman kielen tunnistava äärellinen automaatti. 2. Anna vastaava säännöllinen lauseke. 3. Kuuluuko merkkijono aabbab kieleen? Jos kuuluu, niin anna merkkijonon jäsennyspuu.
414 Tehtävä Mitkä seuraavat aakkoston Σ = {a, b} kielistä ovat säännöllisiä, mitkä eivät: 1. L = {a n b n n N} 2. L = {a n a n n N} 3. L = {wuw R w, u Σ + } Perustele vastauksesi.
415 Tehtävä Tarkastellaan aakkoston {a, b} parillisen mittaisten palindromien muodostamaa kieltä PAL = {ww R w {a, b} }. 1. Laadi kielen tuottava kontekstiton kielioppi. 2. Muodosta kielen tunnistava pinoautomaatti.
416 Tehtävä Tarkastellaan aritmeettisia lausekkeita tuottavaa kontekstitonta kielioppia G: E E + E E E (E) a. 1. Muodosta lauseelle (a + a) a vasen johto. 2. Osoita että kielioppi on moniselitteinen (Vihje: a + a a). 3. Muunna kielioppi G LL(1)-muotoon. 4. Hahmottelen kieliopin LL(1)-muotoon perustuva rekursiivisesti etenevä jäsennysohjelma.
417 Tehtävä Selitä lyhyesti seuraavien käsitteiden merkitys. 1. Oikealle tai vasemmalle lineaarinen kielioppi. 2. Jäsennyspuu (parse tree). 3. Säännöllinen lauseke (regular expression). 4. Moniselitteinen kielioppi. 5. ε-automaatti. 6. LL(1)-muoto 7. Churchin-Turingin teesi. Loppu Muista kurssipalaute!
1 Kurssin asema opetuksessa
1 Kurssin asema opetuksessa Tietojenkäsittelytieteen pääaineopiskelijoille pakollinen aineopintokurssi (3 op). Esitietovaatimukset: Johdatus tietojenkäsittelytieteeseen (JTT): Laskennan, algoritmin ja
Esimerkki 1: Kahviautomaatti.
Esimerkki 1: Kahviautomaatti. ÄÄRELLISET AUTOAATIT JA SÄÄNNÖLLISET KIELET 2.1 Tilakaaviot ja tilataulut Tarkastellaan aluksi tietojenkäsittelyjärjestelmiä, joilla on vain äärellisen monta mahdollista tilaa.
582206 Laskennan mallit
582206 Laskennan mallit luennot syksylla 2006, periodit I{II Jyrki Kivinen tietojenkasittelytieteen aineopintokurssi, 6 op, paaaineopiskelijoille pakollinen esitietoina Tietorakenteet (ja sen esitiedot)
Laskennan teoria
581336-0 Laskennan teoria luennot syyslukukaudella 2003 Jyrki Kivinen tietojenkäsittelytieteen laudatur-kurssi, 3 ov pakollinen tietojenkäsittelytieteen suuntautumisvaihtoehdossa esitiedot käytännössä
Laskennan teoria
581336-0 Laskennan teoria luennot syyslukukaudella 2004 Jyrki Kivinen tietojenkäsittelytieteen laudatur-kurssi, 3 ov pakollinen tietojenkäsittelytieteen suuntautumisvaihtoehdossa, opettajan suuntautumisvaihtoehdossa
5.3 Ratkeavia ongelmia
153 5.3 Ratkeavia ongelmia Deterministisen äärellisten automaattien (DFA) hyväksymisongelma: hyväksyykö annettu automaatti B merkkijonon w? Ongelmaa vastaava formaali kieli on A DFA = { B, w B on DFA,
Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen.
Lause: Tyhjyysongelma ei ole osittain ratkeava; ts. kieli ei ole rekursiivisesti lueteltava. L e = { w { 0, 1 } L(M w ) = } Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia,
Esimerkkejä polynomisista ja ei-polynomisista ongelmista
Esimerkkejä polynomisista ja ei-polynomisista ongelmista Ennen yleisempiä teoriatarkasteluja katsotaan joitain tyypillisiä esimerkkejä ongelmista ja niiden vaativuudesta kaikki nämä ongelmat ratkeavia
Rajoittamattomat kieliopit (Unrestricted Grammars)
Rajoittamattomat kieliopit (Unrestricted Grammars) Laura Pesola Laskennanteorian opintopiiri 13.2.2013 Formaalit kieliopit Sisältävät aina Säännöt (esim. A -> B C abc) Muuttujat (A, B, C, S) Aloitussymboli
Kielenä ilmaisten Hilbertin kymmenes ongelma on D = { p p on polynomi, jolla on kokonaislukujuuri }
135 4.3 Algoritmeista Churchin ja Turingin formuloinnit laskennalle syntyivät Hilbertin vuonna 1900 esittämän kymmenennen ongelman seurauksena Oleellisesti Hilbert pyysi algoritmia polynomin kokonaislukujuuren
Muodolliset kieliopit
Muodolliset kieliopit Luonnollisen kielen lauseenmuodostuksessa esiintyy luonnollisia säännönmukaisuuksia. Esimerkiksi, on jokseenkin mielekästä väittää, että luonnollisen kielen lauseet koostuvat nk.
Pysähtymisongelman ratkeavuus [Sipser luku 4.2]
Pysähtymisongelman ratkeavuus [Sipser luku 4.2] Osoitamme nyt vihdoin, että jotkin Turing-tunnistettavat kielet ovat ratkeamattomia ja jotkin kielet eivät ole edes Turing-tunnistettavia. Lisäksi toteamme,
M = (Q, Σ, Γ, δ, q 0, q acc, q rej )
6. LASKETTAVUUSTEORIAA Churchin Turingin teesi: Mielivaltainen (riittävän vahva) laskulaite Turingin kone. Laskettavuusteoria: Tarkastellaan mitä Turingin koneilla voi ja erityisesti mitä ei voi laskea.
Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä
Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,
Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Muita vaativuusluokkia
Muita vaativuusluokkia Käydään lyhyesti läpi tärkeimpiä vaativuusluokkiin liittyviä tuloksia. Monet tunnetuista tuloksista ovat vaikeita todistaa, ja monet kysymykset ovat vielä auki. Lause (Ladner 1975):
Chomskyn hierarkia ja yhteysherkät kieliopit
Chomskyn hierarkia ja yhteysherkät kieliopit Laskennan teorian opintopiiri Tuomas Hakoniemi 21. helmikuuta 2014 Käsittelen tässä laskennan teorian opintopiirin harjoitustyössäni muodollisten kielioppien
Rekursiiviset palautukset [HMU 9.3.1]
Rekursiiviset palautukset [HMU 9.3.1] Yleisesti sanomme, että ongelma P voidaan palauttaa ongelmaan Q, jos mistä tahansa ongelmalle Q annetusta ratkaisualgoritmista voidaan jotenkin muodostaa ongelmalle
Automaatit. Muodolliset kielet
Automaatit Automaatit ovat teoreettisia koneita, jotka käsittelevät muodollisia sanoja. Automaatti lukee muodollisen sanan kirjain kerrallaan, vasemmalta oikealle, ja joko hyväksyy tai hylkää sanan. Täten
Output. Input Automaton
16 Aakkostot, merkkijonot ja kielet Automaattiteoria diskreetin signaalinkäsittelyn perusmallit ja -menetelmät ( diskreettien I/O-kuvausten yleinen teoria) 1011 Input Automaton Output Automaatin käsite
815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava
ICS-C2000 Tietojenkäsittelyteoria Kevät 2016
ICS-C2000 Tietojenkäsittelyteoria Kevät 206 Kierros 0, 2. 24. maaliskuuta Huom! Perjantaina 25. maaliskuuta ei ole laskareita (pitkäperjantai), käykää vapaasti valitsemassanne ryhmässä aiemmin viikolla.
Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys.
Ei-säännöllisiä kieliä [Sipser luku 1.4] Osoitamme, että joitain kieliä ei voi tunnistaa äärellisellä automaatilla. Tulos ei sinänsä ole erityisen yllättävä, koska äärellinen automaatti on äärimmäisen
TKT20005 Laskennan mallit (syksy 2018) Kurssikoe, malliratkaisut
TKT20005 Laskennan mallit (syksy 2018) Kurssikoe, malliratkaisut Pisteytys on ilmoitettu välikoevaihtoehdon mukaan (joko tehtävät 1, 2 ja 3 välikokeen 1 uusintana tai tehtävät 4, 5 ja 6 välikokeen 2 uusintana).
+ 3 2 5 } {{ } + 2 2 2 5 2. 2 kertaa jotain
Jaollisuustestejä (matematiikan mestariluokka, 7.11.2009, ohjattujen harjoitusten lopputuloslappu) Huom! Nämä eivät tietenkään ole ainoita jaollisuussääntöjä; ovatpahan vain hyödyllisiä ja ainakin osittain
(0 1) 010(0 1) Koska kieli on yksinkertainen, muodostetaan sen tunnistava epädeterministinen q 0 q 1 q 2 q3
T-79.48 Tietojenkäsittelyteorian perusteet Tentti 25..23 mallivastaukset. Tehtävä: Kuvaa seuraavat kielet sekä säännölisten lausekkeiden että determinististen äärellisten automaattien avulla: (a) L = {w
Kurssikoe on maanantaina 29.6. Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.
HY / Avoin ylioisto Johdatus yliopistomatematiikkaan, kesä 201 Harjoitus 7 Ratkaisut palautettava viimeistään perjantaina 26.6.201 klo 16.00. Huom! Luennot ovat salissa CK112 maanantaista 1.6. lähtien.
Äärellisten automaattien ja säännöllisten kielten ekvivalenssi
Äärellisten automaattien ja säännöllisten kielten ekvivalenssi Osoitamme seuraavan keskeisen tuloksen: Lause 1.8: [Sipser Thm. 1.54] Kieli on säännöllinen, jos ja vain jos jokin säännöllinen lauseke esittää
8. Kieliopit ja kielet 1 / 22
8. Kieliopit ja kielet 1 / 22 Luonnollinen kieli Suomen kielen sanoja voidaan yhdistellä monella eri tavalla. Kielioppi määrää sen, milloin sanojen yhdistely antaa oikein muodostetun lauseen. "Mies räpyttää
FUNKTIONAALIANALYYSIN PERUSKURSSI 1. 0. Johdanto
FUNKTIONAALIANALYYSIN PERUSKURSSI 1. Johdanto Funktionaalianalyysissa tutkitaan muun muassa ääretönulotteisten vektoriavaruuksien, ja erityisesti täydellisten normiavaruuksien eli Banach avaruuksien ominaisuuksia.
1. Universaaleja laskennan malleja
1. Universaaleja laskennan malleja Laskenta datan käsittely annettuja sääntöjä täsmällisesti seuraamalla kahden kokonaisluvun kertolasku tietokoneella, tai kynällä ja paperilla: selvästi laskentaa entä
Algoritmit 1. Luento 2 Ke Timo Männikkö
Algoritmit 1 Luento 2 Ke 11.1.2017 Timo Männikkö Luento 2 Algoritmin esitys Algoritmien analysointi Suoritusaika Asymptoottinen kertaluokka Peruskertaluokkia NP-täydelliset ongelmat Algoritmit 1 Kevät
Laskennan teoria (kevät 2006) Harjoitus 3, ratkaisuja
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
TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011
TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 31. maaliskuuta 2011 Sisällys Sisällys Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti
Aloitus. TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 14. maaliskuuta 2011 TIETOTEKNIIKAN LAITOS. Aloitus.
TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 14. maaliskuuta 2011 Sisällys Sisällys Kurssin käytännöt Kurssin sivuilla http://users.jyu.fi/~antkaij/opetus/auki/2011/
4.3. Matemaattinen induktio
4.3. Matemaattinen induktio Matemaattinen induktio: Deduktion laji Soveltuu, kun ominaisuus on osoitettava olevan voimassa luonnollisilla luvuilla. Suppea muoto P(n) : Ominaisuus, joka joka riippuu luvusta
2. Laskettavuusteoriaa
2. Laskettavuusteoriaa Käymme läpi ratkeamattomuuteen liittyviä ja perustuloksia ja -tekniikoita [HMU luku 9]. Tämän luvun jälkeen opiskelija tuntee joukon keskeisiä ratkeamattomuustuloksia osaa esittää
Automaattiteoria diskreetin signaalinkäsittelyn perusmallit ja -menetelmät ( diskreettien I/O-kuvausten yleinen teoria)
1.6 Aakkostot, merkkijonot ja kielet Automaattiteoria diskreetin signaalinkäsittelyn perusmallit ja -menetelmät ( diskreettien I/O-kuvausten yleinen teoria) 1011 Input Automaton Output Automaatin käsite
Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.
Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta
TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011
TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 31. maaliskuuta 2011 Sisällys Sisällys Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti
Johdatus Ohjelmointiin
Johdatus Ohjelmointiin Syksy 2006 Viikko 2 13.9. - 14.9. Tällä viikolla käsiteltävät asiat Peruskäsitteitä Kiintoarvot Tiedon tulostus Yksinkertaiset laskutoimitukset Muuttujat Tiedon syöttäminen Hyvin
Matematiikan mestariluokka, syksy 2009 7
Matematiikan mestariluokka, syksy 2009 7 2 Alkuluvuista 2.1 Alkuluvut Määritelmä 2.1 Positiivinen luku a 2 on alkuluku, jos sen ainoat positiiviset tekijät ovat 1 ja a. Jos a 2 ei ole alkuluku, se on yhdistetty
LUKU II HOMOLOGIA-ALGEBRAA. 1. Joukko-oppia
LUKU II HOMOLOGIA-ALGEBRAA 1. Joukko-oppia Matematiikalle on tyypillistä erilaisten objektien tarkastelu. Tarkastelu kohdistuu objektien tai näiden muodostamien joukkojen välisiin suhteisiin, mutta objektien
Luonnolliset vs. muodolliset kielet
Luonnolliset vs. muodolliset kielet Luonnollisia kieliä ovat esim. 1. englanti, 2. suomi, 3. ranska. Muodollisia kieliä ovat esim. 1. lauselogiikan kieli (ilmaisut p, p q jne.), 2. C++, FORTRAN, 3. bittijonokokoelma
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen
Topologia Syksy 2010 Harjoitus 9
Topologia Syksy 2010 Harjoitus 9 (1) Avaruuden X osajoukko A on G δ -joukko, jos se on numeroituva leikkaus avoimista joukoista ja F σ -joukko, jos se on numeroituva yhdiste suljetuista joukoista. Osoita,
TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015
TIEA241 Automaatit ja, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. joulukuuta 2015 Sisällys Formaalisti Määritelmä Nelikko G = (V, Σ, P, S) on kontekstiton kielioppi (engl. context-free
Säännöllisten kielten sulkeumaominaisuudet
Säännöllisten kielten sulkeumaominaisuudet Osoitamme nyt, että säännöllisten kielten joukko on suljettu yhdisteen, konkatenaation ja tähtioperaation suhteen. Toisin sanoen jos A ja B ovat säännöllisiä,
811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2017-2018 Yhteenveto Yleistä kurssista Kurssin laajuus 5 op Luentoja 30h Harjoituksia 21h Itsenäistä työskentelyä n. 80h 811120P Diskreetit rakenteet, Yhteenveto 2 Kurssin
Matematiikan tukikurssi
Matematiikan tukikurssi Kurssikerta 1 1 Matemaattisesta päättelystä Matemaattisen analyysin kurssin (kuten minkä tahansa matematiikan kurssin) seuraamista helpottaa huomattavasti, jos opiskelija ymmärtää
Laskennan rajoja. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 10. joulukuuta 2015 TIETOTEKNIIKAN LAITOS.
TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 10. joulukuuta 2015 Sisällys TM vs yleiset kieliopit Lause Jokaiselle kielelle A seuraavat ovat yhtäpitävät: 1.
Vastauksia. Topologia Syksy 2010 Harjoitus 1
Topologia Syksy 2010 Harjoitus 1 (1) Olkoon X joukko ja (T j ) j J perhe X:n topologioita. Osoita, että T = {T j : j J} on X:n topologia. (2) Todista: Välit [a, b) muodostavat R 1 :n erään topologian kannan.
TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 8. maaliskuuta 2012
TIEA241 Automaatit ja kieliopit, kevät 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 8. maaliskuuta 2012 Sisällys Ongelma-analyysiä Sisällys Ongelma-analyysiä Hypoteettinen ongelma The Elite Bugbusters
Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa.
Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }? Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa. Vastaus 2. Vertaillaan
Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }?
Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }? Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }? Vastaus
Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin?
Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin? 2013-2014 Lasse Lensu 2 Algoritmit ovat deterministisiä toimintaohjeita
Injektio. Funktiota sanotaan injektioksi, mikäli lähtöjoukon eri alkiot kuvautuvat maalijoukon eri alkioille. Esim.
Injektio Funktiota sanotaan injektioksi, mikäli lähtöjoukon eri alkiot kuvautuvat maalijoukon eri alkioille. Esim. Funktio f on siis injektio mikäli ehdosta f (x 1 ) = f (x 2 ) seuraa, että x 1 = x 2.
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat
T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )
T-79144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet 11-22) 26 29102004 1 Ilmaise seuraavat lauseet predikaattilogiikalla: a) Jokin porteista on viallinen
Kertausta 1. kurssikokeeseen
Kertausta. kurssikokeeseen. kurssikoe on to 22.0. klo 9 2 salissa A (tai CK2). Koealueena johdanto ja säännölliset kielet luentokalvot 3 ja nämä kertauskalvot harjoitukset 6 Sipser, luvut 0 ja Edellisvuosien.
vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS
TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 13. lokakuuta 2016 Sisällys Harjoitustehtävätilastoa Tilanne 13.10.2016 klo 9:42 passed waiting redo submitters
8. Kieliopit ja kielet
8. Kieliopit ja kielet Suomen kielen sanoja voidaan yhdistellä monella eri tavalla. Kielioppi määrää sen, milloin sanojen yhdistely antaa oikein muodostetun lauseen. "Mies räpyttää siipiään" on kieliopillisesti
Vaihtoehtoinen tapa määritellä funktioita f : N R on
Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: 1 (Alkuarvot) Ilmoitetaan funktion arvot
Hahmon etsiminen syotteesta (johdatteleva esimerkki)
Hahmon etsiminen syotteesta (johdatteleva esimerkki) Unix-komennolla grep hahmo [ tiedosto ] voidaan etsia hahmon esiintymia tiedostosta (tai syotevirrasta): $ grep Kisaveikot SM-tulokset.txt $ ps aux
Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on
Rekursio Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on käyttää rekursiota: Rekursio Funktio f : N R määritellään yleensä
Algoritmit 1. Luento 13 Ti 23.2.2016. Timo Männikkö
Algoritmit 1 Luento 13 Ti 23.2.2016 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin
Tietorakenteet (syksy 2013)
Tietorakenteet (syksy 2013) Harjoitus 1 (6.9.2013) Huom. Sinun on osallistuttava perjantain laskuharjoitustilaisuuteen ja tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. Näiden laskuharjoitusten
etunimi, sukunimi ja opiskelijanumero ja näillä
Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi
Turingin koneet. Sisällys. Aluksi. Turingin koneet. Turingin teesi. Aluksi. Turingin koneet. Turingin teesi
TIEA241 Automaatit ja kieliopit, kevät 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 17. kesäkuuta 2013 Sisällys Chomskyn hierarkia (ja vähän muutakin) kieli säännöllinen LL(k) LR(1) kontekstiton kontekstinen
Tietotekniikan valintakoe
Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan
Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa 1. Lähdetään sieventämään epäyhtälön vasenta puolta:
MATP00 Johdatus matematiikkaan Ylimääräisten tehtävien ratkaisuehdotuksia. Osoita, että 00 002 < 000 000. Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa. Lähdetään sieventämään epäyhtälön
1. Algoritmi 1.1 Sisällys Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. Muuttujat ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.2 Algoritmin määritelmä Ohjelmointi
Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.
2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet
3. Laskennan vaativuusteoriaa
3. Laskennan vaativuusteoriaa tähän asti puhuttu siitä, mitä on mahdollista laskea äärellisessä ajassa siirrytään tarkastelemaan laskemista kohtuullisessa ajassa vaihtoehtoisesti voidaan laskenta-ajan
Johdatus matemaattiseen päättelyyn
Johdatus matemaattiseen päättelyyn Maarit Järvenpää Oulun yliopisto Matemaattisten tieteiden laitos Syyslukukausi 2015 1 Merkintöjä 2 Todistamisesta 2 3 Joukko-oppia Tässä luvussa tarkastellaan joukko-opin
Laskennan rajoja. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 20. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS.
TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 20. kesäkuuta 2013 Sisällys Päätösongelmat Ongelma on päätösongelma (engl. decision problem), jos se on muotoa Onko
1. Esitä rekursiivinen määritelmä lukujonolle
Matematiikan laitos Johdatus Diskrettiin Matematiikkaan Harjoitus 4 24.11.2011 Ratkaisuehdotuksia Aleksandr Pasharin 1. Esitä rekursiivinen määritelmä lukujonolle (a) f(n) = (2 0, 2 1, 2 2, 2 3, 2 4,...)
Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja
582206 Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja 1. Esitä tilakaaviona NFA N = (Q, Σ, δ, q 0, F ), missä Q = { q 0, q 1, q 2, q 3, q 4, q 5, q 6, q 7 }, Σ = { a, b, c }, F = { q 4 } ja δ on
4. Tehtävässä halutaan todistaa seuraava ongelma ratkeamattomaksi:
T-79.148 Kevät 2004 Tietojenkäsittelyteorian perusteet Harjoitus 12 Demonstraatiotehtävien ratkaisut 4. Tehtävässä halutaan todistaa seuraava ongelma ratkeamattomaksi: Hyväksyykö annettu Turingin kone
Laskennan vaativuus ja NP-täydelliset ongelmat
Laskennan vaativuus ja NP-täydelliset ongelmat TRAK-vierailuluento 13.4.2010 Petteri Kaski Tietojenkäsittelytieteen laitos Tietojenkäsittelytiede Tietojenkäsittelytiede tutkii 1. mitä tehtäviä voidaan
Yhteydettömän kieliopin jäsennysongelma
Yhteydettömän kieliopin jäsennysongelma Yhteydettömän kieliopin jäsennysongelmalla tarkoitetaan laskentaongelmaa Annettu: yhteydetön kielioppi G, merkkijono w Kysymys: päteekö w L(G). Ongelma voidaan periaatteessa
Satunnaisalgoritmit. Topi Paavilainen. Laskennan teorian opintopiiri HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Satunnaisalgoritmit Topi Paavilainen Laskennan teorian opintopiiri HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Helsinki, 23. helmikuuta 2014 1 Johdanto Satunnaisalgoritmit ovat algoritmeja, joiden
Algoritmit 1. Luento 11 Ti Timo Männikkö
Algoritmit 1 Luento 11 Ti 14.2.2017 Timo Männikkö Luento 11 Algoritminen ongelmanratkaisu Osittaminen Lomituslajittelu Lomituslajittelun vaativuus Rekursioyhtälöt Pikalajittelu Algoritmit 1 Kevät 2017
Laskennan mallit (syksy 2008) 2. kurssikoe , ratkaisuja
582206 Laskennan mallit (syksy 2008) 2. kurssikoe 11.12., ratkaisuja Tehtävän 1 tarkasti Harri Forsgren, tehtävän 2 Joel Kaasinen ja tehtävän 3 Jyrki Kivinen. Palautetilaisuuden 19.12. jälkeen arvosteluun
9. Matemaattisista koneista.
9. Matemaattisista koneista. Monia tietojenkäsittelytehtäviä, digitaalisia komponetteja, ohjelmia jne. voidaan mallintaa äärellistilaisella matemaattisella koneella. Matemaattinen kone on myös tietojenkäsittelijän
Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet
TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 24. toukokuuta 2013 Sisällys Formaalit kielet On tapana sanoa, että merkkijonojen joukko on (formaali) kieli. Hieman
