NFA e transições vazias
Percursos alternativos, fecho-ε, determinização e complemento de uma linguagem reconhecida por NFA.
No DFA do sufixo , 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
O destino é um conjunto: pode conter zero, um ou vários estados. é o conjunto de todos os subconjuntos de . Um ramo sem transição morre, sem impedir que outro ramo aceite.
Um NFA aceita se existe pelo menos um percurso de até um estado final que lê exatamente . Não exige que todos os percursos aceitem, e não pode aceitar deixando símbolos por ler.
Para o sufixo , com conjuntos de estados fáceis de seguir, usa esta tabela:
| Estado | ||
|---|---|---|
| inicial | ||
| final |
O ciclo em lê o prefixo. A transição escolhe o início do sufixo. Como não tem saídas, essa escolha só aceita se o for a última letra.
Para simular sem adivinhar, mantém o conjunto de estados possíveis. Se é o conjunto atual, depois de ler tens . Para :
Como o conjunto final contém , a palavra é aceite. Com mais um , chegas a e a palavra é rejeitada.
Experimenta e . O laboratório mantém todos os ramos: chegar a 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.
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}.
Ver solução
Repõe o exemplo para consultar a máquina de referência. Os estados podem ter outros nomes: a verificação compara o comportamento para todas as entradas.
Construir um NFA por adivinhação
Para reconhecer palavras binárias cujo antepenúltimo símbolo é , adivinha onde começa esse sufixo de comprimento 3. Usa quatro estados em linha: repete ; num pode saltar para ; depois , com final e sem saídas.
Para , o ramo que salta no segundo lê depois e aceita em , e o ramo que salta no primeiro lê depois e bloqueia por falta de transição, sem que isso impeça a aceitação. Também é aceite, pois o segundo é o antepenúltimo símbolo e o ramo que o escolhe lê os dois até .
Já é rejeitada: o salto no único chega a depois de ler dois , mas resta um terceiro e 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 .
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 é e a transição é:
Um subconjunto é final se intersecta . A tabela do exemplo fica:
| Estado do DFA | Final? | ||
|---|---|---|---|
| inicial | Não | ||
| Não | |||
| Sim |
Constrói a tabela por rondas, mantendo uma lista de trabalho:
- Começa com o subconjunto inicial .
- Para cada subconjunto na lista e cada letra, calcula a união dos destinos e o seu fecho, se houver transições vazias.
- Acrescenta à lista os subconjuntos novos e repete até não surgir nenhum.
- Marca como final cada subconjunto que intersecta .
Só precisas dos subconjuntos alcançáveis, não de desenhar todos os 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 é estados, e não . Neste exemplo só surgem três.
Transições ε e fecho-ε
Num ε-NFA, permite . Uma transição muda de estado sem consumir entrada.
O fecho- contém todos os estados alcançáveis de algum estado de com zero ou mais transições vazias. Inclui sempre . Para o calcular, começa com 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 :
e . A palavra vazia é aceite porque o fecho do início contém um final. A transição vazia não obriga a mudar para ; o ramo em continua disponível para ler mais .
Compara a entrada vazia, e . 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.
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}.
Ver solução
Repõe o exemplo para consultar a máquina de referência. Os estados podem ter outros nomes: a verificação compara o comportamento para todas as entradas.
Determinizar com fechos
Agora, o estado inicial do DFA é , e cada passo é:
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:
| Estado | Final? | ||
|---|---|---|---|
| inicial | Sim | ||
| Sim | |||
| Não |
O em leva ao poço porque, depois de começar os , não pode haver outro . Simular percorre e rejeita. termina em e aceita.
Para eliminar apenas as transições vazias, mantendo um NFA, podes definir
e marcar como final quando . 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 , apenas fica final. Assim, passa a ser aceite, enquanto e 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 e apenas as transições vazias , e . Calcula , e . Explica como garantir que o cálculo termina.
Pista
Segue só as setas vazias, na direção indicada.
Solução
De , chegamos a e depois a , logo . De , chegamos a e voltamos a , mas nunca chegamos a : . O estado não tem saídas e pertence ao próprio fecho, por isso .
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 , 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.
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?
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.
Determinizar uma tabela
Um NFA tem início , final , e transições , , . Constrói o DFA equivalente e descreve a linguagem.
Pista
Começa em e calcula as uniões de destinos.
Mais uma pista
De , a dá e b dá .
Solução
Os estados são e . 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.
Fechar antes e depois
Um ε-NFA sobre tem início , único final e apenas estas transições: , , , . Constrói a tabela do DFA completo equivalente. A palavra vazia é aceite? E ?
Pista
Calcula primeiro os três fechos individuais.
Mais uma pista
, e .
Solução
Os estados alcançáveis são , e . A tabela é:
| Estado | Final? | ||
|---|---|---|---|
| inicial | Não | ||
| Não | |||
| Sim |
Não aparece o conjunto vazio: cada subconjunto alcançável contém , que tem saída pelas duas letras. A máquina já é completa. acaba em e rejeita; segue e aceita. A linguagem é a das palavras terminadas em .
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.
Antepenúltimo bit
Constrói um NFA para palavras binárias cujo antepenúltimo símbolo é . Dá todas as transições e o único final. Segue , , e , indicando um ramo aceitante quando exista.
Pista
Conta quantas letras restam depois de cada possível salto.
Solução
Usa início e único final . As transições são , , e . De não há saídas.
Em , o ramo aceita. Em , o mesmo salto no segundo lê e também aceita. Em , o único salto para chega a com um por ler, pelo que falha. O ramo que permanece em não é final. termina em e rejeita.
Cada ramo que chega a consumiu exatamente duas letras após escolher um . Inversamente, quando o antepenúltimo bit é , o ramo que o escolhe termina em 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.
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.
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}.
Ver solução
Repõe o exemplo para consultar a máquina de referência. Os estados podem ter outros nomes: a verificação compara o comportamento para todas as entradas.