ICS-C2000 Tietojenkäsittelyteori Kevät 2016 Kierros 5, 8. 12. helmikuut Demonstrtiotehtävien rtkisut D1: Hhmolusekkeet ovt esimerkiksi UN*X-järjestelmien tekstityökluiss käytetty säännöllisten lusekkeiden yleistys, joss sllitn merkkijonorvoisten muuttujien käyttö lusekkeiss. Sovitettess merkkijono nnettuun lusekkeeseen vditn, että tietynnimisen muuttujn rvoksi tulee eri kohdiss sm osmerkkijono. Siten esimerkiksi Xb X j X( b) Y X( b) Y ovt kkoston {,b} hhmolusekkeit, joist ensimmäinen kuv kielen {wb n w w {,b}, n 0}. Osoit, että hhmolusekkeet ovt säännöllisten lusekkeiden ito yleistys, so. että niillä voidn kuvt myös joitkin ei-säännöllisiä kieliä. Rtkisu: Osoittksemme, että tehtävän hhmolusekkeet on säännöllisten lusekkeiden ito yleistys, tulee meidän löytää hhmoluseke, jonk määrittämä kieli ei ole säännöllinen. Trkstelln hhmolusekett XX vstv kieltä L = {zz z {,b} }. Oletetn, että L on säännöllinen. Vlitn x = n b n b L, missä n on pumppuslemmss esiintyvä kielestä L riippuv kokonisluku. Nyt x = 2n + 2 > n. Pumppuslemmn mukn voidn kirjoitt x = uvw, missä uv n j v 1. Siis u = n v k, v = v j w = k b n b, missä 0 k < n. Nyt pumppuslemmn mukn kikille i 0 tulisi päteä uv i w L. Kuitenkin uv 0 w = uw = n v b n b L, sillä se ei ole muoto zz, kosk vdittiin v 1. Päädyttiin siis ristiriitn oletuksen knss. L ei näin ollen voi oll säännöllinen. Löydettiin siis ei-säännöllinen kieli, jok voidn kuvt hhmolusekkeell. Näin ollen hhmolusekkeet ovt säännöllisten lusekkeiden ito yleistys. D2: Osoit, että kieli {w {,b} w:ssä on yhtä mont :t j b:tä} ei ole säännöllinen, j ldi yhteydetön kielioppi sen kuvmiseen. Rtkisu: Kielen L = {w {,b} w:ssä on yhtä mont :t j b:tä} voi todist ei-säännölliseksi suorn pumppuslemmll. Tässä esitetään kuitenkin hiemn monimutkisempi rtkisu esimerkkinä siitä, miten hnkli kieliä voidn käsitellä. Määritellään kieli L = L L( b ). Oletetn, että L on säännöllinen. Kosk L( b ) on säännöllinen j säännöllisten kielten joukko on suljettu leikkuksen suhteen, täytyy myös L :n oll säännöllinen. (Toisinpäin ehto ei päde: L voi oll säännöllinen vikk L ei olisi, sillä esim. A /0 = /0 kikille kielille A). Huomtn, että L = { k b k k 0}. Trkstelln sn w = n b n, missä n on pumppuslemmss esiintyvä prmetri. Yritetään ositt w lemmn ehtojen mukisesti. Kosk 1
xy n, osituksen täytyy oll muoto; x = n i k y = i z = k b n, missä 0 < i n j i + k n. Nyt xz = n i b n, joten xz / L. Näin ollen sn w ei void pumpt, eikä L ole säännöllinen, joten myöskään L ei ole säännöllinen. Kielen L kuv esimerkiksi seurv yhteydetön kielioppi: S SbS bss ε Kieliopin ensimmäinen sääntö esittää ehdon: Jos sn lk :ll, niin jossin koht snss esiintyy myös vstv b. Tätä ennen j jälkeen voi esiintyä mitä thns tspinoisi merkkijonoj. D3: Ldi yhteydetön kielioppi, jok tuott kikki seurvn esimerkin tpiset, yksinkertisist sisäkkäisistä for-silmukoist, begin- j end-sulkeill kootuist luseist j lkeisopertioist rkentuvt ohjelmt : ; for 3 times do begin for 5 times do ; ; end. Silmukklskureiden voit olett olevn kokonislukuj väliltä 0,..., 9. Rtkisu: Ohjelmointikielten kieliopit määritellään useimmiten siten, että kkostoksi otetn kielessä esiintyvät syntktiset elementit (lekseemit). Tässä tpuksess niitä ovt numerot, sekä vrtut snt. Ohjelmn jäsentäminen jetn khteen osn: () Muutetn ohjelmn teksti jonoksi lekseemeitä tilkoneiden vull. (b) Muodostetn lekseemijonon jäsennyspuu. Tehtävän kieliopin voi määritellä monellkin eri tp, tässä on yksi mhdollinen tulkint: G =(V,Σ,P,C) V ={C,S,N,begin,do,end,for,times,0,1,2,3,4,5,6,7,8,9,;,} Σ ={begin,do,end,for,times,0,1,2,3,4,5,6,7,8,9,;,} 2
Tässä välikkeen S tulkintn on luse (sttement), C:n yhdistetty luse (compound sttement) j N:n numero. Kieliopin säännöt määritellään seurvsti: P = {C S S;C S begin C end for N times do S N 0 1 2 3 4 5 6 7 8 9} Esimerkki. Tehtävännnoss esiintyneen ohjelmn jäsennyspuu: D4: Moderniss WWW-sivujen kuvmiseen käytetyssä XML-kielessä on sivujen suunnittelijn mhdollist lti omi ns. dokumenttityyppimäärityksiä (engl. Document Type Definition, lyh. DTD), jotk ovt oleellisesti sivull esitettävän tekstin ti muun dtn rkennett kuvvi yhteydettömiä kielioppej. Tutustu tämän XML/DTD-kuvuskielen nottioon (esim. WWW-sivult http://www.rpbourret.com/xml/xmldtd.htm), j ldi seurv XML/DTD-kuvust vstv yhteydetön kielioppi: <!DOCTYPE Book [ <!ELEMENT Book (Title, Chpter+)> <!ATTLIST Book Author CDATA #REQUIRED> <!ELEMENT Title (#PCDATA)> <!ELEMENT Chpter (#PCDATA)> <!ATTLIST Chpter id ID #REQUIRED> ]> 3
Rtkisu: Yllä olev DTD-kuvus määrittelee rkenteen kirjlle. Määrittelyssä esiintyy khdenlisi sioit: osi (element) j ttribuuttej (ttlist). Perusjtuksen on, että kirj itsessään koostuu osist, j ttribuutit puolestn liittävät kirjn osiin ylimääräistä tieto. Yleisesti otten ttribuuttej ei void esittää puhtill kieliopeill, vn niitä vrten trvitn ttribuuttikieliopit (ks. opetusmoniste s. 60 68). Näin ollen DTD-kuvuksest mllinnetn ensin vin ost, eli käytännössä inostn rivit, jotk lkvt merkinnällä!element. Näistä riveistä ensimmäinen: <!ELEMENT Book (Title, Chpter+)> kertoo, että kirj (Book) sisältää otsikon (Title) j listn lukuj (Chpter). Lukuj täytyy oll vähintään yksi. Seurv rivi: <!ELEMENT Title (#PCDATA)> puolestn määrittelee otsikon merkkijoukoksi (#PCDATA). Merkkijoukkoon voi kuulu perittess mitä thns tietokoneen merkkijärjestelmään kuuluvi symboleit. Lopuksi, rivi: <!ELEMENT Chpter (#PCDATA)> kertoo luvun olevn ts joukko merkkejä. Kirjn rkenteen kuv siis kielioppi: 1 Book Title Chpters Title dt Chpters Chpter Chpters Chpter Chpter dt XML-kielessä erotetn dokumentin ost toisistn käyttäen pun <A> j </A> koodej. Kun nämä koodit lisätään yllä olevn kielioppiin, sdn tulokseksi seurvnlinen yhteydetön kielioppi: Book Book Title Chpters /Book Title Title dt /Title Chpters Chpter Chpters Chpter Chpter Chpter dt /Chpter 1 Kursiivill kirjoitetut snt ovt välikkeitä, vhvennetut päätemerkkejä. 4
Vikk ttribuuttej ei voidkn täysin esittää yhteydettömällä kieliopill, niiden syntksi voidn kuitenkin kuvt. XML-kielessä osn ttribuutit kirjoitetn osn loittvn koodin sisään. Lisäämällä nämä ylläolevn kielioppiin sdn tulokseksi: Book Book BookAttributes Title Chpters /Book Title Title dt /Title Chpters Chpter Chpters Chpter Chpter Chpter ChpterAttributes dt /Chpter BookAttributes uthor = dt ChpterAttributes id = dt Tässä on huomttv, että yhteydettömällä kieliopill ei void määritellä ehto, jonk mukn kikill luvuill on eri tunnus. Tällisten ehtojen toteutuminen täytyy trkist jollin erillisellä ohjelmkoodill. Liite: oikelle lineriset kieliopit Yhteydetön kielioppi G on oikelle linerinen, mikäli sen kikki säännöt ovt muoto: A αb, missä α Σ j B V {ε}. Toisin snoen, säännön oikell puolell s esiintyä korkeintn yksi välike, j sen täytyy oll säännön lopuss. Esimerkiksi säännöt A bc j A ε ovt oikelle linerisi, mutt A B j A bcd eivät ole. Vstvsti vsemmlle linerisen kieliopin kikki säännöt ovt muoto A Bα. Oikelle j vsemmlle lineriset kieliopit ovt ilmisuvoimltn smll tsoll kuin äärelliset utomtit, eli niillä voidn ilmist kikki säännölliset kielet. Säännöllisen kielen tuottv oikelle linerinen kielioppi voidn luke suorn kielen tunnistvst utomtist. Kieliopin välikkeiksi otetn utomtin tilt, j kustkin utomtin siirtymästä q i q j sdn sääntö Q i Q j. Lisäksi kielioppiin lisätään säännöt Q f ε kikille hyväksyville lopputiloille q f F. Esimerkiksi utomtti: vstv kielioppi on: q 2 q q 1 0 b b b Q 0 Q 1 bq 2 ε Q 1 Q 2 bq 0 Q 2 Q 0 bq 1. 5