Como mostrar que L = L (G)?


22

Especificar linguagens formais dando gramáticas formais é uma tarefa frequente: precisamos de gramáticas não apenas para descrever as línguas, mas também para analisá-las ou mesmo fazer a ciência apropriada . Em todos os casos, é importante que a gramática em questão esteja correta , ou seja, gere exatamente as palavras desejadas.

Podemos argumentar em alto nível por que a gramática é uma representação adequada do idioma desejado, omitindo uma prova formal. Mas e se estivermos em dúvida ou precisarmos de uma prova formal por algum motivo? Quais são as técnicas que podemos aplicar?

Isso deveria se tornar uma pergunta de referência . Portanto, tenha o cuidado de fornecer respostas gerais, apresentadas didaticamente, ilustradas por pelo menos um exemplo, mas que abranjam muitas situações. Obrigado!

Respostas:


21

As gramáticas são objetos inerentemente recursivos, então a resposta parece óbvia: por indução. Dito isto, os detalhes geralmente são difíceis de acertar. Na sequência, descreverei uma técnica que permite reduzir muitas provas de correção gramatical a etapas mecânicas, desde que algum pré-processamento criativo seja feito.

A idéia básica é não se restringir a palavras de gramática e idioma; é difícil entender a estrutura da gramática dessa maneira. Em vez disso, discutiremos sobre o conjunto de frases que a gramática pode criar. Além disso, dividiremos um objetivo de prova assustador em muitos objetivos pequenos que são mais tratáveis.

Deixe que uma gramática formal com não-terminais , os terminais , regras e a partir símbolo . Denotamos por o conjunto de sentenças que podem ser derivadas de dado , que é . O idioma gerado por é . Suponha que queremos mostrar que para alguns .N T δ S ∈ N ϑ ( G ) S δ α ∈ ϑ ( G )G=(N,T,δ,S)NTδS∈Nϑ(G)SδL G ( G ) = θ ( L ) ∩ T * L = L ( L ) L ⊆ T *α∈ϑ(G)⟺S⇒∗αGL(G)=ϑ(G)∩T∗L=L(G)L⊆T∗

O ansatz

Aqui está como vamos fazer isso. Definimos para queM1,…,Mk⊆(N∪T)∗

  1. ϑ(G)=⋃i=1kMi e
  2. T∗∩⋃i=1kMi=L .

Enquanto 2. é geralmente claro por definição do , 1. requer algum trabalho sério. Os dois itens juntos implicam claramente conforme desejado.L ( G ) = LMiL(G)=L

Para facilitar a notação, vamos denotar .M=⋃i=1kMi

A estrada rochosa

Existem duas etapas principais para realizar essa prova.

  • Como encontrar a (boa) ? Mi
    Uma estratégia é investigar as fases pelas quais a gramática trabalha. Nem toda gramática é receptiva a essa idéia; em geral, este é um passo criativo. Ajuda se pudermos definir a gramática; com alguma experiência, poderemos definir gramáticas mais tratáveis ​​com essa abordagem.

  • Como provar 1.?
    Como em qualquer igualdade definida, existem duas direções.

    • Gϑ(G)⊆M : (estrutural) indução sobre as produções de .G
    • M i SM⊆ϑ(G) : Normalmente uma indução por , a partir do um que contém .MiS

Isso é o mais específico possível; os detalhes dependem da gramática e idioma em questão.

Exemplo

Considere o idioma

L={anbncm∣n,m∈N}

e a gramática com dada porδG=({S,A},{a,b,c},δ,S)δ

S→Sc∣AA→aAb∣ε

para o qual queremos mostrar que . Quais são as fases pelas quais esta gramática trabalha? Bem, primeiro ele gera depois . Isso informa imediatamente nossa escolha de , a saberc m a n b n M iL=L(G)cmanbnMi

M0={Scm∣m∈N},M1={anAbncm∣m,n∈N},M2={anbncm∣m,n∈N}.

Como e , o item 2. já está . Em direção a 1., dividimos a prova em duas partes, conforme anunciado.M 0 ∩ T ∗ = M 1 ∩ T ∗ = ∅M2=LM0∩T∗=M1∩T∗=∅

ϑ(G)⊆M

Realizamos indução estrutural ao longo das regras do .G

IA: Como , ancoramos com sucesso.S=Sc0∈M0

IH: Suponha por algum conjunto de sentenças que também sabem .X ⊆ MX⊆ϑ(G)X⊆M

IS: Seja arbitrário. Temos de mostrar que qualquer forma tem e tudo o que regra é aplicada seguinte, nós não deixamos . Fazemos isso por distinção completa de casos. Pela hipótese de indução, sabemos que (exatamente) um dos seguintes casos se aplica:α Mα∈X⊆ϑ(G)∩MαM

  • w = S c m m ∈ N Mw∈M0 , ou seja, para alguns . Duas regras podem ser aplicadas, ambas derivadas de uma frase em : w=Scmm∈N
    M
    • Scm⇒Scm+1∈M0 e
    • Scm⇒Acm=a0Ab0cm∈M1 .
  • w = a n A b n c m m , n ∈ Nw∈M1 , ou seja, por alguns : w=anAbncmm,n∈N
    • w⇒an+1Abn+1cm∈M1 e
    • w⇒anbncm∈M2 .
  • w ∈ T *w∈M3 : como , nenhuma outra derivação é possível.w∈T∗

Como cobrimos com sucesso todos os casos, a indução está completa.

ϑ(G)⊇M

Realizamos uma prova (simples) por . Observe como encadeamos as provas para que "mais tarde" possa ancorar usando o "anterior" .M i M iMiMiMi

  • mM1 : Realizamos uma indução sobre , ancorando em e usando na etapa.mS → S cSc0=SS→Sc
  • m N A c m S ⇒ * S cM2 : em um valor arbitrário e induzimos sobre . em , usando a pela prova anterior. A etapa progride via .mnAcm Um → um Uma bS⇒∗Scm⇒AcmA→aAb
  • m , n ∈ N S ⇒ * um n A b n cM3 : Para arbitrários usamos a prova anterior para .m,n∈NS⇒∗anAbncm⇒anbncm

Isso conclui a segunda direção da prova do 1., e terminamos.

Podemos ver que exploramos fortemente que a gramática é linear . Para gramáticas não lineares, precisamos de com mais de um parâmetro variável (na (s) prova (s)), que pode se tornar feia. Se temos controle sobre a gramática, isso nos ensina a mantê-la simples. Considere como exemplo dissuasivo esta gramática que é equivalente a : GMiG

S→aAbC∣εA→aAb∣εC→cC∣ε

Exercício

Dê uma gramática para

L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}

e provar sua correção.

Se você tiver problemas, uma gramática:

Considere com produçõesG=({S,Br,Bl,A,C},{a,b,c},δ,S)

S→bSb∣Bl∣BrBl→bBl∣bABr→Brb∣AbA→aAaa∣CC→bcC∣bcbc

e :Mi

M0={biSbi∣i∈N}M1={biBlbo∣o∈N,i≥o}M2={bkBrbi∣k∈N,i≥k}M3={bkaiAa2ibo∣k,o,i∈N,k≠o}M4={bkal(bc)iCa2lbo∣k,o,l,i∈N,k≠o}M5=L

E as gramáticas não lineares?

O recurso caracterizador da classe de linguagens livres de contexto é a linguagem Dyck : essencialmente, toda linguagem sem contexto pode ser expressa como a interseção de uma linguagem Dyck e de uma linguagem regular. Infelizmente, a linguagem Dyck não é linear, ou seja, não podemos fornecer gramática inerentemente adequada a essa abordagem.

Podemos, é claro, ainda definem e fazer a prova, mas é obrigado a ser mais árdua com induções aninhados e não o que. Há uma maneira geral que conheço que pode ajudar até certo ponto. Alteramos a ansatz para mostrar que geramos pelo menos todas as palavras necessárias e que geramos a quantidade certa de palavras (por comprimento). Formalmente, mostramos queMi

  1. ϑ(G)⊇L e
  2. n∈ N|L(G)∩Tn|=|L∩Tn|para todos os .n∈N

Dessa forma, podemos nos restringir à direção "fácil" da ansatz original e explorar a estrutura da linguagem, ignorando os recursos complicados que a gramática pode ter. Obviamente, não há almoço grátis: temos a tarefa totalmente nova de contar as palavras que gera para cada . Para nossa sorte, isso geralmente é tratável; veja aqui e aqui para mais detalhes¹. Você pode encontrar alguns exemplos na minha tese de bacharel .n ∈ NG n∈N

Para gramáticas ambíguas e sem contexto, receio que estamos de volta à ansatz one e thinking caps.


  1. Ao usar esse método específico de contagem, obtemos como bônus que a gramática é inequívoca. Por sua vez, isso também significa que a técnica precisa falhar em gramáticas ambíguas, pois nunca podemos provar 2.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.