Язык L = { a^n b^n c^n | n ≥ 1 } часто приводят как пример не-КС-языка — докажите, почему этот язык не контекстно-свободен, используя лемму о накачке для КС-языков, и опишите машину или формализм (например, линейно-ограниченный автомат или тип0-грамматику), который способен порождать этот язык
Доказательство не-КС с помощью леммы о накачке для КС-языков. Лемма: для любого бесконтекстного языка существует число ppp такое, что любое слово sss с ∣s∣≥p|s|\ge p∣s∣≥p можно представить как s=uvwxys=uvwxys=uvwxy, где ∣vwx∣≤p|vwx|\le p∣vwx∣≤p, ∣vx∣≥1|vx|\ge1∣vx∣≥1, и для всех i≥0i\ge0i≥0 слово uviwxiyuv^i w x^i yuviwxiy принадлежит языку. Пусть для противоречия язык L={anbncn∣n≥1}L=\{a^n b^n c^n \mid n\ge1\}L={anbncn∣n≥1} бесконтекстен. Возьмём ppp из леммы и рассмотрим s=apbpcp.
s = a^p b^p c^p . s=apbpcp.
По лемме s=uvwxys=uvwxys=uvwxy с ∣vwx∣≤p|vwx|\le p∣vwx∣≤p и ∣vx∣≥1|vx|\ge1∣vx∣≥1. Так как длина блока vwx≤pvwx\le pvwx≤p, эта подстрока целиком лежит не более чем в двух подряд идущих видах символов: либо внутри одних aaa, либо внутри одних bbb, либо внутри одних ccc, либо пересекает границу a / ba\!/\,ba/b или b / cb\!/\,cb/c. Значит vvv и xxx затрагивают не все три типа символов одновременно. Рассмотрим случаи (всегда можно взять i=0i=0i=0 или i=2i=2i=2 для контрпримера): - Если vvv и xxx содержат только aaa-символы, то при i=0i=0i=0 число aaa уменьшится, а числа b,cb,cb,c останутся равными ppp: получим слово, где числа букв не все равны, следовательно не в LLL. - Аналогично, если v,xv,xv,x только из bbb или только из ccc, то при i=0i=0i=0 (или i=2i=2i=2) нарушится равенство трёх счётчиков. - Если v,xv,xv,x пересекают границу a / ba\!/\,ba/b, то их удаление/добавление изменит числа aaa и bbb (вместе), но не число ccc; при некотором iii числа трех типов не будут все равны. - Аналогично для границы b / cb\!/\,cb/c. Во всех случаях существует iii такое, что uviwxiy∉Luv^i w x^i y\notin Luviwxiy∈/L, что противоречит лемме. Следовательно LLL не является бесконтекстным. Формализм, порождающий / распознающий этот язык. 1) Контекстно-чувствительная грамматика (тип-1). Пример Грамматики, порождающей LLL: S→aSBC∣abc,CB→BC,aB→ab,bB→bb,bC→bc,cC→cc.
\begin{aligned} S &\to aSBC \mid abc,\\ CB &\to BC,\\ aB &\to ab,\\ bB &\to bb,\\ bC &\to bc,\\ cC &\to cc. \end{aligned} SCBaBbBbCcC→aSBC∣abc,→BC,→ab,→bb,→bc,→cc.
Идея: многократно применять S→aSBCS\to aSBCS→aSBC, затем S→abcS\to abcS→abc, после чего переставлять и заменять B,CB,CB,C на b,cb,cb,c, получая anbncna^n b^n c^nanbncn. Все правила не укорачивают слово, поэтому грамматика контекстно-чувствительная. 2) Линейно-ограниченный автомат (LBA). НЕЛБА (недетерминированный LBA) или даже детерминированный LBA может распознать LLL таким образом: на ленте записано входное слово; итеративно помечать (заменять) первый непомеченный aaa на метку XXX, затем найдя первую непомеченную bbb пометить её YYY, затем первую непомеченную ccc пометить ZZZ; повторять, пока не пометятся все символы; в конце проверить, что были только aaa, затем bbb, затем ccc и что ни один символ не остался непомеченным. Поскольку LBA использует только ограниченную входной длиной память, это распознавание укладывается в модель линейно-ограниченного автомата.
Лемма: для любого бесконтекстного языка существует число ppp такое, что любое слово sss с ∣s∣≥p|s|\ge p∣s∣≥p можно представить как s=uvwxys=uvwxys=uvwxy, где ∣vwx∣≤p|vwx|\le p∣vwx∣≤p, ∣vx∣≥1|vx|\ge1∣vx∣≥1, и для всех i≥0i\ge0i≥0 слово uviwxiyuv^i w x^i yuviwxiy принадлежит языку.
Пусть для противоречия язык L={anbncn∣n≥1}L=\{a^n b^n c^n \mid n\ge1\}L={anbncn∣n≥1} бесконтекстен. Возьмём ppp из леммы и рассмотрим
s=apbpcp. s = a^p b^p c^p .
s=apbpcp. По лемме s=uvwxys=uvwxys=uvwxy с ∣vwx∣≤p|vwx|\le p∣vwx∣≤p и ∣vx∣≥1|vx|\ge1∣vx∣≥1. Так как длина блока vwx≤pvwx\le pvwx≤p, эта подстрока целиком лежит не более чем в двух подряд идущих видах символов: либо внутри одних aaa, либо внутри одних bbb, либо внутри одних ccc, либо пересекает границу a / ba\!/\,ba/b или b / cb\!/\,cb/c. Значит vvv и xxx затрагивают не все три типа символов одновременно.
Рассмотрим случаи (всегда можно взять i=0i=0i=0 или i=2i=2i=2 для контрпримера):
- Если vvv и xxx содержат только aaa-символы, то при i=0i=0i=0 число aaa уменьшится, а числа b,cb,cb,c останутся равными ppp: получим слово, где числа букв не все равны, следовательно не в LLL.
- Аналогично, если v,xv,xv,x только из bbb или только из ccc, то при i=0i=0i=0 (или i=2i=2i=2) нарушится равенство трёх счётчиков.
- Если v,xv,xv,x пересекают границу a / ba\!/\,ba/b, то их удаление/добавление изменит числа aaa и bbb (вместе), но не число ccc; при некотором iii числа трех типов не будут все равны.
- Аналогично для границы b / cb\!/\,cb/c.
Во всех случаях существует iii такое, что uviwxiy∉Luv^i w x^i y\notin Luviwxiy∈/L, что противоречит лемме. Следовательно LLL не является бесконтекстным.
Формализм, порождающий / распознающий этот язык.
1) Контекстно-чувствительная грамматика (тип-1). Пример Грамматики, порождающей LLL:
S→aSBC∣abc,CB→BC,aB→ab,bB→bb,bC→bc,cC→cc. \begin{aligned}
S &\to aSBC \mid abc,\\
CB &\to BC,\\
aB &\to ab,\\
bB &\to bb,\\
bC &\to bc,\\
cC &\to cc.
\end{aligned}
SCBaBbBbCcC →aSBC∣abc,→BC,→ab,→bb,→bc,→cc. Идея: многократно применять S→aSBCS\to aSBCS→aSBC, затем S→abcS\to abcS→abc, после чего переставлять и заменять B,CB,CB,C на b,cb,cb,c, получая anbncna^n b^n c^nanbncn. Все правила не укорачивают слово, поэтому грамматика контекстно-чувствительная.
2) Линейно-ограниченный автомат (LBA). НЕЛБА (недетерминированный LBA) или даже детерминированный LBA может распознать LLL таким образом: на ленте записано входное слово; итеративно помечать (заменять) первый непомеченный aaa на метку XXX, затем найдя первую непомеченную bbb пометить её YYY, затем первую непомеченную ccc пометить ZZZ; повторять, пока не пометятся все символы; в конце проверить, что были только aaa, затем bbb, затем ccc и что ни один символ не остался непомеченным. Поскольку LBA использует только ограниченную входной длиной память, это распознавание укладывается в модель линейно-ограниченного автомата.