Trovare il DFA più piccolo che separa due parole senza usare la ricerca della forza bruta?


23

Dato due stringhe xey, voglio creare un DFA di dimensioni minime che accetta xe rifiuta y. Un modo per farlo è la ricerca della forza bruta. Enumera DFA iniziando dal più piccolo. Prova ogni DFA fino a quando non ne trovi uno che accetta x e rifiuta y.

Voglio sapere se esiste un altro modo noto per trovare o creare un DFA di dimensioni minime che accetta xe rifiuta y. In altre parole, possiamo battere la ricerca della forza bruta?

Più dettaglio:

(1) Voglio davvero che un algoritmo trovi un DFA di dimensioni minime, non un DFA di dimensioni minime.

(2) Non voglio solo sapere quanto sia grande o piccolo il DFA minimo.

(3) Proprio qui, sono concentrato solo sul caso in cui tu avessi due stringhe xey.


Modifica :

Ulteriori informazioni per il lettore interessato:

Supponiamo che e siano stringhe binarie di lunghezza al massimo . È noto che esiste un DFA che accetta e rifiuta con al massimo stati. Si noti che esistono circa DFA con un alfabeto binario e al massimo stati. Pertanto, l'approccio della forza bruta non ci richiederebbe di enumerare più di DFA. Ne consegue che l'approccio della forza bruta non potrebbe richiedere molto più di volta.y n x y xynxy nnnn nn nnnnn

Diapositive che ho trovato utili: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf


2
@ AndrásSalamon È ancora NP completo se gli insiemi da distinguere sono composti ciascuno da una sola stringa? Mi sembra che questo dovrebbe essere ragionevolmente trattabile.
mamma

6
@mhum il problema che ci sono molte diverse lingue regolari che separano le due stringhe: la minimizzazione di DFA troverà l'automa migliore per ognuna di queste lingue ma non farà nulla per confrontarlo con gli automi per le altre lingue di separazione.
David Eppstein,

4
Se ed sono diverse lunghezze, con il più grande dei lunghezza , è facile trovare rapidamente un DFA con afferma che le separa: basta usare un ciclo di lunghezza , dove non lo fa divide. Trova provando in ordine finché non trovi la appropriata . Se ed sono della stessa lunghezza, poi la costruzione di Robson, in un documento del 1996, dà una macchina semplice che può essere trovato da una ricerca di dimensioniy n O ( log n ) p p | x | - | y | p 2 , 3 , 5 , p x y O ( xynO(logn)pp|x||y|p2,3,5,pxyO(n)O(n)O(n). Nessuna costruzione è garantita per essere il DFA più piccolo.
Jeffrey Shallit,

3
Le note di Shallit, collegate sopra, includono l'utile osservazione che il caso peggiore per il problema della separazione è quando l'alfabeto è binario: è sempre possibile dividere alfabeti più grandi in due sottogruppi che distinguono ancora le due parole di input e cercare un automa binario che tratta lettere in un sottoinsieme come 0 e lettere nell'altro sottoinsieme come 1. Ma per cercare l'automa di separazione minimo questo non sembra aiutare, perché potresti essere in grado di utilizzare le informazioni extra dell'alfabeto originale per fare meglio di quanto potresti fare con una mappatura su un alfabeto binario.
David Eppstein,

3
un caso speciale di quest'altra domanda recente in cui le dimensioni in-set e out-set equivalgono a 1. automi limitati minimi forniti in parole e in parole . quella risposta elenca un po 'di letteratura sull'apprendimento, inclusa una certa euristica.
vzn

Risposte:


9

Se dovessi farlo in pratica, userei un solutore SAT.

La domanda se esiste un DFA con stati che accetta rifiuta può essere facilmente espressa come istanza SAT. Ad esempio, un modo è quello di avere variabili booleane: è vero se il DFA passa dallo stato allo stato sul bit di ingresso . Quindi aggiungi alcune clausole per imporre che si tratta di un DFA e alcune variabili e clausole per imporre che accetta e rifiuta .x y 2 k 2 z s , b , t s t b x ykxy2k2zs,b,tstbxy

Ora usa la ricerca binaria su per trovare la più piccola in modo che esista un DFA di questo tipo. Sulla base di ciò che ho letto in articoli sul problema correlato, mi aspetto che questo potrebbe essere ragionevolmente efficace nella pratica.kkk


Altre codifiche di questo come SAT sono possibili. Ad esempio, possiamo usare una codifica di traccia:

  • Se è di lunghezza , puoi aggiungere variabili booleane: lascia che sia la sequenza di stati attraversati sull'input e rappresenti ogni usando variabili booleane .m m lg k s 0 , s 1 , , s m x s ilg k xmmlgks0,s1,,smxsilgk

  • Ora per ogni tale che , hai il vincolo chex i = x ji,jxi=xj .si1=sj1si=sj

  • Successivamente, estendere questo per gestire : lasciate t 0 , ... , t n la successione di stati attraversati in ingresso y , e rappresentare ogni t j utilizzando lg k variabili booleane. Per ogni i , j tale che y i = y j , aggiungi il vincolo che .yt0,,tnytjlgki,jyi=yjti1=tj1ti=tj

  • Allo stesso modo, per ogni tale che x i = y j , aggiungi il vincolo che è i - 1 = t j - 1i,jxi=yj .si1=tj1si=tj

  • Entrambe le tracce devono iniziare dallo stesso punto iniziale, quindi aggiungi il requisito che (WLOG puoi richiedere s 0 = t 0 = 0 ).s0=t0s0=t0=0

  • Per garantire che il DFA utilizzi solo stati, è necessario che 0 s i < k e 0 t j < k per tutti i , j .k0si<k0tj<ki,j

  • Infine, per codificare il requisito che sia accettato e y sia rifiutato, è necessario che s mt n .xysmtn

Tutti questi requisiti possono essere codificati come clausole SAT.

Come in precedenza, utilizzeresti la ricerca binaria su per trovare il k più piccolo per cui esiste un DFA del genere.kk


3
si noti che questo sarà effettivamente superiore alla ricerca della forza bruta se ci sono alcune simmetrie nel problema e sono riconosciute dal risolutore, ma attualmente può essere difficile identificarle / isolarle (sia per l'uomo che per la macchina). esiste anche una "tecnologia" più recente / correlata di soddisfacenti teorie del modulo e programmazione del set di risposte, alcune delle quali hanno predicati grafici "incorporati" o possono supportare le loro definizioni.
vzn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.