Respostas:
Não é (pelo menos) um meio de provar ambiguidades de uma gramática para a língua L . Consiste em duas etapas:
O primeiro passo é bem claro: mostre que a gramática gera (pelo menos) as palavras que você deseja, isto é, correção.
O segundo passo mostra que tem tantas árvores de sintaxe para palavras de comprimento n quanto L tem palavras de comprimento n - com 1. isso implica inequívoco. Ele usa a função de estrutura de G, que remonta a Chomsky e Schützenberger [1], a saber
com o número de árvores de sintaxe G tem para palavras de comprimento n . Claro que você precisa ter | L n | para que isso funcione.
O bom é que é (geralmente) fácil de obter para linguagens livres de contexto, apesar de encontrar uma forma fechada para t n pode ser difícil. Transforme G em um sistema de equações de funções com uma variável por não-terminal:
Isso pode parecer assustador, mas é realmente apenas uma transformação sintática, como ficará claro no exemplo. A ideia é que os símbolos terminais gerados são contados no expoente de e porque o sistema tem a mesma forma que G , z n ocorre tão frequentemente na soma de n terminais pode ser gerado por L . Verifique Kuich [2] para detalhes.
Resolver este sistema de equações (álgebra computacional!) Produz ; agora você "apenas" precisa puxar o coeficiente (de forma geral fechada). O TCS Cheat Sheet e a álgebra computacional costumam fazer isso.
Considere a gramática simples com regras
.
É claro que (passo 1, prova por indução). Existem 2 n palíndromos de comprimentonsenfor par,0caso contrário.
A configuração do sistema de equações produz
cuja solução é
.
Os coeficientes de coincidem com os números de paldromas, então G é não ambígua.
Essa é uma boa pergunta, mas alguns usuários do Google diriam que não há um método geral para decidir a ambiguidade , portanto, é necessário tornar sua pergunta mais específica.
Para algumas gramáticas, é possível uma prova por indução (acima do tamanho da palavra).
Considere, por exemplo, uma gramática sobre Σ = { a , b } fornecida pelas seguintes regras:
Todas as palavras de comprimento em L ( G ) - há apenas ε - têm apenas uma derivação à esquerda.
Suponha que todas as palavras de comprimento para alguns n ∈ N tenham apenas uma derivação à esquerda.
Agora considere arbitrária por algum n > 0 . Claramente, w 1 ∈ Σ . Se w 1 = a , sabemos que a primeira regra em toda derivação à esquerda deve ser S → a S a ; se w 1 = b , deve ser S → b S b
Isso se torna mais difícil se
Pode ajudar a fortalecer a reivindicação de todas as formas sentenciais (se a gramática não tiver terminais não improdutivos) e terminais não raiz "raiz".
Penso que a conversão para a forma normal de Greibach mantém a (des) ambiguidade, para aplicar esta etapa primeiro pode cuidar bem da recursão à esquerda.
A chave é identificar um recurso de cada palavra que corrige (pelo menos) uma etapa de derivação. O resto segue indutivamente.
Basically, it's a child generation problem. Start with the first expression, and generate it's children .... Keep doing it recursively (DFS), and after quite a few iterations, see if you can generate the same expanded expression from two different children. If you are able to do that, it's ambiguous. There is no way to determine the running time of this algorithm though. Assume it's safe, after maybe generating 30 levels of children :) (Of course it could bomb on the 31st)