Estudo sobre autômatos finitos não determinísticos (AFND), baseado em exercício para a cadeira de "Linguagens e Autômatos", do professor França (Uni7).
Ser um Autômato Finito Não Determinístico (AFND) significa que não há como saber
exatamente como será o caminho, já que há a possibilidade de mais de um caminho,
ou seja, um conjunto de novos estados.
Segue, abaixo, 03 (três) exemplos de Autômatos Finitis Não Determinísticos (AFND),
de modo a auxiliar na fixação do conteúdo:
-
Exemplo 1
Com base nesse diagrama, sempre será iniciado com aa ou ab, mas nunca como bb. Dado que há, a partir de q0, há mais de um caminho, ou seja, posso fazer o "a" ou o "b" através de mais de uma forma, temos um AFND.
Agora, vamos testar:
Como resultado, temos que:
Analisando o diagrama, é facilmente perceptível que:
- Não há como iniciar com "b", já que o único caminho, nesse momento, é com "a";
- Não é possível "aba", pois é menor do que o caminho;
- Não é possível "abab", pois se utilizasse o loop, não chegaria ao fim, e se seguisse no caminho, no "q2", não há opção para "a";
- Não é possível "aab", pois é menor do que o caminho e, mesmo que fosse maior (aaba), no "q1", não há opção para "b";
Temos, portanto, a seguinte Tabela de Transição:
:δ: a b start
{q0}
-
q0
{q0, q1}
{q0, q2}
q1
{q3}
-
q2
-
{q3}
q3
{q3}
{q3}
-
Exemplo 2
Agora, vamos fazer um conjunto de palavras com sufixo "abcd" ou "badc". Como há a possibilidade de mais de um caminho para "a" e para "b", em "start", trata-se de caso de Autômato Finito Não Determinístico (AFND).
É hora de testar:
Vamos para o resultado:
Sigamos para a análise:
- É possível iniciar com "a", "b", "c", "d", sendo o início com a" e "b" claros exemplos de AFND;
- "abcd" dá certo porque segue o fluxo normal, tradicional;
- "aabcd" funciona porque faz um loop em start (a) e, depois, segue o fluxo normal em s0-s1-s2-s3;
- "babcd" é aceito porque faz um loop em start (b) e, depois segue no "abcd" em s0-s1-s2-s3;
- "bbadc" é possível porque faz um loop em start (b) e, depois, segue no padrão em "badc" em s4-s5-s6-s7;
- "cabcd" também dá certo porque faz um loop em start (c) e, depois, segue o formato "abcd" em s0-s1-s2-s3;
- "dbadc" também faz loop em start (d) e, posteriormente, segue no fluxo "badc" em s4-s5-s6-s7;
- "dcabc" não funciona porque, apesar de fazer o loop em start ("d" e "c"), segue no "abc" (s0-s1-s2), mas não chega ao fim (s3);
- "cdadc" não é aceito porque, mesmo fazendo o loop em start ("c" e "d"), segue no "a" (s0), mas não tem "d" nesse caminho. A outra hipótese, seria fazer o loop também no start (a), mas também seria barrado no d;
Temos, portanto, a seguinte Tabela de Transição:
:δ: a b c d start
{start, s0}
{start, s4}
{start}
{start}
s0
-
{s1}
-
-
s1
-
-
{s2}
-
s2
-
-
-
{s3}
s3
-
-
-
-
s4
{s5}
-
-
-
s5
-
-
-
{s6}
s6
-
-
{s7}
-
s7
-
-
-
-
-
Exemplo 3
Vamos para um AFND mais simples, dessa vez, com dupla possibilidade de caminho em s0 e s2, de modo ao aprendizado ficar bem fácil.
Chegou o momento de testarmos:
Vejamos como ficou:
Conclusões tiradas disso:
- Sempre deve ser iniciado com "a", pos do start para o s0, o caminho é apenas "a";
- "aaaaaaaaaaab" porque usa o primeiro "a" para chegar em s0. Os demais a podem ser utilizados em s0, desde que sobre dois "a" para chegar até s2 e concluir com o "b" em loop;
- "abbbbbaaa" funciona porque faz o caminho de start para s0 (a) e, posteriormente, fica fazendo loop em s0 (bbbbb). Posteriormente, Escolhe fazer um loop em s0 (a) e seguri para s1 e, depois para s2, ou já segue para s1 (a), s2 (a) e, depois faz um loop em s2;
- "bbaaa" não funciona porque do start para s0, é um "a", logo, fica sem ter como seguir;
- "aabb" não é aceito porque, apesaar de seguir do start para s0 (a), e conseguir fazer um loop em s0 (a) ou seguir para s1 (a), não consegue chegar em s2, pois s2 somente aceita "a";
Segue, então, a Tabela de Transição:
:δ: a b start
{s0}
-
s0
{s0, s1}
{s0}
s1
{s2}
-
s2
{s2}
{s2}
`Os testes foram realizados através do Automaton Simulator.