Per l'euristica efficiente suggerirei di esaminare la letteratura CAD sul problema della codifica dello stato (assegnando identificatori binari agli stati di un DFA per minimizzare la quantità di logica per la funzione di transizione dello stato.) Devadas e Newton, "Decomposizione e fattorizzazione di sequenze finite macchine a stati ", IEEE TCAD , 8 (11): 1206-1217, 1989 sottolinea che esiste una stretta relazione tra codifica dello stato e decomposizione della macchina a stati.
Se per un DFA con N afferma di assegnare un unico M identificatore di stato bit per ogni stato (lg2N< M≤N), quindi hai sostanzialmente decomposto il DFA in una rete di Mmacchine a due stati interagenti. Equivalentemente: hai definito un setS con M elementi e assegnato un sottoinsieme univoco di Sa ogni stato nel tuo DFA originale. Questo è anche ciò che fa l' algoritmo di costruzione del powerset Rabin-Scott . Quindi, facendo una codifica di stato sul DFA, stiamo cercando di decodificare il set da cui è partito l'algoritmo di costruzione del powerset.
Nel tradizionale problema di codifica dello stato tutte le codifiche sono legali e esiste una funzione oggettiva (correlata alla quantità di logica nella funzione di transizione di stato) che si sta tentando di ridurre al minimo. Per generare un NFA è necessario risolvere una versione vincolata del problema di codifica in cui:
una codifica di Mgli identificatori di bit agli stati DFA rappresentano un iff NFA per ogni simbolo dell'alfabeto la funzione di transizione per ciascun bit è una semplice disgiunzione di bit. (Non è consentita alcuna congiunzione o negazione.)
Quindi potresti elencare tutto M codifiche bit per tutti lg2N< M≤ Ne controlla se ognuno soddisfa il vincolo. (Nota che perM= N la banale codifica "one-hot" soddisfa sempre i vincoli e ti dà il DFA.) L'enumerazione è però ridicolmente grande, (il libro di testo di Di Micheli lo dà come qualcosa di simile 2M!(2M- N) !M!.) Il motivo per cui sto suggerendo la letteratura CAD è che ci sono tecniche per fare questa ricerca implicitamente piuttosto che enumerare (ad esempio, usando BDD, vedi Lin, Touati e Newton, "Non preoccuparti della minimizzazione di sequenze multilivello reti logiche, " Int'l Conf Comp-Aided Dsgn ICCAD-90: 414-417, 1990 .
Esempio
Prendi il seguente DFA, (con una codifica di stato che ho derivato da barare (ho generato il DFA da un NFA usando Rabin-Scott, e la codifica rappresenta i sottoinsiemi scelti da Rabin-Scott.))
Se chiamiamo i bit nell'assegnazione di stato ABCD, quando il simbolo di input è 1, la funzione di transizione è A = A, B = A, C = B, D = C. Quando il simbolo di input è 0, la funzione di transizione è A = A, C = B, D = C. Questa è una funzione di transizione puramente disgiuntiva senza congiunzione o negazione, quindi questa codifica di stato ci dà un NFA. Gli stati nell'NFA corrispondono uno a uno con i bit nella codifica e la funzione di transizione è come data:
Formulazione come problema booleano di soddisfacibilità
La descrizione informale di cui sopra porta direttamente a una codifica come problema booleano di soddisfacibilità. Esiste un insieme di variabili che descrivono le transizioni nell'NFA e un insieme di variabili per la codifica dello stato DFA che verrebbero derivate da Rabin-Scott per l'NFA scelto. Le transizioni del DFA specifico che si sta tentando di decomporre vengono utilizzate per posizionare vincoli sulle transizioni NFA.
Supponiamo di ricevere un DFA con N afferma per una lingua con S simboli e vorremmo derivarne un M stato NFA, con lg2N<M≤ N. Useremo le variabiliyS ft per rappresentare le possibili transizioni nell'NFA. yS ftsarà vero se c'è una transizione nell'NFA dallo stato NFAf allo stato NFAtsul simbolo S. Nell'esempio precedente NFA, l'alfabeto è di dimensione 2 e ci sono 4 stati NFA, quindi ci sonoSM2= 32 y variabili e y0 A A,y1 A A, e y1 A B sono tutti veri mentre y1 D A è falso.
Useremo le variabili Xdn per indicare se l'algoritmo Rabin-Scott dovrebbe includere o meno lo stato NFA n nel set di stati che etichettano lo stato DFA d. Nell'esempio sopra abbiamoN= 8 Stati DFA e M= 4 NFA afferma quindi ci sono 32 Xvariabili. Nell'esempio sopra supponiamo che lo stato più in basso (quello etichettato "1011") sia statoK, poi Xk A, Xk C, e Xk D sono veri mentre Xk B è falso.
Ora i vincoli. Prima di tutto, Rabin-Scott deve trovare una codifica diversa per ogni stato DFA, quindi per gli stati DFAi < j e tutti gli stati NFA { A , B , ⋯ , D }:
(Xi A≠Xj A) + (Xio B≠Xj B) + ⋯ + (Xio D≠Xj D) .
Quindi deve accadere che se Rabin-Scott trovasse una transizione dallo stato DFA io allo stato DFA j sul simbolo S quindi per ogni stato NFA K incluso nella codifica di j deve esserci uno stato NFA l dalla codifica dello stato DFA j tale che la NFA originale ebbe una transizione da l per K. Nell'esempio sopra, sul simbolo "1" c'è una transizione DFA dallo stato DFA "1000" allo stato DFA "1100", quindi deve esserci una transizione NFA dallo stato NFA A agli stati A e B NFA e nessuna transizione NFA da NFA stato A a NFA stato C o D. Quindi per ciascuno deio ( SN2) bordi nel DFA abbiamo i vincoli:
Xj AXj BXj D===ys A AXi A+ys B AXio B+ ⋯ +ys D AXio Dys A BXi A+ys B BXio B+ ⋯ +ys D BXio D⋯ys A DXi A+ys B DXio B+ ⋯ +ys D DXio D.
Infine, dobbiamo affrontare l'inizio e accettare gli stati. Lo stato iniziale di DFA è codificato con l'unione degli stati iniziali di NFA, quindi è meglio non codificare lo stato iniziale di DFA con il set vuoto, quindiX0A +X0B + ⋯ +X0D. E infine abbiamo bisogno di un insieme di variabilifnper indicare se ogni stato NFA è uno stato di accettazione NFA. È necessario che la codifica per ogni stato di accettazione di DFA contenga almeno uno stato di accettazione di NFA e che la codifica per ogni stato di non accettazione di DFA non contenga stati di accettazione di NFA:Xi AfUN+Xio BfB+ ⋯ +Xio DfD per DFA accetta gli stati io e ¬ (Xj AfUN+Xj BfB+ ⋯ +Xj DfD) per gli stati non accettati di DFA j.