Minimizzazione degli stati di un automa
Lezione precedente: Teoremi sugli automi a stati finiti | Corso: Materia:Informatica Teorica | Prossima lezione: Proprietà di chiusura dei linguaggi regolari |
Introduzione
modificaAl termine della lezione precedente, dopo aver dimostrato il teorema di Myhill e Nerode, ci siamo resi conto che la relazione esistente tra automi a stati finiti e linguaggi è più complicata del previsto; anche se è facile immaginare che ogni riconoscitore a stati finiti sia associato ad un linguaggio, ci siamo siamo resi conto che il contrario non è vero e che esiste la possibilità che uno stesso linguaggio venga riconosciuto da più di un automa a stati finiti.
Per non restare nel vago consideriamo i diagrammi a stati di tre accettori che riconoscono il medesimo linguaggio, visibili nelle immagini sottostanti.
Tutti e tre gli automi riconoscono il linguaggio .
Come si può notare i tre automi sono strutturalmente diversi a causa di alcuni elementi che non combaciano: il numero degli stati, il tipo degli stati (nel terzo automa ci sono due stati di accettazione) o la disposizione delle transizioni (il terzo automa dispone di un solo autoanello).
Se si potesse immaginare un insieme contenente tutti gli accettori a stati finiti verrebbe spontaneo partizionarlo in modo che ogni sottoinsieme contenga tutti e solo gli automi che riconoscono un dato linguaggio regolare.
La teoria delle relazioni binarie ci dice che la partizione può essere interpretata come l'insieme quoziente indotto da una relazione binaria di equivalenza definita sull'insieme che contempla tutti gli accettori; i tre automi presentati poc'anzi sarebbero quindi equivalenti.
Lo scopo di questa lezione è proprio introdurre una relazione di equivalenza tra automi che sia in linea con quanto appena presentato e di indagare a fondo gli effetti provocati dalla sua introduzione. Come vedremo, infatti, non solo la relazione ci permetterà di suddividere l'insieme degli accettori in classi di equivalenza, ma ci offrirà anche la possibilità di identificare, per ogni classe di equivalenza, un unico accettore da utilizzare come rappresentante della classe stessa: l'accettore canonico. Come vedremo, l'accettore canonico dispone sempre del numero minimo di stati e può tranquillamente essere definito come l'automa che riconosce il linguaggio regolare impiegando il minor numero di stati.
Il ruolo dell'accettore canonico inteso come rappresentante di una classe di equivalenza assume un'importanza particolare nell'ambito dell'informatica teorica. In generale, la relazione tra linguaggi regolari ed automi a stati finiti è di tipo uno-a-molti: per ogni linguaggio regolare esistono molti accettori a stati finiti in grado di riconoscerlo. Avere la possibilità di identificare uno solo di tali accettori per ogni linguaggio regolare permette di stabilire una relazione uno-a-uno, ossia una corrispondenza biunivoca, tra l'insieme dei linguaggi regolari e l'insieme degli accettori canonici.
Grazie a questa considerazione abbiamo la garanzia che ogni risultato teorico riguardante i linguaggi regolari sarà valido anche per gli accettori a stati finiti, e viceversa. È quindi evidente l'importanza concettuale insita nella ricerca degli automi accettori a stati minimi.
La parte iniziale della presente lezione servirà, come al solito, per preparare il terreno all'identificazione dell'automa a stati minimi e sarà basata sull'introduzione di una relazione di equivalenza tra automi e del concetto di automi isomorfi.
Il cuore della lezione concerne l'enunciazione e la dimostrazione dei teoremi di esistenza ed unicità dell'automa a stati minimi. Come abbiamo già avuto modo di sottolineare, questo risultato ha un grande valore concettuale in quanto garantisce che, per ogni linguaggio regolare, l'automa a stati minimi esiste ed è unico; tuttavia il teorema non spiega come sia possibile identificare l'automa a stati minimi, né come si possa eventualmente trasformare un automa non canonico nel suo equivalente a stati minimi.
La seconda parte della lezione, quindi, verrà dedicata alla presentazione di due algoritmi di minimizzazione degli stati che hanno trovato (e trovano tutt'ora) ampia applicazione.
Automi equivalenti
modificaSi consideri un linguaggio regolare e due accettori a stati finiti e . I due automi sono equivalenti se e solo se accettano il medesimo linguaggio .
Formalmente i due automi saranno equivalenti quando le due condizioni sottostanti saranno verificate:
- ;
- .
Introdurre un'equivalenza sull'insieme degli accettori a stati finiti significa anche indurre una partizione costituita dall'insieme quoziente.
Ogni sottoinsieme appartenente alla partizione costituisce una classe di equivalenza e raccoglie tutti gli accettori che sono in grado di riconoscere il medesimo linguaggio.
Lavorare con le classi di equivalenza può essere vantaggioso in quanto, se dovesse essere necessario dimostrare una proprietà per l'intera classe, in determinate condizioni sarebbe possibile dimostrare che la proprietà vale per uno solo degli elementi della classe, generalizzando poi il risultato attraverso l'equivalenza.
Affinché tale approccio possa funzionare è indispensabile scegliere con cura il rappresentante della classe, per evitare di incorrere in situazioni delicate dove la proprietà da dimostrare vale solamente per il rappresentante e non per il resto della classe.
Quando esiste un criterio oggettivo che permette di identificare in modo univoco il rappresentante di una classe di equivalenza, tale rappresentante prende il nome di elemento canonico.
Ci chiediamo, a questo punto, se nel contesto degli accettori a stati finiti e con la relazione di equivalenza introdotta in precedenza sia sempre possibile identificare l'elemento canonico delle classi di equivalenza, ossia ci chiediamo se esiste l'accettore canonico.
Dimostreremo due risultati di grande importanza: l'esistenza dell'accettore canonico e la sua unicità.
Successivamente svilupperemo una tecnica che ci permetterà di costruire l'accettore a stati minimi di un generico linguaggio regolare . Come vedremo, per raggiungere questi obiettivi tornerà utile la conoscenza del teorema di Myhill - Nerode.
Automi isomorfi
modificaConsideriamo due automi accettori a stati finiti che siano completi ed equivalenti. Indichiamo i due automi con e . Diciamo che i due automi sono isomorfi quando, data una funzione biunivoca , valgono le seguenti considerazioni:
- ;
- ;
- .
Cerchiamo ora di dare significato alle tre proprietà, analizzando anzitutto la prima e l'ultima perché sono le più facili.
La prima proprietà ci garantisce che ad ogni stato del primo automa è associato uno stato del secondo automa, tramite la funzione biunivoca.
L'ultima proprietà ci assicura che la funzione biunivoca assocerà gli stati finali del primo automa agli stati finali del secondo automa, una condizione indispensabile per garantire che i due automi riconoscano lo stesso linguaggio regolare, come richiesto dall'ipotesi di equivalenza.
Un altro aspetto fondamentale per garantire il riconoscimento dello stesso linguaggio regolare riguarda la funzione di transizione ed è esattamente questo lo scopo della seconda proprietà. Per comprenderla meglio cerchiamo di chiarire il contesto in cui nasce.
Consideriamo quindi quattro stati ed un generico simbolo . Grazie all'ipotesi di completezza degli automi, le rispettive funzioni di transizione saranno definite per ogni possibile simbolo d'ingresso e per ogni stato. Supponiamo ora che e che ; immaginiamo anche che e che . Vediamo cosa succede applicando la seconda proprietà:
- ;
- ;
- .
Come si vede, al termine del procedimento si è ottenuta l'identità. In realtà, l'unico modo affinché si verifichi tale condizione è che le funzioni di transizione dei due automi siano strutturate proprio come abbiamo immaginato. Quindi introdurre la seconda condizione obbliga i due automi a disporre di funzioni di transizione opportunamente strutturate.
Il concetto di isomorfismo tra automi verrà utilizzato, nel contesto della minimizzazione degli stati, per dimostrare l'unicità dell'automa minimo.
Esistenza ed unicità dell'automa a stati minimi
modificaOccupiamoci anzitutto di provare che l'automa a stati minimi esiste ed è unico per ogni linguaggio regolare . Per questo motivo enunciamo e dimostriamo i teoremi di esistenza ed unicità dell'automa a stati minimi.
Teorema di esistenza dell'automa a stati minimi
modificaConsideriamo un linguaggio regolare ed un insieme contenente gli accettori a stati finiti che sono completi e riconoscono come linguaggio macchina. È sempre possibile identificare un automa che è in grado di riconoscere il linguaggio impiegando il numero minimo di stati.
Dimostrazione
modificaDurante la dimostrazione del teorema di Myhill - Nerode abbiamo utilizzato due relazioni di equivalenza: definita sull'insieme degli accettori che hanno come linguaggio macchina e sull'insieme delle stringhe appartenenti al linguaggio.
Abbiamo anche visto che la relazione è un raffinamento di , aspetto che ci ha permesso di concludere che l'indice di sarà sempre minore o uguale all'indice di .
Questo significa che la relazione induce un numero di classi di equivalenza che è sempre minore, o tutt'al più uguale, al numero di classi di equivalenza indotte da .
Sappiamo che il numero di classi di equivalenza indotte da è pari al numero degli stati dell'automa; inoltre, sempre durante la dimostrazione del teorema di Myhill - Nerode abbiamo costruito un accettore a stati finiti impiegando come stati proprio le classi di equivalenza indotte da . Come conseguenza, confrontare gli indici delle due relazioni significa in realtà confrontare il numero di stati di due automi.
Grazie a questa osservazione possiamo concludere che l'automa costruito sfruttando le classi di equivalenza indotte da avrà sempre meno stati, o al limite lo stesso numero di stati, rispetto agli altri accettori del linguaggio .
Il teorema è dunque dimostrato.
Teorema di unicità dell'automa a stati minimi
modificaPer ogni linguaggio regolare esiste uno ed un solo accettore a stati finiti dotato del numero minimo di stati, a meno di un isomorfismo tra gli stati.
Dimostrazione
modificaIpotizzando l'esistenza di due automi equivalenti a stati minimi e , dimostriamo che devono essere necessariamente isomorfi.
Entrambi gli automi sono a stati minimi, quindi ad ognuno dei loro stati può essere associata una delle classi di equivalenza definita dalla relazione .
Considerando che i due automi sono equivalenti, il linguaggio in questione è lo stesso, dunque saranno le stesse anche le classi di equivalenza; in particolare, il numero di classi di equivalenza è identico nei due casi.
Grazie a questa osservazione è possibile immaginare una funzione biunivoca ; se davvero i due automi sono isomorfi, allora devono verificare le tre condizioni che abbiamo introdotto poc'anzi.
- ;
- ;
- .
La prima è verificata semplicemente applicando la funzione biunivoca ad uno qualunque degli stati del primo automa. La terza condizione è un po' più delicata: dato che i due automi riconoscono il medesimo linguaggio, le classi di equivalenza che identificano le stringhe accettate devono essere per forza le stesse nei due casi. Veniamo ora alla seconda condizione:
- ;
- ;
- .
Possiamo concludere che i due automi sono isomorfi. Visto che questo risultato vale comunque si scelgano due automi a stati minimi equivalenti, il teorema di unicità è dimostrato.
Costruire l'automa a stati minimi
modificaLa dimostrazione dei precedenti teoremi ci permette di essere certi circa l'esistenza dell'accettore canonico; inoltre sappiamo che tale automa dispone del numero minimo di stati. Il teorema, tuttavia, non offre alcuno strumento per la costruzione dell'automa a stati minimi, dunque dovremo identificare almeno un algoritmo in grado di raggiungere questo obiettivo.
Esamineremo due algoritmi in grado di costruire l'accettore canonico; sebbene le soluzioni che analizzeremo affrontino il problema da punti di vista differenti, essi partono dalle medesime premesse.
Proprio per questo motivo sarà necessario anteporre alla presentazione degli algoritmi un'analisi dei concetti chiave della minimizzazione.
Gli stati superflui
modificaAffermare che un automa è dotato del numero minimo di stati equivale ad affermare che tutti gli altri automi dispongono di stati aggiuntivi che, in un certo senso, sono superflui.
Un algoritmo di minimizzazione avrà quindi tre obiettivi:
- identificare gli stati superflui dell'automa da minimizzare;
- rimuovere gli stati superflui;
- ristrutturare la funzione di transizione.
In generale, quando si parla di stati superflui si intendono due tipologie di stato:
- gli stati irraggiungibili: sono tali tutti quegli stati che non rappresentano mai lo stato prossimo di una transizione. Gli stati irraggiungibili si possono rimuovere dall'automa senza alterarne la funzionalità;
- gli stati equivalenti o indistinguibili: due stati p e q sono equivalenti quando i linguaggi e coincidono, ossia . Gli stati equivalenti non vengono rimossi, bensì confluiscono in un unico stato;
È interessante notare che anche gli stati irraggiungibili possono essere interpretati in termini di linguaggi: in effetti, dato che non vengono mai raggiunti durante l'evoluzione della computazione, tali stati sono caratterizzati dal riconoscimento del linguaggio vuoto; formalmente, indicando con uno stato irraggiungibile, potremo scrivere .
Esaminiamo ora i due tipi di stati superflui, analizzandoli con maggior profondità.
Gli stati irraggiungibili
modificaNella succinta definizione che è appena stata introdotta si è visto che uno stato è irraggiungibile quando non esiste alcuna transizione che conduca ad esso.
Come conseguenza, nessuna delle transizioni uscenti da uno stato irraggiungibile potrà mai essere percorsa e lo stato stesso potrà essere eliminato dall'automa senza influenzarne il funzionamento.
Per comprendere quest'ultima affermazione, riprendiamo due degli automi presentati nell'introduzione alla lezione.
Nel secondo automa è presente lo stato e nessuna transizione porta ad esso; come conseguenza, le due transizioni che partono da verso e non saranno mai percorribili.
Proprio per questo motivo lo stato e le transizioni ad esso relative possono essere rimosse dall'automa senza influenzare le computazioni. Tra l'altro, come si può notare ispezionando i diagrammi degli stati, la rimozione dello stato porta il secondo automa a coincidere con il primo.
Se da un punto di vista grafico è facile rimuovere lo stato e le relative transizioni, vale la pena di riflettere su cosa accada quando si opera con la rappresentazione algebrica. Nel caso dell'automa che stiamo analizzando, la rappresentazione algebrica della funzione di transizione è visibile nella tabella sottostante.
a | b | |
---|---|---|
- | ||
In questo contesto rimuovere lo stato superfluo consiste nella cancellazione della riga della tabella corrispondente allo stato irraggiungibile.
Un algoritmo per l'identificazione degli stati irraggiungibili
modificaUn semplice algoritmo per identificare gli stati irraggiungibili di un automa si potrebbe strutturare come segue:
- preparare una lista degli stati raggiungibili;
- inizializzare la lista, specificando che nessuno stato è raggiungibile (condizione iniziale);
- scorrere la tabella della funzione di transizione e, per ogni stato che viene incontrato, segnarlo come stato raggiungibile sulla lista.
Al termine, gli elementi della lista che non saranno stati indicati come raggiungibili saranno proprio gli stati irraggiungibili.
Gli stati equivalenti
modificaCome abbiamo visto durante la dimostrazione del teorema di Myhill - Nerode, ogni stato di un accettore a stati finiti è in grado di riconoscere un insieme di stringhe; tali stringhe vengono considerate equivalenti e l'insieme che le raccoglie è una classe di equivalenza.
In realtà, siccome la classe di equivalenza è un sottoinsieme di , è anche un linguaggio; più precisamente, indicando con un generico stato di un accettore a stati finiti potremo scrivere: .
Questa considerazione può essere sfruttata per definire un'equivalenza tra stati: due stati e sono equivalenti quando i linguaggi da essi riconosciuti coincidono, ossia .
Per non restare nel vago, facciamo un esempio riprendendo gli accettori a stati finiti introdotti a inizio lezione e concentrandoci sul primo e sul terzo.
Osservando il primo automa si nota come il linguaggio associato allo stato sia composto dalla stringa vuota e da tutte le stringhe formate da sole : . Nello stesso automa il linguaggio associato allo stato è composto da tutte le stringhe formate da sole , esclusa la stringa vuota: .
Osservando il secondo automa si riscontrano invece i seguenti linguaggi:
- ;
- ;
- .
Come si può notare, i linguaggi riconosciuti dagli stati e sono identici; per questo motivo i due stati sono equivalenti.
Introdurre una relazione di equivalenza sull'insieme degli stati implica indurre una partizione in classi di equivalenza dell'insieme stesso. Nell'esempio soprastante, la relazione di equivalenza introdotta sull'insieme degli stati induce una partizione in due classi; formalmente, possiamo scrivere .
Gli elementi della partizione, e dunque i due insiemi elencati, rappresentano gli stati di un nuovo accettore: si nota come gli stati e , essendo equivalenti, si sono fusi, confluendo in un unico stato.
È interessante notare come la fusione di due stati equivalenti produca effetti anche sulle transizioni: in particolare, vengono abolite tutte le transizioni tra stati equivalenti, mentre permangono quelle dirette da e verso altri stati dell'automa.
Il diagramma degli stati dell'automa, dopo la fusione degli stati equivalenti, è visibile nell'immagine sottostante.
Dal diagramma si può notare come strutturalmente questo nuovo accettore coincida con quello proposto all'inizio, a meno di una ridenominazione degli stati.
Abbiamo visto che la fusione di più stati riduce il numero di stati dell'automa; affinché questo procedimento possa attuarsi è però necessario che gli stati in questione siano equivalenti.
L'esempio proposto ha permesso di identificare l'equivalenza fra stati analizzando le proprietà delle classi di equivalenza indotte sul linguaggio macchina ma non sempre questo procedimento è semplice da svolgere. Questa osservazione ci permette di concludere che è necessario identificare almeno un metodo che ci dia la possibilità di stabilire l'equivalenza fra stati in modo semplice e magari senza ricorrere al linguaggio macchina.
L'algoritmo induttivo
modificaL'algoritmo che presenteremo è senza dubbio il più famoso; noto con il nome di table-filling algorithm, si basa sui concetti di distinguibilità e indistinguibilità degli stati e sul noto principio d'induzione.
Prima di presentare i dettagli dell'algoritmo analizziamo alcune informazioni utili per comprenderlo a fondo e contestualizzarne l'impiego.
Distinguibilità ed indistinguibilità degli stati
modificaConsideriamo un automa accettore a stati finiti ; cerchiamo di capire, almeno intuitivamente, come si fa a capire quando due stati e di tale automa sono distinguibili.
Indichiamo con una stringa di simboli che permette all'automa di portarsi nello stato : ed un'analoga stringa tale che .
I due stati e sono distinguibili se e solo se esiste una stringa tale che esattamente una delle due stringhe e porta l'accettore in uno stato finale. Formalmente, due stati e sono distinguibili quando si verifica la seguente condizione:
La relazione di distinguibilità così definita non può essere una relazione di equivalenza in quanto per essa non vale la proprietà riflessiva; infatti è impossibile che uno stato sia distinguibile da se stesso.
È più interessante, quindi, concentrarsi sulla relazione di indistinguibilità degli stati, che si definisce semplicemente negando la relazione precedente. Intuitivamente, due stati sono indistinguibili quando non è possibile trovare alcuna stringa che, concatenata alle stringhe riconosciute dagli stati, conduca l'automa a due situazioni finali contrastanti. Formalmente:
La relazione di indistinguibilità degli stati è un'equivalenza; infatti:
- proprietà riflessiva: uno stato è sempre indistinguibile da se stesso;
- proprietà simmetrica: se uno stato è indistinguibile da , allora anche sarà indistinguibile da ;
- proprietà transitiva: se uno stato è indistinquibile da e lo stato è indistinguibile da , allora anche lo stato è indistinguibile da .
Trattandosi di un'equivalenza, la relazione di indistinguibilità partiziona l'insieme degli stati suddividendolo in classi di equivalenza; così facendo diventa possibile identificare gli stati indistinguibili. Evidentemente gli stati che non saranno indistinguibili saranno tutti e soli gli stati distinguibili.
La tecnica impiegata per identificare gli stati indistinguibili consiste nel controllare l'indistinguibilità di ogni possibile coppia di stati. Teoricamente, dunque, il punto di partenza dovrebbe essere una tabella a doppia entrata in cui sia sulle righe sia sulle colonne si trovano disposti gli stati dell'automa. Ad esempio, nel caso di un automa dotato dell'insieme di stati , la tabella di partenza potrebbe essere la seguente.
- | |||||
Dato che stiamo valutando una relazione di equivalenza, possiamo sfruttarne le proprietà per semplificare la nostra ricerca. In particolare, visto che l'equivalenza è sempre riflessiva, sappiamo già che gli elementi della diagonale principale saranno coppie di stati indistinguibili; possiamo perciò rimuoverli dalla tabella, ottenendo il risultato seguente.
- | |||||
- | |||||
- | |||||
- | |||||
- | |||||
- |
Inoltre, sfruttando la proprietà simmetrica possiamo concludere che se i due stati sono indistinguibili, allora anche lo saranno. Per questo motivo è sufficiente considerare solo una parte dell'intera tabella; tradizionalmente si conserva intatta la parte diagonale inferiore, visibile qui sotto.
- | |||||
- | - | - | - | - | |
- | - | - | - | ||
- | - | - | |||
- | - | ||||
- |
Dato un automa dotato di stati, viene lasciato per esercizio il calcolo di quante coppie vanno valutate.
L'algoritmo che stiamo per esaminare si occuperà di identificare, attraverso una successione di marcature, quali coppie di stati sono equivalenti.
L'algoritmo
modificaL'algoritmo che stiamo per presentare è noto anche con i nomi di algoritmo delle marcature o table-filling algorithm e propone una strategia induttiva per l'identificazione degli stati distinguibili.
Come vedremo, una volta che il processo di marcatura sarà ultimato, ogni coppia di stati non marcata rappresenterà due stati indistinguibili e potrà essere accorpata in un unico nuovo stato.
Il processo di marcatura applica la tecnica dell'induzione matematica; è dunque necessario definire il passo base ed il passo di induzione in modo opportuno. Indicando con la relazione di indistinguibilità avremo:
- passo base: ;
- passo di induzione: .
Il passo base viene eseguito per primo, mentre il passo di induzione viene ripetuto fintantoché sarà possibile aggiungere nuove marcature alla tabella.
Cerchiamo ora di dare un senso ai due criteri appena introdotti; in generale, la tecnica impiegata per dimostrare la distinguibilità di due stati consiste nella ricerca di una stringa che, concatenata con quelle già elaborate dall'automa, crea le condizioni affinché l'accettore completi la sua evoluzione in due stati palesemente distinti: uno finale e l'altro no.
Identificare la stringa per tentativi è un compito troppo dispersivo, quindi l'algoritmo propone un approccio più strutturato, costruendo la stringa un passo per volta; chiaramente ad ogni passo verrà aggiunto un solo simbolo ed è proprio questo il succo del passo d'induzione.
Inizialmente la stringa da concatenare non dispone ancora di nessun simbolo e dunque è la stringa vuota. In questa situazione si possono dunque distinguere solamente gli stati finali da quelli che non lo sono; questo spiega il passo base.
Esempio
modificaCome al solito, un esempio vale più di mille parole. Supponiamo dunque di voler minimizzare un automa accettore a stati finiti ; il suo diagramma degli stati, come pure la sua descrizione algebrica, sono visibili qui di seguito.
- ;
- ;
- ;
- ;
- infine, la funzione di transizione è definita dalla tabella sottostante.
a | b | |
Una veloce scansione del diagramma, o della funzione di transizione, permettono di comprendere che questo automa è privo di stati irraggiungibili e quindi, se fosse minimizzabile, l'unica possibilità che rimarrebbe per ridurre il numero dei suoi stati consisterebbe nell'identificazione, e successiva fusione, degli stati indistinguibili.
Prepariamo dunque una tabella simile a quella vista in precedenza, da impiegare per il confronto delle coppie di stati.
- | ||||||
- | - | - | - | - | - | |
- | - | - | - | - | ||
- | - | - | - | |||
- | - | - | ||||
- | - | |||||
- |
Svolgiamo ora il passo base, che consiste nel marcare le coppie di stati che sono distinguibili anche senza concatenazione di una stringa; si tratterà di tutte le coppie in cui uno solo dei due elementi sarà uno stato finale. Le marcature riportate sulla tabella saranno indicate dal numero 0, per indicare che si tratta del passo base. La tabella risultante dopo questa prima fase è visibile qui di seguito.
- | ||||||
- | - | - | - | - | - | |
0 | - | - | - | - | - | |
0 | - | - | - | - | ||
0 | 0 | - | - | - | ||
0 | 0 | - | - | |||
0 | 0 | 0 | - |
A questo punto abbiamo completato il passo base e possiamo svolgere la prima iterazione del passo d'induzione. Una rapida occhiata alla tabella ci permette di comprendere che in questa iterazione sarà necessario svolgere sei confronti: uno per ogni casella libera.
Ogni confronto viene svolto per ogni simbolo dell'alfabeto d'ingresso.
Primo confronto - stati e .
a | b |
Come si può vedere dalla tabella, in corrispondenza di entrambi i simboli i due stati evolvono addirittura negli stessi stati prossimi; sono evidentemente indistinguibili e quindi non vanno marcati.
Secondo confronto - stati e .
a | b |
In corrispondenza all'ingresso lo stato evolve nello stato e viceversa; dato che questa coppia non è stata marcata come distinguibile, si può andare oltre. La seconda coppia di stati, generata a partire dall'ingresso , è e non è stata precedentemente marcata, dunque anche in questo caso nessuna marcatura va aggiunta alla tabella.
Terzo confronto - stati e .
a | b |
Non ci sono nuove marcature da registrare.
Quarto confronto - stati e .
a | b |
Non si registra nessuna marcatura aggiuntiva.
Quinto confronto - stati e .
a | b |
La coppia è stata marcata durante il passo base, quindi anche va marcata.
Sesto confronto - stati e .
a | b |
La coppia è stata marcata durante il passo base, quindi anche va marcata.
Dopo aver riportato le marcature sulla tabella, si ottiene il risultato sottostante.
- | ||||||
- | - | - | - | - | - | |
0 | - | - | - | - | - | |
0 | - | - | - | - | ||
0 | 0 | - | - | - | ||
1 | 1 | - | - | |||
1 | 0 | 0 | 1 | 0 | - |
Al termine di questa seconda iterazione si osserva che quasi tutte le coppie di stati sono state marcate. All'appello ne mancano quattro: la coppia , la coppia , la coppia e la coppia .
Esaminando nuovamente queste quattro coppie si può notare che è impossibile aggiungere ulteriori marcature alla tabella.
La tabella che si ottiene al termine della seconda iterazione del passo induttivo è identica alla precedente e questo ci autorizza a fermarci. Il processo termina con quattro coppie non marcate, di cui andremo ad approfondire il significato.
Le coppie non marcate indicano stati indistinguibili, quindi è indistinguibile da , è indistinguibile da , è indistinguibile da e è indistinguibile da .
Dato che la relazione di indistinguibilità è un'equivalenza siamo certi che vale la proprietà transitiva; come conseguenza, se è vero che è indistinguibile da e che è indistinguibile da , allora è anche vero che è indistinguibile da .
Grazie a questa osservazione è possibile accorpare i tre stati in un unico nuovo stato, indicato con .
È inoltre possibile accorpare i due stati e in un unico nuovo stato, indicato con .
A questo punto è possibile immaginare la struttura dell'automa a stati minimi . In particolare:
- ;
- ;
- .
Dato che l'alfabeto di ingresso rimane invariato, l'unico elemento mancante per la definizione dell'automa a stati minimi è la funzione di transizione che può essere ricavata dalla precedente, tenendo presenti i seguenti principi:
- tutte le transizioni che conducono da uno stato ad uno stato equivalente diventano autoanelli;
- quando diverse transizioni conducono a più stati equivalenti, vengono fatte tutte confluire verso un unico stato.
Seguendo questi principi si ottiene la seguente funzione di transizione
a | b | |
Concludiamo l'esempio proponendo l'immagine del diagramma degli stati dell'automa minimizzato.
L'algoritmo delle partizioni
modificaQuesto algoritmo è stato introdotto da John Hopcroft nel 1971 e ha il pregio di migliorare le prestazioni dell'algoritmo precedente. Rispetto a quest'ultimo, tuttavia, la filosofia è differente: anziché confrontare le coppie di stati, Hopcroft propone una strategia basata sul concetto di partizione, applicato all'insieme degli stati dell'automa da minimizzare.
Analogamente all'algoritmo precedente anche in questo caso si segue un approccio iterativo; è dunque rilevante identificare la condizione iniziale, in cui la partizione prevede due soli sottoinsiemi: quello degli stati di accettazione e quello degli altri stati.
A questo punto si verifica se davvero questa partizione può rappresentare l'automa a stati minimi e, in caso contrario, si costruisce una nuova partizione, dotata di un numero più alto di sottoinsiemi; in questo caso, più precisamente, la nuova partizione viene creata a partire da almeno uno dei sottoinsiemi della partizione precedente. In generale, quindi, possiamo pensare all'evoluzione dell'algoritmo di Hopcroft come ad un successione di partizioni, l'ultima delle quali identifica l'automa a stati minimi.
Per fare in modo che la successione converga è importante stabilire due criteri:
- criterio di stabilità: determina quando è il caso di creare una nuova partizione;
- criterio di convergenza: stabilisce quando la partizione trovata corrisponde a quella dell'automa a stati minimi.
Il concetto di stabilità
modificaNel contesto dell'algoritmo di Hopcroft il concetto di stabilità può essere interpretato in due modi:
- stabilità di un sottoinsieme: un sottoinsieme di una partizione è stabile quando per ogni stato in esso contenuto e per ogni ingresso possibile, lo stato prossimo appartiene sempre ad un medesimo sottoinsieme della partizione;
- stabilità di una partizione: una partizione è stabile quando tutti i suoi sottoinsiemi sono stabili.
La definizione di stabilità di un sottoinsieme è decisamente la più complicata da intuire, dunque la approfondiremo presentando un esempio ed un controesempio che ne chiariscano il significato.
Esempio di sottoinsieme stabile
modificaConsideriamo l'accettore a stati finiti che abbiamo minimizzato in precedenza, usando l'algoritmo delle marcature.
In particolare ci concentriamo sullo stato iniziale che prevede una partizione caratterizzata da due sottoinsiemi: uno contenente tutti gli stati di accettazione, l'altro contenente gli altri stati; formalmente la partizione si potrà scrivere come .
Dimostriamo ora che il sottoinsieme è stabile; per ogni stato appartenente al sottoinsieme, determiniamo lo stato prossimo in corrispondenza di tutti i possibili simboli d'ingresso. Sintetizziamo questa fase creando una tabella, visibile qui sotto.
Come si può notare leggendo la tabella, in corrispondenza al simbolo i tre stati finali producono uno stato prossimo (in questo caso ) che si trova in un unico sottoinsieme, in questo caso il sottoinsieme .
Analogamente, in corrispondenza al simbolo lo stato prossimo (in questo caso ) si trova nel sottoinsieme .
Visto che in corrispondenza di tutti i simboli d'ingresso lo stato prossimo prodotto appartiene ad un unico sottoinsieme, possiamo concludere che il sottoinsieme stesso è stabile.
Va sottolineato che il criterio impiegato per la stabilità non richiede che tutti gli stati generino lo stesso stato prossimo; per garantire la stabilità basta che gli stati prossimi generati appartengano tutti ad un medesimo sottoinsieme.
Esempio di sottoinsieme non stabile
modificaContinuiamo ad analizzare l'esempio precedente prendendo in considerazione il sottoinseme e dimostrando che non è stabile. Come prima, costruiamo una tabella che considera tutti gli stati del sottoinsieme e tutti i possibili ingressi.
Come si può notare leggendo la tabella, in corrispondenza al simbolo gli stati prossimi appartengono tutti ad uno stesso sottinsieme (in questo caso proprio ), mentre nel caso del simbolo non c'è concordanza in quanto non tutti gli stati prossimi appartengono al medesimo insieme: infatti , ma .
Proprio per questo motivo il sottoinsieme non è stabile; inoltre, dato che la partizione selezionata contiene un sottoinsieme non stabile, non può a sua volta essere stabile.
L'algoritmo
modificaA questo punto è possibile esaminare in qualche dettaglio l'algoritmo proposto da Hopcroft:
- Crea una partizione iniziale di due sottoinsiemi: uno con gli stati finali, uno con tutti gli altri stati;
- Finché la partizione non è stabile:
- per ogni sottoinsieme appartenente alla partizione:
- se il sottoinsieme non è stabile, allora raffina la partizione attuale
- per ogni sottoinsieme appartenente alla partizione:
- Ristruttura la funzione di transizione
- Crea l'automa a stati minimi
Naturalmente questa versione dell'algoritmo è fortemente schematica e va approfondita, specialmente per quanto riguarda l'identificazione dell'instabilità della partizione. Inoltre l'esecuzione efficiente dell'algoritmo di Hopcroft presuppone anche una certa attenzione alle strutture dati impiegate.
Nell'algoritmo si possono riconoscere due fasi principali: la ricerca degli stati minimi (passi 1 e 2) e la ristrutturazione della funzione di transizione (passo 3). Dopo aver identificato gli stati minimi e considerando l'alfabeto d'ingresso, è possibile procedere ad una revisione della funzione di transizione che è concettualmente molto semplice, in quanto lo stato prossimo di ogni transizione dell'automa a stati minimi sarà costituito dalla partizione che contiene lo stato prossimo della transizione che si manifesta nell'automa non minimizzato.
Come al solito vale la pena di chiarirsi le idee attraverso un esempio; considereremo il problema dell'ottimizzazione dello stesso automa a stati minimi su cui abbiamo applicato, in precedenza, l'algoritmo delle marcature.
Esempio
modificaConsideriamo nuovamente l'accettore a stati finiti già minimizzato in precedenza; il suo diagramma degli stati è visibile qui sotto.
- ;
- ;
- ;
- ;
- infine, la funzione di transizione è definita dalla tabella sottostante.
a | b | |
Eseguiamo ora, passo per passo, l'algoritmo di Hopcroft.
Il punto di partenza concerne l'identificazione della partizione iniziale che chiameremo . Seguendo le caratteristiche dell'algoritmo potremo scrivere , dove e .
Una volta definita la partizione iniziale bisogna capire se è stabile: qualora lo fosse, l'accettore disporrebbe già del numero minimo di stati; in caso contrario sarebbe necessario raffinarla e ripetere il procedimento. Il raffinamento della partizione avverrebbe operando esclusivamente sui sottoinsiemi instabili e lasciando invece intatti gli altri.
Affinché una partizione sia stabile è indispensabile che sia stabile ognuno dei sottoinsiemi che le appartengono; dovremo quindi discutere la stabilità dei due sottoinsiemi e .
Il sottoinsieme è stabile: ne abbiamo già parlato quando abbiamo introdotto il concetto di stabilità. Sempre nello stesso contesto abbiamo dimostrato che il sottoinsieme non è stabile; come conseguenza la partizione non è stabile e va raffinata. Tuttavia, dato che il sottoinsieme è già stabile, non verrà coinvolto nel raffinamento.
Per quanto riguarda il sottoinsieme , si nota che è lo stato a comportarsi diversamente dagli altri, pertanto viene partizionato come segue: , dove e . Con questo cambiamento la partizione diventa
Il sottoinsieme è stabile perché è un singleton, mentre è stabile e lo si può dedurre esaminando la tabella mostrata nell'esempio precedente. Dato che tutti i sottoinsiemi che costituiscono la partizione sono stabili, anche la partizione stessa lo è e l'algoritmo di ottimizzazione termina.
Scrivendo per esteso la partizione stabile si ottiene , identica a quella ottenuta applicando il precedente algoritmo di ottimizzazione.
Una volta identificato l'insieme degli stati minimi è possibile definire molti degli elementi che caratterizzano l'automa accettore ottimizzato: c'è lo stato iniziale (in questo caso ) e l'insieme degli stati finali (in questo caso ).
Lezione precedente: Teoremi sugli automi a stati finiti | Corso: Materia:Informatica Teorica | Prossima lezione: Proprietà di chiusura dei linguaggi regolari |