Äärellinen automaatti
Äärellinen automaatti (englanniksi finite state machine tai finite automaton) on alkeellisen tietokoneen laskentamalli, joka koostuu joistakin tiloista ja siirtymistä ja joka osaa hyväksyä tai hylätä sille annetun sanan.
Esimerkki
Kuvaamme äärellisen automaatin aluksi epämuodollisesti tilakaavion avulla:
Automaatti koostuu tiloista. Kuvassa niitä on kolme, ja ne on piirretty ympyröinä: q0, q1 ja q2. Tilojen välillä on siirtymiä, eli nuolia. Automaatissa täytyy olla myös alkutila, tässä q0. Alkutila merkitään usein niin, että siihen osoittaa nuoli, joka ei lähde mistään tilasta. Lisäksi automaatissa on tavallisesti hyväksyvä tila eli lopputila. Se piirretään kaksinkertaisella viivalla, joten kuvassa se on tila q2.
Tällainen automaatti hyväksyy joitakin sanoja. Annamme automaatille sanoja, ja automaatti yrittää hyväksyä ne. Jos se hyväksyy sanan, se vastaa KYLLÄ, jos ei hyväksy, se vastaa EI. Automaattimme yrittää hyväksyä sanoja, jotka koostuvat kirjaimista ”a, b, c”, joten voimme yrittää hyväksyä sanan ”abbc”.
Aloitamme alkutilasta q0, ja syötteenä on sana ”abbc”. Seuraamme nyt nuolia.
Sana käydään läpi tavalliseen tapaan vasemmalta oikealle, eli ensimmäisenä käsitellään symboli ”a”. Syötteen ”a” nuoli johtaa tilaan q1, joten siirrymme sinne ja poistamme symbolin ”a” sanasta. Syötteenä on sana ”bbc”:
Syötteen ”b” nuoli osoittaa takaisin tilaan q1. Poistamme taas ensimmäisen kirjaimen, ja syötteenä on sana ”bc”. Pysymme jälleen tilassa q1. Lopuksi syötteenä on sana ”c”. Tilasta q1 syötteen ”c” nuoli vie meidät tilaan q2.
Olemme käyttäneet kaikki syötesanan kirjaimet ja olemme tilassa q2, joka on hyväksyvä tila. Tämä äärellinen automaatti siis hyväksyy sanan ”abbc”.
Jos emme olisi lopuksi hyväksyvässä tilassa, automaatti ei hyväksyisi sanaa. Automaatti ei hyväksyisi sanaa myöskään silloin, jos jossakin tilassa ei olisi mihin mennä. Esimerkiksi syötteellä ”ab” päätyisimme tilaan q1 ja jäisimme sinne — automaatti ei hyväksy tällaista sanaa. Jos kokeilisimme sanaa ”aabbc”, olisimme taas epäonnisia, koska tilasta q1 ei lähde nuolta kirjaimelle ”a”.
Äärellinen automaatti siis tunnistaa jonkin sanajoukon. Käytännössä automaatilla voisi selvittää esimerkiksi sen, onko annettu syötesana kelvollinen sähköpostiosoite.
Äärellisen automaatin määritelmä
Edellinen intuitiivinen käsitys äärellisestä automaatista täytyy muotoilla täsmällisesti, jotta automaateilla voi jatkossa työskennellä paremmin.
Sanomme, että äärellinen (deterministinen) automaatti on viisikko (Q, Σ, δ, q0, F), jossa
- Q on tilojen äärellinen joukko,
- Σ (iso sigma) on aakkosto (symbolien eli kirjainten äärellinen joukko),
- δ: Q × Σ ⟶ Q on siirtymäfunktio,
- q0 ∈ Q on alkutila,
- F ⊆ Q on lopputilojen (hyväksyvien tilojen) joukko.
Palataan edelliseen automaattiin,
jolloin voimme sanoa, että tilojen joukossa Q on kolme tilaa: Q = {q0, q1, q2}. Aakkosto Σ sisältää kirjaimet, joista voimme koostaa sanoja, jotka automaatti sitten hyväksyy tai hylkää. Tässä se on todennäköisesti aakkosto Σ= {a, b, c}, mutta se voi olla myös mikä tahansa sen ylijoukko. Alkutila q0 on tila q0, siinä ei ole mitään muutosta. Lopputilojen joukossa on tässä automaatissa vain yksi tila F = {q2}.
Siirtymäfunktiolla tarkoitetaan niitä kolmea nuolta, joissa on kirjaimet. Jos merkintä δ: Q × Σ ⟶ Q hämmentää, se tarkoittaa vain sitä, että δ on funktio (tarkemmin sanoen kuvaus), joka ottaa kaksi parametria: tilan joukosta Q ja kirjaimen joukosta Σ. Kun funktiota kutsutaan, se palauttaa uuden tilan. Siirtymäfunktiomme voisi määritellä taulukkona näin:
Jos siis kutsumme δ(q1, c), sovelletaan kolmatta riviä ja funktio vastaa tilalla q2 — aivan kuten kaavio. Jos olemme tilassa q1 ja syötteenä on kirjain ”c”, päädymme tilaan q2. Ennen kuin määrittelemme täsmällisesti, mitä tarkoittaa, että automaatti hyväksyy jonkin sanan, nojaamme käsitteen intuitiiviseen ymmärtämiseen ja katsomme lisää esimerkkejä.
Lisää esimerkkejä
-
Muodosta automaatti, joka toimii binääriaakkoston Σ= {0, 1} yllä ja hyväksyy vain sellaiset sanat, jotka päättyvät ykköseen. Se hyväksyy esimerkiksi sanat 1, 01, 000001, 0101011.
Automaatissamme on kaksi tilaa — alkutila q0 ja lopputila q1. Aina kun syötteenä on numero 1, siirrymme lopputilaan q1 ja pysymme siinä. Jos taas syötteenä on numero 0, siirrymme ei-hyväksyvään tilaan q0 ja pysymme myös siinä.
-
Muodosta automaatti binääriaakkoston yllä, joka hyväksyy vain sellaiset sanat, joiden ensimmäinen kirjain on eri kuin viimeinen kirjain.
Automaatti jakautuu heti ensimmäisessä askeleessa kahdeksi ”aliautomaatiksi”. Jos sana alkaa nollalla, automaatti siirtyy vasempaan osaan ja jää sinne, jos se alkaa ykkösellä, se siirtyy oikeaan osaan. Sen jälkeen homma on perinteistä: jos olemme vasemmassa osassa ja syötteenä on 1, siirrymme lopputilaan ja jäämme siihen. Jos syötteenä on 0, siirrymme tilaan q1, joka ei ole lopputila.
Toisin kuin edellisissä automaateissa, tässä automaatissa on useita lopputiloja, eli F = {q3, q4}.
-
Muodosta automaatti binääriaakkoston yllä, joka hyväksyy vain sellaiset sanat, joissa ei ole kahta nollaa peräkkäin.
Tämä automaatti on mielenkiintoinen kahdesta syystä. Ensimmäinen on se, että se hyväksyy tyhjän sanan. Automaatille voi yrittää antaa tyhjän sanan, ja automaatti hyväksyy sen, jos alkutila on samalla lopputila, kuten tässä automaatissa on. Koska tyhjä sana on sana, jossa ei ole kahta nollaa peräkkäin, tämä on oikein. Toinen erikoisuus on se, että tämän automaatin kaikki tilat ovat lopputiloja. Ainoa tapaus, jossa automaatti ei hyväksyisi sanaa, on se, että tilasta ei lähde mitään siirtymää. Näin käy tilassa q1, jolla ei ole siirtymää syötteelle 0, koska silloin sanassa olisi kaksi nollaa peräkkäin.
-
Muodosta automaatti aakkoston {-,+,.,0,1,…,9} yllä, joka hyväksyy vain sellaiset sanat, jotka esittävät luvun. Se tarkoittaa joko kokonaislukua, esimerkiksi 2, 548, 98263, tai desimaalilukua, esimerkiksi 5584.48, 3.14, ja kumpaakin myös negatiivisena miinusmerkillä: -2, -548, -3.14, sekä erikseen kirjoitetulla plusmerkillä, eli +2, +548, +3.14. Lisäksi meidän täytyy pystyä kirjoittamaan luku 0.123 pelkästään muodossa .123 (ilman alun nollaa), myös molempien etumerkkien kanssa. Otamme käyttöön apumerkinnän: sen sijaan, että kirjoittaisimme kymmenen siirtymää kymmenelle numerolle, käytämme symbolia N. Huomaa, että tässä tehtävässä desimaalierotin on piste, kuten ohjelmoinnissa, koska se on aakkoston symboli.
-
Muodosta automaatti binääriaakkoston yllä, joka hyväksyy vain muotoa 0n1n olevat sanat, eli sanat, joiden alussa on tietty määrä nollia ja sen jälkeen yhtä monta ykköstä. Esimerkkejä tällaisista sanoista ovat 0011, 00001111, 01.
Tällaista automaattia ei voi rakentaa, koska emme voi mihinkään ”muistaa” nollien määrää. Meidän pitäisi luoda useita ”aliautomaatteja”, kuten toisessa esimerkissä, mutta näitä ”aliautomaatteja” pitäisi olla äärettömän monta, yksi jokaista arvoa n kohti.
Automaatin laskennan formalisointi
Olemme jo määritelleet äärellisen automaatin täsmällisesti. Seuraavaksi täytyy vielä määritellä, mitä tällainen automaatti oikeastaan tekee, eli määritellään automaatin laskenta.
Automaatin konfiguraatio: Sanomme, että pari (q, w) ∈ Q × Σ∗ on automaatin konfiguraatio, jossa q on tila, jossa automaatti on parhaillaan, ja w on sanan toistaiseksi lukematon osa. Σ∗ tarkoittaa aakkoston Σ sulkeumaa (Kleenen tähteä), eli kaikkien niiden sanojen joukkoa, jotka voi koota aakkoston Σ kirjaimista. Sulkeumaan kuuluu myös tyhjä sana, jota merkitsemme ε.
Jos meillä on automaatti (Q, Σ, δ, q0, F) ja yritämme hyväksyä sanan w, automaatti on alkukonfiguraatiossa (q0, w). Palataan automaattiin
ja halutaan hyväksyä sana w = abbc. Alkukonfiguraatio on silloin (q0, abbc).
Laskennan askel määritellään relaationa ↦ joukkojen (Q × Σ∗) × (Q × Σ∗) välillä, eli automaatin konfiguraatioiden välillä. Olkoon w = w0w1… wn sanan w toistaiseksi lukematon osa. Sanomme silloin, että parit (q1, w0w1… wn) ja (q2, w1… wn) ovat relaatiossa ↦, kirjoitetaan
täsmälleen silloin, kun δ(q1, w0) = q2. Palataan esimerkkiimme: alkukonfiguraatio on (q0, abbc). Kaaviosta näemme, että syötteellä ”a” voimme siirtyä tilaan q1. Voimme siis kirjoittaa
koska δ(q0, a) = q1. Näin teimme yhden laskennan askeleen — katsoimme, mihin tilaan meidän pitää annetulla syötteellä (= sanan lukemattoman osan ensimmäinen kirjain) mennä, siirryimme sinne ja poistimme sanan lukemattomasta osasta ensimmäisen kirjaimen. Näin saimme uuden konfiguraation.
Laskennan askelrelaation refleksiivistä ja transitiivista sulkeumaa merkitään ↦ ∗. Jos kirjoitamme K1 ↦ ∗ K2, missä K1, K2 ovat automaatin konfiguraatioita, se tarkoittaa, että konfiguraatiosta K1 päästään usean laskennan askeleen kautta konfiguraatioon K2, eli on olemassa äärellinen konfiguraatioiden jono, jolle:
Esimerkiksi automaatissamme pätee (q0, abbc) ↦ ∗ (q1, bc), koska kahden laskennan askeleen jälkeen jäljellä on sana ”bc” ja olemme tilassa q1. Siis on olemassa tämä konfiguraatioiden jono:
Automaatti hyväksyy sanan w täsmälleen silloin, kun on olemassa qf ∈ F, jolle
ja tila q2 on lopputila, q2 ∈ F.
Automaatin hyväksymä kieli on kaikkien niiden sanojen joukko, jotka automaatti hyväksyy. Automaatin A kieltä merkitsemme L(A). Pätee L(A) ⊆ Σ∗ ja
Säännöllinen kieli on kieli, jonka jokin äärellinen automaatti hyväksyy.
Kaksi äärellistä automaattia on ekvivalentteja, jos ne hyväksyvät saman kielen. Eli automaatit A1 ja A2 ovat ekvivalentteja, jos pätee L(A1) = L(A2).
Lähteet
Luvut: Äärellinen automaatti, Täydellinen automaatti, Epädeterministinen äärellinen automaatti, Epädeterministisen automaatin simulointi, NFA:n muuntaminen DFA:ksi