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).
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Substitua por . Agora podemos reduzir em condições.2 l nn2ln
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≠ok>o or k<ook>ok>ok=s+os>0sks+o
L1={bs+oal(bc)ma2lbo∣l,m,o,s∈N,s>0,m≥2}
Algumas reescritas simples.
L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}
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→bUU→bU∣ε
O bV→bVb∣W (geramos 'em ambos os lados)o b
W→aWaa∣X
Y → b c b c Z → b c Z ∣ εX→YZ , ,Y→bcbcZ→bcZ∣ε
Exemplo 2
K={akblcm∣l=m+k}
Uma primeira reescrita "óbvia".
K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}
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,mm+k=k+m
K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}
com produções , ,X → a X b ∣ ε Y → b Y c ∣ εS→XYX→aXb∣εY→bYc∣ε
Da mesma formaK′={akblcm∣m=k+l}={akblclck∣k,l≥0}
com produções ,X → b X c ∣ εS→aSc∣XX→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).