Tehtävä 2: Säännölliset lausekkeet

Samankaltaiset tiedostot
KESKI-SUOMEN MAAKUNNAN JA LÄHIKUNTIEN LUKIOIDEN TIETOTEKNIIKAN II KILPAILU

Tehtävä 1: Tietoturva

Datatähti 2019 alku. task type time limit memory limit. A Kolikot standard 1.00 s 512 MB. B Leimasin standard 1.00 s 512 MB

Säännöllisten kielten sulkeumaominaisuudet

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Luonnolliset vs. muodolliset kielet

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

Lukumäärän laskeminen 1/7 Sisältö ESITIEDOT:

Lukion matematiikkakilpailun alkukilpailu 2015

11.4. Context-free kielet 1 / 17

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

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

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Tietotekniikan valintakoe

Yhteydettömän kieliopin jäsennysongelma

Harjoitustyön testaus. Juha Taina

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

Käänteismatriisin. Aiheet. Käänteismatriisin ominaisuuksia. Rivioperaatiot matriisitulona. Matriisin kääntäminen rivioperaatioiden avulla

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

Chomskyn hierarkia ja yhteysherkät kieliopit

8. Kieliopit ja kielet

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

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

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

1 Lukujen jaollisuudesta

ITKP102 Ohjelmointi 1 (6 op)

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

S BAB ABA A aas bba B bbs c

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

Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja

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

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

Täydentäviä muistiinpanoja laskennan rajoista

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

Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin:

Automaatit. Muodolliset kielet

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

Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja

811120P Diskreetit rakenteet

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

c) 22a 21b x + a 2 3a x 1 = a,

Pinoautomaatit. Pois kontekstittomuudesta

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

Ratkaisu: a) Kahden joukon yhdisteseen poimitaan kaikki alkiot jotka ovat jommassakummassa joukossa (eikä mitään muuta).

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

Lineaarialgebra ja matriisilaskenta I

joissa on 0 4 oikeata vastausta. Laskimet eivät ole sallittuja.

Vapaus. Määritelmä. jos c 1 v 1 + c 2 v c k v k = 0 joillakin c 1,..., c k R, niin c 1 = 0, c 2 = 0,..., c k = 0.

(a) Kyllä. Jokainen lähtöjoukon alkio kuvautuu täsmälleen yhteen maalijoukon alkioon.

Syyskuu Jo vuodesta Julkaisijat: Lions Club Lavia ry. ja Lavian Yrittäjät ry.

FORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

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

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

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

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

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

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

Task list Submit code Submissions Scoreboard View queue Edit contest

Ohjelmoinnin perusteet Y Python


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

Tehtävä 2: Loppuosataulukko

Helsingin, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe klo 10 13

Muodolliset kieliopit

2 Yhtälöitä ja epäyhtälöitä

Kaikki kurssin laskuharjoitukset pidetään Exactumin salissa C123. Malliratkaisut tulevat nettiin kurssisivulle.

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

Harjoitus 6 (viikko 42)

Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja

5.3 Ratkeavia ongelmia

S uay uvaxy uv 2 Ax 2 y... uv i Ax i y uv i wx i y.

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

9 Matriisit. 9.1 Matriisien laskutoimituksia

Johdatus matemaattiseen päättelyyn

Kaikkiin tehtäviin laskuja, kuvia tai muita perusteluja näkyviin.

Yhteydettömät kieliopit [Sipser luku 2.1]

Kansainväliset matematiikkaolympialaiset 2008

Yhdistetty funktio. Älä sekoita arvo- eli kuvajoukkoa maalijoukkoon! (wikipedian ongelma!)

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

Asialista. CLT131: Tekstityökalut 2011, kahdeksas luento. Merkistöistä ja kalvostoista. Asialista. Tommi A Pirinen

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

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

CLT131: Tekstityökalut 2011, kahdeksas luento

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

Korpusten käsittely clt131, P Luento 5

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

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

Tekijä Pitkä matematiikka Suoran pisteitä ovat esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4).

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Todistus: Aiemmin esitetyn mukaan jos A ja A ovat rekursiivisesti lueteltavia, niin A on rekursiivinen.

Matriisipotenssi. Koska matriisikertolasku on liitännäinen (sulkuja ei tarvita; ks. lause 2), voidaan asettaa seuraava määritelmä: ja A 0 = I n.

9 Yhteenlaskusääntö ja komplementtitapahtuma

Sinulle on annettu bittijono, ja tehtäväsi on muuttaa jonoa niin, että jokainen bitti on 0.

Syötteen ensimmäisellä rivillä on kokonaisluku n, testien määrä (1 n 10). Tämän jälkeen jokaisella seuraavalla rivillä on kokonaisluku x (0 x 1000).

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

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

Transkriptio:

Tehtävä 2: Säännölliset lausekkeet Kun tietokoneohjelmalla luetaan käyttäjän syötettä, olisi syöte aina syytä tarkistaa. Syötteessä voi olla vääriä merkkejä tai merkkejä väärillä paikoilla (syntaktinen vika), tai se voi olla sisällöllisesti mieletön (semanttisesti väärin, esim. päivämäärä 32.2.2013). Merkkijonon (jatkossa käytetään pelkkää sana jono) syntaktisessa oikeellisuustarkistuksessa voidaan käyttää säännöllisiä lausekkeita (englanniksi regular expression). Säännöllisissä lausekkeissa on tietty merkintä, jolla voidaan esimerkiksi sanoa, että joku merkki toistuu nolla tai useampia kertoja. Esimerkiksi: Säännöllinen lauseke: Tutkittava jono: a b* c a bbb c Täsmää a b* c? a bbb Ei täsmää Täsmää-esimerkissä säännöllisen lausekkeen alusta löytyy a, joka vastaa jonon a:ta. Lausekkeen b* vastaa jonoa bbb, koska * monistaa edellisen merkin 0-n kertaa. Lopussa molemmissa on c, eli kaikille jonon merkeille löytyi vastine säännöllisestä lausekkeesta. Esimerkin säännöllinen lauseke täsmäisi myös jonoihin ac, abc, abbc ja vaikkapa abbbbbbbbbbbbbc. Ei täsmää -esimerkissä on muuten samat vastaavuudet, mutta lausekkeen c ei vastaa mitään tutkittavan jonon merkkiä, jolloin lauseke ei siis täsmää jonoon. Täsmäystä ei myöskään tapahtuisi jos lauseke olisi ab* ja tutkittava jono olisi abbbc, koska tällöin jonon c:lle ei olisi vastaavaa merkkiä lausekkeessa. Useimmissa ohjelmointikielissä on valmiit kirjastot säännöllisiä lausekkeita varten. Oletetaan, että käyttäjän syöte (esimerkiksi WWW-lomakkeelta) olisi luettu merkkijonomuuttujaan jono. Silloin esimerkiksi eräällä ohjelmointikielellä kellonajan tarkistaminen muotoon hh:mm voitaisiin tehdä ohjelmakoodilla: if ( Pattern.matches("[0-2][0-9]:[0-5][0-9]", jono) )... jono oikein... Tämä tarkistus jättää vielä toki paljon mahdollisuuksia syötön sisällöllisille virheille. Palataan niihin myöhemmin. 1

Alla olevassa taulukossa annetaan osajoukko eräistä säännöllisten lausekkeiden merkinnöistä. Esimerkkilausekkeen jälkeen on esimerkkejä jonoista, jotka lauseke hyväksyy (eli jonka merkit täsmäävät lausekkeen muotoon) ja esimerkkejä jonoista, jotka hylätään (eli jonka merkit eivät täsmää lausekkeen muotoon). Merkintä Selitys tai esimerkki Hyväksyy mm. jonot Hylkää mm. jonot. Mikä tahansa merkki. ki.a kiva, kisa kuva * Edellinen 0 kertaa tai miten monta kertaa tahansa. ab*a aa, aba, abba abca, abc k.*a kissa, koira, kuva kettu + Edellinen vähintään yhden kerran. ab+a aba, abba, abbba aca, aa? Edellinen 0 tai 1 kertaa. ab?a aa, aba abba [lista] {n} (ryhmä) Hakasuluissa voidaan antaa lista merkeistä, joista yksi käytetään. Tässä lista tai sen osa voidaan ilmoittaa myös muodossa alkumerkki-loppumerkki. a[bf]a aba, afa ada a[a-ek]a aba, aea, aka afa, aeka a[a-e]*a aa, aaa, aea, aaba, abbbeba afa Aaltosuluilla voidaan määrittää kerroin, jolla edellinen tulee tasan n kertaa. ab{2}a abba aba Kaarisuluilla voidaan yhdistää merkkejä ryhmäksi, johon mm. *, + tai kerroin vaikuttaa. a(ab)*c ac, aabc, aababc aac, adc, abac a(ab)+c aabc, aababc ac, aac, adc, abac a(ab){2}c aababc ac, aabc, ababac Jompi kumpi vaihtoehdoista. a(bb k)a abba, aka akka, abbka Taulukko 1: Säännöllisten lauseiden merkintöjä ja esimerkkejä. 2

Esimerkiksi 2000-luvulla syntyneen suomalaisen henkilötunnuksen merkkien oikeellisuus voitaisiin tarkistaa lausekkeella [0-9]{6}A[0-9]{3}[0-9A-FHJ-NPR-Y] Selitys edelliselle jakamalla lauseke osiin: [0-9]{6} Numeroita väliltä 0 9 kuusi kappaletta, A merkki A (koska 2000-luvulla syntyneillä erotinmerkki on A), [0-9]{3} numeroita väliltä 0 9 kolme kappaletta, [0-9A-FHJ-NPR-Y] ja lopuksi hetun tarkistusmerkiksi jokin numeroista 0 9 tai kirjaimista A Y paitsi ei G, I, O tai Q (koska olisivat käsin kirjoitettuna sotkettavissa numeroihin 6, 1, tai 0). Esimerkki hyväksyttävästä jonosta voisi olla 230506A123B. Toisaalta jono 230506-123B hylättäisiin, koska 6. numeron jälkeen ei ole A-kirjainta. Jono 230506A123 hylättäisiin, koska kolmen loppunumeron jälkeen ei ole vaadittua tarkistusmerkkiä. Vastaavasti 230506A123I hylättäisiin, koska kirjain I ei ole sallittujen tarkistusmerkkien joukossa. Tämän syntaktisen tarkistuksen lisäksi on toki ohjelmallisesti tarkistettava, että päiväysosan kuusi numeroa muodostavat semanttisesti järkevän päiväyksen sekä tarkistusmerkki noudattaa sovittua muista merkeistä laskettavaa sääntöä. Tähän emme kuitenkaan puutu enempää tässä tehtävässä. Tämä tarkistaminen olisi kuitenkin helppoa, koska em. syntaktisen tarkistuksen jälkeen voimme luottaa siihen että kaikki numerot ovat oikeassa paikassa. Joskus voidaan hyväksyä myös tyhjä jono. Esimerkiksi lauseke a*b* hyväksyy mm. jonot a, b, aa, ab, aaaaaabbbb. Toisaalta a voi olla nolla kertaa ja b voi olla nolla kertaa, joten lauseke hyväksyy myös tyhjän jonon eli jonon, jossa ei ole yhtään merkkiä (merkkien määrä on nolla). 3

Kysymykset Kysymys 1. (a) Olkoon säännöllinen lauseke muotoa a.(b cd)*e Huomaa, että cd muodostaa tässä kokonaisuuden. Mitkä seuraavista jonoista lauseke hyväksyy ja mitä ei? abe aabe abde aabdbde aacdbe abcdb (b) Mitkä em. jonoista hyväksytään ja mitkä hylätään, jos lauseke on muotoa a.((b c)d)*e Kysymys 2. (a) Kellonajan tarkistava säännöllinen lauseke voisi olla muotoa: [0-2]?[0-9]:[0-5][0-9] Noudata aiemman henkilötunnuksen esimerkin tapaa jakaa lauseke osiin ja kerro vastaavalla tavalla, mitä kussakin osassa tutkitaan. (b) Anna yksi esimerkki kellonajasta, jonka (a)-kohdan lauseke hyväksyy, mutta joka ei ole todellisuudessa kelvollinen kellonaika. (c) Em. lausekkeen virheet voitaisiin korjata käyttämällä lauseketta: (([01]?[0-9]) (2[0-3])):[0-5][0-9] Kerro (a)-kohdan tapaan mitä lausekkeessa tutkitaan. 4

Kysymys 3. Olkoon säännöllinen lauseke muotoa: ((1*0){3})*1* (a) Anna kolme 10-merkin pituista jonoa, jotka lauseke hyväksyy. (b) Anna kolme jonoa, joissa on pelkkiä 0 tai 1 merkkejä (ei molempia) ja jotka lauseke hylkää. (c) Hylkääkö vai hyväksyykö lauseke tyhjän jonon (ei yhtään merkkiä)? Perustele. Vinkki seuraaviin kysymyksiin Seuraavissa tehtävissä pyydetään säännöllistä lauseketta, joka hyväksyy vain sellaiset jonot, joissa kysymyksessä annetut ehdot täyttyvät, eli se hylkää kaikki muut. Merkkijonojen tapauksessa termi osajono tarkoittaa jonon sellaista osaa, jonka merkit löytyvät samassa järjestyksessä peräkkäin itse jonosta. Esimerkiksi ab on jonojen saab, abba ja ab osajono, mutta ab ei ole jonon samba osajono. Selventääksesi tehtävää itsellesi, kirjoita aina ensin muutamia erilaisia esimerkkijonoja, jotka kysymyksen asettelun mukaan pitää hyväksyä, ja muutamia, jotka pitää hylätä. Muista sitten verrata vastauksiasi niihin. Muista silti, että kaikki muutkin säännön täyttävät jonot pitää hyväksyä. Vaikka seuraaviin kysymyksiin voi olla useita erilaisia oikeita vastauksia, riittää yhden ehdot täyttävän säännöllisen lausekkeen antaminen kuhunkin kysymykseen 4 9. Kysymys 4. Kirjoita säännöllinen lauseke, joka hyväksyy vain jonot, on vain merkkejä 0 tai 1, jonosta löytyy osajono 00. 5

Kysymys 5. Kirjoita säännöllinen lauseke, joka hyväksyy vain jonot, on vain merkkejä 0 tai 1, löytyy ensin jostakin kohdasta osajono 00 ja sitten heti tai myöhemmin osajono 11. Jonon ei tarvitse loppua osajonoon 11. Kysymys 6. Kirjoita säännöllinen lauseke, joka hyväksyy vain jonot, on vain merkkejä 0 tai 1, löytyy jostakin kohdasta osajono 00 tai osajono 11 (tai molemmat). Kysymys 7. Kirjoita säännöllinen lauseke, joka hyväksyy vain jonot, on vain merkkejä 0 tai 1 tai jono on tyhjä, ei ole kahta peräkkäistä merkkiä 0 (eli ei osajonoa 00). Kysymys 8. Kirjoita säännöllinen lauseke, joka hyväksyy vain jonot, on vain merkkejä 0 tai 1 tai jono on tyhjä, ei ole osajonoa 00, eikä osajonoa 11. (maksimipistemäärä 3) Kysymys 9. Kirjoita säännöllinen lauseke, joka hyväksyy vain jonot, on vain merkkejä 0 tai 1 tai jono on tyhjä, ei ole molempia osajonoja 00 ja 11 (toinen saa olla). 6