✖

Vereniging van reguliere talen

Neem twee reguliere talen L1, L2. We bewijzen dat hun vereniging L = L1 ∪ L2 ook een reguliere taal is.

Werkwijze met een deterministische automaat

Idee van de werkwijze

We hebben twee reguliere talen L1 en L2 en willen bewijzen dat hun vereniging L1 ∪ L2 weer een reguliere taal is. Omdat L1 en L2 reguliere talen zijn, bestaan er eindige automaten A1 en A2 die de talen L1 en L2 accepteren, dus er geldt L(A1) = L1 en L(A2) = L2. We construeren vervolgens een eindige automaat A die de taal L1 ∪ L2 accepteert, waarmee we bewijzen dat de taal L1 ∪ L2 regulier is.

Hoe doen we dat? We hebben de eindige automaten A1 en A2 bij de hand, die de afzonderlijke talen accepteren. We kunnen zeggen dat een woord w tot de taal L1 ∪ L2 behoort dan en slechts dan als minstens een van de automaten A1 of A2 het accepteert.

De automaat A zou zo kunnen werken dat hij voor de invoer w de berekening van automaat A1 voor invoer w simuleert. Als A1 het woord w accepteert, accepteert A het woord w ook. Als A1 het woord w verwerpt, probeert A nog de berekening van A2 voor invoer w te simuleren. Als A2 het woord w accepteert, accepteert ook A het woord w. Anders verwerpt hij het.

We moeten nog formaliseren wat het betekent dat de automaat A de berekening van een andere automaat “simuleert”.

Formalisering

We hebben twee reguliere talen L1 en L2 die door de eindige automaten

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

worden geaccepteerd. We construeren een eindige automaat A = ⟨Q, Σ, δ, q, F⟩ die de taal L = L1 ∪ L2 accepteert. We gebruiken het idee van het simuleren van twee automaten A1, A2. Stel dat de invoer het woord w = w1w2… wn is en dat we nu tegelijk het verloop van de automaten A1 en A2 voor het woord w simuleren. De beginconfiguratie van automaat A1 is ⟨q1, w1w2… wn⟩, de beginconfiguratie van A2 is ⟨q2, w1w2… wn⟩. In elke automaat doen we nu een rekenstap, waarmee we in de configuraties ⟨δ1(q1, w1), w2… wn⟩ en ⟨δ2(q2, w1), w2… wn⟩ komen.

We zien dat deze configuraties alleen in de eerste component verschillen; de tweede — het nog niet gelezen deel van het woord — is altijd hetzelfde. Tijdens de simulatie hoeven we dus geen twee configuraties van twee automaten bij te houden, maar volstaat één configuratie van de vorm ⟨⟨qi, qj⟩, wl… wn⟩, waarbij qi ∈ Q1 en qj ∈ Q2. Met andere woorden: onze automaat A heeft de beginconfiguratie ⟨⟨q1, q2⟩, w⟩. Het eerste deel van het paar ⟨q1, q2⟩ is de toestand waarin automaat A1 zich op dat moment bevindt en de tweede component is de huidige toestand van automaat A2.

We kunnen dus opschrijven dat de verzameling toestanden van de automaat A gelijk is aan Q = Q1 × Q2. Dat is het cartesisch product van de toestanden van de twee vorige automaten. Het idee is verder dat automaat A de begintoestand ⟨q1, q2⟩ heeft en dat als automaat A1 voor het symbool w1 naar toestand qi gaat en automaat A2 voor het symbool w1 naar toestand qj gaat, automaat A voor het symbool w1 naar toestand ⟨qi, qj⟩ gaat.

De overgangsfunctie δ schrijven we zo op (hier gaan we er al van uit dat we op dat moment in de toestanden qi en qj zitten):

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

We hoeven nog maar een paar details te regelen. Voor het alfabet geldt Σ= Σ1 ∪ Σ2. De begintoestand is q = ⟨q1, q2⟩. En de eindtoestanden zijn alle paren ⟨qi, qj⟩ zodat qi ∈ F1 of qj ∈ F2.

Illustratie van de werkwijze

Neem twee automaten. De eerste is automaat A1, die alle woorden accepteert (inclusief het lege woord) waarin nullen en enen elkaar afwisselen, dus woorden van de vorm 01, 0101, 010101, …

De andere automaat A2 accepteert woorden die minstens één nul bevatten:

De vereniging van deze talen bestaat uit de woorden die ofwel een nul bevatten ofwel van de vorm 01, 0101, … zijn. Nu construeren we een eindige automaat A = ⟨Q, Σ, δ, q, F⟩ die precies deze verenigde taal accepteert. Eerst laten we zien hoe de toestanden van deze nieuwe automaat A eruit komen te zien. Dat wordt het cartesisch product van de toestanden van de eerste en de tweede automaat:

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

Zo zien de zes toestanden van automaat A eruit, die de verenigde taal L(A1) ∪ L(A2) accepteert. In het diagram zouden ze er zo uitzien:

Schrik er niet van dat we toestanden hebben die uit paren toestanden bestaan — dat dient alleen om beter te zien wat er in de automaat eigenlijk gebeurt. De toestanden zouden gerust gewoon q0, …, q5 kunnen heten. De eindtoestanden zijn de toestanden die ofwel toestand q0 ofwel p1 bevatten, de eindtoestanden van de oorspronkelijke automaten. De begintoestand is ⟨q0, p0⟩.

Nu moeten we alle overgangen vinden. We maken zo'n tabel:

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

En we vullen de tabel stap voor stap in. Eerst bepalen we waarheen de overgang vanuit toestand ⟨q0, p0⟩ bij invoer 0 loopt. We bepalen waarheen de overgang vanuit toestand q0 bij invoer 0 loopt in automaat A1: die loopt naar toestand q1. In automaat A2 loopt de overgang vanuit p0 bij nul naar toestand p1. We schrijven in de tabel dus ⟨q1, p1⟩:

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

Bij invoer 1 krijgen we: voor automaat A1 hebben we δ1(q0, 1) = q2 en voor automaat A2 hebben we δ2(p0, 1) = p0. We krijgen dus toestand ⟨q2, p0⟩.

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

We vullen de rest van de tabel in:

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⟩

En aan de hand van deze tabel tekenen we de rest van het diagram.

We kunnen uitproberen of de automaat werkt zoals het hoort. We proberen het woord 0100 te accepteren. De automaat doorloopt achtereenvolgens de toestanden

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

Omdat toestand ⟨q2, p1⟩ een eindtoestand is, accepteert automaat A het woord 0100. Hoe zou het aflopen als we het woord 0100 door de automaten A1 en A2 zouden laten accepteren? Automaat A1 zou achtereenvolgens deze toestanden doorlopen:

q0,q1,q0,q1,q2

De automaat eindigde in toestand q2, die geen eindtoestand is, dus automaat A1 zou dit woord niet accepteren. En automaat A2?

p0,p1,p1,p1,p1

Toestand p1 is een eindtoestand, dus automaat A2 zou het woord 0100 accepteren. Merk op dat de automaten A1 en A2 eindigden in de toestanden q2 en p1, wat overeenkomt met het feit dat automaat A eindigde in toestand ⟨q2, p1⟩.

Werkwijze met een niet-deterministische automaat

Voorbeeld

Dat de verzameling van de reguliere talen afgesloten is onder vereniging, kunnen we ook bewijzen door een niet-deterministische automaat te construeren, die veel eenvoudiger is.

We hebben dus twee reguliere talen L1, L2 en willen bewijzen dat hun vereniging L = L1 ∪ L2 ook een reguliere taal is. Omdat L1, L2 reguliere talen zijn, moeten er automaten A1, A2 bestaan die deze talen accepteren. Er geldt dus L(A1) = L1 en L(A2) = L2. Met deze automaten construeren we een automaat A die de taal L accepteert, dus L(A) = L.

Stel dat de eindige automaten A1 en A2 er zo uitzien:

en

Een automaat die de vereniging van beide talen accepteert, construeren we door een nieuwe begintoestand te maken en daaruit twee epsilonovergangen naar de oorspronkelijke begintoestanden te trekken. Dat is alles. De automaat zou er zo uitzien:

Formalisering

We hebben twee automaten A1 = ⟨Q1, Σ, δ1, q1, F1⟩ en A2 = ⟨Q2, Σ, δ2, q2, F2⟩. We construeren een automaat A = ⟨Q, Σ, δ, q0, F⟩ die de vereniging accepteert van de talen die door de vorige automaten worden geaccepteerd, dus L(A) = L(A1) ∪ L(A2). Daarbij geldt:

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

En de overgangsfunctie δ definiëren we zo:

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

Bronnen

Hoofdstukken: Afgeslotenheid van reguliere talen, Vereniging van reguliere talen, Doorsnede van reguliere talen, Verschil van reguliere talen, Complement van een reguliere taal, Concatenatie van reguliere talen, Afsluiting van een reguliere taal