Programação  
 
Rede de conhecimento computador >> Programação >> Programação De Computador Idiomas >> Content
Como se pode demonstrar que um idioma é livre de contexto?
Existem várias maneiras de demonstrar que um idioma é livre de contexto. Aqui está um colapso de técnicas e considerações comuns:

1. Forneça uma gramática sem contexto (CFG):

* o método mais direto e frequentemente usado. Se você pode projetar um CFG que gera * exatamente * as strings no idioma, você provou que é livre de contexto.
* Definição CFG: Um CFG consiste em:
* * Não terminais (variáveis):* representados por letras maiúsculas (por exemplo, `s`,` a`, `b`).
* * Terminais:* Os símbolos do alfabeto da linguagem (por exemplo, `a`,` b`, `0`,` 1`).
* * Iniciar o símbolo:* um distinto não terminal (geralmente `s`).
* * Regras de produção:* Regras do formulário `não terminal -> sequência de terminais e/ou não terminais '(por exemplo,` s -> asb | ε`).
* Como usar: Mostre que todas as strings no idioma podem ser derivadas do símbolo inicial usando as regras de produção. Além disso, demonstre que a gramática * não * gera seqüências de caracteres que não estão * no idioma.
* Exemplo:
* Idioma:l ={a n B n | n ≥ 0} (Strings com números iguais de 'A e' B's, nessa ordem)
* CFG:
* `S -> asb | ε` (onde ε representa a corda vazia)
* Explicação:
* `S` gera o padrão principal` asb`.
* Aplicando recursivamente a regra `s -> asb`, você pode criar qualquer número de` a`s e `b`s, garantindo que eles sejam equilibrados.
* A regra `s -> ε` permite encerrar a recursão e produzir a sequência vazia (que também está no idioma quando n =0).

2. Forneça um Automaton Pushdown (PDA):

* equivalente a CFGS: Qualquer idioma aceito por um PDA é livre de contexto e vice-versa. Essa equivalência é um resultado fundamental na teoria dos autômatos.
* PDA Definição: Um PDA é um autômato finito com uma pilha. Ele pode ler símbolos de entrada, alterar seu estado e empurrar ou pop símbolos da pilha.
* Como usar: Projete um PDA que aceite exatamente as cordas no idioma. Muitas vezes, a pilha é usada para acompanhar os símbolos "incomparáveis".
* Exemplo (para o mesmo idioma l ={a n B n | n ≥ 0}):
* O PDA lê 'A e os empurra para a pilha.
* Quando encontra um 'b', ele aparece com 'a' da pilha.
* O PDA aceita se ele leu toda a entrada e a pilha está vazia.
* Importante: Especifique como as transições do PDA entre os estados com base nos símbolos de entrada e no conteúdo da pilha.

3. Use propriedades de fechamento:

* linguagens livres de contexto estão fechadas sob determinadas operações. Isso significa que, se você souber que alguns idiomas são livres de contexto, pode combiná-los usando essas operações para criar novos idiomas sem contexto.
* Propriedades de fechamento:
* União: Se L1 e L2 estiverem livres de contexto, L1 ∪ L2 ficará livre de contexto.
* Concatenação: Se L1 e L2 estiverem livres de contexto, o L1L2 ficará livre de contexto.
* Kleene Star ( *): Se L estiver livre de contexto, então L* ficará livre de contexto.
* homomorfismo: Se L é livre de contexto e `h` é um homomorfismo (uma função que mapeia os símbolos das cordas), então` h (l) `é livre de contexto.
* homomorfismo inverso: Se L é livre de contexto e `h` é um homomorfismo, então` h -1 (L) `está livre de contexto. (O homomorfismo inverso pega uma string como entrada e retorna o conjunto de strings que, quando o homomorfismo é aplicado, forneça a sequência de entrada).
* Como usar: Decomponha o idioma de destino em idiomas mais simples que você * já conhece * sem contexto e combine-os usando propriedades de fechamento.
* Exemplo:
* Mostre que L ={a n B n c m d m | n, m ≥ 0} está livre de contexto.
* L1 ={a n B n | n ≥ 0} está livre de contexto (já sabemos disso).
* L2 ={c m d m | m ≥ 0} é livre de contexto (semelhante a L1).
* L =L1L2 (a concatenação de L1 e L2).
* Como L1 e L2 são livres de contexto e os idiomas livres de contexto são fechados sob concatenação, L é livre de contexto.

4. Bombear lema para idiomas livres de contexto (para provar um idioma * não * sem contexto):

* Importante: O lema de bombeamento é usado para * refutar * que um idioma é livre de contexto. Não pode ser usado para provar que um idioma * é * sem contexto.
* como funciona: O lema de bombeamento afirma que, para qualquer linguagem livre de contexto L, existe um comprimento de bombeamento 'P' de modo que qualquer sequência 's' em L com comprimento pelo menos 'P' possa ser dividida em cinco partes, S =Uvxyz, onde:
1. | Vxy | ≤ P (a parte do meio não é muito longa)
2. | Vy | ≥ 1 (a parte a ser repetida não está vazia)
3. Para tudo, ≥ 0, UV i xy i Z está em L (você pode repetir 'v' e 'y' qualquer número de vezes, e a sequência resultante ainda está no idioma).
* Prova por contradição:
1. Suponha que o idioma esteja livre de contexto.
2. Suponha que exista um comprimento de bombeamento 'P', conforme descrito no lema.
3. Escolha uma string 's' no idioma que é mais longo que 'p'. A escolha de 'S' é crucial. Deve ter propriedades que tornam o bombeamento problemático.
4. Considere * todas as maneiras possíveis * de dividir 's' em 'uvxyz' que satisfazem as condições 1 e 2 do lema de bombeamento.
5. Para * cada * divisão possível, mostre que existe um 'i' (geralmente i =0 ou i =2) tal que uv i xy i Z não é * * no idioma.
6. Isso contradiz o lema de bombeamento, portanto, a suposição inicial de que o idioma está livre de contexto deve ser falsa.

Qual método usar:

* Construção de gramática/PDA: A maneira mais comum e muitas vezes mais fácil de mostrar uma linguagem * é * sem contexto. Escolha o que (CFG ou PDA) é mais fácil de construir para o idioma específico. Se o idioma parece envolver estruturas aninhadas ou recursivas, uma gramática geralmente é um bom ponto de partida. Se o idioma se prender a um comportamento de pilha, considere usar um PDA.
* Propriedades de fechamento: Útil quando o idioma pode ser expresso como uma combinação de idiomas mais simples e já conhecidos sem contexto.
* bombear lema: Exclusivamente para mostrar um idioma * não * sem contexto.

Considerações importantes:

* idiomas regulares são livres de contexto: Todo idioma regular também é livre de contexto. Se você pode mostrar que um idioma é regular (ao fornecer um DFA, NFA ou expressão regular), você também mostrou que é livre de contexto. No entanto, geralmente um CFG ou PDA será a abordagem mais direta se o idioma for * obviamente * sem contexto.
* PDAs não determinísticos: Em geral, os PDAs não são determinísticos. Os PDAs determinísticos (DPDAs) são menos poderosos; Eles aceitam um subconjunto adequado dos idiomas sem contexto (chamados de idiomas determinísticos livres de contexto). A menos que explicitamente declarado, você pode assumir que está lidando com idiomas gerais (não determinísticos) sem contexto.
* Definição cuidadosa: Esteja você projetando uma gramática ou um PDA, seja muito preciso em suas definições. Evite a ambiguidade e explique claramente como sua construção funciona.
* Exemplos: Trabalhe em vários exemplos para obter uma boa compreensão dessas técnicas. A prática é fundamental!

Em resumo, para * provar * um idioma é livre de contexto, construa um CFG ou PDA para ele ou demonstre sua liberdade de contexto por meio de propriedades de fechamento. Use o lema de bombeamento para idiomas livres de contexto para mostrar que um idioma * não é * sem contexto. Boa sorte!

Anterior :

Próximo :
  Os artigos relacionados
·Como ler um arquivo byte a byte em C + + 
·Como criar um procedimento armazenado no SQL PL 
·O que é Script Debugging 
·Quais são alguns dos principais compiladores para a li…
·O que é um cliente de Proxy 
·Como limpar inválido ID de classe Referências em um C…
·Requisitos Microsoft Certified Partner 
·Access 2007 Scripts 
·Quais são os benefícios do uso de N nas linguagens de…
·Características API 
  Artigos em destaque
·Como extrair um IP De Texto Com VBS 
·Como usar o método POST em Window.Open com Java Script…
·Como chamar um método booleano em Java em outra classe…
·HashMap : Como remover a causa de um vazamento de memó…
·Como encontrar um número mágico de um arquivo Python …
·Como verificar se uma string existe em Perl 
·Como marca um aplicativo no NetBeans 6.5 
·Como analisar elementos XML e atributos usando o Visual…
·Como atualizar Gridview largura da coluna 
·Como calcular Epsilon 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados