✖

Autômato finito não determinístico

O autômato finito apresentado nos capítulos anteriores (abreviamos AF ou AFD) era sempre determinístico, o que se manifestava no fato de que, a cada momento, estava claro o que o autômato faria. Agora vamos olhar para o conceito mais geral dos autômatos finitos não determinísticos (abreviamos AFN), no qual podem existir transições que partem do mesmo estado e são para o mesmo símbolo.

Exemplo

Veja o diagrama de autômato a seguir:

O que há de estranho nele? Do nó q0 saem duas arestas para o símbolo 0. Se tentarmos aceitar a palavra 001, pareceria que o autômato não saberia se deve permanecer no estado q0 ou seguir a transição para q1. Um autômato assim seria não determinístico.

Determinismo, nesse sentido, significa que em cada situação está claro o que o autômato fará, não há espaço para ambiguidade. O autômato determinístico tem, para cada estado e cada símbolo, apenas uma transição. O não determinismo indica ambiguidade — de um estado podem sair, por exemplo, três transições para o mesmo símbolo.

E como o autômato decide, então? O autômato não determinístico sempre escolhe (às vezes dizemos também que “adivinha”) a transição que leva a aceitar a palavra, se isso for possível.

Se dermos ao autômato a palavra 001, ele tem estas possibilidades de tratar a palavra:

q0→q0→q0→q0q0→q0→q1→q2

mais as possibilidades em que ele não lê a palavra inteira. Na primeira, ele permanecia sempre no estado q0, o que com certeza pode, pois as regras de transição permitem. No segundo ramo, ele se arriscou a ir para os outros estados e por fim chegou ao estado q2, que é final. Nesse ramo o autômato aceitaria a palavra. O autômato não determinístico escolhe sempre, automaticamente, o ramo em que aceita a palavra, se tal ramo existir.

Como ele faz para escolher automaticamente o ramo “favorável”? Podemos imaginar que o autômato não determinístico percorre todos os ramos possíveis e, se encontrar um ramo em que aceita a palavra, então aceita a palavra. Como ele poderia percorrer todos os ramos? Simplesmente, no momento em que está em um estado do qual saem n arestas para o símbolo atual, o autômato se copia n vezes, e cada cópia segue um caminho diferente. Assim, percorremos aos poucos todas as possibilidades.

Representação da computação do autômato em árvore

Vamos modificar levemente o autômato anterior:

O não determinismo permanece no primeiro estado. O autômato anterior aceitava todas as palavras que terminam em 01. Este autômato modificado aceita todas as palavras que contêm a subpalavra 01. Portanto, ele aceita, por exemplo, a palavra 101 ou 0101. Todos os ramos da computação podem ser visualizados com facilidade por meio de uma árvore; por exemplo, para a palavra 01010, a árvore poderia ser assim:

No começo estamos no estado inicial q0. Na entrada temos a palavra 01010, e o primeiro caractere não lido é 0. Do estado q0 saem duas transições para o símbolo 0, para os estados q0 e q1. A árvore terá, portanto, neste nó dois descendentes: q0 e q1. Em seguida lemos o símbolo 1. Aí não há ambiguidade nenhuma, passamos para os estados q0 e q2. Depois lemos o caractere 0; no ramo da esquerda surge de novo ambiguidade, e dividimos a computação em mais dois ramos. Em um deles permanecemos de novo em q0, e no outro vamos para q1. E assim por diante.

Observe que, ao todo, dois ramos terminam no estado q2, um estado final. Existem dois ramos da computação pelos quais o autômato pode aceitar a palavra dada. Esse autômato aceitaria, portanto, a palavra 01010. Podemos tentar criar uma árvore semelhante para a palavra 1000.

A computação ou permanece no estado q0 ou passa para o estado q1, mas dali não tem para onde ir, porque na entrada só restam zeros e o estado q1 tem transição apenas para o símbolo 1. Nenhum ramo da computação termina em um estado final, então o autômato não aceita a palavra 1000.

Transições ε

Nos autômatos não determinísticos podemos ainda usar transições ε. São transições que podemos fazer qualquer que seja o símbolo na entrada, e isso sem ler nenhum símbolo da palavra. Como poderíamos escrever um autômato não determinístico que aceitasse a palavra vazia, todas as palavras compostas apenas de uns e as palavras da forma (10)n, isto é, 10, 1010, …?

Dividimos o autômato em dois “subautômatos”. O de cima se encarrega de reconhecer as palavras compostas de 1, e o de baixo cuida das palavras da forma (10)n. Vamos tentar aceitar a palavra 111. No começo, o autômato está no estado q0 e tem na entrada a palavra 111. Como tem à disposição transições ε, ele pode decidir passar para o estado q1 ou q2, conforme lhe convier. Vemos que lhe convirá passar para o estado q1. O autômato vai para lá. Nesse momento, na entrada ele ainda tem a palavra 111! Só agora ele começa a ler os símbolos da palavra e a passar do estado q1 de novo para q1, até ler a palavra inteira e aceitá-la.

Se tentássemos aceitar 1010, o autômato passaria no começo para o estado q2 e só a partir dali começaria a processar os símbolos e de novo aceitaria a palavra.

Para a palavra 1100, o autômato poderia fazer qualquer coisa, mas não tem como aceitar essa palavra.

As transições ε e o não determinismo facilitam o nosso trabalho em muitos aspectos; por exemplo, a demonstração de que a união de linguagens regulares é também uma linguagem regular pode ser escrita com transições ε de forma muito mais simples do que no caso dos autômatos finitos determinísticos. Nessa demonstração tínhamos exemplos destes autômatos

e

e depois construímos um autômato finito determinístico que aceitava a união das duas linguagens. Com transições ε, podemos montar esse autômato assim:

Simplesmente acrescentamos um novo estado inicial, dele saem duas transições ε para os estados iniciais originais dos autômatos originais, e é só isso. O autômato decide de forma não determinística se tenta aceitar a palavra com um ou com o outro “subautômato”.

Definição de autômato não determinístico

Já mostramos em que o autômato finito determinístico e o não determinístico se diferenciam; falta apenas formalizar. Definimos o autômato finito determinístico como uma quíntupla ⟨Q, Σ, δ, q0, F⟩, em que Q é o conjunto de estados, Σ é o alfabeto, δ é a função de transição, q0 é o estado inicial e F é o conjunto dos estados finais. A única coisa que muda na definição dos autômatos não determinísticos é a definição da função de transição.

Na versão determinística, a função, ao ser chamada como δ(q, w), podia devolver apenas um estado, enquanto na versão não determinística ela pode devolver vários estados — se para um símbolo estão definidas várias transições. Como precisamos definir também as transições ε, vamos denotar o conjunto Σ ∪ {ε} por Σε, isto é, Σε = Σ ∪ {ε}. A função δ é então definida como

δ:Q×Σε→2Q

Esse 2Q representa o conjunto das partes, o conjunto de todos os subconjuntos do conjunto Q. A formalização da computação é muito parecida com a dos autômatos finitos. A configuração do autômato é, de novo, um par ⟨q, w⟩ ∈ Q × Σ∗. O passo de computação ↦ é uma relação no conjunto das configurações tal que

⟨qi,w0w1…wn⟩↦⟨qj,w1…wn⟩,

se, e somente se, qj ∈ δ(qi, w0). Nesta frase estava a maior diferença. Nos autômatos determinísticos, tínhamos essa condição escrita como qj = δ(qi, w0), porque a função δ devolvia sempre um único estado. A versão não determinística da função de transição devolve um conjunto de estados, por isso aparece ali o símbolo ∈. Vamos novamente representar o fecho reflexivo e transitivo da relação por ↦ ∗. Dizemos que o autômato aceita a palavra w se, e somente se, existe qf ∈ F tal que

⟨q0,w⟩↦∗⟨qf,ε⟩.

Fontes

Capítulos: Autômato finito, Autômato completo, Autômato finito não determinístico, Simulação de um autômato não determinístico, Conversão de AFN em AFD