✖

Union av reguljära språk

Låt L1, L2 vara två reguljära språk. Vi bevisar att deras union L = L1 ∪ L2 också är ett reguljärt språk.

Metod med en deterministisk automat

Idén bakom metoden

Vi har två reguljära språk L1 och L2 och vill bevisa att deras union L1 ∪ L2 också är ett reguljärt språk. Eftersom L1 och L2 är reguljära språk finns det ändliga automater A1 och A2 som accepterar språken L1 och L2, alltså gäller L(A1) = L1 och L(A2) = L2. Vi konstruerar sedan en ändlig automat A som accepterar språket L1 ∪ L2, och därmed har vi bevisat att språket L1 ∪ L2 är reguljärt.

Hur gör vi det? Vi har de ändliga automaterna A1 och A2, som accepterar vart och ett av språken. Vi kan säga att ordet w tillhör språket L1 ∪ L2 om och endast om minst en av automaterna A1 och A2 accepterar det.

Automaten A skulle kunna fungera så att den för indata w simulerar automaten A1:s beräkning för indata w. Om A1 accepterar ordet w, accepterar också A ordet w. Om A1 förkastar ordet w, försöker A i stället simulera A2:s beräkning för indata w. Om A2 accepterar ordet w, accepterar också A ordet w. I annat fall förkastas ordet.

Nu återstår att formalisera vad det betyder att automaten A ”simulerar” en annan automats beräkning.

Formalisering

Vi har två reguljära språk L1 och L2 som accepteras av de ändliga automaterna

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

Vi konstruerar en ändlig automat A = ⟨Q, Σ, δ, q, F⟩ som accepterar språket L = L1 ∪ L2. Vi använder idén att simulera de två automaterna A1, A2. Tänk dig att vi har ordet w = w1w2… wn som indata och att vi samtidigt simulerar hur automaterna A1 och A2 arbetar med ordet w. Startkonfigurationen för automaten A1 är ⟨q1, w1w2… wn⟩ och startkonfigurationen för A2 är ⟨q2, w1w2… wn⟩. I varje automat utför vi nu ett beräkningssteg, och då hamnar vi i konfigurationerna ⟨δ1(q1, w1), w2… wn⟩ och ⟨δ2(q2, w1), w2… wn⟩.

Vi ser att konfigurationerna skiljer sig bara i den första komponenten. Den andra komponenten, den del av ordet som ännu inte har lästs, är alltid densamma. Under simuleringen behöver vi alltså inte hålla reda på två konfigurationer för två automater, utan en konfiguration av formen ⟨⟨qi, qj⟩, wl… wn⟩ räcker, där qi ∈ Q1 och qj ∈ Q2. Med andra ord har automaten A som vi konstruerar startkonfigurationen ⟨⟨q1, q2⟩, w⟩. Den första delen av paret ⟨q1, q2⟩ är det tillstånd som automaten A1 befinner sig i just nu, och den andra komponenten är det aktuella tillståndet i automaten A2.

Vi kan alltså skriva att automaten A har tillståndsmängden Q = Q1 × Q2. Det är den kartesiska produkten av tillstånden i de två tidigare automaterna. Nästa idé är att automaten A har starttillståndet ⟨q1, q2⟩, och om automaten A1 för symbolen w1 går över till tillståndet qi och automaten A2 för symbolen w1 går över till tillståndet qj, så går automaten A för symbolen w1 över till tillståndet ⟨qi, qj⟩.

Vi skriver övergångsfunktionen δ så här (här förutsätter vi redan att vi befinner oss i tillstånden qi och qj):

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

Nu återstår bara några detaljer. För alfabetet gäller Σ= Σ1 ∪ Σ2. Starttillståndet är q = ⟨q1, q2⟩. Sluttillstånden är alla par ⟨qi, qj⟩ sådana att antingen qi ∈ F1 eller qj ∈ F2.

Illustration av metoden

Låt oss ta två automater. Den första är automaten A1, som accepterar alla ord (inklusive det tomma ordet) där nollor och ettor alternerar, dvs. ord av formen 01, 0101, 010101, …

Den andra automaten A2 accepterar ord som innehåller minst en nolla:

Unionen av dessa språk består av de ord som antingen innehåller en nolla eller har formen 01, 0101, … Nu konstruerar vi en ändlig automat A = ⟨Q, Σ, δ, q, F⟩ som accepterar just detta unionsspråk. Först visar vi hur tillstånden i den nya automaten A ser ut. Det blir den kartesiska produkten av tillstånden i den första och den andra automaten:

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

Så här ser de sex tillstånden ut i automaten A, som accepterar unionsspråket L(A1) ∪ L(A2). I tillståndsdiagrammet skulle de se ut så här:

Bli inte förvirrad av att tillstånden består av par av tillstånd. Det är bara till för att ge bättre överblick över vad som händer i automaten. Tillstånden skulle lika gärna kunna heta q0, …, q5 som vanligt. Sluttillstånden är de tillstånd som innehåller antingen q0 eller p1, som är sluttillstånd i de ursprungliga automaterna. Starttillståndet är ⟨q0, p0⟩.

Nu måste vi hitta alla övergångar. Vi skriver upp en sådan tabell:

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

Sedan fyller vi i tabellen steg för steg. Först tar vi reda på vart övergången från tillståndet ⟨q0, p0⟩ leder för indata 0. Vi tittar på vart övergången från tillståndet q0 för indata 0 leder i automaten A1: den leder till tillståndet q1. I automaten A2 leder övergången från p0 för nollan till tillståndet p1. Därför skriver vi in ⟨q1, p1⟩ i tabellen:

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

För indata 1 får vi: för automaten A1 har vi δ1(q0, 1) = q2 och för automaten A2 har vi δ2(p0, 1) = p0. Vi får alltså tillståndet ⟨q2, p0⟩.

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

Vi fyller i resten av tabellen:

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⟩

Utifrån den här tabellen ritar vi sedan resten av diagrammet.

Vi kan pröva om automaten fungerar som den ska. Vi försöker låta den acceptera ordet 0100. Automaten går efter tur genom tillstånden

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

Eftersom tillståndet ⟨q2, p1⟩ är ett sluttillstånd accepterar automaten A ordet 0100. Hur skulle det gå om vi försökte låta automaterna A1 och A2 acceptera ordet 0100? Automaten A1 skulle gå genom följande tillstånd:

q0,q1,q0,q1,q2

Automaten slutade i tillståndet q2, som inte är ett sluttillstånd, så automaten A1 skulle inte acceptera ordet. Hur går det för automaten A2?

p0,p1,p1,p1,p1

Tillståndet p1 är ett sluttillstånd, så automaten A2 skulle acceptera ordet 0100. Lägg märke till att automaterna A1 och A2 slutade i tillstånden q2 och p1, vilket stämmer med att automaten A slutade i tillståndet ⟨q2, p1⟩.

Metod med en icke-deterministisk automat

Exempel

Att mängden av reguljära språk är sluten under union kan vi också bevisa genom att konstruera en icke-deterministisk automat, som blir mycket enklare.

Vi har alltså två reguljära språk L1, L2 och vill bevisa att deras union L = L1 ∪ L2 också är ett reguljärt språk. Eftersom L1, L2 är reguljära språk måste det finnas automater A1, A2 som accepterar dessa språk. Det vill säga L(A1) = L1 och L(A2) = L2. Med hjälp av de här automaterna konstruerar vi en automat A som accepterar språket L, dvs. L(A) = L.

Anta att de ändliga automaterna A1 och A2 ser ut så här:

och

En automat som accepterar unionen av de båda språken konstruerar vi genom att skapa ett nytt starttillstånd och från det tillståndet dra två epsilonövergångar till de ursprungliga starttillstånden. Det är allt. Automaten skulle se ut så här:

Formalisering

Vi har två automater A1 = ⟨Q1, Σ, δ1, q1, F1⟩ och A2 = ⟨Q2, Σ, δ2, q2, F2⟩. Vi konstruerar en automat A = ⟨Q, Σ, δ, q0, F⟩ som accepterar unionen av de språk som accepteras av de föregående automaterna, dvs. L(A) = L(A1) ∪ L(A2). Här gäller:

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

Övergångsfunktionen δ definierar vi så här:

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

Källor

Kapitel: Slutenhet hos reguljära språk, Union av reguljära språk, Snitt av reguljära språk, Differens av reguljära språk, Komplement till ett reguljärt språk, Konkatenering av reguljära språk, Kleenestjärnan av ett reguljärt språk