Дискуссионный математический форумМатематический форум

Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

Часовой пояс: UTC + 4 часа [ Летнее время ]


Приведенная форма КС-грамматики

Приведенная форма КС-грамматики


При изучении свойств КС-грамматик и КС-языков иногда бывает целесообразно преобразовать КС-грамматику к эквивалентной КС-грамматике, правила вывода которой удовлетворяют определенным дополнительным ограничениям. В этом разделе мы рассмотрим алгоритмы некоторых таких преобразований.


Определение 8.2. Правило вывода КС-грамматики [math]G=(V,N,S,P)[/math] называют:


1) λ-правилом, если его правая часть — пустая цепочка;
2) цепным, если оно имеет вид [math]A\to B[/math], где [math]A[/math] и [math]B[/math] — нетерминалы грамматики.

Теорема 8.2. Любая КС-грамматика [math]G=(V,N,S,P)[/math] может быть преобразована к эквивалентной КС-грамматике, множество правил вывода которой не содержит λ-правил, кроме, может быть, правила [math]S\to\lambda[/math], и не содержит цепных правил.


Мы опишем алгоритмы удаления λ-правил и цепных правил из множества правил КС-грамматики, опуская строгое обоснование этих алгоритмов.




Алгоритм удаления λ-правил


Предположим, что нам известно множество [math]N_e[/math] всех нетерминалов грамматики [math]G[/math], из которых выводится пустая цепочка, т.е.


[math]N_e=\{A\colon\,A\vdash^{\ast}\lambda\}.[/math]

Тогда в правой части каждого правила [math]A\to\xi[/math] выделяются все вхождения нетерминалов из множества [math]N_e[/math] (если таких вхождений нет, то правило пропускается) так, что цепочка [math]\xi[/math] представляется в виде


[math]\xi=\alpha_1B_1\alpha_2B_2\ldots\alpha_mB_m\alpha_{m+1},[/math]

где [math]B_1,B_2,\ldots,B_m[/math] — все нетерминалы из [math]N_e[/math], входящие в [math]\xi[/math]. Заметим, что они не обязаны быть различными, так как мы выделяем все вхождения таких нетерминалов в правую часть правила.


После этого к рассматриваемому правилу добавляются все правила вида


[math]A\to\alpha_1X_1\alpha_2X_2\ldots\alpha_mX_m\alpha_{m+1},[/math]

где для каждого [math]X_i~i=\overline{1,m}[/math] есть или символ [math]B_i[/math], или пустая цепочка.


Иначе говоря, к любому правилу исходной грамматики, правая часть которого содержит нетерминалы из множества [math]N_e[/math] добавляются все правила, которые могут быть получены из исходного путем замены (в его правой части) любого числа вхождений нетерминалов из [math]N_e[/math] пустой цепочкой. При этом сохраняется и само исходное правило и появляется, в частности, правило


[math]A\to\alpha_1\alpha_2\ldots\alpha_m\alpha_{m+1},[/math]

вовсе не содержащее вхождений указанных нетерминалов в правой части. Подчеркнем еще раз, что каждое правило исходной грамматики, правая часть которого не содержит вхождений нетерминалов из [math]N_e[/math], без всяких изменений переносится в систему правил новой грамматики.

Если в процессе описанного выше преобразования системы правил исходной грамматики получаются правила вида [math]A\to A[/math] или [math]A\to\lambda[/math] (при [math]A\ne S[/math]), то они игнорируются.


Остается обсудить метод вычисления множества [math]N_e[/math]. Это множество вычисляется рекуррентно, а именно на первом шаге вычисляют множество [math]N_0[/math] таких нетерминалов [math]A[/math] грамматики [math]G[/math], что существует в [math]P[/math] есть λ-правило [math]A\to\lambda[/math]. Таким образом, множество [math]N_0[/math] — это множество всех нетерминалов грамматики, из которых пустая цепочка выводится за один шаг.


Дерево вывода пустой цепочки

На следующем шаге вычисляем множество [math]N_1[/math], включая в него, во-первых, все нетерминалы множества [math]N_0[/math] и, во-вторых, все такие нетерминалы [math]B[/math], что в [math]P[/math] имеется правило вывода [math]B\to\gamma[/math], где [math]\gamma[/math] — непустая цепочка нетерминалов из множества [math]N_0[/math], то есть [math]\gamma\in N_{0}^{+}[/math]. Это означает, что [math]N_1[/math] состоит из всех таких нетерминалов [math]A[/math] грамматики [math]G[/math], что дерево вывода пустой цепочки из [math]A[/math], имеет высоту, не большую 2 (рис. 8.19).


В общем случае множество [math]N_i\subseteq N[/math] вычисляют по формуле


[math]\begin{aligned}N_0&= \{A\colon\,\text{in}~P~\text{is a rule}~A\to\lambda\},\\[2pt] N_i&= N_{i-1}\cup\{B\colon\,\text{in}~P~\text{is a rule}~B\to\xi,~\text{where}~\xi\in N_{i-1}^{+}\}. \end{aligned}[/math]


Множество [math]N_i[/math] — это множество всех таких нетерминалов [math]A[/math] грамматики [math]G[/math], что дерево вывода пустой цепочки [math]\lambda[/math] из [math]A[/math] имеет высоту, не большую [math]i+1[/math].


Так как множество [math]N[/math] всех нетерминалов грамматики [math]G[/math] конечно, то описанный выше рекуррентный процесс оборвется на некотором шаге, т.е. для некоторого [math]j\geqslant0[/math] получим [math]N_j=N_{j+1}[/math]. Тогда полагаем


[math]\mathbb{N}_e=N_j[/math] для наименьшего [math]j[/math], такого, что [math]N_j=N_{j+1}[/math].

Далее, если аксиома [math]S[/math] принадлежит множеству [math]N_e[/math], то в системе правил [math]P[/math] оставляют правило [math]S\to\lambda[/math], остальные λ-правила удаляют*, а множество правил вывода исходной грамматики преобразуют согласно описанному выше алгоритму.


*Исключение для λ-правила, левой частью которого служит аксиома грамматики, связано с тем, чтобы при переходе к новой грамматике не "потерять" пустую цепочку, которую порождает исходная грамматика.


Можно доказать, что полученная таким образом КС-грамматика без λ-правил эквивалентна исходной грамматике [math]G[/math]. Это объясняется тем, что "потерю" вывода пустой цепочки из нетерминала [math]A\in N_e[/math] (посредством применения λ-правил) мы "компенсируем" добавлением к множеству правил вывода всех таких правил, что замена [math]A[/math] на [math]\lambda[/math] уже произведена прямо в их правых частях.


Пример 8.4. Рассмотрим грамматику с множеством правил


[math]S\to aSbT\mid bTaT\mid ab,\qquad T\to baaST\mid TT\mid\lambda.[/math]

В данном случае [math]N_0=\{T\}[/math]. Так как единственное правило вывода этой грамматики, правая часть которого — непустая цепочка нетерминалов из [math]N_0[/math], есть правило [math]T\to TT[/math], то [math]N_1=N_0\cup\{T\}=\{T\}=N_0[/math], то есть [math]N_e=\{T\}[/math], и наша грамматика принимает вид


[math]S\to aSbT\mid aSb\mid bTaT\mid bTa\mid baT\mid ba\mid ab,\qquad T\to baaST\mid baaST\mid TT.[/math]



Алгоритм удаления цепных правил


Алгоритм удаления цепных правил во многом аналогичен алгоритму удаления λ-правил.


Пусть существует вывод нетерминала [math]U[/math] из нетерминала [math]T[/math], в котором применяются только цепные правила. Тогда такой вывод назовем цепным выводом.


Предположим теперь, что для каждого нетерминала [math]A[/math] грамматики [math]G[/math] известно множество [math]N_A[/math] всех таких нетерминалов [math]B[/math], что существует цепной вывод [math]A[/math] из [math]B[/math]. Тогда, удалив все цепные правила, мы должны предусмотреть непосредственную замену всех нетерминалов из [math]N_A[/math] любой цепочкой [math]\alpha[/math], которая служит правой частью некоторого правила [math]A\to\alpha[/math] (рис. 8.20).


Алгоритм удаления цепных правил

Это соображение лежит в основе алгоритма преобразования множества правил КС-грамматики с целью удаления цепных правил.


Вычислив множество [math]N_A[/math] для каждого [math]A\in N[/math], удалить все цепные правила, добавив при этом для каждой цепочки а, такой, что в [math]P[/math] есть правило [math]A\to\alpha[/math], и для каждого [math]B\in N_A[/math] правило [math]B\to\alpha[/math]. После этого вместо каждого вывода вида [math]B\vdash\ldots\vdash A\vdash\alpha[/math] (при [math]B\in N_A[/math]) в исходной грамматике в новой грамматике получим вывод [math]B\vdash\alpha[/math].


Множества нетерминалов [math]N_A[/math] для каждого [math]A\in N[/math] вычисляются рекуррентно (как и в рассмотренном выше алгоритме удаления λ-правил вычислялось множество [math]N_e[/math]):


[math]\begin{aligned}N_{A}^{0}&= \{B\colon\,\text{in}~P~\text{is a rule}~B\to A\};\\[2pt] N_{A}^{i}&= N_{A}^{i-1}\cup \{C\colon\, \text{in}~P~\text{is a rule}~C\to D,~\text{where}~D\in N_{A}^{i-1}|\}.\end{aligned}[/math]


Таким образом, множество [math]N_{A}^{i}[/math] — это множество всех таких нетерминалов [math]B[/math], что существует цепной вывод длины не больше [math]i+1[/math] нетерминала [math]A[/math] из [math]B[/math]. "Насыщение" этой рекуррентной процедуры происходит для первого номера [math]j[/math], такого, что [math]N_A^j=N_{A}^{j+1}[/math], и тогда принимают [math]N_A=N_A^j[/math].




Пример 8.5. Дана грамматика с множеством правил


[math]E\to E+T\mid T,\qquad T\to T\ast F\mid F,\qquad F\to (E)\mid a,[/math]

аксиомой [math]E[/math] и терминальным алфавитом [math]\{a,(,),+,\ast\}[/math]. Имеем [math]N_{E}^{0}=\varnothing[/math], следовательно, и [math]N_e=\varnothing[/math] (множество нетерминалов данной грамматики, из которых применением одних цепных правил выводится нетерминал [math]E[/math], пусто). Далее, [math]N_T^0=\{E\}[/math], а так как нет ни одного цепного правила с правой частью [math]E[/math], то


[math]N_T^1=N_T^0=N_T;\qquad N_F^0=\{T\};\qquad N_F^1=\{T,E\}=N_F.[/math]

Удаляя цепные правила, необходимо, согласно описанному выше алгоритму, ко всем правилам с левой частью [math]E[/math] добавить правило [math]E\to T\ast F[/math], чтобы, сокращая вывод [math]E\vdash T\vdash T\ast F[/math] и убирая из него применение цепного правила [math]E\to T[/math], сразу вывести из аксиомы [math]E[/math] цепочку [math]T\ast F[/math].


Аналогично к правилам с левой частью [math]F[/math] надо добавить правила [math]T\to(E),~T\to a,!E\to(E)[/math] и [math]E\to a[/math]. В итоге получим грамматику


[math]E\to E+T\mid T\ast F\mid (E)\mid a,\qquad T\to T\ast F\mid a\mid(E),\qquad F\to(E)\mid a.[/math]

Можно доказать, что описанный алгоритм удаления цепных правил дает грамматику, эквивалентную исходной.


Замечание 8.4. К цепным правилам относится и правило [math]A\to A[/math]. Если такое правило находится в множестве правил грамматики или появляется при удалении λ-правил (см. пример 8.4), то оно должно быть просто удалено из множества правил.


Обратимся к примеру, из которого станет ясно, что удаление λ-правил может привести к появлению в множестве правил заданной КС-грамматики цепных правил.




Пример 8.6. Рассмотрим грамматику [math]G_0[/math] из примера 8.1. Для удобства перепишем ее определение:


[math]G_0=\bigl(\{a,b\},\{S,A,B,C\},S,P_0\bigr),[/math]

где множество правил вывода [math]P_0[/math] имеет вид

[math]\begin{array}{lrlr}S\to ABC,&\quad (1)&\qquad B\to a,&\quad (5)\\ A\to BB,&\quad (2)&\qquad C\to AA,&\quad (6)\\ A\to\lambda,&\quad (3)&\qquad C\to b.&\quad (7)\\ B\to CC,&\quad (4)&\qquad &\quad \end{array}[/math]

Удаляем λ-правила. Множество [math]N_0=\{A\}[/math] (правило (3)). Далее, [math]N_1=\{A,C\}[/math], поскольку в правиле (6) правая часть есть непустая цепочка нетерминалов из [math]N_0[/math]; [math]N_2=\{A,C,B\}[/math] (правило (4)), [math]N_3=\{A,C,B,S\}[/math]. Так как [math]N_3[/math] совпало с множеством всех нетерминалов грамматики, то [math]N_3=N_e[/math].


Согласно описанному выше алгоритму удаления λ-правил, получим следующую грамматику:


[math]\begin{aligned}&S\to ABC\mid AB\mid AC\mid BC\mid A\mid B\mid C\mid\lambda,\\ &A\to BB\mid B,~~ B\to CC\mid C\mid a,~~ C\to AA\mid A\mid b.\end{aligned}[/math]

Мы видим, что в результате удаления λ-правил получилось много цепных правил (которых не было в исходной грамматике). Применение алгоритма удаления цепных правил даст следующие множества [math]N_A^i\colon[/math]


[math]\begin{aligned}&N_S^0= N_S^e=\varnothing;\\ &\begin{array}{lll}N_A^0=\{S,C\},&\quad N_A^1=\{S,C,B\},&\quad N_A^2=\{S,C,B,A\};\\ N_B^0=\{S,A\},&\quad N_B^1=\{S,A,C\},&\quad N_B^2=\{S,A,C,B\};\\ N_C^0=\{S,A\},&\quad N_C^1=\{S,A,B\},&\quad N_C^2=\{S,A,B,C\}.\end{array}\end{aligned}[/math]

Таким образом, [math]N_A^e=N_B^e=N_C^e=\{S,A,B,C\}[/math] (множество всех нетерминалов грамматики).


Новое множество правил, не содержащее цепных правил, будет иметь следующий вид:


[math]\begin{aligned}&S\to ABC\mid AB\mid AC\mid BC\mid\lambda\mid BB\mid CC\mid AA\mid a\mid b;\\ &A\to BB\mid CC\mid AA\mid a\mid b;\\ &B\to CC\mid BB\mid AA\mid a\mid b;\\ &C\to AA\mid BB\mid CC\mid a\mid b.\end{aligned}[/math]

Замечание 8.5. Теорема 8.2 позволяет утверждать, что любую КС-грамматику можно преобразовать к эквивалентной КС-грамматике, множество правил вывода которой содержит только КЗ-правила, т.е. правила вида [math]\alpha A\beta\to\alpha\gamma\beta[/math] при [math]\alpha=\beta=\lambda[/math] и [math]\gamma\ne\lambda[/math]. Единственным исключением может быть правило [math]S\to\lambda[/math] для аксиомы [math]S[/math]. Можно показать, что добавление к множеству правил КЗ-грамматики правила, предусматривающего замену аксиомы пустой цепочкой, не приводит к существенному изменению класса языков, порождаемых КЗ-грамматиками. Единственное отличие языка, порождаемого такой грамматикой, от КЗ-языка состоит в том, что он может содержать пустую цепочку, тогда как ни один КЗ-язык, будучи неукорачивающим языком, пустой цепочки не содержит.


Следовательно, если в множестве правил КЗ-грамматики разрешить кроме КЗ-правил также и правило [math]S\to\lambda[/math] (где [math]S[/math] — аксиома грамматики), то любую КС-грамматику можно преобразовать к эквивалентной КС-грамматике, являющейся частным случаем КЗ-грамматики (с правилом [math]S\to\lambda[/math]).




Бесполезные нетерминальные символы КС-грамматики


Определение 8.3. Нетерминальный символ [math]A[/math] КС-грамматики [math]G=(V,N,S,P)[/math] называют бесполезным, если из него не выводится ни одна терминальная цепочка, т.е. не существует такого [math]x\in V^{\ast}[/math], что [math]A\vdash_{G}^{\ast}x[/math].


Бесполезный нетерминал КС-грамматики может быть удален (вместе со всеми правилами, в которые он входит) без изменения языка, порождаемого данной грамматикой. Следующая теорема утверждает существование алгоритма удаления бесполезных нетерминальных символов.


Теорема 8.3. Для каждой КС-грамматики [math]G=(V,N,S,P)[/math] может быть построена эквивалентная ей КС-грамматика, не содержащая бесполезных нетерминальных символов.


Алгоритм удаления бесполезных нетерминалов состоит в рекуррентном вычислении множества [math]N_u\subseteq N[/math] всех нетерминалов грамматики [math]G[/math], из которых выводится какая-либо терминальная цепочка.


Сначала вычисляем множество [math]N_0[/math] всех нетерминалов, из которых терминальная цепочка выводится за один шаг. Для этого просматриваем множество правил [math]P[/math], отмечая в нем все правила вида [math]A\to x[/math], где [math]x\in V^{\ast}[/math]. Другими словами,


[math]N_0=\{A\colon\,\text{in}~P~\text{is a rule}~A\to x,~x\in V^{\ast}\}.[/math]

Затем вычисляем множество [math]N_1[/math], добавляя к [math]N_0[/math] множество всех таких нетерминалов [math]B[/math], что существует правило вывода в [math]P[/math] вида [math]B\to\beta[/math], где [math]\beta[/math] — цепочка, содержащая как терминалы, так и нетерминалы из множества [math]N_0[/math]. Таким образом, в [math]N_1[/math] попадут все нетерминалы [math]B[/math], такие, что существует вывод терминальной цепочки из [math]B[/math], и высота дерева этого вывода не больше 2 (рис. 8.21).


Дерево вывода терминальной цепочки

В общем случае для множества [math]N_i\,(i\geqslant1)[/math] получаем формулу


[math]N_i=N_{i-1}\cup \bigl\{A\colon\, \text{in}~P~\text{is a rule}~A\to\alpha,~ \text{where}~a\in(N_{i-1}\cup V)^{\ast}\bigr\}.[/math]

Это множество содержит все такие нетерминалы [math]B[/math], что высота дерева вывода любой терминальной цепочки из [math]B[/math] не превышает [math]i+1[/math].


Для наименьшего [math]j[/math], такого, что [math]N_j=N_{j+1}[/math], полагаем [math]N_u=N_j[/math]. Из построения множества [math]N_u[/math] следует, что это множество всех таких нетерминалов [math]A[/math] грамматики [math]G[/math], что существует вывод (ненулевой длины) [math]A\vdash^{+}x[/math] для некоторого [math]x\in V^{\ast}[/math], что и требовалось доказать. Тогда все нетерминалы из [math]N\setminus N_u[/math] бесполезны.


В частности, если [math]S\notin N_u[/math], то [math]L(G)=\varnothing[/math], и наоборот. Таким образом решается проблема пустоты для КС-грамматик, которая формулируется следующим образом: для данной КС-грамматики выяснить, пуст ли язык, ею порождаемый. Из предыдущих рассмотрений ясно, что для ответа на этот вопрос достаточно вычислить множество бесполезных нетерминалов грамматики и проверить, находится ли среди них аксиома грамматики. Язык, порождаемый КС-грамматикой, пуст тогда и только тогда, когда ее аксиома бесполезна.


Пример 8.7. Пусть множество [math]P[/math] правил вывода КС-грамматики [math]G=(\{a,b\},\{S,A,B,C\},S,P)[/math] имеет вид


[math]S\to aA\mid bB,\qquad A\to bAa,\qquad B\to aB\mid bS\mid a\mid b,\qquad C\to BaA.[/math]

Применяя алгоритм из доказательства теоремы 8.3, получаем [math]N_0=\{B\}[/math], так как в [math]P[/math] имеются только два правила, правые части которых — терминальные цепочки [math]B\to a[/math] и [math]B\to b[/math]. С целью вычисления множества [math]N_1[/math] найдем те правила, правые части которых кроме терминалов содержат только нетерминальный символ [math]B[/math]: это будут правила [math]S\to bB[/math] и [math]B\to aB[/math], то есть [math]N_1=\{B,S\}[/math]. Так как есть только одно правило, правая часть которого содержит вхождение символа [math]S[/math], а именно правило [math]B\to bS[/math], то [math]N_2=N_1=N_u=\{S,B\}[/math]. Символы [math]A[/math] и [math]C[/math] бесполезны. Все правила, содержащие вхождения этих символов, можно удалить. В итоге получим грамматику с таким множеством правил:


[math]S\to bB,\qquad B\to aB\mid bS\mid a\mid b.[/math]

Недостижимый символ КС-грамматики


Определение 8.4. Символ [math]X[/math] объединенного алфавита [math]V\cup N[/math] КС-грамматики [math]G=(V,N,S,P)[/math] называют недостижимым, если из аксиомы грамматики не выводится ни одна цепочка, содержащая вхождение символа [math]X[/math], т.е. не существует таких цепочек [math]\alpha,\beta\in(V\cup N)^{\ast}[/math], что [math]S\vdash_{G}^{\ast}\alpha X\beta[/math].


Из самого понятия недостижимого символа ясно, что такие символы можно удалить из грамматики (удалив все правила, которые их содержат) без изменения порождаемого ею языка. Займемся разработкой алгоритма удаления недостижимых символов.




Граф КС-грамматики


Введем в рассмотрение понятие графа КС-грамматики.


Определение 8.5. Назовем графом КС-грамматики [math]G=(V,N,S,P)[/math] ориентированный граф, множество вершин которого равно [math]V\cup N\cup\{\lambda\}[/math], а множество дуг определяется следующим образом. Дуга из вершины с меткой [math]A[/math] ведет в вершину [math]B[/math] тогда и только тогда, когда правило [math]A\to\alpha B\beta[/math] [math](\alpha,\beta\in(V\cup N)^{\ast})[/math] принадлежит множеству [math]P[/math] правил вывода грамматики [math]G[/math].


Понятие графа КС-грамматики ни в коем случае нельзя путать с понятием дерева вывода в КС-грамматике, так как дерево вывода строится по конкретному выводу, а граф КС-грамматики строится по множеству правил вывода и характеризует саму грамматику в целом.


Пример 8.8. Граф грамматики из примера 8.7 представлен на рис. 8.22.


Граф грамматики

Опираясь на определение 8.4, можно показать, что символ [math]X[/math] КС-грамматики [math]G=(V,N,S,P)[/math] достижим тогда и только тогда, когда в графе грамматики существует путь из вершины [math]S[/math] грамматики [math]G[/math] в вершину [math]X[/math], и задача распознавания достижимости символов в КС-грамматиках сводится тем самым к задаче распознавания достижимости в ориентированных графах из заданной вершины. Для ее решения достаточно воспользоваться, например, алгоритмом поиска в ширину. В примере 8.8 (см. рис. 8.22) символ [math]C[/math] не достижим.


Удаление бесполезных нетерминалов может привести к появлению недостижимых символов.


Пример 8.9. Модифицируем грамматику из примера 8.7, добавив к множеству ее терминалов новый символ [math]d[/math] и к множеству ее правил вывода правило [math]A\to Cd[/math].


Граф модифицированной грамматики приведен на рис. 8.23. Нетерминалы [math]A[/math] и [math]C[/math] бесполезны, хотя и достижимы. Удаляя их вместе со всеми правилами, в которые они входят, получим КС-грамматику, граф которой изображен на рис. 8.24. Терминал [math]d[/math] стал недостижимым.


Граф модифицированной грамматики



Задание КС-грамматика в приведенной форме


Определение 8.6. КС-грамматика считается заданной в приведенной форме, если множество ее правил вывода не содержит λ-правил и цепных правил, множество ее нетерминалов не содержит бесполезных нетерминалов, а объединенный алфавит не содержит недостижимых символов.


Рассмотренные выше алгоритмы любую КС-грамматику позволяют преобразовать к эквивалентной КС-грамматике, заданной в приведенной форме. Заметим, что поскольку удаление λ-правил может привести к появлению цепных правил (см. пример 8.6), а удаление бесполезных нетерминалов — к появлению недостижимых символов, то построение приведенной формы КС-грамматики нужно проводить в такой последовательности:


1) удалить λ-правила;

2) удалить цепные правила;

3) удалить бесполезные нетерминалы;

4) удалить недостижимые символы.


Замечание 8.6. К числу важных преобразований КС-грамматики относят также преобразование, состоящее в удалении аксиомы из правых частей правил вывода. Можно доказать, что любая КС-грамматика преобразуется к эквивалентной КС-грамматике, не содержащей вхождений аксиомы в правые части правил вывода. Действительно, для этого достаточно ввести новый нетерминал [math]S_1[/math] (отличный от всех нетерминалов исходной грамматики), объявить его аксиомой и добавить правило [math]S_1\to S[/math], после чего появившееся цепное правило и недопустимые λ-правила, которые могут при этом возникнуть, удаляются согласно приведенным выше алгоритмам.


Пример 8.10. Грамматика с множеством правил [math]S\to aSa\mid bSb\mid a\mid b\mid \lambda[/math], порождающая множество всех палиндромов в алфавите [math]\{a,b\}[/math] (см. пример 7.5.в), преобразуется после удаления аксиомы из правых частей правил вывода в грамматику с аксиомой [math]S_1[/math] и следующим множеством правил:


[math]S_1\to S,\qquad S\to aSa\mid bSb\mid a\mid b\mid \lambda.[/math]

Появились, как мы видим, цепное правило и, поскольку символ [math]S[/math] в новой грамматике уже не является аксиомой, λ-правило [math]S\to\lambda[/math], которое следует удалить. Выполняя это, получим окончательно следующее множество правил:


[math]S_1\to aSa\mid bSb\mid aa\mid bb\mid a\mid b\mid\lambda,\qquad S\to aSa\mid bSb\mid aa\mid bb\mid a\mid b.[/math]

Заметим, что если КС-грамматика задана в приведенной форме и правые части правил не содержат вхождений аксиомы, то единственное допустимое правило с пустой правой частью (левой частью его является аксиома), если оно существует, используется только для порождения пустой цепочки. Исходная грамматика из примера 8.10 этим свойством не обладает, так как правило [math]S\to\lambda[/math] используется всякий раз при выводе слова четной длины.


Кроме того, КС-грамматика, заданная в приведенной форме и не содержащая вхождений аксиомы в правых частях правил вывода, обладает еще одним интересным свойством: дерево вывода любой непустой цепочки является λсвободным. Таким образом, без ограничения общности можно считать деревья выводов непустых цепочек в КС-грамматиках λ-свободными.


Часовой пояс: UTC + 4 часа [ Летнее время ]


Яндекс.Метрика

Copyright © 2010-2016 MathHelpPlanet.com. All rights reserved