Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
55
Добавлен:
16.04.2015
Размер:
912.3 Кб
Скачать

Алгоритмическая разрешимость проблемы конечности или бесконечности языка, порождаемого cfg

Поскольку мы можем проверить, имеется ли данная цепочка в данном КСязыке L (см. теорему 2.3 о рекурсивности контекстно-зависимых грамматик), то мы просто должны проверять все цепочки в интервале длин l, удовлетворяющих неравенству p < l p + q, на принадлежность языку L(G).

Если такая цепочка имеется, то язык L бесконечен; если в языке L нет цепочек длины больше, чем p, то язык L конечен.

Что и требовалось доказать.

101

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

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

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

102

Теорема 4.9. Для всякой КС-грамматики G1 можно найти эквивалентную ей КСграмматику G2, такую, что если A — нетерминал грамматики G2, не являющийся начальным нетерминалом, то из A выводимо бесконечно много терминальных цепочек.

Доказательство. Если язык

L(G1) = {x1, x2, ..., xn}

конечен, то утверждение очевидно.

Ret 88

103

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Действительно, положим

G2 = ({S}, VT , P2, S), где P2 = {S xi i = 1, 2, ..., n}.

В этой грамматике совсем нет нетерминалов, отличных от S.

Пусть теперь грамматика есть

G1 = (VN, VT, P1, S),

и язык L(G1) бесконечен. Рассмотрим грамматики

GA = (VN, VT, P1, A) для всех A VN.

104

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Так как существует алгоритм, позволяющий узнать, бесконечен ли порождаемый грамматикой GA язык, то словарь VN мы можем разбить на две части:

VN ={A1, A2, ..., Ak} {B1, B2, ..., Bm},

где Ai (i = 1, 2, ..., k) — нетерминалы, порождающие бесконечно много терминальных цепочек, причём начальный нетерминал S среди них, поскольку язык L бесконечен;

Bj ( j = 1, 2, ..., m) — нетерминалы, порождаю- щие конечные множества терминальных цепочек.

105

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Построим грамматику

G2 = ({A1, A2,..., Ak}, VT, P2, S), где

P2={Ai u1u2 ... ur Ai C1C2 ... Cr P1,

(1) ui = Ci, если Ci VT {A1, A2, ..., Ak},

(2) Ci *

G1

ui, ui

V

*

 

T

, если Ci {B1, B2, ..., Bm}}.

106

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Короче говоря, правила P2 получаются из правил P1 посредством отбрасывания всех правил с нетерминалами Bj в левых частях, а в правых частях оставшихся правил все вхождения нетерминалов Bj надо заменить какими-нибудь их терминальными порождениями.

Поскольку число таких терминальных порождений конечно, то и число получающихся правил в P2 тоже конечно.

107

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Покажем теперь, что L(G1) = L(G2).

I. L(G1) L(G2).

Индукцией по длине вывода l докажем, что

 

l

 

*

 

w

*

 

 

 

 

если A

w, то A

 

(i = 1, 2, ..., k).

w,

VT

i

G

i

G

2

 

 

 

 

 

 

 

 

1

 

 

 

 

 

w. При этом

 

 

 

 

 

 

 

 

База. Пусть l = 1 и пусть Ai G

1

 

 

 

 

 

 

 

 

 

 

 

применялось правило A

 

 

 

 

*

.

w P , где w V

 

 

 

 

 

i

 

 

 

1

T

 

Но это же правило есть в P2 по построению (в правой части этого правила вовсе нет вхождений нетерминалов, в том числе и Bj).

Поэтому Ai w.

G2

108

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Индукционная гипотеза. Предположим, что утверждение выполняется для всех выводов длины l n (n 1).

Индукционный переход. Рассмотрим вывод длины l = n + 1:

 

 

 

 

 

 

n

 

 

Ai

C1C2 ... Cr w1w2 ... wr,

 

 

G

 

lp

 

 

1

 

G1

 

 

 

 

 

 

 

 

*

, lp n.

где Cp G

1

 

wp, wp VT

 

 

 

 

 

 

 

На первом

шаге применяется правило

Ai C1C2 ... Cr P1.

109

Исключение нетерминалов из cfg, из которых выводится только конечное число терминальных цепочек

Возьмём во множестве правил P2 соответствующее правило, которое получается из данного заменой в нём всех нетерминалов типа B на соответствующие цепочки w, выводимые из них, т. е. правило

Ai u1u2 ... ur P2,

в котором

up = wp, если Cp VT {B1, B2,..., Bk},

up = Cp, если Cp {A1, A2, ..., Ak}, p =1, 2, ..., r.

110

Соседние файлы в папке lectures