Составьте контекстно-свободную грамматику для языка L = { a^n b^n c^m | n ≥ 0, m ≥ 0 }, приведите пример вывода строки aabbbc и объясните, почему язык { a^n b^n c^n | n ≥ 0 } не является контекстно‑свободным
Грамматика (КС) для языка L={anbncm∣n≥0, m≥0}L=\{a^n b^n c^m \mid n\ge 0,\; m\ge 0\}L={anbncm∣n≥0,m≥0}: G=(V,Σ,R,S)G=(V,\Sigma,R,S)G=(V,Σ,R,S), где V={S,A,C}V=\{S,A,C\}V={S,A,C}, Σ={a,b,c}\Sigma=\{a,b,c\}Σ={a,b,c}, правила RRR: S→A CA→a A b∣εC→c C∣ε
S \to A\,C \qquad A \to a\,A\,b \mid \varepsilon \qquad C \to c\,C \mid \varepsilon S→ACA→aAb∣εC→cC∣ε Пояснение: нетерминал AAA порождает равное число aaa и bbb (в виде anbna^n b^nanbn), а CCC — произвольное число ccc. Строка aabbbcaabbbcaabbbc: это последовательность a2b3c1a^2 b^3 c^1a2b3c1. Для языка LLL требуется число bbb равно числу aaa, то есть строка должна иметь вид anbncma^n b^n c^manbncm. Поскольку здесь 2≠32\neq 32=3, строка aabbbcaabbbcaabbbc не принадлежит LLL и потому в грамматике GGG выводу не подлежит. Пример корректного вывода строки aabbcaabbcaabbc (то есть a2b2c1a^2 b^2 c^1a2b2c1) в данной грамматике: S⇒A C⇒(aAb) C⇒(a(aAb)b) C⇒a a A b b C⇒a a ε b b C=aabb C⇒aabb (c C)=aabbc C⇒aabbc ε=aabbc
\begin{array}{l} S \Rightarrow A\,C \\ \Rightarrow (a A b)\,C \\ \Rightarrow (a (a A b) b)\,C \\ \Rightarrow a\,a\,A\,b\,b\,C \\ \Rightarrow a\,a\,\varepsilon\,b\,b\,C = aabb\,C \\ \Rightarrow aabb\,(c\,C) = aabbc\,C \\ \Rightarrow aabbc\,\varepsilon = aabbc \end{array} S⇒AC⇒(aAb)C⇒(a(aAb)b)C⇒aaAbbC⇒aaεbbC=aabbC⇒aabb(cC)=aabbcC⇒aabbcε=aabbc Почему язык {anbncn∣n≥0}\{a^n b^n c^n \mid n\ge 0\}{anbncn∣n≥0} не контекстно‑свободен (краткое доказательство через лемму о накачке для КС-языков): Предположим противное: пусть L0={anbncn}L_0=\{a^n b^n c^n\}L0={anbncn} — КС-язык. По лемме существует константа ppp. Возьмём строку s=apbpcp∈L0.
s = a^p b^p c^p \in L_0. s=apbpcp∈L0.
По лемме sss представимо как s=uvwxys = u v w x ys=uvwxy, где ∣vwx∣≤p|vwx|\le p∣vwx∣≤p, ∣vx∣≥1|vx|\ge 1∣vx∣≥1 и для всех i≥0i\ge 0i≥0 строка uviwxiyu v^i w x^i yuviwxiy принадлежит L0L_0L0. Поскольку ∣vwx∣≤p|vwx|\le p∣vwx∣≤p, подстрока vwxvwxvwx лежит полностью внутри одной из трёх блоков apa^pap, bpb^pbp или cpc^pcp, либо пересекает границу между двумя соседними блоками. Рассмотрим случаи: - Если vvv и xxx лежат только в блоке aaa (или только в bbb или только в ccc), то при i=0i=0i=0 количество соответствующей буквы убывает, а двух других — нет, поэтому числа a,b,ca,b,ca,b,c в строке становятся разными — противоречие. - Если vvv и/или xxx пересекают границу между aaa и bbb (или между bbb и ccc), то при накачке меняются количества двух типов букв, но не третьего, поэтому снова после некоторого iii числа a,b,ca,b,ca,b,c не будут равны — противоречие. Во всех вариантах условие леммы приводит к строкам, не принадлежащим L0L_0L0, что противоречит предположению. Следовательно, L0L_0L0 не является контекстно‑свободным.
G=(V,Σ,R,S)G=(V,\Sigma,R,S)G=(V,Σ,R,S), где
V={S,A,C}V=\{S,A,C\}V={S,A,C}, Σ={a,b,c}\Sigma=\{a,b,c\}Σ={a,b,c},
правила RRR:
S→A CA→a A b∣εC→c C∣ε S \to A\,C
\qquad
A \to a\,A\,b \mid \varepsilon
\qquad
C \to c\,C \mid \varepsilon
S→ACA→aAb∣εC→cC∣ε
Пояснение: нетерминал AAA порождает равное число aaa и bbb (в виде anbna^n b^nanbn), а CCC — произвольное число ccc.
Строка aabbbcaabbbcaabbbc: это последовательность a2b3c1a^2 b^3 c^1a2b3c1. Для языка LLL требуется число bbb равно числу aaa, то есть строка должна иметь вид anbncma^n b^n c^manbncm. Поскольку здесь 2≠32\neq 32=3, строка aabbbcaabbbcaabbbc не принадлежит LLL и потому в грамматике GGG выводу не подлежит.
Пример корректного вывода строки aabbcaabbcaabbc (то есть a2b2c1a^2 b^2 c^1a2b2c1) в данной грамматике:
S⇒A C⇒(aAb) C⇒(a(aAb)b) C⇒a a A b b C⇒a a ε b b C=aabb C⇒aabb (c C)=aabbc C⇒aabbc ε=aabbc \begin{array}{l}
S \Rightarrow A\,C \\
\Rightarrow (a A b)\,C \\
\Rightarrow (a (a A b) b)\,C \\
\Rightarrow a\,a\,A\,b\,b\,C \\
\Rightarrow a\,a\,\varepsilon\,b\,b\,C = aabb\,C \\
\Rightarrow aabb\,(c\,C) = aabbc\,C \\
\Rightarrow aabbc\,\varepsilon = aabbc
\end{array}
S⇒AC⇒(aAb)C⇒(a(aAb)b)C⇒aaAbbC⇒aaεbbC=aabbC⇒aabb(cC)=aabbcC⇒aabbcε=aabbc
Почему язык {anbncn∣n≥0}\{a^n b^n c^n \mid n\ge 0\}{anbncn∣n≥0} не контекстно‑свободен (краткое доказательство через лемму о накачке для КС-языков):
Предположим противное: пусть L0={anbncn}L_0=\{a^n b^n c^n\}L0 ={anbncn} — КС-язык. По лемме существует константа ppp. Возьмём строку
s=apbpcp∈L0. s = a^p b^p c^p \in L_0.
s=apbpcp∈L0 . По лемме sss представимо как s=uvwxys = u v w x ys=uvwxy, где ∣vwx∣≤p|vwx|\le p∣vwx∣≤p, ∣vx∣≥1|vx|\ge 1∣vx∣≥1 и для всех i≥0i\ge 0i≥0 строка uviwxiyu v^i w x^i yuviwxiy принадлежит L0L_0L0 . Поскольку ∣vwx∣≤p|vwx|\le p∣vwx∣≤p, подстрока vwxvwxvwx лежит полностью внутри одной из трёх блоков apa^pap, bpb^pbp или cpc^pcp, либо пересекает границу между двумя соседними блоками. Рассмотрим случаи:
- Если vvv и xxx лежат только в блоке aaa (или только в bbb или только в ccc), то при i=0i=0i=0 количество соответствующей буквы убывает, а двух других — нет, поэтому числа a,b,ca,b,ca,b,c в строке становятся разными — противоречие.
- Если vvv и/или xxx пересекают границу между aaa и bbb (или между bbb и ccc), то при накачке меняются количества двух типов букв, но не третьего, поэтому снова после некоторого iii числа a,b,ca,b,ca,b,c не будут равны — противоречие.
Во всех вариантах условие леммы приводит к строкам, не принадлежащим L0L_0L0 , что противоречит предположению. Следовательно, L0L_0L0 не является контекстно‑свободным.