Грамматики по своей природе являются рекурсивными объектами, поэтому ответ кажется очевидным: по индукции. Тем не менее, специфика часто сложно получить право. В дальнейшем я опишу технику, которая позволяет свести многие доказательства грамматической корректности к механическим этапам при условии некоторой творческой предварительной обработки.
Основная идея - не ограничиваться словами грамматики и языка; трудно понять структуру грамматики таким образом. Вместо этого мы будем спорить о наборе предложений, которые может создать грамматика. Кроме того, мы разделим одну пугающую цель доказательства на множество небольших целей, которые более поддаются решению.
Пусть формальная грамматика с нетерминалами Н , клеммы Т , правила б и начала символа S ∈ N . Обозначим через ϑ ( G ) множество предложений, которые можно вывести из S при заданном δ , то есть α ∈ ϑ ( G )G=(N,T,δ,S)NTδS∈Nϑ(G)Sδ . Язык, порожденный G, имеет вид L ( G ) = ϑ ( G ) ∩ T ∗ . Предположим, мы хотим показать, что L = L ( G ) для некоторого L ⊆ T ∗ .α∈ϑ(G)⟺S⇒∗αGL(G)=ϑ(G)∩T∗L=L(G)L⊆T∗
Анзац
Вот как мы это делаем. Определим так, чтобыM1,…,Mk⊆(N∪T)∗
- иϑ(G)=⋃i=1kMi
- .T∗∩⋃i=1kMi=L
Хотя 2. обычно ясно по определению , 1. требует серьезной работы. Два элемента вместе, очевидно, подразумевают L ( G ) = L по желанию.MiL(G)=L
Для простоты обозначений обозначим .M= ⋃Кя = 1Mя
Каменистая дорога
Есть два основных шага к выполнению такого доказательства.
Как найти (хорошо) ? Mя
Одна стратегия состоит в том, чтобы исследовать фазы, через которые работает грамматика. Не каждая грамматика поддается этой идее; в общем, это творческий шаг. Это помогает, если мы можем определить грамматику самостоятельно; Имея некоторый опыт, мы сможем определить грамматику, более подходящую для этого подхода.
Как доказать 1.?
Как и при любом заданном равенстве, есть два направления.
- : (структурная) индукция над производствами G .ϑ ( G ) ⊆ Mграмм
- : Обычно одна индукция М я , начиная с того, который содержит S .M⊆ & thetas ; ( G )MяS
Это настолько специфично, насколько это возможно; детали зависят от грамматики и языка под рукой.
пример
Рассмотреть язык
L = { aNбNсм∣ n , m ∈ N }
и грамматика с δ, заданным какG=({S,A},{a,b,c},δ,S)δ
SA→Sc∣A→aAb∣ε
для которого мы хотим показать, что . На каких этапах работает эта грамматика? Ну, сначала он генерирует c m, а затем a n b n . Это немедленно сообщает наш выбор M i , а именноL=L(G)cmanbnMi
M0M1M2={Scm∣m∈N},={anAbncm∣m,n∈N},={anbncm∣m,n∈N}.
Поскольку и M 0 ∩ T ∗ = M 1 ∩ T ∗ = ∅ , пункт 2. уже учтен. В отношении 1. мы разделили доказательство на две части, как было объявлено.M2=LM0∩T∗=M1∩T∗=∅
ϑ(G)⊆M
Проводит структурную индукцию вдоль правил .G
IA: Так как мы успешно закрепляемся.S=Sc0∈M0
IH: Пусть для некоторого множества предложений , что мы знаем , X ⊆ M .X⊆ϑ(G)X⊆M
IS: пусть произвольно. Мы должны показать , что в какой бы форме α имеет и то , что правило применяется следующий, мы не оставляем М . Мы делаем это путем полного разграничения регистра. По предположению индукции мы знаем, что (точно) применим один из следующих случаев:α∈X⊆ϑ(G)∩MαM
- , то есть ш = S с т в течение некоторого т ∈ N .
Можно применить два правила, каждое из которых выводит предложение в M :
w∈M0w=Scmm∈N
M
- иScm⇒Scm+1∈M0
- .Scm⇒Acm=a0Ab0cm∈M1
- , т.е. w = a n A bw∈M1 для некоторого m , n ∈ N :
w=anAbncmm,n∈N
- иw⇒an+1Abn+1cm∈M1
- .w⇒anbncm∈M2
- : поскольку w ∈ T ∗ , дальнейшие дифференцирования невозможны.w∈M3w∈T∗
Поскольку мы успешно рассмотрели все случаи, индукция завершена.
ϑ(G)⊇M
Мы выполняем одно (простое) доказательство на . Обратите внимание, как мы объединяем доказательства, чтобы «позже» M i можно было привязать, используя «ранее» M i .MiMiMi
- : Мы проводим индукцию более м , якорь в S с 0 = S ипомощью S → S C на стадии.M1mSc0=SS→Sc
- : Зафиксируем m к произвольному значению и индуцируем по n . Зафиксируем в A c m , используя это S ⇒ ∗ S c m ⇒ A c m в соответствии с первым доказательством. Шаг продвигается через A → a A b .M2mnAcmS⇒∗Scm⇒AcmA→aAb
- : Для произвольного m , n ∈ N мы используем первое доказательство для S ⇒ ∗ a n A b n c m ⇒ a n b n c m .M3m,n∈NS⇒∗anAbncm⇒anbncm
This concludes the second direction of the proof of 1., and we are done.
We can see that we heavily exploit that the grammar is linear. For non-linear grammars, we need Mi with more than one variable parameter (in the proof(s)), which can become ugly. If we have control over the grammar, this teaches us to keep it simple. Consider as deterring example this grammar which is equivalent to G:
SAC→aAbC∣ε→aAb∣ε→cC∣ε
Exercise
Give a grammar for
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
and prove its correctness.
If you have trouble, a grammar:
Consider G=({S,Br,Bl,A,C},{a,b,c},δ,S) with productions
SBlBrAC→bSb∣Bl∣Br→bBl∣bA→Brb∣Ab→aAaa∣C→bcC∣bcbc
and 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
What about non-linear grammars?
The characterising feature of the class of context-free languages is the Dyck language: essentially, every context-free language can be expressed as the intersection of a Dyck language and a regular language. Unfortunately, the Dyck language is not linear, that is we can give no grammar that is inherently suited to this approach.
We can, of course, still define Mi and do the proof, but it's bound to be more arduous with nested inductions and what not.
There is one general way I know of that can help to some extent. We change the ansatz to showing that we generate at least all
required words, and that we generate the right amount of words (per length). Formally, we show that
- ϑ(G)⊇L and
- |L(G)∩Tn|=|L∩Tn| for all n∈N.
This way, we can restrict ourselves to the "easy" direction from the original ansatz and exploit structure in the language, ignoring overcomplicated features the grammar may have. Of course, there is no free lunch: we get the all new task of counting the words G generates for each n∈N. Lucky for us, this is often tractable; see here and here for details¹. You can find some examples in my bachelor thesis.
For ambiguous and non-context-free grammars, I'm afraid we are back to ansatz one and thinking caps.
- When using that particular method for counting, we get as a bonus that the grammar is unambiguous. In turn, this also means that the technique has to fail for ambiguous grammars as we can never prove 2.