Dadas duas seqüências xey, eu quero criar um DFA de tamanho mínimo que aceite xe rejeite y. Uma maneira de fazer isso é a busca por força bruta. Você enumera o DFA começando pelo menor. Você tenta cada DFA até encontrar um que aceite xe rejeite y.
Quero saber se existe outra maneira conhecida de encontrar ou criar um DFA de tamanho mínimo que aceite xe rejeite y. Em outras palavras, podemos vencer a busca por força bruta?
Mais detalhes:
(1) Eu realmente quero que um algoritmo encontre um DFA de tamanho mínimo, não um DFA de tamanho mínimo.
(2) Não quero apenas saber quão grande ou pequeno é o DFA mínimo.
(3) Bem aqui, estou focado apenas no caso de você ter duas cadeias x e y.
Editar :
Informações adicionais para o leitor interessado:
Suponhamos que e y são as cadeias binárias de comprimento no máximo n . É um resultado conhecido que existe um DFA que aceita x e rejeita y com no máximo √ estados. Observe que existem cerca den √ DFAs com um alfabeto binário e no máximo√ estados. Portanto, a abordagem da força bruta não exigiria que enumerássemos mais den √ DFA's. Daqui resulta que a abordagem da força bruta não pode demorar muito mais quen √ tempo.
Slides que achei úteis: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf
fonte
Respostas:
Se eu tivesse que fazer isso na prática, usaria um solucionador SAT.
A questão de saber se existe um DFA com estados que aceita x e rejeita y pode ser facilmente expressa como uma instância SAT. Por exemplo, uma maneira é ter 2 k 2 variáveis booleanas: z s , b , t é verdadeiro se o DFA fizer a transição do estado s para o estado t no bit de entrada b . Em seguida, adicione algumas cláusulas para impor que este é um DFA e algumas variáveis e cláusulas para impor que ele aceitak x y 2k2 zs,b,t s t b rejeita yx y .
Agora use a pesquisa binária em para encontrar o menor k, de modo que exista um DFA desse tipo. Com base no que li em artigos sobre problemas relacionados, eu esperaria que isso fosse razoavelmente eficaz na prática.k k
Outras codificações como SAT são possíveis. Por exemplo, podemos usar uma codificação de rastreamento:
Se é de comprimento m , você poderia adicionar m lg k variáveis booleanas: Let s 0 , s 1 , ... , s m ser a seqüência de estados atravessados na entrada x , e representam cada um s i usando ⌈ lg k ⌉ variáveis booleanas.x m mlgk s0,s1,…,sm x si ⌈lgk⌉
Agora, para cada , de modo que x i = x j , você tem a restrição de que s i - 1 = s j - 1i,j xi=xj .si−1=sj−1⟹si=sj
Em seguida, estenda-o para manipular : seja t 0 , … , t n a sequência de estados percorridos na entrada y e represente cada t j usando variáveis booleanas lg k . Para cada i , j , de modo que y i = y j , adicione a restrição de que t i - 1 = t j - 1y t0,…,tn y tj lgk i,j yi=yj .ti−1=tj−1⟹ti=tj
Da mesma forma, para cada tal quei,j , adicione a restrição de que s i - 1 = t j - 1xi=yj .si−1=tj−1⟹si=tj
Ambos os rastreios devem começar a partir do mesmo ponto inicial, portanto, adicione o requisito que (WLOG você pode solicitar s 0 = t 0 = 0 ).s0=t0 s0=t0=0
Para garantir que o DFA usa apenas estados, exigem que 0 ≤ s i < k e 0 ≤ t j < k para todos i , j .k 0≤si<k 0≤tj<k i,j
Finalmente, para codificar o requisito de que é aceito e y é rejeitado, exija que s m ≠ t n .x y sm≠tn
Todos esses requisitos podem ser codificados como cláusulas SAT.
Como antes, você usaria a pesquisa binária em para encontrar o menor k para o qual esse DFA existe.k k
fonte