Para heurísticas eficientes, sugiro examinar a literatura CAD sobre o problema de codificação de estado (atribuir identificadores binários aos estados de um DFA para minimizar a quantidade de lógica para a função de transição de estado). Devadas e Newton, "Decomposição e fatoração de finito seqüencial máquinas de estado ", IEEE TCAD , 8 (11): 1206-1217, 1989 aponta que existe uma estreita relação entre codificação de estado e decomposição de máquina de estado.
Se para um DFA com N afirma que você atribui um único M identificador de estado de bit para cada estado (lg2N<M≤N), decompôs o DFA essencialmente em uma rede de Mmáquinas de dois estados em interação. Equivalentemente: você definiu um conjuntoS com M elementos e atribuiu um subconjunto exclusivo de Spara cada estado no seu DFA original. Isso também é o que o algoritmo de construção de conjuntos de potências Rabin-Scott faz. Portanto, ao fazer uma codificação de estado no DFA, estamos tentando fazer engenharia reversa do conjunto do qual o algoritmo de construção do conjunto de energia começou.
No problema tradicional de codificação de estado, todas as codificações são legais e há alguma função objetiva (relacionada à quantidade de lógica na função de transição de estado) que você está tentando minimizar. Para gerar um NFA, você precisa resolver uma versão restrita do problema de encadeamento em que:
uma codificação de Midentificadores de bits para os estados do DFA representam um if de NFA para cada símbolo no alfabeto, a função de transição para cada bit é uma simples disjunção de bits. (Nenhuma conjunção ou negação é permitida.)
Então você pode enumerar todas as M codificações de bits para todos lg2N<M≤Ne verifique se cada um satisfaz a restrição. (Observe que paraM=N a trivial codificação "quente" sempre satisfaz as restrições e fornece o DFA.) A enumeração é ridiculamente grande, porém (o livro de Di Micheli a apresenta como algo como 2M!(2M−N)!M!.) A razão pela qual estou sugerindo a literatura CAD é que existem técnicas para fazer essa pesquisa implicitamente, em vez de enumerar (por exemplo, usando BDDs, consulte Lin, Touati e Newton: "Não se importe com a minimização de sequências multiníveis redes lógicas ", Dsgn ICCAD-90: Comp Confided Int'l ICCAD-90: 414-417, 1990 .
Exemplo
Pegue o DFA a seguir (com um código de estado derivado por trapaça (gere o DFA a partir de um NFA usando Rabin-Scott, e a codificação representa os subconjuntos escolhidos por Rabin-Scott))
Se chamarmos os bits na atribuição de estado ABCD, quando o símbolo de entrada for 1, a função de transição será A = A, B = A, C = B, D = C. Quando o símbolo de entrada é 0, a função de transição é A = A, C = B, D = C. Esta é uma função de transição puramente disjuntiva, sem conjunção ou negação, portanto, essa codificação de estado nos fornece um NFA. Os estados no NFA correspondem um a um aos bits na codificação e a função de transição é a seguinte:
Formulação como problema de satisfação booleana
A descrição informal acima leva diretamente a uma codificação como um problema de satisfação booleana. Há um conjunto de variáveis que descreve as transições na NFA e um conjunto de variáveis para a codificação do estado DFA que seria derivada de Rabin-Scott para a NFA escolhida. As transições do DFA específico que você está tentando decompor são usadas para colocar restrições nas transições do NFA.
Suponha que recebamos um DFA com N estados para um idioma com S símbolos e gostaríamos de derivar uma M AFN estadual, com lg2N<M≤N. Nós vamos usar as variáveisysft para representar as possíveis transições no NFA. ysftserá verdadeiro se houver uma transição na NFA do estado da NFAf para o estado NFAtno símbolo s. No exemplo acima NFA, o alfabeto é do tamanho 2 e há 4 estados NFA, portanto, existemSM2=32 y variáveis e y0AA,y1AAe y1AB são todos verdadeiros enquanto y1DA é falso.
Nós vamos usar as variáveis xdn para indicar se o algoritmo de Rabin-Scott deve ou não incluir o estado da NFA n no conjunto de estados que rotula o estado do DFA d. No exemplo acima, temosN=8 Estados do DFA e M=4 Estados NFA então existem 32 xvariáveis. No exemplo acima, suponha que o estado mais inferior (o rotulado "1011") seja o estadok, então xkA, xkCe xkD são verdadeiras enquanto xkB é falso.
Agora as restrições. Antes de tudo, Rabin-Scott deve encontrar uma codificação diferente para cada estado do DFA, portanto, para os estados do DFAi<j e todos os estados da NFA {A,B,⋯,D}:
(xiA≠xjA)+(xiB≠xjB)+⋯+(xiD≠xjD).
Em seguida, deve ser o caso em que Rabin-Scott encontrou uma transição do estado do DFA i para o estado DFA j no símbolo s então para cada estado da NFA k incluído na codificação de j deve haver um estado NFA l da codificação do estado DFA j de tal forma que a NFA original teve uma transição de l para k. No exemplo acima, no símbolo "1", há uma transição do DFA do estado do DFA "1000" para o estado do DFA "1100", portanto, deve haver uma transição do NFA do estado do NFA A para os estados do NFA A e B e nenhuma transição do NFA do NFA estado A para NFA, estado C ou D. Portanto, para cada um doso(SN2) arestas no DFA, temos as restrições:
xjAxjBxjD===ysAAxiA+ysBAxiB+⋯+ysDAxiDysABxiA+ysBBxiB+⋯+ysDBxiD⋯ysADxiA+ysBDxiB+⋯+ysDDxiD.
Finalmente, precisamos lidar com o início e aceitar os estados. O estado inicial do DFA é codificado com a união dos estados iniciais da NFA; portanto, é melhor que o estado inicial do DFA não seja codificado com o conjunto vazio;x0A+x0B+⋯+x0D. E, finalmente, precisamos de um conjunto de variáveisfnpara indicar se cada estado da NFA é um estado de aceitação da NFA. Deve ser o caso de que a codificação para cada estado de aceitação do DFA contenha pelo menos um estado de aceitação do NFA e que a codificação para cada estado de não aceitação do DFA não contenha estados de aceitação do NFA, portanto:xiAfA+xiBfB+⋯+xiDfD para DFA aceitar estados i e ¬(xjAfA+xjBfB+⋯+xjDfD) para estados não aceitos do DFA j.