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)∗
- ϑ(G)=⋃i=1kMi e
- 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= ⋃ki = 1MEu
A estrada rochosa
Existem duas etapas principais para realizar essa prova.
Como encontrar a (boa) ? MEu
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θ ( L ) ⊆ M : (estrutural) indução sobre as produções de .G
- M i SM⊆ q ( L ) : Normalmente uma indução por , a partir do um que contém .MEuS
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)δ
SUMA→ Sc ∣ A→ a A b ∣ ε
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
M0M1M2={Scm∣m∈N},={anAbncm∣m,n∈N},={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
SAC→aAbC∣ε→aAb∣ε→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)
SBlBrAC→bSb∣Bl∣Br→bBl∣bA→Brb∣Ab→aAaa∣C→bcC∣bcbc
e :Mi
M0M1M2M3M4M5={biSbi∣i∈N}={biBlbo∣o∈N,i≥o}={bkBrbi∣k∈N,i≥k}={bkaiAa2ibo∣k,o,i∈N,k≠o}={bkal(bc)iCa2lbo∣k,o,l,i∈N,k≠o}=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
- ϑ(G)⊇L e
- 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.
- 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.