Programação  
 
Rede de conhecimento computador >> Programação >> Programação De Computador Idiomas >> Content
Como o lema de bombeamento pode ser usado para provar que um idioma não está livre de contexto?
O lema de bombeamento para idiomas livres de contexto (CFLS) é uma ferramenta poderosa para provar que um determinado idioma não é * sem contexto. É uma prova da técnica de contradição. Aqui está o processo geral e as principais idéias:

1. Declare o lema de bombeamento (com cuidado!)

Antes de começar, é essencial entender a declaração do lema de bombeamento *exatamente *. Aqui está uma formulação comum:

bombear lema para CFLs:
Se l é uma linguagem sem contexto, existe um número inteiro *p *(o "comprimento do bombeamento") de modo que, para qualquer string *s *em l com comprimento maior ou igual a *p *(| s | ≥ *p *), *s *pode ser dividido em cinco substringas:*s =uvxyz *, satisfazendo as seguintes condições:

* | vxy | ≤ * p * (a parte do meio que está sendo bombeada não é muito longa)
* | vy | ≥ 1 (a seção bombeada não está vazia)
* Para todos * i * ≥ 0, * uv i xy i Z* também está em L (bombeando 'v' e 'y' qualquer número de vezes mantém a corda no idioma)

2. Suponha que o idioma * seja * sem contexto

Comece assumindo, por uma questão de contradição, que o idioma *l *você deseja provar é *não *sem contexto *é *, de fato, sem contexto. Esta é a suposição inicial de que você acabará por refutar.

3. Seja * p * o comprimento do bombeamento

Como você assumiu que * l * é livre de contexto, o lema de bombeamento * deve * se aplicar. Isso significa que existe um comprimento de bombeamento * P * (do qual você não conhece o valor exato). É crucial lembrar que o adversário (quem sabe que o idioma não é *sem contexto e está tentando enganá-lo) pode escolher *p *. Seu objetivo é encontrar uma corda que * não importa qual o valor de P * seja escolhido, as condições do lema de bombeamento levam a uma contradição.

4. Escolha uma string*s*∈*l*tal que |*s*| ≥ *p *

Esta é uma etapa crítica. Você deve selecionar cuidadosamente uma string *s *que pertence ao idioma *l *e tem um comprimento maior ou igual a *p *. A escolha de * s * é crucial para fazer a prova funcionar. Pense na estrutura das cordas em seu idioma e em como o bombeamento pode afetar essa estrutura. O objetivo é escolher uma corda cujas propriedades serão violadas quando 'V' e 'Y' forem bombeadas de uma maneira ditada pelo lema de bombeamento. Essa escolha *frequentemente *envolve a definição de algumas partes da string com base no valor *p *.

*Pense nas propriedades que fazem as cordas na linguagem pertencem a ela. Em seguida, escolha uma string de tal maneira que, quando qualquer sub-string for bombeada, pelo menos uma das restrições para a associação ao idioma é violada.*

5. Considere todas as decomposições possíveis * s =uvxyz * satisfazendo | vxy | ≤ * p * e | vy | ≥ 1

O lema de bombeamento afirma que*qualquer*string*s*com |*s*| ≥ * p * pode ser dividido dessa maneira. Então, * seu adversário * escolhe como * s * é dividido em * uvxyz * (sujeito às restrições | vxy | ≤ * p * e | vy | ≥ 1). No entanto, você considera todas essas divisões possíveis. Você precisa mostrar que *não importa como *o adversário escolher *u *, *v *, *x *, *y *e *z *, você pode bombear a corda para obter uma contradição.

Freqüentemente, isso envolve considerar diferentes casos * *com base em onde *v *e *y *poderia potencialmente se enquadrar na string *s *. Para cada caso, você analisará o que acontece quando bombear *v *e *y *.

6. Mostre isso para alguns *i *≥ 0, a string *uv i xy i z * não é * * em * l *

Este é o núcleo da contradição. Para cada caso considerado na etapa 5, você deve mostrar que existe alguns *i *(geralmente *i *=0 ou *i *=2, mas às vezes outros valores são necessários) de modo que a string resultante *uv i xy i Z*não é**no idioma*l*. Isso significa que viola as regras que definem cordas pertencentes ao idioma.

* como mostrar * uv eu xy i z * não está em * l *:Isso dependerá do idioma específico. Você precisará demonstrar que a corda bombeada viola as propriedades definidoras de *l *. As estratégias comuns incluem:

* mostrando que a string agora tem um número desigual de símbolos que eram antes iguais. Por exemplo, se * l * requer o mesmo número de 'A e' B, você mostra que o bombeamento faz com que a contagem seja desigual.
* mostrando que a ordem dos símbolos está agora incorreta. Por exemplo, se * l * exigir todos os 'A's para chegar antes de todos os' B, você mostra que o bombeamento pode colocar um 'b' antes de um 'a'.
* mostrando que uma relação matemática entre as contagens não mantém mais. Por exemplo, se * l * exigir que o número de 'A seja o dobro do número de' B, você mostra que o bombeamento viola esse relacionamento.

7. Conclua que * l * não * não * sem contexto

Como você mostrou que a suposição de que * l * é livre de contexto leva a uma contradição (o lema de bombeamento deve manter, mas você mostrou um caso em que não), você pode concluir que sua suposição inicial era falsa. Portanto, * l * não é uma linguagem sem contexto.

Exemplo:a linguagem l ={a n B n c n | n ≥ 0}

Vamos provar que * l * ={a n B n c n | n ≥ 0} não está livre de contexto usando o lema de bombeamento.

1. assume * l * é livre de contexto.

2. Vamos * P * o comprimento do bombeamento garantido pelo lema de bombeamento.

3. Escolha uma string *s *: Seja*s*=a *p* b *p* c *p* . Claramente,*s*∈*l*e |*s*| =3*p*≥*p*.

4. Considere todas as divisões possíveis * s =uvxyz * tal que | vxy | ≤ * p * e | vy | ≥ 1: Precisamos considerar onde as substringas *v *e *y *podem ser localizadas dentro de *s *. A restrição crucial é que | vxy | ≤ *p *. Isso limita significativamente as possibilidades:

* Caso 1:* vxy * consiste apenas em 'a's. Então * v * =a j e * y * =a k Para alguns*j*,*k*≥ 0 e*j + k*≥ 1. Se bombearmos (*i*=0), obtemos a string a *p-j-k* b *p* c *p* . Como * j + k * ≥ 1, essa corda tem menos de * p * 'a, mas ainda tem * p *' b's e * p * 'c's. Portanto, não está em *l *.

* Caso 2:* vxy * consiste apenas em 'B's. Então * v * =b j e * y * =b k Para alguns*j*,*k*≥ 0 e*j + k*≥ 1. Se bombearmos (*i*=0), obtemos um *p* B *p-j-k* c *p* . Novamente, o número de 'B's é menor que *P *, enquanto os números de' A e 'C permanecem *P *, então não está em *l *.

* Caso 3:* vxy * consiste apenas em 'c's. Então * v * =c j e * y * =c k Para alguns*j*,*k*≥ 0 e*j + k*≥ 1. Se bombearmos (*i*=0), obtemos um *p* b *p* c *p-j-k* . O número de 'C's é menor que *P *, enquanto os números de' A e 'B permanecem *P *, então não está em *l *.

* Caso 4:* Vxy * consiste em 'A e' B's. Desde | vxy | ≤ *p *, ele não pode incluir nenhum 'c's porque todos os *p *' a's e *p *'b's devem preceder qualquer "c's. Desde | vy | ≥ 1, pelo menos um de * v * ou * y * deve conter um caractere. Portanto * v * =a j B k e * y * =a l b m para alguns *j *, *k *, *l *, *m *≥ 0 e *j + k + l + m *≥ 1, com pelo menos um de 'a' ou 'b' em *v *ou *y *.

Se bombearmos (*i*=2), obtemos a string a *p+j+l* b *p+k+m* c *p* . Se * k + m * for zero (então * v * e * y * contém apenas 'a's) o número de' A aumenta, mas o número de 'B permanece o mesmo. O resultado é um *p+j+l* b *p* c *p* que não está mais no idioma. Se * j + l * for zero (então * v * e * y * contém apenas 'b's), o número de' b's aumenta, mas o número de 'A permanece o mesmo. O resultado é um *p* b *p+k+m* c *p* que não está mais no idioma. Se ambos *k+m *e *j+l *forem maiores que zero, então *uv 2 xy 2 Z* tem mais 'A e' B do que 'C, o que significa que não pode ser da forma A n B n c n .

* Caso 5:* vxy * consiste em 'B e' C's. Isso é simétrico para o caso 4. Novamente, a bombeação resultará em uma string que não está no idioma.

5. contradição: Em todos os casos possíveis, mostramos que existe um *i *tal que *uv i xy i Z*não está em*l*. Isso contradiz o lema de bombeamento.

6. Conclusão: Portanto, nossa suposição inicial de que * l * está livre de contexto deve ser falsa. Assim, * l * ={a n B n c n | n ≥ 0} não está livre de contexto.

Dicas de chave para usar o lema de bombeamento:

* Entenda o lema com precisão: Conheça a declaração e as condições exatas.
* Escolha estratégica de string: A escolha de * s * é crucial. Escolha uma string que destaque a propriedade que você deseja romper com o bombeamento. Freqüentemente, definir partes da string com base em * p * é útil.
* Análise de caso cuidadosa: Considere todos os locais possíveis para *v *e *y *dentro *s *, dadas as restrições | vxy | ≤ * p * e | vy | ≥ 1.
* Escolha a direita * i *:Experimente com *i *=0, *i *=2, ou outros valores para encontrar o que mais claramente demonstra a violação de *l *. Às vezes * i * =0 faz com que algo desapareça e * i * =2 fará com que algo seja duplicado.
* Seja claro e rigoroso: Explique exatamente por que a corda bombeada não está mais em *l *. Consulte as propriedades definidoras do idioma.

O lema de bombeamento pode ser complicado de dominar. Pratique com diferentes idiomas para obter experiência na escolha de sequências apropriadas e no manuseio da análise de casos. Lembre -se de que o objetivo é encontrar uma string em que * qualquer aplicação possível do lema de bombeamento leve a uma contradição. Boa sorte!

Anterior :

Próximo :
  Os artigos relacionados
·Como os esquemas de codificação possibilitam que os h…
·Como você digita uma linguagem de computador no comput…
·SQL Scripting Tutorial 
·Como converter COBOL caderno de RPG caderno 
·Como abrir um documento do MS Word em Classic ASP 
·Qual é o significado de Gujarati do computador? 
·Como Importar XSD Em WSDL 
·O que é outro nome para um programador de computador? 
·Como converter cadeias de caracteres em valores numéri…
·Ferramentas de Linha de Comando Registro 
  Artigos em destaque
·Como converter objeto para Int em Java 
·PL SQL Procedure Tutorial 
·Como reinstalar o RubyGems 
·Como importar Cordas em Java 
·Como localizar um caractere em uma string 
·Por que um compilador é necessário parte do sistema d…
·Como instalar o Windows Mobile 5.0 Pocket PC SDK 
·Como criar um Cipher em C 
·Como fazer uma Fechar script em si 
·Como usar Skyboxes em GtkRadiant 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados