04 · Autômatos Finitos Determinísticos (AFD)

Resumo em 30 segundos

Um AFD é uma máquina com memória finita (só guarda o estado atual) que lê a palavra da esquerda para a direita, um símbolo por vez, e no fim responde sim ou não. Formalmente . É determinístico porque, para cada estado e símbolo, existe exatamente um próximo estado. Aceita a palavra se termina em um estado de . As linguagens aceitas por AFDs são as regulares.

Anterior: 03b - Expressões Regulares · Voltar ao mapa · Próxima: 05 - Autômatos Finitos Não Determinísticos


Slides 3 e 4: introdução

  • AF é um dispositivo (software ou hardware) reconhecedor/aceitador que processa uma quantidade finita de informação em cada instante.
  • Recebe uma sequência de símbolos e a saída indica se ela pertence ou não à linguagem.
  • Tem um número finito de estados.
  • O estado atual resume o passado: tudo o que importa sobre os símbolos já lidos está codificado no estado. Não há outra memória.

Duas versões (slide 4):

AFDAFND
Transições por símbolo lidoexatamente umazero ou mais
Próximo estadoúniconenhum, um ou vários
Reconhecelinguagens regularesas mesmas linguagens regulares

O AFND fica para a aula 05, e a prova de que os dois têm o mesmo poder está na aula 06.

Slide 5: definição formal

ComponenteSignificadoRestrição
conjunto de estadosfinito e não vazio
alfabeto de entradafinito
função de transição
estado inicial
estados finais (de aceitação)

Aceitação: partindo de e processando a palavra inteira, o autômato termina em um estado de .

Erro comum de prova

Passar por um estado final no meio da palavra não conta. Só importa o estado depois do último símbolo.

Notação em outros livros

Na literatura em geral é comum ver : = estados, = alfabeto, = transição. É a mesma coisa com outros nomes. Confira a ordem dos componentes no livro que estiver usando.

Slide 6: o modelo físico

  • Fita com a entrada, um símbolo por célula.
  • Cabeçote de leitura: lê uma célula e só anda para a direita (uma passada, sem voltar, sem escrever).
  • Controle finito: guarda o estado atual e aplica a função de transição a cada símbolo lido.

Três representações do mesmo AFD

Slides 7 a 9. O mesmo autômato de exemplo aparece em três formas.

Representação algébrica

, , , e

, , , , , , , .

Diagrama de transições

  • Círculo = estado. Seta rotulada = transição com aquele símbolo.
  • Seta “solta” apontando para um estado = inicial.
  • Círculo duplo = estado final.

Tabela de transições

Tab
→ q0q1q2
q1q0q3
q2q3q0
* q3q2q1

Convenções: estados na primeira coluna, alfabeto na primeira linha, → marca o inicial, * marca finais. Cada célula é o destino. Exemplo: em lendo a, vai para .

Quando usar cada uma

Diagrama: melhor para entender e simular na mão. Tabela: melhor para programar e para algoritmos como a conversão AFND→AFD. Algébrica: é a definição formal que a prova pede quando diz “descreva formalmente”.

Slide 10: interpretação (descobrir a linguagem)

A técnica: associar a cada estado uma propriedade do que já foi lido.

Estadonº de anº de b
→ q0parpar
q1ímparpar
q2parímpar
* q3ímparímpar

Ler a troca a paridade de a (anda na horizontal do diagrama); ler b troca a de b (anda na vertical). Como :

L(M) = palavras com número ímpar de a e número ímpar de b (não necessariamente iguais).

Conferido por programa para todas as palavras até tamanho 10.

Slide 11: extensão de domínio (T-chapéu)

lê um símbolo. Para ler uma palavra, define-se recursivamente:

  • Ler a palavra vazia não muda o estado.
  • Para ler seguido de : primeiro processa , depois dá um passo com .
  • significa: partindo de , chega em em exatamente transições.

Aceitação formal: é aceita se . Assim .

Qualquer linguagem aceita por um AF é chamada regular.

Isso é um laço for

type Estado = string;
function aceita(T: Record<string, Estado>, inicial: Estado, finais: Set<Estado>, w: string): boolean {
  let q = inicial;                 // T̂(q0, ε) = q0
  for (const a of w) {             // T̂(q0, ua) = T(T̂(q0, u), a)
    const prox = T[`${q},${a}`];
    if (prox === undefined) return false; // transição indefinida: rejeita
    q = prox;
  }
  return finais.has(q);
}

A recursão da definição vira uma variável que acumula o estado.

Exercícios

Slides 12 a 14. Todas as respostas abaixo foram conferidas simulando os autômatos por programa em todas as palavras até tamanho 10.

Exercício 1 (slide 12): linguagem do diagrama

Exercício 2 (slide 12): linguagem da tabela

Tab
→ q0q1q3
q1q2q0
* q2q3q1
q3q0q2

Exercício 3 (slide 13): tabela com lacunas

(No slide as lacunas aparecem como um traço; aqui uso ∅ para “sem transição”.)

Tab
→ q0q1∅
q1q1q2
* q2∅∅

Exercício 4 (slide 13): diagrama com 0 e 1

Exercício 5 (slide 14): construir AFDs

Exercício 6 (slide 14): verificar sentenças

T01
→* q0q2q1
q1q3q0
q2q0q3
q3q1q2


Mapa da aula

flowchart LR
  AF[Autômato Finito] --> D[Definição<br/>K, V, T, i, F]
  AF --> R[Representações]
  R --> R1[Algébrica]
  R --> R2[Diagrama]
  R --> R3[Tabela]
  AF --> I[Interpretação<br/>invariante por estado]
  AF --> E["Extensão T̂<br/>ler palavras inteiras"]
  E --> AC["Aceita se T̂(i,w) ∈ F"]
  AC --> LR[Linguagem regular]

Aprofundamento com os livros

Páginas das edições da sua pasta: Menezes 3ª edição (2000) e Ramos, José Neto e Vega (Bookman).

Sistemas de estados finitos no mundo real (Menezes 2.1, p. 32)

Um sistema de estados finitos tem entradas e saídas discretas e um número finito de estados, e cada estado resume só o que do passado importa para decidir o próximo passo. Exemplos e contraexemplos do Menezes:

  • Elevador: não guarda o histórico de chamadas; o estado é “andar atual + direção”.
  • Analisador léxico e ferramentas de busca em editores de texto: o estado memoriza a estrutura do prefixo já lido.
  • Cérebro: em tese seria finito, mas o número de estados é tão grande que o modelo não ajuda.
  • Computador: também é finito na prática, mas estudar o que é computável exige memória sem limite, por isso se usa a Máquina de Turing.

As três partes e as três formas de parar (Menezes 2.2, p. 33 a 35)

O Menezes descreve o AFD como fita (finita, só leitura, a palavra ocupa a fita toda), unidade de controle (estado atual + cabeça que só anda para a direita) e programa (a função de transição). Um detalhe importante: para ele a função de transição é parcial. Isso dá três formas de parar:

Situação no fim do processamentoResultado
Leu tudo e está num estado finalaceita
Leu tudo e está num estado não finalrejeita
Encontrou uma transição indefinida no meiorejeita na hora

Um AFD sempre para

Como cada passo consome um símbolo e a palavra é finita, não existe laço infinito (Menezes, p. 35). Isso deixa de ser verdade em modelos mais poderosos, como a Máquina de Turing.

O Ramos chama a atenção para o custo da função total (p. 151): com estados e símbolos, um AFD total tem exatamente transições. É o que faz a tabela ficar sem buracos.

T-chapéu consumindo pelo começo ou pelo fim

FonteDefinição recursiva
Slides (e o Ramos em outra forma): lê e depois o último símbolo
Menezes (Def. 2.2, p. 36): lê o primeiro símbolo e depois o resto

As duas dão o mesmo resultado. A do Menezes é a que um laço for implementa diretamente, e ele mostra o passo a passo com a palavra abaa (Exemplo 2, p. 36).

Configurações e a relação ⊢ (Ramos, p. 151 e 152)

O Ramos descreve o processamento como uma sequência de configurações : o estado atual e o que ainda falta ler. Um passo é se . Com o AFD de paridade desta aula e a palavra abab:

A palavra é aceita se com . Aqui termina em : rejeita. Repare que é o fecho reflexivo-transitivo de , de novo o da aula 02.

Aceita e rejeita dividem tudo (Menezes, p. 37)

e não têm palavras em comum e juntas formam . Uma é o complemento da outra. Dois autômatos são equivalentes quando aceitam a mesma linguagem, e uma linguagem aceita por algum AFD é chamada regular (Def. 2.3 e 2.4).

Mesmo programa, linguagens opostas (Menezes, Exemplo 3, p. 37 e 38)

Dois autômatos com um único estado e laço em a e b. No primeiro, : aceita . No segundo, : aceita . As funções de transição são idênticas; o que muda é só o conjunto de estados finais. Boa pergunta de prova: “o que diferencia os dois?”

O estado como memória, generalizado (Ramos, Exemplo 3.11, p. 154 e 155)

O slide 10 usa 4 estados para acompanhar a paridade de a e de b. O Ramos faz o mesmo com três símbolos: 8 estados com nomes como PPP, IPP, III (par ou ímpar de a, de b e de c). Com , aceita palavras com quantidades ímpares de a, b e c. Trocar muda a linguagem sem mexer nas transições: com aceita “tudo par”.

Regra geral que dá para tirar daqui: para acompanhar a paridade de símbolos, bastam estados.

Eficiência (Menezes, p. 66)

Um AFD decide se aceita em tempo proporcional ao tamanho da entrada, qualquer que seja o autômato. Não existe algoritmo de reconhecimento mais rápido do que isso em geral. Dá para melhorar só o número de estados (o tamanho do programa), com o algoritmo de minimização explicado em 08 - Tópicos Complementares dos Livros.

Exercícios extras do Menezes (2.2, p. 80)

Construa AFDs sobre . Respostas minhas, conferidas por programa até tamanho 12.

Para aprofundar nos livros

Onde ler (páginas das edições da sua pasta)

  • Menezes (3ª ed.): 2.1 Sistema de Estados Finitos, p. 32; 2.2 Autômato Finito, p. 33 a 38; eficiência, p. 66; exercícios 2.2, 2.10 e 2.24, p. 80 a 84.
  • Ramos, José Neto e Vega: 3.3 Autômatos Finitos (parte determinística), p. 150 a 155; Tabela 3.2 (aceitação em AFD e AFND), p. 157.

Relacionadas: 05 - Autômatos Finitos Não Determinísticos · 06 - Equivalência AFD e AFND · Glossário · Flashcards