✖

Omforming av automat til regulært uttrykk

Vi skal vise hvordan du omformer en vilkårlig endelig automat til et regulært uttrykk.

Beskrivelse av algoritmen

Som input har vi en NFA A. Først gjør vi den om til en GNFA. I den andre fasen fjerner vi i hvert steg én tilstand, endrer overgangsfunksjonen riktig og gjentar dette til det bare er to tilstander igjen — start- og sluttilstanden. Mellom dem går det en kant som har et regulært uttrykk som merke, og dette uttrykket blir resultatet av hele algoritmen. Hele framgangsmåten består altså først og fremst i å fjerne en tilstand og deretter rette opp automaten slik at vi får en ekvivalent automat.

Eliminering av én tilstand

Hvordan vi fjerner én tilstand, kan vi vise på et enkelt eksempel. Anta at en del av automaten vår ser slik ut:

der Ri er noen regulære uttrykk. Hvordan ville automaten sett ut hvis vi fjernet tilstanden qr? Vi kan tenke oss at vi er i tilstanden qi og spør hvilke ord vi kan generere på denne strekningen. Hvis vi går fra tilstanden qi direkte til tilstanden qj, blir det alle ord som svarer til det regulære uttrykket R4.

Hvis vi derimot går til tilstanden qr, kan vi generere ord på formen R1. I tilstanden qr kan vi imidlertid gå i løkke for det regulære uttrykket R2, så vi kan egentlig generere ord på formen R1∘(R2∗). Og siden vi dessuten kan komme fra tilstanden qr til tilstanden qj, legger vi til det regulære uttrykket R3 også. Totalt kan vi altså på denne veien få ord på formen R1∘(R2∗)∘R3.

Nå vet vi at det fra denne delen av automaten kan oppstå ord på formen R4 eller på formen R1∘(R2∗)∘R3. Det kan vi selvfølgelig skrive som et regulært uttrykk: (R4)|(R1∘(R2∗)∘R3).

Nå kan vi enkelt fjerne tilstanden qr og la bare de to tilstandene qi og qj bli igjen, og i stedet for R4 skriver vi det regulære uttrykket vi nettopp regnet ut:

Denne framgangsmåten utfører vi med hver kant fra hver tilstand qi til en tilstand qj, inkludert løkker, altså også tilfellet der qi = qj.

Etter at vi har fjernet én tilstand, får vi en ekvivalent automat — en automat som gjenkjenner det samme språket.

Hele algoritmen

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

  1. Vi omformer NFA-en A til en GNFA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. Videre betegner vi antallet tilstander i Z med bokstaven k.
  2. Hvis k = 2, stopper algoritmen, og på kanten mellom start- og sluttilstanden står det resulterende regulære uttrykket.
  3. Hvis k>2, velger vi en vilkårlig tilstand qr som er forskjellig fra start- og sluttilstanden, altså qr ≠ q0′ og qr ≠ qf′. Videre lager vi en ny GNFA Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩ som oppfyller: Q′′=Q′∖{qr} og for alle qi ∈ Q′′ ∖ {qf′} og for alle qj ∈ Q′′ ∖ {q0′} la δ′′(qi,qj)=(R4)|(R1(R2∗)R3), der R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Fortsett videre med steg 2.

Eksempel

La oss ha denne endelige automaten som input:

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

Nå bruker vi den andre delen av algoritmen og fjerner en node. Vi begynner med noden q2. Vi fjerner noden q2 og legger til en overgang fra tilstanden q1 til tilstanden qf. Denne overgangen merker vi b(a|b)∗, for fra noden q1 kommer vi til tilstanden q2 for ord på formen b, så kan vi gå i løkke for a|b, og slik får vi (a|b)∗, og til slutt går vi med epsilonregelen over til qf. Her gjelder b(a|b)∗ϵ = b(a|b)∗. Vi får automaten:

Det gjenstår å fjerne den siste tilstanden, q1. Vi legger til en kant fra tilstanden qs til tilstanden qf. Hvordan merker vi den? Til tilstanden q1 kommer vi med epsilonregelen, den kan vi bare utelate. Så kan vi gå i løkke for a, og da får vi det regulære uttrykket a∗. Og til slutt kommer vi via kanten til qf, så uttrykket konkatenerer vi i tillegg med b(a|b)∗. Kanten merker vi altså med det regulære uttrykket a∗ b(a|b)∗.

Automaten har nå bare to tilstander, så algoritmen stopper. På kanten står det resulterende regulære uttrykket.

Kilder

Kapitler: Regulære uttrykk, Omforming av regulært uttrykk til automat, Generalisert ikke-deterministisk endelig automat, Omforming av automat til regulært uttrykk