Säännöllisten kielten yhdiste
Olkoon meillä kaksi säännöllistä kieltä L1, L2. Todistamme, että niiden yhdiste L = L1 ∪ L2 on myös säännöllinen kieli.
Menetelmä deterministisen automaatin avulla
Menetelmän idea
Meillä on kaksi säännöllistä kieltä L1 ja L2, ja haluamme todistaa, että niiden yhdiste L1 ∪ L2 on jälleen säännöllinen kieli. Koska L1 ja L2 ovat säännöllisiä kieliä, on olemassa äärelliset automaatit A1 ja A2, jotka hyväksyvät kielet L1 ja L2, eli pätee L(A1) = L1 ja L(A2) = L2. Rakennamme seuraavaksi äärellisen automaatin A, joka hyväksyy kielen L1 ∪ L2, ja todistamme näin, että kieli L1 ∪ L2 on säännöllinen.
Miten teemme sen? Meillä on käsillä äärelliset automaatit A1 ja A2, jotka hyväksyvät kumpikin oman kielensä. Voimme sanoa, että sana w kuuluu kieleen L1 ∪ L2 täsmälleen silloin, kun ainakin toinen automaateista A1 tai A2 hyväksyy sen.
Automaatti A voisi toimia niin, että syötteellä w se simuloi automaatin A1 laskentaa syötteellä w. Jos A1 hyväksyy sanan w, myös A hyväksyy sanan w. Jos A1 hylkää sanan w, A yrittää vielä simuloida automaatin A2 laskentaa syötteellä w. Jos A2 hyväksyy sanan w, myös A hyväksyy sanan w. Muuten se hylkää.
Meidän täytyy vielä formalisoida, mitä tarkoittaa, että automaatti A ”simuloi” toisen automaatin laskentaa.
Formalisointi
Meillä on kaksi säännöllistä kieltä L1 ja L2, jotka äärelliset automaatit hyväksyvät:
Rakennamme äärellisen automaatin A = (Q, Σ, δ, q, F), joka hyväksyy kielen L = L1 ∪ L2. Hyödynnämme ajatusta kahden automaatin A1, A2 simuloinnista. Kuvitellaan siis, että syötteenä on sana w = w1w2… wn ja simuloimme nyt samanaikaisesti automaattien A1 ja A2 kulkua sanalle w. Automaatin A1 alkukonfiguraatio on (q1, w1w2… wn), automaatin A2 alkukonfiguraatio on (q2, w1w2… wn). Kummassakin automaatissa teemme nyt laskennan askeleen, jolloin päädymme konfiguraatioihin (δ1(q1, w1), w2… wn) ja (δ2(q2, w1), w2… wn).
Näemme, että nämä konfiguraatiot eroavat vain ensimmäisessä komponentissa, toinen komponentti — sanan lukematon osa — on aina sama. Simuloinnin aikana meidän ei siis tarvitse pitää yllä kahta kahden automaatin konfiguraatiota, vaan riittää yksi muotoa ((qi, qj), wl… wn) oleva konfiguraatio, jossa qi ∈ Q1 ja qj ∈ Q2. Toisin sanoen rakennettavan automaattimme A alkukonfiguraatio on ((q1, q2), w). Parin (q1, q2) ensimmäinen osa on tila, jossa automaatti A1 parhaillaan on, ja toinen komponentti on automaatin A2 nykyinen tila.
Voimme siis kirjoittaa, että rakennettavan automaatin A tilojen joukko on Q = Q1 × Q2. Se on kahden edellisen automaatin tilojen karteesinen tulo. Seuraava ajatus on, että automaatin A alkutila on (q1, q2), ja jos automaatti A1 siirtyy symbolilla w1 tilaan qi ja automaatti A2 siirtyy symbolilla w1 tilaan qj, automaatti A siirtyy symbolilla w1 tilaan (qi, qj).
Siirtymäfunktion δ kirjoitamme näin (oletamme tässä jo, että olemme parhaillaan tiloissa qi ja qj):
Jäljellä on enää pieniä yksityiskohtia. Aakkostolle pätee Σ= Σ1 ∪ Σ2. Alkutila on q = (q1, q2). Ja lopputilat ovat kaikki parit (qi, qj), joille pätee joko qi ∈ F1 tai qj ∈ F2.
Menetelmän havainnollistus
Olkoon meillä kaksi automaattia. Ensimmäinen on automaatti A1, joka hyväksyy kaikki sanat (myös tyhjän sanan), joissa nollat ja ykköset vuorottelevat, eli muotoa 01, 0101, 010101, … olevat sanat.
Toinen automaatti A2 hyväksyy sanat, joissa on ainakin yksi nolla:
Näiden kielten yhdisteeseen kuuluvat sanat, joissa on nolla tai jotka ovat muotoa 01, 0101, … Rakennamme nyt äärellisen automaatin A = (Q, Σ, δ, q, F), joka hyväksyy juuri tämän yhdistekielen. Näytämme ensin, miltä tämän uuden automaatin A tilat näyttävät. Ne ovat ensimmäisen ja toisen automaatin tilojen karteesinen tulo:
Nämä ovat kuusi tilaa automaatissa A, joka hyväksyy yhdistekielen L(A1) ∪ L(A2). Kaaviossa ne näyttäisivät tältä:
Älä säikähdä sitä, että tiloissa on tilaparit — se vain auttaa hahmottamaan, mitä automaatissa oikeastaan tapahtuu. Tilat voisivat aivan hyvin olla nimeltään tavallisesti q0, …, q5. Lopputilat ovat ne tilat, jotka sisältävät joko tilan q0 tai tilan p1, jotka ovat alkuperäisten automaattien lopputiloja. Alkutila on (q0, p0). Kaavioissa tilaparit on kirjoitettu kulmasulkeisiin, esimerkiksi ⟨ q0, p0⟩, mutta kyse on samasta parista (q0, p0).
Nyt meidän täytyy löytää kaikki siirtymät. Kirjoitamme tällaisen taulukon:
Ja täydennämme taulukkoa vähitellen. Ensimmäiseksi selvitämme, mihin johtaa siirtymä tilasta (q0, p0) syötteellä 0. Selvitämme, mihin johtaa siirtymä tilasta q0 syötteellä 0 automaatissa A1: se johtaa tilaan q1. Automaatissa A2 siirtymä tilasta p0 nollalla johtaa tilaan p1. Taulukkoon kirjoitamme siis (q1, p1):
Syötteellä 1 saamme: automaatille A1 on δ1(q0, 1) = q2 ja automaatille A2 on δ2(p0, 1) = p0. Saamme siis tilan (q2, p0).
Täydennämme taulukon loppuosan:
Ja tämän taulukon perusteella piirrämme enää kaavion loppuosan.
Voimme kokeilla, että automaatti toimii niin kuin pitää. Yritetään hyväksyä sana 0100. Automaatti käy läpi tilat
Koska tila (q2, p1) on lopputila, automaatti A hyväksyy sanan 0100. Miten kävisi, jos yrittäisimme hyväksyä sanan 0100 automaateilla A1 ja A2? Automaatti A1 kävisi läpi nämä tilat:
Automaatti päätyi tilaan q2, joka ei ole lopputila, joten automaatti A1 ei hyväksyisi tätä sanaa. Entä automaatti A2?
Tila p1 on lopputila, joten automaatti A2 hyväksyisi sanan 0100. Huomaa, että automaatit A1 ja A2 päätyivät tiloihin q2 ja p1, mikä sopii yhteen sen kanssa, että automaatti A päätyi tilaan (q2, p1).
Menetelmä epädeterministisen automaatin avulla
Esimerkki
Sen, että säännöllisten kielten joukko on suljettu yhdisteen suhteen, voimme todistaa myös rakentamalla epädeterministisen automaatin, joka on paljon yksinkertaisempi.
Meillä on siis kaksi säännöllistä kieltä L1, L2, ja haluamme todistaa, että niiden yhdiste L = L1 ∪ L2 on myös säännöllinen kieli. Koska L1, L2 ovat säännöllisiä kieliä, täytyy olla olemassa automaatit A1, A2, jotka hyväksyvät nämä kielet. Eli pätee L(A1) = L1 ja L(A2) = L2. Näiden automaattien avulla rakennamme automaatin A, joka hyväksyy kielen L, eli L(A) = L.
Oletetaan, että äärelliset automaatit A1 ja A2 näyttävät tältä:
ja
Automaatin, joka hyväksyisi molempien kielten yhdisteen, rakentaisimme luomalla uuden alkutilan ja viemällä tästä tilasta kaksi epsilon-siirtymää alkuperäisiin alkutiloihin. Siinä kaikki. Automaatti näyttäisi tältä:
Formalisointi
Meillä on kaksi automaattia A1 = (Q1, Σ, δ1, q1, F1) ja A2 = (Q2, Σ, δ2, q2, F2). Rakennamme automaatin A = (Q, Σ, δ, q0, F), joka hyväksyy edellisten automaattien hyväksymien kielten yhdisteen, eli L(A) = L(A1) ∪ L(A2). Tällöin pätee:
- Q = Q1 ∪ Q2 ∪ {q0}
- F = F1 ∪ F2
Ja siirtymäfunktion δ määrittelemme näin:
Lähteet
Luvut: Säännöllisten kielten sulkeumaominaisuudet, Säännöllisten kielten yhdiste, Säännöllisten kielten leikkaus, Säännöllisten kielten erotus, Säännöllisen kielen komplementti, Säännöllisten kielten konkatenaatio, Säännöllisen kielen Kleenen tähti