Forening af regulære sprog
Vi har to regulære sprog L1, L2. Vi viser, at deres forening L = L1 ∪ L2 også er et regulært sprog.
Fremgangsmåde med en deterministisk automat
Idéen bag fremgangsmåden
Vi har to regulære sprog L1 og L2 og vil vise, at deres forening L1 ∪ L2 igen er et regulært sprog. Da L1 og L2 er regulære sprog, findes der endelige automater A1 og A2, som accepterer sprogene L1 og L2, dvs. der gælder L(A1) = L1 og L(A2) = L2. Vi konstruerer nu en endelig automat A, som vil acceptere sproget L1 ∪ L2, og dermed viser vi, at sproget L1 ∪ L2 er regulært.
Hvordan gør vi det? Vi har de endelige automater A1 og A2, som accepterer de enkelte sprog. Vi kan sige, at ordet w hører til sproget L1 ∪ L2, netop hvis mindst én af automaterne A1 eller A2 accepterer det.
Automaten A kunne fungere sådan, at den for inputtet w simulerer automatens A1 beregning for inputtet w. Hvis A1 accepterer ordet w, accepterer A også ordet w. Hvis A1 afviser ordet w, forsøger A derefter at simulere A2's beregning for inputtet w. Hvis A2 accepterer ordet w, accepterer A også ordet w. I modsat fald afviser den.
Tilbage er at formalisere, hvad det betyder, at automaten A »simulerer« en anden automats beregning.
Formalisering
Vi har to regulære sprog L1 og L2, som accepteres af de endelige automater
Vi konstruerer en endelig automat A = ⟨Q, Σ, δ, q, F⟩, som vil acceptere sproget L = L1 ∪ L2. Vi udnytter idéen om at simulere to automater A1, A2. Forestil dig, at vi har inputordet w = w1w2… wn, og at vi nu samtidig simulerer forløbet af automaterne A1 og A2 for ordet w. Startkonfigurationen for automaten A1 er ⟨q1, w1w2… wn⟩, startkonfigurationen for A2 er ⟨q2, w1w2… wn⟩. I hver automat udfører vi nu et beregningstrin, hvorved vi kommer til konfigurationerne ⟨δ1(q1, w1), w2… wn⟩ og ⟨δ2(q2, w1), w2… wn⟩.
Vi ser, at disse konfigurationer kun adskiller sig i første komponent, mens den anden — den endnu ikke læste del af ordet — altid er den samme. Under simulationen behøver vi derfor ikke at holde styr på to konfigurationer for to automater, men én konfiguration af formen ⟨⟨qi, qj⟩, wl… wn⟩ er nok, hvor qi ∈ Q1 og qj ∈ Q2. Med andre ord får den automat A, vi konstruerer, startkonfigurationen ⟨⟨q1, q2⟩, w⟩. Første del af parret ⟨q1, q2⟩ er den tilstand, som automaten A1 aktuelt befinder sig i, og anden komponent er automatens A2 aktuelle tilstand.
Vi kan altså skrive, at den automat A, vi konstruerer, har tilstandsmængden Q = Q1 × Q2. Det er det kartesiske produkt af tilstandene fra de to foregående automater. Den følgende idé er, at automaten A har 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, så går automaten A for symbolet w1 over til tilstanden ⟨qi, qj⟩.
Overgangsfunktionen δ skriver vi således (her antager vi allerede, at vi aktuelt er i tilstandene qi og qj):
Nu mangler kun detaljerne. For alfabetet gælder Σ= Σ1 ∪ Σ2. Starttilstanden er q = ⟨q1, q2⟩. Og accepttilstandene er alle par ⟨qi, qj⟩ sådan, at enten qi ∈ F1 eller qj ∈ F2.
Illustration af fremgangsmåden
Vi har to automater. Den første er automaten A1, som accepterer alle ord (inklusive det tomme ord), hvor nuller og enere afløser hinanden, dvs. ord af formen 01, 0101, 010101, …
Den næste automat A2 accepterer ord, der indeholder mindst ét nul:
Foreningen af disse sprog er ord, der enten indeholder et nul eller er af formen 01, 0101, … Nu konstruerer vi en endelig automat A = ⟨Q, Σ, δ, q, F⟩, som netop accepterer dette forenede sprog. Først viser vi, hvordan tilstandene i denne nye automat A kommer til at se ud. Det bliver det kartesiske produkt af tilstandene i den første og den anden automat:
Sådan ser de seks tilstande ud i automaten A, som accepterer det forenede sprog L(A1) ∪ L(A2). I diagrammet ville de se sådan ud:
Du skal ikke blive forskrækket over, at vi har tilstande, der består af par af tilstande — det tjener blot til bedre overblik over, hvad der egentlig sker i automaten. Tilstandene kunne sagtens hedde klassisk q0, …, q5. Accepttilstandene er de tilstande, der indeholder enten tilstanden q0 eller p1, som er accepttilstande i de oprindelige automater. Starttilstanden er ⟨q0, p0⟩.
Nu skal vi finde alle overgange. Vi opstiller en sådan tabel:
Og udfylder efterhånden tabellen. Først finder vi ud af, hvor overgangen fra tilstanden ⟨q0, p0⟩ fører hen ved inputtet 0. Vi finder ud af, hvor overgangen fra tilstanden q0 fører hen ved inputtet 0 i automaten A1: den fører til tilstanden q1. I automaten A2 fører overgangen fra p0 ved nul til tilstanden p1. Så i tabellen skriver vi ⟨q1, p1⟩:
Ved inputtet 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 dermed tilstanden ⟨q2, p0⟩.
Vi udfylder resten af tabellen:
Og ud fra denne tabel tegner vi blot resten af diagrammet.
Vi kan prøve, om automaten fungerer, som den skal. Vi forsøger at acceptere ordet 0100. Automaten gennemløber efterhånden tilstandene
Da tilstanden ⟨q2, p1⟩ er en accepttilstand, accepterer automaten A ordet 0100. Hvordan ville det gå, hvis vi forsøgte at lade automaterne A1 og A2 acceptere ordet 0100? Automaten A1 ville efterhånden gennemløbe disse tilstande:
Automaten endte i tilstanden q2, som ikke er en accepttilstand, så automaten A1 ville ikke acceptere dette ord. Hvad med automaten A2?
Tilstanden p1 er en accepttilstand, så automaten A2 ville acceptere ordet 0100. Læg mærke til, at automaterne A1 og A2 endte i tilstandene q2 og p1, hvilket stemmer overens med, at automaten A endte i tilstanden ⟨q2, p1⟩.
Fremgangsmåde med en ikke-deterministisk automat
Eksempel
At mængden af regulære sprog er lukket under forening kan vi også vise ved at konstruere en ikke-deterministisk automat, som bliver meget enklere.
Vi har altså to regulære sprog L1, L2 og vil vise, at deres forening L = L1 ∪ L2 også er et regulært sprog. Da L1, L2 er regulære sprog, må der findes automater A1, A2, som accepterer disse sprog. Dvs. der gælder, at L(A1) = L1 og L(A2) = L2. Ved hjælp af disse automater konstruerer vi en automat A, som vil acceptere sproget L, dvs. L(A) = L.
Lad os antage, at de endelige automater A1 og A2 ser sådan ud:
og
Den automat, der ville acceptere foreningen af begge sprog, konstruerer vi ved at oprette en ny starttilstand og fra denne tilstand føre to epsilon-overgange til de oprindelige starttilstande. Det er alt. Automaten ville se sådan ud:
Formalisering
Vi har to automater A1 = ⟨Q1, Σ, δ1, q1, F1⟩ og A2 = ⟨Q2, Σ, δ2, q2, F2⟩. Vi konstruerer en automat A = ⟨Q, Σ, δ, q0, F⟩, som vil acceptere foreningen af de sprog, der accepteres af de foregående automater, dvs. L(A) = L(A1) ∪ L(A2). Her gælder:
- Q = Q1 ∪ Q2 ∪ {q0}
- F = F1 ∪ F2
Og overgangsfunktionen δ definerer vi således:
Kilder
Kapitler: Lukkethed af regulære sprog, Forening af regulære sprog, Fællesmængde af regulære sprog, Differens af regulære sprog, Komplement af et regulært sprog, Konkatenering af regulære sprog, Kleene-stjerne af et regulært sprog