✖

Ikke-deterministisk endelig automat

Den endelige automat, som blev introduceret i de foregående afsnit (vi forkorter den DFA), var altid deterministisk, hvilket viste sig ved, at det på ethvert tidspunkt var klart, hvad automaten gør. Nu ser vi på det mere almene begreb ikke-deterministiske endelige automater (vi forkorter dem NFA), hvor der kan findes overgange, som udgår fra samme tilstand og er for det samme symbol.

Eksempel

Se på det følgende automatdiagram:

Hvad er mærkeligt ved det? At der fra knuden q0 går to kanter for symbolet 0. Hvis vi forsøger at acceptere ordet 001, ser det ud til, at automaten ikke ved, om den skal blive i tilstanden q0, eller om den skal følge overgangen til q1. En sådan automat ville være ikke-deterministisk.

Determinisme betyder i denne forstand, at det i enhver situation er klart, hvad automaten gør, der er ikke plads til tvetydighed. En deterministisk automat har for hver tilstand og hvert symbol kun én overgang. Ikke-determinisme betyder tvetydighed — fra én tilstand kan der for det samme symbol gå for eksempel tre overgange.

Og hvordan beslutter automaten sig så? En ikke-deterministisk automat vælger altid (nogle gange siger vi også »gætter«) den overgang, der fører til, at den accepterer ordet; hvis det er muligt.

Hvis vi giver automaten ordet 001, har automaten disse muligheder for at behandle ordet:

q0→q0→q0→q0q0→q0→q1→q2

plus de muligheder, hvor den ikke læser hele ordet. I den første blev den hele tiden i tilstanden q0, hvilket den bestemt kan, overgangsreglerne tillader det. I den anden gren turde den gå videre til andre tilstande og nåede til sidst til tilstanden q2, som er accepterende. I denne gren ville automaten acceptere ordet. En ikke-deterministisk automat vælger automatisk den gren, hvor den accepterer ordet, hvis en sådan gren findes.

Hvordan kan den automatisk vælge den »gunstige« gren? Vi kan forestille os det sådan, at den ikke-deterministiske automat gennemgår alle mulige grene, og hvis den finder en gren, hvor den accepterer ordet, så accepterer den ordet. Hvordan kunne den gennemgå alle grene? Når den er i en tilstand, hvorfra der for det aktuelle symbol går n kanter, kopierer automaten sig selv n gange, og hver kopi går en anden vej. Dermed gennemgår vi efterhånden alle muligheder.

Trærepræsentation af automatens beregning

Vi ændrer den foregående automat en smule:

Ikke-determinismen bliver i den første tilstand. Den foregående automat accepterede alle ord, der ender på 01. Denne ændrede automat accepterer alle ord, der indeholder delordet 01. Den accepterer altså for eksempel ordet 101 eller 0101. Alle beregningens grene kan vi let visualisere ved hjælp af et træ, f.eks. kunne træet for ordet 01010 se sådan ud:

I begyndelsen er vi i starttilstanden q0. Som input har vi ordet 01010, det første ulæste tegn er 0. Fra tilstanden q0 går der to overgange for symbolet 0, til tilstandene q0 og q1. Træet får derfor i denne knude to børn: q0 og q1. Dernæst læser vi symbolet 1. Her er der ingen tvetydighed, vi flytter os til tilstandene q0 og q2. Dernæst læser vi tegnet 0, i den venstre gren opstår der igen tvetydighed, vi deler beregningen i to nye grene. I den ene bliver vi igen i q0, og i den anden går vi til q1. Og så videre.

Læg mærke til, at i alt to grene ender i tilstanden q2, i en accepttilstand. Der findes to beregningsgrene, hvor automaten kan acceptere det givne ord. Denne automat ville altså acceptere ordet 01010. Vi kan prøve at lave et tilsvarende træ for ordet 1000.

Beregningen bliver enten i tilstanden q0 eller går til tilstanden q1, men derfra har den ingen steder at gå hen, for inputtet består nu kun af nuller, og tilstanden q1 har kun en overgang for symbolet 1. Ingen beregningsgren ender i en accepttilstand, så automaten accepterer ikke ordet 1000.

Epsilon-overgange

I ikke-deterministiske automater kan vi desuden bruge epsilon-overgange. Det er overgange, som vi kan udføre, uanset hvilket symbol der er i input, og uden at vi læser noget symbol fra ordet. Hvordan kunne vi skrive en ikke-deterministisk automat, der accepterer det tomme ord, alle ord bestående kun af enere og ord af formen (10)n, dvs. 10, 1010, …?

Vi delte automaten i to »delautomater«. Den øverste sørger for at genkende ord, der består af 1, den nederste tager sig af ord af formen (10)n. Vi prøver at acceptere ordet 111. Automaten befinder sig i begyndelsen i tilstanden q0 og har ordet 111 som input. Da den har epsilon-overgange til rådighed, kan den beslutte at gå til tilstanden q1 eller q2, alt efter hvad der passer den. Vi ser, at det passer den at gå til tilstanden q1. Automaten går derhen. Og som input har den stadig ordet 111! Først nu begynder den at læse symboler fra ordet og gå fra tilstanden q1 igen til q1, indtil den har læst hele ordet og accepterer det.

Hvis vi prøvede at acceptere 1010, ville automaten i begyndelsen gå til tilstanden q2 og først derfra begynde at behandle symbolerne og igen acceptere ordet.

For ordet 1100 kunne automaten gøre hvad som helst, den har ingen måde at acceptere et sådant ord på.

Epsilon-overgange og ikke-determinisme gør i mange henseender arbejdet lettere, for eksempel kan beviset for, at foreningen af regulære sprog igen er et regulært sprog, med epsilon-overgange skrives meget enklere end i tilfældet med deterministiske endelige automater. I dette bevis havde vi eksempler på disse automater

og

og videre konstruerede vi en endelig deterministisk automat, der accepterede foreningen af begge sprog. Med epsilon-overgange kan vi opstille en sådan automat sådan her:

Vi tilføjer simpelthen en ny starttilstand, fra den går to epsilon-overgange til de oprindelige starttilstande i de oprindelige automater, og det er det hele. Automaten beslutter sig ikke-deterministisk for, om den vil forsøge at acceptere ordet med den ene eller den anden »delautomat«.

Definition af en ikke-deterministisk automat

Vi har allerede vist, hvordan en deterministisk og en ikke-deterministisk endelig automat adskiller sig, nu mangler vi bare at formalisere det. En deterministisk endelig automat definerede vi som et femtupel ⟨Q, Σ, δ, q0, F⟩, hvor Q er mængden af tilstande, Σ er alfabetet, δ er overgangsfunktionen, q0 er starttilstanden og F er mængden af accepttilstande. Det eneste, der ændrer sig i definitionen af ikke-deterministiske automater, er definitionen af overgangsfunktionen.

I den deterministiske version kunne funktionen ved kaldet δ(q, w) kun returnere én tilstand, mens den i den ikke-deterministiske version kan returnere flere tilstande — hvis der for ét symbol er defineret flere overgange. Da vi også skal definere epsilon-overgange, betegner vi mængden Σ ∪ {ε} som mængden Σε, dvs. Σε = Σ ∪ {ε}. Funktionen δ definerer vi således som

δ:Q×Σε→2Q

2Q betegner potensmængden, mængden af alle delmængder af mængden Q. Formaliseringen af beregningen ligner meget den for endelige automater. Automatens konfiguration er igen parret ⟨q, w⟩ ∈ Q × Σ∗. Beregningstrinnet ↦ er en relation på mængden af konfigurationer, således at

⟨qi,w0w1…wn⟩↦⟨qj,w1…wn⟩,

netop hvis qj ∈ δ(qi, w0). Her ligger den største forskel. I deterministiske automater havde vi denne betingelse skrevet som qj = δ(qi, w0), fordi funktionen δ altid returnerede én tilstand. Den ikke-deterministiske version af overgangsfunktionen returnerer en mængde af tilstande, derfor står symbolet ∈ der. Den refleksive og transitive afslutning af relationen betegner vi igen ↦ ∗. Vi siger, at automaten accepterer ordet w netop hvis der findes qf ∈ F, således at

⟨q0,w⟩↦∗⟨qf,ε⟩.

Kilder

Kapitler: Endelig automat, Total automat, Ikke-deterministisk endelig automat, Simulering af en NFA, Omdannelse af NFA til DFA