Computação Não Determinista

Generalização dos autómatos deterministas.

Introdução

Com vista a obter-se um modelo de computação das linguagens regulares, estão por responder duas questões:

  1. Qualquer linguagem regular é aceite por um AFD?
  2. Qualquer linguagem aceite por um AFD é regular?

Formalmente, para responder a estas questões, mostra-se como obter um AFD "equivalente" a uma ER dada e, reciprocamente, como obter uma RE "equivalente" a um dado AFD.

Para construir estas equivalências é necessária estudar uma variante não determinista dos AFD.

Autómatos Finitos Não Deterministas

Nos AF deterministassempre exatamente uma transição para cada combinação . Isto é, no diagrama, de cada estado sai sempre exatamente uma aresta , para cada .

Diagrama de Um AFD.
Fig: Exemplo Diagrama AFD
De cada vértice sai exatamente uma aresta para cada símbolo.

Para os diagramas das expressões regulares o caso é diferente:

  • Algumas arestas "são" .
  • Não é necessário sair uma aresta para cada símbolo.
  • Podem sair várias arestas com o mesmo símbolo.

Por exemplo, para a expressão regular tem-se o diagrama

Diagrama de uma ER.
Fig: Exemplo Diagrama RE
Não se verificam as restrições dos AFD.

Intuitivamente, as arestas dos AFD são caminhos obrigatórios enquanto que as arestas das RE são caminhos possíveis.


Os Autómatos Finitos Não Deterministas generalizam os AFD com todos os tipos de arestas das ER. Desta forma obtém-se um modelo computacional das ER que pode "correr" e ser analisado em termos de desempenho.

Autómato Finito Não Determinista (AFND). Um Autómato Finito Não Determinista (AFND) é um tuplo em que

  • Estados de Controlo é um conjunto finito.
  • Alfabeto de Entrada é um alfabeto.
  • Transição é uma função.
  • Estado Inicial .
  • Estados Finais ou de Aceitação .

A diferença entre as definições de AFD e AFND está na assinatura da transição:

  1. A assinatura da transição dos AFD é .
  2. Nos AFND acrescenta-se a palavra vazia a . Desta forma, nos diagramas algumas arestas também podem ser , além de .
  3. Em vez de ser um único estado de controlo, nos AFND é um conjunto de possíveis estados, incluindo nenhum. Isto é, em vez de , nos AFND .

É necessário replicar nos AFND o percurso feito com os AFD. Em particular, definir para os AFND o que é uma configuração, computação, palavra e linguagem aceite. Porém, é mais útil começar por definir o diagrama de um AFND.

Diagrama de um AFND. Seja um AFND. O diagrama de define-se como no caso dos AFD, tendo em conta que algumas arestas podem ser .

Por exemplo, dado o AFND com estado inicial , estados finais e transição o diagrama que se obtém é

Exemplo de Diagrama de um AFND
Fig: Exemplo Diagrama AFND

Note-se que:

  • A tabela da transição tem uma coluna adicional, .
  • As "células" da tabela são subconjuntos de estados de controlo. Um valor possível é o conjunto vazio .
  • Neste primeiro exemplo os conjuntos foram denotados com mas sempre que possível será usada uma notação mais compacta:
    • Em vez de se escrever "" escreve-se apenas "", "" ou "" se a vírgula for mesmo necessária.
    • O conjunto vazio é representado por nada: em vez de "" escreve-se apenas "".
  • Os estados finais podem ser assinalados com o prefixo "" e o estado inicial com um prefixo "". Se nada for indicado o estado inicial é sempre ou e dispensa-se a indicação de que é inicial.

De acordo com estas convenções a tabela da transição acima fica e define completamente o AFND . Isto é, lendo a tabela determinam-se todos os atributos que definem um AFND.


Tal como observado para os AFD, a função de transição de um AFND é quase sempre representada por uma tabela mas por vezes é conveniente apresentá-la como um conjunto de triplos:

A transição acima, como um conjunto de triplos, fica:

Observação: No caso dos AFD os triplos são e para os AFND os triplos são . Enquanto que nos AFD , nos AFND , podendo ser vazio, ter zero, um, dois, elementos de .

Configuração. Computação AFND. Seja um AFND.

A definição de configuração como um par permanece igual ao caso dos AFD.

A computação da palavra pelo AFND é uma sequência de configurações em que:

  • base (configuração inicial) e .
  • passo (processamento do símbolo ativo): e .
  • passo (transição vazia): e .
  • fim ou não há mais passos possíveis.

Ao contrário do que acontece com os AFD, nos AFND cada palavra pode ter mais do que uma computação possível.

Por exemplo, a palavra tem três computações possíveis:

  • : rejeita?
  • : aceita?
  • : rejeita?

Esta situação, em que as computações de uma palavra podem terminar em vários estados, alguns finais e outros não, torna a definição de palavra aceite um pouco mais complicada do que para os AFD:

Palavra Aceite. Linguagem Reconhecida (AFND). Seja um AFND.

Uma palavra é aceite por se existe alguma computação de por que termina num estado final depois de terem sido lidos todos os símbolos de . Isto é, se entre todas as computações de por alguma termina numa configuração com .

A linguagem reconhecida (ou aceite) por é o conjunto de todas as palavras aceites por :


Neste ponto a situação em relação ao Problema Principal de ALP é a seguinte :

  1. As Linguagens e as Expressões Regulares são candidatas para formalizar rigorosamente as linguagens de programação. Idealmente, cada linguagem de programação poderia ser representada por uma ER.
  2. Os Autómatos Finitos Deterministas são candidatos para resolver computacionalmente a questão de saber se um palavra dada está, ou não, numa certa linguagem regular.
  3. Mas os AFD parecem ser demasiado restritivos para representar as ER. Comparando os respetivos diagramas, não há arestas vazias, etc.
  4. Os Autómatos Finitos Não Deterministas generalizam os AFD de forma a suportarem todos os tipos de arestas das ER.

De forma a resolver a questão da representação computacional das linguagens regulares, há que responder afirmativamente às seguintes duas questões;

  1. Qualquer linguagem regular é aceite por um AFND?
  2. Qualquer linguagem aceite por um AFND é regular?

Equivalência entre Expressões Regulares e Autómatos Finitos Não Deterministas

Para estabelecer a equivalência entre ER e AFND têm de ser resolvidos dois problemas:

  1. ER → AFND (Construção de Thompson): Dada uma ER qualquer, , encontrar um AFND tal que (isto é, Qualquer linguagem regular é aceite por um AFND?).
  2. AFND → ER (Algoritmo de Kleene): Dado um AFND qualquer, , encontrar uma ER tal que (isto é, Qualquer linguagem aceite por um AFND é regular?).

A resolução do primeiro problema usa a "Construção de Thompson" descrita já a seguir. Para resolver o segundo problema usa-se o "Algoritmo de Kleene", que remove um a um os vértices do diagrama do AFND.

Construção de Thompson

O primeiro problema é de resolução muito fácil, considerando os diagramas das ER e dos AFND:

Construção de Thompson. Dada uma ER sobre , o diagrama de pode ser interpretado como o diagrama de um AFND . Nesse caso .

Por exemplo, seja . Numerando os vértices do seu diagrama da esquerda para a direita (mas serve qualquer critério desde que cada vértice fique com um "nome" diferente dos restantes) obtém-se:

Exemplo de um Diagrama da ER
Fig: Exemplo Diagrama ER

Seja o AFND que se obtém deste diagrama, descrito pela tabela

A "equivalência" entre e depende de se verificarem as seguintes duas condições:

  • : Cada palavra de é aceite por ou, equivalentemente, : cada palavra rejeitada por não está em .
  • : Cada palavra aceite por está em ou, equivalentemente, : cada palavra que não está em é rejeitada por .

A demonstração completa e formal de cada um dos pontos anteriores sai do âmbito de ALP. Mas a verificação de alguns casos é um exercício importante.

  • Palavras de : . Estas palavras são aceites por ?
  • Palavras que não estão em : . Estas palavras são rejeitadas por ?

Para verificar que a palavra é aceite por , basta que uma computação de por processe todos os símbolos e termine num estado final.

Por exemplo, tem a seguinte computação por : . Portanto é aceite por .

Para há a seguinte computação: . Todos os símbolos de foram processados e a computação termina num estado final. Portanto é aceite.

Exercício. Verifique que as restantes palavras de listadas acima também são aceites por .

Para verificar que a palavra é rejeitada por é necessário que nenhuma computação de por processe todos os símbolos e termine num estado final.

Por exemplo, tem apenas uma computação por : (começa no estado inicial e não avança mais).

Embora esta computação processe todos os símbolos de , não termina num estado final. Como não há mais computações de por conclui-se que rejeita .

Se também só há uma computação possível: e daqui não é possível avançar mais. Neste caso, embora a computação tenha terminado num estado final, faltou processar todos os símbolos de . Portanto esta palavra é rejeitada.

Exercício. Verifique que as restantes palavras listadas acima que não estão em também são rejeitadas por .

Algoritmo de Kleene

Com a Construção de Thompson fica estabelecido que qualquer linguagem regular é aceite por um AFND. Falta verificar que qualquer linguagem aceite por um AFND é regular.

Para esse efeito apresenta-se um método, o "Algoritmo de Kleene", que transforma o diagrama de um AFND numa expressão regular "equivalente".

Neste processo o diagrama é transformado por uma sequência de passos onde se remove um vértice de cada vez. O vértice removido é substituído por certas ER. No fim do processo fica apenas o vértice inicial e um vértice final, ligados por uma aresta com a ER final.

Um exemplo, ainda informal

  1. Dado o seguinte AFND na forma de um diagrama:

    Fig: Exemplo AFND para RE  01

  2. Representa-se por a expressão da aresta que liga o vértice ao vértice . Por exemplo, .

  3. Neste diagrama:

    1. Nenhuma aresta entra no vértice inicial.
    2. Existe apenas um vértice final.
    3. Nenhuma aresta sai do vértice final.
  4. Para eliminar o vértice :

    1. Que caminhos "passam em "? Há dois: e .
    2. Seja um desses caminhos. Adiciona-se ao diagrama a aresta com .
    3. Repete-se o passo anterior para todos os caminhos que passam no vértice a eliminar.
  5. O novo diagrama, sem o vértice , é:

    Fig: Exemplo AFND para RE  02

  6. Eliminado o vértice , obtém-se:

    Fig: Exemplo AFND para RE  03

  7. Restam apenas o vértice inicial e o final. A expressão regular "equivalente" ao AFND é .


O núcleo do processo está no passo 4 mas antes de começar é preciso que o diagrama do AFND esteja "bem preparado", conforme as condições do passo 3.

Diagrama Bem Preparado. Um diagrama está bem preparado se

  1. Nenhuma aresta entra no vértice inicial.
  2. Existe apenas um vértice final.
  3. Nenhuma aresta sai do vértice final.

Nem todos os diagramas estão bem preparados mas é sempre possível transformar um diagrama de forma a obter-se outro equivalente e bem preparado:

Autómato Bem Preparado. Seja um AFND.

O AFND em que:

  • e .
  • .
  • para cada .
  • nos restantes casos.

está bem preparado e é equivalente a .

Por exemplo, se for dado pela tabela não está bem preparado porque o estado inicial, , recebe uma aresta de e, também, porque sai uma aresta do estado final. Um AFND equivalente e bem preparado é que está bem preparado. Em termos de diagramas:

Diagrama Mal PreparadoDiagrama Equivalente Bem Preparado
Fig: Exemplo Bem Preparado 01Fig: Exemplo Bem Preparado 02

Com autómatos bem preparados pode aplicar-se o processo de eliminação de vértices.

Algoritmo de Kleene. Sejam um AFND bem preparado e a ER da aresta no diagrama de .

O caminho passa no vértice se (pode ser ) e no diagrama existem arestas e .

A eliminação do vértice produz um novo diagrama idêntico ao anterior exceto:

  • O novo diagrama não tem o vértice .
  • Para cada caminho do diagrama original, o novo diagrama tem a aresta com valor

No diagrama que se obtém quando foram eliminados todos os vértices exceto o inicial e final, a expressão regular que está na aresta F é "equivalente" ao AFND no sentido em que

Um exemplo mais complicado, passo a passo. Seja o seguinte diagrama/AFND, que não está bem preparado:

Fig: Exemplo TK 01

Uma versão equivalente, bem preparada é

Fig: Exemplo TK 02

Eliminar . Caminhos que passam em :

  • . ER resultante: .
  • . ER resultante: .

Fig: Exemplo TK 03

Eliminar . Caminhos que passam em :

  • . ER resultante: .
  • . ER resultante: .

Fig: Exemplo TK 04

Eliminar . Caminhos que passam em :

  • . ER resultante: .
  • . ER resultante: .

Fig: Exemplo TK 05

Eliminar . Caminhos que passam em :

  • . ER resultante, e final:

A ER final pode ser um pouco simplificada:

Exercícios:

  • Aplique a Construção de Thompson à ER acima.
  • Escolha palavras de e verifique que as aceita.
  • Encontre palavras de e verifique que estão em .
  • O que se passa com a palavra ? Está em ? E em ?

Equivalência entre AFND e AFD

A Construção de Thompson e o Algoritmo de Kleene asseguram que os AFND são "equivalentes" às ER, no sentido em que os AFND e as ER definem exatamente as mesmas linguagens.

Mas os AFND são um mau modelo computacional porque pode ser necessário um número exponencial (no número de estados do autómato) para decidir se .

Para computar não se sabe, à partida, quantos "passos" vão ser necessários. No caso em que é preciso testar todas computações de por .

O problema da eficiência da computação não se coloca nos AFD: Demora sempre exatamente passos, o que é um desempenho ótimo (no sentido em que não há melhor).


Como os AFND generalizam os AFD, todas as linguagens aceites por AFD são também aceites por AFND.

Nesta secção mostra-se que os AFD e os AFND são equivalentes: As linguagens aceites pelos AFD são exatamente as linguagens aceites pelos AFND.

Com as transições vazias, um AFND pode percorrer vários estados sem processar símbolos, ao contrário do que acontece com os AFD. Esta situação fica representada com o fecho vazio e com a transição de entrada.

Fecho Vazio. Seja um AFND e .

O fecho vazio de , , é o conjunto de todos os estados que podem ser alcançados a partir de com zero ou mais transições vazias. Formalmente:

  • base .
  • passo Se e então também .

Também devido às transições vazias, não contém todos os estados que podem ser alcançados a partir de lendo o símbolo . Para esse efeito tem-se a transição de entrada:

Transição de Entrada. Seja um AFND.

A transição de entrada é a função de assinatura que, para cada , define o conjunto dos estados que podem ser alcançados a partir de lendo o símbolo . Isto é:


Por exemplo, seja o AFND definido pela tabela com o fecho vazio de cada estado já calculado e com o seguinte diagrama

Transição de Entrada: Diagrama do AFND acima
Fig: Exemplo Transição Entrada

A transição de entrada de alguns casos: Neste caso, por exemplo, porque é uma computação de . Já de duas maneiras diferentes: e .

Exercício: Calcule todas as transições de entrada deste exemplo.


Este "desvio" pelo fecho vazio e transição de entrada serve para formalizar as ferramentas que faltam para o objetivo desta secção: Mostrar que para cada AFND existe um AFD "equivalente" no sentido em que .

Simulação de Não Determinismo. Seja um AFND.

O AFD equivalente a é o AFD em que:

  • Estado Inicial .
  • Transição .
  • Estados de Controlo é definido recursivamente por
    • base .
    • passo Se então, para cada .
    • fecho Mais nenhum estado está em .
  • Estados Finais .

Neste caso

Por exemplo, para o AFND

Um AFND para
Fig: Exemplo Simulação

o cálculo de e de é feito em conjunto:

Os estados de são conjuntos de estados de . Para evitar uma notação muito pesada (por exemplo, ) omitem-se as chavetas e as vírgulas (e escreve-se apenas ). O texto vermelho representa estados "novos" na tabela e os estados finais de estão sublinhados. O respetivo diagrama é

Um AFD equivalente ao AFND para
Fig: Exemplo Simulação - AFD

O teorema/método da Simulação de Não Determinismo assegura que estes dois autómatos são equivalentes, isto é, reconhecem a mesma linguagem.

Conclusão

Uma vantagem dos AFD é que a computação é linear no comprimento da palavra pois executa exatamente passos para computar a resposta a enquanto que para o AFND a computação da resposta é exponencial.

Este ganho no número de passos tem um custo: se o AFND tem estados então , o AFD equivalente, pode ter até estados.

Estão determinadas três equivalências:

  • As ER e os AFND são equivalentes devido à Construção de Thompson e ao Algoritmo de Kleene.
  • Os AFND e os AFD são equivalentes devido à Definição de AFND e à Simulação de Não Determinismo.
  • Portanto, também as ER e os AFD são equivalentes.

Portanto

Os AFD proporcionam um bom modelo computacional para as ER.


Mas ainda há questões importantes a resolver. A próxima secção trata de formas de reduzir o tamanho dos AFD e de facilitar a construção automática de AFD e AFND antes de ser tratada a questão final, saber se "as linguagens regulares são adequadas para todas as linguagens de programação?"