Alguém pode dar um exemplo simples, mas não de brinquedo, de uma gramática sensível ao contexto?

12

Estou tentando entender gramáticas sensíveis ao contexto.

Eu entendo por que idiomas como

  1. {wwwA}
  2. {anbncnnN}

não são livres de contexto, mas o que eu gostaria de saber se uma linguagem semelhante ao cálculo lambda sem tipo é sensível ao contexto.

Gostaria de ver um exemplo de um simples, mas não brinquedo (considero os exemplos de brinquedos acima), um exemplo de gramática sensível ao contexto que pode, para algumas regras de produção, por exemplo, dizer se alguma sequência de símbolos é ou não está no escopo atualmente (por exemplo, ao produzir o corpo de uma função).

As gramáticas sensíveis ao contexto são poderosas o suficiente para tornar variáveis ​​indefinidas / não declaradas / não vinculadas um erro sintático (e não semântico)?

BlueBomber
fonte
1
quase todas as linguagens de programação reais são sensíveis ao contexto (no sentido geral, ou seja, confluem as gramáticas chomsky tipo 0 e tipo I em "sensível ao contexto"). Por exemplo, variáveis ​​precisam ser declaradas antes de serem usadas, identificadores devem ser únicos, todos eles exigem contexto (referidos como contexto semântico, mas podem ser enganosos) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .
Bem, "sensível ao contexto" é o termo padrão para gramáticas do tipo 1.
Reinierpost

Respostas:

8

Sim, eu acredito que isso seja possível, mas não, não estou disposto a construir explicitamente essa gramática sensível ao contexto. Vou explicar minha resposta, dividindo a pergunta em duas partes diferentes.

(1) Qual seria o exemplo de não brinquedo? Deve refletir a declaração de variáveis. Minha proposta de uma linguagem assim, abstraída da programação real, seria algo assim. O alfabeto é . { w 1 ; w 2 ; ... ; w n ( x 1 ; x 2 ; ; x m ) w i , x j{ a , b{a,b,;,(,)} que a linguagem é sensível ao contexto.

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2) Para mostrar que é realmente sensível ao contexto, eu usaria outro formalismo. O de uma máquina de Turing com uso linear de sua fita: um autômato linear delimitado LBA. Eu posso programá-lo para fazer a correspondência de padrões / eu consideraria consecutivamente cada e tentaria combiná-lo com um w j adequado , letra por letra. Os LBAs são equivalentes a gramáticas sensíveis ao contexto, mas muito mais fáceis de programar.xjwj

Hendrik Jan
fonte
Obrigado pelo post. Estou menos familiarizado com os LBAs a partir de agora, então estou menos convencido com o ponto (2). No ponto (1), estou tentando ver como construir regras que produzirão, onde um nome de variável é esperado como expressão, apenas uma das variáveis ​​no escopo atual. Não preciso ver um CSG formal e completo, mas apenas uma explicação informal funcionaria. Não consigo imaginar como fazê-lo com nomes de variáveis ​​com vários símbolos, que é um uso diferente do contexto do que, por exemplo, usar um único contexto não terminal para direcionar o acordo do número do verbo do sujeito em uma derivação de sentenças em inglês.
{WWW...}
{ww|w...}
3
{ww}LRLwRwLaMawMabbMaRMaRRa
13

[n]

Muitas outras linguagens NP-hard também estão no CSL pelo mesmo motivo, como CLIQUE.

Também existem linguagens bastante naturais na CSL que são ainda mais difíceis.

No entanto, não conheço nenhuma maneira de expressar uma CSL arbitrária como uma gramática sensível ao contexto (CSG), além de usar a construção de Landweber no Teorema 3 de seu artigo. Nesta construção, o CSG descreve o reverso da operação do autômato de limite linear que reconhece o CSL. As produções do CSG descrevem como um determinado estado da máquina resulta de um possível movimento. Esse CSG é uma tradução direta do autômato em uma gramática; portanto, ele não corresponde necessariamente a recursos de idioma, como poder declarar variáveis, mas será atolado pelos detalhes do autômato.

Se você insiste em um CSG em vez de um CSL, e se sua pergunta real é especificamente sobre querer ver um CSG para um idioma que envolva escopo de variável restrito, a resposta de Hendrik Jan parece ser um bom começo.

András Salamon
fonte
9

Sim, gramáticas sensíveis ao contexto (CSG) são poderosas o suficiente para fazer a verificação de variáveis ​​indefinidas / não declaradas / não acopladas, mas infelizmente não conhecemos nenhum algoritmo eficiente para analisar seqüências de caracteres de CSG.

Um exemplo real de uma linguagem sensível ao contexto é a linguagem de programação C. Um recurso como declarar variáveis ​​primeiro e depois usá-las posteriormente torna a linguagem C uma linguagem sensível ao contexto (CSL). ( Eu não sei sobre cálculo lambda sem tipo ).

E porque não conhecemos nenhum algoritmo de análise linear para CSL (ou CSG). Essa é a razão no design do compilador, usamos o CFG (e apenas seu algoritmo de análise) para verificação de sintaxe, pois conhecemos algoritmos eficientes para analisar o CFG (se estiver em forma restrita). Os compiladores analisam primeiro um recurso livre de contexto e, posteriormente, manipulam recursos sensíveis ao contexto de maneira problemática (por exemplo, verifica qualquer variável usada na tabela de símbolos, se estiver definida. Caso contrário, gera um erro).

A gramática sensível ao contexto também é usada no processamento de linguagem natural (PNL). E a maioria das linguagens naturais são exemplos de linguagens sensíveis ao contexto. (Não sei ao certo o idioma sânscrito ).

Vou tentar explicá-lo com um exemplo bobo, mas simples (é apenas uma ideia, você pode refinar):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

Agora, usando essa gramática, podemos gerar algumas declarações corretas, mas algumas também estão erradas. Por exemplo,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Mas

             Grijesh    am       working       [wrong statement]

Razão: o valor de <TENSE> depende do valor <NOUN> (por exemplo I &lt;TENNSE> --> I am) e, portanto, a gramática não gera instruções corretas no idioma inglês.

Na verdade, não podemos escrever uma gramática sem contexto para inglês completo!

Você deve ter notado que qualquer tradutor de idioma natural ou verificador gramatical não funciona corretamente (tente com instruções longas). Porque esse problema está no algoritmo de análise sensível ao contexto.


REFERÊNCIA : Você pode assistir às palestras do Dr. Arun Kumar . Em algumas palestras, ele explica exatamente em que você está interessado.

Grijesh Chauhan
fonte
Obrigado pela informação, sem dúvida será útil para outras pessoas interessadas neste mesmo tópico, mas está apenas parcialmente relacionado ao que eu estava perguntando. Não estou preocupado em analisar uma string gerada por um CSG, mas em ver um exemplo simples - até bobo - de um CSG formal que gera abstrações bem formadas (sem variáveis ​​não acopladas no corpo da função). Eu posso imaginar um CSG para gerar seqüências "inglesas" corretas, pois um único símbolo pode direcionar a concordância sujeito / verbo, mas com abstrações, as variáveis ​​são tipicamente compostas por vários símbolos.
1
@ BlueBomber: obrigado, com certeza vou te responder, é noite na Índia .. N Feliz ano novo! :)
Grijesh Chauhan
Parece que só posso fazer isso um número limitado de vezes e, de acordo com (this) [ meta.scicomp.stackexchange.com/questions/156/… , devo excluir esta pergunta e reposicioná-la no local mais apropriado ...
@BlueBomber eu sinalizei para mudar, você também pode fazer.
Grijesh Chauhan 01/01
1

(estendendo comentários em resposta)

Não tenho certeza se este é um exemplo que você gostaria.

Quase todas as linguagens de programação reais são sensíveis ao contexto (no sentido geral, ou seja, combinam as gramáticas Chomsky tipo 0 e tipo I com "sensível ao contexto", o que é verdade, é claro, pois gramáticas irrestritas são ainda mais sensíveis ao contexto do que o contexto gramáticas sensíveis ).

Por exemplo, "as variáveis ​​precisam ser declaradas antes de usadas", "os identificadores devem ser únicos", tudo isso exige contexto (às vezes referido como contexto semântico, mas que pode ser enganoso, pois envolve recursos sintáticos de qualquer maneira), veja, por exemplo, https: // www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf

A sensação de que os exemplos acima são sensíveis ao contexto (no sentido gramatical / sintático e semântico) é porque eles falam sobre seu contexto (o que precede ou vem depois).

Uma "variável já definida" é sobre contexto anterior , um uso variável. Um "identificador exclusivo" é o contexto do que precede ou vem após uma declaração de identificador, e assim por diante.

veja também O JavaScript é uma linguagem livre de contexto?no SO

Nikos M.
fonte
"Sensível ao contexto" significa tipo 1.
reinierpost