✖

Omdannelse af automat til regulært udtryk

Vi viser, hvordan man omdanner en vilkårlig endelig automat til et regulært udtryk.

Beskrivelse af algoritmen

Som input har vi en NFA A. Først gør vi den til en GNFA. I anden fase fjerner vi i hvert trin én tilstand, ændrer overgangsfunktionen korrekt og gentager, indtil der kun er to tilstande tilbage — start- og accepttilstanden. Mellem dem går der en kant, som har et regulært udtryk som mærkat, og det er resultatet af hele algoritmen. Hele fremgangsmåden består således først og fremmest i at fjerne en tilstand og derefter rette automaten, så vi får en ækvivalent automat.

Fjernelse af én tilstand

Hvordan man fjerner én tilstand, kan vi illustrere med et enkelt eksempel. Antag, at en del af vores automat ser således ud:

hvor Ri er nogle regulære udtryk. Hvordan ville automaten se ud, hvis vi fjernede tilstanden qr? Vi kan forestille os, at vi er i tilstanden qi og spørger, hvilke ord vi kan generere på dette stykke. Hvis vi går direkte fra tilstanden qi til tilstanden qj, er det alle de ord, der svarer til det regulære udtryk R4.

Hvis vi derimod går til tilstanden qr, kan vi generere ord af formen R1. I tilstanden qr kan vi dog køre rundt i løkken for det regulære udtryk R2, så vi kan faktisk generere ord af formen R1∘(R2∗). Og da vi desuden kan komme fra tilstanden qr til tilstanden qj, tilføjer vi her også det regulære udtryk R3. Alt i alt kan vi ad denne vej få ord af formen R1∘(R2∗)∘R3.

Nu ved vi, at der fra denne del af automaten kan opstå ord af formen R4 eller af formen R1∘(R2∗)∘R3. Det kan vi selvfølgelig skrive som et regulært udtryk således: (R4)|(R1∘(R2∗)∘R3).

Nu kan vi helt enkelt fjerne tilstanden qr og lade kun de to tilstande qi og qj blive tilbage, og i stedet for R4 skriver vi det regulære udtryk, vi lige har udregnet:

Denne fremgangsmåde udfører vi med hver kant fra hver tilstand qi til en tilstand qj, også løkker, dvs. også tilfældet, hvor qi = qj.

Efter fjernelsen af én tilstand får vi en ækvivalent automat — en automat, der genkender det samme sprog.

Hele algoritmen

Som input har vi en NFA A = ⟨Q, Σ, δ, q0, F⟩.

  1. Vi omdanner NFA'en A til en GNFA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. Herefter betegner vi antallet af tilstande i Z med bogstavet k.
  2. Hvis k = 2, slutter algoritmen, og på kanten mellem start- og accepttilstanden står det resulterende regulære udtryk.
  3. Hvis k>2, vælger vi en vilkårlig tilstand qr, som er forskellig fra start- og accepttilstanden, dvs. qr ≠ q0′ og qr ≠ qf′. Dernæst danner vi en ny GNFA Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, for hvilken der gælder: Q′′=Q′∖{qr} og for alle qi ∈ Q′′ ∖ {qf′} og for alle qj ∈ Q′′ ∖ {q0′} lad δ′′(qi,qj)=(R4)|(R1(R2∗)R3), hvor R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Fortsæt derefter med trin 2.

Eksempel

Lad os tage denne endelige automat som input:

Først omdanner vi den til en GNFA (unødvendige ∅-overgange tegner vi ikke):

Nu anvender vi anden del af algoritmen og fjerner en knude. Vi begynder med knuden q2. Vi fjerner knuden q2 og tilføjer en overgang fra tilstanden q1 til tilstanden qf. Denne overgang mærker vi b(a|b)∗, fordi vi fra knuden q1 kommer til tilstanden q2 med ord af formen b, derefter kan vi køre rundt i løkken for a|b, og dermed får vi (a|b)∗, og til sidst går vi via epsilon-reglen videre til qf. Her gælder, at b(a|b)∗ϵ = b(a|b)∗. Vi får automaten:

Tilbage er det at fjerne den sidste tilstand, q1. Vi tilføjer en kant fra tilstanden qs til tilstanden qf. Hvordan mærker vi den? Til tilstanden q1 kommer vi via epsilon-reglen, den kan vi straks udelade. Derefter kan vi køre rundt i løkken for a, så vi får det regulære udtryk a∗. Og til sidst kommer vi via en kant til qf, så vi konkatenerer desuden udtrykket med b(a|b)∗. Kanten mærker vi altså med det regulære udtryk a∗b(a|b)∗.

Automaten har nu kun to tilstande, så algoritmen slutter. På kanten står det resulterende regulære udtryk.

Kilder

Kapitler: Regulære udtryk, Omdannelse af regulært udtryk til automat, Generaliseret ikke-deterministisk endelig automat, Omdannelse af automat til regulært udtryk