✖

Reguláris nyelvek uniója

Legyen adott két reguláris nyelv, L1, L2. Bebizonyítjuk, hogy az unió, L = L1 ∪ L2 is reguláris nyelv.

Eljárás determinisztikus automatával

Az eljárás ötlete

Adott két reguláris nyelv, L1 és L2, és be akarjuk bizonyítani, hogy az L1 ∪ L2 unió is reguláris nyelv. Mivel L1 és L2 reguláris nyelvek, léteznek olyan A1 és A2 véges automaták, amelyek elfogadják az L1, illetve az L2 nyelvet, vagyis L(A1) = L1 és L(A2) = L2. Ezután megszerkesztünk egy olyan A véges automatát, amely az L1 ∪ L2 nyelvet fogadja el, és ezzel bebizonyítjuk, hogy az L1 ∪ L2 nyelv reguláris.

Hogyan csináljuk? Kéznél van az A1 és A2 véges automata, amelyek külön-külön elfogadják a két nyelvet. Mondhatjuk, hogy a w szó pontosan akkor tartozik az L1 ∪ L2 nyelvbe, ha az A1 és A2 automaták közül legalább az egyik elfogadja.

Az A automata úgy működhetne, hogy a w bemenetre szimulálja az A1 automata működését a w bemeneten. Ha A1 elfogadja a w szót, akkor A is elfogadja a w szót. Ha A1 elutasítja a w szót, akkor A még megpróbálja szimulálni az A2 működését a w bemeneten. Ha A2 elfogadja a w szót, akkor A is elfogadja a w szót. Ellenkező esetben elutasítja.

Már csak azt kell pontosan megfogalmaznunk, mit jelent az, hogy az A automata „szimulálja” egy másik automata működését.

Formalizálás

Adott két reguláris nyelv, L1 és L2, amelyeket az alábbi véges automaták fogadnak el:

A1=⟨Q1,Σ1,δ1,q1,F1⟩A2=⟨Q2,Σ2,δ2,q2,F2⟩.

Megszerkesztjük az A = ⟨Q, Σ, δ, q, F⟩ véges automatát, amely az L = L1 ∪ L2 nyelvet fogadja el. Kihasználjuk az ötletet, hogy egyszerre szimuláljuk az A1, A2 automatákat. Képzeljük el, hogy a bemeneten a w = w1w2… wn szó van, és most egyszerre szimuláljuk az A1 és A2 működését a w szóra. Az A1 automata kezdőkonfigurációja ⟨q1, w1w2… wn⟩, az A2 kezdőkonfigurációja ⟨q2, w1w2… wn⟩. Mindkét automatában most végrehajtunk egy lépést, és így a ⟨δ1(q1, w1), w2… wn⟩ és a ⟨δ2(q2, w1), w2… wn⟩ konfigurációba jutunk.

Látjuk, hogy ezek a konfigurációk csak az első komponensben különböznek, a másodikban – a szó még el nem olvasott részében – mindig megegyeznek. A szimuláció során ezért nem kell két automata két konfigurációját nyilvántartanunk, elég egyetlen konfiguráció ⟨⟨qi, qj⟩, wl… wn⟩ alakban, ahol qi ∈ Q1 és qj ∈ Q2. Más szóval a megszerkesztendő A automata kezdőkonfigurációja ⟨⟨q1, q2⟩, w⟩ lesz. A ⟨q1, q2⟩ pár első tagja azt az állapotot jelöli, amelyben éppen az A1 automata van, a második tag pedig az A2 automata aktuális állapota.

Felírhatjuk tehát, hogy az A automata állapothalmaza Q = Q1 × Q2 lesz. Ez a két korábbi automata állapotainak Descartes-szorzata. Az ötlet a következő: az A automata kezdőállapota ⟨q1, q2⟩, és ha az A1 automata a w1 szimbólumra a qi állapotba megy át, az A2 automata pedig a w1 szimbólumra a qj állapotba, akkor az A automata a w1 szimbólumra a ⟨qi, qj⟩ állapotba megy át.

A δ átmeneti függvényt így írjuk fel (itt már feltesszük, hogy éppen a qi és qj állapotban vagyunk):

δ(⟨qi,qj⟩,w)=⟨δ1(qi,w),δ2(qj,w)⟩

Már csak az apróságok maradtak. Az ábécére Σ= Σ1 ∪ Σ2 teljesül. A kezdőállapot q = ⟨q1, q2⟩. A végállapotok pedig mindazok a ⟨qi, qj⟩ párok, amelyekre qi ∈ F1 vagy qj ∈ F2.

Az eljárás szemléltetése

Adott két automata. Az első az A1 automata, amely elfogadja az összes olyan szót (az üres szót is), amelyben felváltva követik egymást a nullák és az egyesek, vagyis a 01, 0101, 010101, … alakú szavakat.

A másik, az A2 automata azokat a szavakat fogadja el, amelyek tartalmaznak legalább egy nullát:

E két nyelv uniója azokból a szavakból áll, amelyek vagy tartalmaznak nullát, vagy 01, 0101, … alakúak. Most megszerkesztjük az A = ⟨Q, Σ, δ, q, F⟩ véges automatát, amely pontosan ezt az egyesített nyelvet fogadja el. Először megmutatjuk, hogyan néznek ki az új A automata állapotai. Ez az első és a második automata állapotainak Descartes-szorzata lesz:

Q=Q1×Q2={⟨q0,p0⟩,⟨q0,p1⟩,⟨q1,p0⟩,⟨q1,p1⟩,⟨q2,p0⟩,⟨q2,p1⟩}

Ez az A automata hat állapota, amely az L(A1) ∪ L(A2) egyesített nyelvet fogadja el. Az ábrán így néznének ki:

Ne ijedj meg attól, hogy az állapotok állapotpárokból állnak – ez csak azt segíti, hogy jobban átlássuk, mi történik az automatában. Az állapotokat akár egyszerűen q0, …, q5-nek is nevezhetnénk. A végállapotok azok az állapotok, amelyek a q0 vagy a p1 állapotot tartalmazzák, mert ezek az eredeti automaták végállapotai. A kezdőállapot ⟨q0, p0⟩.

Most meg kell találnunk az összes átmenetet. Felírunk egy ilyen táblázatot:

01⟨q0,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

A táblázatot fokozatosan töltjük ki. Először megnézzük, hová vezet átmenet a ⟨q0, p0⟩ állapotból a 0 bemenetre. Megnézzük, hová vezet átmenet a q0 állapotból a 0 bemenetre az A1 automatában: a q1 állapotba. Az A2 automatában a p0 állapotból a nullára a p1 állapotba vezet átmenet. Így a táblázatba a ⟨q1, p1⟩ állapotot írjuk:

01⟨q0,p0⟩⟨q1,p1⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Az 1 bemenetre ezt kapjuk: az A1 automatára δ1(q0, 1) = q2, az A2 automatára pedig δ2(p0, 1) = p0. Így a ⟨q2, p0⟩ állapotot kapjuk.

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Kitöltjük a táblázat többi részét:

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p1⟩⟨q2,p1⟩⟨q1,p0⟩⟨q2,p1⟩⟨q0,p0⟩⟨q1,p1⟩⟨q2,p1⟩⟨q0,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p1⟩⟨q2,p1⟩

E táblázat alapján pedig már csak be kell rajzolnunk az ábra többi részét.

Kipróbálhatjuk, hogy az automata úgy működik-e, ahogy kell. Próbáljuk meg elfogadtatni vele a 0100 szót. Az automata sorban ezeken az állapotokon megy végig:

⟨q0,p0⟩,⟨q1,p1⟩,⟨q0,p1⟩,⟨q1,p1⟩,⟨q2,p1⟩

Mivel a ⟨q2, p1⟩ állapot végállapot, az A automata elfogadja a 0100 szót. Mi történne, ha a 0100 szót az A1 és A2 automatával próbálnánk elfogadtatni? Az A1 automata sorban ezeken az állapotokon haladna végig:

q0,q1,q0,q1,q2

Az automata a q2 állapotban fejezte be, ami nem végállapot, tehát az A1 automata ezt a szót nem fogadná el. És az A2 automata?

p0,p1,p1,p1,p1

A p1 állapot végállapot, tehát az A2 automata elfogadná a 0100 szót. Figyeld meg, hogy az A1 és A2 automata a q2, illetve p1 állapotban fejezte be, ami összhangban van azzal, hogy az A automata a ⟨q2, p1⟩ állapotban fejezte be.

Eljárás nemdeterminisztikus automatával

Példa

Azt, hogy a reguláris nyelvek halmaza zárt az unióra, bebizonyíthatjuk egy sokkal egyszerűbb nemdeterminisztikus automata megszerkesztésével is.

Adott tehát két reguláris nyelv, L1, L2, és be akarjuk bizonyítani, hogy az unió, L = L1 ∪ L2 is reguláris nyelv. Mivel L1, L2 reguláris nyelvek, léteznie kell olyan A1, A2 automatáknak, amelyek elfogadják őket. Vagyis L(A1) = L1 és L(A2) = L2. Ezekből az automatákból megszerkesztjük az A automatát, amely az L nyelvet fogadja el, azaz L(A) = L.

Tegyük fel, hogy az A1 és A2 véges automata így néz ki:

és

Azt az automatát, amely elfogadná a két nyelv unióját, úgy szerkesztenénk meg, hogy létrehoznánk egy új kezdőállapotot, és ebből két epszilon-átmenetet vezetnénk az eredeti kezdőállapotokba. Ez az egész. Az automata így nézne ki:

Formalizálás

Adott két automata, A1 = ⟨Q1, Σ, δ1, q1, F1⟩ és A2 = ⟨Q2, Σ, δ2, q2, F2⟩. Megszerkesztjük az A = ⟨Q, Σ, δ, q0, F⟩ automatát, amely az előző automaták által elfogadott nyelvek unióját fogadja el, azaz L(A) = L(A1) ∪ L(A2). A következők teljesülnek:

  • Q = Q1 ∪ Q2 ∪ {q0}
  • F = F1 ∪ F2

A δ átmeneti függvényt pedig így definiáljuk:

δ(q,a)={δ1(q,a)haq∈Q1δ2(q,a)haq∈Q2{q1,q2}haq=q0∧a=ε∅haq=q0∧a≠ε

Források

Fejezetek: A reguláris nyelvek zártsága, Reguláris nyelvek uniója, Reguláris nyelvek metszete, Reguláris nyelvek különbsége, Reguláris nyelv komplementere, Reguláris nyelvek összefűzése, Reguláris nyelv lezárása