Laskennan mallit

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

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

Formalisoimme nyt edellä kuvatun laskennan.

Säännöllisten kielten sulkeumaominaisuudet

Laskennan mallit

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

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

Laskennan mallit

Laskennan mallit

Laskennan mallit. luennot syksyllä 2018, periodi I Jyrki Kivinen. tietojenkäsittelytieteen aineopintokurssi, pääaineopiskelijoille pakollinen

Laskennan mallit

Laskennan mallit

Kertausta 1. kurssikokeeseen

Laskennan mallit (syksy 2010) Harjoitus 4, ratkaisuja

Yhteydettömän kieliopin jäsennysongelma

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

Automaatit. Muodolliset kielet

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

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

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

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

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

Turingin koneen laajennuksia

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

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

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

Laskennan mallit

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

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

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

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

Lisää pysähtymisaiheisia ongelmia

1. Universaaleja laskennan malleja

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

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

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

Pysähtymisongelman ratkeavuus [Sipser luku 4.2]

Rekursiiviset palautukset [HMU 9.3.1]

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

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

TKT20005 Laskennan mallit (syksy 2018) Kurssikoe, malliratkaisut

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

Algoritmin määritelmä [Sipser luku 3.3]

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

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

Chomskyn hierarkia ja yhteysherkät kieliopit

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

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

Laskennan teoria

Täydentäviä muistiinpanoja laskennan rajoista

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

Tietojenkäsittelyteorian alkeet, osa 2

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

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

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

Pinoautomaatit. Pois kontekstittomuudesta

Rajoittamattomat kieliopit

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

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja

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

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

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

Laskennan teoria

8. Kieliopit ja kielet

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

5.3 Ratkeavia ongelmia

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

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

S BAB ABA A aas bba B bbs c

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

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

3. Laskennan vaativuusteoriaa

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

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

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

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

Tietotekniikan valintakoe

1. Universaaleja laskennan malleja

Säännöllisen kielen tunnistavat Turingin koneet

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

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

on rekursiivisesti numeroituva, mutta ei rekursiivinen.

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

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

Vaihtoehtoinen tapa määritellä funktioita f : N R on

Laskennan mallit (syksy 2008) 2. kurssikoe , ratkaisuja

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 8. maaliskuuta 2012

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

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

2. Laskettavuusteoriaa

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

Output. Input Automaton

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

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

Muita vaativuusluokkia

ICS-C2000 Tietojenkäsittelyteoria

Rajoittamattomat kieliopit (Unrestricted Grammars)

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Transkriptio:

582206 Laskennan mallit luennot syksyllä 2010, periodit I II Jyrki Kivinen tietojenkäsittelytieteen aineopintokurssi, 6 op, pääaineopiskelijoille pakollinen esitietoina Tietorakenteet (ja sen esitiedot) opittuja asioita sovelletaan ja ymmärrystä syvennetään mm. algoritmeihin ja tekoälyyn liittyvillä kursseilla 1

Annettava opetus, kurssin suorittaminen luentoja 2 tuntia viikossa harjoituksia 2 tuntia viikossa; tarkemmin seuraavilla kalvoilla kaksi kurssikoetta (kummankin periodin tenttiviikolla) kurssikirja Sipser: Introduction to the Theory of Computation, luvut 1 4 (ja pieniä osia myöhemmistä luvuista) (ei luentoja eikä harjoituksia tenttiviikoilla eikä väliviikolla) Huom. kurssin arvioitu työmäärä on 160 tuntia (eli syksyn aikana keskimäärin yli 10 tuntia viikossa) maksimipisteet harjoituksista 10 + 2 (tarkemmin seuraavilla sivuilla), tenteistä 24 + 24, yhteensä 60; hyväksymisraja n. 30, arvosanan 5/5 raja n. 50 2

Palautetta syksyn 2006 kurssilta Mielipiteitä oppimateriaalista: Sipserin kirja oli hyvä ja selkeä oppimisen kannalta välttämätön melko selkeä ok todella hyvä selkeä havainnollinen hyvä apu jos ei välttämätön niin hyödyllinen 3

Laskuharjoitukset Paritonnumeroisilla harjoituskerroilla (periodin I viikolta 1 alkaen joka toinen kerta) käsitellään kotitehtäviä: laitoksen perinteinen harjoitusmuoto: opiskelijat ratkaisevat tehtävät etukäteen, laskaritilaisuudessa ratkaisut kirjataan kalvolle ja esitetään ryhmätyönä 4 tehtävää per viikko, yhteensä siis 24 tehtävää (viikolla 1 yksi ylimääräinen tehtävä) kotitehtävien tekeminen on pakollista: ainakin 8 tehtävää vaaditaan tehdyistä kotitehtävistä saatavat pisteet (max. 10): tehtäviä alle 8 8 9 10 11 12 14 15 16 17 18 20 pisteitä hylätty 0 1 2 3 4 5 6 7 8 9 10 Käytännössä kurssin menestyksekäs opiskeleminen edellyttää huomattavasti minimin ylittävää tehtävien ratkaisemista. 4

Parillisnumeroisilla harjoituskerroilla (periodin I viikolta 2 alkaen joka toinen kerta) perustehtäviä ja yhteistehtäviä: Perustehtävät ovat suoria sovelluksia luennoilla esitetyille tekniikoille. Tarkoitus on, että kukin opiskelija ratkaisee ne etukäteen ja ne käsitellään laskaritilaisuudessa melko lyhyesti (ellei ilmene keskustelunaihetta). Yhteistehtävien tarkoituksena on harjoitella laskarinpitäjän avustuksella ongelmanratkaisua. Tehtäviin on syytä tutustua etukäteen ja varmistaa, että muistaa asiaan liittyvät määritelmät jne., mutta varsinainen ratkaisun miettiminen on tarkoitus jättää laskaritilaisuuteen. Parillisnumeroisista harjoituskerroista saa pisteitä osallistumiskertojen mukaan: yksi osallistuminen 1 piste, kaksi tai useampia osallistumisia 2 pistettä. 5

Sisällysluettelo 0. Johdanto: yleiskatsaus, esitietojen kertaus 1. Säännölliset kielet: äärelliset automaatit, säännölliset lausekkeet 2. Yhteydettömät kielet: pinoautomaatit, yhteydettömät kieliopit 3. Ratkeavuus: Turingin koneet, ratkeavat ja ratkeamattomat ongelmat; laskennan vaativuus (lyhyesti) Kurssin peruskysymykset ovat mitkä periaatteelliset seikat rajoittavat automaattista laskentaa (ja siis erityisesti nykyisiä tietokoneita) ja miten tällaiset asiat voidaan esittää täsmällisesti. Näihin ei toki anneta mitään kovin yksiselitteisiä vastauksia. 6

Sisältö lyhyesti selitettynä Äärelliset ja pinoautomaatit ovat matemaattisia abstraktioita yksinkertaisille tai monimutkaisille laskentalaitteille. Automaatteja tarkastelemalla opimme, miten laskentaan liittyviä ilmiöitä mallinnetaan ja analysoidaan. Säännöllisyys, yhteydettömyys ja ratkeavuus ovat laskentaongelmien vaikeusluokituksia. Vaikeusluokitusten avulla voimme täsmälleen rajata, millaisia asioita esim. äärellinen automaatti osaa laskea. Erityisesti ratkeamattomat ongelmat ovat sellaisia, ettei niitä voi ratkaista millään nykytietämyksen mukaisella laskentalaitteella. 7

Kurssin asioilla on myös käytännön sovelluksia: äärelliset automaatit ja säännölliset kielet ovat tärkeitä merkkijonoalgoritmeissa erilaisia automaatteja käytetään hajautettujen järjestelmien mallintamisessa yhteydettömät kielet ovat tärkeitä luonnollisen kielen ja ohjelmointikielten käsittelyssä ratkeamattomiin ongelmiin voi törmätä ainakin tekoälyssä ja formaalissa verifioinnissa (jos ei osaa varoa). Tällä kurssilla sovelluksiin ei ehditä kuin hyvin pintapuolisesti. 8

Tavoitteet: kurssin jälkeen opiskelija tuntee automaattien ja kielioppien tärkeimmät luokat ja niiden yhteydet + osaa muodostaa automaatteja ja kielioppeja annetuille yksinkertaisille kielille + osaa soveltaa kurssilla esitettyjä muunnoksia automaatti- ja kielioppiformalismien välillä ymmärtää Churchin-Turingin teesin ja sen seuraukset tuntee keskeisimmät ratkeamattomuustulokset ja niiden seuraukset + osaa laatia yksinkertaisia ratkeamattomuustodistuksia osaa formalisoida laskentaan liittyviä ongelmia ja esittää formalismeihin perustuvia täsmällisiä argumentteja. Kurssilla on teknisiä (+), käsitteellisiä ( ) ja metodisia ( ) tavoitteita. Listaan kannattanee palata kurssin aikana. 9

0. Johdanto Erästä suosittua määritelmää mukaillen tietojenkäsittelytiede tutkii, 1. millaiset tietojenkäsittelytehtävät on mahdollista automatisoida ja 2. miten tämä automatisointi tulisi suorittaa. Tietojenkäsittelytieteen peruskursseilla keskitytään yleensä konstruktiiviseen puoleen eli kysymykseen 2. Tällä kurssilla tarkastellaan kysymystä 1. Osoittautuu (yllättäen? odotetusti?), että tosiaan on olemassa tehtäviä, joita ei periaatteessakaan voi automatisoida. Tämä tarkoittaa paljon enemmän kuin pelkästään, että automatisointia ei (vielä?) osata tehdä. Tällaisten väittämien perusteleminen edellyttää tietysti, että käsitteet määritellään huolellisesti. 10

Laskettavuuden teoria Edellisellä sivulla mainittu 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. 11

Koska mekaaninen laskenta on keskeistä matematiikan perusteiden tarkastelussa, matemaatikot ja loogikot miettivät asiaa paljon 1930-luvulla. He sovelsivat luonnollisesti lähestymistapaa 1. Jos taas halutaan soveltaa tuloksia käytännön tietojenkäsittelyyn, lähestymistapa 2 tuntuisi lupaavammalta. 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. 12

Laskennan vaativuus Laskettavuuden teoriassa algoritmeja tarkastellaan olettaen, että käytettävissä on mielivaltaisen paljon resursseja (laskenta-aikaa, muistia,...). Laskennan vaativuusteoriassa kysytään, millaisille ongelmille on olemassa tehokas algoritmi. Yleisimmin tämä tarkoittaa, että laskenta-ajan pitäisi skaalautua kohtuullisesti (esim. polynomisesti) syötteen koon suhteen. Jos tehokasta algoritmia ei ole, joudutaan miettimään korvikkeita: satunnaisalgoritmit, approksimointialgoritmit, rajoittuminen helppoihin erikoistapauksiin,... (Tällä kurssilla ei juuri käsitellä laskennan vaativuuskysymyksiä.) 13

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. Yhteydettömät kieliopit ovat hieman äärellisiä automaatteja ilmaisuvoimaisempi mekanismi, jolla on tärkeitä sovelluksia esim. ohjelmointikielten määrittelemisessä ja kääntämisessä ja luonnollisen kielen mallintamisessa. Kurssilla aloitamme äärellisistä automaateista, jotka yksinkertaisuutensa takia ovat hyvä paikka harjoitella tarvittavia ajattelutapoja. Etenemme sitten yhteydettömien kielioppien kautta yleiseen laskettavuuteen. 14

Matemaattisia perustietoja [Sipser luku 0.2] Logiikan, joukko-opin ja verkkojen peruskäsitteet edellytetään tutuiksi kursseilta Johdatus diskreettiin matematiikkaan ja Tietorakenteet. Kurssilla tehdään jonkin verran induktiotodistuksia, mutta ne eivät ole keskeisessä roolissa. Jatkossa ajattelemme yleensä, että algoritmin (tms.) syötteenä on jokin merkkijono. Tätä varten tarvitsemme ensin aakkoston, joka voi olla mikä tahansa äärellinen joukko. Esimerkkejä tyypillisistä aakkostoista: ASCII-merkistö Σ 1 = { 0, 1 } Σ 2 = { a, b, c,..., z } Γ 1 = { A, C, G, T } Γ 2 = { HiiriVasen, HiiriKeski, HiiriOikea, ShiftHiiriVasen, ShiftHiiriKeski, ShiftHiiriOikea } Γ 3 = { tkt, mat, fys, kem, muu } Kuten yleensäkin, tarkoittaa alkioiden lukumäärää; siis yllä Γ 1 = 4. 15

Aakkoston Σ merkkijono on mikä tahansa äärellinen jono joukon Σ alkioita (eli merkkejä eli symboleita). Esim. 00010 on aakkoston Σ 1 merkkijono. Merkkijonon z pituutta merkitään z ; siis 00010 = 5. Symbolilla ε merkitään minkä tahansa aakkoston tyhjää merkkijonoa, jonka pituus on nolla. Mitä tahansa (äärellistä tai ääretöntä) joukkoa annetun aakkoston merkkijonoja sanotaan (formaaliksi) kieleksi. Merkintä Σ tarkoittaa kieltä, jossa on kaikki aakkoston Σ merkkijonot. Esimerkki 0.1: Olkoon R aakkoston { +,, 0,..., 9 } kieli, joka koostuu yksinkertaisista kokonaislukuvakioista (esim. hieman yksinkertaistetussa Java-kielessä). Siis 0 R, +7326 R ja 32 R, mutta 2 + 3 R. Kieli R on esimerkki säännöllisestä kielestä (luku 1). Esimerkki 0.2: Olkoon S aakkoston { +,,, (, ), 0,..., 9 } kieli, joka koostuu laillisista kokonaislukulausekkeista. Esim. 1 + 1 S ja (1 + 2 + 3) 4 5 S, mutta (1 + 2)) S ja 3+ S. Kieli S on esimerkki yhteydettömästä kielestä (luku 2). Esimerkki 0.3: Muodostukoon ASCII-aakkoston kieli T niistä C-kielisistä ohjelmista, jotka tyhjällä syöttötiedostolla joutuvat ikuiseen silmukkaan. Kieli T on esimerkki ratkeamattomasta kielestä (luku 3). 16

Tällä kurssilla ajatellaan yleensä perinteistä laskentaa, jossa annetusta syötteestä lasketaan tuloste. (Esim. interaktiivisuuden tai hajautetun laskennan mallintaminen jää tarkastelun ulkopuolelle.) Syöte voidaan aina ajatella koodatuksi yhdeksi merkkijonoksi, vieläpä binääriaakkostossa { 0, 1 }; samoin tuloste. Laskentaongelman prototyyppi on siis Annettu: syöte x { 0, 1 } Laskettava: oikea tuloste y { 0, 1 }. Tällainen ongelma voidaan palauttaa joukoksi kyllä/ei-kysymyksiä: Annettu: syöte x { 0, 1 } Kysymys A: onko oikeassa tulosteessa ainakin k bittiä? Kysymys B: onko oikean tulosteen k. bitti ykkönen? Kyllä/ei-kysymykset taas voidaan samaistaa formaalin kielten kanssa (niiden syötteiden joukko, joilla vastaus on kyllä ). Jatkossa tarkastelemme yksinkertaisuuden vuoksi vain formaaleihin kieliin liittyviä ongelmia sillä ajatuksella, että oleellisesti samat lainalaisuudet koskevat yleisempiäkin laskentaongelmia. 17

Merkkijonon w = w 1 w 2... w n käänteismerkkijono on w R = w n w n 1... w 1. Merkkijono v on merkkijonon w osajono, jos v esiintyy yhtenäisenä osana merkkijonossa w. Siis acad on merkkijonon abracadabra osajono, mutta rcd ei ole. Merkkijonojen v = v 1... v n ja w = w 1... w m konkatenaatio on vw = v 1... v n w 1... w m. Siis v on merkkijonon w osajono, jos w = xvy joillakin merkkijonoilla x ja y. Kun k N, niin merkkijonon w konkatenaatiota itsensä kanssa k kertaa merkitään w k. Siis w k = k w ja erityisesti w 0 = ε. Leksikografisessa järjestyksessä merkkijonot ovat 1. pituuden mukaan kasvavassa järjestyksessä ja 2. samanpituiset jonot keskenään aakkosjärjestyksessä. Siis binääriaakkoston { 0, 1 } merkkijonojen leksikografinen järjestys on ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100, 101,.... 18

1. Säännölliset kielet Ää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ä tekniikoilla on sovelluksia esim. merkkijonoalgoritmeissa. Tämän luvun jälkeen opiskelija osaa selittää äärelliset automaatit, säännölliset lausekkeet ja niiden suhteen osaa muodostaa yksinkertaisia äärellisiä automaatteja ja säännöllisiä lausekkeita osaa tehdä muunnoksia determinististen ja epädeterminististen äärellisten automaattien ja säännöllisten lausekkeiden välillä osaa osoittaa kielen ei-säännölliseksi esim. pumppauslemmalla. 19

Äärellinen automaatti: johdattelua [Sipser s. 31 34] Havainnollistamme äärellistä automaattia tilanteessa, jossa kahviautomaatista voi ostaa kahvin 50 sentillä. Laite hyväksyy 10 ja 20 sentin kolikoita. Kahvia saa vain maksamalla tasan 50 senttiä. Laitteessa on kuitenkin rahanpalautuspainike, jolla saa takaisin kaikki sinne laittamansa rahat. Muodostamme äärellisen automaatin, jonka syötteenä on jono aakkoston { 10, 20, P } symboleja. Nämä esittävät koneeseen laitettuja 10 ja 20 sentin kolikoita ja palautusnappulan painalluksia. Automaatin täytyy muistaa sen verran, että se tietää, milloin sen saama rahamäärä viimeisen rahanpalautuksen jälkeen on tasan 50 senttiä. Tämän se tekee siirtymällä syötteen määräämällä tavalla tilasta toiseen. (Tiloja on äärellinen määrä, mistä mallin nimi.) 20

Saamme seuraavanlaisen äärellisen automaatin: P P P P P 0 10 20 30 40 50 10 10 10 10 10 20 10 20 20 20 20 20 P Y 10 20 P 21

Automaatilla on tiloja (7 kappaletta), jotka on esitetty ympyröinä ja nimetty 0, 10, 20, 30, 40, 50 ja Y; siirtymiä, jotka on esitetty tilojen välisinä kaarina; aakkosto, jonka symboleilla siirtymät on merkitty; alkutila (tila 0), joka on merkitty tyhjästä tulevalla kaarella; ja hyväksyvä tila (tila 50), joka on rengastettu. Tilojen nimet on tässä valittu kuvaaviksi (ne kertovat, paljonko rahaa koneessa on), mutta automaatin toimintaan nimet eivät vaikuta. Tilassa Y rahaa on liikaa. Tilassa 50 rahaa on tasan oikea määrä. Kaikissa tiloissa palautuspainike nollaa rahat. Kolikon laittaminen koneeseen taas kasvattaa laskuria vastaavalla määrällä. Tilassa Y kone pyörii silmukassa sekä 10 että 20 sentin syötteellä, kunnes tulee P. 22

Äärellinen automaatti: formaali määritelmä [Sipser s. 35 41] Äärellinen automaatti on viisikko (Q, Σ, δ, q 0, F ), missä 1. Q on äärellinen tilajoukko; sen alkioita sanotaan tiloiksi 2. Σ on äärellinen aakkosto 3. δ : Q Σ Q on siirtymäfunktio 4. q 0 Q on alkutila 5. F Q on hyväksyvien tilojen joukko (joita toisinaan hieman harhaanjohtavasti kutsutaan lopputiloiksi). Siirtymäfunktio on tässä kaikkein kiinnostavinta. Jos tiloilla q ja q ja symbolilla a Σ pätee δ(q, a) = q, niin intuitiivisesti tämä tarkoittaa, että jos ollaan tilassa q ja seuraavaksi tulee merkki a, niin siirrytään tilaan q. 23

Esimerkki Tarkastellaan äärellistä automaattia M 1 = (Q, Σ, δ, q 0, F ), missä 1. Q = { q 0, q 1, q 2 }, 2. Σ = { 0, 1 }, 3. δ saadaan taulukosta δ 0 1 q 0 q 1 q 0 q 1 q 1 q 2 q 2 q 1 q 0 (siis esim. δ(q 1, 0) = q 1 ja δ(q 1, 1) = q 2 ), 4. alkutila on q 0 ja 5. F = { q 2 }. 24

Edellisen sivun automaatti M 1 voidaan esittää havainnollisemmin tilakaaviona 1 0 0 1 q 0 q 1 q 2 0 1 Automaatin toiminta syötteellä 1001101 voidaan kuvata siirtymäjonona q 0 1 q0 0 q1 0 q1 1 q2 1 q0 0 q1 1 q2. Syötemerkkien loppuessa automaatti on hyväksyvässä tilassa q 2, ja sanomme, että se hyväksyy merkkijonon 1001101. Toisaalta syötteen 00100 automaatti hylkää: q 0 0 q1 0 q1 1 q2 0 q1 0 q1 ja päädymme ei-hyväksyvään tilaan q 1. 25

Formalisoimme nyt edellä kuvatun laskennan. Jos M = (Q, Σ, δ, q 0, F ) on äärellinen automaatti ja w = w 1... w n on n merkkiä pitkä aakkoston Σ merkkijono, niin automaatti M hyväksyy merkkijonon w, jos on olemassa n + 1 tilan jono (r 0, r 1,..., r n ) Q n+1, jolla r 0 = q 0, r i+1 = δ(r i, w i+1 ) kun 0 i n 1 ja r n F. Siis laskenta alkaa alkutilasta, noudattaa syötemerkkien mukaisia siirtymiä ja päätyy hyväksyvään tilaan. Jos M ei hyväksy, se hylkää merkkijonon w. 26

Hyväksymisen ja hylkäämisen kannalta vain tilajonon ensimmäisellä ja viimeisellä tilalla on väliä. Tämän takia on luonnollista määritellä kuvaus δ : Q Σ Q seuraavasti: δ (q, w) on se tila, johon tilasta q päädytään merkkijonolla w. Erityisesti δ (q, ε) = q kaikilla q. Toinen perustapaus on δ (q, a) = δ(q, a) kaikilla a Σ. Nyt voimme sanoa, että automaatti hyväksyy merkkijonon w, jos δ (q 0, w) F. 27

Funktio δ voidaan määritellä siirtymäfunktion δ avulla rekursiivisesti: { δ q jos w = ε (q, w) = δ(δ (q, v), a) jos w = va missä a Σ. Tämä tarkoittaa samaa kuin rekursiivinen proseduuri DeltaStar(q, w) 1 olkoon w = w 1... w n, missä w i Σ kaikilla i 2 if n = 0 3 then return q w = ε 4 else p DeltaStar(q, w 1... w n 1 ) v = w 1... w n 1 5 return δ(p, w n ) a = w n Rekursio aina päättyy, sillä 1. rivin 4 rekursiivisessa kutsussa parametrina olevan merkkijonon pituus aina pienenee ja 2. merkkijonon pituudella on ehdoton alaraja 0. 28

Reunahuomatus: miksi formalismia On sinänsä arvokasta, että laskenta saadaan esitetyksi täsmällisessä matemaattisessa muodossa. Jatkossa haluamme esittää väitteitä muotoa Kaikki äärelliset automaatit toteuttavat ehdon p ja konstruktioita Mistä tahansa ehdon r toteuttavasta automaatista voidaan muodostaa automaatti, joka toteuttaa ehdon s. Tätä voidaan tiettyyn rajaan saakka tehdä piirtämällä kuvia, mutta uskottavuuden ja ymmärrettävyyden rajat tulevat melko pian vastaan. Matemaattinen formalismi on voimakas työkalu, jota on hyvä opetella käyttämään. 29

Automaatin M tunnistama kieli L(M) on kaikkien niiden merkkijonojen joukko, jotka M hyväksyy. Esim. edellistä automaattia M 1 tarkastelemalla voidaan todeta, että se hyväksyy tasan ne merkkijonot, jotka loppuvat 01; siis L(M 1 ) = { w 1... w n 01 n 0, w i { 0, 1 } kaikilla i. } 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 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.) 30

Äärellinen automaatti on hyvin rajoittunut laskennan malli. Esim. niinkin yksinkertainen kieli kuin { 0 n 1 n n N } (eli merkkijonot joissa on ensin jono nollia ja sitten saman verran ykkösiä) ei ole säännöllinen. (Tähän palataan.) Äärelliseen automaattiin voidaan helposti lisätä muutakin tulostusta kuin pelkkä hyväksyminen tai hylkääminen. Tällaisen modifikaatiot eivät tämän kurssin kannalta toisi mitään oleellista uutta asiaan. Muissa yhteyksissä ne voivat kuitenkin olla hyödyllisiä. 31

Äärellisen automaatin laatiminen [Sipser s. 41 43] Halutaan laatia äärellinen automaatti, joka tunnistaa kielen L 1 = { 0 n 1 m n, m N } { 1 n 0 m n, m N }. Siis joko nollat ovat ennen ykkösiä tai toisin päin; lukumäärällä ei ole väliä. Toisin sanoen vaihdoksia nollan ja ykkösen välillä saa olla korkeintaan 1. Lähtökohta: seuraava algoritmi ratkaisee, kuuluuko syötejono kieleen L 1 : vaihtunut False Get(nykyinen) while syöte ei loppu do edellinen nykyinen Get(nykyinen) if nykyinen edellinen then if not vaihtunut then vaihtunut True ensimmäinen vaihdos else return False toinen vaihdos return True Tässä nykyinen ja edellinen ovat merkkejä ja Get lukee seuraavan syötemerkin. 32

Koska algoritmi tarvitsee vain vakiomäärän muistia, toteutus äärellisenä automaattina on realistinen ajatus. Äärellisen automaatin siirtymämekanismi huolehtii sellaisenaan uuden merkin lukemisesta. Algoritmin muisti pitää sen sijaan toteuttaa tilojen avulla. Tässä meillä on kaksi muuttujaa, kummallakin kaksi arvoa, joten valitsemme neljä tilaa: F 0: vaihtunut = False ja edellinen = 0 F 1: vaihtunut = False ja edellinen = 1 T 0: vaihtunut = True ja edellinen = 0 T 1: vaihtunut = True ja edellinen = 1 Yleisemmin tarvitaan oma tila jokaista mahdollista muuttujien arvokombinaatiota varten. 33

Seuraava hahmotelma toteuttaa while-silmukan em. tilojen avulla: 0 0 F 0 1 T 0 1 0 hylkää F 1 T 1 0 Tätä pitää vielä täydentää, että alustukset ja hyväksyminen 1 1 saadaan hoidetuksi äärellinen automaatti -formalismin mukaisesti. 34

Alustukset hoituvat helposti lisäämällä alkutila. Koska algoritmin oletusarvo on hyväksyminen, tehdään ensin kaikista tiloista hyväksyviä. Lisätään sitten virhetila, johon mennään hylkäämistapauksessa: 0 0 0 F 0 1 T 0 1 0, 1 0 1 F 1 T 1 0 1 1 35

Toisena esimerkkinä olkoon L 2 = { b 1... b n 2 0b n { 0, 1 } n 2 } eli ainakin kahden pituiset bittijonot, joiden toiseksi viimeinen bitti on 0. Nyt pitää muistaa kaksi viimeisintä merkkiä: 0 0 1 0 0 1 00 01 ε 0 1 0 1 10 11 0 1 1 0 1 1 Tilojen nimet esittävät viimeksi luettuja kahta merkkiä. 36

Aiemmin mainittiin, että kieli L 3 = { 0 n 1 n n N } eli merkkijonot, joissa on ensin nollia ja sitten sama määrä ykkösiä, ei ole säännöllinen. Kielen tunnistavan automaatin tulisi muistaa nollien lukumäärä, jotta se voi varmistaa, ett ykkösiä on yhtä monta. Ohjelmassa tähän tarvitaan vain yksi muuttuja, mutta muuttujan arvolla ei ole ylärajaa. Automaatissa tarvittaisiin oma tila jokaista n:n arvoa kohti, siis ääretön määrä tiloja. Tämä on selitys kielen L 3 ei-säännöllisyydelle. Huomaa kuitenkin, että tämä ei ole täsmällinen todistus. 37

Tilasiirtymäjärjestelmien sovelluksia Äärelliset automaatit sellaisenaan ovat hyödyllisiä merkkijonojen käsittelyssä, mistä kohta 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. 38

Sovellusesimerkki: vuorottelevan bitin protokolla Lähettäjä S lähettää datapaketteja d 0, d 1, d 2,... vastaanottajalle R. Paketti voi hukkua matkalla. Seuraava datapaketti lähetetään vasta, kun on edelliseen saatu kuittaus a. Jos kuittausta ei tule kohtuullisen ajan kuluessa, lähetys uusitaan: timeout S d 0 d 1 d 1 d 2 R a a 39

Ongelma: jos kuittaus hukkuu, R voi saada duplikaattiviestin. S timeout d 0 d 1 d 1 d 2 R a a a Ratkaisu: numeroidaan viestit ja kuittaukset S timeout d 0, 0 d 1, 1 d 1, 1 d 2, 2 R a, 0 a, 1 a, 1 40

Parannus: itse asiassa riittää käyttää kahta numeroa (0 ja 1): S timeout d 0, 0 d 1, 1 d 1, 1 d 2, 0 R a, 0 a, 1 a, 1 Lähettäjä ja vastaanottaja voidaan mallintaa tilasiirtymäjärjestelminä: a, 1 a, 1 d, 1 timeout timeout d, 0 d, 1 d, 0 d, 1 d, 0 d, 1 a, 0 d, 0 a, 0 lähettäjä vastaanottaja Huom. Esimerkin yksityiskohdat eivät ole tärkeitä tämän kurssin kannalta; ks. Spesifioinnin ja verifioinnin perusteet. 41

Hahmon etsiminen syötteestä (johdatteleva esimerkki) Unix-komennolla grep hahmo [ tiedosto ] voidaan etsiä hahmon esiintymiä tiedostosta (tai syötevirrasta): $ grep Kisaveikot SM-tulokset.txt $ ps aux grep mmeikala $ ps aux grep \(mmeikala\ tteikala\) Tässä siis haetaan SM-tuloksista rivit, joilla esiintyy seura Kisaveikot prosessilistasta ne rivit, joilla esiintyy käyttäjätunnus mmeikala, ja prosessilistasta ne rivit, joilla esiintyy käyttäjätunnus mmeikala tai tteikala. 42

Eräs idea grep-toiminnon toteuttamiseksi olisi seuraava: 1. Muodostetaan äärellinen automaatti, joka hyväksyy tasan sellaiset merkkijonot, joissa esiintyy hahmo. 2. Selataan syöte rivi kerrallaan käyttämällä tätä automaattia, ja tulostetaan hyväksytyt rivit. Selausvaihe toimii nopeasti eikä edellytä syötteen esiprosessointia, mikä on tässä tärkeää. Kysymys: Kuinka monimutkaisia hahmoja tällä periaatteella voidaan käsitellä? Esim. edellä muodostettiin hahmoista mmeikala ja tteikala uusi hahmo tai-operaattorilla. Kuinka voimakkaat operaattorit voidaan siis sallia? 43

Operaatiot (säännöllisillä) kielillä [Sipser s. 44 47] Kuten muistetaan, kielet ovat merkkijonojoukkoja. Niillä voidaan siis suorittaa normaaleja joukko-opillisia operaatioita, kuten yhdiste, leikkaus ja komplementointi: jos A ja B ovat kieliä, niin kieli A B koostuu niistä merkkijonoista, jotka kuuluvat ainakin toiseen kielistä A ja B, kieli A B koostuu niistä merkkijonoista, jotka kuuluvat sekä kieleen A että B, ja kieli A koostuu niistä merkkijonoista, jotka eivät kuulu kieleen A. (Komplementin A määrittelyssä oletetaan, että puhutaan jonkin tietyn aakkoston Σ merkkijonoista, jolloin A = Σ A. Yleensä aakkosto Σ selviää asiayhteydestä.) 44

Nimenomaan merkkijonojoukoille on kätevää määritellä myös konkatenaatio ja tähti: kieli A B koostuu merkkijonoista w, jotka voidaan esittää muodossa w = xy joillakin x A ja y B ja kieli A koostuu merkkijonoista w 1... w k, missä k 0 ja w i A kaikilla i. Toisin sanoen ja A B = { x y x A ja y B } A = A 0 A 1 A 2 A 3..., missä A 0 = { ε } ja muuten A k on kielen A konkatenaatio itsensä kanssa k kertaa: A k = } A A {{... A}. k kertaa 45

Esimerkki Tarkastellaan aakkoston { a,..., z, 0,..., 9 } kieliä A = { aa, bb } ja B = { 01, 02 }. Nyt A B = { aa, bb, 01, 02 } A B = { aa01, aa02, bb01, bb02 } A = { ε, aa, bb, aaaa, aabb, bbaa, bbbb, aaaaaa, aaaabb, aabbaa, aabbbb, bbaaaa,... }. Seuraavana tavoitteenamme on osoittaa, että säännöllisten kielten luokka on suljettu operaatioiden, ja suhteen. Toisin sanoen jos A ja B ovat säännöllisiä, niin myös A B, A B ja A ovat. Tapaus A B on melko suoraviivainen, ja aloitamme siitä. 46

Aloitetaan konkreettisella esimerkillä. Seuraava automaatti hyväksyy merkkijonot, jotka loppuvat nollaan: 1 0 0 a b 1 Toisaalta seuraava automaatti hyväksyy merkkijonot, jotka loppuvat 01: 1 0 0 1 A B C 0 1 Tilat on nimetty pienillä ja isoilla kirjaimilla jatkoa silmälläpitäen. Voidaanko näistä automaateista muodostaa yhdisteautomaatti, joka hyväksyy merkkijonot, jotka päättyvät 01 tai 0? 47

Tarkastellaan esimerkkinä merkkijonoa 00101, jonka ensimmäinen automaatti hylkää: ja toinen hyväksyy: a 0 b 0 b 1 a 0 b 1 a A 0 B 0 B 1 C 0 B 1 C. Yhdisteautomaatin pitäisi simuloida kumpaakin laskentaa, koska etukäteen ei voi tietää, kumpi hyväksyy, jos kumpikaan. Laskentojen laittaminen peräkkäin ei onnistu, koska äärellinen automaatti lukee kunkin syötemerkin vain kerran, minkä jälkeen se on mennyttä. Siis ensimmäisen simulaation jälkeen ei olisi enää mahdollista simuloida uudestaan samalla syötteellä. Laitetaan kokeeksi laskennat päällekkäin: (a, A) 0 (b, B) 0 (b, B) 1 (a, C) 0 (b, B) 1 (a, C). Mitä tämä voisi tarkoittaa? 48

Saamme päällekkäiselle laskennalle (a, A) 0 (b, B) 0 (b, B) 1 (a, C) 0 (b, B) 1 (a, C) tulkinnan valitsemalla yhdisteautomaatille tilajoukoksi { (a, A), (a, B), (a, C), (b, A), (b, B), (b, C) } eli alkuperäisten tilajoukkojen karteesinen tulo { a, b } { A, B, C }. Siirtymien suhteen esim. (b,b) 1 (a,c) tarkoittaa, että alkuperäisissä automaateissa on siirtymät b 1 a 1 ja B C Huomaa, että kummassakin on sama merkki 1. 49

Graafisesti tämän voi esittää laittamalla yhdisteautomaatin tilat taulukoksi, jossa ensimmäisen automaatin tilat vastaavat rivejä toisen automaatin tilat vastaavat sarakkeita. Vastaavasti ensimmäinen automaatti antaa siirtymien pystykomponentin ja toinen automaatti vaakakomponentin. Alkutilaksi tulee (a, A) eli alkuperäisten automaattien alkutilojen kombinaatio. Koska kyseessä on unioni, hyväksyviä tiloja ovat kaikki, joissa esiintyy b tai C eli ainakin toisen alkuperäisen automaatin hyväksyvä tila. 50

0 1 0 0 a b 1 1 0 0 ba bb bc 1 1 1 0 0 0 1 aa ab ac 1 1 0 0 1 A B C 0 1 51

Esitetään edellinen konstruktio yleisemmässä muodossa. Lause 1.1: [Sipser Thm. 1.25] Jos kielet A ja B ovat säännöllisiä, niin myös A B on. Todistus: Oletetaan siis, että A = L(M 1 ) ja B = L(M 2 ) äärellisillä automaateilla M 1 = (Q 1, Σ, δ 1, q 1, F 1 ) ja M 2 = (Q 2, Σ, δ 2, q 2, F 2 ). Muodostamme äärellisen automaatin jolla L(M ) = A B. M = (Q, Σ, δ, q, F ), Koska A B on kieli samassa aakkostossa Σ kuin A ja B, niin aakkosto Σ pysyy samana. Edellä esitetyn mukaan yhdisteautomaatin tilat ovat pareja (q, q ), missä q ja q ovat automaattien M 1 ja M 2 tiloja; siis Q = Q 1 Q 2. 52

Edelleen alkutilaksi tulee alkuperäisten alkutilojen kombinaatio q = (q 1, q 2 ). Tila on hyväksyvä, jos se vastaa ainakin toisen alkuperäisen automaatin hyväksyvää tilaa, eli F = { (r, s) Q 1 Q 2 r F 1 tai s F 2 } = (F 1 Q 2 ) (Q 1 F 2 ). Siirtymäfunktio määritellään siten, että automaatti M 1 kertoo siirtymät ensimmäisen ja M 2 toisen komponentin suhteen: δ ((r, s), a) = (δ 1 (r, a), δ 2 (s, a)), kun r Q 1, s Q 2 ja a Σ. Konstruktion perusteella on selvää, että L(M ) = L(M 1 ) L(M 2 ) kuten haluttiin. 53

Reunahuomautus (jos tuntuu sekavalta, niin sivuuta) Jos ei halua hyväksyä edellisen konstruktion olevan selvästi toimiva, asian voi perustella yksityiskohtaisemminkin. Todistetaan ensin induktiolla merkkijonon w pituuden suhteen, että δ ((r, s), w) = (δ 1 (r, w), δ 2 (s, w)), missä δ on siirtymäfunktion δ yleistys kuten kalvoilla 27 28. Tapaus w = 0: Siis w = ε, ja suoraan määritelmistä δ ((r, s), ε) = (r, s) = (δ 1 (r, ε), δ 2 (s, ε)). 54

Tapaus w = n + 1: Oletetaan, että väite δ ((r, s), w) = (δ 1 (r, w), δ 2 (s, w)) pätee, kun w = n. Kun w = n + 1, voidaan kirjoittaa w = va, missä v = n ja a Σ. Tällöin kuten haluttiin. δ ((r, s), w) = δ ((r, s), va) = δ (δ ((r, s), v), a) ind.ol. = δ ((δ1 (r, v), δ 2 (s, v)), a) = (δ 1 (δ1 (r, v), a), δ 2(δ2 (s, v), a)) = (δ1 (r, va), δ 2 (s, va)) = (δ1 (r, w), δ 2 (s, w)) 55

Nyt eli w L(M ) δ (q, w) F δ ((q 1, q 2 ), w) = (r, s) missä r F 1 tai s F 2 δ 1 (q 1, w) F 1 tai δ 2 (q 2, w) F 2 w L(M 1 ) tai w L(M 2 ) L(M ) = L(M 1 ) L(M 2 ). Tämäntyyppisiä induktiotodistuksia tarvitaan monimutkaisempien konstruktioiden oikeellisuudelle. Niillä voidaan tarkistaa, ettei konstruktioon jäänyt virheitä. Usein (kuten tässäkin) induktio ei kuitenkaan tuo mitään lisävalaistusta konstruktion ideaan, vaan helposti peittää sen alleen. Ensin pitää ymmärtää konstruktion idea, minkä jälkeen induktiotodistuksen laatiminen on (toisinaan vaativa) tekniikkaharjoitus. Siksi emme jatkossa vie oikeellisuustodistuksia näin formaaleiksi, ellei konstruktion toimivuus ole oikeasti epäilmeinen. (Reunahuomautus loppuu.) 56

Varoitus: älä tee näin Tentissä pyydettiin todistamaan, että kahden säännöllisen kielen A ja B leikkaus A B on säännöllinen. Tyypillinen virheellinen todistusyritys oli seuraavanlainen: Oletuksen mukaan joukkojen A ja B merkkijonot ovat säännöllisiä. Siis myös kaikki joukon A B merkkijonot ovat säännöllisiä (ks. kuva) Siis A B on säännöllinen. Σ A A B B Tässä ei ole mitään järkeä, koska ei ole olemassa sellaista kuin säännöllinen merkkijono. Säännöllisyys on kielen eli merkkijonojoukon ominaisuus. (Varoitus loppuu.) Oikea tapa ratkaista tehtävä on soveltaa edellisen lauseen konstruktiota (tai kohta esitettäviä vaihtoehtoisia tekniikoita). 57

Kielen L säännöllisyys on eräänlainen mittari sille, kuinka vaikeaa on erottaa tapaukset x L ja x L. Jos tämän voi tehdä ohjelmalla, joka lukee syötteen vain kerran vasemmalta oikealle tarvitsee vain vakiomäärän muistia niin kieli on säännöllinen. Huom. laskuri, joka voi saada mielivaltaisen suuria arvoja, ei ole vakiokokoinen. Jos säännöllisyyttä haluaa visualisoida, sen voi (kenties) ajatella tarkoittavan kielen reunaviivan yksinkertaisuutta. Σ Σ A B A on säännöllinen B ei ole säännöllinen Tällaisia kuvia ei kuitenkaan pidä ottaa kovin vakavasti. 58

Jatkossa osoitetaan myös Lause 1.2: [Sipser Thm. 1.26] Säännöllisten kielten joukko on suljettu konkatenaation suhteen; ts. jos kielet A ja B ovat säännöllisiä, niin myös A B on. Todistaminen on kuitenkin edellistä lausetta hankalampaa. Oletaan A = L(M 1 ) ja B = L(M 2 ), ja halutaan muodostaa M, jolla L(M) = A B. Luonnollinen ajatus olisi pistää automaatit M 1 ja M 2 peräkkäin. Tässä tulee ongelmaksi, milloin pitäisi siirtyä automaatista M 1 automaattiin M 2. Erityisesti jollain w A B voi olla kaksi esitystä w = uv = u v, missä u A ja u A, ja v B mutta v B. Jos tässä vielä u on merkkijonon u alkuosa (eli u = u x jollain x), niin emme voi ilman muuta siirtyä automaattiin M 2 heti, kun M 1 pääsee hyväksyvään tilaan. Jotta pääsemme eteenpäin, yleistämme äärellistä automaattia sallimalla epädeterminismin. 59

Epädeterministiset äärelliset automaatit [Sipser s. 47 54] Tarkastellaan esimerkkinä seuraavaa automaattia: a, b a b a, ε 0 1 2 3 b. Tämä ei noudata edellä esitettyä formalismia: tilasta 0 pääsee merkillä b sekä tilaan 0 että tilaan 1, tilasta 1 on ε-siirtymä, jolla pääsee tilaan 2 käyttämättä yhtään syötemerkkiä ja joitain siirtymiä ei ole määritelty. Aiottu tulkinta on, että annetulla syötteellä kokeillaan kaikkia mahdollisia siirtymävaihtoehtoja. Automaatti hyväksyy, jos yksikin näistä vaihtoehdoista päätyy hyväksyvään tilaan. 60

Tällaisen automaatin laskentaa voidaan havainnollistaa ryhmittämällä vaihtoehdot puuksi: 0 a esimerkkinä syöte abbab vaakanuolet kuvaavat ε-siirtymiä viimeisellä rivillä esiintyy (kahteenkin kertaan) hyväksyvä tila 3, joten automaatti hyväksyy merkkijonon abbab b b a 0 0 0 1 0 1 2 2 3 2 2 b 0 1 2 3 3 61

Kutsumme tällaista yleisempää automaattia epädeterministiseksi äärelliseksi automaatiksi (nondeterministic finite automaton, NFA). Aluksi esitetty perusversio on vastaavasti deterministinen äärellinen automaatti (deterministic finite automaton, DFA). NFA:lle ei ole mitään samalla lailla ilmeistä fyysistä toteutusmallia kuin DFA:lle. Se kannattaa mieltää lähinnä kuvausformalismiksi. Näemme jatkossa, että mille tahansa NFA:lle voidaan muodostaa DFA, joka tunnistaa saman kielen. Siis epädeterminismi ei anna tässä mielessä lisää ilmaisuvoimaa. Epädeterminismiä käyttämällä esitystä voidaan kuitenkin usein selkeyttää ja yksinkertaistaa. 62

Seuraava NFA hyväksyy merkkijonot, joissa on osajonona ensin abb ja sen jälkeen ca tai ac. Huomaa konstruktion modulaarisuus. (Juuri tämän kielen voisi tunnistaa DFA:lla helpomminkin.) a, b, c a, b, c ε a b b ε ε c a ε a, b, c ε a c ε 63

Mille tahansa aakkostolle Σ merkitsemme Σ ε = Σ { ε }. Muistetaan, että joukon A potenssijoukkoa eli kaikkien osajoukkojen joukkoa merkitään P(A). Muodollisesti NFA on viisikko (Q, Σ, δ, q 0, F ), missä 1. Q on äärellinen tilajoukko, 2. Σ on äärellinen aakkosto, 3. δ : Q Σ ε P(Q) on siirtymäfunktio, 4. q 0 Q on alkutila ja 5. F Q on hyväksyvien tilojen joukko. Erotukseksi DFA:sta siirtymäfunktio siis antaa yhden seuraajatilan sijaan joukon tiloja. Nämä tulkitaan mahdollisiksi seuraajatiloiksi. 64

Esimerkkiautomaattimme a, b a b a, ε 0 1 2 3 b. formaali esitys on siis ({ 0, 1, 2, 3 }, { a, b }, δ, 0, { 3 }), missä δ saadaan taulukosta δ a b ε 0 { 0 } { 0, 1 } 1 { 2 } { 2 } 2 { 3 } 3 { 2 } 65

Määrittelemme nyt, että epädeterministinen äärellinen automaatti (Q, Σ, δ, q 0, F ) hyväksyy merkkijonon w, jos jollain n voidaan valita jonot (y 1,..., y n ) Σ n ε ja (r 0,..., r n ) Q n+1, joilla w = y 1... y n, r 0 = q 0, r i+1 δ(r i, y i+1 ) kun i = 0,..., n 1 ja r n F. Edellisen sivun automaatilla ja merkkijonolla abbab voidaan valita esim. n = 6 (y 1, y 2, y 3, y 4, y 5, y 6 ) = (a, b, ε, b, a, b) (r 0, r 1, r 2, r 3, r 4, r 5, r 6 ) = (0, 0, 1, 2, 3, 2, 3), mistä nähdään, että automaatti hyväksyy merkkijonon. 66

Determinismi vs. epädeterminismi Deterministisessä automaatissa siirtymä δ(q, a) = r tarkoittaa, että tilasta q syötteellä a mennään aina tilaan r. Epädeterministisessä automaatissa siirtymä r δ(q, a) tarkoittaa, että tilasta q syötteellä a eräs mahdollisuus on mennä tilaan r. Epädeterministinen automaatti hyväksyy, jos on mahdollista päätyä hyväksyvään tilaan. Huomaa epäsymmetria: jos jollain syötteellä sekä hyväksyvään että ei-hyväksyvään tilaan voi päätyä, niin syöte hyväksytään. Epädeterminismi voidaan mieltää korkean tason kontrollirakenteeksi. Jos DFA-formalismia ajatellaan primitiivisenä ohjelmointikielenä, niin NFA-formalismi on sama kieli laajennettuna operaatiolla kokeile kaikki vaihtoehdot. Seuraavaksi tarkastelemme, miten tämä kontrollirakenne voidaan toteuttaa. 67

Lähtökohtana on NFA:n simuloiminen. Simulaation ideana on laskentapuun (ks. sivu 61) läpikäynti leveyssuuntaisesti (taso kerrallaan). Algoritmi pitää muuttujassa CurrentStates listaa niistä tiloista, joissa se tällä hetkellä voisi olla (laskentapuun taso). Kullakin aika-askelella CurrentStates päivitetään: 1. haetaan saatua syötemerkkiä vastaavat seuraajatilat ja 2. lisätään mahdolliset ε-siirtymät. Kun R Q on joukko tiloja, olkoon E(R) niiden tilojen joukko, joihin päästään jostain joukon R tilasta suorittamalla 0 tai useampia ε-siirtymiä: q E(R) on olemassa k N ja tilat r 0, r 1,..., r k Q joilla r 0 R, r k = q ja r i δ(r i 1, ε) kun i = 1,..., k. Siis erityisesti aina R E(R). 68

Saadaan seuraava algoritmi: SimulateNFA(Q, Σ, δ, q 0, F ) CurrentStates E({ q 0 }) while syötettä riittää do lue seuraava syötemerkki a NextStates for q CurrentStates do NextStates NextStates δ(q, a) CurrentStates E(NextStates) if CurrentStates F then return accept else return reject 69

Algoritmi SimulateNFA osoittaa, miten epädeterminismi voidaan implementoida tulkkaamalla. Algoritmi antaa myös idean, miten epädeterminismi voidaan implementoida kääntämällä : annetusta NFA:sta voidaan muodostaa DFA, joka tunnistaa saman kielen. (DFA:ta ei enää tarvitse kääntää mihinkään, sen toteutus laitteistotasolla on ilmeinen.) Havainto: muuttujan CurrentStates arvot kuuluvat potenssijoukkoon P(Q) muuttujalla CurrentStates on korkeintaan 2 Q mahdollista arvoa algoritmin vaatima muistitila on vakio (syötteen suhteen) DFA-toteutus mahdollinen. 70

Esitämme muunnoksen täsmällisemmin: Lause 1.3: [Sipser Thm. 1.39] Mille tahansa NFA:lle on olemassa DFA, joka tunnistaa saman kielen. Todistus: On siis annettu epädet. automaatti N = (Q, Σ, δ, q 0, F ), ja halutaan muodostaa det. automaatti M = (Q, Σ, δ, q 0, F ), jolla L(M) = L(N). Edellä esitetyn mukaisesti idea on, että yksi DFA:n tila esittää joukkoa NFA:n tiloja. Siis valitsemme Q = P(Q). Automaatin M tila annetulla hetkellä tulkitaan automaatin N mahdollisten tilojen joukoksi. Huomaa, että Q = 2 Q. Jos r Q on mahdollinen tila nykyhetkellä, seuraavaksi luetaan merkki a, ja s δ(r, a), niin s on eräs mahdollinen tila seuraavalla hetkellä. Siis jos δ (R, a) = S (missä siis R, S Q), niin joukossa S pitää olla kaikki ne tilat, jotka voivat seurata jotain joukon R tilaa merkillä a. 71

Esitetään sama formaalisti olettaen ensin, että automaatissa N ei ole ε-siirtymiä (eli δ(r, ε) = kaikilla r Q). Siis M = (Q, Σ, δ, q 0, F ), missä 1. Q = P(Q), 2. jos R Q ja a Σ, niin δ (R, a) = r R δ(r, a) = { s Q s δ(r, a) jollain r R, } 3. q 0 = { q 0 } ja 4. F = { R Q R F }. 72

Sallitaan nyt automaatissa N myös ε-siirtymät. Kuten edellä, joukko E(R) koostuu niistä tiloista, joihin pääsee jostain tilasta r R tekemällä nolla tai useampia ε-siirtymiä. Siirtymäfunktion määritelmä muutetaan muotoon δ (R, a) = r R E(δ(r, a)). Alkutilaksi asetetaan q 0 = E({ q 0 }). Konstruktion perusteella on selvää, että L(M) = L(N). Käänteinen suunta eli DFA:n muuntaminen NFA:ksi on triviaali. Siis DFA:t ja NFA:t ovat yhtä ilmaisuvoimaisia: Korollaari 1.4: [Sipser Cor. 1.40] Kieli on säännöllinen, jos ja vain jos se voidaan tunnistaa epädeterministisellä äärellisellä automaatilla. 73

Esimerkki 1.5: Muodostetaan DFA, joka vastaa seuraavaa NFA:ta: 0 0 a ε c 0 1 1, ε b d Koska DFA:n alkutila on a, NFA:n alkutilaksi tulee E({ q 0 }) = { a, c, d }. DFA:n tiloja ovat periaatteessa kaikki joukon { a, b, c, d } osajoukot, joita on 2 4 = 16 kappaletta. Meidän ei kuitenkaan kannata välittää tiloista, joihin ei koskaan päästä alkutilasta. Ruvetaan siis purkamaan siirtymäfunktiota alkutilasta alkaen (seur. sivu). 74

δ ({ a, c, d }, 0) = E(δ(a, 0) δ(c, 0) δ(d, 0)) = E({ a, b } { c } ) = { a, b, c, d } δ ({ a, c, d }, 1) = E(δ(a, 1) δ(c, 1) δ(d, 1)) = E( { d } ) = { d } δ ({ a, b, c, d }, 0) = E(δ(a, 0) δ(b, 0) δ(c, 0) δ(d, 0)) = E({ a, b } { c } ) = { a, b, c, d } δ ({ a, b, c, d }, 1) = E(δ(a, 1) δ(b, 1) δ(c, 1) δ(d, 1)) = E( { c } { d } ) = { c, d } δ ({ c, d }, 0) = E(δ(c, 0) δ(d, 0)) = E({ c } ) = { c, d } δ ({ c, d }, 1) = E(δ(c, 1) δ(d, 1)) = E({ d } ) = { d } δ ({ d }, 0) = E(δ(d, 0)) = E( ) = δ ({ d }, 1) = E(δ(d, 1)) = E( ) = Voidaan lopettaa, koska uusia tiloja ei enää löydy. (Määritelmistä seuraa, että aina δ (, a) =.) 75

DFA:n hyväksyviä tiloja ovat kaikki, jotka sisältävät NFA:n hyväksyvän tilan d, eli tässä tapauksessa kaikki muut kuin. 0 0 0 1 { a, c, d } { a, b, c, d } { c, d } 1 1 0, 1 { d } 0, 1 76

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 prosessorien suoritusjärjestys ei ole 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 epädeterminismin tehokas simuloiminen deterministisellä (=oikealla) tietokoneella on avoin ongelma. Vrt. edellä: NFA:n muuntaminen DFA:ksi saattaa aiheuttaa tilojen lukumäärän eksponentiaalisen kasvun. 77

Säännöllisten kielten sulkeumaominaisuudet [Sipser s. 58 63] 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ä, niin myös A B, A B ja A ovat. Kieli on määritelmän mukaan säännöllinen, jos se voidaan tunnistaa deterministisellä äärellisellä automaatilla. Todistimme juuri (korollaari 1.4), että voimme yhtä hyvin käyttää epädeterministisiä automaatteja. Katsotaan ensin, miten tämä yksinkertaistaa jo esitetyn tapauksen A B (lause 1.1) todistusta. Lause 1.6: [Sipser Thm. 1.45] Jos A ja B ovat säännöllisiä, niin A B on. Todistus: Oletetaan siis annetuksi NFA:t N 1 ja N 2, joilla A = L(N 1 ) ja B = L(N 2 ). Muodostetaan NFA N, jolla L(N) = A B. 78

Konstruktion periaate on seuraava: ε N 1 ε N 2 N 79

Muodollisemmin olkoon N 1 = (Q 1, Σ, δ 1, q 1, F 1 ) ja N 2 = (Q 2, Σ, δ 2, q 2, F 2 ). Voidaan tietysti olettaa, että Q 1 Q 2 =. Nyt N = (Q, Σ, δ, q 0, F ), missä 1. q 0 Q 1 Q 2 on uusi tila 2. Q = { q 0 } Q 1 Q 2 3. δ toteuttaa δ(q, a) = δ 1 (q, a) kun q Q 1 ja a Σ ε δ(q, a) = δ 2 (q, a) kun q Q 2 ja a Σ ε δ(q 0, ε) = { q 1, q 2 } δ(q 0, b) = kun b ε 4. F = F 1 F 2. Selvästi N tunnistaa kielen A B. 80

Sovelletaan samaa ideaa konkatenaatioon. Lause 1.7: [Sipser Thm. 1.47] Jos A ja B ovat säännöllisiä, myös A B on. Todistus: Periaatepiirros on nyt seuraava: N 1 N 2 ε ε N 81

Muodollisesti olkoon taas A = L(N 1 ) ja B = L(N 2 ), missä N 1 = (Q 1, Σ, δ 1, q 1, F 1 ), N 2 = (Q 2, Σ, δ 2, q 2, F 2 ) ja Q 1 Q 2 =. Muodostetaan N = (Q, Σ, δ, q 0, F ), missä 1. Q = Q 1 Q 2, 2. q 0 = q 1, 3. F = F 2 ja 4. kun q Q ja a Σ ε, niin δ(q, a) on seuraava: Selvästi L(N) = A B. δ(q, a) = δ 1 (q, a) kun q Q 1 F 1 δ(q, a) = δ 1 (q, a) kun q F 1 ja a ε δ(q, ε) = δ 1 (q, ε) { q 2 } kun q F 1 δ(q, a) = δ 2 (q, a) kun q Q 2. 82

Vielä viimeiseksi tähtioperaatio: Lause 1.8: [Sipser Thm 1.49] Jos A on säännöllinen, niin A on. Todistus: Oletetaan taas A = L(N 1 ), ja muodostetaan N jolla L(N) = A. Periaate: ε ε N 1 N ε (Huomaa, että alkutilan vaihtaminen hyväksyväksi ei välttämättä toimisi.) 83

Olkoon siis N 1 = (Q 1, Σ, δ 1, q 1, F 1 ). Nyt N = (Q, Σ, δ, q 0, F ), missä 1. q 0 Q 1 on uusi tila, 2. Q = Q 1 { q 0 }, 3. F = F 1 { q 0 } ja 4. δ määritellään δ(q 0, ε) = { q 1 } δ(q 0, a) = kun a ε δ(q, a) = δ 1 (q, a) kun q Q 1 F 1 δ(q, a) = δ 1 (q, a) kun q F 1 ja a ε δ(q, ε) = δ 1 (q, ε) { q 1 } kun q F 1. Selvästi L(N) = A. 84

Säännölliset lausekkeet [Sipser luku 1.3] Kiinnitetään jokin aakkosto Σ. Säännöllinen lauseke on kaava, jonka arvona on jokin aakkoston Σ kieli. Kun R on säännöllinen lauseke, sen arvoa eli sen esittämää kieltä merkitään L(R). Perusajatuksena on muodostaa uusia kieliä edellä esitettyjen operaatioiden, ja avulla. Esimerkki Säännöllisen lausekkeen a(b c) esittämään kieleen kuuluvat ne merkkijonot, joiden alussa on a ja sen jälkeen nolla tai useampia b- ja c-merkkejä. Siis L(a(b c) ) = { a } ({ b, c }) = { a, ab, ac, abb, abc, acb, acc, abbb,... }. Osoitamme jatkossa, että tälla tavoin voidaan esittää (tai kuvata) tasan ne kielet, jotka voidaan tunnistaa äärellisellä automaatilla, eli säännölliset kielet (mistä nimi). 85

Määrittelemme säännölliset lausekkeet seuraavasti: 1. ja ε ovat säännöllisiä lausekkeita, ja L( ) = ja L(ε) = { ε }. 2. a on säännöllinen lauseke kaikilla a Σ, ja L(a) = { a }. 3. Jos R 1 ja R 2 ovat säännöllisiä lausekkeita, niin myös (R 1 R 2 ) ja (R 1 R 2 ) ovat, ja L((R 1 R 2 )) = L(R 1 ) L(R 2 ) ja L((R 1 R 2 )) = L(R 1 ) L(R 2 ). 4. Jos R on säännöllinen lauseke, niin myös (R ) on, ja L((R )) = (L(R)) ; ja 5. ei ole muita säännöllisiä lausekkeita, kuin mitä edelläolevasta seuraa. Siis säännöllinen lauseke muodostetaan lähtemällä liikkeelle peruslausekkeista, ε ja a, a Σ, ja soveltamalla yhdistettä, konkatenaatiota ja tähteä äärellinen määrä kertoja. 86

Yksinkertaistamme säännöllisten lausekkeiden kirjoitusasua seuraavilla konventioilla: Konkatenaatio jätetään merkitsemättä; esim. a b a kirjoitetaan aba. Operaatiot evaluoidaan presedenssijärjestyksessä tähti, konkatenaatio, yhdiste ja turhat sulut jätetään pois. Siis a bc tarkoittaa (a (b (c ))). Jos Σ = { a 1,..., a k }, niin lauseketta a 1... a k merkitään lyhyesti Σ. Lausekkeen R konkatenaatiota itsensä kanssa k kertaa merkitään R k. R... R }{{} k kertaa Lauseke RR lyhennetään R + ; siis R = ε R +. 87

Jos sekaannuksen vaaraa ei ole, samastamme säännöllisen lausekkeen ja sen esittämän kielen (eli kirjoitamme R vaikka tarkoitammekin L(R)). Esimerkkejä: Σ koostuu kaikista aakkoston Σ merkkijonoista ja Σ + kaikista aakkoston Σ ei-tyhjistä merkkijonoista. 1Σ esittää kaikkia ykkösellä alkavia merkkijonoja. (0(0 1) 1) (1(0 1) 0) esittää kaikkia aakkoston { 0, 1 } merkkijonoja, joiden viimeinen merkki on eri kuin ensimmäinen. R = kaikilla R, ja = ε. Operaatioilla ja on neutraalialkiot ja ε: kaikilla R pätee R = R = R R ε = ε R = R. 88

Säännöllisiä lausekkeita käytetään erilaisissa tekstinkäsittelytyökaluissa kuten Unixin grep. Säännölliset lausekkeet ovat myös tärkeä formalismi ohjelmointikielten syntaktisten perusalkioiden esittämisessä. Esim. jossain ohjelmointikielessä sallitut tunnukset voisivat olla muotoa kokonaislukuvakiot muotoa ja liukulukuvakiot muotoa kirjain(kirjain numero alaviiva), (ε + )numero + (ε + )(numero.numero + numero +.numero ), missä kirjain tarkoittaa a... z ja numero tarkoittaa 0... 9. Tätä voidaan käyttää hyväksi kääntämisen ensimmäisessä vaiheessa muodostamalla sitä varten äärellinen automaatti (kuten seuraavaksi nähdään). 89

Äärellisten automaattien ja säännöllisten lausekkeiden ekvivalenssi [Sipser s. 66 76] Osoitamme seuraavan keskeisen tuloksen: Lause 1.9: [Sipser Thm. 1.54] Kieli on säännöllinen, jos ja vain jos jokin säännöllinen lauseke esittää sitä. Siis säännöllisillä lausekkeilla voidaan esittää tasan ne kielet, jotka voidaan tunnistaa äärellisillä automaateilla. Todistuksen helpompi suunta on seuraava: Lemma 1.10: [Sipser Lemma 1.55] Säännöllisen lausekkeen kuvaama kieli voidaan tunnistaa äärellisellä automaatilla. Seuraavalla sivulla on esimerkkinä muodostettu säännöllistä lauseketta (abc b ) vastaava NFA. Tämä perustuu edellä esitettyihin muunnoksiin, jotka esimerkin jälkeen kokoamme Lemman 1.10 todistukseksi. 90

a a b b c c abc a ε b ε c b ε b ε ε a ε b ε c abc b ε ε b ε ε ε a ε b ε c (abc b ) ε ε ε ε b ε ε 91

Todistus: Ennen yksityiskohtiin menemistä tarkastellaan yleisesti tällaisen todistuksen luonnetta. Säännöllisen lausekeen määritelmä on induktiivinen (eli rekursiivinen). Vertaa induktiiviseen luonnollisen luvun määritelmään: 1. 0 on luonnollinen luku ja 2. jos n on luonnollinen luku, niin n + 1 on luonnollinen luku. Luonnollisten lukujen induktioperiaatteesta seuraa, että jos 1. luvulla 0 on ominaisuus P ja 2. jos luvulla n on ominaisuus P niin luvulla n + 1 on ominaisuus P niin kaikilla luonnollisilla luvuilla on ominaisuus P. Todistamme lemman suorittamalla analogisen induktion säännöllisten lausekkeiden yli. 92

Haluamme siis osoittaa, että kaikilla säännöllisillä lausekkeilla R kieli L(R) on säännöllinen. Teemme tämän osoittamalla, että 1. L( ) ja L(ε) ovat säännöllisiä, 2. L(a) on säännöllinen kaikilla a Σ, 3. jos L(R 1 ) ja L(R 2 ) ovat säännöllisiä, niin L(R 1 R 2 ) ja L(R 1 R 2 ) ovat säännöllisiä ja 4. jos L(R) on säännöllinen, niin L(R ) on säännöllinen. Kohdat (1) ja (2) ovat ilmeisiä: on helppoa muodostaa äärellinen automaatti tunnistamaan kieli, kieli { ε } ja kieli { a }, missä a Σ. Koska L(R 1 R 2 ) = L(R 1 ) L(R 2 ) ja L(R 1 R 2 ) = L(R 1 ) L(R 2 ), niin kohta (3) seuraa lauseista 1.6 ja 1.7. Samoin kohta (4) seuraa lauseesta 1.8. 93

Säännöllisten kielten luokka on suljettu myös leikkauksen ja komplementin suhteen, joten edellä nähty todistus toimisi edelleen, jos säännöllisten lausekkeiden määritelmää laajennettaisiin leikkaus- ja komplementtioperaatioilla. Näin ei kuitenkaan tehdä paristakin syystä: Säännöllinen lauseke muunnetaan usein NFA:ksi edellä nähdyn kaltaisella konstruktiolla, joka on yksinkertainen ja jolla on useita hyödyllisiä ominaisuuksia. Esim. jokaista säännöllisen lausekkeen itsenäistä osaa kohti on automaatissa erotettavissa vastaava osa-automaatti. Leikkaukselle ja komplementille ei vastaavanlaista konstruktiota ole. (Tätä käsitellään vähän tarkemmin harjoituksissa.) Leikkaus ja komplementti ovat myös turhia operaatioita siinä mielessä, että niiden salliminen ei laajentaisi esitettävissä olevien kielten joukkoa. Jo nykyisillä operaatioilla voidaan esittää kaikki säännölliset kielet, kuten seuraavaksi osoitetaan. 94

Osoitetaan nyt kääntën, että mille tahansa äärelliselle automaatille M voidaan muodostaa säännöllinen lauseke R, jolle L(R) = L(M). Jos M on automaatti b a c q 1 q 2 q 3 d niin selvästi voidaan valita R = (ab c) d. Jotta voisimme hyödyntää tätä havaintoa osana monimutkaisemman automaatin analysoimista, otamme käyttöön yleistetyt NFA:t (generalized NFA, GNFA), joissa kaareen voi liittyä yksittäisen symbolin tai symbolijoukon sijasta kokonainen säännöllinen lauseke. 95