Conversão de autômato em expressão regular
Vamos mostrar como converter qualquer autômato finito em uma expressão regular.
Descrição do algoritmo
Na entrada temos algum AFN A. Primeiro fazemos dele um AFNG. Na segunda fase, em cada passo eliminamos um estado, alteramos corretamente a função de transição e repetimos, até que sobrem apenas dois estados — o inicial e o final. Entre eles haverá uma aresta que terá como rótulo uma expressão regular, que será o resultado do algoritmo inteiro. O procedimento todo consiste, portanto, principalmente em eliminar um estado e depois corrigir o autômato, de modo a obtermos um autômato equivalente.
Eliminação de um estado
Podemos ilustrar como eliminar um estado com um exemplo simples. Suponha que uma parte do nosso autômato seja assim:
em que Ri são algumas expressões regulares. Como ficaria o autômato se eliminássemos o estado qr? Podemos imaginar que estamos no estado qi e nos perguntamos: que palavras somos capazes de gerar neste trecho? Se formos do estado qi diretamente para o estado qj, serão todas as palavras que correspondem à expressão regular R4.
Mas, se formos para o estado qr, podemos gerar palavras da forma R1. No estado qr, porém, podemos ficar em laço pela expressão regular R2, de modo que, na verdade, podemos gerar palavras da forma
Agora sabemos que dessa parte do autômato podem surgir palavras da forma R4 ou da forma
Agora podemos simplesmente eliminar o estado qr, deixar apenas os dois estados qi e qj e, no lugar de R4, escrever a expressão regular que acabamos de calcular:
Realizamos esse procedimento com cada aresta de cada estado qi para algum estado qj, inclusive os laços, isto é, inclusive o caso em que qi = qj.
Depois de eliminar um estado, obtemos um autômato equivalente — um autômato que reconhece a mesma linguagem.
O algoritmo completo
Na entrada temos o AFN A = ⟨Q, Σ, δ, q0, F⟩.
- Convertemos o AFN A em um AFNG Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. Daqui em diante, vamos denotar pela letra k o número de estados em Z.
- Se k = 2, o algoritmo termina e, na aresta entre o estado inicial e o final, está a expressão regular resultante.
- Se k>2, escolhemos um estado qualquer qr que seja diferente do estado inicial e do final, isto é, qr ≠ q0′ e qr ≠ qf′. Em seguida criamos um novo AFNG Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, para o qual valerá:
e, para todos os qi ∈ Q′′ ∖ {qf′} e para todos os qj ∈ Q′′ ∖ {q0′}, seja em que R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Em seguida, voltamos ao passo 2.
Exemplo
Considere na entrada este autômato finito:
Primeiro o convertemos em AFNG (não vamos representar as transições ∅ desnecessárias):
Agora aplicamos a segunda parte do algoritmo e eliminamos algum nó. Começamos pelo nó q2. Eliminamos o nó q2 e acrescentamos uma transição do estado q1 para o estado qf. Rotulamos essa transição como b(a|b)∗, porque do nó q1 chegamos ao estado q2 com palavras da forma b, depois podemos ficar em laço com a|b, obtendo assim (a|b)∗, e por fim passamos para qf pela regra ε. Nesse caso vale b(a|b)∗ϵ = b(a|b)∗. Obtemos o autômato:
Resta eliminar o último estado, q1. Acrescentamos uma aresta do estado qs para o estado qf. Como a rotulamos? Chegamos ao estado q1 pela regra ε, que podemos omitir de imediato. Depois podemos ficar em laço com a, de modo que obtemos a expressão regular a∗. E, por fim, pela aresta chegamos a qf, então concatenamos ainda a expressão com b(a|b)∗. A aresta será, assim, descrita pela expressão regular a∗ b(a|b)∗.
O autômato já tem apenas dois estados, então o algoritmo termina. Na aresta está a expressão regular resultante.
Fontes
- O exemplo e a descrição do algoritmo vêm de M. Sipser: Introduction to the Theory of Computation
Capítulos: Expressões regulares, Conversão de expressão regular em autômato, Autômato finito não determinístico generalizado, Conversão de autômato em expressão regular