NFA e transições vazias

Percursos alternativos, fecho-ε, determinização e complemento de uma linguagem reconhecida por NFA.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

No DFA do sufixo abab, cada letra determina o próximo estado. Um NFA pode manter o ciclo que lê o prefixo e, ao mesmo tempo, começar um ramo que tenta verificar o sufixo; uma escolha errada bloqueia esse ramo, mas basta um ramo consumir a palavra toda e terminar num final.

Aceitação é existência de um percurso

Um NFA tem os mesmos cinco componentes de um DFA, mas

δ:Q×Σ→P(Q).\delta:Q\times\Sigma\to\mathcal P(Q).

O destino é um conjunto: pode conter zero, um ou vários estados. P(Q)\mathcal P(Q) é o conjunto de todos os subconjuntos de QQ. Um ramo sem transição morre, sem impedir que outro ramo aceite.

Um NFA aceita ww se existe pelo menos um percurso de q0q_0 até um estado final que lê exatamente ww. Não exige que todos os percursos aceitem, e não pode aceitar deixando símbolos por ler.

Para o sufixo 0101, com conjuntos de estados fáceis de seguir, usa esta tabela:

Estado0011
pp inicial{p,q}\{p,q\}{p}\{p\}
qq∅\emptyset{r}\{r\}
rr final∅\emptyset∅\emptyset

O ciclo em pp lê o prefixo. A transição p→0qp\xrightarrow{0}q escolhe o início do sufixo. Como rr não tem saídas, essa escolha só aceita se o 11 for a última letra.

Para simular sem adivinhar, mantém o conjunto de estados possíveis. Se SS é o conjunto atual, depois de ler aa tens ⋃q∈Sδ(q,a)\bigcup_{q\in S}\delta(q,a). Para 001001:

{p}→0{p,q}→0{p,q}→1{p,r}.\{p\}\xrightarrow{0}\{p,q\} \xrightarrow{0}\{p,q\} \xrightarrow{1}\{p,r\}.

Como o conjunto final contém rr, a palavra é aceite. Com mais um 00, chegas a {p,q}\{p,q\} e a palavra 00100010 é rejeitada.

Experimenta 001001 e 00100010. O laboratório mantém todos os ramos: chegar a rr antes do fim não basta. Abre o editor para acrescentar um destino ou alterar os estados finais.

NFA: segue todos os estados ativos. Aceita se, depois de consumir toda a palavra, algum for final (círculo duplo). Uma transição em falta elimina apenas esse ramo.

0, 101pinícioqr
Editar estados e transições

Até 12 estados, 8 símbolos e 128 símbolos de entrada. Edições e resultados ficam neste dispositivo durante esta visita.

Pronta para executar. Estados iniciais ativos {p}.

Construir um NFA por adivinhação

Para reconhecer palavras binárias cujo antepenúltimo símbolo é 11, adivinha onde começa esse sufixo de comprimento 3. Usa quatro estados em linha: pp repete 0,10,1; num 11 pode saltar para qq; depois q→0,1r→0,1sq \xrightarrow{0,1} r \xrightarrow{0,1} s, com ss final e sem saídas.

Para 11011101, o ramo que salta no segundo 11 lê depois 0101 e aceita em ss, e o ramo que salta no primeiro 11 lê depois 101101 e bloqueia por falta de transição, sem que isso impeça a aceitação. Também 11001100 é aceite, pois o segundo 11 é o antepenúltimo símbolo e o ramo que o escolhe lê os dois 00 até ss.

Já 10001000 é rejeitada: o salto no único 11 chega a ss depois de ler dois 00, mas resta um terceiro 00 e ss não tem saídas. A palavra vazia e as palavras com menos de três símbolos são rejeitadas pelo mesmo motivo, porque nenhum ramo chega a ss.

Este é o padrão de adivinhação: um ciclo consome o prefixo, uma transição escolhe a posição relevante, e uma cauda curta verifica o sufixo. A determinização transforma essa adivinhação em conjuntos de estados possíveis.

De NFA para DFA: construção de subconjuntos

O DFA equivalente guarda um conjunto inteiro como um único estado. O estado inicial é {q0}\{q_0\} e a transição é:

δD(S,a)=⋃q∈SδN(q,a).\delta_D(S,a)=\bigcup_{q\in S}\delta_N(q,a).

Um subconjunto é final se intersecta FF. A tabela do exemplo fica:

Estado do DFA0011Final?
A={p}A=\{p\} inicialBBAANão
B={p,q}B=\{p,q\}BBCCNão
C={p,r}C=\{p,r\}BBAASim

Constrói a tabela por rondas, mantendo uma lista de trabalho:

  1. Começa com o subconjunto inicial {q0}\{q_0\}.
  2. Para cada subconjunto na lista e cada letra, calcula a união dos destinos e o seu fecho, se houver transições vazias.
  3. Acrescenta à lista os subconjuntos novos e repete até não surgir nenhum.
  4. Marca como final cada subconjunto que intersecta FF.

Só precisas dos subconjuntos alcançáveis, não de desenhar todos os 2∣Q∣2^{|Q|} candidatos. O conjunto vazio, se aparecer, é um estado poço como os outros: a união de destinos a partir dele continua vazia. O limite geral é 2∣Q∣2^{|Q|} estados, e não 2∣Q∣2|Q|. Neste exemplo só surgem três.

Transições ε e fecho-ε

Num ε-NFA, permite δ:Q×(Σ∪{ε})→P(Q)\delta:Q\times(\Sigma\cup\{\varepsilon\})\to\mathcal P(Q). Uma transição ε\varepsilon muda de estado sem consumir entrada.

O fecho-ε\varepsilon E(S)E(S) contém todos os estados alcançáveis de algum estado de SS com zero ou mais transições vazias. Inclui sempre SS. Para o calcular, começa com SS e segue saídas vazias até não encontrar estados novos. Um ciclo vazio não impede o algoritmo de terminar, porque há finitos estados e cada estado entra uma vez no conjunto.

Considera a máquina para a∗b∗a^*b^*:

E({p})={p,q}E(\{p\})=\{p,q\} e E({q})={q}E(\{q\})=\{q\}. A palavra vazia é aceite porque o fecho do início contém um final. A transição vazia não obriga a mudar para qq; o ramo em pp continua disponível para ler mais aa.

Compara a entrada vazia, aabaab e abbaabba. Cada linha mostra os destinos que consomem a letra e o fecho-ε desses destinos. No editor, o símbolo ε está disponível sem pertencer ao alfabeto.

ε-NFA: segue todos os estados ativos. Aceita se, depois de consumir toda a palavra, algum for final (círculo duplo). ε não consome entrada; calcula-se o fecho no início e após cada símbolo.

aεbpinícioq
Editar estados e transições

Até 12 estados, 8 símbolos e 128 símbolos de entrada. Edições e resultados ficam neste dispositivo durante esta visita.

Pronta para executar. Estados iniciais ativos {p, q}.

Determinizar com fechos

Agora, o estado inicial do DFA é E({q0})E(\{q_0\}), e cada passo é:

δD(S,a)=E(⋃q∈Sδ(q,a)).\delta_D(S,a)=E\left(\bigcup_{q\in S}\delta(q,a)\right).

Os conjuntos guardados já estão fechados. Se começares por um conjunto arbitrário não fechado, aplica o fecho antes de consumir a letra também.

Para a máquina anterior:

EstadoaabbFinal?
A={p,q}A=\{p,q\} inicialAABBSim
B={q}B=\{q\}CCBBSim
C=∅C=\emptysetCCCCNão

O aa em BB leva ao poço porque, depois de começar os bb, não pode haver outro aa. Simular abbaabba percorre A,A,B,B,CA,A,B,B,C e rejeita. aabaab termina em BB e aceita.

Para eliminar apenas as transições vazias, mantendo um NFA, podes definir

δ′(q,a)=E(⋃p∈E({q})δ(p,a))\delta'(q,a)=E\left(\bigcup_{p\in E(\{q\})}\delta(p,a)\right)

e marcar qq como final quando E({q})∩F≠∅E(\{q\})\cap F\ne\emptyset. Isto também preserva a aceitação da palavra vazia.

Complementar depois de determinizar

Trocar finais e não finais num NFA não produz, em geral, o complemento. A aceitação exige algum ramo final; a rejeição exige que nenhum ramo seja final. Trocar estados não troca esses quantificadores.

O procedimento correto é construir o DFA completo equivalente e trocar os finais nesse DFA. No exemplo a∗b∗a^*b^*, apenas CC fica final. Assim, abbaabba passa a ser aceite, enquanto aabaab e ε\varepsilon passam a ser rejeitadas.

DFA, NFA e ε-NFA reconhecem a mesma classe, as linguagens regulares. O não determinismo pode reduzir o tamanho da descrição, mas não aumenta o poder deste modelo. Para aumentar a descrição sem mudar o poder, a conversão por Thompson segue a direção inversa.

Exercícios

Os problemas são originais, salvo as adaptações identificadas no enunciado.

Fechos num ciclo

Um ε-NFA tem estados p,q,r,sp,q,r,s e apenas as transições vazias p→qp\to q, q→rq\to r e r→qr\to q. Calcula E({p})E(\{p\}), E({r})E(\{r\}) e E({p,s})E(\{p,s\}). Explica como garantir que o cálculo termina.

Pista

Segue só as setas vazias, na direção indicada.

Solução

De pp, chegamos a qq e depois a rr, logo E({p})={p,q,r}E(\{p\})=\{p,q,r\}. De rr, chegamos a qq e voltamos a rr, mas nunca chegamos a pp: E({r})={q,r}E(\{r\})=\{q,r\}. O estado ss não tem saídas e pertence ao próprio fecho, por isso E({p,s})={p,q,r,s}E(\{p,s\})=\{p,q,r,s\}.

Mantemos um conjunto de visitados e uma lista dos estados novos ainda por explorar. Cada estado entra na lista uma única vez. O ciclo não acrescenta estados depois de visitar q,rq,r, e há apenas quatro estados.

Confere a tua resposta:

  • Incluí os estados de partida em cada fecho.
  • Respeitei a direção das arestas, sem chegar de r a p.
  • Justifiquei terminação com estados visitados.
Voltar à explicação
Trocar finais?

Um NFA tem, para a mesma palavra, um percurso final e um percurso não final. Trocar todos os estados finais com os não finais rejeita necessariamente essa palavra?

A tua resposta

Pista

Antes e depois da troca, pergunta se existe algum percurso final.

Mais uma pista

O percurso antes não final passa a final; o percurso antes final passa a não final.

Solução

Não. Antes existe um ramo aceitante; depois também existe, agora pelo outro percurso. A palavra é aceite pelas duas máquinas, portanto a segunda não reconhece o complemento. O complemento obtém-se num DFA completo equivalente.

  • Não; determiniza, completa e só depois troca finais.. A aceitação existencial do NFA não se complementa trocando estados.
  • Sim, qualquer NFA pode ser complementado dessa forma.. Uma palavra pode ter simultaneamente um ramo final e outro não final.
  • Não existe autómato para o complemento.. O complemento de uma regular é regular.

Erros frequentes

Não troques a existência de um ramo por aceitação de todos os ramos.

Voltar à explicação
Determinizar uma tabela

Um NFA tem início pp, final qq, e transições δ(p,a)={p,q}\delta(p,a)=\{p,q\}, δ(p,b)={p}\delta(p,b)=\{p\}, δ(q,a)=δ(q,b)=∅\delta(q,a)=\delta(q,b)=\emptyset. Constrói o DFA equivalente e descreve a linguagem.

Pista

Começa em {p}\{p\} e calcula as uniões de destinos.

Mais uma pista

De {p,q}\{p,q\}, a dá {p,q}\{p,q\} e b dá {p}\{p\}.

Solução

Os estados são A={p}A=\{p\} e B={p,q}B=\{p,q\}. Ambos levam a B por a e a A por b. A é inicial e B é o único final. Portanto, reconhece as palavras terminadas em a. O ramo que sai de p para q tem de ler a última letra, porque q não tem saídas.

Confere a tua resposta:

  • Obtém exatamente os dois subconjuntos alcançáveis.
  • Dá uma saída por letra para cada subconjunto.
  • Marca como final todo subconjunto que contém q.

Erros frequentes

Não marques A como final só porque alcança q. Não acrescentes o vazio se ele não for alcançável neste exemplo.

Voltar à explicação
Fechar antes e depois

Um ε-NFA sobre {a,b}\{a,b\} tem início pp, único final rr e apenas estas transições: p→εqp\xrightarrow{\varepsilon}q, q→aqq\xrightarrow{a}q, q→brq\xrightarrow{b}r, r→εqr\xrightarrow{\varepsilon}q. Constrói a tabela do DFA completo equivalente. A palavra vazia é aceite? E babbab?

Pista

Calcula primeiro os três fechos individuais.

Mais uma pista

E({p})={p,q}E(\{p\})=\{p,q\}, E({q})={q}E(\{q\})=\{q\} e E({r})={q,r}E(\{r\})=\{q,r\}.

Solução

Os estados alcançáveis são A={p,q}A=\{p,q\}, B={q}B=\{q\} e C={q,r}C=\{q,r\}. A tabela é:

EstadoaabbFinal?
AA inicialBBCCNão
BBBBCCNão
CCBBCCSim

Não aparece o conjunto vazio: cada subconjunto alcançável contém qq, que tem saída pelas duas letras. A máquina já é completa. ε\varepsilon acaba em AA e rejeita; babbab segue A,C,B,CA,C,B,C e aceita. A linguagem é a das palavras terminadas em bb.

Confere a tua resposta:

  • Começa no fecho de p, incluindo q.
  • Fecha os destinos depois de cada letra, incluindo q quando chega a r.
  • Justifica por que o vazio não é alcançável e identifica os subconjuntos finais.

Erros frequentes

Não confundas completo com ter obrigatoriamente um poço. Não esqueças a saída vazia de r, que permite ler mais letras depois de o alcançar.

Voltar à explicação
Antepenúltimo bit

Constrói um NFA para palavras binárias cujo antepenúltimo símbolo é 11. Dá todas as transições e o único final. Segue 11011101, 11001100, 10001000 e ε\varepsilon, indicando um ramo aceitante quando exista.

Pista

Conta quantas letras restam depois de cada possível salto.

Solução

Usa início pp e único final ss. As transições são δ(p,0)={p}\delta(p,0)=\{p\}, δ(p,1)={p,q}\delta(p,1)=\{p,q\}, δ(q,0)=δ(q,1)={r}\delta(q,0)=\delta(q,1)=\{r\} e δ(r,0)=δ(r,1)={s}\delta(r,0)=\delta(r,1)=\{s\}. De ss não há saídas.

Em 11011101, o ramo p→1p→1q→0r→1sp\xrightarrow{1}p\xrightarrow{1}q\xrightarrow{0}r\xrightarrow{1}s aceita. Em 11001100, o mesmo salto no segundo 11 lê 0000 e também aceita. Em 10001000, o único salto para qq chega a ss com um 00 por ler, pelo que falha. O ramo que permanece em pp não é final. ε\varepsilon termina em pp e rejeita.

Cada ramo que chega a ss consumiu exatamente duas letras após escolher um 11. Inversamente, quando o antepenúltimo bit é 11, o ramo que o escolhe termina em ss depois da última letra.

Confere a tua resposta:

  • Dei a tabela completa do NFA, com conjuntos vazios em s.
  • Aceitei 1101 e 1100 pelo salto no segundo 1.
  • Rejeitei 1000 por entrada restante e ε por início não final.
  • Justifiquei a condição em ambas as direções.
Voltar à explicação

Experimentar as construções

Depois de resolver os problemas, compara os conjuntos do teu DFA com a execução do ε-NFA de «Fechar antes e depois» e do NFA de «Antepenúltimo bit». Em Resolver exercício, corrige a transição alterada ou constrói a tua máquina do zero. A verificação procura uma palavra que distinga a tua máquina da referência.

ε-NFA: segue todos os estados ativos. Aceita se, depois de consumir toda a palavra, algum for final (círculo duplo). ε não consome entrada; calcula-se o fecho no início e após cada símbolo.

εabεpinícioqr
Editar estados e transições

Até 12 estados, 8 símbolos e 128 símbolos de entrada. Edições e resultados ficam neste dispositivo durante esta visita.

Pronta para executar. Estados iniciais ativos {p, q}.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

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

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

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.