Ir para o conteúdo

CCT-UFCA/Ciência da Computação/Autômatos e Linguagens Formais/Autômatos de Pilha Determinísticos

De Wikiversidade

Autômatos com pilha determinísticos (APD) são uma classe fundamental de máquinas teóricas na teoria da computação e na linguística formal, utilizados para modelar e analisar linguagens que exigem um controle mais definido do que o que é possível com autômatos com pilha tradicionais (não-determinísticos). O determinismo de um APD proporciona uma maneira de lidar com as cadeias que é crucial para reconhecer linguagens que possuem dependências aninhadas ou recursivas, como as linguagens de programação e as expressões matemáticas, de forma determinística.

Os autômatos com pilha determinísticos operam de acordo com um conjunto bem definido de regras, e, ao contrário de seus equivalentes não-determinísticos, suas transições de estado são sempre unicamente determinadas pelo estado atual, pelo símbolo a ser lido e pelo símbolo no topo da pilha, garantindo um comportamento previsível e eficiente. Eles são capazes de reconhecer exatamente as linguagens livres-de-contexto determinísticas, que incluem uma ampla gama de linguagens utilizadas em várias áreas da ciência da computação e que detalharemos mais a frente.

Compreender os autômatos com pilha determinísticos é essencial para a análise e processamento de linguagens formais, oferecendo uma base sólida para a construção de compiladores, interpretadores e outras ferramentas de processamento de linguagem que são vitais para o desenvolvimento de software e a análise de sistemas complexos.

Definição formal e Funcionamento das APDs

[editar | editar código]

Observação: Se Σ é um alfabeto, Σε denota o conjunto Σ ∪ {ε};

Formalmente, um APD é uma tupla M = (Q, Σ, Γ, δ, q0, F), onde:

  • Q é o conjunto finito de estados;
  • Σ é o alfabeto de entrada;
  • Γ é o alfabeto da pilha;
  • δ : Q × Σε × ΓεP(Q × Γε) é a função de transição possuindo as seguintes restrições:
    • para cada qQ, aΣε e xΓε, o conjunto δ(q,a,x) tem no máximo 1 elemento;
    • para cada qQ e xΓε, se existe um símbolo aΣ tal que o conjunto δ(q, a, x) tem 1 elemento, então δ(q, ε, x) é vazio;
    • para cada qQ e a ∈ Σε, se existe um símbolo xΓ tal que o conjunto δ(q, a, x) tem 1 elemento, então δ(q, a, ε) é vazio;
  • q0 é o estado inicial, onde q0Q;
  • FQ é o conjunto de estados de aceitação.

De fato, por essa definição, todo APD é também um AP, porém nem todo AP é um APD.

O funcionamento de um APD é baseado em transições determinísticas, o que significa que, para cada combinação de estado atual, símbolo de entrada e símbolo no topo da pilha, a função de transição δ especifica de maneira única o próximo estado e a sequência de operações na pilha. Assim, não há ambiguidade no comportamento do autômato, ou seja, para cada situação possível, existe uma única ação a ser tomada.

Quando o autômato processa uma cadeia de entrada, ele começa no estado inicial q0 e com a pilha vazia. Em cada passo, o autômato lê um símbolo da entrada e o símbolo no topo da pilha, consulta a função de transição para determinar o próximo estado e a operação da pilha a ser executada, e então realiza essas operações. A pilha pode ser manipulada de várias maneiras: empilhando novos símbolos, desempilhando o topo atual, ou substituindo o topo da pilha por uma nova sequência de símbolos. Um autômato com pilha determinístico aceita uma cadeia de entrada se, após processar toda a cadeia, ela se encontra em um estado final.

Propriedades das APDs

[editar | editar código]

Uma linguagem livre-de-contexto determinística (LLCD) é uma linguagem que pode ser reconhecida por um APD. Exemplos de LLCD são as linguagens L1 = {0n1n2m | n, m ≥ 0} sobre o alfabeto Σ1 = {0, 1, 2} e L2 = {w#w−1 | w ∈ {0, 1}*} sobre o alfabeto Σ2 = {0, 1, #}.

Teorema 1. As linguagens L1 = {0n1n | n ≥ 0} sobre o alfabeto Σ1 = {0, 1}; L2 = {w#w−1 | w ∈ {0, 1}*} sobre o alfabeto Σ2 = {0, 1, #} e L3 = {0n#0m | 0 ≤ nm} sobre o alfabeto Σ3 = {0, #} são LLCDs.

Demonstração. O seguinte APD reconhece a linguagem L1:

O seguinte APD reconhece a linguagem L2:

Finalmente, o seguinte APD reconhece a linguagem L3:

Toda linguagem regular também é uma LLCD, visto que um AFD pode ser visto como um APD que não faz uso da sua pilha. Portanto, como as linguagens do Teorema 1 não são regulares, temos que os APDs possuem um poder de expressão maior do que os AFDs e AFNs.

Como todo APD é também um AP, temos que toda LLCD é também uma linguagem livrede-contexto. No entanto, temos que há linguagens livres-de-contexto que não são LLCDs, por exemplo, a linguagem sobre o alfabeto Σ = {0, 1} que contém todos os palíndromos com tamanho par. A intuição de que ela não é uma LLCD vem do fato de que uma APD não tem como decidir com certeza se a cadeia de entrada já foi lida até a sua metade ou não, e, por isso, é necessário o uso de não-determinismo nesse ponto.

Com isso temos que os APs possuem um poder de expressão maior do que os APDs, dado que a linguagem do palíndromos de tamanho par sobre o alfabeto Σ = {0, 1} é livre-decontexto, porém não é uma LLCD. Com isso, concluímos que o conjunto das linguagens regulares está estritamente incluído dentro do conjunto das LLCDs, que, por sua vez, está estritamente incluída dentro do conjunto das linguagens livres-de-contexto. Na Figura 1, temos um diagrama ilustrando a hierarquia dessas classes de linguagens no contexto de inclusão.


Sobre as propriedades de fecho das LLCDs, o conjunto das LLCDs é fechado em relação ao complemento, ou seja, o complemento de uma LLCD é também uma LLCD. Por outro lado, o conjunto das LLCDs não é fechado para a união, a interseção, a concatenação e a operação estrela. Por exemplo, as linguagens L1 = {0n1n2m | n, m ≥ 0} e L2 = {0m1n2n | n, m ≥ 0} são ambas LLCDs, porém a sua interseção L1 ∩ L2 = {0n1n2n | n ≥ 0} não é (ela sequer é livre-de-contexto). No entanto, se L1 é uma LLCD e L2 é uma linguagem regular, a sua união, interseção e concatenação são LLCDs.

Outra propriedade interessante e relevante em áreas como a construção de compiladores é a de que toda LLCD é gerada por alguma gramática livre-de-contexto não-ambígua, característica essa essencial para linguagens formais que descrevem a sintaxe de linguagens de programação. De fato, toda linguagem reconhecida por um APD que possui apenas um estado é uma linguagem LL(1), que é uma classe de linguagens importantes na representação sintática de linguagens de programação por possuí parsers eficientes.

Linguagens não-LCD

[editar | editar código]

Para mostrar que uma linguagem não é livre-de-contexto determinística, existe um Lema do Bombeamento para LLCDs [1]. No entanto, ao contrário dos lemas do bombeamento das linguagens regulares e livres-de-contexto, esse lema do bombeamento é complexo de se entender e de se aplicar.

Uma outra forma de se provar que uma linguagem não é livre-de-contexto determinística usando linguagens não livres-de-contexto. Essa abordagem, consiste em supor por absurdo que uma linguagem é LLCD e, usando o seu APD, construir um AP para uma linguagem que se sabe que não é LLC.

Para exemplificar essa abordagem, abaixo, provamos que a linguagem L = {anbm | m = n ou m = 2n} não é uma LLCD. Suponha por absurdo que ela é uma LLCD e seja M1 o seu APD. Temos que, para cada n ≥ 0, as cadeias anbn e anb2n são aceitas e, como o APD é determinístico, o caminho que o APD faz para aceitar a cadeia anb2n deve passar pelo estado de aceitação que aceita a cadeia anbn, visto que anbn é prefixo de anb2n. Esta situação está ilustrada abaixo.


Se mudarmos todo símbolo b por um c, temos um outro APD, digamos M2, em que a mesma situação da figura acima se repete, mas para os símbolos a e c. Esta situação está ilustrada abaixo.


Considere o AP M construído da seguinte forma: adicione M1 e M2, fazendo o estado inicial de M1 ser o estado inicial de M; faça os estados finais de M1 e M2 serem os estados finais de M e, para cada n, adicionarmos uma transição ε, ε → ε do estado de aceitação de M1 que aceita anbn para o estado de aceitação de M2 que aceita ancn e do estado de aceitação de M1 que aceita anb2n para o estado de aceitação de M2 que aceita anc2n. Essa construção está ilustrada abaixo.


Temos que toda cadeia aceita por M1 é aceita por M. Adicionalmente, toda cadeia anbncn também é aceita para todo n ≥ 0. Assim, temos que L(M) = L ∪ {anbncn | n ≥ 0}, o que é um absurdo, pois é possível mostrar pelo lema do bombeamento, que L(M) não é uma LLC.

Referências

[editar | editar código]

[1] Yu, S. A pumping lemma for deterministic context-free languages. Information Processing Letters, vol. 31 (1), p. 47-51. 1989.Disponível em: https://sci-hub.se/https://www.sciencedirect.com/science/article/abs/pii/0020019089901087. Acesso em: 11/11/2024.