Loading AI tools
modelo matemático de computação Da Wikipédia, a enciclopédia livre
Na teoria da computação, uma máquina de estados finita não-determinística ou um autômato finito não-determinístico (AFND) é uma máquina de estados finita onde para cada par de estado e símbolo de entrada pode haver vários próximos estados possíveis. Isso o distingue do autômato finito determinístico (AFD), onde o próximo estado possível é univocamente determinado. Embora AFD e AFND possuam definições distintas, pode ser mostrado na teoria formal que eles são equivalentes e, deste modo, para qualquer AFND dado, pode-se construir um AFD equivalente e vice-versa: essa é a construção do conjunto das partes. Ambos os tipos de autômatos reconhecem apenas linguagens regulares. Máquinas de estados finitas não-determinísticas são às vezes estudadas com o nome de subshifts de tipo finito.
Máquinas de estados finitas não-determinísticas são generalizadas pelo autômato probabilístico, o qual atribui uma probabilidade para cada transição de estado, e por várias outras maneiras, tais como autômatos com pilha e AFNs com transições ε.
Autômatos finitos não-determinísticos foram introduzidos em 1959 por Michael O. Rabin e Dana Scott,[1] que também mostraram sua equivalência com autômatos finitos determinísticos.
Um AFND, similarmente a um AFD, lê uma cadeia de símbolos de entrada. Para cada símbolo da entrada há uma transição para um novo estado, até que todos os símbolos de entrada sejam lidos.
Ao contrário de um AFD, há um não-determinismo onde, para cada símbolo de entrada, seu próximo estado pode ser um de dois ou mais estados possíveis. Assim, na definição formal, o próximo estado é um elemento do conjunto das partes dos estados. Este elemento, um conjunto, representa algum subconjunto de todos os possíveis estados que podem ser considerados.
Uma extensão do AFND é o AFND-lambda (também conhecido como AFND-epsilon ou como AFND com transições epsilon), o qual permite uma transição para um novo estado sem ler nenhum símbolo de entrada. Por exemplo, se está no estado 1, com o próximo símbolo de entrada um a, pode-se se mover para o estado 2 sem ler nenhum símbolo de entrada. Assim, tem-se uma ambiguidade: o sistema está no estado 1 ou no estado 2 antes de ler a entrada a? Por causa desta ambiguidade, é mais conveniente falar de um conjunto de possíveis estados que o sistema pode estar. Assim, antes de ler um símbolo de entrada a, o AFND-epsilon pode estar em qualquer um dos estados do conjunto {1,2}. Equivalentemente, pode-se imaginar que o AFND está nos estados 1 e 2 'ao mesmo tempo': isso dá uma ideia informal da construção do conjunto das partes: o AFD equivalente a um AFND é definido como aquele que está no estado q={1,2}. Transições para novo estados sem ler símbolos de entrada são chamadas de transições lambda ou transições epsilon. Elas são comumente rotuladas com as letras gregas λ ou ε.
A noção de aceitação de uma entrada é similar àquela em um AFD. Quando o último símbolo de entrada é lido, diz-se que o AFND aceita se e somente se existe algum conjunto de transições que irá levá-lo a um estado de aceitação. Do mesmo modo, ele rejeita, se, não importando quais transições sejam aplicadas, ele não terminar num estado de aceitação.
Dois tipos similares de AFNDs são comumente definidos: o AFND e o AFND com transições ε. O tipo comum é definido como uma 5-tupla, , consistindo de
Aqui, denota o conjunto das partes de
O AFND com transições ε (também conhecido como AFN-epsilon ou AFN-lambda) é definido por uma 5-upla extremamente semelhante, porém, a função de transição é substituída por uma que permite a cadeia vazia ε como uma entrada possível. Desse modo, sua função de transição é dada por:
Pode-se mostrar que AFND comum e um AFND com transições ε são equivalentes e, assim, dado qualquer AFND comum, pode-se construir um AFND com transições ε que reconhece a mesma linguagem e vice-versa.
A máquina começa no estado inicial especificado e lê uma cadeia de símbolos do seu alfabeto. O autômato usa a função de transição de estado para determinar o próximo estado usando o estado atual e o símbolo que acabou de ser lido, o que inclui a cadeia vazia, no caso dos AFNDs com transições ε. Entretanto, "o próximo estado de um AFND não depende somente do evento atual, mas também de um número arbitrário de eventos subsequentes de entradas. Até esses eventos subsequentes ocorrerem, não é possível determinar onde a máquina de estados está".[2]
O conjunto de todas as cadeias que são aceitas por um AFND é a linguagem que o AFND aceita. Esta linguagem deve ser uma linguagem regular.
Para todo AFND pode ser encontrada um AFD que aceite a mesma linguagem. Portanto, é possível converter um AFND existente em um AFD com o propósito de implementar (talvez) uma máquina mais simples. Isto pode ser realizado usando a construção do conjunto das partes, o que pode levar a um aumento exponencial no número de estados necessários. Uma prova formal desta construção do conjunto das partes pode ser encontrada aqui.
Muitas vezes, pode ser mais fácil construir um AFND do que um AFD equivalente, tanto pelo entendimento como pelo tamanho da construção. AFNDs são comumente introduzidos no início de cursos de informática teórica para desenvolver a ideia de não-determinismo em modelos computacionais mais poderosos, como as máquina de Turing.
Seja um AFND e uma cadeia do alfabeto.
Diz-se que aceita se podemos escrever como onde cada e existe uma sequência de estados em seguindo as três condições a seguir:
Para todo escreve-se se e somente se pode ser alcançado a partir de através de zero ou mais transições . Em outras palavras, se e somente se existe onde tal que
Para qualquer , o conjunto de estados que podem ser alcançados a partir de p é chamado de fecho-epsilon ou fecho-ε de p, e é escrito como
Para qualquer subconjunto , define-se o fecho-ε de P como
As transições ε são transitivas, de modo que pode ser demonstrado que, para todo e , se e , então .
Igualmente, se e então
Seja uma cadeia sobre o alfabeto . Um AFND-ε aceita a cadeia se existe tanto uma representação de na forma , onde , como uma sequência de estados , onde , seguindo as seguintes condições:
Existem várias maneiras de implementar um AFND:
O diagrama de estados para M é:
M pode ser visto como a união de dois AFDs: um com os estados {S1, S2} e o outro com os estados {S3, S4}.
A linguagem de M pode ser descrita pela linguagem regular dada por esta expressão regular .
Criar o diagrama do AFND da linguagem L = {w | w termina em 00} com 3 estados. Resposta: O estado inicial é de não aceitação e fica em loop recebendo 1's e 0's até que ele "adivinha" de forma não determinística que um 0 recebido é o penúltimo 0 da cadeia, e assim, passa para o segundo estado, que por sua vez, recebe o último zero e passa para o estado final de aceitação, que não tem nenhuma transição partindo dele, e caso recebe um outro símbolo, o ramo da computação morre.
(Exemplo de exercícío não resolvido do Sipser).
Criar o diagrama do AFND da linguagem U = { w | w é 0* } com 1 estado. Resposta: O estado inicial é o estado de aceitação e tem apenas 1 transição, que é para ele mesmo, no caso de ler o símbolo 0 da entrada. Caso outro símbolo seja lido, o ramo da computação morre. Neste caso, o não determinismo está associado a não ter uma transição para todos os símbolos do alfabeto. Fazendo um comparativo com o AFD, seria necessário criar um outro estado que é alcançado caso o estado inicial leia 1 da entrada, e que possui um loop para ele mesmo ao receber 0's e 1's.
(Exemplo de exercício não resolvido do Sipser).
Criar do diagrama do AFND da linguagem A = { w | w = {0}} com 2 estados. Resposta: O estado inicial é estado de não aceitação e tem uma transição para o estado final de aceitação ao ler o símbolo 0 da entrada. O estado final de aceitação não possui transições para nenhum outro estado. Caso o estado inicial leia o símbolo 1 da entrada ou o estado final ler 0 ou 1, o ramo da computação morre.
(Exemplo de exercício não resolvido do Sipser).
Criar o diagrama do AFND da linguagem B = { w | w = vazio } com 1 estado. Resposta: Só há 1 estado que é o estado de aceitação. Não há nenhuma transição. Se o estado receber qualquer símbolo, o ramo da computação morre.
(Exemplo de exercício não resolvido do Sipser).
AFNDs e AFDs são equivalentes tal que se uma linguagem é reconhecida por um AFND, ela também é reconhecida por um AFD e vice versa. O estabelecimento de tal equivalência é importante e útil. É útil porque construir um AFND que reconhece uma dada linguagem é algumas vezes mais fácil do que construir um AFD para aquela linguagem. Isso é importante porque AFNDs podem ser usadas para reduzir a complexidade do trabalho matemático necessário para estabelecer muitas propriedades importantes na teoria da computação. Por exemplo, é muito mais fácil provar as propriedades que seguem usando AFNDs do que AFDs:
A ideia da prova parte do princípio de que, tendo duas linguagens regulares e os AFNDs que as reconhecem, podemos tomar os dois AFNDs e combiná-los com um terceiro AFND que aceita sua entrada de qualquer um dos dois AFNDs prévios a aceita. A prova formal pode ser encontrada aqui.
Sendo dois AFNDs iniciais e , a ideia da prova consiste em construir um novo AFND usando a estrutura de e na construção. O novo AFND possui como estado inicial, o estado inicial do AFND e possui toda a estrutura de , com os estados de aceitação de transformados em estados de não-aceitação possuidores de transições para o estado inicial de . O novo AFND, por conseguinte, também possui toda a estrutura de , e seus estados de aceitação são os mesmos de . Dessa forma, a entrada sempre poderá ser quebrada em duas partes não-deterministicamente, e só será aceita se puder ter a primeira parte aceita por e a segunda por .
Sendo o AFND inicial , é construído um novo AFND que modifica a estrutura de para fazer com que os estados de aceitação deste possuam, cada um, uma transição para o estado inicial de . Adicionalmente, cria-se um novo estado de aceitação que passa a ser o estado inicial de , este possuindo uma transição para o estado inicial antigo (estado inicial de ).
É importante notar que a construção de a partir da mera adição do estado inicial de ao conjunto dos estados de aceitação não provaria o que é proposto, pois há casos nos quais certas cadeias indesejadas seriam aceitas. Um exemplo de linguagem cuja computação nessa construção leva a uma falha é a linguagem .
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.