UNIVERZITET U NIŠU PRIRODNO MTEMTIČKI FKULTET DEPRTMN Z RČUNRSKE NUKE lgoritmi za determinizaciju i minimizaciju nedeterminističkih automata Master rad Student: Nemanja Vučković Mentor: Prof. dr. Miroslav Ćirić Niš, Oktobar 2016.
Predgovor Tokom prve godine master akademskih studija upoznao sam se sa oblašću informatike pod nazivom Teorija automata. U drugoj godini, interesovanje za ovu oblast je poraslo kada sam u okviru predmeta Konstrukcija prevodioca i interpetatora saznao za konkretnu primenu automata u programiranju. Zbog toga sam odlučio da svoj Master rad posvetim ovoj oblasti, odnosno delu koji se odnosi na Determinaciju i minimizaciju nedeterminističkih automata. Veliku zahvalnost dugujem svom mentoru, prof. dr. Miroslavu Ćiriću, koji je samnom podelio svoje znanje iz oblasti koja se bavi determinizacijom automata i pomogao mi je da napišem ovaj rad. Takođe se zahvaljujem i prof. dr. Jeleni Ignjatović, koja me je uvela u oblast Teorije automata, i svojim zanimljivim predavanjima i poznavanjem te oblasti doprinela daljem interesovanju. Zahvaljujem se i svim ostalim profesorima, koji su usavršili moje znanje iz oblasti informatike i programiranja i bili tu da odgovore na sva moja pitanja. Najveću zahvalnost dugujem porodici i prijateljima, koji su mi pomagali i podržavali me kadgod je bilo potrebno. 1
Sadržaj 1. Uvod... 3 2. Osnovni pojmovi... 4 2.1. Bulova algebra... 4 2.2. Skupovi, relacije i funkcije... 5 2.3. lfabet, reči i jezici... 7 3. Konačni automati... 8 3.1.1. Deterministički konačan automat... 10 3.1.2. Nedeterministički konačan automat... 11 3.1.3. Reverzni automat i podautomat... 12 3.1.4. Izomorfni automati... 12 4. Količnički automat i redukcija broja stanja... 13 4.1. Količnički automat... 13 4.2. Redukcija broja stanja... 14 4.2.1. Redukcija pomoću desno invarijantnih kvazi-uređenja... 15 4.2.2. Redukcija pomoću slabo desno invarijantnih kvazi-uređenja... 17 5. Determinizacija... 20 5.1. Osnovni algoritam determinizacije podskupovna konstrukcija... 20 5.2. Konstrukcija Nerodovog automata... 22 5.2.1. Reverzni Nerodov automat... 24 5.3. Determinizacija pomoću slabo-invarijantnih kvazi-uređenja... 26 5.3.1. Determinizacija pomoću slabog desno invarijantnog kvazi-uređenja... 26 5.3.2. Determinizacija pomoću slabog levo invarijantnog kvazi-uređenja... 28 5.4. Determinizacija konstrukcijom dečjeg automata... 30 5.5. Kanonizacioni metod Brzozovskog... 32 5.5.1. Poboljšani metod Brzozovskog... 32 5.6. Kanonizacija jezičkom inkluzijom... 33 6. Implementacija i testiranje... 37 6.1. Rezultati testiranja... 39 Zaključak... 40 7. Literatura... 41 Biografija... 42 2
1. Uvod Teorija automata je nauka o apstraktnim mašinama i automatima, kao i problemima koji se mogu rešiti pomoću njih. Reč automat vodi poreklo od grčke reči αὐτόματα (automata), koja znači radi sam od sebe. Teorija automata je usko povezana sa formalnom teorijom jezika, zato što je automat konačni prikaz nekog formalnog jezika koji može biti i beskonačan. U mnogim slučajevima automati se klasifikuju po formalnim jezicima koje oni prepoznaju. Slika 1.1: Teorija automata podela U ovom radu će biti reči o konačnim determinističkim i nedeterminističkim automatima i biće opisani algoritmi za determinizaciju, odnosno proces prevođenja nedeterminističkog automata u ekvivalentni deterministički. U drugoj glavi ovog rada biće opisani skupovi i relacije kao osnovni matematički pojmovi koji su nam potrebni za dalji rad. Pored toga biće predstavljena i Bulova algebra koja će nam poslužiti za jednostavnije predstavljanje relacija. Na kraju druge glave biće uvedeni osnovni pojmovi teorije jezika koji su neophodni za rad sa automatima. Treća glava se bavi konačnim automatima. Biće pomenuto nekoliko načina za njihovo predstavljanje, podela na determinističke i nedeterminističke automate i koja je njihova razlika. Biće navedene i formalne definicije ovih automata koje se koriste u literaturi. U četvrtoj glavi se uvode pojmovi i postulati koji su potrebni da bi se u procesu determinizacije dobio minimalni deterministički automat. Ovde će biti opisan količnički automat nekog automata i postupak redukcije broja stanja nekog automata. U petoj glavi će biti definisan pojam determinizacije. Pored toga ova glava opisuje i algoritme za determinizaciju počevši od najjednostavnijeg pa sve do algoritama koji za rezultat dobijaju minimalni deterministički automat. C#. Šesta glava predstavlja rezultate implementacije ovih algoritama u programskom jeziku 3
2. Osnovni pojmovi 2.1. Bulova algebra Iskazna algebra je algebra ({0,1},,,,, ) sa binarnim operacijama (konjunkcija), (disjunkcija), (implikacija) i (ekvivalencija) i unarnom operacijom (negacija) na skupu {0,1}, definisanim sledećim tabelama: 0 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 Sa druge strane, algebru ({0,1},,, ) zovemo dvoelementna Bulova algebra. Bulovom matricom se naziva matrica čiji su svi elementi iz skupa {0,1}, a množenje Bulovih matrica se definiše pomoću operacija i. Naime, proizvod Bulovih matrica U = [u ij ] m n i V = [v jk ] n p je Bulova matrica čiji su članovi definisani sa: U V = W = [w ik ] m p n w ik = u ij v jk. j=1 Bulove matrice tipa 1 m i n 1 tretiramo kao vektore i nazivamo ih Bulovim vektorima, pri čemu matricu tipa 1 m zovemo vektor vrste, a matricu n 1 vektor kolone. Proizvod vektora tipa 1 m i m 1 daje element iz skupa {0,1} koji nazivamo skalarni proizvod tih vektora. Zbog čega se koristi operator za proizvod Bulovih matrica biće objašnjeno u narednom poglavlju. 4
2.2. Skupovi, relacije i funkcije U matematici, skup je pojam koji se obično ne definiše, već se uzima kao osnovni. Za označavanje skupova se najčešće koriste velika slova latinice, B.ko je neki skup konačan ili prebrojivo beskonačan, pa se njegovi elementi mogu nabrojati, koriste se zapisi: = {x 1, x 2,, x n }, odnosno = {x 1, x 2, }. Dakle, skup je određen svojim elementima. Pripadnost elementa x skupu označava se sa x, a nepripadnost sa x. Između skupova se uvode dve osnovne relacije - jednakost i podskup: = B ( x)(x x B); B ( x)(x x B). Kardinalnost skupa se označava sa i predstavlja broj elemenata skupa. Prazan skup, koji se označava sa može se definisati kao = {x x x}. Za važi, za bilo koji skup i = 0. Za date skupove i B, definišemo uniju i presek na sledeći način: B ( x)(x x B); B ( x)(x x B). Dekartov proizvod skupova i B, u oznaci B, predstavlja skup svih mogućih uređenih parova kod kojih je prva komponenta element skupa a druga komponenta element skupa B. Dekartov proizvod se matematički zapisuje kao: B = {(a, b) a b B}. Neka je neprazan skup i n N. Pod pojmom n-arne relacije na podrazumavamo svaki podskup R skupa n =, pri čemu R može biti i prazan skup. Broj n se naziva n dužina relacije. Relacije dužine 2 se nazivaju binarne relacije ili samo relacije. ko je R relacija na skupu i (a, b) R, tada kažemo da su a i b u relaciji R i često izraz (a, b) R zamenjujemo izrazom arb. Specijalne vrste relacija na proizvoljnom skupu koje su vredne pažnje su prazna relacija, sa oznakom, relacija jednakosti = {(x, x) x }, koja se takođe naziva i dijagonalna ili identička relacija, i univerzalna ili puna relacija =. U slučajevima kada ne postoji opasnost od zabune, indeks se izostavlja i pišemo prosto i. Osim relacija između elemenata jednog skupa značajne su i relacije između elemenata dva različita skupa. Za neprazne skupove i B, svaki podskup R B naziva se relacija iz u B. Za relaciju R B, relaciju R 1 B definisanu sa (b, a) R 1 ako i samo ako je (a, b) R, za sve a i b B, nazivamo inverz relacije R. Podskupove Dom R i Im R B definisane sa: Dom R = {a ( b B)(a, b) R}, Im R = {b B ( a )(a, b) R} nazivamo redom domen i slika relacije R. 5
Pomoću ovih pojmova definišemo jedan od osnovnih matematičkih pojmova a to je funkcija. Funkcija predstavlja preslikavanje iz skupa domena u skup kodomena (slika) koje mora biti jedinstveno, to jest svaki član domena se slika u tačno jedan član kodomena. Prema tome, funkija je specijalan slučaj relacija. Za neprazne skupove, B i C, i relacije R B i S B C, kompozicija ili proizvod od R i S je relacija R S C definisana sa: (a, c) (R S) ( b B)((a, b) R (b, c) S), za svako a i c C. Neka su, B i C neprazni skupovi, i neka su date relacije R B, S B C i T C. Desni rezidual od T sa R je relacija R\T B C definisana sa: (b, c) R\T ( a )((a, b) R (a, c) T), za svako (b, c) B C, a levi rezidual od T sa S je relacija T/S B definisana sa: (a, b) T/S ( c C)((b, c) S (a, c) T), za svako (a, b) B. Osim reziduala relacija, postoje i reziduali skupova. Za skupove α i β B, desni rezidual od β sa α je relacija α\β B definisana sa: (b, a) α\β (a α b β), za sve (a, b) B, a levi rezidual od β sa α je relacija β/α B definisana sa: (a, b) β/α (a α b β), za sve (b, a) B. Neka je neprazan skup. Relacija R na skupu je: - refleksivna, ako je ara, za svaki a, tj. ako je Δ R; - simetrična, ako za a, b, iz arb sledi bra, tj. ako je R R 1 ; - anti-simetrična, ako za a, b, iz arb i bra sledi da je a = b, tj. ako je R R 1 Δ ; - tranzitivna, ako za a, b, c, iz arb i brc sledi arc, tj. ako je R R R. Refleksivnu i tranzitivnu relaciju zovemo kvazi-uređenje. Refleksivnu, anti-simetričnu i tranzitivnu relaciju zovemo uređenje ili relacija poretka, a refleksivnu, simetričnu i tranzitivnu relaciju zovemo relacija ekvivalencije, ili samo ekvivalencija. Neka su, B i C konačni skupovi za koje važi: = m, B = n i C = p. Relacije R B, S B C i T C tretiraćemo kao Bulove matrice a skupove α i β B kao Bulove vektore, odnosno: R = [r ij ] m n, S = [s jk ] n p, T = [t ik ] m p, α = [α i ] m, β = [β j ] n. Pritom za Bulove matrice i i {1,2,, m}, j {1,2,, n}, k {1,2,, p} važi: r ij = { 0, (a i, b j ) R 1, (a i, b j ) R, s jk = { 0, (b j, c k ) S 1, (b j, c k ) S, t ik = { 0, (a i, c k ) T 1, (a i, c k ) T, dok za Bulove vektore važi: α i = { 0, a i α 1, a i α, β j = { 0, b j β 1, b j β, gde su a i, b j B i c k C. Bulov proizvod matrica R i S (R S), predstavlja matricu kompozicije relacija R i S. 6
Reziduale skupova α\β i β/α izračunavamo uz pomoć sledećih formula: α\β = [α i β j ] m n, β/α = (α\β) 1 = ([α i β j ] m n ) 1. Sa druge strane, u izračunavanju reziduala relacija koristićemo jednu novu operaciju na Bulovim matricama koju definišemo na sledeći način: za Bulove matrice U = [u ij ] m n i V = [υ jk ] n p, njihov proizvod je Bulova matrica U V = W = [w ik ] m p čiji su članovi definisani sa za sve i {1,2,, m} i j {1,2,, n}. n w ik = u ij υ jk, j=1 2.3. lfabet, reči i jezici Neka je X neprazan skup koji nazivamo alfabetom, a čije elemente nazivamo slovima. Reč (engl. string) nad alfabetom X definiše se kao konačni niz: x 1 x 2 x n, gde su x 1, x 2,, x n X slova. Iz ove definicije jasno je da se jednakost reči definiše kao jednakost nizova. To znači da su dve reči: u = x 1 x 2 x n i v = y 1 y 2 y m jednake ako i samo ako je m = n i x i = y i, za svako i {1,2,, n}. Za reč u = x 1 x 2 x n, gde su x 1, x 2,, x n X, broj n, to jest broj elemenata (slova) u nizu x 1 x 2 x n, označavamo sa u, i nazivamo dužinom reči u. Sadržaj reči u je skup svih slova koja se pojavljuju u reči u i označava se sa c(u). Prazan niz slova označava se sa e i naziva prazna reč. Jasno je da je e = 0. Osnovna operacija nad rečima je operacija nadovezivanja ili konkatenacije. Konkatenacijom reči u = x 1 x 2 x n i v = y 1 y 2 y m dobijamo reč: u v = uv = x 1 x 2 x n y 1 y 2 y m. Ova operacija je asocijativna i uvodimo oznake: x 0 = e, x 1 = x i x k = xx x k Reverzna reč date reči u = x 1 x 2 x n jeste reč u = x n x 2 x 1. Skup svih reči nad alfabetom X, uključujući i praznu reč, označavaćemo sa X, a sa X + ćemo označavati skup svih nepraznih reči nad tim alfabetom, odnosno X + = X {e}. Jezik L nad alfabetom X definišemo kao proizvoljan skup reči nad tim alfabetom, odnosno kao L X. 7
3. Konačni automati Konačni automati se dele na determinističke i nedeterminističke konačne automate. Postoji nekoliko načina za predstavljanje konačnih automata. Prvi način i ujedno način koji se najviše primenjuje u literaturi jeste grafički prikaz. Ovim prikazom automat se predstavlja kao označeni usmereni graf sa nekim malim izmenama. Naime, početna stanja automata se označavaju sa strelicom ispred, odnosno: Takođe, završna stanja su uokvirena sa duplim kružićima, na sledeći način: Prelazi koji postoje kod automata se predstavljaju kao i prelazi kod označenih usmerenih grafova, to jest: Konačni automati se mogu predstaviti i tablicama prelaza. Tablica prelaza automata je pravougaona tablica sa vrstama koje odgovaraju svim simbolima prelaza i kolonama koje odgovaraju stanjima. a x δ (a, x) Ovde su sa δ (a, x) označena sva stanja u koja automat prelazi kada se nalazi u stanju a i na ulazu se pojavi simbol x. utomati se mogu predstaviti i pomoću Bulovih vektora i matrica, gde matrice označavaju relacije prelaza a vektori skupove inicijalnih i završnih stanja. Kako vršimo predstavljanje automata na navedene načine najbolje će biti ilustrovano sledećim primerom: Primer 3.1: Dat je automat sa sledećim karakteristikama: Skup stanja:, B, C; Početno stanje: ; Završno stanje: ; Prelazi: 0, 1 B, B 0 C, B 1, C 0 B, C 1 C. 8
1) Grafički prikaz: 2) Tablica prelaza: B C 0 C B 1 B C 3) Bulovi vektori i matrice: Vektor početnih stanja: σ = [1 0 0]; 1 Vektor završnog stanja: τ = [ 0]; 0 1 0 0 0 1 0 Matrice prelaza: δ 0 = [ 0 0 1], δ 1 = [ 1 0 0]. 0 1 0 0 0 1 U prethodnom primeru vidimo da je: 1 0 0 σ δ 0 = [1 0 0] [ 0 0 1] = [1 0 0], 0 1 0 0 1 0 σ δ 1 = [1 0 0] [ 1 0 0] = [0 1 0]. 0 0 1 Vidimo da se primenom operatora za vektor početnog stanja i neku matricu prelaza dobija odgovarajuće naredno stanje automata. Ovaj postupak se može nastavljati sve dok postoji ulazna sekvenca simbola. Za vektor završnog stanja i neku matricu prelaza primenom operatora dobija se odgovarajuće prethodno stanje automata: 1 0 0 1 1 δ 0 τ = [ 0 0 1] [ 0] = [ 0], 0 1 0 0 0 0 1 0 1 0 δ 1 τ = [ 1 0 0] [ 0] = [ 1]. 0 0 1 0 0 Bulovi vektori i matrice nam omogućavaju lakše predstavljanje automata u programskim jezicima. 9
utomati (deterministički i nedeterministički) prihvataju (prepoznaju) neku ulaznu sekvencu (reč) ako se iz nekog od početnih stanja automata, pod dejstvom simbola te sekvence, dolazi u neko od završnih stanja. U suprotnom, automat ne prihvata reč. utomat prepoznaje praznu reč e, ako i samo ako važi jednakost: σ τ = 1. Lako je zaključiti da automat iz prethodnog primera zadovoljava ovu jednakost, odnosno prihvata praznu reč. utomat prepoznaje reč u = x 1 x 2 x n, x 1, x 2,..., x n X, ako i samo ako važi sledeća jednakost: σ δ x1 δ x2 δ xn τ = 1. Sada ćemo navesti formalne definicije determinističkih i nedeterminističkih konačnih automata. 3.1.1. Deterministički konačan automat Deterministički konačan automat je uređena petorka = (, X, δ, a 0, τ ) gde je: konačan, neprazan skup stanja; X ulazni alfabet; δ : X funkcija prelaza; a 0 inicijalno (početno) stanje; τ neprazan skup završnih (finalnih) stanja. Kako je δ : X, to postoji tačno jedno stanje b tako da je b = δ (a, x) gde a i x X, odnosno postoji tačno jedno stanje u koje se sa x prelazi iz a. Primer 3.2 (Deterministički automat): Slika 3.1: Deterministički automat Skup stanja ovog automata je = {q0, q1, q2, q3, q4, q5, q6, q7}, a ulazni alfabet je X = {0, 1}. Početno stanje automata je q0, a završno stanje je q2. utomat prihvata reči: 10, 01, 101111, 10010, 00110, utomat ne prihvata reči: 111, 000000, 100, 00011111111111, 10
3.1.2. Nedeterministički konačan automat Nedeterministički konačan automat je petorka = (, X, δ, σ, τ ) gde je: konačan, neprazan skup stanja; X ulazni alfabet; δ : X P() funkcija prelaza, gde je sa P() označen partitivni skup skupa, odnosno skup svih podskupova skupa ; σ skup inicijalnih stanja; τ skup završnih (finalnih) stanja. Kod nedeterminističkog automata se iz stanja a, pod uticajem ulaznog simbola x, može preći u bilo koje stanje iz skupa δ (a, x). Kako P() sadrži i prazan skup, to prema definiciji znači da i δ (a, x) može biti i prazan skup, što dalje znači da se iz stanja a, pod uticajem ulaznog simbola x, ne može preći ni u jedno drugo stanje. Primer 3.3 (Nedeterministički automat): Slika 3.2: Nedeterministički automat Skup stanja ovog automata je = {s, w1, w2, d1, d2, d3, f1, f2, f3, f4, i1, i2, F}, a ulazni alfabet je X = {λ, statement, while, condition, do, for, if, init, step}. Skup inicijalnih stanja je σ = {s}, dok je skup finalnih stanja τ = {s, F}. utomat prihvata reči: praznu reč, statement, do statement while condition, statement λ, utomat ne prihvata reči: while, λ, if condition statement, condition, 11
3.1.3. Reverzni automat i podautomat Neka je dat automat, = (, X, δ, σ, τ ). Njegov reverzni automat je = (, X, δ, σ, τ ), čija relacija prelaza i skupovi inicijalnih i završnih stanja su definisani sa: δ (a, x, b) = δ (b, x, a) za svako x X i a, b ; σ = τ i τ = σ. utomat B = (B, X, δ B, σ B, τ B ) je podautomat automata = (, X, δ, σ, τ ), ako važi: B ; δ x B je restrikcija od δ x na B B, za svako x X (δ x B = δ x B B) i σ B, τ B su restrikcije od σ, τ na B (σ B = σ B, τ B = τ B). 3.1.4. Izomorfni automati Neka su dati automati = (, X, δ, σ, τ ) i B = (B, X, δ B, σ B, τ B ). Za funkciju φ: B, kažemo da je izomorfizam automata i B, ako je bijektivna i ako za sve a, a 1, a 2 i x X važi sledeće: (a 1, a 2 ) δ x (φ(a 1 ), φ(a 2 )) δ x B ; a σ φ(a) σ B i a τ φ(a) τ B. ko postoji izomorfizam između automata i B, tada kažemo da su i B izomorfni automati, i pišemo B. Drugim rečima, dva automata su izomorfna ako u suštini imaju istu strukturu, odnosno ako se jedan od drugog razlikuju samo u označavanju njihovih stanja. 12
4. Količnički automat i redukcija broja stanja 4.1. Količnički automat Zbog jednostavnijeg pisanja, za relacije na skupu stanja automata pisaćemo relacija na automatu. Neka je R proizvoljno kvazi-uređenje na automatu = (, X, δ, σ, τ ) i neka je R skup svih R-aftersetova (skupova koji su dobijeni primenom relacije R na automat ). Primenom relacije R možemo definisati novu relaciju prelaza nad skupovima R-aftersetova, na sledeći način: (R a1, x, R a2 ) δ R ( a 1, a 2 )((a 1, a 1 ) R (a 1, x, a 2 ) δ (a 2, a 2 ) R) (a 1, a 2 ) R δ x R za sve a 1, a 2 i x X, i možemo definisati σ R, τ R R : R a σ R ( a )(a σ (a, a) R) a σ R R a τ R ( a )(a τ (a, a ) R) a R τ za svako a. Na isti način se definiše i automat R, čija stanja predstavljaju skup R-foresetova: (R a1, x, R a2 ) δ R ( a 1, a 2 )((a 1, a 1 ) R (a 1, x, a 2 ) δ (a 2, a 2 ) R) (a 1, a 2 ) R δ x R za sve a 1, a 2 i x X, i možemo definisati σ R, τ R R : R a σ R ( a )(a σ (a, a) R) a σ R R a τ R ( a )(a τ (a, a ) R) a R τ za svako a. Iz ovih definicija vidimo da su automati R i R izomorfni za dato kvazi-uređenje R. Zbog toga ćemo nadalje koristiti samo automat R i njega ćemo nazvati količnički automat automata u odnosu na kvazi-uređenje R. Neka su R i S dva kvazi-uređenja na automatu = (, X, δ, σ, τ ) takva da je R S. Tada relacija S // R na R definisana sa (R a, R b ) S // R (a, b) S, za sve a, b, predstavlja kvazi-uređenje na R i količnički automati ( R)//( S // R) i // S su izomorfni. Osim toga, ako je S relacija ekvivalencije, onda je i S // R relacija ekvivalencije. Neka je R kvazi-uređenje na automatu = (, X, δ, σ, τ ). utomat i njegov količnički automat // R imaju isti broj stanja kao ako i samo ako je R uređenje. 13
4.2. Redukcija broja stanja Za proizvoljno kvazi-uređenje R na automatu = (, X, δ, σ, τ ), pravilom a R a je definisana sirjektivna funkcija iz na // R, što znači da količnički automat //R uvek ima manji ili jednak broj stanja od originalnog automata. Osim toga, ako su R i S dva kvaziuređenja na takva da je R S, tada automat //S ima manji ili jednak broj stanja od automata //R. To znači da bi se broj stanja automata mogao redukovati pomoću nekog pogodnog kvazi-uređenja na skupu stanja tog automata, formiranjem odgovarajućeg količničkog automata. Međutim, u opštem slučaju količnički automat ne mora biti ekvivalentan originalnom automatu, tj. ne mora raspoznavati isti jezik. Prema tome, problem redukcije broja stanja nedeterminističkih automata, svodi se na problem nalaženja takvih kvazi-uređenja na skupu stanja automata koja daju količnički automat ekvivalentan originalnom automatu. Pri tome, poželjno je da to kvazi-uređenje bude što je moguće veće, jer će se na taj način dobiti količnički automat sa što je moguće manjim brojem stanja. Naka je dat automat = (, X, δ, σ, τ ) i kvazi-uređenje R na. Setimo se da za reč u = x 1 x 2... x n X +, gde su x 1, x 2,..., x n X, n N, važi: dok za praznu reč važi: u [[]] σ δ x1 δ x2 e [[]] σ τ = 1. δ xn τ = 1, Sa druge strane, koristeći asocijativnost kompozicije relacija i činjenicu da je R R = R, jer je R kvazi-uređenje, dobijamo da u automatu // R za reč u važi: u [[ // R]] σ R δ x1 R δ x2 R R δ xn R τ = 1, dok za praznu reč važi: e [[ // R]] σ R τ = 1. Prema tome, količnički automat // R će biti ekvivalentan originalnom automatu, ako i samo kvazi-uređenje R zadovoljava sledeće uslove: σ τ = σ R τ, σ δ x1 δ x2 δ xn τ = σ R δ x1 R δ x2 R R δ xn R τ, za sve x 1, x 2,..., x n X, n N. Setimo se da je skup stanja automata po definiciji konačan, pa ako relacije na tretiramo kao Bulove matrice a podskupove od kao Bulove vektore, tada ovi uslovi predstavljaju sistem Bulovih matričnih jednačina koji ćemo nazivati opšti sistem pridružen automatu. Za kvaziuređenja koja zadovoljavaju te uslove govorićemo da su rešenja opšteg sistema. ko malo bolje pogledamo sistem, videćemo da on uvek ima trivijalno rešenje. Međutim, to rešenje nam ne odgovara jer se preko njega dobija automat identičan početnom automatu. ko je S proizvoljno rešenje opšteg sistema pridruženog automatu = (, X, δ, σ, τ ), onda je svako kvazi-uređenje na sadržano u S takođe rešenje opšteg sistema. 14
4.2.1. Redukcija pomoću desno invarijantnih kvazi-uređenja Neka je = (, X, δ, σ, τ ) proizvoljni automat. Za kvazi-uređenje R na koje zadovoljava uslove: R δ x R = δ x R, za svako x X, R τ = τ, kažemo da je desno invarijantno kvazi-uređenje na, a ako za R važi: R δ x R = R δ x, za svako x X, σ R = σ, onda kažemo da je R levo invarijantno kvazi-uređenje na. Sva desno invarijantna i levo invarijantna kvazi-uređenja na automatu su rešenja opšteg sistema pridruženog tom automatu. Neka je R kvazi-uređenje na automatu = (, X, δ, σ, τ ). Tada su sledeći uslovi ekvivalentni: (i) R je desno invarijantno kvazi-uređenje na ; (ii) R δ x δ x R, za svaki x X; (iii) Važi sledeća inkluzija: R x X (δ x R)/(δ x R). Za automat = (, X, δ, σ, τ ), definišemo induktivno niz {R k } k N relacija na na sledeći način: R 1 = τ /τ, R k+1 = R k x X (δ x R k )/(δ x R k ), za svako k N. Tada važi: a) {R k } k N je opadajući niz kvazi-uređenja na ; b) Postoji n N tako da je R n = R n+1, i u tom slučaju R n je najveće desno invarijantno kvazi-uređenje na. Sada možemo formirati algoritam za nalaženje najvećeg desno invarijantnog kvazi-uređenja. lgoritam 4.1 (Najveće desno invarijantno kvazi-uređenje): Ulaz algoritma je automat = (, X, δ, σ, τ ). lgoritam izračunava najveće desno invarijantno kvazi-uređenje na. Postupak se sastoji u konstrukciji niza kvazi-uređenja {R k } k N, na sledeći način: U prvom koraku stavljamo R 1 = τ /τ ; Posle k-tog koraka neka je R k kvazi-uređenje koje je konstruisano ; U narednom koraku konstruišemo kvazi-uređenje R k+1 pomoću formule R k+1 = R k x X (δ x R k )/(δ x R k ) i istovremeno, proveravamo da li je R k+1 = R k ; Kada nađemo najmanji prirodan broj n takav da je R n+1 = R n, postupak formiranja niza {R k } k N se završava i R n je najveće desno invarijantno kvazi-uređenje na. 15
Na sličan način možemo formirati i algoritam za nalaženje najvećeg levo invarijantnog kvaziuređenja. Najveće desno invarijantno kvazi-uređenje: R 1 = τ / τ R k+1 = R k (δ x R k )/(δ x R k ) x X Najveće levo ivarijantno kvazi-uređenje: R 1 = σ \ σ R k+1 = R k (R k δ x )\(R k δ x ) x X Najveća desno invarijantna ekvivalencija: R 1 = (τ / τ ) (τ / τ ) 1 R k+1 = R k ((δ x R k )/(δ x R k )) ((δ x R k )/(δ x R k )) 1 x X Najveća levo invarijantna ekvivalencija: R 1 = (σ \ σ ) (σ \ σ ) 1 R k+1 = R k ((R k δ x )\(R k δ x )) ((R k δ x )\(R k δ x )) 1 x X function LRIQO: Input: = (, X, δ, σ, τ ): utomaton; Output: result: boolean matrix; Variables: i: integer, n: integer, R: array of boolean matrix; begin R[1] τ /τ ; R[0] is any boolean matrix different then R[1]; i 0; n 1; while R[i] R[i + 1] do R[i + 2] R[i + 1]; for every x in X do R[i + 2] R[i + 2] ((δ x R k )/(δ x R k )); i i + 1; n i; end while; result R[n]; end function. 16
4.2.2. Redukcija pomoću slabo desno invarijantnih kvazi-uređenja Neka je = (, X, δ, σ, τ ) proizvoljni automat. Za svaku reč u X definišemo skupove σ u, τ u sa: σ u = σ δ u = {a ( b ) b σ (b, a) δ u }, τ u = δ u τ = {a ( b ) (a, b) δ u b τ }. Drugim rečima, σ u je skup svih stanja automata u koja se može stići iz nekog inicijalnog stanja pod uticajem ulaznih simbola reči u, dok je τ u skup svih stanja iz kojih se može stići u neko završno stanje pod uticajem simbola te reči. Očigledno, za praznu reč e X je σ e = σ i τ e = τ. Na sličan način, za svako stanje a definišemo jezike σ a, τ a X sa: σ a = {u X ( b ) b σ (b, a) δ u } = {u X a σ u }, τ a = {u X ( b ) (a, b) δ u b τ } = {u X a τ u }. Dakle, σ a je skup svih reči koje iz nekog inicijalnog stanja vode do stanja a, a τ a je skup svih reči koje iz stanja a vode do nekog završnog stanja. Jasno je da u σ a ako i samo ako a σ u, dok u τ a ako i samo ako a τ u. Jezike σ a i τ a zovemo redom levi jezik i desni jezik pridružen stanju a. Kvazi-uređenje R na koje zadovoljava jednakost: R τ u = τ u, za svako u X, nazivaćemo slabo desno invarijantnim kvazi-uređenjem na automatu, a ako R zadovoljava σ u R = σ u, za svako u X, zvaćemo ga slabo levo invarijantnim kvazi-uređenjem na. Primetimo da je τ u R τ u i σ u σ u R ispunjeno kadgod je R refleksivna relacija, pa su gore navedene jednačine za slaba kvazi-uređenja redom ekvivalentna sa R τ u τ u, za svako u X, tj. sa σ u R σ u, za svako u X. Za automat = (, X, δ, σ, τ ) važi: a) Svako slabo desno invarijantno kvazi-uređenje na je rešenje opšteg sistema pridruženog tom automatu. b) Svako desno invarijantno kvazi-uređenje na je slabo desno invarijantno. Neka je Q wri relacija na automatu = (, X, δ, σ, τ ) definisana izrazom: Q wri = τ u X u /τ u. Tada važi sledeće: a) Kvazi-uređenje R na je slabo desno invarijantno ako i samo ako je R Q wri. b) Q wri je najveće slabo desno invarijantno kvazi-uređenje na. Sada možemo formirati algoritam za izračunavanje nejvećeg slabo desno invarijantnog kvaziuređenja, ali pre toga navodimo pomoćni algoritam za izračunavanje svih članova kolekcije {τ u } u X. 17
lgoritam 4.2 (Izračunavanje svih članova kolekcije {τ u } u X ): Ulaz ovog algoritma je automat = (, X, δ, σ, τ ). lgoritam izračunava sve članove kolekcije {τ u } u X. Postupak se sastoji u konstrukciji stabla kolekcije {τ u } u X. Stablo se konstruiše induktivno, na sledeći način: Koren stabla je τ e, i mi stavljamo T 0 = {τ e } ; Nakon i-tog koraka neka je konstruisano stablo T i, i neka su čvorovi u T i označeni i lisa zatvoren i lisa nezatvoren. Značenja ova dva izraza biće razjašnjena u nastavku; Konstruišemo stablo T i+1 dograđivanjem stabla T i na sledeći način: za svaki nezatvoren list τ u koji se pojavljuje u T i, gde je u X, i svako x X, mi dodajemo čvor τ xu = δ x τ u i granu iz τ u u τ xu. Istovremeno, proveravamo da li se τ xu poklapa sa nekim skupom koji je već konstruisan, i ako je to tačno, ako je skup τ xu jednak nekom ranije izračunatom skupu τ v,onda čvor τ xu označavamo kao zatvoren i stavljamo s(τ xu ) = s(τ v ). Postupak se završava kada svi listovi budu označeni kao zatvoreni; Kada je stablo kolekcije {τ u } u X konstruisano, njegovi unutrašnji čvorovi odgovaraju različitim članovima te kolekcije. function collection_calculation: Input: = (, X, δ, σ, τ ): utomaton; Output: result: Tree; Variables: i, counter: integer, T: Tree; begin T[0] {τ e }; τ e. is_open true; s(τ e ) 1; i 0; counter 1; while T[i]. has_open_node() do for every open node τ u in T[i] do for every x in X do τ xu δ x τ u ; s(τ xu ) = 0; for every node τ v in T do if τ xu = τ v then s(τ xu ) s(τ v ); τ xu. is_open false; if s(τ xu ) = 0 then s(τ xu ) counter + 1; counter counter + 1; τ xu. is_open true; T[i + 1]. add_node(τ xu ); T. add_edge(τ u, x, τ xu ); i i + 1; end while; result T. remove_closed_edges(); end function. 18
lgoritam 4.3 (Najveće slabo desno invarijantno kvazi-uređenje): Ulaz ovog algoritma je automat = (, X, δ, σ, τ ). lgoritam izračunava najveće slabo desno invarijantno kvaziuređenje Q wri na, na sledeći način: Najpre izračunavamo skupove τ u, za sve u X, koristeći prethodni algoritam; Potom izračunavamo Q wri pomoću formule Q wri = τ u /τ u function LWRIQO: Input: = (, X, δ, σ, τ ): utomaton; Output: result: boolean matrix; Variables: Q wri : boolean matrix; begin Q wri all_ones_matrix(); for every τ u in collection_calculation() do Q wri Q wri (τ u /τ u ) result Q wri ; end function. u X. Za računanje najvećeg slabo levo invarijantnog kvazi-uređenja Q wli, možemo dati slične formule i algoritme. Najveće slabo desno invarijantno kvazi-uređenje: Q wri = τ u u X /τ u Najveće slabo levo ivarijantno kvazi-uređenje: Q wli = σ u u X \σ u Najveća slabo desno invarijantna ekvivalencija: E wri = (τ u u X /τ u ) (τ u /τ u ) 1 Najveća slabo levo invarijantna ekvivalencija: E wli = (σ u u X \σ u ) (σ u \σ u ) 1 19
5. Determinizacija Svaki nedeterministički konačan automat se može prevesti u ekvivalentan deterministički konačan automat i taj proces se naziva determinizacija. lgoritmi za determinizaciju koji će biti opisani u daljem tekstu su: 1) Podskupovna konstrukcija; 2) Konstrukcija Nerodovog i reverznog Nerodovog automata; 3) lgoritmi za determinizaciju pomoću slabo invarijantnih kvazi-uređenja; 4) Konstrukcija dečjeg automata; 5) Kanonizacioni metod Brzozovskog i poboljšani metod Brzozovskog; 6) Kanonizacija pomoću jezičke inkluzije. 5.1. Osnovni algoritam determinizacije podskupovna konstrukcija Klasičan način da se nedeterministički konačni automat = (, X, δ, σ, τ ) preobrati u deterministički je da se formira deterministički konačni automat p = ( p, X, δ p, σ p, τ p ), čiji skup stanja je p = 2, skup svih podskupova od, jedinstveno inicijalno stanje je σ p, funkcija prelaza δ p : p X p je definisana sa δ p(α, x) = α δ x, i skup τ p završnih stanja je zadat sa za sve α p i x X, τ p = {α p α τ } = {α p α τ = 1}. Za automat p kažemo da je nastao iz podskupovnom konstrukcijom (engl. subset construction). lgoritam 5.1 (Podskupovna konstrukcija): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X, a izlaz je deterministički konačni automat, p = ( p, X, δ p, σ p, τ p ). Postupak se sastoji iz konstrukcije grafa G automata p, što se čini na sledeći način: Čvorove grafa G formiramo kao sve podskupove skupa, a čvor koji odgovara skupu σ označavamo kao početni čvor automata p ; Za svaki čvor α p proveravamo da li je α τ, i ako jeste, onda čvor koji odgovara skupu α označavamo kao završno stanje automata p ; Za svaki čvor α p i svako x X izračunavamo α δ x i formiramo granu iz čvora koji odgovara skupu α u čvor koji odgovara skupu α δ x, koju označavamo sa x. Dijagram koji je dobijen nako realizacije ova tri koraka je graf automata p. 20
function subset_construction: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: G: Graph; begin G. nodes P(); G. start_node σ ; for every α in G. nodes do if α τ then G. final_nodes. add(α); for every x in X do for every β in G. nodes do if α δ x = β then G. add_edge(α, x, β); result G. toutomaton(); end function. Iako ovaj algoritam predstavlja jednostavan način da se od nedeterminističkog automata dobije ekvivalentan deterministički, on ima dosta nedostataka zbog kojih se ne koristi u praksi. Očigledan nedostatak podskupovne konstrukcije je u tome što se njegovom primenom eksponencijalno povećava broj stanja. Naime, nedeterministički automat se n stanja se podskupovnom konstrukcijom pretvara u deterministički automat p sa 2 n stanja. Pritom mnoga stanja automata p mogu biti suvišna, jer su nedostižna iz početnog stanja. Najjednostavnija modifikacija podskupovne konstrukcije, pomoću koje se gradi samo dostižni deo automata p, poznata je kao dostižna podskupovna konstrukcija (engl. accessible subset construction). Primer 5.1: Slika 4: Dostižna podskupovna konstrukcija 21
5.2. Konstrukcija Nerodovog automata Za nedeterministički automat = (, X, δ, σ, τ ), ovom konstrukcijom se gradi deterministički automat N = ( N, X, δ N, σ N e, τ N), čiji skup stanja je N = {σ u u X } a funkcija prelaza δ N: N X N je definisana kao u algoritmu podskupovne konstrukcije, to jest izrazima: δ N(α, x) = α δ x, za sve α N i x X, odnosno: δ N(σ u, x) = σ ux, za sve u X i x X. Skup završnih stanja τ N je takođe zadat kao u algoritmu podskupovne konstrukcije, odnosno: τ N = {α N α τ } = {α N α τ = 1}. utomat N se naziva Nerodov automat (. Nerode). Efektivan postupak za konstukciju ovog automata definisan je sledećim algoritmom: lgoritam 5.2 (Konstrukcija Nerodovog automata N ): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X, a izlaz je Nerodov deterministički automat, N = ( N, X, δ N, σ N e, τ N). Postupak se sastoji u konstrukciji stabla prelaza Nerodovog automata N direktno iz, koristeći pokazivače s( ), kojima čvorovima stabla pridružujemo odgovarajuće prirodne brojeve. Stablo prelaza Nerodovog automata N konstruiše se induktivno, na sledeći način: Koren stabla je σ N e i postavljamo T0 = {σ N e } i s(σ N e ) = 1. Istovremeno, proveravamo da li je σ N e τ N, i ako je to tačno σ N e je završno stanje; Posle i-tog koraka neka je dobijeno stablo T i, koje sadrži zatvorene i nezatvorene čvorove; U narednom koraku konstruišemo stablo prelaza T i+1, na sledeći način: za svaki nezatvoreni list σ N u u stablu Ti, gde je u X, i svako x X dodajemo čvor σ N ux = σ N u δ N x i granu iz N σu u N σux označenu sa x. Istovremeno, proveravamo da li je σ N ux skup koji je već konstruisan, i ako jeste, tj. ako je N σux jednak nekom već konstruisanom σ N v, onda označavamo σ N ux zatvorenim i stavljamo N s(σux ) = s(σ N v ). U suprotnom, stavljamo da je s(σ N ux ) sledeći nepridružen prirodan broj i proveravamo da li je σ N ux τ, i ako je to tačno σ N ux je završno stanje. Postupak se završava kada svi listovi budu označeni kao zatvoreni; Kada je stablo prelaza automata N konstruisano, brišemo oznake za zatvorenost listova i preklapamo listove sa unutrašnjim čvorovima koji imaju istu vrednost pokazivača. Dijagram koji je dobijen na ovakav način, dopunjen oznakama za početno i završna stanja je Nerodov automat N. 22
function Nerode_algorithm: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: i, counter: integer, T: Tree; begin T[0]. add_node(σ e ); σ e. is_open true; if σ e τ then T. final_states. add(σ e ); s(σ e ) 1; i 0; counter 1; while T[i]. has_open_node() do for every open node σ u in T[i] do for every x in X do σ ux σ u δ x ; s(σ ux ) = 0; for every node σ v in T do if σ ux = σ v then s(σ ux ) s(σ v ); σ ux. is_open false; if s(σ ux ) = 0 then s(σ ux ) counter + 1; counter counter + 1; σ ux. is_open true; T[i + 1]. add_node(σ ux ); if σ ux τ then T. final_states. add(σ ux ); T. add_edge(σ u, x, σ ux ); i i + 1; end while; result T. toutomaton(); end function. 23
5.2.1. Reverzni Nerodov automat Za nedeterministički automat = (, X, δ, σ, τ ), ovom konstrukcijom se gradi deterministički automat N = ( N, X, δ N, τ e N, τ N ), čiji skup stanja je N = {τ u N u X } a funkcija prelaza δ N : N X N je definisana kao u algoritmu podskupovne konstrukcije, to jest izrazima: δ N (α, x) = δ x α, za sve α N i x X, odnosno: δ N (τ u, x) = τ xu, za sve u X i x X. Skup završnih stanja τ N je takođe zadat kao u algoritmu podskupovne konstrukcije, odnosno: τ N = {α N α σ } = {α N σ α = 1}. utomat N se naziva reverzni Nerodov automat. Reverzni (inverzni) Nerodov automat se konstruiše na sličan način kao i Nerodov automat. lgoritam 5.3 (Konstrukcija reverznog Nerodovog automata N ): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X, a izlaz je reverzni Nerodov deterministički automat, N = ( N, X, δ N, τ e N, τ N ). Postupak se sastoji u konstrukciji stabla prelaza reverznog Nerodovog automata N direktno iz, koristeći pokazivače s( ), kojima čvorovima stabla pridružujemo odgovarajuće prirodne brojeve. Stablo prelaza reverznog Nerodovog automata N konstruiše se induktivno, na sledeći način: Koren stabla je τ e i postavljamo T 0 = {τ e N } i s(τ e N ) = 1. Istovremeno, proveravamo da li je σ τ N e, i ako je to tačno τ N e je završno stanje; Posle i-tog koraka neka je dobijeno stablo T i, koje sadrži zatvorene i nezatvorene čvorove; U narednom koraku konstruišemo stablo prelaza T i+1, na sledeći način: za svaki nezatvoreni list τ N u u stablu T i, gde je u X, i svako x X dodajemo čvor τ N xu = δ x τ N u i granu iz τ N u u τ N xu označenu sa x. Istovremeno, proveravamo da li je τ N xu skup koji je već konstruisan, i ako jeste, tj. ako je τ N xu jednak nekom već konstruisanom τ N v, onda označavamo τ N xu zatvorenim i stavljamo s(τ N xu ) = s(τ N v ). U suprotnom, stavljamo da je s(τ N xu ) sledeći nepridružen prirodan broj i proveravamo da li je σ τ N xu, i ako je to tačno τ N xu je završno stanje. Postupak se završava kada svi listovi budu označeni kao zatvoreni; Kada je stablo prelaza automata N konstruisano, brišemo oznake za zatvorenost listova i preklapamo listove sa unutrašnjim čvorovima koji imaju istu vrednost pokazivača. Dijagram koji je dobijen na ovakav način, dopunjen oznakama za početno i završna stanja je inverzni Nerodov automat N. 24
function reverse_nerode_algorithm: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: i, counter: integer, T: Tree; begin T[0]. add_node(τ e ); τ e. is_open true; if σ τ e then T. final_states. add(σ e ); s(τ e ) 1; i 0; counter 1; while T[i]. has_open_node() do for every open node τ u in T[i] do for every x in X do τ xu δ x τ u ; s(τ xu ) = 0; for every node τ v in T do if τ xu = τ v then s(τ xu ) s(τ v ); τ xu. is_open false; if s(τ xu ) = 0 then s(τ xu ) counter + 1; counter counter + 1; τ xu. is_open true; T[i + 1]. add_node(τ xu ); if σ τ xu then T. final_states. add(σ xu ); T. add_edge(τ u, x, τ xu ); i i + 1; end while; result T. toutomaton(); end function. 25
5.3. Determinizacija pomoću slabo-invarijantnih kvazi-uređenja 5.3.1. Determinizacija pomoću slabog desno invarijantnog kvazi-uređenja Neka je = (, X, δ, σ, τ ) nedeterministički automat i neka je R relacija na. Za svako u X definišemo podskup R u induktivno, na sledeći način: za praznu reč e stavljamo da je: R e = σ R, a za proizvoljne u X i x X stavljamo da je: R ux = R u δ x R. Jasno, ako je u = x 1 x n, gde su x 1,, x n X, tada je R u = σ R δ x1 R δ xn R. Sada, stavimo da je R = {R u u X }, i definišimo δ R: R X R sa: δ R(R u, x) = R ux, za sve u X i x X. Skup završnih stanja τ N je takođe zadat kao u algoritmu podskupovne konstrukcije, odnosno: τ R = {α R α τ } = {α N α τ = 1}. ko je R u = R v, za neke u X, tada za svako x X imamo da je: δ R(R u, x) = R ux = R u δ x R = R v δ x R = R vx = δ R(R v, x) što znači da je δ R dobro definisana funkcija. Odatle neposredno dobijamo da je R = ( R, X, δ R, σ e R, τ R) dobro definisan deterministički automat. Osnovno pitanje koje se ovde nameće je kako izabrati relaciju R tako da automat R bude ekvivalentan polaznom automatu. lgoritam 5.4 (Konstrukcija automata R ): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X i slabo desno invarijantno kvazi-uređenje R na, a izlaz je automat R = ( R, X, δ R, R e, τ R). Postupak se sastoji u konstrukciji stabla prelaza automata R direktno iz, koristeći pokazivače s( ), kojima čvorovima stabla pridružujemo odgovarajuće prirodne brojeve. Stablo prelaza automata R konstruiše se induktivno, na sledeći način: Koren stabla je R e i postavljamo T 0 = {R e } i s(r e ) = 1. Istovremeno, proveravamo da li je R e τ, i ako je to tačno R e je završno stanje; Posle i-tog koraka neka je dobijeno stablo T i, koje sadrži zatvorene i nezatvorene čvorove; U narednom koraku konstruišemo stablo prelaza T i+1, na sledeći način: za svaki nezatvoreni list R u u stablu T i, gde je u X, i svako x X dodajemo čvor R ux = R u δ x i granu iz R u u R ux označenu sa x. Istovremeno, proveravamo da li je R ux skup koji je već konstruisan, i ako jeste, tj. ako je R ux jednak nekom već konstruisanom R v,onda označavamo R ux zatvorenim i stavljamo s(r ux ) = s(r v ). U suprotnom, stavljamo da je s(r ux ) sledeći nepridružen prirodan broj i proveravamo da li je R ux τ, i ako je to tačno R ux je završno stanje. Postupak se završava kada svi listovi budu označeni kao zatvoreni; 26
Kada je stablo prelaza automata R konstruisano, brišemo oznake za zatvorenost listova i preklapamo listove sa unutrašnjim čvorovima koji imaju istu vrednost pokazivača. Dijagram koji je dobijen na ovakav način, dopunjen oznakama za početno i završna stanja je graf automata R. function LWRIQ: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: i, counter: integer, T: Tree, R: boolean matrix; begin R LWRIQO(); R e σ R; T[0]. add_node(r e ); if R e τ then T. final_states. add(r e ); R e. is_open true; s(r e ) 1; i 0; counter 1; while T[i]. has_open_node() do for every open node R u in T[i] do for every x in X do R ux R u δ x ; s(s xu ) = 0; for every node R v in T do if R ux = R v then s(r ux ) s(r v ); R ux. is_open false; if s(r ux ) = 0 then s(r ux ) counter + 1; counter counter + 1; R ux. is_open true; T[i + 1]. add_node(r ux ); if R ux τ then T. final_states. add(r ux ); T. add_edge(r u, x, R ux ); i i + 1; end while; result T. toutomaton(); end function. 27
5.3.2. Determinizacija pomoću slabog levo invarijantnog kvazi-uređenja Neka je = (, X, δ, σ, τ ) nedeterministički automat i neka je S relacija na. Za svako u X definišemo podskup S u induktivno, na sledeći način: - za praznu reč e stavljamo da je: S e = S τ ; - za proizvoljne u X i x X stavljamo da je: S xu = S δ x S u. Jasno, ako je u = x 1 x n, gde su x 1,, x n X, tada je: S u = S δ x1 S δ xn S τ. Sada, stavimo da je S = {S u u X }, i definišimo δ S: S X S sa: δ S(S u, x) = S xu, za sve u X i x X. Skup završnih stanja τ S je takođe zadat kao u algoritmu podskupovne konstrukcije, odnosno: τ S = {α R α σ } = {α N σ α = 1}. ko je R u = R v, za neke u X, tada za svako x X imamo da je: δ S(S u, x) = S xu = S δ x S u = S δ x S v = R vx = δ S(R v, x) što znači da je δ S dobro definisana funkcija. Dakle, S = ( S, X, δ S, σ e S, τ S) je dobro definisan deterministički automat. lgoritam 5.5 (Konstrukcija automata S ): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X i slabo levo invarijantno kvazi-uređenje S na, a izlaz je automat S = ( S, X, δ S, S e, τ S). Postupak se sastoji u konstrukciji stabla prelaza automata S direktno iz, koristeći pokazivače s( ), kojima čvorovima stabla pridružujemo odgovarajuće prirodne brojeve. Stablo prelaza automata S konstruiše se induktivno, na sledeći način: Koren stabla je S e i postavljamo T 0 = {S e } i s(s e ) = 1. Istovremeno, proveravamo da li je σ S e, i ako je to tačno S e je završno stanje; Posle i-tog koraka neka je dobijeno stablo T i, koje sadrži zatvorene i nezatvorene čvorove; U narednom koraku konstruišemo stablo prelaza T i+1, na sledeći način: za svaki nezatvoreni list S u u stablu T i, gde je u X, i svako x X dodajemo čvor S xu = δ x S u i granu iz S u u S xu označenu sa x. Istovremeno, proveravamo da li je S xu skup koji je već konstruisan, i ako jeste, tj. ako je S xu jednak nekom već konstruisanom S v, onda označavamo S xu zatvorenim i stavljamo s(s xu ) = s(s v ). U suprotnom, stavljamo da je s(s xu ) sledeći nepridružen prirodan broj i proveravamo da li je σ S xu, i ako je to tačno S xu je završno stanje. Postupak se završava kada svi listovi budu označeni kao zatvoreni; Kada je stablo prelaza automata S konstruisano, brišemo oznake za zatvorenost listova i preklapamo listove sa unutrašnjim čvorovima koji imaju istu vrednost pokazivača. Dijagram koji je dobijen na ovakav način, dopunjen oznakama za početno i završna stanja je graf automata S. 28
function LWLIQ: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: i, counter: integer, T: Tree, S: boolean matrix; begin S LWLIQO(); S e S τ ; T[0]. add_node(s e ); if σ S e then T. final_states. add(s e ); S e. is_open true; s(s e ) 1; i 0; counter 1; while T[i]. has_open_node() do for every open node S u in T[i] do for every x in X do S xu δ x S u ; s(s xu ) = 0; for every node S v in T do if S xu = S v then s(s xu ) s(s v ); S xu. is_open false; if s(s xu ) = 0 then s(s xu ) counter + 1; counter counter + 1; S xu. is_open true; T[i + 1]. add_node(s xu ); if σ S xu then T. final_states. add(s xu ); T. add_edge(s u, x, S xu ); i i + 1; end while; result T. toutomaton(); end function. 29
5.4. Determinizacija konstrukcijom dečjeg automata Neka je = (, X, δ, σ, τ ) nedeterministički automat nad konačnim alfabetom X = {x 1,, x m } i neka je R relacija na. Za svako u X definišemo (m + 1)-torku R u c sa: R c u = (R ux1,, R uxm, R u τ ) = (R u δ x1,, R u δ xm, R u τ ), gde su R u, R ux1,, R uxm skupovi definisani formulama: = R u δ xi R, za svako i = {1,, m} R uxi R u = σ R δ x1 R δ xn R, za u = x 1 x n, gde su x 1,, x n X. Dalje, stavimo da je c R = {R c u u X }, i definišimo δ c R: c c R X R sa: δ R c (R c u, x) = R c ux, za sve u X i x X. Skup završnih stanja τ R c je zadat formulom: τ R c = {R u c R c R u τ } = {R u c R c R u τ = 1}. Uočimo da prvih m koordinata u (m + 1)-torci R u c čine deca čvora R u u stablu prelaza automata R algoritma 5.4, a poslednja koordinata je Bulova promenljiva koja nam kaže da li je R u završno stanje u automatu R. Iz tog razloga, automat R c se naziva dečji automat automata R. lgoritam 5.6 (Konstrukcija dečjeg automata R c ): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X = {x 1,, x m } i relaciju R na, a izlaz je automat R c = ( R c, X, δ R c, R e c, τ R c ). Postupak se sastoji iz simultane konstrukcije stabla prelaza T automata R i grafa G automata R c direktno iz, koristeći pokazivače s( ) i pokazivače t( ), kojima čvorovima stabla i grafa pridružujemo određene prirodne brojeve. Stablo prelaza automata R i graf automata R c konstruišu se na sledeći način: Stablo prelaza T automata R konstruišemo primenom slabo desno invarijantog kvaziuređenja (lgoritam 5.4); Svakom nezatvorenom čvoru R u stabla T, pridružujemo čvor R u c grafa G, na sledeći način: Kada su formirana sva deca R ux1,, R uxm čvora R u u stablu T, onda formiramo čvor R u c = (R ux1,, R uxm, R u τ ) u grafu G. Istovremeno, proveravamo da li je R u c m + 1-torka koja je već konstruisana, i ako jeste, tj. ako je R u c jednaka nekoj već konstruisanoj m + 1-torci R v c, onda označavamo R u c zatvorenim i stavljamo t(r u c ) = t(r v c ). U suprotnom, stavljamo da je t(r u c ) sledeći prirodan broj koji nije bio pridružen t( ) i proveravamo da li je R u τ, i ako je to tačno R u c je završno stanje; Za svaki nezatvoreni čvor R u c grafa G i svako x X, ako je R v nezatvoreni čvor u stablu T, takav da je s(r ux ) = s(r v ), u grafu G dodajemo granu iz R u c u R v c označenu sa x; Kada je graf G automata R c konstruisan, preklapamo nezatvorene čvorove sa zatvorenim čvorovima koji imaju istu vrednost pokazivača t( ) i brišemo oznake za zatvorenost. Dijagram koji je dobijen na ovakav način, dopunjen oznakama za početno i završna stanja je graf automata R c. 30
function children_automaton: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: counter: integer, T: Tree, R: boolean matrix, G: Graph; begin T Tree from LWRIQ(); counter 1; for every open node R u in T do R u c = (R ux1,, R uxm, R u τ ); t(r u c ) = 0; for every node R v c in G do if R u c = R v c then t(r u c ) t(r v c ); R u c. is_open false; if t(r u c ) = 0 then t(r u c ) counter + 1; counter counter + 1; R u c. is_open true; if R u τ then T. final_states. add(r u c ); G. add_node(r u c ); for every open node R i c in G do for every open node R v in T do for every x in X do if s(r ix ) = s(r v ) and R v. is_open then G. add_edge(r i c, x, R v c ); result G. toutomaton(); end function. 31
5.5. Kanonizacioni metod Brzozovskog Neka je nedeterministički automat. utomat Brzozovskog (J. Brzozowski) automata, u oznaci B, je deterministički automat dobijen konstrukcijom reverznog Nerodovog automata dva puta, to jest: B = ( N ) N = (( ) )N N. lgoritam 5.7 (Kanonizacioni metod Brzozovskog): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X, a izlaz je minimalni deterministički automat B, koji se konstruiše na sledeeći način: Konstruišemo reverzni Nerodov automat N za automat ; Koristeći isti algoritam, ponovo konstruišemo reverzni Nerodov automat automata N. Dobijeni automat je automat Brzozovskog. function Brzozowski_algorithm: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: nr: utomaton; begin nr reverse_nerode_algorithm(); result reverse_nerode_algorithm(nr); end function. 5.5.1. Poboljšani metod Brzozovskog Neka je nedeterministički automat. Poboljšani algoritam Brzozovskog podrazumeva dobijanje determinističkog automata B kao reverzni Nerodov automat automata S (algoritam 5.5), odnosno: B = ( S ) N. lgoritam 5.8 (Poboljšani metod Brzozovskog): Ulaz ovog algoritma je nedeterministički konačni automat = (, X, δ, σ, τ ) nad konačnim alfabetom X, a izlaz je minimalni deterministički automat B, koji se konstruiše na sledeeći način: Konstruišemo S za automat, koristeći slabo levo invarijantno kvazi-uređenje; Koristeći algoritam za konstrukciju reverznog Nerodovog automata, konstruišemo reverzni Nerodov automat automata S. Dobijeni automat je automat Brzozovskog. function upgraded_brzozowski_algorithm: Input: = (, X, δ, σ, τ ): utomaton; Output: result: utomaton; Variables: s: utomaton; begin s determinization_with_lwliqo(); result reverse_nerode_algorithm(s); end function. 32