Autómatos de pilha

Configurações, critérios de aceitação, construções para contagens e palíndromos e equivalência com CFG.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Para reconhecer anbna^nb^n, guarda um marcador por cada aa e retira um por cada bb. 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 aabbaabb e relacionar a computação com a gramática S→aSb∣εS\to aSb\mid\varepsilon.

O modelo

Um autómato de pilha, PDA, é P=(Q,Σ,Γ,δ,q0,Z0,F)P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F). Além dos componentes finitos habituais, Γ\Gamma é o alfabeto da pilha e Z0∈ΓZ_0\in\Gamma é o símbolo que está inicialmente nela.

A função de transição recebe estado, letra de entrada ou ε\varepsilon, e símbolo do topo:

δ:Q×(Σ∪{ε})×Γ→Pfin(Q×Γ∗).\delta:Q\times(\Sigma\cup\{\varepsilon\})\times\Gamma \to\mathcal P_{\mathrm{fin}}(Q\times\Gamma^*).

O resultado é um conjunto finito de escolhas. O par (p,γ)(p,\gamma) significa ir para pp e substituir o topo por γ\gamma. Escreve a pilha com o topo à esquerda. Se o topo XX é substituído por YZYZ, fica YY por cima de ZZ. Se γ=ε\gamma=\varepsilon, retiras o topo; se γ=X\gamma=X, a pilha não muda.

No diagrama, a,X/γa,X/\gamma representa essa operação. A letra a=εa=\varepsilon não consome entrada, mas a operação ainda exige que XX esteja no topo.

Configurações e aceitação

Uma configuração, ou descrição instantânea, é (q,w,γ)(q,w,\gamma): estado atual, entrada ainda por ler e pilha atual. Se (p,α)∈δ(q,a,X)(p,\alpha)\in\delta(q,a,X), então

(q,aw,Xβ)⊢(p,w,αβ).(q,aw,X\beta)\vdash(p,w,\alpha\beta).

O que está abaixo do topo não interfere na escolha da transição, e ⊢∗\vdash^* representa zero ou mais passos.

Na aceitação por estado final, exige (q0,w,Z0)⊢∗(f,ε,γ)(q_0,w,Z_0)\vdash^*(f,\varepsilon,\gamma) para algum f∈Ff\in F. A pilha pode conservar símbolos. Na aceitação por pilha vazia, exige (q0,w,Z0)⊢∗(q,ε,ε)(q_0,w,Z_0)\vdash^*(q,\varepsilon,\varepsilon), sem condição sobre qq.

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 {anbn∣n≥0}\{a^nb^n\mid n\ge0\} por estado final. Usa q0q_0 para ler aa, q1q_1 para ler bb e qfq_f como final. A pilha começa em ZZ e guarda marcadores AA.

OrigemEntradaTopoDestinoSubstituição
q0q_0aaZZq0q_0AZAZ
q0q_0aaAAq0q_0AAAA
q0q_0bbAAq1q_1ε\varepsilon
q1q_1bbAAq1q_1ε\varepsilon
q0q_0ε\varepsilonZZqfq_fZZ
q1q_1ε\varepsilonZZqfq_fZZ

As restantes transições não existem; em particular, qfq_f não tem saídas. O estado q0q_0 pode aceitar ε\varepsilon pela transição vazia, mas essa transição não aceita quando resta entrada por consumir.

A computação que aceita aabbaabb é:

(q0,aabb,Z)⊢(q0,abb,AZ)⊢(q0,bb,AAZ)⊢(q1,b,AZ)⊢(q1,ε,Z)⊢(qf,ε,Z).\begin{aligned} (q_0,aabb,Z)&\vdash(q_0,abb,AZ)\\ &\vdash(q_0,bb,AAZ)\\ &\vdash(q_1,b,AZ)\\ &\vdash(q_1,\varepsilon,Z)\\ &\vdash(q_f,\varepsilon,Z). \end{aligned}

Em aabaab, sobra um AA quando a entrada acaba, e não há transição para o final. Em abbabb, o segundo bb encontra ZZ e o ramo bloqueia. Em abaaba, o estado q1q_1 não tem transição para aa, impedindo o regresso ao primeiro bloco.

O invariante é: em q0q_0 há um AA por cada aa lido; em q1q_1 há um AA por cada aa ainda não emparelhado com um bb. Só chegas ao final com zero marcadores e entrada consumida.

Segue aabbaabb por passos e compara com aabaab ou abaaba. 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

PassoEstadoPor lerPilha, topo à esquerda
0q0aabbZ
1q0abbAZ
2q0bbAAZ
3q1bAZ
4q1εZ
5qfε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:

Abrir no YouTube

Contagens dentro de um intervalo

Para {anbm∣n≤m≤2n}\{a^nb^m\mid n\le m\le2n\}, cada aa pode corresponder a um ou dois bb. Um PDA escolhe empilhar um ou dois marcadores por aa e depois retira um por cada bb. Com topo XX, as escolhas são a,X/AXa,X/AX e a,X/AAXa,X/AAX. A mudança para a fase dos bb impede voltar a ler aa.

Na palavra aabbbaabbb, um ramo empilha um marcador pelo primeiro aa e dois pelo segundo. A pilha fica AAAZAAAZ, que os três bb esvaziam até ao fundo. Em aaabbaaabb, todos os ramos têm pelo menos três marcadores, por isso dois bb nunca chegam. Em aabbbbbaabbbbb, todos têm no máximo quatro, pelo que cinco bb não podem ser lidos.

A CFG correspondente é S→aSb∣aSbb∣εS\to aSb\mid aSbb\mid\varepsilon. Com nn passos recursivos, escolhes nn contribuições de um ou dois bb, dando qualquer total entre nn e 2n2n. Para aabbbaabbb, podes derivar S⇒aSb⇒aaSbbb⇒aabbbS\Rightarrow aSb\Rightarrow aaSbbb\Rightarrow aabbb.

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 pp, pilha inicial ZZ e único final ff, sem saídas. Em pp, cada aa empilha um AA. O primeiro bb passa para qq, que só retira marcadores com bb; o primeiro cc passa para rr, que só os retira com cc.

Não existem outras transições. qq e rr podem chegar a ff por ε\varepsilon com ZZ no topo, conservando esse fundo. A linguagem é

{anbn∣n≥1} ∪ {ancn∣n≥1}.\{a^nb^n\mid n\ge1\}\ \cup\ \{a^nc^n\mid n\ge1\}.

Em aabcaabc, depois dos dois aa a pilha é AAZAAZ. O bb retira um marcador e escolhe qq, ficando (q,c,AZ)(q,c,AZ). Não há transição por cc em qq, por isso rejeita, embora existam dois símbolos depois dos dois aa. Já aabbaabb e aaccaacc chegam ao final com entrada consumida e apenas ZZ na pilha.

A palavra vazia é rejeitada: pp não é final e não tem transição vazia para ff. Isso explica n≥1n\ge1. Se fundirmos q,rq,r numa fase que permite tanto bb como cc a cada remoção, obtemos {anu∣n≥1, u∈{b,c}n}\{a^nu\mid n\ge1,\ u\in\{b,c\}^n\}, que aceita aabcaabc. Escolher um ramo uma vez é diferente de escolher a letra de cada passo.

Escolhas que a pilha não resolve

Para palíndromos pares {wwR∣w∈{0,1}∗}\{ww^R\mid w\in\{0,1\}^*\}, 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 01100110, um ramo empilha 0101, muda de fase e compara 1010. Os ramos que escolhem um meio errado falham. Com um separador, w#wRw\#w^R, 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 ⊥\bot abaixo da pilha simulada. Um estado inicial novo transforma ⊥\bot em Z0⊥Z_0\bot. Quando o simulador expõe ⊥\bot, 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 δ(q0,a,Z0)={(q1,ε)}\delta(q_0,a,Z_0)=\{(q_1,\varepsilon)\}. Ela aceita exatamente {a}\{a\}: lê aa e retira Z0Z_0. Não há outras transições.

Na máquina por estado final, acrescenta fundo ⊥\bot, início p0p_0 e único final pfp_f. Usa δ(p0,ε,⊥)={(q0,Z0⊥)}\delta(p_0,\varepsilon,\bot)=\{(q_0,Z_0\bot)\}, conserva a transição antiga e, para cada estado simulado qq, acrescenta δ(q,ε,⊥)={(pf,⊥)}\delta(q,\varepsilon,\bot)=\{(p_f,\bot)\}. O final não tem saídas.

Para aa:

(p0,a,⊥)⊢(q0,a,Z0⊥)⊢(q1,ε,⊥)⊢(pf,ε,⊥).(p_0,a,\bot)\vdash(q_0,a,Z_0\bot) \vdash(q_1,\varepsilon,\bot)\vdash(p_f,\varepsilon,\bot).

Para aaaa, o mesmo percurso termina em (pf,a,⊥)(p_f,a,\bot). 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 ⊥\bot e um estado de limpeza pep_e. De cada antigo final ff, acrescenta (f,ε,X)→(pe,ε)(f,\varepsilon,X) \to (p_e,\varepsilon) para todo o XX da pilha, e em pep_e retira todos os símbolos até ⊥\bot inclusive. Se a máquina antiga aceita aabbaabb em qfq_f com pilha ZZ, a nova consome aabbaabb, passa a pep_e e esvazia Z⊥Z\bot. Se chega a qfq_f com entrada restante, pep_e 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 SS e contém variáveis e terminais:

  • para cada produção A→αA\to\alpha, permite substituir AA no topo por α\alpha, sem ler entrada;
  • para cada terminal aa, permite ler aa e retirar aa do topo.

Para S→aSb∣εS\to aSb\mid\varepsilon, o ramo que aceita abab é:

(q,ab,S)⊢(q,ab,aSb)⊢(q,b,Sb)⊢(q,b,b)⊢(q,ε,ε).(q,ab,S)\vdash(q,ab,aSb)\vdash(q,b,Sb) \vdash(q,b,b)\vdash(q,\varepsilon,\varepsilon).

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 [pXq][pXq] descreve as palavras que levam do estado pp ao estado qq removendo o marcador XX, sem tocar no que estava abaixo dele.

Para cada estado qq, acrescenta S→[q0Z0q]S\to[q_0Z_0q]. Se uma transição lê aa, vai de pp para rr e retira XX, acrescenta [pXr]→a[pXr]\to a, podendo aa ser ε\varepsilon.

Se a transição substitui XX por um único YY, acrescenta [pXq]→a[rYq][pXq]\to a[rYq] para cada estado qq. A variável seguinte acompanha a remoção de YY.

Se a transição substitui XX por YZYZ, a remoção futura tem duas partes: remover YY até algum estado intermédio ss, depois remover ZZ até qq. Para todos os estados s,qs,q, acrescenta

[pXq]→a[rYs][sZq].[pXq]\to a[rYs][sZq].

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 p,qp,q, Z0Z_0 inicial e cinco transições:

  • δ(p,a,Z0)={(p,AZ0)}\delta(p,a,Z_0)=\{(p,AZ_0)\};
  • δ(p,a,A)={(p,AA)}\delta(p,a,A)=\{(p,AA)\};
  • δ(p,b,A)={(q,ε)}\delta(p,b,A)=\{(q,\varepsilon)\};
  • δ(q,b,A)={(q,ε)}\delta(q,b,A)=\{(q,\varepsilon)\};
  • δ(q,ε,Z0)={(q,ε)}\delta(q,\varepsilon,Z_0)=\{(q,\varepsilon)\}.

A última transição esvazia o fundo no fim; sem ela, abab deixaria Z0Z_0 na pilha e não seria aceite por pilha vazia. Com as cinco transições, a máquina reconhece {anbn∣n≥1}\{a^nb^n \mid n \ge 1\}.

A variável [pXq][pXq] gera as palavras que levam de pp a qq removendo o XX do topo sem tocar no que está abaixo. Aplicando a construção geral a cada transição:

  • S→[pZ0p]∣[pZ0q]S \to [pZ_0p] \mid [pZ_0q];
  • empilhar Z0→AZ0Z_0\to AZ_0 por aa de pp para pp dá, para todos s,ts,t em {p,q}\{p,q\}: [pZ0t]→a[pAs][sZ0t][pZ_0t] \to a[pAs][sZ_0t], ou seja as quatro produções com t=p,qt=p,q e s=p,qs=p,q;
  • empilhar A→AAA\to AA por aa de pp para pp dá, para todos s,ts,t em {p,q}\{p,q\}: [pAt]→a[pAs][sAt][pAt] \to a[pAs][sAt], ou seja as quatro produções com t=p,qt=p,q e s=p,qs=p,q;
  • [pAq]→b[pAq] \to b e [qAq]→b[qAq] \to b, pelas duas transições que retiram AA lendo bb;
  • [qZ0q]→ε[qZ_0q] \to \varepsilon, pela transição que esvazia o fundo.

Para abab, fixa o estado intermédio s=qs=q: S⇒[pZ0q]⇒a[pAq][qZ0q]⇒ab[qZ0q]⇒abS \Rightarrow [pZ_0q] \Rightarrow a[pAq][qZ_0q] \Rightarrow ab[qZ_0q] \Rightarrow ab. A primeira produção usa a transição Z0→AZ0Z_0\to AZ_0 com s=qs=q; [pAq]→b[pAq]\to b consome o bb; [qZ0q]→ε[qZ_0q]\to\varepsilon esvazia o fundo. Cada variável regista onde começa e acaba a remoção de um marcador, e o ss quantificado liga as duas metades de AZ0AZ_0.

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 é (r,YZ)∈δ(q,a,X)(r,YZ)\in\delta(q,a,X). Parte de (q,ab,XW)(q,ab,XW) e escreve a configuração seguinte. Se rr for final e não tiver saídas, o ramo aceita a entrada abab? E se a entrada inicial for apenas aa?

Pista

Atualiza separadamente entrada, estado e pilha.

Solução

A transição lê aa e substitui só XX, conservando WW abaixo:

(q,ab,XW)⊢(r,b,YZW).(q,ab,XW)\vdash(r,b,YZW).

YY é o novo topo. O ramo não aceita abab, porque resta bb e não há saídas. Com entrada inicial aa, chega a (r,ε,YZW)(r,\varepsilon,YZW) 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.
Voltar à explicação
Dois marcadores por a

Descreve um PDA para {anb2n∣n≥0}\{a^nb^{2n}\mid n\ge0\} 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 a,X/AAXa,X/AAX. 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: (q0,abb,Z)⊢(q0,bb,AAZ)⊢(q1,b,AZ)⊢(q1,ε,Z)⊢(qf,ε,Z)(q_0,abb,Z)\vdash(q_0,bb,AAZ)\vdash(q_1,b,AZ)\vdash(q_1,\varepsilon,Z)\vdash(q_f,\varepsilon,Z). 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.

Voltar à explicação
Converter uma transição

Um PDA por pilha vazia tem estados p,rp,r e apenas estas transições: (r,AA)∈δ(p,a,Z)(r,AA)\in\delta(p,a,Z) e (r,ε)∈δ(r,b,A)(r,\varepsilon)\in\delta(r,b,A). O início é pp e a pilha inicial é ZZ. Constrói as produções relevantes de [pZr][pZr] 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 AA gera [rAr]→b[rAr]\to b. Para os dois marcadores, a regra útil escolhe rr como estado intermédio.

Solução

A regra de remoção é [rAr]→b[rAr]\to b. A transição inicial dá, para cada estado intermédio ss e destino qq, [pZq]→a[rAs][sAq][pZq]\to a[rAs][sAq]. A única escolha que permite uma derivação terminal é s=q=rs=q=r, ficando [pZr]→a[rAr][rAr]⇒abb[pZr]\to a[rAr][rAr]\Rightarrow abb.

O início da CFG tem regras S→[pZp]∣[pZr]S\to[pZp]\mid[pZr]; a primeira alternativa não gera palavras. O PDA lê aa para criar AAAA e lê dois bb para os retirar. Assim, aceita só {abb}\{abb\}. 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.

Voltar à explicação
Converter pilha vazia em estado final

Um PDA sobre {a}\{a\} tem início q0q_0, pilha inicial Z0Z_0 e apenas δ(q0,a,Z0)={(q1,ε)}\delta(q_0,a,Z_0)=\{(q_1,\varepsilon)\}. Aceita por pilha vazia. Converte-o para estado final e segue aa, aaaa e ε\varepsilon, com todas as configurações.

Pista

O fundo novo só aparece no topo quando a pilha simulada esvazia.

Solução

Acrescenta ⊥\bot, início p0p_0 e único final pfp_f. Inicializa com δ(p0,ε,⊥)={(q0,Z0⊥)}\delta(p_0,\varepsilon,\bot)=\{(q_0,Z_0\bot)\}, mantém a transição original e acrescenta δ(q,ε,⊥)={(pf,⊥)}\delta(q,\varepsilon,\bot)=\{(p_f,\bot)\} para cada q∈{q0,q1}q\in\{q_0,q_1\}. O final não tem saídas.

(p0,a,⊥)⊢(q0,a,Z0⊥)⊢(q1,ε,⊥)⊢(pf,ε,⊥).(p_0,a,\bot)\vdash(q_0,a,Z_0\bot)\vdash(q_1,\varepsilon,\bot)\vdash(p_f,\varepsilon,\bot).

Para aaaa, as configurações são (p0,aa,⊥)(p_0,aa,\bot), (q0,aa,Z0⊥)(q_0,aa,Z_0\bot), (q1,a,⊥)(q_1,a,\bot) e (pf,a,⊥)(p_f,a,\bot); rejeita pela entrada restante. Para ε\varepsilon, fica em (q0,ε,Z0⊥)(q_0,\varepsilon,Z_0\bot) depois da inicialização, sem transição possível. A linguagem de ambas as máquinas é {a}\{a\}.

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.
Voltar à explicação

Experimentar a contagem dupla

Compara abbabb e aabbbbaabbbb com abab e aabbaabb. 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

PassoEstadoPor lerPilha, topo à esquerda
0q0abbZ
1q0bbAAZ
2q1bAZ
3q1εZ
4qfε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 aabbaabb, aaccaacc, aabcaabc e ε\varepsilon, mostrando a configuração em que o ramo de aabcaabc 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 é {anbn∣n≥1}∪{ancn∣n≥1}\{a^nb^n\mid n\ge1\}\cup\{a^nc^n\mid n\ge1\}. 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.

aabbaabb passa pela fase q e aceita; aaccaacc passa por r e aceita. Para aabcaabc:

(p,aabc,Z)⊢(p,abc,AZ)⊢(p,bc,AAZ)⊢(q,c,AZ).(p,aabc,Z)\vdash(p,abc,AZ)\vdash(p,bc,AAZ) \vdash(q,c,AZ).

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 {b,c}\{b,c\} retiraria um A. A linguagem passaria a {anu∣n≥1, u∈{b,c}n}\{a^nu\mid n\ge1,\ u\in\{b,c\}^n\}, 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 ε.
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.