Mașină de stări nedeterministă

Un automat finit nedeterminist (NFA, eng.  nondeterministic finite automaton , NFA) este un automat determinist finit (DFA, eng.  deterministic finite automaton , DFA) care nu îndeplinește următoarele condiții:

În special, orice DFA este, de asemenea, un NFA.

Folosind algoritmul de construcție a subsetului , orice NFA poate fi convertit într-un DFA echivalent, adică un DFA care recunoaște același limbaj formal [1] . La fel ca DFA, NFA recunoaște numai limbile obișnuite .

NFA a fost propus în 1959 de Michael O. Rabin și Dana Scott [2] care au arătat că este echivalent cu DFA. NFA este folosit în implementarea expresiilor regulate  - construcția lui Thompson este un algoritm pentru conversia unei expresii regulate în NFA care poate recunoaște eficient modelul șirurilor. Dimpotrivă, algoritmul lui Kleene poate fi folosit pentru a transforma un NFA într-o expresie regulată a cărei dimensiune depinde, în general, exponențial de dimensiunea automatului.

NFA este generalizat în multe feluri, de exemplu: automate finite nedeterministe cu tranziții ε , traductoare cu stări finite, automate pushdown, automate alternante, ω-automate și automate probabilistice . Pe lângă DFA, sunt cunoscute și alte cazuri speciale de NFA - unambiguous finite automata ( eng.  unambiguous finite automata , UFA) și auto -verifying finite automata ( eng.  self-verifying finite automata , SVFA).

Introducere informală

Există mai multe descrieri echivalente informale:

Definiție formală

Pentru o introducere mai elementară în definiția formală, consultați articolul „ Teoria automatelor ”.

Automate

Un NFA este reprezentat oficial ca un tuplu de 5, format din:

Aici înseamnă gradul setului .

Limba recunoscută

Având în vedere un NFA , recunoaște un limbaj care este notat și definit ca un set de șiruri de caractere peste alfabetul acceptat de automat .

În termeni generali, conform explicațiilor informale de mai sus , există mai multe definiții formale echivalente ale șirurilor acceptate de automat :

Cuvinte. Prima condiție spune că mașina pornește de la starea . A doua condiție spune că pentru fiecare caracter din șir , mașina trece de la stare la stare conform funcției de tranziție . Ultima condiție spune că mașina acceptă un șir dacă șirul de intrare face ca mașina să se termine în starea sa finală. Pentru ca un șir să fie acceptat de un automat , nu este necesar ca orice succesiune de stări să se termine într-o stare finală, este suficient ca o secvență să conducă la o astfel de stare. În caz contrar, adică dacă este imposibil să treci de la la starea din , după , se spune că automatul respinge șirul. Setul de șiruri pe care le acceptă automatul este un limbaj recunoscut de automat , iar acest limbaj este notat ca [9] [10] . Cu alte cuvinte, este setul tuturor stărilor accesibile din starea la obținerea șirului . Un șir este acceptat dacă o stare finală de la poate fi atinsă din starea de început pentru șirul de intrare [11] [12] .

Stare inițială

Definiția automatului de mai sus folosește o singură stare inițială , care nu este o cerință. Uneori, un NFA este definit cu un set de stări inițiale. Există o construcție simplă care duce un NFA cu mai multe stări inițiale la un NFA cu o singură stare inițială.

Exemplu

Următorul automat alfabet binar determină dacă șirul de intrare se termină într-unul. Fie , unde funcția de tranziție poate fi definită de următorul tabel de tranziție de stări (comparați cu figura de sus din stânga):

IntrareStat 0 unu

Deoarece mulțimea conține mai multe stări, automatul este nedeterminist. Limbajul automatului poate fi descris ca un limbaj regulat dat de o expresie regulată . (0|1)*1

Toate secvențele de stări posibile pentru șirul de intrare „1011” sunt prezentate în figura de mai jos. Șirul este acceptat de automat deoarece una dintre secvențele de stări satisface definiția de mai sus. Nu contează că celelalte secvențe nu reușesc. Desenul poate fi interpretat în două moduri:

Abilitatea de a citi aceeași figură în două moduri arată, de asemenea, echivalența celor două explicații de mai sus.

În schimb, șirul „10” este respins de automat (toate secvențele posibile de stări pentru șirul de intrare pentru o anumită intrare sunt prezentate în figura din dreapta sus), deoarece nu există o cale care să ajungă la starea finală după citirea finalului caracterul 0. Deși starea poate fi atinsă după primirea primului caracter „1” nu înseamnă că șirul de intrare „10” este acceptabil. Înseamnă doar că șirul de intrare „1” ar fi acceptabil.

Echivalență DFA

Un  automat finit determinist ( DFA ) poate fi considerat ca un tip special de NFA în care pentru orice stare și litere ale alfabetului, funcția de tranziție are o singură stare rezultată. Astfel, este clar că orice limbaj formal care poate fi recunoscut cu un DFA poate fi recunoscut și cu un NFA.

În schimb, pentru orice NFA există un DFA care recunoaște același limbaj formal. Un DFA poate fi construit folosind construcția subsetului .

Acest rezultat arată că NFA, în ciuda flexibilității sale mari, nu poate recunoaște limbile care nu pot fi recunoscute de niciun DFA. Acest lucru este, de asemenea, important în practică, pentru a converti NFA mai simple din punct de vedere structural în DFA mai eficiente din punct de vedere computațional. Cu toate acestea, dacă NFA are n stări, DFA rezultat poate avea până la 2n stări, ceea ce face uneori construcția nepractică pentru NFA mari.

NCA cu ε-tranziții

Automatul finit nedeterminist cu ε-tranziții (NFA-ε) este deja o generalizare suplimentară pentru NFA. Acest automat cu funcție de tranziție are dreptul să aibă șirul gol ε ca intrare. O tranziție fără a utiliza un simbol de intrare se numește tranziție ε. Într-o diagramă de stări, aceste tranziții sunt de obicei etichetate cu litera greacă ε. ε-tranzițiile oferă o modalitate convenabilă de modelare a sistemelor a căror stare actuală nu este cunoscută cu exactitate. De exemplu, dacă modelăm un sistem a cărui stare curentă nu este clară (după procesarea unui șir de intrare) și poate fi q sau q', putem adăuga o tranziție ε între aceste două stări, aducând automatul la ambele stări la acelasi timp.

Definiție formală

NFA-ε este reprezentat formal printr -un tuplu de 5 , , care constă din:

Aici înseamnă puterea mulțimii , iar ε înseamnă șirul gol.

ε-Închiderea unei stări sau a unui set de stări

Pentru o stare, notăm setul de stări accesibile din următoarele ε-tranziții în funcțiile de tranziție , și anume, dacă există o succesiune de stări astfel încât:

Mulțimea este cunoscută ca închiderea stării ε .

Închiderea ε este definită și pentru setul de stări. Închiderea ε a mulțimii de stări, , a automatului NK este definită ca mulțimea de stări la care se poate ajunge din elementele mulțimii prin ε-tranziții. Formal, pentru


Stări acceptabile

Să fie un șir peste alfabet . Automatul acceptă un șir dacă există o secvență de stări în următoarele condiții:

  1. , unde pentru orice
  2. .
Cuvinte. Prima condiție spune că mașina pornește dintr-o stare care este accesibilă din stare prin tranziții ε. A doua condiție spune că după citirea , mașina selectează tranziția de la la și apoi efectuează orice număr de ε-tranziții în funcție de tranziția de la la . Ultima condiție spune că mașina acceptă dacă ultimul caracter introdus face ca mașina să treacă la una dintre stările acceptate. În caz contrar, se spune că automatul respinge șirul. Setul de șiruri de caractere pe care îl acceptă este limbajul pe care îl recunoaște automatul și acest limbaj este notat ca .

Exemplu

Să existe un NFA-ε cu un alfabet binar care determină dacă șirul de intrare conține un număr par de zerouri sau un număr par de unu. Rețineți că 0 apariții este un număr par.

În notație formală, fie , unde relația de tranziție poate fi definită printr- un astfel de tabel de tranziție de stări :

IntrareStat 0 unu ε
S0 _ {} {} { S 1 , S 3 }
S1 _ { S2 } _ { S 1 } {}
S2 _ { S 1 } { S2 } _ {}
S3 _ { S 3 } { S4 } _ {}
S4 _ { S4 } _ { S 3 } {}

poate fi gândit ca unirea a două DFA  , unul cu state și celălalt cu state . Limbajul poate fi descris ca un limbaj regulat dat de expresia regulată (1*(01*01*)*) ∪ (0*(10*10*)*). Definim folosind ε-tranziții, dar putem defini fără ele.

Echivalența NFA-urilor

Pentru a arăta că NFA-ε este echivalent cu NFA, mai întâi rețineți că NFA este un caz special de NFA-ε, rămâne să arătăm că pentru orice NFA-ε există un NFA echivalent.

Să fie NFA-ε. NFA este echivalent cu , unde pentru orice și .

Atunci NFA-ε este echivalent cu NFA. Deoarece NFA este echivalent cu DFA, NFA-ε este, de asemenea, echivalent cu DFA.

Proprietăți de închidere

Se spune că un NFA este închis sub o operație ( binară / unară ). Dacă NFA recunoaște limbile care sunt obținute prin aplicarea acestei operațiuni la limbile recunoscute de NFA. ANF-urile sunt închise pentru următoarele operațiuni.

Deoarece NFA-urile sunt echivalente cu automatele finite nedeterministe de tranziție ε (NFA-ε), închiderile de mai sus sunt dovedite folosind proprietățile de închidere ale NFA-ε. Din proprietățile de închidere de mai sus rezultă că NFA-urile recunosc numai limbaje obișnuite .

NFA-urile pot fi construite din orice expresie regulată folosind algoritmul Thompson .

Proprietăți

Mașina pornește dintr-o anumită stare inițială și citește un șir de caractere format din literele alfabetului său . Automatul folosește funcția de tranziție Δ pentru a determina următoarea stare din starea curentă și caracterul sau șirul gol tocmai citit. Cu toate acestea, „următoarea stare a NFA depinde nu numai de simbolul de intrare curent, ci și de un număr arbitrar de evenimente de intrare ulterioare. În timp ce aceste evenimente ulterioare au loc, este imposibil să se determine în ce stare se află mașina” [13] . Dacă automatul este în starea finală după ultimul caracter citit, se spune că NFA acceptă șirul, în caz contrar se spune că respinge șirul.

Setul tuturor șirurilor acceptate de NFA este limba pe care NFA o acceptă. Această limbă este o limbă obișnuită .

Pentru orice NFA, se poate găsi un automat finit determinist (DFA) care acceptă același limbaj. Prin urmare, este posibil să convertiți un NFA existent într-un DFA pentru a implementa o mașină (posibil) mai simplă. O astfel de transformare se realizează folosind construcția subset , care poate duce la o creștere exponențială a numărului de stări necesare. Pentru o dovadă formală a construcției subsetului, consultați articolul „ Construcția subsetului ”.

Implementare

NFA poate fi modelat în unul dintre următoarele moduri:

Aplicații NCA

NFA și DFA sunt echivalente în sensul că, dacă o limbă este recunoscută de un NFA de către un automat, este recunoscută și de un DFA. Este adevărat și invers. Stabilirea unei astfel de echivalențe este importantă și utilă. Important pentru că NFA-urile pot fi utilizate pentru a reduce complexitatea lucrării matematice care este necesară pentru a stabili proprietăți importante în teoria algoritmilor . De exemplu, este mult mai ușor să demonstrezi închiderea limbilor obișnuite cu NFA-uri decât cu DFA-uri. Util, deoarece construirea unui NFA pentru a recunoaște limba respectivă este uneori mult mai importantă decât construirea unui DFA pentru acea limbă.

Vezi și

Note

  1. Martin, 2010 , p. 108.
  2. Rabin și Scott, 1959 , p. 114–125.
  3. O secvență de alegeri poate duce la un „fund” în care niciuna dintre tranziții nu este valabilă pentru simbolul de intrare curent, iar acest caz este considerat un eșec (șirul este respins).
  4. Hopcroft, Ullman, 1979 , p. 19.
  5. Aho, Hopcroft & Ullman 1974 , p. 319.
  6. Hopcroft, Ullman, 1979 , p. 19-20.
  7. Sipser, 1997 , p. 48.
  8. Hopcroft, Motwani, Ullman, 2001 , p. 56.
  9. Aho, Hopcroft & Ullman 1974 , p. 320.
  10. Sipser, 1997 , p. 54.
  11. Hopcroft, Ullman, 1979 , p. 21.
  12. Hopcroft, Motwani, Ullman, 2001 , p. 59.
  13. Finite-State Machine FOLDOC Dicționar online gratuit de calcul . Data accesului: 11 februarie 2020. Arhivat din original pe 4 aprilie 2015.
  14. Chris Calabro. NFA la DFA explodează. 27-02-2005 . Consultat la 11 februarie 2020. Arhivat din original pe 7 februarie 2013.
  15. Hopcroft, Motwani, Ullman, 2001 , p. 153.

Literatură