Existem muitas técnicas para provar que uma linguagem não é livre de contexto, mas como posso provar que uma linguagem é livre de contexto?
Que técnicas existem para provar isso? Obviamente, uma maneira é exibir uma gramática sem contexto para o idioma. Existem técnicas sistemáticas para encontrar uma gramática livre de contexto para um determinado idioma?
Para linguagens regulares, não são formas sistemáticas para derivar um autômato regulares gramática / finito de estado: por exemplo, o Myhill-Nerode teorema fornece uma maneira. Existe alguma técnica correspondente para linguagens sem contexto?
Minha motivação aqui é (espero) criar uma pergunta de referência que contenha uma lista de técnicas que geralmente são úteis, ao tentar provar que uma determinada linguagem é livre de contexto. Como temos muitas perguntas aqui que são casos especiais disso, seria bom se pudéssemos documentar a abordagem geral ou as técnicas gerais que se pode usar ao enfrentar esse tipo de problema.
Respostas:
Uma abordagem prática que, em muitos exemplos, funciona [mas nem sempre, eu sei] está tentando encontrar a estrutura de aninhamento das strings na linguagem. "Dependências aninhadas" devem ser geradas ao mesmo tempo em diferentes partes da cadeia.
Também temos a caixa de ferramentas básica :
concatenação: se você puder dividir o idioma em duas partes consecutivas, use esta produçãoS→S1S2
união: dividida em partes separadasS→S1∣S2
iteração:S→S1S∣ε
Exemplo 1
Aqui está um exemplo para o aninhamento (obrigado Raphael).
Substitua por . Agora podemos reduzir em condições.2 l nn 2l n
Substitua por (confuso? é 'oh' e não 'zero'). Aplique ferramentas para união. Trabalhamos com aqui. Também sse e , onde é um novo variável. Substitua por .k > o ou k < o o k > o k > o k = s + o s > 0 s k s + ok≠o k>o or k<o o k>o k>o k=s+o s>0 s k s+o
Algumas reescritas simples.
Agora vemos a estrutura de aninhamento e começamos a construir uma gramática.
T → b U U → b U ∣ εS1→TV , , (consulte: concatenação e iteração aqui)T→bU U→bU∣ε
O bV→bVb∣W (geramos 'em ambos os lados)o b
Y → b c b c Z → b c Z ∣ εX→YZ , ,Y→bcbc Z→bcZ∣ε
Exemplo 2
Uma primeira reescrita "óbvia".
No lingüístico, isso é chamado de "dependência entre séries": a intercalação (geralmente) indica fortemente a ausência de contexto sem contexto. Claro que me somos salvos.m + k = k + mk,m,k,m m+k=k+m
com produções , ,X → a X b ∣ ε Y → b Y c ∣ εS→XY X→aXb∣ε Y→bYc∣ε
Da mesma formaK′={akblcm∣m=k+l}={akblclck∣k,l≥0}
com produções ,X → b X c ∣ εS→aSc∣X X→bXc∣ε
Comentário final: essas técnicas ajudam a criar uma gramática livre de contexto do candidato que, esperamos, reconheça seu idioma. Uma prova de correção ainda pode ser necessária, para garantir que a gramática realmente funcione para reconhecer seu idioma (nada mais e nada menos).
fonte
Existe uma caracterização da CFL que pode ser útil, o teorema de Chomsky-Schützenberger .
Linguagem dyck
Teorema de Chomsky-Schützenberger
Observe que o homomorfismo é estendido para palavras (símbolo por símbolo) e depois para idiomas (palavra por palavra).
Exemplo
Considere . ComL={anbncm∣n,m∈N
o teorema implica que é livre de contexto, em particular porqueL
Exemplo 2
e com isso
Para gramáticas e autômatos
Se queremos ter um autômato ou gramática no final, temos mais trabalho pela frente.
fonte