✖

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 R1∘(R2∗). E, como ainda podemos chegar do estado qr ao estado qj, acrescentamos ali ainda a expressão regular R3. No total, por esse caminho, podemos obter palavras da forma R1∘(R2∗)∘R3.

Agora sabemos que dessa parte do autômato podem surgir palavras da forma R4 ou da forma R1∘(R2∗)∘R3. É claro que podemos escrever isso na forma de expressão regular como (R4)|(R1∘(R2∗)∘R3).

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⟩.

  1. 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.
  2. Se k = 2, o algoritmo termina e, na aresta entre o estado inicial e o final, está a expressão regular resultante.
  3. 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á: Q′′=Q′∖{qr} e, para todos os qi ∈ Q′′ ∖ {qf′} e para todos os qj ∈ Q′′ ∖ {q0′}, seja δ′′(qi,qj)=(R4)|(R1(R2∗)R3), 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

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