Laskennan mallit
|
|
|
- Eveliina Juusonen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 Laskennan mallit luennot syksyllä 2008, 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
2 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 (tarkemmin seuraavilla sivuilla), tenteistä , yhteensä 60; hyväksymisraja n. 30, arvosanan 5/5 raja n. 50 2
3 Opetuksen kehittäminen Laskennan mallit on havaittu pullonkaulakurssiksi, jonka suorittaminen aikataulun mukaisesti tuottaa opiskelijoille hankaluuksia. Ongelmien paikallistamiseksi ja opetuksen kehittämiseksi kurssilla tehtiin viime vuonna tutkimusta, johon liittyi mm. opiskelijoiden ajankäytön seuranta. Tutkimusta jatketaan tänä vuonna. Työajan seurannasta ja muusta mahdollisista opiskelijoilta toivottavasta avusta ilmoitetaan kurssin verkkosivulla. Osallistuminen palkitaan laskuharjoituspisteillä. 3
4 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 Kurssin kotisivulle on muutakin kommentoitua kurssipalautetta. 4
5 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ää kotitehtävien tekeminen on pakollista: ainakin 8 tehtävää vaaditaan tehdyistä kotitehtävistä saatavat pisteet (max. 10): tehtäviä alle pisteitä hylätty Käytännössä kurssin menestyksekäs opiskeleminen edellyttää huomattavasti minimin ylittävää tehtävien ratkaisemista. 5
6 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 liityvä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ä. 6
7 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. 7
8 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. 8
9 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. 9
10 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. 10
11 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. 11
12 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. 12
13 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. 13
14 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ä.) 14
15 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. 15
16 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 = {Renault,Ferrari,McLaren,muu } Kuten yleensäkin, tarkoittaa alkioiden lukumäärää; siis yllä Γ 1 = 4. 16
17 Aakkoston Σ merkkijono on mikä tahansa äärellinen jono joukon Σ alkioita (eli merkkejä eli symboleita). Esim on aakkoston Σ 1 merkkijono. Merkkijonon z pituutta merkitään z ; siis = 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, R ja 32 R, mutta 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 S ja ( ) 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). 17
18 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. 18
19 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,
20 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. 20
21 Äärellinen automaatti: johdattelua [Sipser s ] 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.) 21
22 Saamme seuraavanlaisen äärellisen automaatin: P P P P P P Y P 22
23 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. 23
24 Äärellinen automaatti: formaali määritelmä [Sipser s ] Ää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. 24
25 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 }. 25
26 Edellisen sivun automaatti M 1 voidaan esittää havainnollisemmin tilakaaviona q 0 q 1 q Automaatin toiminta syötteellä 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 Toisaalta syötteen automaatti hylkää: q 0 0 q1 0 q1 1 q2 0 q1 0 q1 ja päädymme ei-hyväksyvään tilaan q 1. 26
27 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. 27
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. 28
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.) 29
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ä. 30
31 Jatkoa ajatelleen on hyödyllistä 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 automaatin tunnistama kieli voidaan luonnehtia seuraavasti: w L(M) jos ja vain jos δ (q 0, w) F. 31
32 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. 32
33 Äärellisen automaatin laatiminen [Sipser s ] 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. 33
34 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 b bittiä muistia algoritmissa vastaa 2 b tilaa automaatissa.) 34
35 Seuraava hahmotelma toteuttaa while-silmukan em. tilojen avulla: 0 0 F0 1 T0 1 0 hylkää F1 T1 0 Tätä pitää vielä täydentää, että alustukset ja hyväksyminen 1 1 saadaan hoidetuksi äärellinen automaatti -formalismin mukaisesti. 35
36 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: F0 1 T0 1 0, F1 T
37 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ä: ε Tilojen nimet esittävät viimeksi luettuja kahta merkkiä. 37
38 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
39 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
40 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
41 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
42 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
43 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
44 Operaatiot (säännöllisillä) kielillä [Sipser s ] 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
45 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
46 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
47 Aloitetaan konkreettisella esimerkillä. Seuraava automaatti hyväksyy merkkijonot, jotka loppuvat nollaan: a b 1 Toisaalta seuraava automaatti hyväksyy merkkijonot, jotka loppuvat 01: 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
48 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
49 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
50 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
51 a b ba bb bc aa ab ac A B C
52 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
53 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
54 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 Tapaus w = 0: Siis w = ε, ja suoraan määritelmistä δ ((r, s), ε) = (r, s) = (δ 1(r, ε), δ 2(s, ε)). 54
55 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
56 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ä. Yleensä (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
57 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
58 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
59 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
60 Epädeterministiset äärelliset automaatit [Sipser s ] Tarkastellaan esimerkkinä seuraavaa automaattia: a, b a b a, ε 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
61 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 b
62 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
63 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
64 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
65 Esimerkkiautomaattimme a, b a b a, ε 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
66 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
67 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
68 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) Siis erityisesti aina R 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. 68
69 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
70 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
71 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
72 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
73 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
74 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
75 δ ({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
76 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 {a,c,d} 0 {a,b,c,d} 1 {c,d} 1 {d} 0,1 1 0,1 76
77 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
78 Säännöllisten kielten sulkeumaominaisuudet [Sipser s ] 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
79 Konstruktion periaate on seuraava: ε N 1 ε N 2 N 79
80 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
81 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
82 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
83 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
84 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
85 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
86 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
87 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
88 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
89 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 Tätä voidaan käyttää hyväksi kääntämisen ensimmäisessä vaiheessa muodostamalla sitä varten äärellinen automaatti (kuten seuraavaksi nähdään). 89
90 Äärellisten automaattien ja säännöllisten lausekkeiden ekvivalenssi [Sipser s ] 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
91 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
92 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
93 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
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. 94
95 Ajatuksena on esim., että edellä esitetystä automaatista b a c q 1 q 2 q 3 d voidaan eliminoida tila q 2 ja saada ekvivalentti GNFA (ab c) d q 1 q 3 Meidän pitää nyt sopia tarkemmin, mitä GNFA tarkalleen on. 95
96 Ajatus on, että GNFA on kuten NFA, mutta kuhunkin kaareen voi liittyä mielivaltainen säännöllinen lauseke. Siirtyminen kaarta pitkin kuluttaa syötteestä jonkin osamerkkijonon, joka kuuluu kyseisen säännöllisen lausekkeen kuvaamaan kieleen. Yksinkertaisuuden vuoksi sovimme, että GNFA noudattaa seuraavia rajoitteita: 1. Siinä on tasan yksi hyväksyvä tila ja yksi alkutila, ja nämä eivät ole sama tila. 2. Alkutilaan ei tule siirtymiä. 3. Hyväksyvästä tilasta ei lähde siirtymiä. 4. Muuten minkä tahansa kahden tilan välillä on siirtymä, johon liittyy tasan yksi säännöllinen lauseke. 96
97 Esimerkki 1.11: Alla on eräs GNFA, joka tunnistaa kielen (abca ) (cbac ): abc a q st q acc cba ε c 97
98 Muodollisesti GNFA on siis viisikko (Q,Σ, δ, q start, q accept ), missä 1. Q on äärellinen tilajoukko, 2. Σ on aakkosto, 3. δ on funktio (Q { q accept }) (Q { q start }) R, missä R on aakkoston Σ säännöllisten lausekkeiden joukko ja 4. q start Q, q accept Q ja q start q accept. Jätämme jatkossa GNFA:ta piirrettäessä kuvasta pois kaaret (r, s), joilla δ(r, s) =. 98
99 GNFA (Q,Σ, δ, q start, q accept ) hyväksyy merkkijonon w Σ, jos on olemassa esitys w = w 1... w k, missä w i Σ kaikilla 1 i k, ja tilajono (q 0,..., q k ) Q k+1, joilla 1. q 0 = q start, 2. w i L(R i ) kaikilla 1 i k, missä R i = δ(q i 1, q i ) ja 3. q k = q accept. 99
100 Mistä tahansa DFA:sta voidaan helposti muodostaa saman kielen tunnistava GNFA: 1. Lisää uudet tilat q start ja q accept. 2. Lisää ε-siirtymät tilasta q start vanhaan alkutilaan ja vanhoista hyväksyvistä tiloista tilaan q accept. 3. Kaikilla alkuperäisillä tiloilla q 1 ja q 2 aseta δ(q 1, q 2 ) = a 1... a n, missä { a 1,..., a n } on niiden merkkien joukko, joilla vanhassa automaatissa on siirtymä tilasta q 1 tilaan q Niillä q 1 ja q 2, joilla δ(q 1, q 2 ) ei vielä tullut määritellyksi, aseta δ(q 1, q 2 ) =. 100
101 Esimerkki 1.12: Seuraava DFA hyväksyy merkkijonot, joissa on pariton määrä b-merkkiä: a b a b Vastaava GNFA on seuraava: a b 1 2 a ε b ε S A Tilat on nimetty S, A, 1 ja 2 jatkoa ajatellen. 101
102 Korkean tason algoritmi NFA:ta M vastaavan säännöllisen lausekkeen muodostamiseksi on nyt seuraava: 1. Olkoon automaatin M tilojen lukumäärä k. Muodosta k + 2-tilainen GNFA G k+2, joka tunnistaa saman kielen. 2. Muodosta 2-tilainen GNFA G 2, joka tunnistaa saman kielen kuin G k Päättele kaksitilaisesta GNFA:sta G 2, mikä säännöllinen lauseke esittää sen tunnistamaa kieltä. Totesimme juuri, miten askel 1 toteutetaan. Askel 3 on triviaali: kaksitilaisen GNFA:n q start R q acc tunnistamaa kieltä esittää tietysti säännöllinen lauseke R. Jäljelle jää askelen 2 toteutus. 102
103 GNFA:n G k+2 muuntaminen ekvivalentiksi kaksitilaiseksi GNFA:ksi G 2 tapahtuu eliminoimalla tiloja yksi kerrallaan. Tilan eliminoiminen perustuu muunnokseen S x R q pois T y P x (RS T) P y Huomaa, että tämä pitää tehdä samanaikaisesti kaikilla pareilla (x, y), joiden välillä on yhteys tilan q pois kautta. Erityisesti pitää muistaa tapaus x = y. 103
104 Saamme seuraavan proseduurin: EliminoiTila(G, q pois ) oletus: G = (Q,Σ, δ, q start, q accept ) on GNFA Q > 2 ja q pois Q { q start, q accept } Q Q { q pois } for all x Q { q accept } ja y Q { q start } do R δ(x, q pois ) S δ(q pois, q pois ) T δ(q pois, y) P δ(x, y) δ (x, y) ((R)(S) (T)) (P) return G = (Q,Σ, δ, q start, q accept ). Tämä pitää automaatin tunnistaman kielen ennallaan: Lemma 1.13: Jos G = EliminoiTila(G, q pois ), niin G ja G tunnistavat saman kielen. 104
105 Ennen todistusta katsotaan Esimerkki 1.14: Parittoman määrän b-merkkiä hyväksyvästä GNFA:sta eliminoidaan ensin tila 2: a b a a ba b ε b ε ε ba S A S A 105
106 Toistetaan proseduuri vielä kerran ja tehdään kolmitilaisesta GNFA:sta kaksitilainen: a ba b 1 ε ba S (a ba b) ba A S A Kaksitilaisesta automaatista nähdään, että automaatin hyväksymää kieltä esittää säännöllinen lauseke (a ba b) ba. Tämä tosiaan esittää kieltä, jossa on parittoman määrän b:tä sisältävät merkkijonot. 106
107 Todistus lemmalle 1.13: Väitämme siis, että G ja G hyväksyvät tasan samat merkkijonot. Olkoon ensin w merkkijono, jonka G hyväksyy. Määritelmän mukaan on olemassa tilat q 0,..., q k ja merkkijonot w 1,..., w k Σ, missä q 0 = q start, q k = q accept, w = w 1... w k ja w i L(δ(q i 1, q i )) kun i = 1,..., k. Merkitsemme tätä w q 1 w start q 2 w 1 q 3 2 q 3... w k 1 w q k k 1 q accept. w Tarkastellaan ensin tilannetta q i i 1 q i, missä kumpikaan tiloista q i 1 ja q i ei ole q pois. Oletuksen mukaan w i L(δ(q i 1, q i )). Konstruktion mukaan δ (q i 1, q i ) = δ(q i 1, q i ) A jollekin A. Siis pätee myös w i L(δ (q i 1, q i )), eli w q i i 1 q i on kelvollinen siirtymä myös automaatissa G. 107
108 Tarkastellaan nyt tilannetta, että q i q pois ja q j q pois, mutta q i+1 = q i+2 =... = q j 1 = q pois, joillakin i j 2. Siis Nyt oletuksen mukaan w i+1 w i+2 w i+3 w j 1 w j q i qpois qpois... qpois qj. w i+1 L(δ(q i, q pois )) w k L(δ(q pois, q pois )) kun i + 2 k j 1 w j L(δ(q pois, q i )), joten funktion δ määritelmän mukaan w i+1... w j L(δ(q i, q pois )) L(δ(q pois, q pois )) L(δ(q pois, q j )) = L(δ (q i, q j )). Siis automaatissa G voidaan laillisesti siirtyä w i+1...w j q i qj. 108
109 Siis automaatin G siirtymäketjusta w q 1 w start q 2 w 1 q 3 2 q 3... w k 1 w q k k 1 q accept voidaan ensin ohittaa kaikki tilan q pois esiintymät. Syntyvä siirtymäketju on kelvollinen tapa päästä tilasta q start tilaan q accept automaatissa G merkkijonolla w. Siis G hyväksyy merkkijonon w. Pitää vielä osoittaa kääntäen, että jos G hyväksyy merkkijonon w, niin myös G hyväksyy sen. Tämä jätetään harjoitustehtäväksi. 109
110 Kootaan nyt edelläesitetty yhteen. Lemma 1.15: [Sipser Lemma 1.60] Jos kieli on säännöllinen, se voidaan esittää säännöllisellä lausekkeella. Todistus: Olkoon A säännöllinen kieli. Siis jollakin k on olemassa k-tilainen NFA N, joka tunnistaa kielen A. Muodostetaan säännöllinen lauseke R seuraavasti: 1. Muodosta NFA:sta N GNFA G k+2, jossa on k + 2 tilaa ja joka tunnistaa kielen A. 2. Toista seuraava arvoilla n = k + 1, k, k 1,...,2: (a) Valitse automaatista G n+1 jokin tila q pois { q start, q accept }. (b) Aseta G n EliminoiTila(G n+1, q pois ). 3. Palauta R = δ (q start, q accept ), missä δ on kaksitilaisen GNFA:n G 2 siirtymäfunktio. Soveltamalla toistuvasti lemmaa 1.13 nähdään, että automaatin G 2 tunnistama kieli on A. Siis L(R) = A. 110
111 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 yksinkertainen laskennan malli. Ei kuitenkaan ole ilmeistä, miten annetusta kielestä osoitetaan, että mikään äärellinen automaatti ei tunnista sitä. Tätä ei välttämättä näe suoraan: esim. kieli C = { w {0,1} w sisältää yhtä monta nollaa ja ykköstä } ei ole säännöllinen (kuten pian näemme). Toisaalta D = { w {0,1} w:ssä esiintyy 01 ja 10 yhtä monta kertaa } itse asiassa on säännöllinen. Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys. 111
112 Väite: Kieltä B = {0 n 1 n n N } ei voi tunnistaa äärellisellä automaatilla. Todistus: Tehdään vastaoletus, että B = L(M) deterministisellä äärellisellä automaatilla M = (Q,Σ, δ, q 0, F). Olkoon k tilojen lukumäärä k = Q ja m = k/2. (Merkintä z tarkoittaa reaalilukua z pyöristettynä ylöspäin lähimpään kokonaislukuun.) Erityisesti M hyväksyy merkkijonon s = 0 m 1 m, ja s = 2m k. Merkitään s = s 1... s 2m. Olkoon r 1,..., r 2m+1 automaatin M tilajono syötteellä s: r 1 0 r rm 0 rm+1 1 rm r2m 1 r2m+1. Tässä siis r 1 = q 0 ja r i+1 = δ(r i, s i ) kun i = 1,...,2m. Keskeinen havainto: koska Q = k < 2m + 1 ja r i Q kaikilla i, niin jonossa r 1,..., r 2m+1 ainakin yksi tila esiintyy useamman kerran ( kyyhkyslakkaperiaate ). Olkoon r i = r j, missä i < j. 112
113 Merkkijonolla s i... s j 1 automaatti tekee silmukan tilasta r i takaisin tilaan r i = r j : r i = r j s j... s 2m s 1... s i 1 r 2m+1 r 1 s i... s j 1 Merkitään x = s 1... s i 1 y = s i... s j 1 z = s j... s 2m. Siis s = xyz on alkuperäinen hyväksytty merkkijono, joka vastaa silmukan kiertämistä tasan kerran. Merkitsemme vastaavaa hyväksyvää laskentaa lyhyesti missä on otettu huomioon r j = r i. r 1 x ri y ri z r2m+1 113
114 Silmukan sisältävästä hyväksyvästä laskennasta x y z r 1 ri ri r2m+1 saadaan uusi hyväksyvä laskenta ohittamalla silmukka: x z r 1 ri r2m+1. Siis automaatti M hyväksyy merkkijonon xy 0 z = xz. Silmukkaa voidaan myös toistaa mielivaltaisen monta kertaa: x y y z r 1 ri ri ri r2m+1 x y y y z r 1 ri ri ri ri r2m+1... Siis automaatti hyväksyy myös merkkijonot xy 2 z = xyyz, xy 3 z = xyyyz jne. 114
115 Tarkastellaan silmukan erilaisia sijainteja merkkijonon s keskikohdan suhteen: 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. Kaikissa tapauksissa xy 2 z ei kuulu kieleen B: tapauksessa 1 siinä on liikaa nollia tapauksessa 2 se on muotoa tapauksessa 3 siinä on liikaa ykkösiä. Koska M hyväksyy merkkijonon xy 2 z, tämä on ristiriita oletuksen B = L(M) kanssa. Siis kieltä B ei voi tunnistaa k-tilaisella deterministisellä äärellisellä automaatilla millään k, eli kieli B ei ole säännöllinen. 115
116 Edellisen todistuksen perusidea oli osoittaa, että jos M on k-tilainen automaatti, niin kielellä L(M) on pumppauspituus k: Määritelmä 1.16: 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 ehto 2 sulkee pois mahdollisuuden y = ε (muuten pumpattavuus olisi triviaalia). Ehto 3 on tekninen lisäehto, johon palataan pian. Kun kielellä on äärellinen pumppausominaisuus, millä tahansa riittävän pitkällä merkkijonolla s on keskiosa y, jota pumppaamalla saadaan uusia kieleen kuuluvia merkkijonoja xy 2 z, xy 3 z,
117 Lause 1.17 (Pumppauslemma): [Sipser Thm. 1.70] Jokaisella säännöllisellä kielellä on äärellinen pumppausominaisuus. Ennen pumppauslemman todistusta näytämme esimerkkinä, miten siitä johdetaan em. kielen B ei-säännöllisyys. Esimerkki 1.18: Kieli ei ole säännöllinen. B = {0 n 1 n n N } Väitteen todistamiseksi tehdään vastaoletus, että B on säännöllinen. Siis kielellä B on jokin pumppauspituus p. Merkitään m = p/2 ja valitaan s = 0 m 1 m. Koska s p, voidaan kirjoittaa s = xyz, missä y ε ja xy i z B kaikilla i N. Tämä on ristiriita kielen B määritelmän kanssa (vrt. kohdat 1 3 sivulla 115). 117
118 Pumppauslemman todistus: Olkoon A säännöllinen kieli ja M = (Q,Σ, δ, q 0, F) sen tunnistava DFA. Valitaan p = Q. Olkoon nyt n p ja s = s 1... s n A. Olkoon r 1,..., r n+1 tilajono, jonka kautta M hyväksyy merkkijonon s. Siis r 1 = q 0, r i+1 = δ(r i, s i ) kun i = 1,..., n, ja r n+1 F. Kyyhkyslakkaperiaatteen nojalla jonossa r 1,..., r p+1 esiintyy jokin tila kahteen kertaan. Olkoon r j = r l, missä j < l p + 1. Jaetaan s osiin s = xyz, missä x = s 1... s j 1 y = s j... s l 1 z = s l... s n. Koska y = l j 1 ja xy = l 1 p, tämä täyttää pumppausmääritelmän ehdot 2 ja 3. Automaatti M tekee merkkijonolla y silmukan tilasta r j takaisin samaan tilaan. Silmukkaa voidaan toistaa nolla tai useampia kertoja ilman, että lopputulos muuttuu. Siis M hyväksyy kaikki merkkijonot xy i z, z N. 118
119 Pumppauslemman soveltaminen Jos p on kielen A pumppauspituus, niin määritelmän mukaan kaikilla sellaisilla s A, että s p on olemassa jako s = xyz, jolla pumppausehdot (1) (3) toteutuvat. Käytämme pumppauslemmaa yleensä käänteisesti: todistamme kielen A ei-säännölliseksi osoittamalla, että mikään p ei ole pumppauspituus. Tätä varten pitää siis mille tahansa p voida osoittaa, että on olemassa sellainen s A, että s p ja kaikilla jaoille s = xyz jokin pumppausehdoista (1) (3) jää toteutumatta. Siis aluksi s voidaan valita sopivasti helpottamaan todistusta, mutta sitten pitää käydä läpi kaikki mahdolliset tavat jakaa s osiin x, y ja z ja osoittaa, että mikään jako ei toteuta kaikkia pumppausehtoja. 119
120 Esimerkki 1.19: [Sipser Ex. 1.74] Kieli C = { w {0,1} w sisältää yhtä monta nollaa ja ykköstä } ei ole säännöllinen. Todistamme tämän osoittamalla, että kielellä C ei ole pumppauspituutta. Pumppauslemman nojalla tästä seuraa, että C ei ole säännöllinen. Olkoon siis p N mielivaltainen. Meidän on löydettävä ainakin yksi sellainen merkkijono s C, että s p mutta mikään jako s = xyz ei toteuta kaikkia pumppausehtoja (1) (3). Tässä toimivaksi valinnaksi osoittautuu s = 0 p 1 p. Tällä valinnalla selvästi s C ja s p. Pitää vielä osoittaa, että mikään tapa jakaa s osiin s = xyz ei toteuta kaikkia ehtoja (1) (3). Ainoa tapa saada ehto (3) voimaan on valita x = 0 n ja y = 0 m, missä n + m p. Jäljelle jää z = 0 p m n 1 p. Tällöin xyyz = 0 n 0 m 0 m 0 p m n 1 p = 0 p+m 1 p. Jos m > 0, tämä merkkijono ei kuulu kieleen C, mikä rikkoo ehtoa (1). Jos taas m = 0, ehto (2) ei ole voimassa. Siis mikään jako ei toteuta kaikkia ehtoja. Merkkijonoa s = 0 p 1 p ei voi pumpata, joten p ei ole kielen C pumppauspituus. 120
121 Vaihtoehtoinen todistus: Tehdään vastaoletus, että C on säännöllinen. Kieli 0 1 on säännöllinen, joten kieli (0 1 ) C on säännöllinen (harjoitus 4). Tämä on ristiriita, koska (0 1 ) C on sama kuin esimerkin 1.18 ei-säännöllinen kieli B. Huomautus 1: Pumppauslemma ei siis ole ainoa tapa todistaa kieli ei-säännölliseksi. On olemassa myös ei-säännöllisiä kieliä, joilla on äärellinen pumppausominaisuus, joten niiden ei-säännöllisyys pitää todistaa muuta kautta. Jos kielellä ei ole pumppausominaisuutta, se ei ole säännöllinen. Jos kielellä on pumppausominaisuus, sen säännöllisyydestä ei vielä voi tehdä mitään päätelmiä. 121
122 Huomautus 2: Miten valitaan sopiva s? Jos olisi valittu s = (01) p, ei olisi saatu ristiriitaa, koska tätä s voidaan pumpata (esim. x = ε, y = 01, z = (01) p 1 ). Yksi lähestymistapa on miettiä, mitkä olisivat hankalia tapauksia, jos kieltä yritettäisiin tunnistaa äärellisellä automaatilla. Jos haluamme päättää, päteekö s C, ja saamme käydä merkkijonon s läpi vain kerran, niin intuitiivisesti meidän täytyy pitää kirjaa siitä, mikä on tähän mennessä nähtyjen nollien ja ykkösten lukumäärän ero. Tämä on mahdotonta äärellisellä automaatilla, koska p-tilaisessa automaatissa ei voi esittää yli p:n meneviä laskurin arvoja. Merkkijono s = 0 p 1 p on valittu siten, että se aiheuttaa laskurin ylivuodon mahdollisimman nopeasti. 122
123 Esimerkki 1.20: [Sipser Ex. 1.75] Kieli F = { ww w {0,1} } ei ole säännöllinen. Todistuksen logiikka on sama kuin edellä, mutta esitämme sen hieman tiiviimmin. Tehdään vastaoletus, että kieli F on säännöllinen. Siis sillä on pumppauspituus p. Valitaan s = 0 p 10 p 1 F. Olkoon s = xyz, missä y > 0 ja xy p (pumppausehdot (2) ja (3)). Siis y = 0 k jollain k > 0. Nyt xyyz = 0 p+k 10 p 1. Tämän merkkijonon loppupuoliskossa on ykkösiä mutta alkupuoliskossa ei, joten se ei kuulu kieleen F. Siis pumppausehto (1) ei toteudu; ristiriita. Edellisiä esimerkkejä yhdistää idea, että äärellinen automaatti ei osaa todeta kahta asiaa yhtäsuuriksi. Samaan intuitioon liittyy edellä esitetty laskurin ylivuoto -idea. Tässä kuitenkaan esim. valinta s = 0 p 0 p ei sellaisenaan toimisi, koska 0 p+k 0 p kuuluukin kieleen: 0 p+k 0 p = 0 p+k/2 0 p+k/2 (jos k on parillinen). Tarvitaan pieni trikki, jolla kiinnitetään jako alkupuoliskoon ja loppupuoliskoon. 123
124 Esimerkki 1.21: [Sipser Ex. 1.76] Kieli D = { 1 n2 n N } ei ole säännöllinen. Kieli siis koostuu ykkösjonoista, joiden pituudet ovat 0 2 = 0, 1 2 = 1, 2 2 = 4, 3 2 = 9, 4 2 = 16,.... Havaitaan, että perättäisten pituuksien väliset aukot kasvavat. Tarkemmin alkioiden r ja r + 1 pituuksien väli on r 2 (r 1) 2 = 2r 1. Tehdään nyt vastaoletus: kieli D on säännöllinen. Olkoon pumppauspituus p. Valitaan mikä tahansa s D, jolla s p, ja tälle pumppausominaisuuden mukainen esitys s = xyz. Olkoon y = k 1 ja xz = l. Nyt merkkijonot xy i z kuuluvat kieleen D, ja niiden pituudet muodostavat aritmeettisesti kasvavan jonon l, l + k, l + 2k, l + 3k,.... Tämä on ristiriita sen kanssa, että kielessä D voi olla korkeintaan (k + 1)/2 perättäistä merkkijonoa, joiden pituuksien erotus on korkeintaan k. 124
125 Esimerkki 1.22: [Sipser Ex. 1.77] Kieli E = { 0 i 1 j i > j } ei ole säännöllinen. Vastaoletus: Oletetaan, että E on säännöllinen. Olkoon sillä pumppauspituus p. Valitaan s = 0 p+1 1 p E. Olkoon s = xyz pumppausehdon mukaisesti. Taas ehtojen y > 0 ja xy p takia y = 0 k jollain k 1. Nyt xy 0 z = xz = 0 p+1 k 1 p E; ristiriita. Tässä siis pumpattiin alaspäin eli imettiin s:stä viimeinenkin y pois. 125
126 Yhteenveto säännöllisistä kielistä Deterministinen äärellinen automaatti (DFA) on laskentalaite, jolla on syötteen pituudesta riippumaton vakiomäärä muistia. Määritelmän mukaan kieli on säännöllinen, jos ja vain jos se voidaan tunnistaa DFA:lla. Lauseen 1.3 perusteella kieli voidaan tunnistaa DFA:lla, jos ja vain jos se voidaan tunnistaa epädeterministisellä äärellisellä automaatilla (NFA:lla). DFA voi kuitenkin vaatia eksponentiaalisesti enemmän tiloja kuin NFA (vrt. harj ). Lauseen 1.9 perusteella kieli voidaan tunnistaa DFA:lla, jos ja vain jos se voidaan esittää säännöllisellä lausekkeella. Kieli {0 n 1 n n N } on esimerkki ei-säännöllisestä kielestä. Tämä voidaan todistaa esim. pumppauslemmalla (lause 1.17). Ryhdymme seuraavaksi tarkastelemaan laajempaa yhteydettömien eli kontekstittomien kielten luokkaa. 126
127 2. Yhteydettömät kielet Yhteydettömät eli kontekstittomat kielet (context-free language, CFL) ovat säännöllisiä kieliä laajempi luokka formaaleja kieliä. Ne voidaan esittää yhteydettömillä kieliopeilla (context-free grammar, CFG). Täsmälleen tämän kieliluokan tunnistamiseen kykeneväksi laskentalaitteeksi osoittautuu pinoautomaatti (push-down automaton, PDA). Tämän luvun jälkeen opiskelija osaa määritellä kontekstittoman kieliopin ja pinoautomaatin sekä selittää niiden välisen suhteen, osaa muodostaa kieliopin yksinkertaiselle kontekstittomalle kielelle ja tuntee joitain perusesimerkkejä ei-yhteydettömistä kielistä 127
128 Yhteydettömät kieliopit [Sipser luku 2.1] Johdantoesimerkkinä tarkastelemme kieltä L = {a n b m a n n > 0, m > 0 }, joka on yhteydetön (mutta ei säännöllinen). Vastaavan kieliopin ytimenä on säännöt eli produktiot S asa S aba B bb B b. Kieliopin muuttujat eli välikkeet (variable, nonterminal symbol) ovat S ja B. Näistä S on erityisasemassa lähtösymbolina. Päätemerkit eli -symbolit (terminal) ovat a ja b. Kieliopista saadaan esim. merkkijonolle aabbaa L seuraava johto (derivation): S asa aabaa aabbaa aabbaa. Johdossa siis aloitetaan lähtösymbolista ja korvataan muuttujat yksi kerrallaan vastaavan produktion oikealla puolella olevalla merkkijonolla. 128
129 Merkkijonon aabbaa johtoa S asa aabaa aabbaa aabbaa vastaa seuraava jäsennyspuu (parse tree): S S B B a a b b a a Lehtinä on johdetun merkkijonon merkit esijärjestyksessä ( vasemmalta oikealle ), juurena lähtösymboli ja sisäsolmuina välikkeitä. Kunkin välikkeen lapset vastaavat välikeeseen liittyvän säännön oikeaa puolta. 129
130 Muodollisesti yhteydetön eli kontekstiton kielioppi (context-free grammar, CFG) on nelikko (V,Σ, R, S), missä 1. V on äärellinen muuttujien (eli muuttujasymbolien eli välikesymbolien) joukko 2. Σ on äärellinen päätesymbolien joukko, joka ei saa sisältää muuttujasymboleja 3. R on äärellinen joukko sääntöjä eli produktioita muotoa A w, missä A V on muuttuja ja w (V Σ) on mielivaltainen (mahdollisesti tyhjä) jono muuttujia ja päätesymboleja 4. jokin muuttuja S V on asetettu lähtösymboliksi. 130
131 Esimerkki 2.1: Edellä todettiin, että kielelle {a n b m a n n, m > 0 } on olemassa yhteydetön kielioppi G = (V, Σ, R, S), missä V = { S, B } Σ = {a,b} R = { S asa, S aba, B bb, B b } S on lähtösymboli. Jatkossa esittäisimme tämän kieliopin yksinkertaisesti muodossa Siis S asa aba B bb b muuttujia ovat ne, jotka ovat jonkin säännön vasempana puolena, lähtösymboli on ensimmäisenä listatun säännön vasen puoli muut symbolit ovat päätesymboleita. samaan muuttujaan liittyvät säännöt kootaan yhteen ja niiden oikeat puolet erotetaan pystyviivalla toisistaan. 131
132 Intuitiivisesti yhteydetön kielioppi G = (V,Σ, R, S) tuottaa aakkoston Σ merkkijonoja seuraavalla proseduurilla: 1. Alusta r := S. (Jatkossa r saa arvokseen aakkoston V Σ merkkijonoja.) 2. Valitse merkkijonosta r jokin kohta i, jossa esiintyy muuttujasymboli; ts. olkoon r = r 1... r i 1 A r i+1... r n, missä n = r, r i V Σ kaikilla i ja A V. 3. Valitse sääntöjoukosta R jonkin sääntö A w 1... w m, jonka vasen puoli on sama merkkijonosta r valittu muuttujasymboli. 4. Aseta muuttujalle r uusi arvo r := r 1... r i 1 w 1... w m r i+1... r k. 5. Jos r sisältää pelkkiä päätemerkkejä (eli r Σ ), niin tulosta r. Muuten palaa kohtaan 2. Kieliopin tuottama kieli koostuu niistä aakkoston Σ merkkijonoista, jotka tämä proseduuri voi tulostaa, kun sovellettavat säännöt valitaan sopivasti. 132
133 Määritellään nyt täsmällisemmin kieliopin G = (V,Σ, R, S) tuottama kieli. Jos x = u A v ja y = u w v, missä A w R, niin x johtaa suoraan eli tuottaa suoraan (yields, derives directly) merkkijonon y. Tätä merkitään x y. Jos on olemassa aakkoston V Σ merkkijonot u 0,..., u k 1, missä u i 1 u i kun i = 1,..., k, merkitään u 0 uk ja sanotaan, että u 0 johtaa eli tuottaa (derives) merkkijonon u k. + Tapauksessa k > 0 voidaan merkitä u 0 u k. Aakkoston V Σ merkkijono w on lausejohdos (sentential form), jos S w. Jos lisäksi w sisältää vain päätesymboleja, se on lause. Kieliopin G tuottama eli kuvaama kieli on sen lauseiden joukko { } L(G) = w Σ S w. Kieli on yhteydetön, jos jokin yhteydetön kielioppi tuottaa sen. 133
134 Selitys termille yhteydetön : Yhteydetön viittaa siihen, että kieliopin säännöt ovat muotoa A w, mikä voidaan tulkita Muuttuja A voidaan korvata merkkijonolla w, oli ympärillä mitä tahansa. Sääntöjä siis voidaan soveltaa kontekstista riippumatta. Yhteydettömän kielioppin eräs mahdollinen yleistys on yhteysherkkä kielioppi (context-sensitive grammar). Tällaisen kieliopin säännöt ovat muotoa uav uwv, missä u, v ja w ovat aakkoston V Σ merkkijonoja. Sääntö tulkitaan Muuttuja A voidaan korvata merkkijonolla w, jos sen ympärillä on merkkijonot u ja v. Voidaan osoittaa, että esim. kieli {a n b n c n n N } ei ole yhteydetön, mutta voidaan esittää käyttämällä yhteysherkkiä sääntöjä. 134
135 Jos u L(G) ja S v 1... v k = u, tätä ketjua sanotaan merkkijonon u johdoksi (derivation), ja sen pituus on k. Merkkijonon u Σ jäsennyspuu on mikä tahansa seuraavat ehdot täyttävä puu: 1. sisäsolmut on nimetty muuttujasymboleilla ja lehdet päätesymboleilla 2. juurena on lähtösymboli S 3. lehtinä ovat merkkijonon u merkit järjestyksessä vasemmalta oikealle sekä mahdollisesti tyhjän merkkijonon symboleja ε 4. jos A on sisäsolmu ja sen lapset vasemmalta oikealle ovat w 1,..., w k, niin kieliopissa on sääntö A w 1... w k. Merkkijonon u johdosta voidaan rakentaa sille jäsennyspuu: 1. Lähdetään liikkeelle puusta, jossa on pelkkä juuri S. 2. Kun johdossa sovelletaan sääntöä A w 1... w k, niin puussa vastaavalle lehdelle A lisätään lapset w 1,..., w k. 135
136 Esimerkki 2.2: Yhteydetön kielioppi S SS ( S ) ε tuotaa kaikki oikein muodostetut sulkulausekkeet. Tässä 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 ja sitä vastaava jäsennyspuu ovat S SS ( S )S ()S ()(S) ()(SS) ()((S) S) ()(()S) ()(()(S)) ()(() ()) S S S S S S S S S ( ε ) ( ( ε ) ( ε ) ) 136
137 Yhteydettömien kielioppien laatiminen [Sipser s ] Yhteydettömiä kielioppeja on helppo tuottaa soveltamalla vastaavia operaatioita kuin säännöllisissä lausekkeissa. Lause 2.3: Jos A ja B ovat yhteydettömiä kieliä, niin myös A B, A B ja A ovat. Todistus: Tarkastellaan esimerkkinä yhdistettä A B; muut kohdat menevät samaan tapaan. Olkoot A ja B aakkoston Σ yhteydettömiä kieliä. Siis A = L(G A ) ja B = L(G B ) joillain yhteydettömillä kieliopeilla G A = (V A,Σ, R A, S A ) ja G B = (V B,Σ, R B, S B ). Kielioppien muuttujasymboleita voidaan tarvittaessa vaihtaa niin, että V A V B =. Olkoon S V A V B. Määritellään G = (V A V B { S },Σ, R, S), missä Selvästi L(G) = A B. R = R A R B { S S A } { S S B }. 137
138 Lauseesta 2.3 seuraa erityisesti Korollaari 2.4: Kaikki säännölliset kielet ovat yhteydettömiä. Jatkossa osoittautuu toisaalta, että yhteydettömien kielten luokka ei ole suljettu leikkauksen ja komplementin suhteen, toisin kuin säännöllisten kielten luokka. Yhteydettömät kielet ovat aidosti laajempi luokka kuin säännölliset. Perusesimerkki tästä on yhtäsuuruusvertailu rekursiota käyttämällä. Esimerkki 2.5: Kieli {0 n 1 n n N } tunnetusti ei ole säännöllinen. Se voidaan kuitenkin tuottaa yhteydettömällä kieliopilla S 0S1 ε Tarkastelemme seuraavaksi esimerkkejä tyypillisistä yhteydettömien kielioppien rakenteista. 138
139 Seuraava esimerkki osoittaa, miten yhteydettömällä kieliopilla voidaan tuottaa kaksi keskenään peilisymmetristä osamerkkijonoa. Esimerkki 2.6: Aakkoston { a, b } palindromien joukko { w {a,b} w = w R } voidaan tuottaa yhteydettömällä kieliopilla S ε a b asa bsb. Vastaavasti kieli { ww R w {a,b} } voidaan tuottaa yhteydettömällä kieliopilla S ε asa bsb. Sen sijaan kieli { ww w {a,b} } ei ole yhteydetön, kuten jatkossa näemme. 139
140 Esimerkki 2.7: Luonnollinen kieli on ollut tärkeä motivaatio kielioppiformalismien kehittämiselle. Leikkikaluesimerkki: sentence noun-phrase verb-phrase noun-phrase verb direct-object-phrase noun-phrase proper-noun determiner common-noun proper-noun John Jill common-noun car hamburger determiner a the verb-phrase verb adverb verb verb drives eats adverb slowly frequently direct-object-phrase adjective-list proper-noun determiner adjective-list common-noun adjective-list ε adjective adjective-list adjective big juicy brown Tässä siis sentence jne. ovat muuttujasymboleja ja John jne. päätesymboleja. Huomaa muuttujaa adjective-list käyttävä toistorakenne. 140
141 Edellisestä kieliopista saadaan esim. seuraavanlaisia johtoja: sentence noun-phrase verb direct-object-phrase proper-noun verb direct-object-phrase John verb direct-object-phrase John eats direct-object-phrase John eats determiner adjective-list common-noun John eats a adjective-list common-noun John eats a adjective adjective-list common-noun John eats a big adjective-list common-noun John eats a big adjective adjective-list common-noun John eats a big juicy adjective-list common-noun John eats a big juicy common-noun John eats a big juicy hamburger Tämä on esimerkki vasemmasta johdosta (leftmost derivation), mihin palataan pian. 141
142 Edellistä johtoa vastaava jäsennyspuu: sentence noun-phrase verb direct-object-phrase proper-noun determiner adjective-list common-noun adjective adjective-list adjective adjective-list John eats a big juicy ε hamburger 142
143 Esimerkki 2.8: Toinen sekä historiallisesti että nykykäytännön kannalta tärkeä yhteydettömien kielioppien sovellus on ohjelmointikielten syntaksin kuvaaminen. Tällöin käytetään usein ns. Backus-Naur-muotoa (BNF), joka on suunnilleen sama kuin yhteydetön kielioppi. Tarkastellaan esimerkkinä pientä Pascal-kielen osaa: 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 Kielioppi toimii paitsi ohjelmoijan muistilistana myös kääntäjän (tarkemmin jäsentäjän) laatimisen lähtökohtana. Tässä ajatellaan, että jonkin yksinkertainen (esim. äärellisiin automaatteihin perustuva) mekanismi on valmiiksi pilkkonut ohjelman sellaisiin tekstialkioihin kuin varatut sanat ja muuttujien ja aliohjelmien nimet. 143
144 Esimerkkijohto: Vastaava ohjelmanpätkä: lause ehtolause if x=0 then if ehto then lause else lause a if x=0 then lause else lause else begin x:= 0; if x=0 then kutsu else lause b if x=0 then a else lause end if x=0 then a else koottu-lause if x=0 then a else begin lausejono end if x=0 then a else begin lause ; lausejono end if x=0 then a else begin sijoitus ; lausejono end if x=0 then a else begin x:=0 ; lausejono end if x=0 then a else begin x:=0 ; lause end if x=0 then a else begin x:=0 ; kutsu end if x=0 then a else begin x:=0 ; b end 144
145 Vielä jäsennyspuu samalle lauseelle: lause ehtolause ehto lause lause kutsu koottu-lause lausejono lause sijoitus lausejono lause kutsu if x = 0 then a else begin x := 0 ; b end 145
146 Moniselitteisyys [Sipser s ] Kontekstittoman kielen lauseella on tyypillisesti useita johtoja. Esim. kieliopissa S AB A a B b merkkijono ab voidaan johtaa kahdella eri tavalla: S AB ab ab ja S AB Ab ab. Intuitiivisesti näissä johdoissa on vain käytetty samoja sääntöjä eri järjestyksessä. Johdot myös vastaavat samaa jäsennyspuuta. Tällaisen triviaalin monijohtoisuuden poissulkemiseksi tarkastelemme vasempia johtoja (leftmost derivation). Vasemmassa johdossa sovelletaan aina produktiota merkkijonon vasemmanpuoleisimpaan muuttujaan. Siis em. kieliopissa merkkijonon ab ainoa vasen johto on S AB ab ab. Kielioppi on moniselitteinen (ambiguous), jos siinä jollain lauseella on useampi kuin yksi vasemmanpuoleinen johto. Muuten kielioppi on yksiselitteinen. Tähänastiset esimerkkimme ovat kaikki olleet yksiselitteisiä. 146
147 Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: S A S B A a S B A a S B b Samaan jäsennyspuuhun päästään myös johdolla S AB Ab ab: S A S B A S B b A a S B b Yhteen jäsennyspuuhun liittyy aina tasan yksi vasen johto (sekä yleensä muita, ei-vasempia johtoja). Siis kielioppi on moniselitteinen, jos ja vain jos siinä jollain lauseella on ainakin kaksi jäsennyspuuta. 147
148 Esimerkki 2.9: Muuttujien x, y ja z aritmeettiset lausekkeet voidaan kuvata kieliopilla lauseke lauseke + lauseke lauseke lauseke ( lauseke ) x y z. Kielioppi on moniselitteinen, sillä lauseella x + y z on kaksi vasenta johtoa ja jäsennyspuuta: lauseke lauseke + lauseke x + lauseke x + lauseke lauseke x + y lauseke x + y z lauseke lauseke lauseke lauseke + lauseke lauseke x + lauseke lauseke x + y lauseke x + y z. lauseke lauseke lauseke lauseke lauseke x + y z lauseke lauseke lauseke lauseke lauseke x + y z 148
149 Sama kieli voidaan tuottaa seuraavalla yksiselitteisellä kieliopilla lauseke lauseke + termi termi termi termi tekijä tekijä tekijä ( lauseke ) x y z. Lauseen x + y z yksikäsitteiset vasen johto ja jäsennyspuu ovat lauseke lauseke + termi termi + termi tekijä + termi x + termi x + termi tekijä x + tekijä tekijä x + y tekijä x + y z lauseke lauseke termi termi termi tekijä tekijä tekijä x + y z 149
150 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 sivun kielioppi noudattaa koulusta tuttua presedenssisääntöä, jonka mukaan kertolaskut lasketaan ennen yhteenlaskuja. Jäsennyspuun hyödyntämiseksi pitää tietysti ensinnä osata muodostaa annetulle merkkijonolle jäsennyspuu (eli yhtäpitävästi johto) annetussa kieliopissa, tai todeta, että merkkijono ei kuulu kieleen. Palaamme jatkossa lyhyesti tähän yhteydettömän kieliopin jäsennysongelmaan. Todetaan tässä vaiheessa, että ongelma on ei-triviaali ja tehokkaat jäsennysmenetelmät jäävät tämän kurssin ulkopuolelle. Todetaan vielä, että joillekin yhteydettömille kielille ei ole olemassa yksiselitteistä kielioppia. Esimerkki tällaisesta luonnostaan moniselitteisestä (inherently ambiguous) kielestä on { a i b j c k i = j tai j = k } (todistus sivuutetaan). 150
151 Chomskyn normaalimuoto [Sipser s ] Kielioppeja algoritmisesti käsiteltäessä on hyvä, jos ne ovat siistejä. Esimerkki 2.10: Tarkastellaan kielioppia S AB A a B CC C DD D EE E FF F ε Kieliopin tuottama kieli on yksinkertaisesti { a }. Kaikki johdot ovat kuitenkin hyvin pitkiä, mikä on erilaisten algoritmien kannalta ongelmallista. Esitämme seuraavaksi, miten yhteydettömälle kieliopille voidaan löytää Chomskyn normaalimuoto, jossa erityisesti merkkijonon w johdon pituus on aina 2 w 1. Chomskyn normaalimuoto tarjoaa hyviä esimerkkejä yhteydettömien kielioppien yksinkertaistamisessa käytettävistä päättelyistä ja algoritmeista. 151
152 Määritelmä 2.11: Yhteydetön kielioppi (V,Σ, R, S) on Chomskyn normaalimuodossa, jos joukon R jokainen sääntö on jotain seuraavista muodoista: 1. A BC, missä A, B, C V ja B S ja C S, 2. A a, missä A V ja a Σ, tai 3. S ε. Normaalimuodosta seuraa erityisesti, että jos S w ja w = n > 0, niin johdon pituus on tasan 2n 1. Lause 2.12: [Sipser Thm. 2.9] Mikä tahansa yhteydetön kieli voidaan tuottaa Chomskyn normaalimuodossa olevalla yhteydettömällä kieliopilla. Esitämme, miten kielioppi muunnetaan Chomskyn normaalimuotoon kolmessa vaiheessa: 1. poistetaan säännöt A ε, missä A S 2. poistetaan säännöt A B, missä A, B V 3. pilkotaan liian pitkät säännöt paloiksi. 152
153 Lemma 2.13: Mikä tahansa yhteydetön kieli voidaan tuottaa yhteydettömällä kieliopilla, jossa 1. lähtösymboli ei esiinny minkään säännön oikealla puolella ja 2. kieliopissa ei ole sääntöä A ε millään A, joka ei ole lähtösymboli. Todistus: Olkoon G = (V, Σ, R, S) yhteydetön kielioppi. Muodostamme ehdot toteuttavan kieliopin G = (V,Σ, R, S 0 ), jolla L(G ) = L(G). Otetaan käyttöön uusi lähtösymboli S 0 V ja asetetaan V = V { S 0 }. Laitetaan joukkoon R sääntö S 0 S. Jos ε L(G), lisätään myös sääntö S 0 ε. Muuttujalle S 0 ei tule muita sääntöjä, eikä se tule minkään säännön oikealle puolelle. 153
154 Määritellään nyt nollautuvien muuttujien joukko { } Null = A V A ε. Joukko Null voidaan helposti laskea iteratiivisella algoritmilla. EtsiNollautuvat(V, Σ, R, S) Null := VanhaNull := Null for A V do if joukossa R on sääntö A ε then Null := Null { A } while Null VanhaNull toista kunnes Null ei muutu do VanhaNull := Null for A V do if joukossa R on sääntö A B 1... B k missä B i Null kaikilla i then Null := Null { A } return Null 154
155 Perusidea on, että jos B Null, niin sääntö A ubv korvataan säännöillä A uv ubv. Tällöin jos alkuperäisessä kieliopissa on ε-sääntöä käytttävä johto A ubv uv niin uudessa kieliopissa voidaan jättää B väliin ja johtaa suoraan A uv. Vastaavasti jos B, C Null, niin sääntö A ubvcw korvataan säännöillä A uvw uvcw ubvw ubvcw, jne. Tämän jälkeen ε-säännöt ovat jääneet turhiksi ja voidaan poistaa. 155
156 Käydään siis läpi kaikki joukon R säännöt A w. Kirjoitetaan w muotoon w = u 1 A 1 u 2 A 2... u k A k u k+1, missä kukin A i on nollautuva muuttuja ja toisaalta mikään u i ei sisällä nollautuvia muuttujia. Jos w ei sisällä nollautuvia muuttujia, niin k = 0. Lisätään nyt joukkoon R kaikki 2 k sääntöä A u 1 x 1 u 2 x 2... u k x k u k+1, missä x i on joko A i tai ε, paitsi ei sääntöä A ε mikäli se esiintyy. On helppo nähdä, että saatu kielioppi toteuttaa vaaditut ehdot. 156
157 Esimerkki 2.14: Sovelletaan konstruktiota kielioppiin S BSB A A aa aa B bb ε. Nyt Null = { B }. Siis säännöstä S BSB saadaan S S SB BS BSB, ja säännöstä B bb saadaan B b bb. Lisätään vielä alkusymboli, ja otetaan mukaan kaikki vanhat säännöt lukuunottamatta ε-sääntöjä. Nyt S ε, joten kieliopiksi tulee S 0 S S S SB BS BSB A A aa aa B b bb. 157
158 Seuraava vaihe on poistaa yksikkösäännöt eli säännöt muotoa A B, missä A, B V. Lemma 2.15: Mikä tahansä yhteydetön kieli voidaan tuottaa yhteydettömällä kieliopilla, jossa ei ole yksikkösääntöjä. Todistus: Kaikilla A V olkoon Unit(A) niiden muutujien joukko, jotka voidaan johtaa A:sta pelkillä yksikkösäännöillä, A itse mukaanlukien. Joukot Unit(A) on helppo laskea iteratiivisesti. Kieliopin muuttujat ja päätesymbolit pidetään ennallaan, samoin lähtösymboli. Sääntöihin laitetaan A w kaikilla A V ja w (V Σ), joilla 1. B Unit(A), 2. B w on sääntö alkuperäisessä kieliopissa ja 3. w ei ole muuttujasymboli. 158
159 Ehtojen 1 ja 2 perusteella on selvää, että uusien sääntöjen joukkoon ei tule mitään, mitä siellä ei saisi olla. Jos B Unit(A) ja B w, niin A w, joten A w voidaan lisätä. Ainoa ongelma näyttäisi olevan, että ehdon 3 nojalla pudotetaan pois muotoa B C olevat säännöt. Kuitenkin jos B Unit(A) ja B C on sääntö, niin C Unit(A), joten vuorostaan muotoa C w olevat säännöt tuovat mukaan uudet säännöt A w. Siis uudet säännöt tuottavat samat merkkijonot kuin vanhat. 159
160 Esimerkki 2.16: Jatketaan edellisen esimerkin lopputuloksesta S 0 S S S SB BS BSB A A aa aa B b bb. Nyt Unit(S 0 ) = { S 0, S, A }, Unit(S) = { S, A }, ja Unit(X) = { X } muuten. Siis muuttujalle S 0 tulee omien alkuperäisten lisäksi kaikki muuttujien S ja A ei-yksikkösäännöt: Samoin S:lle lisätään A:n säännöt: S 0 SB BS BSB aa aa. S SB BS BSB aa aa. Ottamalla vielä kaikki vanhat ei-yksikkösäännöt saadaan kielioppi S 0 SB BS BSB aa aa S SB BS BSB aa aa A aa aa B b bb. 160
161 Lauseen 2.12 todistus: Olkoon G = (V, Σ, R, S) yhteydetön kielioppi. Muodostamme Chomskyn normaalimuodossa olevan kieliopin, joka tuottaa saman kielen. Lemmojen 2.13 ja 2.15 nojalla voimme olettaa kieliopista G, että 1. S ei esiinny minkään säännön oikealla puolella, 2. A ε R kaikilla A V { S }, ja 3. yksikkösääntöjä ei ole. Siis sääntö A u 1... u k, missä u i V Σ, voi rikkoa normaalimuotoa kahdella tavalla: 1. joko k = 2 ja jokin u i on päätesymboli tai 2. k
162 Otetaan jokaista päätesymbolia a Σ kohti käyttöön uusi muuttuja X a ja lisätään sääntö X a a. Korvataan jokainen normaalimuotoa rikkova sääntö A u 1 u 2 säännöllä A U 1 U 2, missä U k = X a jos u k = a Σ ja U k = u k jos u k V. Sääntö A u 1... u k, missä k 3, korvataan k 1 uudella säännöllä A U 1 A 2 A 2 U 2 A 3... A k 2 U k 2 A k 1 A k 1 U k 1 U k missä A 2,..., A k 1 ovat uusia muuttujia ja U k kuten edellä. 162
163 Esimerkki 2.17: Jatketaan edellistä esimerkkiä Kielioppi tulee muotoon S 0 SB BS BSB aa aa S SB BS BSB aa aa A aa aa B b bb. S 0 SB BS BA 1 X a A X a X a A 1 SB S SB BS BA 2 X a A X a X a A 2 SB A X a A X a X a B b X b B X a a X b b. 163
164 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 ratkaista seuraavasti: 1. Muodosta Chomskyn normaalimuodossa oleva G, jolla L(G ) = L(G). 2. Jos w = ε ja G sisältää säännön S ε, vastaa kyllä. 3. Muuten luettele kaikki pituudeltaan 2 w 1 olevat kieliopin G johdot. Jos jokin näistä on johto merkkijonolle w, vastaa kyllä; muuten vastaa ei. Ratkaisu perustuu havaintoon, että Chomskyn normaalimuodossa yhden päätemerkin tuottaminen vaatii tasan kaksi askelta. Koska pituutta 2 w 1 olevia johtoja voi olla paljon, menetelmä on käytännössä liian tehoton. 164
165 Ohjelmointikielen kääntäminen Vaiheet periaatteellisella tasolla: 1. selaaminen (scanning, lexical analysis) jakaa syötteen tekstialkioiksi (token); esim. muuttujanimi, liukulukuvakio tekniikka DFA tai vastaava 2. jäsentäminen (parsing) muodostaa tekstialkioille jäsennyspuun perustuu yhteydettömään kielioppiin 3. semanttinen analyysi: tyypitys jne. 4. koodin tuottaminen ja optimointi Käytännössä vaiheet menevät ajallisesti limittäin; esim. missään vaiheessa koneen muistissa ei ole ohjelman koko jäsennyspuuta. 165
166 Ohjelmointikielen jäsentämiseen on useita tekniikoita. Lähtökohtana on tyypillisesti ohjelmointikielen yhteydetön kielioppi. Millä tahansa yhteydettömällä kieliopilla G kysymys päteekö w L(G)? voidaan ratkaista ajassa O( w 3 ) CYK-algoritmilla (Cocke, Younger, Kasami). Myönteisessä tapauksessa algoritmi antaa myös jäsennyspuun. Käytännössä O( w 3 ) on kuitenkin yleensä liian hidasta. Tehokkaammat jäsennysmenetelmät edellyttävät, että kielioppi on jossain rajoitetussa muodossa (tärkeimmät LL(k) ja LR(k)). Emme tällä kurssilla puutu näihin menetelmiin. Esitämme tässä CYK-algoritmin lyhyesti (huom. kurssikirjassa sivulla 267). Voimme olettaa, että G = (V,Σ, R, S) on jo muunnettu Chomskyn normaalimuotoon. 166
167 Jos A w 1... w n missä n 2, voidaan ottaa johdon ensimmäinen askel erilleen: A BC w 1... w n. (Tässä on käytetty oletusta Chomskyn normaalimuodosta.) Nyt B w 1... w i ja C w i+1... w n jollakin i. Saadaan seuraava rekursiivinen proseduuri Derives(A, w), joka kaikilla muuttujilla A V ja päätemerkkijonoilla w Σ palauttaa True, jos A w. Derives(A, w) if w = ε and (A ε) R then return True tyhjä merkkijono elseif w = a Σ and (A a) R then return True yksi merkki else olkoon w = w 1... w n, missä w i Σ ja n 2 for kaikilla säännöillä (A BC) R do for i 1 to n 1 do if Derives(B, w 1... w i ) and Derives(C, w i+1... w n ) then return True return False Nyt w L(G), jos ja vain jos Derives(S, w) palauttaa True. 167
168 Rekursiivinen Derives on periaatteessa aivan toimiva algoritmi, mutta erittäin tehoton. Jos tarkastellaan esim. kieliopinpätkää S AB CA... A CB ja kutsua Derives(S,abcde), niin kutsu Derives(B,de) tulee toistetuksi kolme kertaa: Derives(S, abcde) Derives(A, abc) Derives(B, de) Derives(C, a) Derives(A, bcde) Derives(C, bc) Derives(B, de) Derives(C, ab) Derives(A, cde) Derives(C, c) Derives(B, de) Ongelma muuttuu vielä paljon pahemmaksi pitkillä merkkijonoilla. Algoritmin aikavaativuus on eksponentiaalinen merkkijonon w pituuden suhteen. Sitä voidaan oleellisesti tehostaa käyttämällä taulukointia eli dynaamista ohjelmointia (dynamic programming). 168
169 Turhaa laskentatyötä voidaan vähentää pistämällä kerran lasketut välitulokset taulukkoon. Muodostetaan siis n n taulukko table(1.. n, 1.. n), missä n = w on alkuperäisen merkkijonon pituus ja taulukon alkio table(i, j) listaa kaikki ne muuttujat, joista voidaan johtaa merkkijono w i... w j : { } table(i, j) = A V A w i... w j. Edellä käytetty periaate tapauksessa i < j tulee nyt seuraavaan muotoon: jos kieliopissa on sääntö A BC ja tiedetään B table(i, k) (eli B w i... w k ) ja tiedetään C table(k + 1, j) (eli C w k+1... w j ) niin voidaan päätellä A table(i, j) (eli A w i... w j ). Tapauksessa i = j pätee A table(i, i), jos ja vain jos kieliopissa on sääntö A w i. 169
170 Edellä esitetyn perusteella arvo table(i, j) osataan laskea, jos tunnetaan table(p, q) indekseille (p, q) joilla q p < j i. Taulukko siis kannattaa täyttää seuraavasti: vaiheessa 1 täytetään alkiot (1,1),(2,2),(3,3),...,(n, n). vaiheessa 2 täytetään alkiot (1,2),(2,3),(3,4)...,(n 1, n). vaiheessa 3 täytetään alkiot (1,3),(2,4),(3,5)...,(n 2, n).... vaiheessa l täytetään alkiot (1, l),(2, l + 1),(3, l + 2)...,(n l + 1, n).... vaiheessa n 1 täytetään alkiot (1, n 1) ja (2, n) vaiheessa n täytetään alkio (1, n). Siis vaiheessa l täytetään alkiot table(i, j), missä j = i + l 1. Lopuksi todetaan w L(G), jos ja vain jos S table(1, n). 170
171 Taulukon table täyttämisjärjestys tapauksessa w = 8. Alkioita table(i, j) missä j < i ei käytetä. i j vaihe 8 vaihe 7 vaihe 6 vaihe 5 vaihe 4 vaihe 3 vaihe 2 vaihe 1 : ei käytetä 171
172 Alkion table(i, j) täyttämiseen tarvitaan alkiot table(i, i),...,table(i, j 1) ja alkiot table(i + 1, j),...,table(j, j). i j Säännön A BC perusteella A table(3, 7), jos jokin seuraavista pätee: B table(3, 3) ja C table(4, 7) B table(3, 4) ja C table(5, 7) B table(3, 5) ja C table(6, 7) B table(3, 6) ja C table(7, 7)
173 Saadaan seuraava algoritmi [Sipser s. 267]: CYK(G, w) Oletus: G = (V, Σ, R, S) on Chomskyn normaalimuodossa if w = ε and S ε on sääntö then return True alusta table(i, j) kaikilla i ja j for i 1 to w vaihe 1 do for kaikille muuttujille A V do if A w i on sääntö then table(i, i) table(i, i) { A } for l 2 to n vaiheet 2,..., n do for i 1 to n l + 1 do j i + l 1 for k i to j 1 do for kaikille säännöille A BC do if B table(i, k) and C table(k + 1, j) then table(i, j) table(i, j) { A } if S tables(1, n) then return True else return False 173
174 Yhteenveto: Chomskyn normaalimuoto takaa, että lyhyille merkkijonoille myös johdot ovat lyhyitä (vrt. sivu 151), joten jäsentäminen on ainakin periaateessa mahdollista syötteen pituuden suhteen polynomisessa ajassa. Naiivi rekursiivinen Derives toimii oikein, mutta ei tehokkaasti. Varsinainen CYK-algoritmi laskee samat asiat kuin Derives, mutta organisoi laskennan tehokkaammin. CYK on esimerkki keskeisestä algoritmisuunnittelutekniikasta, jota kutsutaan taulukoinniksi eli dynaamiseksi ohjelmoinniksi: Ongelma jaetaan osaongelmiin. Ensin ratkaistaan kaikki pienemmät osaongelmat. Niiden ratkaisuista voidaan koota ratkaisut suurempiin osaongelmiin. Lopuksi saadaan ratkaisu koko ongelmaan. Turhalta näyttävä pienempien osaongelmien ratkaiseminen vähentää kuitenkin kokonaistyömäärää. 174
175 Esimerkki 2.18: Tarkastellaan merkkijonoa w = abba ja kielioppia S AB BC A AC a B AB b C a b Seuraavan taulukon mukaan S table(1,4) eli w kuuluu kieleen. Taulukkoon on lisäksi merkitty, mitkä välivaiheet ovat tuoneet muuttujan S joukkoon table(1, 4). i j A C S A B S A B S A 2 B C S 3 B C S 4 A C 175
176 CYK-algoritmissa kolme sisäkkäistä for-silmukkaa, joita kutakin iteroidaan O(n) kertaa. Siis algoritmin aikavaativuus on O(n 3 ), jos kieliopin koko lasketaan vakioksi. Korollaari 2.19: [Sipser Thm. 7.16] Millä tahansa yhteydettömällä kielellä L kysymys päteekö w L? voidaan ratkaista ajassa O( w 3 ). Kuten edellä mainittiin, CYK-algoritmi ei ole realistinen vaihtoehto ohjelmointikielen jäsentämiseen tms. Sovelluksissa käytetään tehokkaampia algoritmeja, jotka kuitenkin toimivat vain sopivasti rajatulle luokalle kielioppeja. 176
177 Pinoautomaatit (pushdown automaton, PDA) [Sipser luku 2.2] Pinoautomaatti on äärellinen automaatti, johon on lisätty rajoittamaton määrä muistia pinon (stack) muodossa. Näemme jatkossa, että kielen voi tunnistaa pinoautomaatilla, jos ja vain jos se on yhteydetön. Esimerkki 2.20: Kielen {0 n 1 n n N } voi hyväksyä pinon avulla seuraavaan tapaan: 1: jos seuraava merkki on 0 niin Push(0) mene kohtaan 1 muuten Pop mene kohtaan 2 2: jos seuraava merkki on 1 niin Pop mene kohtaan 2 Automaatti hyväksyy, jos pino on tyhjä kun merkkijono loppuu. 177
178 Ryhdymme nyt formalisoimaan pinoautomaattia. Kuten äärellisessä automaatissa, pinoautomaatissa on äärellinen tilajoukko Q, syöteaakkosto Σ, siirtymäfunktio δ, alkutila q 0 Q ja hyväksyvät tilat F Q. Lisäksi siinä on pinoaakkosto Γ, jonka alkioita voidaan tallentaa pinoon. Tarkastelemme alusta alkaen epädeterministisiä pinoautomaatteja. Siirtymäfunktio on nyt funktio δ: Q Σ ε Γ ε P(Q Γ ε ) (muistetaan, että Σ ε = Σ { ε } ja P tarkoittaa potenssijoukkoa). Perustulkinta: jos (q, c) δ(q, a, b), niin tilassa q voidaan lukea syötemerkki a, poimia pinon päältä merkki b ja siirtyä tilaan q. Samalla pinoon painetaan c. 178
179 Lisätulkinta siirtymälle (q, c) δ(q, a, b): jos a = ε, niin seuraavaa syötemerkkiä ei lueta; jos b = ε, niin pinosta ei poimita (eikä lueta) mitään; ja jos c = ε, niin pinoon ei paineta mitään. Muodollisesti pinoautomaatti M = (Q,Σ,Γ, δ, q 0, F) hyväksyy merkkijonon w Σ, jos jollain m N on olemassa w 1 Σ ε,..., w m Σ ε, joilla w = w 1... w m ; tilat r 0 Q,..., r m Q ja merkkijonot s 0 Γ,..., s m Γ ( pinon sisällöt ), missä r 0 = q 0 ja s 0 = ε (aluksi pino tyhjä) kaikilla i = 0,..., m 1 voidaan kirjoittaa s i = at ja s i+1 = bt, missä (r i+1, b) δ(r i, w i+1, a), ja r m F. 179
180 Tuttuun tapaan automaatti hylkää merkkijonot, joita se ei hyväksy. Automaatin tunnistama kieli koostuu sen hyväksymistä merkkijonoista. Esimerkki 2.21: [Sipser Ex. 2.14] Kieli {0 n 1 n n N } voidaan tunnistaa pinoautomaatilla M 1 = (Q,Σ,Γ, δ, q 1, F), missä Q = { q 1, q 2, q 3, q 4 }, Σ = {0,1}, Γ = {0,$}, F = { q 1, q 4 } ja δ on seuraava: syöte: 0 1 ε pino: 0 $ ε 0 $ ε 0 $ ε q 1 {(q 2,$) } q 2 {(q 2,0) } {(q 3, ε) } q 3 {(q 3, ε) } {(q 4, ε) } q 4 Siis esim. δ(q 3, ε,$) = {(q 4, ε) }. Koska formalismissa ei ole sisäänrakennettua pinon tyhjyystestiä, pinon pohjan merkiksi laitetaan $. Sama tekniikka toistuu jatkossa. 180
181 Esitetään sama havainnollisemmin tilakaaviona. Merkintä q a,b c q tarkoittaa (q, c) δ(q, a, b). ε, ε $ q 1 q 2 0, ε 0 1,0 ε q 4 ε,$ ε q 3 1,0 ε 181
182 Esimerkki 2.22: [Sipser Ex. 2.18] Kieli { ww R w {0,1} } voidaan tunnistaa seuraavalla periaatteella: 1. Syötteen ensimmäisen puolikkaan ajan paina merkkejä pinoon. 2. Syötteen toisen puolikkaan ajan poimi merkkejä pinosta ja vertaa juuri luettuun. Syötteen keskikohta arvataan epädeterministisesti. Itse asiassa tätä kieltä ei edes ole mahdollista tunnistaa PDA:n deterministisellä variantilla. ε, ε $ q 1 q 2 0, ε 0 1, ε 1 ε, ε ε q 4 ε,$ ε q 3 0,0 ε 1,1 ε 182
183 Esimerkki 2.23: Seuraava PDA hyväksyy ne merkkijonot, joissa on yhtä monta nollaa kuin ykköstä. Pinoaakkosto on Γ = { A, B, $ }. Pinossa pidetään kirjaa tähän mennessä luettujen nollien ja ykkösten määrien erosta. Esim. AAA$ tarkoittaa, että nollia on ollut kolme enemmän, ja BBBBB$, että ykkösiä on ollut viisi enemmän. 0, A A 0,$ $ ε, ε $ ε, ε A 0, B ε 1, A ε 1, B B 1,$ $ ε, ε B ε,$ ε 183
184 Yhteydettömien kielioppien ja pinoautomaattien yhteys [Sipser s ] Näemme, että yhteydettömien kielioppien tuottamat kielet ovat tasan samat kuin ne, jotka voidaan tunnistaa pinoautomaatilla. Aloitetaan helpommasta suunnasta. Lemma 2.24: [Sipser Lemma 2.21] Jos kieli on yhteydetön, se voidaan tunnistaa pinoautomaatilla. Todistuksen perusidea on laatia annetun kieliopin pohjalta pinoautomaatti, joka toteuttaa seuraavan algoritmin: Generoi: Tuota epädeterministisesti pinoon merkkijono w Σ, jolla S w. Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin hyväksy. Epädeterminismi on oleellista: valitsemalla generoimisvaiheessa sovellettavat säännöt epädeterministisesti varmistetaan, että jokaisella kieleen kuuluvalla merkkijonolla w on mahdollisuus tulla tuotetuksi. 184
185 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: 1. Alusta pinon sisällöksi S$, missä S on lähtösymboli ja $ merkitsee pinon pohjaa. 2. Toista seuraavaa: (a) Jos pinon huipulla on muuttujasumboli A, valitse epädeterministisesti sääntö A w. Korvaa A merkkijonolla w. (b) Jos pinon huipulla on päätesymboli, poista se pinosta ja vertaa seuraavaan syötemerkkiin. Jos ne eroavat, hylkää. (c) Jos pinon huipulla on $, hyväksy jos syöte on loppu; muuten hylkää. Tämä pitää vielä koodata pinoautomaatiksi. 185
186 Esimerkki 2.25: Tarkastellaan kielioppia ja merkkijonoa bbcca, jolla on johto S Sa T T btc ε S Sa Ta btca bbtcca bbcca. Haluamme muodostaa pinoautomaatin, joka syötteellä bbcca vuorotellen soveltaa pinoon ylläolevan johdon sääntöjä ja poistaa pinosta syötettä vastaavia päätemerkkejä. Pinon käyttäytymisen pitäisi siis olla seuraava: 186
187 jäljellä oleva syöte pinon sisältö bbcca ε bbcca $ bbcca S$ bbcca Sa$ bbcca Ta$ bbcca bt ca$ bcca Tca$ bcca bt cca$ cca Tcca$ cca cca$ ca ca$ a a$ ε $ ε ε 187
188 Jatkossa sallimme merkinnän (r, u) δ(q, a, s) myös, kun u = u 1... u l Γ (siis myös kun l > 1). Merkintä tarkoittaa tilassa q Q automaatti saa siirtyä tilaan r Q lukemalla syötemerkin a Σ ja poimimalla pinosta merkin s Γ ja painamalla pinoon merkit u l,..., u 1. Tapaukset a = ε ja s = ε sallitaan kuten ennenkin. 188
189 Muodollisesti merkintä tarkoittaa, että automaatissa on tilat q 1,..., q l 1, joilla (q 1, u l ) δ(q, a, s) δ(q 1, ε, ε) = {(q 2, u l 1 ) } δ(q 2, ε, ε) = {(q 3, u l 2 ) } δ(q l 1, ε, ε) = {(r, u 1 ) } ja joihin ei liity muita siirtymiä. Merkinnän (r, u 1 u 2 u 3 ) δ(q, a, s) kaavioesitys: q a, s u 1 u 2 u 3 r q a, s u 3 ε, ε u 2 q 1 q 2 ε, ε u 1 r 189
190 Lemman 2.24 todistus: Olkoon G = (V, Σ, R, S) yhteydetön kielioppi. Konstruoimme edellä esitetyn idean mukaisesti pinoautomaatin, joka tunnistaa kielen L(G). Automaatin runkona on kolme tilaa q start, q loop ja q accept. Alkutilana on q start ja ainoa hyväksyvä tila q accept. Aluksi viedään pinoon loppumerkki $ ja alkusymboli S siirtymällä kuvana δ(q start, ε, ε) = {(q loop, S$) }; start ε, ε S$ loop Lopuksi pinosta poimitaan loppumerkki $ siirtymällä kuvana δ(q loop, ε,$) = {(q accept, ε) }; loop ε,$ ε acc 190
191 Varsinainen laskenta tapahtuu kahdenlaisilla siirtymillä tilasta q loop itseensä: Kaikilla joukon R säännöillä A w tulee (q loop, w) δ(q loop, ε, A); kuvana loop ε, A w Tässä siis pinon huipulla olevasta muuttujasta A tuotetaan pinon huipulle merkkijono w. Kaikilla a Σ tulee (q loop, ε) δ(q loop, a, a); kuvana loop a, a ε Tässä siis pinon huipulla oleva päätemerkki a poistetaan ja samalla luetaan vastaava syötemerkki. Muita siirtymiä ei ole. Selvästi automaatti toteuttaa esitetyn epädeterministisen algoritmin kielen L(G) tunnistamiseksi. 191
192 Esimerkki 2.26: Edellisen esimerkin kielioppista saadaan seuraava pinoautomaatti: S Sa T T btc ε start ε, ε $ ε, ε S ε, T c ε, ε T ε, ε b ε, T ε ε, S T a, a ε b, b ε c, c ε loop ε,$ ε ε, S a ε, ε S acc 192
193 Haluamme todistaa myös käänteisen suunnan: Lemma 2.27: [Sipser Lemma 2.27] Pinoautomaatin tunnistama kieli on yhteydetön. Tämä suunta on hankalampi: meidän pitää osata purkaa mikä tahansa pinoautomaatti M ja kuvata sen tunnistama kieli yhteydettömänä kielioppina. Hahmottelemme seuraavassa lemman 2.27 todistuksen esimerkkinä hieman monimutkaisemmasta automaattiteoreettisesta konstruktiosta. Lemman todistus (luentokalvot ) kuitenkaan ei kuulu koealueeseen. 193
194 Teknisten yksityiskohtien helpottamiseksi todetaan ensin, että automaatista M on helppo muodostaa sellainen saman kielen tunnistava pinoautomaatti M, että 1. automaatissa M on tasan yksi hyväksyvä tila (merkitään sitä q accept ) 2. ennen hyväksymistä M aina tyhjentää pinonsa ja 3. siirtymiä on vain seuraavia lajeja: pop-siirtymä: poimii pinosta yhden merkin, ei paina mitään (a, s ε missä a Σ ε ja s Γ) ja push-siirtymä: painaa pinoon yhden merkin, ei poimi mitään (a, ε s missä a Σ ε ja s Γ). Ehdot 1 ja 2 saadaan helposti voimaan lisäämällä pinon loppumerkki ja ylimääräiset pinontyhjennystila ja hyväksyvä tila. Ehto 3 saadaan voimaan korvaamalla kukin siirtymä a, s s pop-push-yhdistelmällä ja kukin siirtymä a, ε ε push-pop-yhdistelmällä (yksi uusi tila per korjattava siirtymä). 194
195 Esimerkki 2.28: Tarkastellaan edellisen sivun ehdot (1) (3) toteuttavaa pinoautomaattia, jossa päätemerkkejä ovat a, b ja c ja pinoaakkosia d, e ja $: a, ε d b,d ε ε, ε $ b,d ε c, ε e c, ε e c, ε e 4 5 ε,e ε ε,$ ε Ongelmana on löytää yleiskäyttöinen menetelmä, jolla automaatista saadaan kielioppi. Tässä tapauksessa automaatti itse asiassa tunnistaa kielen {a n b n c m n 0, m > 0 }, joka voidaan tuottaa kieliopilla S XC X axb ε C cc c joten tiedämme, millaiselta oikea vastaus voisi näyttää. 195
196 Automaatin purkamisessa seuraavanlaisten tapahtumaketjujen analysoiminen osoittautuu keskeiseksi: aluksi automaatti on tilassa p Q ja pino on tyhjä siirtymät kuluttavat syötettä merkkijonon w Σ verran ja lopuksi automaatti on tilassa q Q ja pino on taas tyhjä. Tässä ajatellaan, että automaatti aluksi pakotetaan tilaan p ja sen pino tyhjennetään; emme ota kantaa siihen, voiko automaatti todella joutua tällaiseen tilanteeseen. Merkitsemme p w q, jos ylläesitetty tapahtumaketju on mahdollinen. Huomaa erityisesti, että automaatti hyväksyy merkkijonon w, jos ja vain jos q start w qaccept. Tavoitteena on muodostaa kielioppi, jossa muuttujina on A p,q kaikilla automaatin tiloilla p ja q A p,q w pätee, jos ja vain jos p w q. 196
197 Edellisen sivun määrittely ehdolle p w q on yhtäpitävää sen kanssa, että seuraava on mahdollista millä tahansa n N: aluksi automaatti on tilassa p ja pinossa on tasan n merkkiä, siirtymät kuluttavat syötettä merkkijonon w verran ja pinossa on koko ajan ainakin n merkkiä ja lopuksi automaatti on tilassa q ja pinossa on taas tasan n merkkiä. Ehto nimittäin sanoo, että siirtyessään tilasta p syötteellä w tilaan q automaatti ei kurki pinon vanhoja sisältöjä, joten pinon alkutilanteella ei ole merkitystä. Toisin sanoen laskennan edetessä tilasta p syötteellä w tilaan q pinossa alun perin olleisiin merkkeihin ei kosketa ja kaikki pinoon laskennan aikana painetut uudet merkit myös poistetaan sieltä. 197
198 Palataan nyt esimerkkiautomaattiimme ja tarkastellaan merkkijonon aabbc hyväksyvää laskentaa. Siirtymänuolten päälle on merkitty vastaavat syötemerkit, ja pinon sisältö on merkitty kunkin tilan kohdalle. d d d d e $ $ $ $ $ $ $ ε a a b b c ε ε Laskennasta voidaan havaita seuraavat episodit, jotka jättävät pinon ennalleen: 1 aabbc 6 (pino aluksi ja lopuksi tyhjä) 2 aabbc 5 (pinossa aluksi ja lopuksi $) 2 aabb 3 (pinossa aluksi ja lopuksi $) 2 ab 3 (pinossa aluksi ja lopuksi d$) 3 c 5 (pinossa aluksi ja lopuksi $) Tavoitteena on vangita tämä rakenne yhteydettömään kielioppiin. 198
199 Lemman 2.27 todistushahmotelma: Lähdemme siis liikkeelle pinoautomaatista M = (Q,Σ,Γ, δ, q start, { q accept }) ja muodostamme yhteydettömän kieliopin G, jolla L(G) = L(M). Oletamme, että automaatti täyttää sivun 194 ehdot (1) (3) eli erityisesti jokainen siirtymä on joko push-siirtymä tai pop-siirtymä. Edellä esitetyn mukaisesti kieliopin muuttujajoukoksi tulee { A p,q p, q Q }, ja kaikilla p, q Q halutaan A pq w jos ja vain jos p w q. Tarkastellaan laskentaa, jossa automaatti siirtyy tilasta p syötteellä w tilaan q siten, että pino sisältää laskennan aluksi ja lopuksi tasan samat merkit. Triviaalitapaus on, että p = q ja w = ε; tämä siis vastaa nollan pituista laskentaa. Siis kaikilla p Q pätee p ε p, joten voimme ottaa kielioppiin säännön A p,p ε. 199
200 Edellisen triviaalitapauksen lisäksi laskentoja p w q voi muodostua kahdella tavalla. Tapaus I: Jos p u r ja r v q, voidaan päätellä p w q, kun w = uv. Tässä siis tilasta p mennään ensin syötteellä u tilaan r, jossa pinon alkuperäinen sisältö toistuu ensimmäisen kerran. Tilasta r jatketaan syötteellä v tilaan q, jossa pinon sisältö toistuu kolmannen kerran. Kieliopin kannalta jos A p,r u ja Ar,q v, niin pitää olla Ap,q uv. Hoidamme tämän ottamalla kielioppiin säännöt kaikilla p, q, r Q. A p,q A p,r A r,q 200
201 Tapaus II: Jos joillain tiloilla r, s Q ja pinomerkillä t tilasta p voidaan siirtyä tilaan r viemällä pinoon merkki t tilasta s voidaan siirtyä tilaan q poimimalla pinosta merkki t ja tilasta r voidaan päästä tilaan s siten, että pinon sisältö on sama aluksi ja lopuksi niin tilasta p voidaan päästä tilaan q siten, että pinon sisältö on sama aluksi ja lopuksi. Ottamalla vielä huomioon siirtymiin liittyvät syötemerkit esitämme tämän tapauksen muodossa p a,ε t r v s b,t ε q, missä siis seuraa p w q, missä w = avb. Tästä saadaan kielioppiin säännöt A p,q aa r,s b kaikilla sellaisilla p, q, r, s Q ja a, b Σ ε, että (r, t) δ(p, a, ε) ja (q, ε) δ(s, b, t) jollain t Γ. 201
202 Kokoamme edellä esitetyn yhteen ja määrittelemme kieliopin G = (V,Σ, R, S) seuraavasti: V = { A pq p, q Q }, Σ on sama kuin automaatin syöteaakkosto, S = A qstart,q accept ja joukossa R on seuraavat säännöt: A pp ε kaikilla p Q. A pq A pr A rq kaikilla p, q, r Q, A pq aa rs b aina kun (r, t) δ(p, a, ε) ja (q, ε) δ(s, b, t) jollain t Γ Konstruktion oikeellisuus, eli että todella A p,q w jos ja vain jos p w q, seuraa kahdesta aputuloksesta: Väite A: Jos A pq w, missä w Σ, niin p w q. Väite B: Jos p w q, missä w Σ, niin A pq w. Nämä ovat Sipserin Claim 2.30 ja Claim 2.31; sivuutamme niiden induktiotodistukset. 202
203 Esimerkki 2.29: Tarkastellaan sivun 195 automaattia. Etsimällä siirtymäparit, joissa on push ja pop samalle pinosymbolille, saadaan seuraavat säännöt: Lähtösymboli on A 1,6. A 1,6 A 2,5 A 2,5 ca 4,4 A 2,3 aa 2,2 b A 3,5 ca 4,4 A 2,3 aa 2,3 b A 5,5 ca 4,4 Lisäksi kielioppiin tulee säännöt A p,p ε, missä p = 1,...,6, ja suuri joukko muotoa A p,q A p,r A r,q olevia sääntöjä. Suurin osa näistä on kuitenkin turhia. Esim. sääntö A 1,6 A 1,5 A 5,6 toisi mukaan muuttujan A 5,6, josta ei enää pääse eroon, eli säännöllä ei saada yhtään päätemerkkijonoa. Tarpeellisia ovat A 2,5 A 2,3 A 3,5 A 2,5 A 2,5 A 5,5 A 4,4 ε A 2,2 ε 203
204 Nyt merkkijonolle aabbc saadaan johto A 1,6 A 2,5 A 2,3 A 3,5 aa 2,3 ba 3,5 aaa 2,2 bba 3,5 aabba 3,5 aabbca 4,4 aabbc. Vertaa tässä esiintyviä muuttujanimiä sivulla 198 esitettyihin laskentoihin 1 aabbc 6 2 aabbc 5 2 aabb 3 2 ab 3 3 c 5 ja sivujen tapauksiin I ja II. Kielioppi ei ole sama kuin sivulla 191 annettu, missä ei ole mitään ihmeellistä, sillä samalle kielelle on tietysti yleensä useita erilaisia kielioppeja. 204
205 Yhdistämällä Lemmat 2.24 ja 2.27 saadaan Lause 2.30: [Sipser Thm. 2.20] Kieli on yhteydetön, jos ja vain jos se voidaan tunnistaa pinoautomaatilla. Huomaa, että tästä ei seuraa, että osaisimme millä tahansa yhteydettömällä kielellä A ja merkkijonolla w ratkaista tehokkaasti, päteekö w A. Pinoautomaatin toiminnassa epädeterminismi on oleellista, ja vastauksen saamiseksi voidaan joutua kokeilemaan hyvin suurta määrää erilaisia laskentoja. Kuten sivulla 166 mainittiin, tehokkaat jäsennysalgoritmit tekevät lisäoletuksia kieliopista. Yleisessä tapauksessa voidaan käyttää CYK-algoritmia, joka vaatii ajan O( w 3 ) (eikä perustu automaattiin). Tilanne on siis tässä suhteessa erilainen kuin säännöllisten kielten ja äärellisten automaattien tapauksessa. Voimme kuitenkin todeta seuraavan tuloksen (jonka voi todistaa helpomminkin): Korollaari 2.31: Säännölliset kielet ovat yhteydettömiä. Todistus: Jos kieli voidaan tunnistaa äärellisellä automaatilla, se voidaan tietysti tunnistaa pinoautomaatilla. 205
206 Ei-yhteydettömät kielet [Sipser luku 2.3] Jäsennyspuita tarkastelemalla voimme osoittaa esim. että kieli {a n b n c n n N } ei ole yhteydetön. Tämä perustuu samatapaiseen pumppausominaisuuteen kuin ei-säännöllisyyttä osoitettaessa. Lause 2.32 (Yhteydettömien kielten pumppauslemma): [Sipser Thm. 2.34] Jos A on yhteydetön kieli, niin sille on olemassa pumppauspituus p N, jolle seuraava pätee: jos s A ja s p niin voidaan kirjoitaa s = uvxyz, missä 1. uv i xy i z A kaikilla i N, 2. vy > 0 ja 3. vxy p. 206
207 Eroksi säännöllisistä kielistä tässä siis pumpataan merkkijonoa kahdesta kohdasta samaan tahtiin. Muuten lemman soveltamiseen pätevät samat perushuomiot kuin säännöllisten kielten tapauksessa: Lemmaa käytetään yleensä epäsuorassa todistuksessa osoittamaan kieli ei-yhteydettömäksi. Tällöin merkkijono s voidaan valita sopivalla tavalla helpottamaan todistusta. Sen sijaan jakoa s = uvxyz ei voi itse valita, vaan kaikki mahdollisuudet on käsiteltävä. Lemmalla ei voi todistaa kieltä yhteydettömäksi: myös ei-yhteydetön kieli voi toteuttaa pumppausehdon. 207
208 Ennen yhteydettömien kielten pumppauslemman todistusta käymme läpi esimerkin sen soveltamisesta. Lause 2.33: [Sipser Example 2.36] Kieli A = {a n b n c n n N } ei ole yhteydetön. Todistus: Tehdään vastaoletus, että A on yhteydetön. Sillä on siis pumppauspituus p. Valitaan s = a p b p c p. Selvästi s A ja s p. Olkoon nyt s = uvxyz. Jos vxy p, niin vxy ei voi sisältää sekä a- että c-merkkejä. Tarkastellaan tapausta, että vxy ei sisällä a-merkkejä. Jos vy > 0, niin vy kuitenkin sisältää b- tai c-merkkejä (tai molempia). Siis uvvxyyz sisältää b- tai c-merkkejä enemmän kuin a-merkkejä, joten uvvxyyz A. Tapaus, jossa vxy ei sisällä c-merkkejä, käsitellään samaan tapaan. Siis mikään jako s = xyzuv ei toteuta kaikkia pumppauslemman ehtoja; ristiriita. Intuitiivisesti siis yhteydettömällä kieliopilla, tai pinoautomaatilla, ei pysty vertailemaan kolmea eri lukumäärää samanaikaisesti. 208
209 Edellisestä esimerkistä nähdään myös tärkeä ero yhteydettömien ja säännöllisten kielten sulkeumaominaisuuksissa: Korollaari 2.34: Yhteydettömien kielten luokka ei ole suljettu leikkauksen eikä komplementin suhteen. Todistus: Olkoon A 1 = {a m b m c n m, n N } ja A 2 = {a m b n c n m, n N }. Kielet A 1 ja A 2 ovat yhteydettömiä, mutta niiden leikkaus on edellisen lauseen ei-yhteydetön kieli A. Siis yhteydettömien kielten luokka ei ole suljettu leikkauksen suhteen. Tehdään nyt vastaoletus, että yhteydettömien kielten luokka on suljettu komplementin suhteen. Koska A B = A B ja yhteydettömien kielten luokka on suljettu yhdisteen suhteen, luokka on suljettu myös leikkauksen suhteen; ristiriita. 209
210 Yhteydettömien kielten pumppauslemman todistus: Todistuksen perusajatus on seuraava: Jos s on kielen A merkkijono, sillä on jäsennyspuu sopivassa kielen A kieliopissa. Jos lisäksi s on kovin pitkä, jäsennyspuussa on oltava ainakin yksi pitkä haara. Kun jäsennyspuun haara on riittävän pitkä, ainakin yhden muuttujan R on pakko esiintyä ainakin kaksi kertaa (kyyhkyslakkaperiaate). Muuttujan R esiintyminen omana jälkeläisenään jäsennyspuussa tarkoittaa, että R vry joillakin v, y Σ. Voimme pumpata tätä: R vry vvryy vvvryyy
211 Tilanne kuvana: S R R S S R u v x y z R x R u z R u v y z v x y Vasen versio esittää alaspäin pumppaamista. 211
212 Jos asiaa ajatellaan johtojen kannalta, niin alkutilanteessa nähdään S urz uvryz uvxyz, missä sekä R vry että R x, ja u, v, x, y, z Σ. Näitä uudelleen yhdistelemällä saadaan johdot S urz uxz S urz uvryz uvvryyz uvvxyyz S urz uvryz uvvryyz uvvvryyyz uvvvxyyyz
213 Täsmennetään nyt, mitä edellä esitetyssä hahmotelmassa tarkoittaa pitkä. Olkoon A = L(G) jollain yhteydettömällä kieliopilla G = (V, Σ, R, S). Olkoon b suurin minkään säännön oikealla puolella olevien symbolien määrä. Siis jäsennyspuun millään solmulla ei ole yli b lasta. Jos jäsennyspuun syvyys on h, siinä on korkeintaan b h lehteä. (Syvyys on kaarten lukumäärä pisimmällä polulla juuresta lehteen.) Valitaan p = b V +1. Siis jos merkkijonon pituus on vähintään p, sen jäsennyspuun syvyys on ainakin V
214 Olkoon nyt s A sellainen, että s p. Olkoon τ merkkijonon s jäsennyspuu; jos niitä on useita, valitaan vähiten solmuja sisältävä. Valitaan puusta τ pisin polku juuresta lehteen. Edellisen perusteella polulla on enemmän kuin V kaarta ja siis ainakin V + 2 symbolia. Näistä vain viimeinen on päätesymboli. Kyyhkyslakkaperiaatteen nojalla erityisesti polun viimeisten V + 2 symbolin joukossa ainakin yksi muuttuja esiintyy ainakin kaksi kertaa. Olkoon R tällainen. Nyt s voidaan kirjoittaa muotoon s = uvxyz, missä x on symbolin R alemmasta esiintymästä tuotettu merkkijono ja vxy ylemmästä esiintymästä. (Tämä vastaa sivun 211 kuvan keskimmäistä puuta.) 214
215 Jäsennyspuuta vastaava johto voidaan jakaa osiin S urz uvryz uvxyz, missä R vry ja R x. Näin ollen myös ja S urz uxz S urz uvryz uvvryyz... millä tahansa i 1. Siis uv i xy i z A kaikilla i N. uv i Ry i z uv i xy i z Koska jäsennyspuun oletettiin olevan pienin mahdollinen, ei voi olla v = y = ε, vaan vy > 0. Koska symbolin R ylemmän esiintymän korkeus on korkeintaan V + 1, siitä tuotetun merkkijonon vxy pituus on korkeintaan b V +1 = p. 215
216 Toinen perusesimerkki yhteydettömien kielten pumppauslemmasta osoitaa intuitiivisesti esim. sen, että yhteydettömällä kieliopilla ei voi esittää sellaisia ohjelmointikielten rajoituksia kuin muuttuja pitää määritellä ennen käyttöä. Esimerkki 2.35: [Sipser Ex. 2.38] Kieli B = { ww w {0,1} n } ei ole yhteydetön. Vastaoletus: B on yhteydetön ja sillä on pumppauspituus p. Valitaan s = 0 p 1 p 0 p 1 p B. Koska s p, voidaan kirjoittaa s = uvxyz kuten pumppauslemmassa. Jos vxy sisältyy kokonaan merkkijonon s alkupuoliskoon, niin uxz = 0 i 1 j 0 p 1 p, missä i + j = 2p vy < 2p. Siis merkkijonon uxz alkupuolisko loppuu 0:aan, joten uxz ei ole muotoa ww; ristiriita. Samoin nähdään, että vxy ei voi kokonaan sisältyä loppupuoliskoon. Jäljelle jää mahdollisuus, että jonon 0 p 1 p 0 p 1 p = uvxyz keskikohta osuu pätkään uxz. Nyt uxz = 0 p 1 i 0 j 1 p, missä i < p tai j < p. Taaskaan uxz ei ole muotoa ww; ristiriita. 216
217 Kurssi tähän asti: säännölliset ja yhteydettömät kielet säännölliset yhteydettömät kaikki kielet { a n } { a n b n } { a n b n c n } 217
218 Kurssi lähti liikkeelle yksinkertaisista laskennan malleista: mitä niillä voidaan esittää, millaisia ilmiöitä havaitaan. Laskennan formalisointi perustuu joukko-oppiin ja logiikkaan, mahdollistaa matemaattisen täsmälliset päättelyt edellyttää idealisointia (mielivaltaisen pitkät syötteet jne.) tärkeä erityisseikka: epädeterminismi Proseduraalisuus ja deklaratiivisuus saman asian määrittely proseduraalisesti automaatilla tai deklaratiivisesti kieliopilla tärkeät ekvivalenssitulokset: A tunnistettavissa DFA:lla A tunnistettavissa PDA:lla A esitettävissä säänn. lausekkeena A tuotettavissa CFG:llä siirrytään tarpeen mukaan proseduraalisesta deklaratiiviseen esitykseen tai toisin päin 218
219 Ylärajat ongelmien vaikeudelle: esim. mikä tahansa säännöllinen kieli voidaan tuottaa CFG:llä todistukset tyypillisesti konstruktiivisia (esim. CFG PDA) erikoistapaus konstruktiosta: simulaatio (esim. NFA DFA) konstruktion oikeellisuus todistetaan induktiolla (jos ei muuten selvä) Alarajat ongelmien vaikeudelle: esim. kieli {0 n 1 n n N } on vaikeampi kuin mihin äärellinen automaatti pystyy lähtökohtana formalisoitu laskentamalli todistetaan voimakas aputulos (esim. pumppauslemma) laskentamallin määritelmän perusteella sovelletaan aputulosta esimerkkitapauksiin (usein epäsuora todistus), laskentamallin yksityiskohdista ei enää tarvitse välittää teknisesti vaikeita (myös alan ammattilaisille) 219
220 Hierarkia: esim. säännölliset kielet ovat yhteydettömien kielten aito aliluokka simulaatio: säännölliset kielet ovat yhteydettömiä erottelu: kieli {0 n 1 n n N } on yhteydetön (yläraja), mutta ei säännöllinen (alaraja) Siirrymme seuraavaksi tarkastelemaan Turingin konetta: edellä esitellyt ilmiöt toistuvat tekniset yksityiskohdat monimutkaisempia tulokset kiinnostavia, koska Turingin kone on malli oikealle tietokoneelle (tai mille tahansa nykytietämyksen valossa mahdolliselle laskentalaitteelle) 220
221 3. Turingin koneet Turingin kone on alkuaan matemaattisen logiikan tarpeisiin kehitelty laskennan malli. Tarkoituksena oli vangita mahdollisimman laajasti, millaisia asioita voidaan (periaatteessa) laskea mekaanisesti. Malli on sittemmin osoittautunut sopivaksi myös oikeiden tietokoneiden ymmärtämiseen. Tämän luvun jälkeen opiskelija osaa esittää yksinkertaisia algoritmeja täsmällisesti käyttäen Turingin konetta ja sen muunnelmia hieman monimutkaisemmille algoritmeille osaa kuvata periaatetasolla toteutuksen Turingin koneella tuntee Churchin-Turingin teesin ja osaa sen avulla selittää Turingin koneen yhteyden yleiseen algoritmin käsitteeseen. Turingin koneen rajoituksia tarkastellaan lähemmin seuraavassa luvussa. 221
222 Turingin kone [Sipser luku 3.1] Turingin kone (Turing machine, TM) on automaatti, jossa on rajoittamaton määrä muistia. Toisin kuin pinoautomaatissa, muistialkioita voi käsitellä mielivaltaisessa järjestyksessä. Turingin koneen peruskomponentit ovat 1. äärellinen joukko tiloja (state), kuten DFA:ssa ja PDA:ssa, 2. rajoittamattoman pituinen nauha (tape), joka aluksi sisältää syötteen ja laskennan aikana toimii apumuistina ja 3. liikuteltava nauhapää (tape head, read/write head), joka osoittaa seuraavaksi vuorossa olevaa symbolia nauhalla. Turingin koneen yksityiskohdat voidaan määritellä monella eri tavalla, ja laskentavoimaltaa samaan lopputulokseen voidaan päätyä myös aivan toisennäköisistä lähtökohdista. Otamme tässä perustaksi mahdollisimman yksinkertaisen mallin. 222
223 Kuten muutkin käsittelemämme automaatit, Turingin kone saa syötteenä merkkijonon, jonka sitten hyväksyy tai hylkää: 1. Aluksi syöte on nauhan alussa ja nauhan loppu sisältää pelkkiä tyhjämerkkejä (blank). Nauhapää osoittaa nauhan alkuun. 2. Yhdessä laskenta-askelessa kone lukee nauhapään alla olevan symbolin, valitsee seuraavan tilan, kirjoittaa nauhapään kohdalle uuden symbolin (vanha häviää) ja siirtää nauhapäätä vasemmalle tai oikealle. 3. Tilojen joukossa on hylkäävä ja hyväksyvä lopputila, joihin päätyminen lopettaa laskennan välittömästi. Jos laskenta ei koskaan päädy hyväksyvään tai hylkäävään tilaan, se on silmukassa. 223
224 Tarkastellaan esimerkkinä kielen A = {a n b n c n n N } tunnistamista Turingin koneella. Periaate on seuraava: 1. Kelaa nauhaa oikealle, kunnes löytyy joko (yliviivaamaton) a, tai (mahdollisesti yliviivattu) b tai c. Jos löytyi muuta kuin a, siirry kohtaan 5. Muuten viivaa yli löytynyt a. 2. Kelaa nauhaa oikealle, kunnes löytyy joko (yliviivaamaton) b, tai (mahdollisesti yliviivattu) c. Jos löytyi tai c, niin hylkää. Muuten viivaa yli löytynyt b. 3. Kelaa nauhaa oikealle, kunnes löytyy joko (yliviivaamaton) c tai. Jos löytyi, niin hylkää. Muuten viivaa yli löytynyt c. 4. Kelaa nauha alkuun ja siirry kohtaan Jos nauhalla on jäljellä yliviivaamattomia a-, b- tai c-symboleita, niin hylkää, muuten hyväksy. Huomaa, että tähän ei pinoautomaatti pysty (kieli A ei ole yhteydetön). 224
225 Täsmällisemmin Turingin kone on seitsikko (Q,Σ,Γ, δ, q 0, q accept, q reject ), missä 1. Q on äärellinen tilajoukko, 2. Σ on syöteaakkosto, joka ei sisällä tyhjämerkkiä, 3. Γ on nauha-aakkosto, jolle Γ ja Σ Γ, 4. δ: Q Γ Q Γ {L,R} on siirtymäfunktio, missä Q = Q { q accept, q reject }, 5. q 0 Q on alkutila, 6. q accept Q on hyväksyvä tila ja 7. q reject Q on hylkäävä tila, jolla q reject q accept. Perustulkinta: Jos δ(q, a) = (q, b, D), niin tilasta q symbolillä a kone siirtyy tilaan q, kirjoitaa symbolin b (joka korvaa vanhan symbolin a) ja siirtää nauhapäätä yhden askelen suuntaan D (missä L = vasen ja R = oikea). Jos laskenta päätyy tilaan q accept tai q reject, se pysähtyy välittömästi ja syöte on vastaavasti hyväksytty tai hylätty. 225
226 Esitetään kielen A = {a n b n c n n N } tunnistava kone tässä formalismissa. Syöteaakkosto on siis Σ = { a, b, c }. Nauha-aakkostoksi valitsemme Γ = { a, b, c,, X, Y }, missä X ja Y esittävät yliviivattuja b- ja c-symboleja. Yliviivatut a:t esitetään tyhjällä, mikä helpottaa nauhan alkukohdan käsittelyä. Siirtymäfunktio voidaan esittää kaaviona, jossa q a b,d q tarkoittaa δ(q, a) = (q, b, D) ja q a,b,c,d D q tarkoittaa δ(q, x) = (q, x, D) kun x { a, b, c, d }. Kaaviota voidaan yksinkertaistaa jättämällä pois tila q reject ja siihen johtavat siirtymät, mutta tässä näin ei ole tehty. (Kaavio seuraavalla sivulla.) 226
227 a,x R b,y R R a,r b X,R c Y,L a,b,c,x,y L c,y, X, R b,c,y R R a,x, R 4 R acc rej X,Y R a,b,c R 227
228 Turingin koneen tilanne (configuration) koostuu kolmesta komponentista: 1. koneen tila, 2. nauhan sisältö ja 3. nauhapään sijainti. Koodaamme tilanteen merkkijonoksi uqv, missä q Q, u = u 1... u m Γ ja v = v 1... v n Γ joillain m, n N. Tulkinta: 1. kone on tilassa q, 2. nauhan sisältö on u 1... u m v 1... v n... ja 3. nauhapää osoittaa symbolia v 1. Koneen alkutilanne syötteellä w on q 0 w. Koneen lopputilanteita eli pysähtymistilanteita (halting configuration) ovat hyväksyvät tilanteet uq accept v ja hylkäävät tilanteet uq reject v kaikilla u, v Γ. 228
229 Jos tilanteesta uqv kone menisi seuraavaksi tilanteeseen u q v, niin tilanne uqv johtaa suoraan (yields) tilanteen u q v, mitä merkitään uqv u q v. Esitetään siirtymäfunktion semantiikka tätä formalismia käyttäen. Olkoot u, v Γ ja a, b Γ. Jos δ(q, a) = (q, b,r), niin uqav ubq v. Edellisen erikoistapaus: jos δ(q, sama tilanne kuin uq ). ) = (q, b,r), niin uq ubq (sillä uq on Jos δ(q, a) = (q, b,l), niin ucqav uq cbv kaikilla c Γ. Jos δ(q, a) = (q, b,l), niin qav q bv (ts. jos nauhapää yrittäisi siirtyä alkukohdasta vasemmalle, se jää paikalleen). 229
230 Esimerkkinä sivun 227 koneen hyväksyntä syötteelle aabbcc: q 0 aabbcc q 1 abbcc aq 1 bbcc axq 2 bcc axbq 2 cc axq 3 byc aq 3 XbYc q 3 axbyc q 3 axbyc q 0 axbyc q 1 XbYc Xq 1 byc XXq 2 Yc XXYq 2 c XXq 3 YY Xq 3 XYY q 3 XXYY q 3 XXYY q 0 XXYY Xq 4 XYY XXq 4 YY XXYq 4 Y XXYYq 4 XXYY q accept 230
231 Jos on olemassa tilanteet u 1 q 1 v 1,..., u n q n v n, missä u i q i v i u i+1 q i+1 v i+1 kaikilla 1 i n 1, sanomme että tilanne u 1 q 1 v 1 johtaa tilanteeseen u n q n v n ja merkitsemme u 1 q 1 v 1 u n q n v n. Jos q 0 w uq accept v joillain u, v Γ, niin kone hyväksyy merkkijonon w. Jos q 0 w uq reject v joillain u, v Γ, niin kone hylkää merkkijonon w. Jos kone hyväksyy tai hylkää merkkijonon w, sanomme, että se pysähtyy (halts) syötteellä w. Muuten se jää silmukkaan (loops), mikä voi ilmetä mielivaltaisen monimutkaisena loputtomana tilannejonona. 231
232 Turingin koneen M tunnistama kieli on L(M) = { w Σ M hyväksyy w:n }. Jos A = L(M), kieli A on Turing-tunnistettava tai lyhyesti tunnistettava (recognizable). Historiallisista syistä Turing-tunnistettavia kieliä sanotaan myös rekursiivisesti numeroituviksi (recursively enumerable); nimitys liittyy vain epäsuorasti ohjelmointikielissä käytettävään rekursioon. Huom. komplementti L(M) sisältää ne merkkijonot, joilla M hylkää tai jää silmukkaan. Jos M pysähtyy kaikilla syötteillä, se on ratkaisija (decider). Ratkaisijoita sanotaan myös totaalisiksi Turingin koneiksi. Jos A = L(M), missä M on ratkaisija, niin A on Turing-ratkeava tai lyhyesti ratkeava (decidable). Ratkeavia kieliä sanotaan myös rekursiivisiksi (recursive). (Osoitamme myöhemmin, että A on ratkeava, jos ja vain jos sekä A että A ovat tunnistettavia.) 232
233 Esimerkki 3.1: Kieli B = { ww w {0,1} } voidaan tunnistaa seuraavalla periaatteella: Vaihe I: Merkkijonon alkupuoliskossa korvaa 0 a ja 1 b ja loppupuoliskossa 0 A ja 1 B. Esim tulee muotoon aababbaa. Parittoman mittaiset syötteet hylätään. Toteutus: 1. Vaihda nauhalta ensimmäinen 0- tai 1-symboli vastaavasti a:ksi tai b:ksi. 2. Vaihda nauhalta viimeinen 0- tai 1-symboli vastaavasti A:ksi tai B:ksi. Jos nollia tai ykkösiä ei löytynyt, hylkää. 3. Jos nollia tai ykkösiä vielä on, palaa kohtaan 1. Muuten siirry vaiheeseen II. Vaihe II: Lopusta alkaen vertaa, että kutakin A-symbolia vastaa a-symboli ja B-symbolia vastaa b-symboli. Toteutus: 4. Etsi nauhan oikeanpuoleisin A tai B ja viivaa yli. Jos se oli A, etsi oikeanpuoleisin a tai b. Jos tämä on a, viivaa yli. Muuten hylkää. Jos se oli B, etsi oikeanpuoleisin a tai b. Jos tämä on b, viivaa yli. Muuten hylkää. 5. Jos A:t ja B:t loppuivat, hyväksy. Muuten palaa kohtaan
234 Alla olevaan kaavioon ei selkeyden vuoksi ole piirretty hylkäävää tilaa q reject. Kaikki kuvasta puuttuvat siirtymät vievät siihen. R acc 0 a,r 1 b,r 0,1 R a,b R A,B,X L R A X,L,A,B L a X,R 0,1 L 0,1 L X L A,B R X R 0 A,L 1 B,L A,B R L B X,L A,B R b X,R a,b R A,B,X L 234
235 Kuten edellisestä esimerkistä havaitaan, Turingin koneista (kuten muistakin automaateista) tulee nopeasti hyvin monimutkaisia. Monimutkaisten Turingin koneiden kaavioesitysten piirtäminen ei ole kiinnostavaa tämän kurssin kannalta (eikä yleensä muutenkaan). Turingin kone on tarkoitettu yleiseksi laskentaformalismiksi, jota käyttäen voidaan esittää mikä tahansa algoritminen laskenta. Mallin motivaatio on siis erilainen kuin tietoisesti rajatuissa malleissa (DFA, PDA jne.). Seuraavassa esitellään esimerkinomaisesti Turingin koneiden ohjelmointitekniikoita tavoitteena vakuuttua, että mikä tahansa algoritmi voidaan koodata Turingin koneeksi. Kun olemme vakuuttuneet tästä, voimme tyytyä kirjoittamaan esim. pseudokoodia ja unohtaa Turingin kone -toteutuksen yksityiskohdat. (Jos taas emme olisi vakuuttuneet tästä, Turingin koneiden piirtelemisessä ei kuitenkaan olisi mitään järkeä, koska tällöin emme olisi vakuuttuneet, että Turingin kone kelpaa malliksi sille, mitä haluamme mallintaa.) 235
236 Esimerkki 3.2: [Sipser Ex. 3.11] Tarkastellaan kertolaskun tarkastamista eli kielen C = { a i b j c k i, j, k 1 ja k = i j } tunnistamista. Turingin kone toimii seuraavasti: 1. Selaa syöte vasemmalta oikealle ja tarkista, että se on muotoa a + b + c +. Jos ei ole, niin hylkää. 2. Palauta nauhapää nauhan alkuun. 3. Viivaa yli vasemmanpuoleisin a ja selaa seuraavaan b:hen. Kelaa edestakaisin b- ja c-osien välillä merkaten aina yksi b ja yksi c kerrallaan. Jos c:t loppuvat, hylkää. Muuten kun b:t on kaikki merkattu, siirry kohtaan Poista merkit kaikista b:istä. Jos a:ita on jäljellä, mene kohtaan 3. Muuten jos kaikki c:t on merkattu, niin hyväksy, muuten hylkää. 236
237 Joitain toteutusteknisiä yksityiskohtia: Kohta 1 on helppo, koska koneen riittää toimia kuin äärellinen automaatti. Kohtaa 2 varten nauhan alkukohta pitää merkata esim. vaihtamalla ensimmäinen a tyhjämerkiksi (kuten edellä). Kohdassa 3 symbolin b merkkaaminen tapahtuu esim. kirjoittamalla sen tilalle ˇb, missä ˇb on nauha-aakkostoon lisätty uusi symboli. Jatkossa oletamme, että Turingin kone osataan tarvittaessa toteuttaa edellisen tapaisen (tai vielä korkeammantasoisen) kuvauksen perusteella. Olemme siis todenneet, että edellä esitetyt kielet A, B ja C ovat Turing-tunnistettavia. Koska kaikki esitetyt koneet pysähtyvät kaikilla syötteillä, kielet ovat vieläpä ratkeavia. 237
238 Turingin koneen muunnelmia [Sipser luku 3.2] Turingin koneen yksityiskohdat voidaan määritellä monella tavalla, jotka antavat samat tunnistettavien ja ratkeavien kielten luokat. Muunnelma 1: Sallitaan siirtymäfunktion olla muotoa δ: Q Γ Q Γ {L,R,S}. Suunta S tarkoittaa, että nauhapää pysyy paikoillaan (stay put). Koska kukin S-siirtymä voidaan korvata peräkkäisillä R- ja L-siirtymällä (lisäten tarvittaessa uusi tila), niiden salliminen ei lisäisi mallin laskentavoimaa. Muunnelma 2: Nauha jatkuu äärettömän pitkälle myös vasemmalle. Syötteellä w = w 1... w n nauhan sisältö on aluksi... w 1... w m... ja nauhapää osoittaa symbolia w 1. Kahteen suuntaan äärettömän nauhan sisältö... a 2 a 1 a 0 a 1 a 2..., missä a i Γ, voidaan esittää perusmallissa muodossa (a 1, a 0 )(a 2, a 1 )(a 3, a 2 )..., missä nauha-aakkostona on Γ 2. Tästä on helppo nähdä, että mallin laskentavoima ei taaskaan kasva. Tärkeämpiä muunnelmia ovat moninauhaiset ja epädeterministiset koneet. 238
239 Moninauhainen Turingin kone (multitape TM) Moninauhaisessa Turingin koneessa on useita nauhoja ja kullakin oma nauhapäänsä. Nauhoille voidaan kirjoittaa ja nauhapäitä siirtää toisistaan riippumatta. Siirtymäfunktio k-nauhaiselle Turingin koneelle on muotoa δ: Q Γ k Q Γ k {L,R,S} k. Siirtymä δ(q, a 1,..., a k ) = (q, b 1,..., b k, D 1,..., D k ) tarkoittaa, että jos niin kone on tilassa q ja kaikilla 1 i k nauhapään i kohdalla on symboli a i kone siirtyy tilaan q ja kaikilla 1 i k nauhalle i kirjoitetaan symboli b i ja nauhapää i siirtyy suuntaan D i. Alkutilanteessa ykkösnauha sisältää syötteen ja muut ovat tyhjiä. 239
240 Koneet ovat ekvivalentit, jos ne tunnistavat saman kielen. Lause 3.3: [Sipser Thm. 3.13] Jokaiselle moninauhaiselle Turingin koneelle on olemassa ekvivalentti yksinauhainen Turingin kone. Todistus: Olkoon M k-nauhainen kone, jonka nauha-aakkosto on Γ. Muodostamme ekvivalentin yksinauhaisen koneen S, jonka nauha-aakkostoksi tulee Γ { ǎ a Γ } {#}. Tässä ǎ Γ on symbolin a merkattu versio kaikilla a Γ, ja # Γ uusi välimerkki. Perusidea esimerkin valossa: Oletetaan, että kolminauhaisen koneen nauhojen sisällöt ovat nauha 1: aabb... nauha 2:... nauha 3: missä nauhapään sijainti on alleviivattu. Tämä esitetään yhdellä nauhalla muodossa nauha: aǎbb# ˇ#001ˇ001#
241 Tarkemmin S on kone, joka syötteellä w = w 1... w n toimii seuraavasti: 1. Alusta nauhan sisällöksi # ˇw 1 w 2 w 3... w n # ˇ#ˇ#...#... missä #-merkkejä on k + 1 kappaletta. 2. Simuloi yksi koneen M laskenta-askel seuraavasti: (a) Selaa koko nauha ensimmäisestä viimeiseen #-merkkiin. Pane muistiin, mitkä merkatut symbolit (ǎ) esiintyivät ja missä järjestyksessä. Vaihtoehtoja on äärellinen määrä Γ k, joten ne voidaan koodata koneen S tiloihin. (b) Päätä koneen M uusi tila siirtymäfunktion mukaisesti. (c) Selaa nauha takaisin alkuun ja samalla muuta merkittyjä symboleita koneen M siirtymäfunktion mukaisesti. Jos jokin nauhapään merkki siirtyy oikealle #-merkin päälle, tee tilaa siirtämällä koko nauhan loppuosa askel oikealle. 3. Jos koneen M uusi tila on hyväksyvä, niin hyväksy. Jos koneen M uusi tila on hylkäävä, niin hylkää. Muuten jatka kohdasta
242 Korollaari 3.4: [Sipser Cor. 3.15] Kieli on Turing-tunnistettava (-ratkeava), jos ja vain jos jokin moninauhainen Turingin kone tunnistaa (vast. ratkaisee) sen. Todistus: Vain jos -suunta on ilmeinen. Jos -suunta seuraa edellisestä konstruktiosta, jossa simuloiva S pysähtyy, jos ja vain jos simuloitava M pysähtyy. Reunahuomautus: Oletetaan, että k-nauhainen kone M syötteellä w pysähtyy T askelessa. Jos T w, millekään nauhalle ei tule yli T symbolia. Siis simuloivassa koneessa S nauhalle tulee O(kT) symbolia. Yhden simulointiaskelen toteuttamiseksi S joutuu pahimmillaan siirtämään nauhan sisältöä oikealle k kertaa. Siis yksi koneen M askel vie pahimmillaan O(k 2 T) koneen S askelta, ja koko laskenta O(k 2 T 2 ) askelta. Sanomme, että Turingin kone toimii polynomisessa ajassa, jos syötteen x käsittelemiseen kuluvien laskenta-askelien määrä on O( x k ) jollain k N. Näemme siis, että jos kieli voidaan tunnistaa polynomisessa ajassa moninauhaisella koneella, se voidaan tunnistaa polynomisessa ajassa myös yksinauhaisella koneella. 242
243 Epädeterministinen Turingin kone Kuten muidenkin automaattien tapauksessa, epädeterministisessä Turingin koneessa siirtymäfunktio antaa joukon mahdollisia seuraajia. Se siis on tyyppiä δ: Q Γ P(Q Γ {L,R}). Merkintä yleistetään vastaavasti, esim. uqav ubq b pätee, jos (q, b,r) δ(q, a). Epädeterministinen kone N hyväksyy syötteen, jos jokin mahdollinen laskenta johtaa hyväksyvään tilanteeseen. Huom. Määritelmässä on oleellinen epäsymmetria. Kun A = L(N), niin jos w A, niin ainakin yksi laskenta hyväksyy, mutta muut saavat johtaa hylkäämiseen tai silmukkaan; jos w A, niin mikään laskenta ei johda hyväksymiseen, vaan kaikkien on johdettava hylkäämiseen tai silmukkaan. Jos määritelmä olisi löysästi jonkin laskennan pitää johdaa oikeaan lopputulokseen, niin mikä tahansa kieli voitaisiin tunnistaa triviaalisti asettamalla kaikilla a Σ δ(q 0, a) = {(q accept, a,r),(q reject, a,r) }. 243
244 Esimerkki 3.5: Tuttu kieli B = { ww w {0,1} } voidaan tunnistaa epädeterministisellä Turingin koneella seuraavasti: 1. Laita syötteen ensimmäinen symboli muistiin ja pyyhi se pois. 2. Valitse epädeterministisesti jokin symboli syötteestä. Jos se ei ollut sama kuin ensimmäinen symboli, niin hylkää. Muuten viivaa se yli. 3. Palaa syötteen alkuun. 4. Laita syötteen seuraava merkki muistiin ja pyyhi se pois. 5. Selaa nauhaa oikealle, kunnes yliviivatut symbolit loppuvat. Jos niitä seuraava symboli on, mene kohtaan 6. Muuten jos niitä seuraava symboli ei ole sama kuin muistissa oleva, hylkää. Muuten viivaa yli tämä symboli ja palaa kohtaan Jos kaikki symbolit on yliviivattu, hyväksy, muuten hylkää. Erona deterministiseen ratkaisuun (s. 233) meidän ei tarvitse etsiä syötteen keskikohtaa. Riittää arvata ja tarkastaa. 244
245 0 R 1 R 0,1 L 0,R 0 X,L R 0,R X R X R 1,R 1,R 0,1 R 0 X,L R 1 X,L X R 1 X,L X L 0 R 1 R 0,1 R X R 0,1 L R X R acc R 10 Sama kaaviona. Hylkäävä tila siirtymineen jätetty merkitsemättä. Kaksi epädeterminististä siirtymäparia merkitty nuolilla. 245
246 Lause 3.6: [Sipser Thm. 3.16] Jokaiselle epädeterministiselle Turingin koneelle on olemassa ekvivalentti deterministinen Turingin kone. Todistus: Olkoon N epädeterministinen Turingin kone. Muodostamme deterministisen Turingin koneen D, joka kokeilee järjestyksessä kaikkia mahdollisia koneen N laskentoja annetulla syötteellä. Jos hyväksyvä laskenta löytyy, D hyväksyy. Muuten D jää silmukkaan. Siis L(D) = L(N). Perusidea on kuvitella puu, jonka solmuina on koneen N tilanteita: juurena alkutilanne annetulla syötteellä ja solmun uqv lapsina kaikki tilanteet u q v, joilla uqv u q v. Kone D käy puuta läpi leveyssuuntaisesti. Tätä varten haluamme indeksoida puun solmut. Olkoon b yläraja solmun lapsien lukumäärälle: b = max δ(q, a). q,a Vakion b tarkalla arvolla ei ole tässä merkitystä, mutta selvästi b 3 Q Γ. 246
247 Numeroidaan nyt jokaisen solmun lapset (eli jokaisen tilanteen seuraajatilanteet) numeroilla joukosta { 1,..., b } (joista osa voi jäädä käyttämättä). Jos uqv ja u q v ovat kaksi saman solmun lasta, voidaan esim. sopia, että uqv saa pienemmän numeron, jos jos q:n järjestysnumero on pienempi kuin q :n tai q = q ja u on aakkosjärjestyksessä ennen kuin u tai q = q ja u = u ja v on aakkosjärjestyksessä ennen kuin v. Tästä saadaan puun jokaiselle solmulle osoite joukosta {1,..., b } : juuren osoite on ε ja jos solmun osoite on p 1... p k, niin sen lapsi numero q saa osoitteen p 1... p k q. Kaikki joukon {1,..., b } alkiot eivät ole minkään solmun osoitteita. 247
248 Esimerkki 3.7: Tarkastellaan sivun 245 epädeterministisen Turingin koneen laskentaa syötteellä Laskentapuun alkuosa ja vastaava solmujen numerointi ovat seuraavat: q ε q q Xq q q 2 X q Xq Puussa ei ole esim. solmua numero 122, koska solmun 12 tilanteella Xq on vain yksi mahdollinen seuraaja. 248
249 Muodostamme nyt kolminauhaisen koneen D, joka toimii kuten edellä on esitetty. Lauseen 3.3 nojalla tästä saadaan edelleen yksinauhainen kone. Nauha 1 sisältää syötteen. Nauhalle 1 ei koskaan kirjoiteta. Nauha 2 on työnauha, jonka sisältö seuraa koneen N nauhan sisältöä laskennan eri vaiheissa. Nauha 3 sisältää aakkoston { 1,..., b } merkkijonon, joka tulkitaan osoitteeksi nauhalla 1 olevaa syötettä vastaavaan koneen N laskentapuuhun. Aluksi nauha 3 on tyhjä eli osoittaa puun juurta. Koneen D periaate on seuraava: 1. Etsi laskentapuusta nauhan 3 osoittama solmu. Jos se vastaa hyväksyvää tilannetta, niin hyväksy. Jos solmua ei ole tai se vastaa muuta kuin hyväksyvää tilannetta, siirry kohtaan Korvaa nauhan 3 sisältö leksikografisessa järjestyksessä seuraavalla aakkoston { 1,..., b } merkkijonolla. Palaa kohtaan
250 Nauhan 3 osoittaman solmun etsiminen tapahtuu seuraavasti: 1. Olkoon nauhan 3 merkkijono p 1... p n. 2. Kopio nauhan 1 sisältö nauhan 2 sisällöksi ja aseta nauhapää nauhan 2 alkuun. Aseta koneen N simulaatio alkutilaan. 3. Simuloi koneen N laskentaa n askelta käyttäen nauhaa 2. Laskenta-askelella numero i valitse uudeksi tilanteeksi nykyisen tilanteen seuraaja numero p i. Jos nykyisellä tilanteella on vähemmän kuin p i seuraajaa, keskeytä laskenta; etsittyä solmua ei ole. 250
251 Korollaari 3.8: [Sipser Cor. 3.18] Kieli on Turing-tunnistettava, jos ja vain jos jokin epädeterministinen Turingin kone tunnistaa sen. Todistus: Suunta vain jos on ilmeinen. Suunta jos seuraa edellisestä lauseesta. Epädeterministinen Turingin kone on ratkaisija (eli totaalinen kone), jos sillä ei millään syötteellä ole päättymättömiä laskentoja. Korollaari 3.9: [Sipser Cor. 3.19] Kieli on ratkeava, jos ja vain jos jokin epädeterministinen Turingin kone ratkaisee sen. Todistus: Edellisen lauseen konstruktiota on helppo täydentää siten, että D havaitsee, jos kaikki koneen N laskennat ovat pysähtyneet. 251
252 Algoritmin määritelmä [Sipser luku 3.3] Mitä algoritmilla yleensä tarkoitetaan periaatteessa: yksiselitteisesti kuvattu jono (tietojenkäsittely)operaatioita, jotka voidaan toteuttaa mekaanisesti käytännössä: luonnollista kieltä, pseudokoodia yms. käyttävä esitys, jonka pätevä ohjelmoija osaa koodata ilman suurempia ongelmia. Tämä tarkkuustaso ei ole riittävä, jos halutaan tutkia laskettavuuden rajoja. Erityisesti kun haluamme väittää jostain ongelmasta, että sille ei ole olemassa ratkaisualgoritmia, niin mitä oikeastaan väitämme? Huomaa, että tämä on oleellisesti eri asia kuin todeta, että ongelmalle ei ole keksitty algoritmia (toistaiseksi). 252
253 Tuntuu luontevalta vaatia, että algoritmissa yksi operaatio saa tehdä vain äärellisen määrän työtä. Siis erityisesti yksi operaatio saa lukea äärellisen määrän tietoa, etsiä toimintaohjeen äärellisestä sääntöjoukosta ja kirjoittaa äärellisen määrän tietoa. Toisaalta ei ole mitään syytä olla sallimatta, että algoritmin käytössä on rajattomasti apumuistia. Tämän esittäminen matemaattisesti johtaa suoraan ajatukseen, että matemaattiselta kannalta algoritmi on sama asia kuin Turingin kone. Tämä on (karkeasti) alkuperäinen ajatus Turingin koneen takana. 253
254 Turingin kone ei syntynyt sattumalta. Matematiikan perusteiden tutkimuksessa 1900-luvun alussa keskeistä oli matematiikan mekanisoiminen (voiko matemaatikon korvata algoritmilla). Tätä varten esitettiin useita formalisointeja mekaaniselle laskennalle: Turingin kone (Turing 1936) Postin sääntöjärjestelmät (Post 1936) µ-rekursiiviset funktiot (Gödel, Kleene 1936) λ-kalkyyli (Church 1936) Merkittävä havainto oli, että nämä kaikki olivat ekvivalentteja, ts. antavat tasan saman vastauksen kysymykseen Mitä ongelmia voidaan ratkaista algoritmisesti? Tämä johti Churchin-Turingin teesinä tunnettuun väittämään: Ongelma voidaan ratkaista algoritmilla, jos ja vain jos se voidaan ratkaista Turingin koneella. 254
255 Churchin-Turingin teesi ei tietenkään ole matemaattinen väittämä. Sitä voi (kenties) pitää luonnontieteellisenä väittämänä, jonka voisi periaatteessa falsifioida rakentamalla Turingin konetta voimakkaamman laskulaitteen. Käytännössä Churchin-Turingin teesi lähinnä sanoo, että olemme tyytyväisiä Turingin koneeseen algoritmin määritelmänä. Kuten edellä ilmeni, tälle tyytyväisyydelle on tiettyjä filosofisia perusteita. Myöskään sellaiset modernit laskennan mallit kuin kvanttitietokone eivät näyttäisi uhkaavan tätä teesiä. Käytännön tietojenkäsittelyn kannalta tärkeä havainto on, että myös (idealisoitu) nykyaikainen tietokone on Turing-ekvivalentti eli pystyy ratkaisemaan tasan samat ongelmat kuin Turingin kone. Tarkastellaan tätä hieman lähemmin. On selvää, että tietokone on ainakin yhtä laskentavoimainen kuin Turingin kone: on helppoa kirjoittaa Turingin kone -simulaattori esim. C-kielellä. Tietokoneen simuloiminen Turingin koneella vaatii hieman enemmän työtä. 255
256 Ajatellaan, että tietokonessa on k rekisteriä ja lisäksi rajoittamaton määrä hajasaantimuistia (RAM). Simuloidaan tietokonetta k + 2-nauhaisella Turingin koneella. Nauhoille 1,..., k talletetaan rekisterien 1,..., k sisällöt. Nauhalla k + 1 esitetään tietokoneen muistin sisältö muodossa #a 1 #d 1 ##a 2 #d 2 ##...##a n #d n #, missä n on käytössä olevan muistin määrä ja d i on muistipaikan a i sisältö (esim. binäärikoodattuna). Nauha k + 2 toimii apumuistina. Aiempien esimerkkien perusteella pitäisi olla uskottavaa, että Turingin kone pystyy simuloimaan konekäskyjä kuten lataa rekisterin 2 osoittaman muistipaikan sisältö rekisteriin 3, lisää rekisterin 1 sisältöön rekisterin 2 sisältö jne. Tosin muistiin kirjoitettaessa voidaan joutua siirtämään oikealle tai vasemmalle pitkä pätkä nauhan k + 1 sisältöä. 256
257 Turingin koneiden esittäminen Olemme edellä esittäneet Turingin koneita eri tarkkuustasoilla: formaali kuvaus: tarkka tilakaavio toteutustaso: selitetään nauhojen käyttö ja muut pääideat, mutta ei puututa koneen yksittäisiin tiloihin jne. korkea taso: esitetään algoritmi sellaisenaan (esim. pseudokoodina) viittaamatta erityisesti Turingin kone -malliin. Tässä vaiheessa pitäisi olla uskottavaa, että mikä tahansa algoritmi osataan kyllä tarvittaessa koodata Turingin koneen konekielelle. Kuten edellä on todettu, tämä on motivaatio sille, että Turingin koneet ylipäänsä ovat kiinnostava laskennan malli. Jatkossa siis tyydymme yleensä esittämään Turingin koneet melko korkealla tasolla. 257
258 4. Ratkeavuus Tarkastelemme formaaleihin kieliin liittyviä algoritmeja käyttäen Turingin konetta algoritmin täsmällisenä määritelmänä. Tämän luvun jälkeen opiskelija 1. osaa kuvailla universaaliin Turingin koneeseen liittyvät peruskäsitteet 2. tuntee universaalikielen ratkeamattomuuteen liittyvät peruskonstruktiot. Yleisemmällä tasolla tavoittena on ymmärtää, millaiset ongelmat ovat ratkeamattomia ja mitä tämä tarkoittaa. 258
259 Pysähtymisongelman ratkeavuus [Sipser luku 4.2] Osoitamme keskeisen tuloksen, että jotkin Turing-tunnistettavat kielet ovat ratkeamattomia ja jotkin kielet eivät ole edes Turing-tunnistettavia. Lisäksi toteamme, että ratkeamattomat ongelmat eivät välttämättä ole mitenkään omituisia, vaan myös monet luonnolliset ja käytännössä kiinnostavat ongelmat ovat ratkeamattomia. Perusesimerkki ratkeamattomasta ongelmasta on (sopivasti formuloitu) pysähtymisongelma Annettu: (esim. C-kielinen) ohjelma P, syöte w Kysymys: pysähtyykö P syötteellä w. 259
260 Jos tunnetaan hieman joukko-oppia, niin ei-tunnistettavien kielten olemassaolo voidaan todeta seuraavantapaisella päättelyllä: Turingin koneiden joukko on numeroituva, ts. Turingin koneet voidaan asettaa yksi-yhteen-vastaavuuteen luonnollisten lukujen kanssa. Kaikkien formaalien kielten joukko P(Σ ) (missä tahansa kiinteässä aakkostossa Σ) on ylinumeroituva; itse asiassa formaalit kielet voidaan asettaa yksi-yhteen-vastaavuuteen reaalilukujen kanssa. Siis Turingin koneita on vähemmän kuin formaaleja kieliä, joten kaikille kielille ei mitenkään voi olla omaa tunnistavaa Turingin konettaan. Emme rupea täsmentämään tätä päättelyä. Johdamme tarkemman tuloksen, joka antaa konkreettisia esimerkkejä ratkeamattomista (ja ei-tunnistettavista) kielistä. (Sivuhuomautus joukko-oppia tunteville: kaikkien merkkijonojen joukko Σ on numeroituvasti ääretön, joten P(Σ ) on ylinumeroituva.) 260
261 Kuten edellä todettiin, ongelma Annettu: C-kielinen ohjelma P, syöte w Kysymys: pysähtyykö P syötteellä w on tyyppiesimerkki käytännön ohjelmointiongelmasta, jolle ei ole ratkaisualgoritmia. Tämän perustelemiseksi osoitamme, että vastaava Turingin koneita koskeva ongelma Annettu: Turingin kone M, syöte w Kysymys: pysähtyykö M syötteellä w ei ole Turing-ratkeava. Koska Turingin koneet ovat yhtä ilmaisuvoimaisia kuin C-ohjelmat, kyseessä on oleellisesti sama ongelma, mutta Turingin koneita on huomattavasti yksikertaisempi käsitellä. Ensin kuitenkin on täsmennettävä, mitä tarkoitamme sillä, että Turingin kone saa syötteenä toisen Turingin koneen. Koska Turingin koneen syötteet ovat merkkijonoja, meidän pitää koodata Turingin koneet merkkijonoiksi sopivassa aakkostossa. 261
262 Koodaus voidaan tehdä monella tavalla eivätkä yksityiskohdat oikeastaan ole oleellisia, mutta asian konkretisoimiseksi käymme läpi yhden mahdollisuuden. Yksinkertaisuuden vuoksi oletetaan, että kaikkien jatkossa esiintyvien Turingin koneiden syöteaakkosto sisältää ainakin merkit 0,...,9 ja #. Kun on annettu Turingin kone M = (Q,Σ,Γ, δ, q 0, q accept, q reject ), niin Numeroidaan tilat: Q = { q 1,..., q n }, missä n = Q. Valitaan tilan q i koodiksi indeksin i tavallinen kymmenjärjestelmäesitys ja merkitään tätä koodia q i. Siis q i on aakkoston {0,...,9} merkkijono. Numeroidaan ja koodataan samalla tavalla myös aakkostot Σ ja Γ ja siirtymäsuunnat L ja R. Siirtymäfunktiolle saadaan koodi δ luettelemalla kaikki siirtymät δ(q, a) = (q, b, D) muodossa # q # a # q # b # D #. Koko koneen M koodi on nyt aakkoston {0,...,9,#} merkkijono M = # δ ## q 0 # q accept # q reject #. 262
263 Sovitaan lisäksi, että Turingin kone M yhdessä merkkijonon w = w 1... w n kanssa koodataan muotoon M, w = M # w 1 #...# w n. Voimme nyt määritellä formaalin kielen A TM = { M, w M on Turingin kone joka hyväksyy w:n }, jota kutsutaan Turingin koneen hyväksymisongelmaksi ja myös universaalikieleksi. Se siis sisältää yhteen kieleen pakattuna tiedon kaikkien Turingin koneiden tunnistamista kielistä. Lause 4.1: [Sipser s. 176] Kieli A TM on Turing-tunnistettava. Todistus: Kieli A TM voidaan tunnistaa Turingin koneella U, joka syötteellä M, w toimii seuraavasti: 1. Tarkasta, että syöte todella on muotoa M, w ; jos ei ole, niin hylkää. 2. Simuloi konetta M syötteellä w. 3. Jos M menee tilaan q accept, niin hyväksy. Jos M menee tilaan q reject, niin hylkää. Simulaation yksityiskohdat eivät ole oleellisia, mutta hahmottelemme erään mahdollisuuden lyhyesti seuraavalla sivulla. 263
264 Kun syötteenä on saatu koodi M, w = # δ ## q 0 # q accept # q reject ## w 1 #...# w n, voidaan simulointi hoitaa esim. kaksinauhaisella Turingin koneella: nauha 1 sisältää syötteen, ja sen sisältöä ei muuteta nauha 2 koodaa koneen M tilanteen u 1... u n qv 1... v m muodossa # u 1 #...# u n ## q # v 1 #...# v m #. Yhden laskenta-askelen simuloimiseksi etsitään ensin nauhalta 2 merkin ## kohdalta koneen M tila ja nauhapään alla oleva merkki. Nauhalta 1 etsitään tätä paria (q, v 1 ) vastaava siirtymä ja tilannetta nauhalla 2 päivitetään vastaavasti. (Koska koodien pituudet vaihtelevat, tässä voidaan joutua siirtämään nauhan loppuosaa vasemmalle tai oikealle.) Uutta tilaa verrataan nauhaan 1, ja jos se on q accept tai q reject, niin simulaatio pysähtyy. 264
265 Edellä esitettyn laista konetta U sanotaan universaalikoneeksi. Sille pätee U hyväksyy syötteen M, w M hyväksyy syötteen w U hylkää syötteen M, w M hylkää syötteen w U jää silmukkaan syötteellä M, w M jää silmukkaan syötteellä w. Koska U voi jäädä silmukkaan, tämä ei osoita kieltä A TM ratkeavaksi. Itse asiassa hyväksymisongelma onkin ratkeamaton, kuten kohta näemme. Kuvitellaan, että haluamme tosiaan rakentaa Turingin koneita formaalien kielten tunnistamiseksi. Universaalikoneen takia meidän ei tarvitse rakentaa erikseen konetta M jokaiselle kielelle L(M). Riittää rakentaa yksi universaalikone U. Mikä tahansa kieli L(M) voidaan tunnistaa universaalikoneella U antamalla sille ohjelmaksi koneen M koodi M. Siis universaali Turingin kone on malli ohjelmoitavalle yleiskäyttöiselle tietokoneelle. 265
266 Todistamme nyt, että Turingin koneen hyväksymisongelma ei ole ratkeava. Keskeisenä aputuloksena todetaan ensin [Sipser s ] Lemma 4.2: Diagonaalikieli ei ole Turing-tunnistettava. D = { M M L(M) } Huom. Tarkastelemme siis, mitä tapahtuu, kun jokin kone M saa syötteenä oman koodinsa M. Tämä saattaa tuntua oudolta, mutta siinä ei ole mitään sen kummempaa kuin siinä, että voimme antaa C-kielellä kirjoitetulle ohjelmalle syötetiedostoksi tekstitiedoston, jossa sattuu olemaan kyseisen ohjelman lähdekoodi. Todistus perustuu diagonalisointitekniikkaan. Esitämme ensin perusajatuksen ja sitten (varsin tiiviin) varsinaisen todistuksen. 266
267 Ajatellaan kaikki Turingin koneet numeroiduksi M 1, M 2, M 3,.... Tehdään ääretön taulukko T, jonka rivin i sarake j kertoo, hyväksyykö kone M i syötteen M j. Meitä kiinnostaa erityisesti taulukon diagonaalialkiot T(i, i). Esim. jos taulukko näyttäisi seuraavalta: T M 1 M 2 M 3 M 4 M 5 M 6... M M M M M M niin kone M 2 hyväksyy syötteillä M 3, M 4 ja M 6, mutta syötteillä M 1, M 2 ja M 5 hylkää tai joutuu silmukkaan. 267
268 Ottamalla taulukon (alleviivatut) diagonaalialkiot (T(1,1), T(2,2),...) = (1,0,0,1,1,0,...) ja vaihtamalla nollat ja ykköset saadaan jono d = (d 1, d 2,...) = (0,1,1,0,0,1,...). Jono d ei voi olla taulukon T rivi, sillä se poikkeaa rivistä i positiossa i. Mutta jono d vastaa diagonaalikieltä D: d i = 1 T(i, i) = 0 M i L(M i ) M i D. Koska d ei ole mikään taulukon rivi, niin mikään M i ei tunnista kieltä D. 268
269 Esitetään nyt varsinainen todistus diagonaalikielen ei-tunnistettavuudelle. Todistus: Halutaan siis osoittaa, että kieli ei ole Turing-tunnistettava. D = { M M L(M) } Tehdään vastaoletus, että D on Turing-tunnistettava. Tällöin D = L(M) jollain M. Nyt saadaan ristiriita tarkastelemalla merkkijonoa M : M L(M) M D M:n valinta M L(M) D:n määritelmä. 269
270 Nyt saamme haluamamme keskeisen ratkeamattomuustuloksen: Lause 4.3: [Sipser Thm. 4.11] Kieli A TM ei ole ratkeava. Todistus: Tehdään vastaoletus, että jokin ratkaisija R tunnistaa kielen A TM. Diagonaalikieli D = { M M L(M) } voidaan esittää muodossa D = { M M, M A TM }. Käyttämällä apuna konetta R kieli D voidaan tunnistaa (ja peräti ratkaista) Turingin koneella, joka syötteellä w toimii seuraavasti: 1. Jos w ei ole M millään M, niin hylkää. 2. Muodosta M, M, missä w = M. 3. Simuloi konetta R syötteellä M, M. Jos R hyväksyi, niin hylkää. Jos R hylkäsi, niin hyväksy. Mutta D ei ole Turing-tunnistettava; ristiriita. 270
271 Kieleen A TM liittyy läheisesti Turingin koneen pysähtymisongelma HALT TM = { M, w M on Turingin kone joka pysähtyy syötteellä w. } Korollaari 4.4: [Sipser Thm. 5.1] Kieli HALT TM on ratkeamaton. Churchin-Turingin teesin ja erilaisten laskentaformalismien ekvivalenssin nojalla tulkitsemme tämän niin, että ei ole olemassa mitään algoritmia, joka ratkaisisi annetusta tietokoneohjelmasta, pysähtyykö se annetulla syötteellä. Tietysti yksittäisestä ohjelmasta voi olla helppoakin nähdä, millä syötteillä se pysähtyy. Tulos kertoo, että mille tahansa yleisen pysähtymisongelman ratkaisemiseen tähtäävälle algoritmille voidaan esittää syöte, jolla algoritmi ei toimi (vaan antaa väärän vastauksen tai menee silmukkaan). 271
272 Todistus: Tehdään vastaoletus, että HALT TM olisi ratkeava. Kieli A TM voitaisiin ratkaista Turingin koneella, joka syötteellä M, w toimii seuraavasti: 1. Jos M, w HALT TM, niin hylkää. 2. Simuloi konetta M syötteellä w. Jos M hyväksyi, niin hyväksy. Jos M hylkäsi, niin hylkää. Vastaoletuksen nojalla kohdan 1 ehto voidaan ratkaista, ja kohtaan 2 mennessä tiedetään, että simulaatio ei jää silmukkaan. Mutta A TM tiedetään ratkeamattomaksi; ristiriita. 272
273 Todetaan vielä, että hyväksymättömyysongelma A TM ei ole edes Turing-tunnistettava. Todistetaan ensin aputulos Lause 4.5: [Sipser Thm. 4.22] Jos A ja A ovat tunnistettavia, niin ne ovat ratkeavia. Todistus: Oletetaan, että Turingin koneet M 1 ja M 2 tunnistavat kielet A ja A. Kieli A voidaan ratkaista koneella, joka syötteellä w toimii seuraavasti: 1. Simuloi koneita M 1 ja M 2 syötteellä w rinnakkain, kumpaakin aina yksi askel kerrallaan, kunnes toinen pysähtyy. 2. Jos M 1 hyväksyy tai M 2 hylkää, niin hyväksy. 3. Jos M 1 hylkää tai M 2 hyväksyy, niin hylkää. Koska w kuuluu jompaan kumpaan kielistä A ja A, ainakin toinen simulaatio varmasti pysähtyy. Korollaari 4.6: [Sipser Cor. 4.23] Kieli A TM ei ole Turing-tunnistettava. Todistus: Tiedämme, että A TM on Turing-tunnistettava. Jos myös A TM olisi Turing-tunnistettava, niin A TM olisi ratkeava. 273
274 On myös runsaasti esimerkkejä, joissa sen enempää kieli A kuin sen komplementti A eivät ole tunnistettavia. Sivun 260 numeroituvuusargumentin perusteella itse asiassa tällaisia kieliä on ylinumeroituvasti. Konkreettisia esimerkkejäkin on melko helppo löytää, esim. Turingin koneiden totaalisuusongelma TOTAL TM = { M Turingin kone M pysähtyy kaikilla syötteillä } ja Turingin koneiden ekvivalenssiongelma EQ TM = { M 1, M 2 Turingin koneet M 1 ja M 2 tunnistavat saman kielen }. Emme tässä rupea kehittämään ratkeamattomuuden teoriaa tämän pidemmälle. 274
275 Tässä vaiheessa on hyvä palauttaa mieleen, että esimerkkejä ratkeavista ongelmista löytyy runsaasti muilta tietojenkäsittelytieteen kursseilta. Mikä tahansa ongelma, jolle on esitetty algoritmi, on suoraan tämän nojalla ratkeava. Usein ongelmia tosin ei esitetä formaaleina kielinä, sillä niissä halutaan muutakin tulostetta kuin pelkkä hyväksyminen tai hylkääminen. Turingin kone voidaan kuitenkin helposti yleistää myös laskemaan jokin tuloste, jolloin puhutaan laskettavista eli rekursiivisista funktioista. Ratkeamattomuudesta aiheutuvat rajoitukset ovat tärkeitä esim. formaalissa spesifioinnissa ja verifioinnissa (vrt. pysähtymisongelma) tekoälyssä (formaaliin logiikkaan liittyvät ongelmat). 275
276 5. Laskennan vaativuus Edellisessä luvussa tarkastelimme laskettavuuden rajoja, kun algoritmin vaaditaan pysähtyvän kaikilla syötteillä. Nyt tarkennamme käsittelyä kysymällä, kuinka kauan laskenta kestää. Käymme läpi Sipserin luvun 7 pääasiat. Tavoitteena on, että opiskelija osaa selittää polynomisen ja eksponentiaalisen aikavaativuuden eron määritellä luokat P ja NP selittää, mistä NP-täydellisyydessä ja P vs. NP -ongelmassa on kysymys tunnistaa perusesimerkkejä NP-täydellisistä ongelmista. 276
277 Aikavaativuus [Sipser luku 7.1] Algoritmin aikavaativuuden perusajatus on tuttu esim. kurssilta Tietorakenteet. Täsmennämme sen nyt käyttämällä Turingin konetta laskennan mallina. Määritelmä 5.1: Olkoon M Turingin kone, joka pysähtyy kaikilla syötteillä. Turingin koneen M aikavaativuus (time complexity) on funktio f : N N, missä f(n) on suurin määrä laskenta-askelia, jonka M tekee millään syötteellä, jonka pituus on n. Tällöin sanomme myös, että M toimii ajassa f(n). Siis kurssilta Tietorakenteet tuttuun tapaan ryhmittelemme saman pituiset syötteet yhteen ja tarkastelemme pahimman tapauksen aikavaativuutta. Käytämme myös Tietorakenteista tuttua iso-o-merkintää : jos esim. Turingin koneen aikavaativuus on f, jolla f(n) = O(n 2 ), sanomme lyhyesti, että koneen aikavaativuus on O(n 2 ). Tässä siis sovitaan, että n esittää syötteen pituutta. (Tarvittaessa kertaa iso-o-merkintä kurssikirjan sivuilta tai Tietorakenteiden materiaalista.) 277
278 Esimerkki 5.2: Tarkastellaan sivun 227 Turingin konetta, joka tunnistaa kielen {a m b m c m m N }. Pahimmassa tapauksessa kone käy jokaista syötteen a-merkkiä kohti syötteen loppuosan läpi yliviivaten b- ja c-merkkejä. Yksi syötteen läpikäynti vie O(n) laskenta-askelta. Kaikkiaan a-merkkejä ja siis läpikäyntejä on O(n) kappaletta. Lopuksi vielä tarkastetaan koko nauhan sisältö, mihin kuluu O(n) askelta. Koneen aikavaativuus on siis O(n) O(n) + O(n) = O(n 2 ). Määritelmä 5.3: Luokka TIME(t(n)) koostuu kielistä, jotka voidaan tunnistaa ajassa O(t(n)) toimivalla Turingin koneella. Esimerkki 5.4: Edellisen esimerkin perusteella {a m b m c m m N } TIME(n 2 ). Tämän perusteella voidaan myös todeta heikommin, että jne. {a m b m c m m N } TIME(n 3 ) {a m b m c m m N } TIME(2 n ) 278
279 Laskennan vaativuus eri malleissa Edellä, erityisesti luokan TIME(f(n)) määritelmässä, Turingin koneella on tarkoitettu determinististä, yksinauhaista konetta. Aikavaativuuden määritelmä tietysti yleistyy suoraan moninauhaiselle koneelle, mutta aikavaativuusluokat ovat herkkiä sille, millaisia koneita käytetään. Lause 5.5: [Sipser Thm. 7.8] Jos kieli voidaan tunnistaa ajassa f(n) toimivalla moninauhaisella Turingin koneella, niin se voidaan tunnistaa ajassa O(f(n) 2 ) toimivalla yksinauhaisella Turingin koneella. Todistushahmotelma: Tämä on oleellisesti käyty läpi todistettaessa, että moninauhaisella ja yksinauhaisella koneella voidaan ratkaista samat ongelmat (sivu 242). Huomaa, että nauhojen lukumäärä k on vakio, ts. ei riipu syötteestä. Tämä yläraja O(f(n) 2 ) ei kenties ole tiukin mahdollinen, mutta emme ole kiinnostuneet sen viilaamisesta. Ei ole mitään perustetta sanoa, että moninauhainen kone olisi tarkempi tai epätarkempi malli oikealle algoritmille kuin yksinauhainen. Pyrimmekin nostamaan tarkastelun hieman korkeammalle abstraktiotasolle, jotta tällaiset pienet erot malleissa eivät häiritse. 279
280 Epädeterminismi on paljon isompi muutos kuin moninauhaisuus. Määritelmä 5.6: Olkoon N on epädeterministinen Turingin kone, jonka kaikki laskennat kaikilla syötteillä pysähtyvät. Koneen N aikavaativuus on funktio f : N N, missä f(n) on suurin määrä laskenta-askelia, jonka N tekee missään laskennassa syötteellä, jonka pituus on n. Huom. Epädeterministinen aikavaativuus ei ole tarkoitettu suoraan mallintamaan minkään todellisen tietokoneen suoritusaikaa. Se on vain abstrakti matemaattinen käsite, jonka hyödyllisyys tulee kohta ilmi. Tekninen huomio: Tarkastelemme siis epädeterministisen laskentapuun pisintä haaraa kullakin syötteellä. Lyhimmän haaran tarkasteleminen ei ole mielekästä, koska koneeseen voidaan helposti lisätä turhia lyhyitä hylkääviä laskentoja. Lyhimmän hyväksyvän laskennan tarkasteleminen johtaisi oleellisesti samoihin tuloksiin kuin ylläoleva määritelmä. 280
281 Lause 5.7: [Sipser Thm. 7.11] Jos kieli voidaan tunnistaa ajassa f(n) toimivalla epädeterministisellä Turingin koneella, se voidaan tunnistaa ajassa 2 O(f(n)) toimivalla deterministisellä yksinauhaisella Turingin koneella. Todistushahmotelma: Sivuilla on esitetty muunnos epädeterministisestä Turingin koneesta kolmenauhaiseksi deterministiseksi. Laskenta käy läpi epädeterministisen laskentapuun haarat, joita on korkeintaan b f(n). Yhden haaran läpikäynti vie deterministisen ajan O(f(n)). Kolmenauhaisen koneen aikavaativuus on siis O(f(n)b f(n) ) = 2 O(f(n)). Yksinauhaiseen koneeseen siirtyminen antaa vaativuuden (2 O(f(n)) ) 2 ) = 2 O(f(n)). Huomaa, että 2 f(n) on yleensä paljon suurempi kuin moninauhaisen koneen yhteydessä esiintynyt f(n) 2. Ryhdymme nyt tutkimaan tätä eroa. 281
282 Polynominen aikavaativuus [Sipser luku 7.2] Määritelmä 5.8: Turingin koneen M aikavaativuus on polynominen, jos se on O(n k ) jollain k N. Tällöin sanomme, että M toimii polynomisessa ajassa. Kieli kuuluu luokkaan P, jos se voidaan tunnistaa yksinauhaisella deterministisellä polynomisessa ajassa toimivalla Turingin koneella. Lauseen 5.6 nojalla yksinauhainen ja moninauhainen Turingin kone ovat polynomisesti ekvivalentteja laskennan malleja: luokan P sisältö ei muuttuisi, vaikka sen määritelmässä käytettäisiin moninauhaisia koneita. Sama pätee myös monille muille Turingin koneen muunnelmille ja esim. RAM-koneelle (s. 256). Sen sijaan ei tiedetä, että epädeterministiset ja deterministiset Turingin koneet olisivat polynomisesti ekvivalentteja (ja yleisesti epäillään, että eivät ole). Palaamme tähän pian. 282
283 Polynominen aikavaativuus on siis tekniseltä kannalta sopivan tasoinen aikavaativuusluokka: se ei ole herkkä pienille tai vähän suuremmillekaan muutoksille laskennan mallissa. Polynominen aikavaativuus on myös sovellusten kannalta keskeinen ominaisuus: yleisesti ottaen ajassa n k toimivat algoritmit skaalatuvat suurille syötteille, ajassa 2 n toimivat eivät skaalaudu. Tähän pitää suhtautua tietyin varauksin: esim. aikavaativuus O(n 100 ) ei varmasti skaalaudu hyvin pahimman tapauksen analyysi ei aina ole tarkoituksenmukaista pientenkin syötteiden ratkaiseminen voi olla tärkeää. Erityisesti luokkaa P tarkastelemalla emme halua väittää, että esim. aikavaativuuksien O(n 2 ) ja O(n 3 ) välinen ero ei olisi tärkeä; päinvastoin se on hyvinkin tärkeä. Olemme vain valmiit hetkeksi unohtamaan tuon eron saadaksemme paremman kuvan vielä tärkeämmästä erosta polynomisten aikavaativuuksien O(n k ) ja eksponentiaalisten aikavaativuuksien O(2 nk ) välillä. 283
284 Esimerkki 5.9: [Sipser Thm. 7.14] Kurssilta Tietorakenteet tiedämme, että ongelma Annettu: verkko G = (V, E), solmut s V ja t V Kysymys: onko verkossa G polku s t voidaan ratkaista ajassa O( V + E ) esim. leveyssuuntaisella etsinnällä. Liittääksemme tämän tuloksen nyt esillä olevaan käsitteistöön ja erityisesti luokkaan P meidän on ensin määriteltävä ongelma formaalina kielenä. Olkoon siis PATH = { G, s, t verkossa G on polku s t }, missä G, s, t on mikä tahansa järkevä tapa koodata verkko ja sen kaksi solmua jonkin aakkoston merkkijonoksi. Järkevyys pitää tässä sisällään erityisesti sen, että koodin pituuden tulee olla polynominen verkon solmujen lukumäärän suhteen. Esim. vierusmatriisia käyttämällä saadaan helposti koodinpituus O( V 3 ). Nyt PATH P. Tämän todistamiseksi toteamme, että kurssilta Tietorakenteet tutun leveyssuuntaisen etsinnän tekemät O( V + E ) laskenta-askelta voidaan selvästi kukin toteuttaa syötteen koon suhteen polynomisessa ajassa Turingin koneella. 284
285 Lause 5.10: Jos kieli L on yhteydetön, niin L P. Todistus: Jos L on yhteydetön, sillä on Chomskyn normaalimuodossa oleva kielioppi. Voimme siis annetulla w ratkaista, päteekö w L, käyttämällä CYK-algoritmia (s. 173). Algoritmin suoritus vaatii O(n 3 ) iteraatiota. Kun algoritmi muunnetaan Turingin koneeksi, esim. taulukon table indeksointi ei enää toimi vakioajassa. Kuitenkin on selvää, että Turingin koneella iteraation kukin yksittäinen askel voidaan suorittaa ajassa O(n k ) jollain (melko pienellä) k N. Saamme siis kielelle L Turingin koneen, jonka aikavaativuus on O(n k+3 ). Yleisemmin voimme todeta, että ongelma kuuluu luokkaan P, jos se voidaan esittää formaalina kielenä ja sillä on ratkaisualgoritmi, joka toimii ajassa O(n k ) normaalien (esim. kurssilla Tietorakenteet esitettyjen) laskuperusteiden mukaan. 285
286 Epädeterministinen polynominen aikavaativuus [Sipser luku 7.3] Määritelmä 5.11: Kieli kuuluu luokkaan NP (nondeterministic polynomial time), jos se voidaan tunnistaa epädeterministisellä Turingin konella, jonka aikavaativuus on O(n k ) jollain k N. Lauseen 5.7 mukaan jos A NP, niin A voidaan ratkaista deterministisessä ajassa 2 O(nk) jollain k N. Mitään oleellisesti tämän tarkempaa ei pystytä nykyisillä tiedoilla päättelemään. Luokka NP on kuitenkin käytännössä tärkeä, koska se sisältää monia tärkeitä ongelmia, joiden vaativuutta ei tiedetä sen tarkemmin. Tämäkin tieto antaa vihjeitä siitä, millaisilla tekniikoilla ongelmaa kannattaa tai ei kannata yrittää ratkaista. 286
287 Esimerkki 5.12: Verkon Hamiltonin polku on polku, joka vierailee jokaisessa solmussa tasan kerran. Tarkastelemme versiota, jossa verkko on suunnattu ja polun alku- ja loppusolmu annettu: HAMPATH = { G, s, t suunnatussa verkossa G on Hamiltonin polku s t }. HAMPATH on perusesimerkki ongelmasta, joka kuuluu luokkaan NP, mutta jonka kuuluminen luokkaan P on avoin ongelma. a b s s t c d t Verkossa on Hamiltonin polku (s,a,b,c,d,t) Verkossa ei ole Hamiltonin polkua 287
288 Kieli HAMPATH voidaan tunnistaa epädeterministisellä kaksinauhaisella Turingin koneella, joka ensin arvaa solmujonon p 1,..., p V ja sitten tarkistaa, syntyikö Hamiltonin polku: 1. Etsi syötteestä G, s, t verkon G solmujen lukumäärä V. 2. Kirjoita kakkosnauhalle jono p 1,..., p V, jossa on V lukua. Kukin luku p i valitaan epädeterministisesti joukosta {1,..., V }. 3. Jos p 1 ei ole solmun s järjestysnumero, niin hylkää. Jos p V ei ole solmun t järjestysnumero, niin hylkää. Jos p i = p j joillakin i j, niin hylkää. 4. Kaikilla i = 1,..., V 1, tarkista, onko verkossa G kaari solmusta numero p i solmuun numero p i+1. Jos ei ole, niin hylkää. 5. Hyväksy. Tässä siis on ajateltu, että verkon G koodaus samalla kiinnittää jonkin numeroinnin sen solmuille. Kohtien 3 5 tarkastusten yksityiskohdat riippuvat koodauksen yksityiskohdista, mutta millä tahansa järkevällä koodauksella tarkastukset voidaan selvästi tehdä polynomisessa ajassa. 288
289 Edellisen perusteella HAMPATH NP. Sen sijaan ei tiedetä, päteekö HAMPATH P; melko yleisesti arvellaan, että ei päde. Koska mahdollisia polkuja s t voi olla verkon koon V suhteen eksponentiaalinen määrä, mikään raakaan voimaan perustuva etsintä ei takaa polynomista aikavaativuutta. Lauseen 5.7 perusteella (tai analysoimalla jotain raakaan voimaan perustuvaa algoritmia) tiedämme kuitenkin, että HAMPATH TIME(2 nk ) jollain k N. 289
290 Esimerkki 5.13: Suuntaamattoman verkon klikki on solmujoukko, jonka jokaista solmuparia yhdistää kaari. Allaolevassa verkossa on neljän solmun klikki {c,d,e,g} ja useita pienempiä klikkejä, esim. {c,d,e}; {a,c,d}; {b,f } ja {b}. a c b d e f g Perusongelma on löytää verkosta mahdollisimman suuri klikki. Määrittelemme vastaavan formaalin kielen: CLIQUE = { G, k suuntaamattomassa verkossa G on k solmua käsittävä klikki }. CLIQUE on vaativuudeltaan hyvin samansukuinen ongelma kuin HAMPATH. 290
291 Kielelle CLIQUE saadaan samantapaisella arvaa ja testaa -algoritmi kuin Hamiltonin poluille: 1. Etsi syötteestä G, k haluttu klikin koko k. 2. Valitse epädeterministisesti solmujoukko C V, jossa on k solmua. 3. Tarkista kaikki parit (u, v) C C. Jos kaikilla näistä (u, v) E, niin hyväksy. Muuten hylkää. Johtopäätökset ovat kuten aiemmin: CLIQUE NP CLIQUE TIME(2 nk ) jollain k N ei tiedetä, kuuluuko CLIQUE luokkaan P. 291
292 Esimerkki 5.14: Toteutuvuusongelmassa (satisfiability) on annettu propositiologiikan kaava, joka siis koostuu muuttujista x 1, x 2, x 3,... ja loogisista operaattoreista (negaatio ei ), (konjunktio ja ) sekä (disjunktio tai ). Kaava on toteutuva, jos sen muuttujille voidaan valita sellaiset totuusarvot, että kaava tulee todeksi. Esim. kaava (x 1 x 4 ) ((( x 1 ) x 2 ) (x 3 ( x 2 ))) on toteutuva, kuten nähdään vaikkapa valitsemalla x 1 = False, x 2 = True, x 3 = False ja x 4 = True. Sen sijaan kaava (x 1 ( x 2 )) (x 2 ( x 1 )) (x 1 x 2 ) (( x 1 ) ( x 2 )) ei ole toteutuva, sillä mitkään muuttujien x 1 ja x 2 arvot eivät samanaikaisesti toteuta kaikkia neljää ehtoa x 1 ( x 2 ), x 2 ( x 1 ), x 1 x 2 ja (( x 1 ) ( x 2 )). Toteutuvuusongelmaa vastaava formaali kieli SAT = { ϕ propositiologiikan kaava ϕ on toteutuva } kuuluu luokkaan NP, mikä taas nähdään arvaa ja testaa -algoritmilla. 292
293 P vs. NP -ongelma [Sipser luku 7.4] Koska selvästi P NP, niin jompi kumpi seuraavista pätee: P = NP luokka P on luokan NP aito osajoukko. Vaihtoehto 1: P=NP Vaihtoehto 2: NP P Kysymys, päteekö P = NP, on ollut tietojenkäsittelyteorian keskeinen avoin ongelma 1970-luvun alusta lähtien. Yleinen mielipide tuntuu suosivan vaihtoehtoa P NP, mutta mikään ei viittaa siihen, että varsinainen ratkaisu olisi lähiaikoina syntymässä. 293
294 Jos pätee P = NP, niin Hamiltonin polut, klikkiongelma ja toteutuvuusongelma, sekä satoja muita tunnettuja luokan NP ongelmia, voidaan ratkaista polynomisessa ajassa. Tällöin epädeterminististä valintaa eksponentiaalisesta määrästä mahdollisuuksia voitaisiin simuloita polynomisessa ajassa, mikä intuitiivisesti olisi yllättävää. Toisaalta kenelläkään ei ole hyvää ideaa, miten tällainen simulaatio voitaisiin todistaa mahdottomaksi. 294
295 Siis jos P = NP, niin SAT P. Ongelmalla SAT on merkittävä erityisominaisuus, että myös käänteinen pätee: Lause 5.15 (Cook-Levin): [Sipser Thm. 7.27] SAT P, jos ja vain jos P = NP. Tämä lause siis tarkoittaa, että tasan toinen seuraavista pätee: SAT P ja P = NP SAT P ja P NP. Jossittelu lauseessa ei tarkoita, että esim. väittämällä SAT P voisi olla useita totuusarvoja. Joko se on tosi tai se on epätosi, emme vain (ainakaan toistaiseksi) tiedä, kumpi. Itse asiassa mm. ongelmilla HAMPATH ja CLIQUE on sama ominaisuus, mutta historiallisesti SAT oli ensimmäinen, jolle tämä todistettiin. Emme esitä Cookin-Levinin lauseen todistusta, mutta selvitämme hieman siihen keskeisesti liittyvää NP-täydellisyyden käsitettä. 295
296 Tarvitsemme ensin pari teknistä apumääritelmää. Määritelmä 5.16: Turingin kone M laskee funktion f : Σ Σ, jos millä tahansa syötteellä w kone M pysähtyy tilanteeseen, jossa nauhan sisältö on f(w). Funktio f on laskettavissa polynomisessa ajassa, jos jokin polynomisessa ajassa toimiva Turingin kone laskee sen. Määritelmä 5.17: Olkoot A ja B aakkoston Σ formaaleja kieliä. Sanomme, että kieli A palautuu polynomisesti kieleen B, ja kirjoitamme A P B, jos jollain polynomisessa ajassa laskettavalla funktiolla f on ominaisuus w A f(w) B kaikilla w Σ. Tällöin f on polynominen palautus kielestä A kieleen B. 296
297 f B A fa A fa B Σ Σ Kielen A polynominen palautus f kieleen B. 297
298 Edellisten määritelmien keskeinen sovellus on seuraava: Lause 5.18: [Sipser Thm. 7.31] Jos A P B ja B P, niin A P. Todistus: Olkoon f funktio, jolla w A f(w) B, kuten palautuksen määritelmässä. Nyt kieli A voidaan tunnistaa seuraavalla algoritmilla: 1. Syötteellä w laske ensin z = f(w). 2. Jos z B, niin hyväksy. Jos z B, niin hylkää. Funktiota f koskevasta oletuksesta seuraa, että algoritmi hyväksyy, jos w A, ja hylkää, jos w A. Jos f on polynominen palautus, eli lisäksi laskettavissa polynomisessa ajassa, niin algoritmin askel 1 voidaan tehdä polynomisessa ajassa. Jos lisäksi B P, niin myös askel 2 voidaan tehdä polynomisessa ajassa. 298
299 Määritelmä 5.19: Kieli B on NP-täydellinen (NP-complete), jos B NP ja kaikilla A NP pätee A P B. Edellä mainitut ongelmat HAMPATH, CLIQUE ja SAT voidaan kaikki osoittaa NP-täydellisiksi. Lause 5.20: [Sipser Thm. 7.35] Jos B on NP-täydellinen ja B P, niin P = NP. Todistus: Seuraa suoraan määritelmästä ja lauseesta Intuitiivisesti NP-täydelliset ongelmat ovat luokan NP vaikeimpia mahdollisia ongelmia: Jos yhdellekin sellaiselle löytyisi polynomisessa ajassa toimiva algoritmi, tästä seuraisi heti P = NP. Kääntäen jos P NP, niin erityisesti NP-täydelliset ongelmat jäävät luokan P ulkopuolelle. 299
300 Cookin-Levinin lause seuraa nyt seuraavasta tuloksesta: Lause 5.21: [Sipser Thm. 7.37] SAT on NP-täydellinen. Todistuksen perusidea: Olkoon A NP. Siis A = L(N) jollain polynomisessa ajassa toimivalla epädeterministisellä Turingin koneella N. Koneen N rakenteen perusteella muodostetaan polynomisessa ajassa laskettava funktio f N. Funktion arvo f N (w) on propositiokaava, joka simuloi koneen N laskentaa syötteellä w. Jos koneella on hyväksyvä laskenta, niin f N (w) on toteutuva, muuten ei. Kaavan f N (w) muodostamisen yksityiskohdat ovat jossain määrin teknisiä. Kun SAT on todistettu NP-täydelliseksi, voidaan tämän avulla todistaa (hieman) kevyemmällä tekniikalla monien muiden ongelmien NP-täydellisyys. NP-täydellisiä ongelmia tunnetaan satoja (ellei tuhansia). Ne liittyvät verkkoihin, logiikkaan, pakkausongelmiin ja lukuisiin muihin yleisiin ja erityisiin sovelluksiin. NP-täydelliset ongelmat ovat tehokkaan laskettavuuden rajamailla, joten niiden algoritmiikka on haastavaa. Asiaa käsitellään mm. kursseilla Algoritmien suunnittelu ja analyysi sekä Diskreetti optimointi. 300
301 Lopuksi Kurssin sisältöä voidaan tarkastella kahdesta näkökulmasta: 1. Perustiedot formaaleista kielistä ja niiden tunnistamisesta; esim. kielen määritteleminen äärellisen automaatin, säännöllisen lausekkeen tai yhteydettömän kieliopin avulla, em. formalismien väliset yhteydet, Turingin kone yleisenä algoritmin mallina ja laskennallisen vaikeuden perustulokset (ratkeamattomuus, NP-täydellisyys) 2. Johdatus tietojenkäsittelyteoriaan ja sen metodiikkaan; erityisesti matematiikan soveltaminen laskennan mallintamiseen ja miten väitteet perustellaan täsmällisesti. Käydään lyhyesti läpi kurssin sisältöä tältä kannalta. 301
302 Säännölliset kielet Käytännön ohjelmoinnissa hyödyllistä: tilasiirtymäkone laskennan mallina säännölliset lausekkeet ja äärelliset automaatit Teoreettisia ajatusmalleja: epädeterministinen laskenta mallien väliset konversiot (esim. NFA DFA) laskulaitteen ja kuvausformalismin ekvivalenssi (DFA vs. säännöllinen lauseke) luokan sulkeumaominaisuudet mahdottomuustodistukset (pumppauslemma) Jatkoaiheita: äärellisen automaatin yleistykset; äärelliset automaatit merkkijonoalgoritmeissa 302
303 Yhteydettömät kielet Käytännön ohjelmoinnissa hyödyllistä: 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 Jatkoaiheita: sovellukset ohjelmointikielissä ja luonnollisessa kielessä 303
304 Laskettavuus ja laskennan vaativuus Tärkeitä peruskäsitteitä: Churchin-Turingin teesi; universaali Turingin kone ratkeamattomat ongelmat polynominen aikavaativuus NP-täydelliset ongelmat Todistustekniikoita yms.: laskennan aikavaativuuden mallintaminen polynomisesti ekvivalentit laskennan mallit (esim. yksi- vs. moninauhainen Turingin kone) numeroituvuus vs. ylinumeroituvuus; diagonalisointi epädeterministinen aikavaativuus; polynominen palautus. Jatkoaiheita: laskennan vaativuus; (matemaattinen) logiikka 304
305 Muista antaa kurssipalaute! Loppu 305
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
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ä,
Formalisoimme nyt edellä kuvatun laskennan.
Formalisoimme nyt edellä kuvatun laskennan. Jos M = (Q, Σ, δ, q, F ) on äärellinen automaatti ja w = w... w n on n merkkiä pitkä aakkoston Σ merkkijono, niin automaatti M hyväksyy merkkijonon w, jos on
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)
Ää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ää
Jos sekaannuksen vaaraa ei ole, samastamme säännöllisen lausekkeen ja sen esittämän kielen (eli kirjoitamme R vaikka tarkoitammekin L(R)).
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
Laskennan mallit
582206 Laskennan mallit luennot syksyllä 2007, periodit I II Jyrki Kivinen tietojenkäsittelytieteen aineopintokurssi, 6 op, pääaineopiskelijoille pakollinen esitietoina Tietorakenteet (ja sen esitiedot)
Laskennan mallit
582206 Laskennan mallit luennot syksyllä 2010, periodit I II Jyrki Kivinen tietojenkäsittelytieteen aineopintokurssi, 6 op, pääaineopiskelijoille pakollinen esitietoina Tietorakenteet (ja sen esitiedot)
Laskennan mallit. luennot syksyllä 2018, periodi I Jyrki Kivinen. tietojenkäsittelytieteen aineopintokurssi, pääaineopiskelijoille pakollinen
Laskennan mallit luennot syksyllä 2018, periodi I Jyrki Kivinen tietojenkäsittelytieteen aineopintokurssi, pääaineopiskelijoille pakollinen laajuus 5 op (korvaa vanhan samannimisen 8 op:n kurssin) esitietoina
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
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.
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
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
Laskennan mallit
582206 Laskennan mallit luennot syksyllä 2006, periodit I II Jyrki Kivinen tietojenkäsittelytieteen aineopintokurssi, 6 op, pääaineopiskelijoille pakollinen esitietoina Tietorakenteet (ja sen esitiedot)
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
Turingin koneen laajennuksia
Turingin koneen laajennuksia Turingin koneen määritelmään voidaan tehdä erilaisia muutoksia siten että edelleen voidaan tunnistaa tasan sama luokka kieliä. Moniuraiset Turingin koneet: nauha jakautuu k
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
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
TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012
TIEA241 Automaatit ja kieliopit, kevät 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 12. tammikuuta 2012 Sisällys Sisällys Äärellisiä automaatteja PUSH ON PUSH OFF Q T Q J C C H S C,Q C,Q 0 50s 1e
Rekursiivinen Derives on periaatteessa aivan toimiva algoritmi, mutta erittäin tehoton. Jos tarkastellaan esim. kieliopinpätkää
Rekursiivinen Derives on periaatteessa aivan toimiva algoritmi, mutta erittäin tehoton. Jos tarkastellaan esim. kieliopinpätkää S AB CA... A CB...... ja kutsua Derives(S, abcde), niin kutsu Derives(B,
(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
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.
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
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ä
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,
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
DFA:n käyttäytyminen ja säännölliset kielet
säännölliset kielet TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 9. marraskuuta 2015 Sisällys toiminta formaalisti Olkoon M = (Q, Σ, δ, q 0, F) deterministinen
Äärellisten automaattien ja säännöllisten lausekkeiden minimointi
Äärellisten automaattien ja säännöllisten lausekkeiden minimointi Timi Suominen, Riia Ohtamaa ja Pessi Moilanen Helsinki..01 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Äärellisten automaattien
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
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).
Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:
Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: S A S B Samaan jäsennyspuuhun päästään myös johdolla S AB Ab ab: S A S B Yhteen jäsennyspuuhun liittyy aina tasan yksi vasen
Säännöllisten operaattoreiden täydentäviä muistiinpanoja
Säännöllisten operttoreiden täydentäviä muistiinpnoj Antti-Juhni Kijnho 1. huhtikuut 2011 Vnht määritelmät Määritelmä 1. Äärellinen epätyhjä joukko on merkistö, j sen lkioit kutsutn merkeiksi. Määritelmä
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ä
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
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
Pinoautomaatit. Pois kontekstittomuudesta
TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. joulukuuta 2015 Sisällys Pinoautomaatti NFA:n yleistys automaatilla on käytössään LIFO-muisti 1 eli pino Pino
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,
M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)
Tik-79.148 Kevät 2001 Tietojenkäsittelyteorian perusteet Laskuharjoitus 7 Demonstraatiotehtävien ratkaisut 1. Pinoautomaatti M = K Σ Γ s F missä K Σ s ja F on määritelty samalla tavalla kuin tilakoneellekin.
Tietojenkäsittelyteorian alkeet, osa 2
TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 12. syyskuuta 2016 Sisällys vs Ovat eri asioita! Älä sekoita niitä. Funktiot Funktio f luokasta A luokkaan B, merkitään
TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 26. tammikuuta 2012
TIEA241 Automaatit ja kieliopit, kevät 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. tammikuuta 2012 Sisällys Luennon pähkinä Millä tavalla voidaan rakentaa tietokoneohjelma (tai kirjasto), joka
Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja
582206 Laskennan mallit (syksy 2009) Harjoitus 11, ratkaisuja 1. Seuraavissa laskennoissa tilat on numeroitu sarakkeittain ylhäältä alas jättäen kuitenkin hyväksyvä tila välistä. Turingin koneen laskenta
Esimerkki 2.28: Tarkastellaan edellisen sivun ehdot (1) (3) toteuttavaa pinoautomaattia, jossa päätemerkit ovat a, b ja c ja pinoaakkoset d, e ja $:
Esimerkki 2.28: Tarkastellaan edellisen sivun ehdot (1) (3) toteuttavaa pinoautomaattia, jossa päätemerkit ovat a, b ja c ja pinoaakkoset d, e ja $: a, ε d b, d ε ε, ε $ b, d ε 1 2 3 6 c, ε e c, ε e c,
Ei-yhteydettömät kielet [Sipser luku 2.3]
Ei-yhteydettömät kielet [Sipser luku 2.3] Yhteydettömille kielille pätee samantapainen pumppauslemma kuin säännöllisille kielille. Siinä kuitenkin pumpataan kahta osamerkkijonoa samaan tahtiin. Lause 2.25
Laskennan teoria
581336-0 Laskennan teoria luennot syyslukukaudella 2004 Jyrki Kivinen tietojenkäsittelytieteen laudatur-kurssi, 3 ov pakollinen tietojenkäsittelytieteen suuntautumisvaihtoehdossa, opettajan suuntautumisvaihtoehdossa
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
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
S BAB ABA A aas bba B bbs c
T-79.148 Kevät 2003 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut 4. Tehtävä: Laadi algoritmi, joka testaa onko annetun yhteydettömän kieliopin G = V, Σ, P, S) tuottama
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,
T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut
T-79.148 Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut 4. Tehtävä: Laadi algoritmi, joka testaa onko annetun yhteydettömän kieliopin G = V, Σ, P, S tuottama
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.
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.
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
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
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
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,
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
Pinoautomaatit. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 6. lokakuuta 2016 TIETOTEKNIIKAN LAITOS
.. TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 6. lokakuuta 2016 Sisällys. Harjoitustehtävätilastoja Tilanne 6.10.2016 klo 8:28 passed potential redo submitters
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
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
Osoitamme, että jotkut kielet eivät ole säännöllisiä eli niitä ei voi tunnistaa äärellisellä automaatilla.
Ei-säännöllisiä kieliä [Sipser luku 1.4] Osoitamme, että jotkut kielet eivät ole säännöllisiä eli niitä ei voi tunnistaa äärellisellä automaatilla. Tulos ei sinänsä ole erityisen yllättävä, koska äärellinen
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
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
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
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ä
δ : (Q {q acc, q rej }) (Γ k {, }) Q (Γ k {, }) {L, R}.
42 Turingin koneiden laajennuksia 1 oniuraiset koneet Sallitaan, että Turingin koneen nauha koostuu k:sta rinnakkaisesta urasta, jotka kaikki kone lukee ja kirjoittaa yhdessä laskenta-askelessa: Koneen
ICS-C2000 Tietojenkäsittelyteoria. Tähän mennessä: säännölliset kielet. Säännöllisten kielten pumppauslemma M :=
ICS-C2000 Tietojenkäsittelyteoria Luento 5: Säännöllisten kielten pumppauslemma; yhteydettömät kieliopit Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Alue ja aiheet: Orposen prujun
TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 9. lokakuuta 2016
TIEA24 Automaatit ja kieliopit, syksy 206 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 9. lokakuuta 206 Sisällys Kolme laskennan mallia kuvitteellisia (abstrakteja) koneita eli automaatteja lukevat syötteen
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ää
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
ÄÄRELLISTEN AUTOMAATTIEN MINIMOINTI. 1. Äärelliset automaatit Äärellinen automaatti (DFA = deterministic finite automaton) on
ÄÄRELLISTEN AUTOMAATTIEN MINIMOINTI MIKKO KANGASMÄKI. Äärelliset automaatit Äärellinen automaatti (DFA = deterministic finite automaton) on viisikko (Q, Σ, s, δ, F ), missä Q on äärellinen joukko tiloja
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
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):
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
815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
Diskreetin Matematiikan Paja Ratkaisuhahmotelmia viikko 1. ( ) Jeremias Berg
Diskreetin Matematiikan Paja Ratkaisuhahmotelmia viikko 1. (14.3-18.3) Jeremias Berg 1. Luettele kaikki seuraavien joukkojen alkiot: (a) {x Z : x 3} (b) {x N : x > 12 x < 7} (c) {x N : 1 x 7} Ratkaisu:
ongelma A voidaan ratkaista ongelman B avulla, joten jossain mielessä
Edellä esitetyt kielten A TM ja HALT TM ratkeamattomuustodistukset ovat esimerkkejä palautuksesta (reduction). Intuitiivisesti ongelman A palauttaminen ongelmaan B tarkoittaa, että Oletetaan, että meillä
