Verifica se un Linguaggio Regolare è vuoto
Transcript
Verifica se un Linguaggio Regolare è vuoto
Verifica se un Linguaggio Regolare è vuoto Se si suppone di usare la rappresentazione del linguaggio nella sua forma di automa a stati finiti il problema puo’ essere formulato nel modo seguente: • Se esiste un cammino dallo stato S ad uno stato accettante ! Z allora il linguaggio non è vuoto • Se non esiste una cammino dallo stato iniziale a qualche stato accettante ! Z il linguaggio è vuoto • Se esiste una cammino dallo stato iniziale S ad un qualche stato accettante ! Z e che attraversa almeno due volte uno stesso stato il linguaggio è infinito Equivalenza di linguaggi regolari E’ conveniente mettere due descrittori di linguaggi regolari sotto forma di automa a stati finiti deterministici in modo da favorirne il confronto. Il confronto verrà fatto trasformando i due automi nella loro forma minimale e, a meno di una ridenominazione degli stati, verificare se i due automi minimali coincidono. [Questo procedimento funziona in quanto si può dimostrare come la forma minimale di un automa è unico]. Verifica dell’equivalenza di stati Due stati p e q con p " q si dicono equivalenti (e quindi sostituibili da un unico stato che si comporti come p e q messi insieme) se: p e q sono entrambi finali o entrambi non finali, e Per ogni simbolo di input a, presi s = #(p, a) r = #(q, a) s e r sono lo stesso stato o sono equivalenti. Due stati non equivalenti si dicono distinguibili, nel qual caso esiste almeno un simbolo di input che li distingue. Esempio 1 0 A 0 E 1 1 B 1 Basta trovare una stringa che renda distinguibili due stati 0 0 F 0 C D 1 1 0 G 1 1 H A G 0 $ 0 A B G G 1 01 F C E E A dist G NO NO NOSI 0 A E $ 1 0 00 01 A F B G C E F H G C A equ E NO NO NO NO NO O essere sicuri che ogni possibile stringa renda equivalente due stati B H $ 0 1 B G C H G C NONONO B equ H Algoritmo marca-stati Si rappresentano in una matrice triangolare di coordinate q1, q2, …, qn x q0, q1, …, qn-1 tutti i possibili accoppiamenti tra stati 1. Se p è uno stato accettante e q è uno stato non accettante la coppia {p,q} è marcata distinguibile [questa eventualità è segnalata da un flag X] 2. Siano p e q due stati per cui un simbolo di input a ! ! porta a due stati r=#(p,a) e s= #(q,a) che sappiamo essere distinguibili, allora anche la coppia {p,q} è distinguibile. q1 q2 q3 q4 q5 q6 q7 Supposto essere q7 uno stato finale X X X X X X X q0 q1 q2 q3 q4 q5 q6 Praticamente due stati risultano equivalenti se non siamo riusciti a dimostrare la loro distinguibilità Esempio di esecuzione 1 0 A 0 1 E 1 1 B 0 0 F 0 C B C D E F G H D 1 1 0 G 1 1 H 0 0 B C D E F G H x x x x x x x x x x x x x x x x A B C x x x x x x x x x D E F G (E, A) #(E,0) = H #(A,0) = B #(E,1) = F #(A,1) = F x x x x x x BH x x x x x x x x x x A B C (G, A) #(G,0) = G #(A,0) = B #(G,1) = E #(A,1) = F Stati equivalenti (A, E) (B, H) (D, F) Si prodece da sinistra verso destra e dall’alto verso il basso x x x X x x x x x D E F G (G, E) #(G,0) = G #(E,0) = H #(G,1) = E #(E,1) = F Complessità dell’algoritmo marca stati • • • • • • L’algoritmo visita ripetutamente la matrice da sinistra verso destra e dall’alto verso il basso. Ogni visita richiede O(n2) passi, dove n è il numero degli stati. La visita della matrice deve essere ripetuta perchè la distinguibilità di una coppia di stati può dipendere dalla distinguibilità di una coppia di stati che la precede nell’ordine di visita, e che non è stata finora decisa. Basta ripetere la visita k volte, dove k è la lunghezza del cammino più lungo presente nel grafo, per essere sicuri di aver deciso la distinguibilità di ogni coppia di stati, visto che la distinguibilità di una coppia si stati si basa su quella dei loro successori. In un grafo, la lunghezza del cammino (aciclico) più lungo k è limitata superiormente da n, il numero degli stati. Quindi se semplicemente ripetiamo la visita n volte, l’algoritmo decide la distinguibilità di tutte le coppie, con complessità O(n3) In realtà la ripetizione della visita per n volte è necessaria solo nel caso peggiore. Si possono fare ottimizzazioni per limitare il numero di ripetizioni a quelle strattamente necessarie, ma la complessità del caso peggiore resta O(n3) Minimizzazione di automi Teorema Se per ogni stato q di un DFA si crea un blocco tra q e tutti gli stati equivalenti a q, allora l’insieme dei blocchi distinti rappresenta una partizione dell’insieme degli stati. Ne deriva che ogni stato appartiene ad un blocco e che ogni blocco contiene stati tra di loro equivalenti, mentre due stati scelti da blocchi distinti non lo sono. Ad esempio il grafo visto in precedenza produce la partizione: {A,E} {B,H} {D,F} {C} {G} In quanto {A,E} {B,H} {D,F} sono elementi della partizione calcolati con l’algoritmo marca-stati, mentre C e G non essendo allocati in blocchi esistenti danno origine a blocchi distinti. Minimizzazione di Automi Dato un DFA A= < !,K, #, Z,S> l’algoritmo opera nel seguente modo: 1. Togliere gli stati irraggiungibili a partire dallo stato iniziale 2. Con l’algoritmo marca-stati calcolare le coppie di stati tra di loro equivalenti 3. Costruire la partizione degli stati in blocchi ciascuno dei quali contiene stati equivalenti. 4. Costruire il DFA equivalente B=< !,K’,%,Z’,S’> considerando per l’automa B: a) come stati K’ i blocchi prima calcolati. b) come stato iniziale S’ il blocco contenente lo stato iniziale di A c) come stati Finali Z’ l’insieme dei blocchi che contengono gli stati finali di A [si fissano gli stati di B] [si fissano gli archi di B] d) Siano Q1, Q2,…Qn i blocchi prima calcolati, ciascun blocco corrisponderà ad uno stato nell’automa B, e ciascun blocco contiene stati equivalenti dell’automa A. Sia a un simbolo di input e Qi un blocco. Allora deve esistere un blocco Qj tale per cui per ogni stato q ! Qi , #(q,a) è un elemento di Qj si ha pertanto % (Qi,a) = Qj Esempio di Minimizzazione Q1 1 0 A 0 1 E 1 1 B 0 0 F 1 Q2 Q4 Q5 Qi = {A,E} {B,H} {D,F} {C} {G} 0 C D 1 1 Q3 0 G 0 1 H 1 Q5 1 0 Q3 1 0 Q1 #(A,0) = B #(E,0) = H %(Q1,0) = Q2 0 0 Q2 #(A,1) = F #(E,1) = F 0 0 1 Q4 %(Q1,1) = Q3 1 Riassunto Linguaggi regolari Teorema di equivalenza tra i vari descrittori di linguaggi regolari Determinismo e non determinismo Equivalenza tra Automi Determinisstici e non deterministici Proprietà di chiusura dei linguaggi regolari Minimizzazione di automi Grammatiche libere dal contesto G = < VN,VT,P,S > VN - Insieme finito di simboli detti Non terminali VT - Insieme finito di simboli detti Terminali ! !! V = VN ! VT, VN "#, VT "#, VN $ VT =# S-. Simbolo distinto o Assioma del Linguaggio !! S % VN P - Insieme di Produzioni o Regole di Riscrittura ! !! P & VN x V* Processo di generazione La Grammatica G con produzioni E 10 1. E ! E + T | E - T | T 2. T ! T * F | T / F | F 3. F ! ( E ) | i E Genera stringhe aritmetiche ! Esempio: la stringa a + b * c è derivata da E T T T F nel seguente modo: E "E + T !! "T +T ! ! " T + T * F! "F+T*F! " i +T * F! " i + T * i! " i +F * i! " i +i * i! pertanto: E "* a + b*c (regola 1) (regola 1) (regola 2) (regola 2) (regola 3) (regola 3) (regola 2) (regola 3) F F a + b * c - E’ conveniente avere un ordine di applicazione delle regole? - L’albero di generazione può essere costruito in modi diversi? - E’ possibile costruire per la medesima stringa alberi di !derivazione diversi? Alberi di derivazione E E 1. E # E + T | E - T | T 2. T # T * F | T / F | F 3. F # ( E ) | i T T T F F F a + Data una grammatica non contestuale G tutte le stringhe s da essa generabili possono essere rappresentate tramite un albero aventi le seguenti proprietà: b * c 1. La radice è etichettata con il simbolo iniziale S 2. Ogni nodo interno è etichettato con un simbolo non terminale ! VN 3. Ogni foglia è etichettata da un simbolo terminale o dalla stringa vuota " 4. Se il nodo K è etichettato con un simbolo non terminale A ed ha k figli etichettati con i simboli !1 ,......., !k allora esiste una produzione della forma A # !1 ,......., !k 5. Se S $* w e w è una stringa di caratteri terminali allora w è rappresentata dalle foglie dell’albero. Parentesi bilanciate La Grammatica G11 genera stringhe di parentesi bilanciate S ! " | SS | (S) due possibili derivazioni sono: S # SS # S (S) # (S) (S) # (S) ( ) # ( ) ( ) S # SS # ( S ) S # ( ) S # ( ) ( S ) # ( ) ( ) S S ( S ! S ) ( S ! ) La Derivazione come classe di equivalenza Data una grammatica G è possibile pervenire alla generazione di una stringa con processi di generazione diverse. Date due generazioni D e D’: D = x1 ! x2 ! ...... ! xn D’ = x’ ! x’ ! ...... ! x’ 1 2 n se si verifica che : 1. " i ! k xi = x’i 2. xk-1 = x’ k-1 = u A v B w con u,v,w # V* e A, B # VN 3. xk = u y v B w, con A $ y # P 4. x’ k = u Av z w, con B$ z # P 5. xk+1 = x’ k+1= u y v z w " si dirà che D precede D’ e si scriverà "" D prec D’ u y v B w !u y v z w . . . . xk-1 = x’ k-1 = u A v B w " " " uAvzw!uyvzw.... Esempio D1 = S ! SS ! (S) S ! ((S)) S ! (( )) S ! (( ))( S) ! (( )) ( ) D2 = S ! SS ! (S) S ! ((S)) S ! ((S )) (S) ! (( ))( S) ! (( )) ( ) ! Pertanto D1 prec D2 D2 = S ! SS ! (S) S ! ((S)) S ! ((S )) (S) ! (( ))( S) ! (( )) ( ) D3 = S ! SS ! (S) S ! ((S)) S! ((S )) (S)! (( S))( ) ! (( )) ( ) pertanto D2 prec D3 Esempio cont. D 4 D 5 D 6 D 7 D 8 = S ! SS ! (S) S ! (S) S ! (S )( ) ! (( S))( ) ! (( )) ( ) = S ! SS ! S (S) ! (S) (S) ! ((S)) (S) ! (( ))( S) ! (( )) ( ) = S ! SS ! S (S) ! (S) (S) ! ((S)) (S) ! (( S))( ) ! (( )) ( ) = S ! SS ! S (S) ! (S) (S) ! (S )( ) ! ((S))( ) ! (( )) ( ) = S ! SS ! S (S) ! S ( ) ! (S )( ) ! ((S))( ) ! (( )) ( ) prec D 1 prec D2 prec D 3 prec D 5 prec D6 leftmost derivation prec prec D 4 D prec prec D 8 7 rightmost derivation