Autómatos finitos

Estados com significado, função de transição, construção de DFA e provas de correção.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Para saber se uma palavra termina em abab, chega guardar o sufixo útil do prefixo lido. Depois de baabaa, interessa o último aa; depois de baabbaab, interessa abab. Um autómato finito guarda esse resumo num estado.

A expressão (a+b)∗ab(a+b)^*ab descreve a mesma condição por blocos. Aqui vamos construir a máquina que a verifica letra a letra.

DFA: definição e leitura

Um autómato finito determinístico, DFA, é M=(Q,Σ,δ,q0,F)M=(Q,\Sigma,\delta,q_0,F):

  • QQ é um conjunto finito e não vazio de estados;
  • Σ\Sigma é o alfabeto de entrada;
  • δ:Q×Σ→Q\delta:Q\times\Sigma\to Q é a função de transição;
  • q0∈Qq_0\in Q é o estado inicial;
  • F⊆QF\subseteq Q é o conjunto de estados finais, ou de aceitação.

Nesta definição, δ\delta é total: existe exatamente um destino para cada par estado/símbolo. Um desenho incompleto abrevia transições para um estado poço, do qual nunca se sai. Uma transição ausente não significa que a máquina ignore a letra.

No diagrama, uma seta sem origem marca o início e um círculo duplo marca um estado final. Entrar num estado final a meio da palavra não termina a leitura, porque a aceitação depende do estado depois de consumir toda a entrada.

Construir estados com significado

Vamos reconhecer L={w∈{a,b}∗∣w termina em ab}L=\{w\in\{a,b\}^*\mid w\text{ termina em }ab\}. Escolhe:

  • q0q_0: não há um sufixo útil, incluindo o início;
  • q1q_1: o prefixo lido termina em aa;
  • q2q_2: o prefixo lido termina em abab.
EstadoLê aaLê bbFinal?
q0q_0 inicialq1q_1q0q_0Não
q1q_1q1q_1q2q_2Não
q2q_2q1q_1q0q_0Sim

Em q1q_1, outro aa mantém o sufixo útil aa. Em q2q_2, um bb transforma o sufixo abab em abbabb, que já não termina em abab nem em aa.

A ligação entre q1q_1 e q2q_2 lê bb no sentido descendente e aa no ascendente. A palavra baabbaab segue por isso q0,q0,q1,q1,q2q_0,q_0,q_1,q_1,q_2 e é aceite, enquanto abaaba passa em q2q_2 mas termina em q1q_1 e é rejeitada; ε\varepsilon termina no estado inicial, que não é final.

Construir e testar o DFA

Edita os estados, o estado inicial, os finais e as transições no laboratório. Cada par estado/símbolo precisa de exatamente uma transição: uma tabela incompleta é um erro de construção, não uma rejeição da palavra. Experimenta aba passo a passo para observar a passagem por um estado final antes do fim da entrada.

Em Resolver exercício, corrige a máquina e verifica o comportamento; os exemplos de teste ajudam a localizar erros, enquanto a comparação completa explora todos os pares de estados alcançáveis com a máquina de referência e mostra uma palavra que revela qualquer diferença. Renomear estados ou acrescentar estados inacessíveis não altera a linguagem reconhecida.

DFA: aceita se terminar num estado final, marcado com círculo duplo.

abababq0inícioq1q2
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.

De onde sai cada transição de recuperação

Cada transição responde à mesma pergunta: se o prefixo lido até agora está resumido no estado pp e chega a letra aa, qual é o resumo do prefixo maior? A resposta é sempre o sufixo mais comprido do prefixo maior que ainda seja útil, isto é, aa ou abab.

Estás emChegaPrefixo maior termina emVais para
q0q_0bbsem sufixo útilq0q_0
q1q_1aaaaaa, cujo sufixo útil é aaq1q_1
q2q_2aaabaaba, cujo sufixo útil é aaq1q_1
q2q_2bbabbabb, sem sufixo útilq0q_0

Verifica com palavras concretas: aabaab segue q0,q1,q1,q2q_0,q_1,q_1,q_2 e aceita; abbabb segue q0,q1,q2,q0q_0,q_1,q_2,q_0 e rejeita; abababab visita q2q_2 a meio mas termina em q2q_2 e aceita.

Transição estendida

δ\delta lê um símbolo. Para ler uma palavra, definimos δ^:Q×Σ∗→Q\widehat\delta:Q\times\Sigma^*\to Q:

δ^(q,ε)=q,δ^(q,xa)=δ(δ^(q,x),a).\widehat\delta(q,\varepsilon)=q,\qquad \widehat\delta(q,xa)=\delta(\widehat\delta(q,x),a).

Assim, L(M)={w∈Σ∗∣δ^(q0,w)∈F}L(M)=\{w\in\Sigma^*\mid\widehat\delta(q_0,w)\in F\}. Por exemplo,

δ^(q0,ab)=δ(δ(q0,a),b)=δ(q1,b)=q2.\widehat\delta(q_0,ab)=\delta(\delta(q_0,a),b)=\delta(q_1,b)=q_2.
Ver por que podemos dividir a entrada em qualquer posição

Para quaisquer x,yx,y, vale

δ^(q,xy)=δ^(δ^(q,x),y),\widehat\delta(q,xy)=\widehat\delta(\widehat\delta(q,x),y),

ou seja, podemos continuar a leitura a partir do estado deixado pelo prefixo. Prova por indução em ∣y∣|y|: a base y=εy=\varepsilon dá δ^(q,x)\widehat\delta(q,x) de ambos os lados. Se vale para y=zy=z, então, para y=zay=za:

δ^(q,xza)=δ(δ^(q,xz),a)=δ(δ^(δ^(q,x),z),a)=δ^(δ^(q,x),za).\begin{aligned} \widehat\delta(q,xza) &=\delta(\widehat\delta(q,xz),a)\\ &=\delta(\widehat\delta(\widehat\delta(q,x),z),a)\\ &=\widehat\delta(\widehat\delta(q,x),za). \end{aligned}

A segunda linha usa a hipótese de indução.

Provar que a construção está correta

No DFA anterior, afirma que, após ler xx, a máquina está em q1q_1 se xx termina em aa, em q2q_2 se termina em abab, e em q0q_0 nos restantes casos.

Na base, x=εx=\varepsilon não termina em nenhum desses sufixos, e a máquina está em q0q_0. No passo, acrescentar aa leva sempre a q1q_1. Acrescentar bb leva a q2q_2 exatamente quando antes havia um aa no fim, ou seja, quando estávamos em q1q_1. Nos outros casos leva a q0q_0. A tabela preserva o invariante em cada passo.

Como só q2q_2 é final, o invariante prova as duas direções: todas as palavras aceites terminam em abab, e todas as palavras terminadas em abab são aceites.

Contar por restos

Um DFA não guarda contagens sem limite, mas pode guardar um resto. Para reconhecer palavras binárias cujo valor é múltiplo de 33, usa estados r0,r1,r2r_0,r_1,r_2.

Se o prefixo representa vv e lês o bit bb, o novo valor é 2v+b2v+b. Logo:

δ(ri,b)=r(2i+b) mod 3.\delta(r_i,b)=r_{(2i+b)\bmod3}.
Estado0011
r0r_0 inicial e finalr0r_0r1r_1
r1r_1r2r_2r0r_0
r2r_2r1r_1r2r_2

110110 representa 66 e segue r0,r1,r0,r0r_0,r_1,r_0,r_0, terminando no resto zero. Nesta convenção, zeros iniciais são permitidos e ε\varepsilon representa zero. Se o enunciado exigir representação não vazia a começar em 11, acrescenta um novo estado inicial não final e um poço para entradas que comecem em 00. Não mudes a linguagem sem explicitar essa condição.

Se a entrada for um número binário lido ao contrário, a letra seguinte já não duplica o prefixo acumulado. Uma via sistemática é construir o DFA para a interpretação normal, inverter a linguagem e determinizar. Outra é guardar o resto acumulado e o peso da próxima posição módulo o divisor; ambos têm finitas possibilidades. Ao ler do bit menos significativo para o mais significativo, guarda (r,t)(r,t): rr é o resto do valor acumulado e tt é o peso da posição seguinte módulo 5. Começa em (0,1)(0,1) e, por um bit bb, atualiza

(r,t)⟼((r+bt) mod 5,  2t mod 5).(r,t)\longmapsto((r+bt)\bmod5,\;2t\bmod5).

Os pesos possíveis são 1,2,4,31,2,4,3, repetindo esse ciclo. Para 101101:

Bit lido(r,t)(r,t) antes(r,t)(r,t) depois
11(0,1)(0,1)(1,2)(1,2)
00(1,2)(1,2)(1,4)(1,4)
11(1,4)(1,4)(0,3)(0,3)

O resto final é 00, e o valor é 1+0+4=51+0+4=5. Para exigir entrada não vazia ou um bit mais significativo igual a 1, trata também essas condições. Não reutilizes a recorrência 2v+b2v+b sem conferir qual ponta representa o bit menos significativo.

Combinar duas condições

Se queres guardar a paridade do número de zeros e de uns, o estado é um par (p0,p1)(p_0,p_1) de paridades. Há quatro estados. Um 00 troca só a primeira componente; um 11 troca só a segunda.

O estado inicial é (par,par)(\text{par},\text{par}). Para aceitar um número par de ambos os símbolos, só esse estado é final. Para aceitar um número par de zeros ou de uns, são finais todos os pares com pelo menos uma componente par.

É a construção de produto: simular dois DFA ao mesmo tempo. Não mistures as transições com o critério de aceitação, porque o mesmo produto permite interseção, união ou diferença, escolhendo os finais. A minimização remove memória redundante depois de a construção estar correta.

Exercícios

A construção para o sufixo 00 adapta o exercício 1.1 da folha prática 2. Os múltiplos de cinco adaptam o exercício 4.1, com outros exemplos. O produto de sufixo e paridade é original.

Múltiplos de cinco

Constrói um DFA completo para as palavras binárias que começam em 11 e representam múltiplos de 5. A representação é lida do bit mais significativo para o menos significativo. Dá a tabela dos cinco restos e os estados adicionais para impor o início. Segue 101101, 01010101 e ε\varepsilon. Explica por que a regra dos restos continua correta.

Pista

Separa a condição numérica da condição sobre o primeiro bit.

Solução

Se o valor anterior é v=5k+iv=5k+i e lês o bit bb, o novo valor é 2v+b=10k+2i+b2v+b=10k+2i+b. Portanto basta atualizar para (2i+b) mod 5(2i+b)\bmod5:

Estado0011
r0r_0r0r_0r1r_1
r1r_1r2r_2r3r_3
r2r_2r4r_4r0r_0
r3r_3r1r_1r2r_2
r4r_4r3r_3r4r_4

Usa ainda início ss não final e poço dd. De ss, 11 leva a r1r_1 e 00 leva a dd; dd repete ambos os bits. Só r0r_0 é final. 101101 segue s,r1,r2,r0s,r_1,r_2,r_0 e aceita o valor 5. 01010101 chega ao poço no primeiro bit e rejeita, apesar de também representar 5 se aceitássemos zeros iniciais. ε\varepsilon fica em ss e rejeita.

Depois do primeiro 11, o estado rir_i guarda o resto do valor do prefixo. A equação mostra que cada transição preserva esse invariante. O início e o poço impõem a condição adicional sobre a representação.

Confere a tua resposta:

  • Derivei a recorrência e preenchi os cinco restos.
  • Impus começar em 1 com início não final e poço.
  • Aceitei 101 e rejeitei 0101 e ε pelas condições certas.
Voltar à explicação
Construir e justificar

Constrói um DFA completo para palavras sobre {0,1}\{0,1\} que terminam em 0000. Mostra os percursos de 100100, 001001 e ε\varepsilon e justifica a construção.

Pista

O que importa é o comprimento do sufixo atual de zeros, limitado a dois.

Mais uma pista

Usa estados z0,z1,z2z_0,z_1,z_2. Uma letra 1 leva sempre a z0z_0.

Solução

A tabela é: z0z_0: 0↦z10\mapsto z_1, 1↦z01\mapsto z_0; z1z_1: 0↦z20\mapsto z_2, 1↦z01\mapsto z_0; z2z_2: 0↦z20\mapsto z_2, 1↦z01\mapsto z_0. O início é z0z_0 e só z2z_2 é final. 100100 termina em z2z_2, 001001 em z0z_0 e ε\varepsilon em z0z_0. O invariante diz que z0z_0 significa nenhum zero final, z1z_1 exatamente um, z2z_2 pelo menos dois. Cada transição preserva esta descrição, logo a linguagem é a pretendida.

Confere a tua resposta:

  • Define três estados para zero, um ou pelo menos dois zeros consecutivos no fim.
  • Dá as duas transições de cada estado e marca o início e o final.
  • Justifica o significado de cada estado por indução nos prefixos.

Erros frequentes

Não cries um estado por comprimento total. Não rejeites 000: continua a terminar em 00.

Voltar à explicação
Juntar duas condições

Constrói um DFA sobre {0,1}\{0,1\} que aceite as palavras terminadas em 0000 com um número ímpar de 11. Define os estados, as transições e os finais. Segue 100100 e 11001100.

Pista

Usa o produto da máquina de sufixo com uma máquina de duas paridades.

Mais uma pista

Os estados são (zi,p)(z_i,p), com i∈{0,1,2}i\in\{0,1,2\} e p∈{par,ıˊmpar}p\in\{\text{par},\text{ímpar}\}.

Solução

Usa os seis estados (zi,p)(z_i,p), com i∈{0,1,2}i\in\{0,1,2\} a contar os zeros finais até ao máximo dois e p∈{par,ıˊmpar}p\in\{\text{par},\text{ímpar}\} a guardar a paridade de uns. O início é (z0,par)(z_0,\text{par}). Por 00, vai para (zmin⁡(i+1,2),p)(z_{\min(i+1,2)},p). Por 11, vai para (z0,p‾)(z_0,\overline p), onde p‾\overline p troca par com ímpar. Só (z2,ıˊmpar)(z_2,\text{ímpar}) é final.

100100 segue (z0,par),(z0,ıˊmpar),(z1,ıˊmpar),(z2,ıˊmpar)(z_0,\text{par}),(z_0,\text{ímpar}),(z_1,\text{ímpar}),(z_2,\text{ímpar}) e aceita. 11001100 termina em (z2,par)(z_2,\text{par}) e rejeita. Cada componente conserva o seu significado depois de qualquer prefixo, logo o final exige exatamente as duas condições. ε\varepsilon é rejeitada.

Confere a tua resposta:

  • Guarda o sufixo de zeros e a paridade de uns em cada estado.
  • Uma letra 0 atualiza o sufixo sem trocar a paridade; 1 reinicia o sufixo e troca a paridade.
  • Marca só o par com sufixo de pelo menos dois zeros e paridade ímpar.

Erros frequentes

Não uses união dos finais: o enunciado exige ambas as condições. Não troques a paridade ao ler 0.

Voltar à explicação

À 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.