Conteúdos da cadeira

Autómatos finitos

DFA como quíntuplo, NFA com epsilon, construção de subconjuntos e minimização.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
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 M=(Q,Σ,δ,q0,F)M = (Q, \Sigma, \delta, q_0, F) onde:

  • QQ é o conjunto finito de estados;
  • Σ\Sigma é o alfabeto;
  • δ:Q×ΣQ\delta: Q \times \Sigma \to Q é a função de transição (para cada estado e símbolo, exatamente um destino);
  • q0Qq_0 \in Q é o estado inicial;
  • FQF \subseteq Q é o conjunto de estados de aceitação.

MM aceita a palavra ww se, começando em q0q_0 e seguindo δ\delta símbolo a símbolo, terminar num estado de FF. A linguagem reconhecida L(M)L(M) é o conjunto das palavras aceites.

Exemplo: palavras sobre {0,1}\{0, 1\} que terminam em 11. Dois estados chegam: q0q_0 (“último símbolo visto não foi 11”, que também é o início) e q1q_1 (“último símbolo foi 11”).

Estados: q0 (inicial), q1 (aceitação)
Transições:
  q0 --0--> q0
  q0 --1--> q1
  q1 --0--> q0
  q1 --1--> q1

Testa w=01w = 01: q00q01q1q_0 \xrightarrow{0} q_0 \xrightarrow{1} q_1, que é de aceitação, por isso 01L(M)01 \in L(M). Testa w=10w = 10: q01q10q0q_0 \xrightarrow{1} q_1 \xrightarrow{0} q_0, rejeitada. E ε\varepsilon: fica em q0q_0, rejeitada, o que está certo porque ε\varepsilon não termina em 11.

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 (ε\varepsilon) que mudam de estado sem consumir símbolo. Formalmente, δ:Q×(Σ{ε})P(Q)\delta: Q \times (\Sigma \cup \{\varepsilon\}) \to \mathcal{P}(Q) devolve um conjunto de destinos.

Um NFA aceita ww se existir pelo menos um caminho etiquetado por ww (ignorando os ε\varepsilon) do estado inicial até um estado de aceitação. É um “adivinhar bem”: basta um caminho com sorte.

Exemplo: palavras sobre {0,1}\{0, 1\} que terminam em 0101. 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 w=001w = 001: o caminho p00p00p11p2p_0 \xrightarrow{0} p_0 \xrightarrow{0} p_1 \xrightarrow{1} p_2 aceita. Repara que outros caminhos morrem (por exemplo ficar sempre em p0p_0), 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:

  1. O estado inicial do DFA é o fecho epsilon do estado inicial do NFA (todos os alcançáveis só com transições ε\varepsilon).
  2. Para cada estado-conjunto SS e cada símbolo aa: o destino é o fecho epsilon de todos os destinos por aa a partir de estados de SS.
  3. Um estado-conjunto é de aceitação se contiver pelo menos um estado de aceitação do NFA.

Exemplo resolvido. NFA com estados {p,q}\{p, q\}, inicial pp, aceitação {q}\{q\}, transições: p0{p,q}p \xrightarrow{0} \{p, q\}, p1{p}p \xrightarrow{1} \{p\}, qq sem saídas, sem transições ε\varepsilon.

  • Inicial do DFA: fecho epsilon de {p}={p}\{p\} = \{p\}. Chama-lhe A={p}A = \{p\}.
  • De AA com 00: destinos {p,q}\{p, q\}, fecho {p,q}\{p, q\}. Novo estado B={p,q}B = \{p, q\}.
  • De AA com 11: destinos {p}\{p\}, ou seja AA.
  • De BB com 00: de pp sai {p,q}\{p, q\}, de qq nada. Resultado {p,q}=B\{p, q\} = B.
  • De BB com 11: de pp sai {p}\{p\}. Resultado {p}=A\{p\} = A.
  • Aceitação: BB contém qq, logo BB é final; AA 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 00”: o BB significa “já vi um 00”. O método funciona sempre, mas pode gerar até 2n2^n estados para um NFA de nn 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:

  1. Marca todos os pares (estado final, estado não final): são distinguíveis por ε\varepsilon.
  2. Repete: se para algum símbolo aa o par (δ(p,a),δ(q,a))(\delta(p,a), \delta(q,a)) já está marcado, marca (p,q)(p, q).
  3. Os pares nunca marcados fundem-se.

Exemplo resolvido. DFA com estados AA (inicial), BB, CC (final), alfabeto {0,1}\{0,1\}:

  A --0--> B,  A --1--> C
  B --0--> B,  B --1--> C
  C --0--> B,  C --1--> C

Pares: (A,B)(A,B), (A,C)(A,C), (B,C)(B,C).

  1. Base: CC é final, AA e BB não. Marca (A,C)(A,C) e (B,C)(B,C).
  2. Par (A,B)(A,B): com 00, vai para (B,B)(B,B), par igual (nunca marcado); com 11, vai para (C,C)(C,C), igual. Nenhum símbolo leva a par marcado, por isso (A,B)(A,B) fica por marcar.
  3. Funde AA e BB num estado ABAB. 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 11”, e dois estados são o mínimo (é preciso distinguir “termina em 11” de “não termina em 11”).

Teste de equivalência

Dois DFA M1M_1 e M2M_2 são equivalentes quando L(M1)=L(M2)L(M_1) = L(M_2). 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.

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

Álgebra, lógica e uma ideia de cada vez.

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.