Union av regulære språk
La oss ha to regulære språk L1, L2. Vi skal bevise at unionen L = L1 ∪ L2 også er et regulært språk.
Framgangsmåte med deterministisk automat
Ideen bak framgangsmåten
Vi har to regulære språk L1 og L2, og vi vil bevise at unionen L1 ∪ L2 igjen er et regulært språk. Siden L1 og L2 er regulære språk, finnes det endelige automater A1 og A2 som aksepterer språkene L1 og L2, altså gjelder L(A1) = L1 og L(A2) = L2. Vi konstruerer så en endelig automat A som aksepterer språket L1 ∪ L2, og dermed beviser vi at språket L1 ∪ L2 er regulært.
Hvordan gjør vi det? Vi har de endelige automatene A1 og A2 som aksepterer hvert sitt språk. Vi kan si at ordet w tilhører språket L1 ∪ L2 hvis og bare hvis minst én av automatene A1 eller A2 aksepterer det.
Automaten A kunne fungere slik at den for input w simulerer beregningen til automaten A1 for input w. Hvis A1 aksepterer ordet w, aksepterer også A ordet w. Hvis A1 avviser ordet w, prøver A i tillegg å simulere beregningen til A2 for input w. Hvis A2 aksepterer ordet w, aksepterer også A ordet w. I motsatt fall avviser den.
Vi må da formalisere hva det betyr at automaten A «simulerer» beregningen til en annen automat.
Formalisering
Vi har to regulære språk L1 og L2 som aksepteres av de endelige automatene
Vi konstruerer en endelig automat A = ⟨Q, Σ, δ, q, F⟩ som aksepterer språket L = L1 ∪ L2. Vi bruker ideen om å simulere to automater A1, A2. La oss tenke oss at vi har ordet w = w1w2… wn som input, og at vi nå samtidig simulerer forløpet til automatene A1 og A2 for ordet w. Startkonfigurasjonen til automaten A1 er ⟨q1, w1w2… wn⟩, og startkonfigurasjonen til A2 er ⟨q2, w1w2… wn⟩. I hver automat utfører vi nå et beregningssteg, og da kommer vi til konfigurasjonene ⟨δ1(q1, w1), w2… wn⟩ og ⟨δ2(q2, w1), w2… wn⟩.
Vi ser at disse konfigurasjonene bare er forskjellige i den første komponenten, den andre — den delen av ordet som ikke er lest — er alltid den samme. Under simuleringen trenger vi derfor ikke å holde styr på to konfigurasjoner for to automater, men det er nok med én konfigurasjon på formen ⟨⟨qi, qj⟩, wl… wn⟩, der qi ∈ Q1 og qj ∈ Q2. Med andre ord får automaten A vi konstruerer, startkonfigurasjonen ⟨⟨q1, q2⟩, w⟩. Den første delen av paret ⟨q1, q2⟩ er tilstanden som automaten A1 befinner seg i akkurat nå, og den andre komponenten er den nåværende tilstanden til automaten A2.
Vi kan altså skrive at automaten A vi konstruerer, får mengden av tilstander Q = Q1 × Q2. Det blir det kartesiske produktet av tilstandene fra de to forrige automatene. Den neste ideen er at automaten A får starttilstanden ⟨q1, q2⟩, og hvis automaten A1 for symbolet w1 går over til tilstanden qi og automaten A2 for symbolet w1 går over til tilstanden qj, går automaten A for symbolet w1 over til tilstanden ⟨qi, qj⟩.
Overgangsfunksjonen δ skriver vi slik (her antar vi allerede at vi akkurat nå er i tilstandene qi og qj):
Nå gjenstår bare små detaljer. For alfabetet gjelder Σ= Σ1 ∪ Σ2. Starttilstanden er q = ⟨q1, q2⟩. Og sluttilstandene er alle par ⟨qi, qj⟩ slik at enten qi ∈ F1 eller qj ∈ F2.
Illustrasjon av framgangsmåten
La oss ha to automater. Den første er automaten A1, som aksepterer alle ord (inkludert det tomme ordet) der nuller og enere veksler, altså ord på formen 01, 0101, 010101, …
Den neste automaten A2 aksepterer ord som inneholder minst én null:
Unionen av disse språkene er ord som enten inneholder en null eller har formen 01, 0101, … Nå konstruerer vi den endelige automaten A = ⟨Q, Σ, δ, q, F⟩ som aksepterer akkurat dette språket. Først viser vi hvordan tilstandene i denne nye automaten A kommer til å se ut. Det blir det kartesiske produktet av tilstandene i den første og den andre automaten:
Dette er de seks tilstandene i automaten A, som aksepterer unionen L(A1) ∪ L(A2). I diagrammet ville de sett slik ut:
Ikke la deg skremme av at vi har tilstander som består av par av tilstander — det er bare for å gi bedre oversikt over hva som egentlig skjer i automaten. Tilstandene kunne gjerne hett q0, …, q5 som vanlig. Sluttilstandene er de tilstandene som inneholder enten tilstanden q0 eller p1, som er sluttilstandene i de opprinnelige automatene. Starttilstanden er ⟨q0, p0⟩.
Nå må vi finne alle overgangene. Vi skriver opp en slik tabell:
Og vi fyller ut tabellen etter hvert. Først finner vi ut hvor overgangen fra tilstanden ⟨q0, p0⟩ går ved input 0. Vi finner ut hvor overgangen fra tilstanden q0 går ved input 0 i automaten A1: den går til tilstanden q1. I automaten A2 går overgangen fra p0 ved null til tilstanden p1. Så vi skriver ⟨q1, p1⟩ i tabellen:
Ved input 1 får vi: for automaten A1 har vi δ1(q0, 1) = q2, og for automaten A2 har vi δ2(p0, 1) = p0. Vi får altså tilstanden ⟨q2, p0⟩.
Vi skriver inn resten av tabellen:
Og etter denne tabellen tegner vi bare resten av diagrammet.
Vi kan teste at automaten fungerer som den skal. Vi prøver å akseptere ordet 0100. Automaten går etter hvert gjennom tilstandene
Siden tilstanden ⟨q2, p1⟩ er en sluttilstand, aksepterer automaten A ordet 0100. Hvordan ville det gått hvis vi hadde prøvd å akseptere ordet 0100 med automatene A1 og A2? Automaten A1 ville etter hvert gått gjennom disse tilstandene:
Automaten endte i tilstanden q2, som ikke er en sluttilstand, så automaten A1 ville ikke akseptert dette ordet. Hva med automaten A2?
Tilstanden p1 er en sluttilstand, så automaten A2 ville akseptert ordet 0100. Legg merke til at automatene A1 og A2 endte i tilstandene q2 og p1, og det stemmer med at automaten A endte i tilstanden ⟨q2, p1⟩.
Framgangsmåte med ikke-deterministisk automat
Eksempel
At mengden av regulære språk er lukket under union, kan vi også bevise ved å konstruere en ikke-deterministisk automat, som blir mye enklere.
Vi har altså to regulære språk L1, L2, og vi vil bevise at unionen L = L1 ∪ L2 også er et regulært språk. Siden L1, L2 er regulære språk, må det finnes automater A1, A2 som aksepterer disse språkene. Altså gjelder L(A1) = L1 og L(A2) = L2. Ved hjelp av disse automatene konstruerer vi automaten A, som skal akseptere språket L, altså L(A) = L.
Anta at de endelige automatene A1 og A2 ser slik ut:
og
Automaten som aksepterer unionen av begge språkene, konstruerer vi ved å lage en ny starttilstand og la to epsilonoverganger gå fra denne tilstanden til de opprinnelige starttilstandene. Det er alt. Automaten ville sett slik ut:
Formalisering
Vi har to automater A1 = ⟨Q1, Σ, δ1, q1, F1⟩ og A2 = ⟨Q2, Σ, δ2, q2, F2⟩. Vi konstruerer automaten A = ⟨Q, Σ, δ, q0, F⟩ som skal akseptere unionen av språkene som de forrige automatene aksepterer, altså L(A) = L(A1) ∪ L(A2). Da gjelder:
- Q = Q1 ∪ Q2 ∪ {q0}
- F = F1 ∪ F2
Og overgangsfunksjonen δ definerer vi slik:
Kilder
Kapitler: Lukkethet av regulære språk, Union av regulære språk, Snitt av regulære språk, Differanse av regulære språk, Komplementet til et regulært språk, Konkatenering av regulære språk, Kleene-stjernen til et regulært språk