Autómatos de pilha
Configurações, critérios de aceitação, construções para contagens e palíndromos e equivalência com CFG.
Para reconhecer , guarda um marcador por cada e retira um por cada . Os estados controlam a ordem dos blocos. A pilha guarda os marcadores, com o último a entrar no topo e a ser o primeiro a sair.
Um autómato de pilha, PDA, combina essa memória com escolhas não determinísticas. Vamos seguir e relacionar a computação com a gramática .
O modelo
Um autómato de pilha, PDA, é . Além dos componentes finitos habituais, é o alfabeto da pilha e é o símbolo que está inicialmente nela.
A função de transição recebe estado, letra de entrada ou , e símbolo do topo:
O resultado é um conjunto finito de escolhas. O par significa ir para e substituir o topo por . Escreve a pilha com o topo à esquerda. Se o topo é substituído por , fica por cima de . Se , retiras o topo; se , a pilha não muda.
No diagrama, representa essa operação. A letra não consome entrada, mas a operação ainda exige que esteja no topo.
Configurações e aceitação
Uma configuração, ou descrição instantânea, é : estado atual, entrada ainda por ler e pilha atual. Se , então
O que está abaixo do topo não interfere na escolha da transição, e representa zero ou mais passos.
Na aceitação por estado final, exige para algum . A pilha pode conservar símbolos. Na aceitação por pilha vazia, exige , sem condição sobre .
Em ambos os casos, a entrada tem de estar consumida. Estar num final ou ter a pilha vazia enquanto restam letras não aceita a palavra.
Exemplo resolvido: PDA para aⁿbⁿ
Reconhece por estado final. Usa para ler , para ler e como final. A pilha começa em e guarda marcadores .
| Origem | Entrada | Topo | Destino | Substituição |
|---|---|---|---|---|
As restantes transições não existem; em particular, não tem saídas. O estado pode aceitar pela transição vazia, mas essa transição não aceita quando resta entrada por consumir.
A computação que aceita é:
Em , sobra um quando a entrada acaba, e não há transição para o final. Em , o segundo encontra e o ramo bloqueia. Em , o estado não tem transição para , impedindo o regresso ao primeiro bloco.
O invariante é: em há um por cada lido; em há um por cada ainda não emparelhado com um . Só chegas ao final com zero marcadores e entrada consumida.
Segue por passos e compara com ou . A fronteira conserva as configurações de todos os ramos, incluindo os que escolhem uma transição vazia antes de a entrada acabar. O percurso aceitante mostra as substituições da pilha.
Editar estados e transições
Declara os estados, os alfabetos da entrada e da pilha, o início e os finais. Cada transição tem a forma origem entrada topo -> destino substituição. ε na entrada não lê uma letra; ε na substituição retira o topo. Não há transições com a pilha vazia.
O topo da pilha está à esquerda. Aceitar exige consumir toda a entrada. Mudar o critério não converte a máquina.
Palavra aceite.
Percurso aceitante
| Passo | Estado | Por ler | Pilha, topo à esquerda |
|---|---|---|---|
| 0 | q0 | aabb | Z |
| 1 | q0 | abb | AZ |
| 2 | q0 | bb | AAZ |
| 3 | q1 | b | AZ |
| 4 | q1 | ε | Z |
| 5 | qf | ε | Z |
Limites da pesquisa
A pesquisa segue todos os ramos por níveis, até 128 transições por ramo, 96 símbolos na pilha e 5 000 configurações distintas. Um ramo aceitante basta para aceitar. Só se rejeita depois de esgotar as configurações alcançáveis sem encontrar aceitação. Atingir um limite deixa o resultado por decidir, mesmo que os ramos já observados não aceitem. Configurações repetidas são exploradas uma vez.
O vídeo de Rodrigo Dias complementa o estudo de autómatos de pilha e linguagens livres de contexto:
Contagens dentro de um intervalo
Para , cada pode corresponder a um ou dois . Um PDA escolhe empilhar um ou dois marcadores por e depois retira um por cada . Com topo , as escolhas são e . A mudança para a fase dos impede voltar a ler .
Na palavra , um ramo empilha um marcador pelo primeiro e dois pelo segundo. A pilha fica , que os três esvaziam até ao fundo. Em , todos os ramos têm pelo menos três marcadores, por isso dois nunca chegam. Em , todos têm no máximo quatro, pelo que cinco não podem ser lidos.
A CFG correspondente é . Com passos recursivos, escolhes contribuições de um ou dois , dando qualquer total entre e . Para , podes derivar .
Escolher uma fase e conservar a escolha
Comparar a quantidade de letras não determina quais podem aparecer na segunda fase. Considera um PDA por estado final, com início , pilha inicial e único final , sem saídas. Em , cada empilha um . O primeiro passa para , que só retira marcadores com ; o primeiro passa para , que só os retira com .
Não existem outras transições. e podem chegar a por com no topo, conservando esse fundo. A linguagem é
Em , depois dos dois a pilha é . O retira um marcador e escolhe , ficando . Não há transição por em , por isso rejeita, embora existam dois símbolos depois dos dois . Já e chegam ao final com entrada consumida e apenas na pilha.
A palavra vazia é rejeitada: não é final e não tem transição vazia para . Isso explica . Se fundirmos numa fase que permite tanto como a cada remoção, obtemos , que aceita . Escolher um ramo uma vez é diferente de escolher a letra de cada passo.
Escolhas que a pilha não resolve
Para palíndromos pares , empilha a primeira parte e escolhe, por uma transição vazia, quando começar a comparar. A partir daí, cada letra tem de ser igual ao topo, que é retirado. Aceita ao chegar ao fundo depois de consumir a entrada.
O meio não está marcado, por isso o PDA usa não determinismo para escolher a divisão. Para , um ramo empilha , muda de fase e compara . Os ramos que escolhem um meio errado falham. Com um separador, , a letra indica quando mudar de fase.
Um PDA determinístico tem no máximo uma escolha por condição e não permite, para o mesmo estado e topo, concorrer uma transição vazia com uma transição que lê entrada. Ao contrário do caso finito, PDA determinísticos e não determinísticos não têm o mesmo poder: as linguagens livres de contexto determinísticas são uma subclasse própria das livres de contexto.
Trocar o critério de aceitação
Os critérios têm o mesmo poder para PDA não determinísticos, mas mudar o critério de uma máquina existente pode mudar a linguagem. É preciso construir outra máquina.
De pilha vazia para estado final, coloca um fundo novo abaixo da pilha simulada. Um estado inicial novo transforma em . Quando o simulador expõe , entra num final novo. Só uma computação que consumiu toda a entrada é aceite.
De estado final para pilha vazia, usa também um fundo novo, para impedir esvaziamento acidental durante a simulação. De cada antigo final, permite passar para um estado que retira todos os símbolos, incluindo o fundo, por transições vazias. Se ainda houver entrada, esse ramo não consegue consumi-la e não aceita.
Esta equivalência não se aplica sem alterações às convenções determinísticas; as transições vazias acrescentadas podem criar escolhas.
Conversões de critério com transições concretas
Toma uma máquina por pilha vazia que só tem . Ela aceita exatamente : lê e retira . Não há outras transições.
Na máquina por estado final, acrescenta fundo , início e único final . Usa , conserva a transição antiga e, para cada estado simulado , acrescenta . O final não tem saídas.
Para :
Para , o mesmo percurso termina em . A entrada restante impede aceitar. O fundo novo distingue esvaziar a pilha simulada de esvaziar toda a pilha da máquina nova.
De estado final para pilha vazia, usa um fundo novo e um estado de limpeza . De cada antigo final , acrescenta para todo o da pilha, e em retira todos os símbolos até inclusive. Se a máquina antiga aceita em com pilha , a nova consome , passa a e esvazia . Se chega a com entrada restante, não consegue consumir essa entrada e o ramo falha.
De CFG para PDA
Um PDA por pilha vazia pode simular derivações mais à esquerda. A pilha começa com e contém variáveis e terminais:
- para cada produção , permite substituir no topo por , sem ler entrada;
- para cada terminal , permite ler e retirar do topo.
Para , o ramo que aceita é:
A expansão mantém na pilha a parte ainda por gerar, com a primeira posição no topo. Numa implementação que empilhe símbolos um a um, tens de os inserir da direita para a esquerda para obter esse mesmo topo.
De PDA para CFG
Ver a construção com variáveis indexadas por estados
Primeiro coloca o PDA no critério de pilha vazia. A variável descreve as palavras que levam do estado ao estado removendo o marcador , sem tocar no que estava abaixo dele.
Para cada estado , acrescenta . Se uma transição lê , vai de para e retira , acrescenta , podendo ser .
Se a transição substitui por um único , acrescenta para cada estado . A variável seguinte acompanha a remoção de .
Se a transição substitui por , a remoção futura tem duas partes: remover até algum estado intermédio , depois remover até . Para todos os estados , acrescenta
Se empilhar mais símbolos, usa uma variável por símbolo e estados intermédios para ligar as etapas. A gramática gera precisamente as entradas que esvaziam a pilha.
PDA para CFG num exemplo pequeno
Considera um PDA por pilha vazia com estados , inicial e cinco transições:
- ;
- ;
- ;
- ;
- .
A última transição esvazia o fundo no fim; sem ela, deixaria na pilha e não seria aceite por pilha vazia. Com as cinco transições, a máquina reconhece .
A variável gera as palavras que levam de a removendo o do topo sem tocar no que está abaixo. Aplicando a construção geral a cada transição:
- ;
- empilhar por de para dá, para todos em : , ou seja as quatro produções com e ;
- empilhar por de para dá, para todos em : , ou seja as quatro produções com e ;
- e , pelas duas transições que retiram lendo ;
- , pela transição que esvazia o fundo.
Para , fixa o estado intermédio : . A primeira produção usa a transição com ; consome o ; esvazia o fundo. Cada variável regista onde começa e acaba a remoção de um marcador, e o quantificado liga as duas metades de .
Com a conversão inversa, isto prova: uma linguagem é livre de contexto se e só se algum PDA a reconhece.
Exercícios
A contagem dupla adapta o tipo de construção da questão 8 do teste de 13/6/2024, com uma máquina que aceita também a palavra vazia. As outras máquinas são próprias.
Atualizar uma configuração
O topo da pilha fica à esquerda. A única transição disponível é . Parte de e escreve a configuração seguinte. Se for final e não tiver saídas, o ramo aceita a entrada ? E se a entrada inicial for apenas ?
Pista
Atualiza separadamente entrada, estado e pilha.
Solução
A transição lê e substitui só , conservando abaixo:
é o novo topo. O ramo não aceita , porque resta e não há saídas. Com entrada inicial , chega a e aceita por estado final, embora a pilha não esteja vazia. Por pilha vazia, nenhum destes dois percursos aceita.
Confere a tua resposta:
- Mantive W abaixo de YZ, com Y no topo.
- Rejeitei ab por entrada restante.
- Distingui aceitar a por final de aceitar por pilha vazia.
Dois marcadores por a
Descreve um PDA para e uma computação aceitante para abb.
Pista
Adapta a quantidade guardada na fase dos a.
Mais uma pista
Com topo X, substitui-o por AAX ao ler a. Depois cada b retira um A.
Solução
Em q0, para X igual a A ou Z, usa . O primeiro b lê A, retira-o e passa a q1; em q1 cada b retira A. Com Z exposto, uma transição vazia pode ir a qf, sem saídas. Para abb: . Acrescenta q0→qf com topo Z para ε. Qualquer b a mais bloqueia, e qualquer marcador a mais impede aceitar.
Confere a tua resposta:
- Empilha dois A por cada a e mantém o fundo Z.
- Muda para uma fase que só lê b e retira um A por b.
- Aceita apenas com fundo exposto e entrada vazia, incluindo ε.
Erros frequentes
Não empilhes só um marcador por a. Não permitas a em q1 nem aceites com marcadores restantes.
Converter uma transição
Um PDA por pilha vazia tem estados e apenas estas transições: e . O início é e a pilha inicial é . Constrói as produções relevantes de e descreve a linguagem aceite.
Pista
A primeira transição substitui Z por dois marcadores. Cada um tem de ser removido.
Mais uma pista
A transição que retira gera . Para os dois marcadores, a regra útil escolhe como estado intermédio.
Solução
A regra de remoção é . A transição inicial dá, para cada estado intermédio e destino , . A única escolha que permite uma derivação terminal é , ficando .
O início da CFG tem regras ; a primeira alternativa não gera palavras. O PDA lê para criar e lê dois para os retirar. Assim, aceita só . Com entrada restante após esvaziar, não há transições e não aceita.
Confere a tua resposta:
- Usa um estado intermédio para ligar a remoção dos dois A.
- A regra de retirar A é [rAr] que gera b.
- Conclui que a única palavra aceite é abb.
Erros frequentes
Não cries apenas uma variável para AA: cada marcador é removido numa etapa, ligada pelo estado intermédio. Não confundas pilha vazia com aceitação se ainda há entrada.
Converter pilha vazia em estado final
Um PDA sobre tem início , pilha inicial e apenas . Aceita por pilha vazia. Converte-o para estado final e segue , e , com todas as configurações.
Pista
O fundo novo só aparece no topo quando a pilha simulada esvazia.
Solução
Acrescenta , início e único final . Inicializa com , mantém a transição original e acrescenta para cada . O final não tem saídas.
Para , as configurações são , , e ; rejeita pela entrada restante. Para , fica em depois da inicialização, sem transição possível. A linguagem de ambas as máquinas é .
Confere a tua resposta:
- Dei a inicialização e as saídas pelo fundo novo.
- Segui a até final com entrada consumida.
- Rejeitei aa por entrada restante e ε por bloqueio.
Experimentar a contagem dupla
Compara e com e . Altera as duas transições que empilham marcadores ou escolhe Criar PDA para construir a máquina do exercício. Verificar exemplos compara apenas as entradas mostradas; a justificação para todos os comprimentos continua a ser necessária.
Editar estados e transições
Declara os estados, os alfabetos da entrada e da pilha, o início e os finais. Cada transição tem a forma origem entrada topo -> destino substituição. ε na entrada não lê uma letra; ε na substituição retira o topo. Não há transições com a pilha vazia.
O topo da pilha está à esquerda. Aceitar exige consumir toda a entrada. Mudar o critério não converte a máquina.
Palavra aceite.
Percurso aceitante
| Passo | Estado | Por ler | Pilha, topo à esquerda |
|---|---|---|---|
| 0 | q0 | abb | Z |
| 1 | q0 | bb | AAZ |
| 2 | q1 | b | AZ |
| 3 | q1 | ε | Z |
| 4 | qf | ε | Z |
Limites da pesquisa
A pesquisa segue todos os ramos por níveis, até 128 transições por ramo, 96 símbolos na pilha e 5 000 configurações distintas. Um ramo aceitante basta para aceitar. Só se rejeita depois de esgotar as configurações alcançáveis sem encontrar aceitação. Atingir um limite deixa o resultado por decidir, mesmo que os ramos já observados não aceitem. Configurações repetidas são exploradas uma vez.
Escolher b ou c uma vez
Um PDA por estado final começa em p com pilha Z. Em p, cada a empilha um A. O primeiro b retira A e entra em q; o primeiro c retira A e entra em r. q só lê b retirando A, e r só lê c retirando A. Com Z no topo, q e r podem chegar por ε ao único final f, conservando Z. Não há outras transições nem saídas de f.
Descreve a linguagem. Classifica , , e , mostrando a configuração em que o ramo de bloqueia. O que mudaria se q e r fossem uma única fase que permite b ou c em cada remoção? Adaptação da distinção de ramos da questão 18 do teste de 11/6/2025, com pedidos de justificação.
Solução
A linguagem é . Os marcadores contam os a; o primeiro símbolo seguinte escolhe uma fase que mantém o mesmo tipo de letra até retirar todos os marcadores.
passa pela fase q e aceita; passa por r e aceita. Para :
Não existe transição de q por c, logo rejeita. ε fica em p, não final, sem saída vazia para f, e também rejeita.
Na fase fundida, cada símbolo de retiraria um A. A linguagem passaria a , que aceita aabc. A contagem é a mesma, mas a restrição sobre a ordem e o tipo das letras mudou.
Confere a tua resposta:
- Descrevi a união de a^n b^n com a^n c^n para n≥1.
- Bloqueei aabc em q com c por ler e um marcador A.
- Distingui a escolha única de fase da escolha por letra e rejeitei ε.
