Como gerar uma gramática sensível ao contexto para www

7

Estou tentando resolver o próximo exame e não tenho idéia de como gerar a gramática para idiomas sensíveis ao contexto, por exemplo, como devo proceder nesse tipo de pergunta.

Forneça uma gramática sensível ao contexto (não apenas para aumentar o comprimento) {WWW:W{uma,b}}.

Idéias ou abordagens sobre como lidar com esse tipo de perguntas são muito apreciadas.

User_1234
fonte
4
Idéia: toda vez que você gerar um "a", gere também "a '" e "a' '" (o mesmo ocorre com "b" s). Agora, um '' pode alternar com uma letra não preparada para a direita (mas não com uma letra preparada com primer ou dobrada). No final, livre-se dos números primos.
Ran G.
11
Dica: "www" não é livre de contexto de forma que você tem a fazer uso das facilidades adicionais gramáticas sensíveis ao contexto lhe dar. Um tema comum é alternar não-terminal, movendo-o efetivamente pela sentença. Portanto, é fácil simular uma cabeça da MT com a gramática. Como você decidiria "www" algoritmicamente?
Raphael

Respostas:

5

Intuitivamente, você deseja gerar três símbolos intermediários por vez e permitir que os símbolos se classifiquem. DeixeiSseja o símbolo inicial. As regras de geração são:

SSUMA1 1UMA2UMA3
SSB1 1B2B3
As regras de classificação são as seguintes: Para símbolos XEu,YEu{UMA1 1,UMA2,UMA3,B1 1,B2,B3} de tal modo que j<Eu adicione a regra:
XiYjYjXi
No final, temos que transformar os símbolos intermediários em símbolos terminais. Transforme o símbolo inicial em outro símboloS1 para terminar a fase de geração.
SS1
Empurrar S1 através da seqüência de conversão de símbolos para símbolos terminais no caminho e incrementa o índice quando concluído com uma palavra w. Para todosi{1,2,3} adicione as regras:
SiAiaSi|aSi+1
SEuBEubSEu|bSEu+1 1
O subscrito de Sgarante que os símbolos sejam convertidos na ordem correta, pois o subscrito não pode diminuir. No final, removaS3.
S3ε
jnalanko
fonte
2
Embora sua gramática se aproxime, ela não é sensível ao contexto (solicitado pelo usuário_1234) devido a regras como "UMABBUMA"nem monótono devido a S3ϵ.
lukas.coenig
@ lukas.coenig De fato, a regra epsilon não é permitida (deve ser fácil de corrigir), mas, caso contrário, a gramática está na forma normal de Kuroda . Nem todas as definições de CSGs admitem isso, mas é famosa uma definição equivalente. Se o OP (ou qualquer leitor) precisar usar outra definição, ele poderá usar construções que tiram provas de equivalência das definições e aplicá-las (mecanicamente) a esta solução.
Raphael
11
@Raphael. Obrigado, mas não acho tão fácil. Considere a palavraumaumaumapor ex. Para obter essa palavra, você precisa começar comSSUMA1 1UMA2UMA3. O comprimento deste formulário sentencial é 4, enquanto o comprimento deumaumaumaé 3, então em algum lugar no caminho você teria que diminuir o tamanho do formulário sentencial. No entanto, isso não é permitido em uma gramática sensível ao contexto, pois não diminui, ou seja, para cada produçãoxy, é preciso ter __x____y__. Se não estou errado, isso significa que a solução do jnalanko está toda errada. No entanto, eu não consigo encontrar uma solução correta ...
Barbara
11
@Barbara Parece que estamos nos entendendo mal. Eu pretendia refatorar toda a gramática; você começaria comUMA1 10 0UMA2UMA3; índices superioresEu substituiria "direito de SEu". Abstratamente, todas as" despesas gerais "de tamanho constante podem ser dobradas em símbolos especiais. (Eu acho.)
Raphael
11
@Barbara Neste ponto, acho que você deveria abrir uma nova pergunta. Se o caminho daqui para o que você precisa não é tão simples quanto eu pensava, uma discussão nos comentários não é o caminho certo para esclarecer.
Raphael
2

A resposta para o seu exemplo específico está lá, mas a pergunta geral permanece.

Em muitos anos, tanto na ciência da computação teórica quanto na aplicada, não me lembro de ter que escrever uma gramática de CS como tal.

Ainda assim, se eu posso dar um conselho, isso não deve ser visto como produzir uma gramática de CF, se você tiver que inventar as regras para colocar tudo no lugar e coordenar exatamente como é produzido.

As gramáticas de CS são muito mais algorítmicas e você pode imitar uma máquina de Turing (trabalhando em espaço finito, proporcional ao tamanho da entrada, o que significa LBA) para mover as coisas conforme necessário. Portanto, é muito mais um exercício de programação.

Você pode praticamente gerar os primeiros ingredientes para criar uma das palavras no idioma e movê-las algoritmicamente. Você pode usar símbolos especiais (possivelmente em vários sabores correspondentes ao estado finito) para agir como cabeças que você move com as regras apropriadas, para verificar o que deve ser feito. E assim por diante.

Uma boa leitura pode ser procurar a prova de equivalência entre os idiomas CSG e os idiomas LBA, ou seja, os idiomas CS.

Lembre-se de que quase todos os algoritmos com os quais trabalhamos podem ser executados por um LBA, portanto, correspondem a uma linguagem definível por CSG. Isso deve lhe dar uma idéia do poder algorítmico disponível.

Mas um pouco de imaginação ajuda a soluções elegantes, como no exemplo que você deu.

babou
fonte
Então, para o idioma fornecido na pergunta de User_1234, como alguém poderia projetar um LBA para ele? Eu tenho apenas experiência em projetar máquinas de Turing para idiomas com separadores; Por exemplo:{W#W#W:W{uma,b}}, o que parece facilitar as coisas.
David Smith
@DavidSmith For WWWexiste uma solução específica simples fornecida no primeiro comentário Ran G e com detalhes na solução anterior. Isso é um pouco diferente da TM, que geralmente é construída como aceitadora (reconhecedora), enquanto aqui você deseja um construtor. Uma outra maneira de fazer isso é gerar uma stringW, depois adicione 2 símbolos # de um lado e substitua cada símbolo # por uma cópia da string W. Isso é mais complexo, mas funcionará para qualquer número de cópias deW, apenas aumentando o número de símbolos #.
babou
@DavidSmith Um LBA é um aceitador, que você "programa" praticamente como uma TM. Nesse caso, se você receberWWW e quer reconhecê-lo, você pode simplesmente ter um primeiro cálculo que de alguma forma (de várias maneiras) conte os símbolos para colocar os dois #no lugar certo. Como alternativa, você pode confiar no não determinismo e colocar os dois#em lugares aleatórios na sequência de entrada. Uma escolha será boa se a string estiver no idioma.
babou
1

essa é apenas uma resposta adicional que pode ser pensada como uma solução geral. CSLs, linguagens sensíveis ao contexto, são modeladas por LBAs, autômatos limitados lineares . um LBA é uma máquina de Turing que pode aceitar ou rejeitar uma fita de trabalho que não seja maior que um tempo constante do tamanho da fita de entrada. portanto, se você conseguir descobrir um programa de computador capaz de processar a entrada em espaço constante, é uma CSL. idéia: um programa que funcionasse para esse problema faria algo como enumerar permutações no espaço constante.

vzn
fonte