Autómatos finitos
DFA como quíntuplo, NFA com epsilon, construção de subconjuntos e minimização.
Nesta página
Um autómato finito é uma máquina com memória limitada: um conjunto finito de estados, um estado inicial e uma regra que diz, para cada estado e cada símbolo lido, para onde ir. Não tem pilha nem fita, só o estado atual. Esta página mostra os dois sabores (determinístico e não determinístico) e três construções que tens de saber executar: de NFA para DFA, minimização e teste de equivalência.
DFA: definição e leitura
Um autómato finito determinístico (DFA) é um quíntuplo onde:
- é o conjunto finito de estados;
- é o alfabeto;
- é a função de transição (para cada estado e símbolo, exatamente um destino);
- é o estado inicial;
- é o conjunto de estados de aceitação.
aceita a palavra se, começando em e seguindo símbolo a símbolo, terminar num estado de . A linguagem reconhecida é o conjunto das palavras aceites.
Exemplo: palavras sobre que terminam em . Dois estados chegam: (“último símbolo visto não foi ”, que também é o início) e (“último símbolo foi ”).
Estados: q0 (inicial), q1 (aceitação)
Transições:
q0 --0--> q0
q0 --1--> q1
q1 --0--> q0
q1 --1--> q1
Testa : , que é de aceitação, por isso . Testa : , rejeitada. E : fica em , rejeitada, o que está certo porque não termina em .
NFA: adivinhar com epsilon
Um autómato finito não determinístico (NFA) permite, para o mesmo estado e símbolo, zero, uma ou várias transições, mais transições epsilon () que mudam de estado sem consumir símbolo. Formalmente, devolve um conjunto de destinos.
Um NFA aceita se existir pelo menos um caminho etiquetado por (ignorando os ) do estado inicial até um estado de aceitação. É um “adivinhar bem”: basta um caminho com sorte.
Exemplo: palavras sobre que terminam em . O NFA adivinha onde começa o sufixo final:
Estados: p0 (inicial), p1, p2 (aceitação)
Transições:
p0 --0,1--> p0 (consome qualquer prefixo)
p0 --0--> p1 (adivinha: aqui começa o 01 final)
p1 --1--> p2
p2 --(nada)--> _ (sem saídas: se vier mais símbolo, este caminho morre)
Para : o caminho aceita. Repara que outros caminhos morrem (por exemplo ficar sempre em ), mas um basta. Os NFA são quase sempre mais pequenos e mais fáceis de inventar que o DFA equivalente.
De NFA para DFA: construção de subconjuntos
Todo o NFA tem um DFA equivalente. A ideia: o DFA simula todos os caminhos do NFA em paralelo, e cada estado do DFA é o conjunto dos estados onde o NFA poderia estar. Os passos:
- O estado inicial do DFA é o fecho epsilon do estado inicial do NFA (todos os alcançáveis só com transições ).
- Para cada estado-conjunto e cada símbolo : o destino é o fecho epsilon de todos os destinos por a partir de estados de .
- Um estado-conjunto é de aceitação se contiver pelo menos um estado de aceitação do NFA.
Exemplo resolvido. NFA com estados , inicial , aceitação , transições: , , sem saídas, sem transições .
- Inicial do DFA: fecho epsilon de . Chama-lhe .
- De com : destinos , fecho . Novo estado .
- De com : destinos , ou seja .
- De com : de sai , de nada. Resultado .
- De com : de sai . Resultado .
- Aceitação: contém , logo é final; não.
DFA resultante:
A = {p} (inicial)
B = {p,q} (aceitação)
A --0--> B, A --1--> A
B --0--> B, B --1--> A
Reconheces a linguagem? É “palavras que contêm pelo menos um ”: o significa “já vi um ”. O método funciona sempre, mas pode gerar até estados para um NFA de estados. Na prática só constróis os alcançáveis a partir do inicial, como acima.
Minimização por preenchimento de tabela
O DFA mínimo para uma linguagem é único (a menos de nomes de estados). Para o obter, elimina estados inalcançáveis e depois funde estados equivalentes (indistinguíveis por qualquer sufixo). O algoritmo de preenchimento de tabela:
- Marca todos os pares (estado final, estado não final): são distinguíveis por .
- Repete: se para algum símbolo o par já está marcado, marca .
- Os pares nunca marcados fundem-se.
Exemplo resolvido. DFA com estados (inicial), , (final), alfabeto :
A --0--> B, A --1--> C
B --0--> B, B --1--> C
C --0--> B, C --1--> C
Pares: , , .
- Base: é final, e não. Marca e .
- Par : com , vai para , par igual (nunca marcado); com , vai para , igual. Nenhum símbolo leva a par marcado, por isso fica por marcar.
- Funde e num estado . O DFA mínimo tem dois estados:
AB --0--> AB, AB --1--> C
C --0--> AB, C --1--> C
Isto reconhece “palavras que terminam em ”, e dois estados são o mínimo (é preciso distinguir “termina em ” de “não termina em ”).
Teste de equivalência
Dois DFA e são equivalentes quando . Para testar, constrói o DFA produto (pares de estados, transição componente a componente) e verifica se algum estado alcançável é “um final e outro não”. Se nenhum existir, são equivalentes. Como bónus, o mesmo produto com a condição de aceitação “ambos finais” reconhece a interseção, o que prova que as linguagens regulares são fechadas para interseção. O fecho e os limites destas linguagens são o tema de limites das linguagens regulares.
Para levar para a próxima página
DFA, NFA e expressões regulares descrevem exatamente a mesma família de linguagens. Mas nem todas as linguagens são regulares, e provar que uma linguagem fica de fora exige uma ferramenta nova: o lema da repetição.