Estou procurando uma gramática sensível ao contexto que descreva o seguinte idioma: .
Eu tenho problemas com o fato de que nenhuma regra como é permitida e, portanto, não posso colocar nenhum termo-terminal indicando o "meio" da palavra. Existe algum truque para o problema?
Respostas:
De fato, existe um truque simples que permite adicionar informações extras em uma determinada posição: basta substituir uma letra adjacente à posição e marcar com a informação e a letra original.
No seu exemplo, tenha um não-terminal para o meio, mas como não pode ser excluído, também conta como uma letra normal. Assim, temos duas cópias M a e M b para indicar as letras substituídas. No final da derivação, os marcadores devem ser substituídos pelo conteúdo das letras, por produções simples como M a → a .M Muma Mb Muma→ a
Na maioria dos casos, a aplicação de precisa ser realizada no final do processo de derivação. Em algumas construções, isso não precisa ser "cronometrado": quando o M desaparece muito cedo, a derivação não consegue encontrar uma posição adequada e o processo não para com sucesso. Em outros casos, é preciso um tipo de controle. Às vezes, isso é feito através da introdução de um termo não terminal como um sinal que se move ao longo das letras. Novamente, esse sinal também deve transportar um terminal, caso contrário você acaba com os mesmos problemas.Muma→ a M
Movendo informações ao redor é fácil nas chamadas gramáticas monotónicos ( com | alfa | ≤ beta | ) usando regras como X A → A X , que pode ser visto como X salto sobre A . Para gramáticas sensíveis ao contexto, é necessário dividir isso em três etapas: X A → X A X , X A X → A A X , A A X → A Xα → β | α | ≤β| XA → A X X UMA XA → XUMAX, XUMAX→ A AX, A AX→ A X . em cada produção, uma letra é alterada no contexto apropriado. É preciso muita imaginação para ver esse processo não interagir com outras partes da derivação. Por exemplo, o que acontece quando o na última etapa é envolvido pela primeira vez em outra etapa de derivação?UMA
Isso pode não funcionar para palavras muito curtas, quando há mais informações do que posições disponíveis. A solução mais simples para isso é ignorar seqüências curtas em sua construção e gerá-las separadamente.
fonte
Resposta padrão curta: crie um LBA que aceite o idioma e use a simulação usada para provar que gramáticas sensíveis ao contexto e LBA definem o mesmo conjunto de idiomas. Mas é claro que não é isso que você procura.
Isso pode ser feito trocando um token de controle. Ou seja, a gramática esquerda escolhe uma regra, gera o token de controle de ajuste e o passa para a gramática correta. A gramática correta vê o token de controle e executa a regra de ajuste. Observe que você também pode implementar a comunicação bidirecional dessa maneira, mas não é necessário aqui.
Uma maneira de conseguir isso é usar o mesmo truque de algumas provas sobre o LBA: gere todos os não terminais que você precisará primeiro , ou seja, prepare a "fita". Mais tarde, "mova-se" nessa fita. Somente "no final", substitua todos os não terminais por terminais.
fonte
fonte