Nedeterministický konečný automat (NFA, angl. nedeterministický konečný automat , NFA) je deterministický konečný automat (DFA, angl. deterministický konečný automat , DFA), který nesplňuje následující podmínky:
Konkrétně každá DFA je také NFA.
Pomocí algoritmu konstrukce podmnožiny lze libovolnou NFA převést na ekvivalentní DFA, tedy DFA, která rozpoznává stejný formální jazyk [1] . Stejně jako DFA rozpoznává NFA pouze běžné jazyky .
NFA byl navržen v roce 1959 Michaelem O. Rabinem a Danou Scott [2] , kteří ukázali, že je ekvivalentní k DFA. NFA se používá při implementaci regulárních výrazů - Thompsonova konstrukce je algoritmus pro převod regulárního výrazu na NFA, který dokáže efektivně rozpoznat vzor řetězců. Naopak, Kleeneův algoritmus lze použít k transformaci NFA na regulární výraz , jehož velikost obecně závisí exponenciálně na velikosti automatu.
NFA je zobecněna mnoha způsoby, například: nedeterministické konečné automaty s ε-přechody , konečné převodníky, zásobníkové automaty , střídavé automaty, ω-automaty a pravděpodobnostní automaty . Kromě DFA jsou známy další speciální případy NFA - jednoznačné konečné automaty ( angl. jednoznačné konečné automaty , UFA) a samoověřovací konečné automaty ( angl. self -verifying finite automata , SVFA).
Existuje několik neformálních ekvivalentních popisů:
Pro elementárnější úvod do formální definice viz článek " Teorie automatů ".
NFA je formálně reprezentován jako 5-ti skládající se z:
Zde znamená stupeň sady .
Daný NFA rozpozná jazyk, který je označen jako a definovaný jako množina všech řetězců v abecedě akceptovaných automatem .
Obecně řečeno, podle výše uvedených neformálních vysvětlení existuje několik ekvivalentních formálních definic řetězců akceptovaných automatem :
Výše uvedená definice automatu používá jeden počáteční stav , který není podmínkou. Někdy je NFA definována sadou počátečních stavů. Existuje jednoduchá konstrukce , která převádí NFA s více počátečními stavy na NFA s jediným počátečním stavem.
Následující automat binární abecedy určuje, zda vstupní řetězec končí jedničkou. Nechť , kde přechodovou funkci lze definovat pomocí následující tabulky přechodů stavů (srovnej s horním obrázkem vlevo):
VchodStát | 0 | jeden |
---|---|---|
Protože množina obsahuje více než jeden stav, je automat nedeterministický. Jazyk automatu lze popsat jako regulární jazyk daný regulárním výrazem . (0|1)*1
Všechny možné stavové sekvence pro vstupní řetězec "1011" jsou znázorněny na obrázku níže. Řetězec je akceptován automatem, protože jedna ze stavových sekvencí splňuje výše uvedenou definici. Nevadí, že ostatní sekvence neuspějí. Výkres lze interpretovat dvěma způsoby:
Schopnost číst stejný obrázek dvěma způsoby také ukazuje ekvivalenci obou výše uvedených vysvětlení.
Naproti tomu řetězec "10" je automatem odmítnut (všechny možné sekvence stavů pro vstupní řetězec pro daný vstup jsou zobrazeny na obrázku vpravo nahoře), protože neexistuje žádná cesta, která by po přečtení konečného stavu dosáhla konečného stavu. znak 0. Přestože stavu lze dosáhnout po přijetí prvního znaku "1", neznamená to, že vstupní řetězec "10" je přijatelný. Znamená to pouze, že vstupní řetězec "1" by byl přijatelný.
Za speciální druh NFA lze považovat deterministický konečný automat ( DFA ), ve kterém má přechodová funkce pro jakýkoli stav a písmena abecedy pouze jeden výsledný stav. Je tedy jasné, že jakýkoli formální jazyk , který lze rozpoznat pomocí DFA, lze rozpoznat také pomocí NFA.
Naopak pro každou NFA existuje DFA, která uznává stejný formální jazyk. DFA lze sestavit pomocí konstrukce podmnožiny .
Tento výsledek ukazuje, že NFA navzdory své velké flexibilitě nedokáže rozpoznat jazyky, které nedokáže rozpoznat žádná DFA. To je také důležité v praxi, aby bylo možné převést strukturálně jednodušší NFA na výpočetně efektivnější DFA. Pokud má však NFA n stavů, výsledná DFA může mít až 2 n stavů , což někdy činí konstrukci pro velké NFA nepraktickou.
Nedeterministický konečný automat s ε-přechody (NFA-ε) je dalším zobecněním již pro NFA. Tento automat přechodové funkce může mít jako vstup prázdný řetězec ε. Přechod bez použití vstupního symbolu se nazývá ε-přechod. Ve stavovém diagramu jsou tyto přechody obvykle označeny řeckým písmenem ε. ε-přechody poskytují pohodlný způsob, jak modelovat systémy, jejichž aktuální stav není přesně znám. Pokud například modelujeme systém, jehož aktuální stav není jasný (po zpracování nějakého vstupního řetězce) a může být buď q nebo q', můžeme mezi tyto dva stavy přidat ε-přechod, čímž automat uvedeme do obou stavů na stejný čas.
NFA-ε je formálně reprezentován 5-tice , , který se skládá z:
Zde znamená mocninu množiny a ε znamená prázdný řetězec.
Pro stav označme množinu stavů dosažitelných z následujících ε-přechodů v přechodových funkcích , totiž pokud existuje taková posloupnost stavů , že:
Sada je známá jako uzávěr ε - stavu .
ε-uzávěr je také definován pro množinu stavů. ε-uzavření množiny stavů, , NK-automatu je definováno jako množina stavů, kterých lze dosáhnout z prvků množiny ε-přechody. Formálně pro
Nechť je řetězec nad abecedou . Automat přijímá řetězec , pokud existuje sekvence stavů s následujícími podmínkami:
Nechť existuje NFA-ε s binární abecedou, která určuje, zda vstupní řetězec obsahuje sudý počet nul nebo sudý počet jedniček. Všimněte si, že 0 výskytů je sudé číslo.
Ve formálním zápisu nechť , kde přechodový vztah může být definován takovou tabulkou přechodů stavů :
VchodStát | 0 | jeden | ε |
---|---|---|---|
S0 _ | {} | {} | { S 1 , S 3 } |
S1 _ | { S2 } _ | { S 1 } | {} |
S2 _ | { S 1 } | { S2 } _ | {} |
S3 _ | { S 3 } | { S4 } _ | {} |
S4 _ | { S4 } _ | { S 3 } | {} |
lze považovat za spojení dvou DFA , jednoho se státy a druhého se státy . Jazyk lze popsat jako regulární jazyk daný regulárním výrazem (1*(01*01*)*) ∪ (0*(10*10*)*). Definujeme pomocí ε-přechodů, ale můžeme definovat i bez nich.
Abychom ukázali, že NFA-ε je ekvivalentní NFA, nejprve poznamenejme, že NFA je speciální případ NFA-ε, zbývá ukázat, že pro jakýkoli NFA-ε existuje ekvivalent NFA.
Nechť existuje NFA-ε. NFA je ekvivalentní , kde pro libovolné a .
Potom je NFA-ε ekvivalentní NFA. Protože NFA je ekvivalentní DFA, NFA-ε je také ekvivalentní DFA.
Říká se, že NFA je uzavřena v rámci ( binární / unární ) operace. Pokud NFA rozpozná jazyky, které jsou získány aplikací této operace na jazyky uznané NFA. NFA jsou uzavřeny s ohledem na následující operace.
Protože NFA jsou ekvivalentní ε-přechodovým nedeterministickým konečným automatům (NFA-ε), výše uvedené uzávěry jsou prokázány pomocí uzávěrových vlastností NFA-ε. Z výše uvedených vlastností uzavření vyplývá, že NFA rozpoznávají pouze regulární jazyky .
NFA lze sestavit z libovolného regulárního výrazu pomocí Thompsonova algoritmu .
Stroj začíná od určitého počátečního stavu a čte řetězec znaků sestávající z písmen jeho abecedy . Automat pomocí přechodové funkce Δ určí další stav z aktuálního stavu a právě přečteného znaku nebo prázdného řetězce. „Další stav NFA však závisí nejen na aktuálním vstupním symbolu, ale také na libovolném počtu následných vstupních událostí. Zatímco tyto následné události probíhají, není možné určit, v jakém stavu se stroj nachází“ [13] . Pokud je automat v konečném stavu po posledním přečteném znaku, NFA říká, že řetězec přijme, jinak se říká, že řetězec odmítne.
Sada všech řetězců akceptovaných NFA je jazyk, který NFA akceptuje. Tento jazyk je regulárním jazykem .
Pro jakýkoli NFA lze najít deterministický konečný automat (DFA), který přijímá stejný jazyk. Proto je možné převést existující NFA na DFA za účelem implementace (možná) jednoduššího stroje. Taková transformace se provádí pomocí konstrukce podmnožiny , což může vést k exponenciálnímu nárůstu počtu požadovaných stavů. Formální důkaz konstrukce podmnožiny naleznete v článku " Konstrukce podmnožiny ".
NFA lze modelovat jedním z následujících způsobů:
NFA a DFA jsou ekvivalentní v tom smyslu, že pokud je jazyk rozpoznán NFA automatem, rozpozná jej také DFA. Opak je také pravdou. Stanovení takové ekvivalence je důležité a užitečné. Důležité, protože NFA mohou být použity ke snížení složitosti matematické práce, která je potřebná k vytvoření důležitých vlastností v teorii algoritmů . Například je mnohem snazší prokázat uzavřenost běžných jazyků pomocí NFA než pomocí DFA. Užitečné, protože sestavení NFA pro rozpoznání daného jazyka je někdy mnohem důležitější než vytvoření DFA pro tento jazyk.
Formální jazyky a formální gramatiky | |
---|---|
Obecné pojmy | |
Typ 0 | |
Typ 1 |
|
Typ 2 | |
Typ 3 | |
rozebrat |