Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория автоматов и формальных языков. Учебник.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
§ 6.4. Цепные правила 301
миналаSмы напишем все нецепные правила для нетерминаловS,AиB. В результате получается следующее множество правил:
S → AB | SS | a | aDD | ba C → bA | bB A → aDD | ba D → Sb | aDS | bA | bB B → aDD | ba
Заметим, что в новой грамматике нетерминалCстал недостижимым,
так как вGон был достижим только с помощью цепного правила
D → C
Получившуюся грамматику можно упростить. Для этого заметим, что множества правил для нетерминаловAиBсовпадают, поэтому можно заменить все вхожденияBнаA, после чего удалить правила дляB(см. задачу 243).
Требование отсутствия цепных правил можно несколько ослабить.
.
Оп ределен ие 104.
б е з ц и к л о в , если не существует нетерминалаAтакого, что
КС-грамматикаGназывается грамматикой
A ⇒
+
G
A.
Ле мма 160.
Если в КС-грамматикеGнет ни пустых, ни цепных
правил, то G — грамматика без циклов.
Доказательство. Непосредственной индукцией поiдоказыва- ется, что если
A ⇒iα
, то либоαсодержит хотя бы один терминал,
либо |α| > i. Поэтому если A ⇒+α, то α 6= A.
Задачи
237. Удалите цепные правила из следующих КС-грамматик:
(а) S → a | BB | D | bb
A → B | AA | Db B → DA | C | aA C → a | AC | SbS D → C | BB
238.
Докажите, что
вида A ⇒jB для некоторого j 6 i.
B ∈ Ci(A) тогда и только тогда, когда существует вывод
(б) S → A | DbA | BB
A → a | BB | B B → C b | DbA | a | S C → SS | ACC | bB D → C | aD | b
302 Глава 6. Нормальные формы КС-грамматик
239.
Докажите, что если КС-грамматикаGне содержит бесполезных нетермина-
лов, а
G1получается изGудалением цепных правил по алгоритму из теоремы 159,
то G1не содержит пустых нетерминалов.
240.
Докажите, что существуют КС-грамматики сколь угодно большого размера, для которых применение алгоритма из теоремы 159 приводит к квадратичному увеличению размера грамматики.
241.
Предложите эффективную реализацию алгоритма для удаления цепных правил из КС-грамматики и оцените её временную сложность.
242.
Приведите пример КС-грамматики сε-правилами, для которой алгоритм удаления цепных правил даёт неверный ответ.
243.
Пусть множества правил для нетерминаловAиBв грамматикеGсовпадают, то есть все правила дляAиBимеют вид Построим грамматику
A
, после чего удалим все правила дляB. Докажите, что грамматикиGи
эквивалентны.
244. Докажите, что если A ∈ C
245.
Пусть
A ∈ C
грамматики наA, после чего удалим все правила дляB. Докажите, что новая грамматика эквивалентна исходной.
G0следующим образом: заменим все вхожденияBна
(B), то C
кон
(B) и
кон
B ∈ C
(A). Заменим все вхожденияBв правила
кон
A → α1| · · · | αn,
(A) ⊆ C
кон
кон
(B).
B → α1| · · · | αn.
G
0
§ 6.5. Нормальная форма Хомского
В предыдущих параграфах мы доказали, что из КС-грамматик можно удалять бесполезные нетерминалы, а также пустые и цепные правила. Можно определить класс грамматик, удовлетворяющих сразу всем ограничениям.
Оп ределен ие 105.
н о й, если в ней нет бесполезных нетерминалов, пустых правил и циклов.
Теорема 161.
По любой КС-грамматикеGможно построить экви-
валентную ей приведённую КС-грамматику.
Доказательство. Алгоритм для построения приведённой грам­матики следующий.
1) Удалить бесполезные нетерминалы.
КС-грамматикаGназывается п р и в е д ё н -
§ 6.5. Нормальная форма Хомского 303
2) Удалить пустые правила.
3) Удалить бесполезные нетерминалы.
4) Удалить цепные правила.
5) Удалить бесполезные нетерминалы.
После удаления цепных правил новые пустые правила не появляются, поэтому после заключительного удаления бесполезных нетерминалов получится приведённая грамматика.
Шаги 1) и 3) алгоритма можно опустить, так как все бесполезные нетерминалы удаляются на последнем шаге. Однако такая «упрощён­ная» версия алгоритма может выполнять много лишних вычислений, поскольку на шагах 2) и 4) могут обрабатываться бесполезные нетер­миналы.
Мы уже использовали понятие бинарной грамматики. Его можно усилить следующим образом.
Оп ределен ие 106.
грамматикой в н о р м а л ь н о й ф о р м е Х о м с к о г о, если она приведённая и все её правила имеют один из следующих видов:
1) S → ε;
2) A → BC, где A, B, C — нетерминалы;
3) A → a, где A — нетерминал, a — терминал. Грамматики в нормальной форме Хомского имеют очень простую
структуру. На каждом шаге вывода нетерминал может заменяться либо на два нетерминала, либо на один терминал. Докажем, что любой КС-язык порождается грамматикой в нормальной форме Хомского.
Теорема 162.
валентную КС-грамматику что |G1| = O(|G|2).
Доказательство. ПустьG= (N,Σ чала преобразуемGв эквивалентную приведённую грамматику
По любой КС-грамматикеGможно построить экви-
КС-грамматикаG= (N,Σ
G1в нормальной форме Хомского такую,
, P, S
) — КС-грамматика. Сна-
, P, S
) называется
G0по
304 Глава 6. Нормальные формы КС-грамматик
теореме 161, при этом
|G0|=O(|G|2). Если в правиле
A → α
правая часть не является терминалом, то заменим каждый терминалaна новый нетерминал
Aaи добавим в грамматику правило
Aa→ a
. По теореме о замене нетерминала на все следствия новая грамматика эквивалентна исходной. Обозначим получившуюся грамматику через
G00. Легко видеть, что
разовать грамматику
|G00|=O(|G0|
). После этого остаётся преоб-
G00в эквивалентную бинарную грамматику
G1по теореме 146. Это преобразование также увеличивает размер
грамматики лишь линейно. В результате этих преобразований мы получили КС-грамматику
G1в нормальной форме Хомского размера
O(|G|2).
Пр име р 96.
Хомского:
Грамматика уже приведённая, поэтому остаётся только привести прави­ла к виду из определения 106. Сначала заменим терминалыaиbв правых частях правил на новые нетерминалы приведёт к появлению цепных правил:
Приведём следующую КС-грамматику к нормальной форме
S → aAbB | bb | a
A → aAA | BaB | ba
B → AAB | SA | aB
Aaи
Abпри условии, что это не
S → AaAAbB | AbAb| a
A → AaAA | BAaB | AbA
B → AAB | SA | AaB
Aa→ a
Ab→ b
Наконец, введём новые нетерминалы, так чтобы правые части правил содержали либо терминал, либо два нетерминала:
S → Aa[AAbB] | AbAb| a [AAbB] → A[AbB] A → Aa[AA] | B[AaB] | AbA B → A[AB] | SA | AaB [AA] → AA Aa→ a [AaB] → AaB Ab→ b [AB] → AB
a
a
[AbB] → AbB
§ 6.5. Нормальная форма Хомского 305
Описанная процедура строит грамматику в нормальной форме Хомского, размер которой превосходит размер исходной грамматики квадратично. Удаление бесполезных нетерминалов уменьшает грам­матику, а устранение пустых правил и замена правил на бинарные меняет её размер только линейно. Поэтому увеличение размера грам­матики при переходе к нормальной форме Хомского определяется его увеличением при устранении цепных правил. Можно доказать следующий результат: для любого числа но большогоnсуществует КС-язык
ε >
0 и любого достаточ-
Lnтакой, что
Lnпорождается
некоторой КС-грамматикой размераO(n), но любая грамматика без цепных правил для Lnимеет размер Ω(ε3n
3/2−ε
).
Задачи
246. Приведите следующие грамматики к нормальной форме Хомского.
(а) S → ASaAb | ABBAA | abb
A → SS | AaBb | a B → aAaBaS | ABA | bbbb
247. Приведите следующие грамматики к нормальной форме Хомского.
(а) S → GE | aB | BB | F 0D D → aE | ab | bSa
A → C | ε | BS | ab | bA E → ε | EEE | BC | bF a B → S S | EG | b | D F → C C | AaF | F EF C → AF | C aF | bCS G → EE | aBB | Sb
(б) S → aD | AF | bbS | a D → ε | FD | GaA | DF
A → GaE | AA | Sb | CF E → ab | aS | F S | bGaD B → BS | CDF | ab | AbS | F F → DDD | F F | G C → EGE | bD | F BF | D G → AGE | GaE | GG | aG
248.
ПустьG= (N,Σ
w ∈
Σ∗— терминальное слово длиныnтакое, что
этого вывода?
, P, S
) — КС-грамматика в нормальной форме Хомского,
(б) S → ABABAB | abab
A → abAB | BBBB B → ABab | ABBB | ba | b
∗
S ⇒
w
. Чему равна длина
G
306 Глава 6. Нормальные формы КС-грамматик
§ 6.6. Левая рекурсия
Некоторые алгоритмы анализа КС-грамматик не могут работать с грамматиками, в которых существуют выводы вида кажем, что любой КС-язык порождается некоторой КС-грамматикой, в которой нет таких выводов.
A ⇒+Aα
. Мы по-
Оп ределен ие 107.
ПустьG= (N,Σ
, P, S
) — КС-грамматика. НетерминалAназывается л е в о р е к у р с и в н ы м (соответственно п р а в о р е к у р с и в н ы м), если
(Σ
∪ N
)∗(соответственно
A ⇒
+
αA
G
+
A ⇒
Aα
G
для некоторого
α ∈
). КС-грамматикаGназывается л е в о р е к у р с и в н о й (п р а в о р е к у р с и в н о й), если в ней есть хотя бы один леворекурсивный (праворекурсивный) нетерминал.
Сначала покажем, как удалить «прямую» левую рекурсию, то
есть правила вида A → Aα.
Ле мма 163.
ПустьG= (N,Σ
, P, S
) — КС-грамматика,A— нетер-
минал. Пусть все A-правила грамматики G — это правила
A → Aα1| · ·· | Aαm| β1| · ·· | βp, (15)
где слова
βiне начинаются наA. Пусть КС-грамматика
G1получается
из G заменой правил (15) на правила
A → β1| · ·· | βp| β1A0| · ·· | βpA0,
A0→ α1| · ·· | αm| α1A0| · ·· | αmA0,
где A0— новый нетерминал. Тогда G и G1эквивалентны.
Доказательство. Обозначим через матики
G1и рассмотрим грамматику
P1множество правил грам-
G2= (
N ∪ {A0},Σ, P ∪P1, S
Включения L(G) ⊆ L(G2) и L(G1) ⊆ L(G2) очевидны.
Докажем включениеL(
G2)
⊆ L(G1). Пусть
w ∈ L(G2). Тогда
существует левый вывод слова w:
).
γ0⇒
G2,l
γ1⇒
G2,l
··· ⇒
G2,l
γn,
§ 6.6. Левая рекурсия 307
где
γ0=S,
γn=w. Индукцией по числу применений правил вида
A → Aαjдокажем, что можно перестроить этот вывод в вывод в
грамматике G1.
Б а з и с и н д у к ц и и . Если таких правил нет, то это уже вывод
в G1.
Ш а г и н д у к ц и и . Пусть
вида
A → Aαiне применяются. Тогда участок вывода, начинающийся
γi⇒
G2,l
γ
, причём левее
i+1
γiправила
с γi, имеет вид
ξAη ⇒
G2,l
ξAα
i
1
η ⇒
G2,l
ξAα
⇒
G2,l
i
2
α
i
ξAα
η ⇒
1
i
k
G2,l
. . . α
··· ⇒
η ⇒
i
1
G2,l
G2,l
ξβjα
i
k
. . . α
η.
i
1
Заменим этот фрагмент вывода на
ξAη ⇒
ξβjA0η ⇒
G
1
G
1
ξβjα
⇒
A0η ⇒
i
k
G
1
ξβjα
G
i
k
··· ⇒
1
. . . α
G
A0η ⇒
i
2
1
G
1
ξβjα
i
k
. . . α
η.
i
1
Новый вывод словаwсодержит меньше применений правил вида A → Aαi, поэтому по индукционному предположению w ∈ L(G1).
ВключениеL(
G2)
⊆ L(G
) доказывается аналогично, только нужно
рассматривать правый вывод.
Теперь мы покажем, как избавиться от левой рекурсии в общем
случае.
Теорема 164.
По любой КС-грамматике можно построить эквива-
лентную КС-грамматику без левой рекурсии.
Доказательство. ПустьG— КС-грамматика без пустых правил и без правил вида нетерминалы грамматики. ПустьN=
A → A
. Упорядочим произвольным образом все
{A1, A2, . . . , An}
. Построение нелеворекурсивной грамматики выполняется с помощью алгоритма, приведённого на рис. 45.
Докажем, что следующее утверждение является инвариантом
внешнего цикла: послеiитераций внешнего цикла правая часть
308 Глава 6. Нормальные формы КС-грамматик
Algorithm УдалениеЛевойРекурсии Input: G = (N, Σ, P, S) — приведённая КС-грамматика. Output: G0— КС-грамматика без левой рекурсии
эквивалентная G.
0
1: G
= G;
2: for i = 1 to n do 3: for j = 1 to i − 1 do 4: Пусть A 5: Заменить каждое правило A
→ γ1| · ·· | γq— все Aj-правила.
j
→ Ajα на правила
i
Ai→ γ1α | ·· · | γqα.
6: end for 7: Пусть A
→ Aiα1| · ·· | Aiαm| β1| · ·· | βp— все Ai-правила,
i
причём βlне начинаются на Ai.
8: Добавить новый нетерминал A
0
и заменить Ai-правила на
i
правила
9: end for
10: return G
Ai→ β1| . . . βp| β1A
0
A
→ α1| · ·· | αm| α1A
i
0
;
0
| · ·· | βpA
i
0
i
Рис. 45. Удаление левой рекурсии.
0
,
i
| · ·· | αmA
0
.
i
§ 6.6. Левая рекурсия 309
любого на нетерминал с б´ольшим номером, то есть на нетерминал
Ak-правила для 1
6 k 6 i
начинается либо на терминал, либо
Alтакой,
что l > k.
Проведём индукцию по i.
Б а з и с и н д у к ц и и . Приi= 0 утверждение верно, так как ни
одно число k не удовлетворяет неравенствам 1 6 k 6 0.
Ш а г и н д у к ц и и . Рассмотрим i-ю итерацию цикла. Докажем вспомогательное утверждение о внутреннем цикле: послеjитераций внутреннего цикла правая часть любого
Ai-правила начинается либо
на терминал, либо на нетерминал Amтакой, что m > j.
Проведём индукцию по j.
Б а з и с и н д у к ц и и . Приj= 0 утверждение верно, так как все нетерминалы имеют положительные номера.
Ш а г и н д у к ц и и . Рассмотримj-ю итерацию внутреннего цик­ла. По внутреннему индукционному предположению начинаются на нетерминалы ному предположению
Aj-правила не начинаются на нетерминалы
A1, . . . , Aj. Значит, после подстановки ни одно
A1, . . . , A
. По внешнему индукцион-
j−1
Ai-правило не начина-
Ai-правила не
ется на A1, . . . , Aj.
Вернёмся к внешнему циклу. После срабатывания строк 3–6 наi-й итерации внешнего цикла ни одно на нетерминалы
A1, . . . , A
. После выполнения строки 8 ни одно
i−1
Ai-правило не будет начинаться также на нетерминал
ку все нетерминал
β1, . . . , βpнепусты, то
0
A
. Следовательно,
i
на терминалы, либо на нетерминалы A
Обозначим через
G0грамматику, получившуюся после срабаты-
Ai-правило не будет начинаться
Ai. Посколь-
Ai-правила не будут начинаться и на
Ai-правила могут начинаться либо
, . . . , An.
i+1
вания алгоритма. Она эквивалентна исходной, так как на каждом шаге выполнялись эквивалентные преобразования. Докажем, что
G0— грамматика без левой рекурсии. Сначала рассмотрим старый
нетерминал на нетерминалы с большими номерами, то из
Ai. Так как правые части всех
Ai-правил начинаются
+
Ai⇒
Ajα
0
G
следует
310 Глава 6. Нормальные формы КС-грамматик
j > iиAi6=Aj. Теперь рассмотрим новый нетерминал
чается в правых частях только правил вида
Ai→ βjA
Так как в грамматикеGнет пустых правил и правил вида то все слова
αjи
βjнепусты, а значит
0
A
не встречается на пер-
i
0
A
. Он встре-
i
0
0
и
A
i
i
→ αjA
A → A
вых местах в правых частях правил. Следовательно, выводы вида
+
A
0
⇒
i
0
A
α
не существуют. Итак, все нетерминалы в грамматике
0
i
G
G
нелеворекурсивны. Значит, G0нелеворекурсивна.
Пр име р 97. Устраним левую рекурсию из КС-грамматики
S → Sa | Ab
A → BA | a
B → aA | Sb
Упорядочим нетерминалы следующим образом: S, A, B.
На первом этапе обрабатываютсяS-правила. Так как нетерминал первый, то подстановка не требуется. Удаляя прямую левую рекурсию, получаем следующие правила дляSи
S → Ab | AbS
S0→ a | aS
S0(правила дляAиBне меняются):
0
0
На втором этапе обрабатываютсяA-правила. Ни одно из них не начи­нается ни наS, ни наA, поэтому на втором этапе грамматика не меняется.
На третьем этапе обрабатываютсяB-правила. Сначала подставим вместо начальных позиций нетерминала S все его следствия. Получатся правила
S
0
.
i
,
0
B → aA | Abb | AbS0b
Далее подставим все следствия нетерминалаAвместо его вхождений на первых позиция. Получатся правила
B → aA | BAbb | abb | BAbS0b | abS0b
Наконец, устраним прямую левую рекурсию вB-правилах. В результате
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]