Изменения

Перейти к: навигация, поиск

Лемма Огдена

6652 байта добавлено, 16:17, 2 апреля 2018
Источники информации
Для бесконечного языка применение приведённых в предыдущем разделе приёмов приведёт к началу построения в общем случае бесконечного числа правил грамматики. Требуется более мощный аппарат, которым служит доказываемая ниже лемма Огдена.
 
== Лемма ==
{{Лемма
|statement=
Для каждой [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободный свободной грамматики]] <tex>\Gamma =\langle \Sigma, N, S \in N, P \subset N^{+}\times (\Sigma\cup N)^{*}\rangle</tex> существует такое <tex>n</tex>, что для любого слова <tex>\omega \in L(\Gamma)</tex> длины не менее <tex>n</tex> и для любых выделенных в <tex>\omega</tex> не менее <tex>n</tex> позиций , <tex>\omega</tex> может быть представлено в виде <tex>\omega=uvxyz</tex>, причем:
# <tex>x</tex> содержит выделенную позицию;
# либо <tex>u</tex> и <tex>v</tex>, либо <tex>y</tex> и <tex>z</tex> обе содержат выделенные позиции;
# <tex>vxy</tex> содержат не более <tex>n</tex> выделенных позиций;
# существует <tex>A \in LN</tex>, такой что <tex>S \Rightarrow^{+} uAz \Rightarrow^{+} uvAyz \Rightarrow^{+} uvxyz</tex>.(т.е. <tex>\forall k \geqslant 0~uv^{k}xy^{k}z\in L</tex>)
|proof=
Введем следующие обозначения: <tex>m = |N|</tex> и <tex>l</tex> — длина самой длинной правой части правила из <tex>P</tex>. Тогда в качестве <tex>n</tex> возьмем <tex>l^{2m + 3}</tex>. Рассмотрим дерево разбора <tex>T</tex> для произвольного слова <tex>\omega \in L(\Gamma)</tex>, у которого <tex>|\omega| \ge geqslant n</tex>. В силу выбора <tex>n</tex> в <tex>T</tex> будет по крайне мере один путь от корня до листа длины, не менее <tex>2m + 3</tex>. Произвольным образом выделим в <tex>\omega</tex> не менее <tex>n</tex> позиций. Соответствующие этим позициям листья дерева <tex>T</tex> будем называть выделенными. Пусть <tex>v_1</tex> — корень <tex>T</tex>, а <tex>v_{i + 1}</tex> — сын <tex>v_i</tex>, который имеет среди своих потомков наибольшее число выделенных листьев (если таких несколько, то <tex>v_{i + 1}</tex> самый правый из них). Рассмотрим <tex>v_1, v_2, \ldots, v_p</tex> {{---}} путь от корня до листа.  Будем называть ветвящейся ту вершину, у которой по крайне мере два сына имеют выделенных потомков. Докажем по индукции, что если среди <tex>v_1, v_2, \ldots, v_i</tex> вершин есть <tex>k</tex> ветвящихся, то <tex>v_{i + 1}</tex> имеет хотя бы <tex>l^{2m + 3 - k}</tex> выделенных потомков. <br>База индукции: <tex>i = 0</tex>. Тогда <tex>k = 0</tex> и <tex>v_1</tex> имеет по крайне мере <tex>n</tex> выделенных потомков, поскольку является корнем. <br>Индукционный переход. Если <tex>v_i</tex> не является ветвящейся вершиной, то <tex>v_{i + 1}</tex> имеет такое же число ветвящихся потомков, как и <tex>v_i</tex>. Если <tex>v_i</tex> — ветвящаяся вершина, то <tex>v_{i + 1}</tex> имеет не более чем в <tex>l</tex> раз меньшее число выделенных потомков. Поскольку <tex>v_1</tex> имеет хотя бы <tex>n = l^{2m + 3}</tex> выделенных потомков, то <tex>v_1, v_2, \ldots, v_p</tex> содержит по крайне мере <tex>2m + 3</tex> ветвящиеся вершин. Заметим, что <tex>v_p</tex> {{---}} лист, поэтому <tex>p > 2m + 3</tex>. [[Файл:derivation_tree_T.png|240px|thumb|left|Дерево вывода <tex>T</tex>]]Будем называть <tex>v_i</tex> левой ветвящейся вершиной, если ее сын, не принадлежащий пути <tex>v_1, v_2, \ldots, v_p</tex>, имеет выделенного потомка, лежащего слева от <tex>v_p</tex>. В противном случае назовем <tex>v_i</tex> правой ветвящейся вершиной. Рассмотрим последние <tex>2m + 3</tex> вершины, принадлежащие пути <tex>v_1, v_2, \ldots, v_p</tex>. Предположим, что хотя бы <tex>m + 2</tex> вершины {{---}} левые ветвящиеся (случай, когда хотя бы <tex>m + 2</tex> вершины {{---}} правые ветвящиеся, разбирается аналогично). Пусть <tex>u_1, u_2, \ldots, u_{m + 2}</tex> {{---}} последние <tex>m + 2</tex> левые ветвящиеся вершины. Поскольку <tex>m = |N|</tex>, то среди них можно найти как минимум две вершины, соответствующие одному нетерминалу. Обозначим эти вершины <tex>a</tex> и <tex>b</tex>, причем <tex>b</tex> {{---}} потомок <tex>a</tex>. Тогда на рисунке показано, как представить <tex>\omega</tex> в требуемом виде.  Условие <tex>(1)</tex> выполнено, поскольку <tex>x</tex> содержит выделенную вершину, а именно <tex>v_p</tex>. Очевидно, что условие <tex>(4)</tex> выполнено в силу предложенного разбиения <tex>\omega</tex>. Кроме того, <tex>u</tex> содержит выделенную вершину, а именно потомка некоторого сына вершины <tex>u_1</tex>. Аналогично, выделенный потомок некоторого сына вершины <tex>a</tex> содержится в <tex>v</tex>. Таким образом, условие <tex>(2)</tex> выполнено. Поскольку между <tex>v_p</tex> и <tex>a</tex> не более <tex>2m + 3</tex> вершин, вершина <tex>a</tex> имеет не более <tex>n</tex> выделенных потомков, поэтому условие <tex>(3)</tex> выполнено.}} == Примеры не КС-языка, для которого выполняется лемма ==Следует обратить особое внимание на то, что лемма содержит лишь необходимые условия принадлежности КС языку.===Пример <tex> 1 </tex>==={{Утверждение|statement=Можно построить такой язык, для которого будет выполняться лемма Огдена, однако язык не будет контекстно-свободным. |proof=При анализе этого языка следует использовать алгебраические свойства множества. Выберем <tex>P</tex> {{---}} подмножество <tex>N</tex> и  <tex>A_{p} = \{ (ab)^n \mid P \in N \} </tex> <tex>B_{p} = A_{p} \cup X^* \{aa, bb\}X^*</tex> Языки над <tex>X=\{a, b\}</tex>. Очевидно, что <tex>B_{p}</tex> {{---}} КС, если <tex>A_{p}</tex> контекстно-свободен. <tex>B_{p}</tex> является рекурсивно-перечислимым, если и <tex>A_{p}</tex> им является.  Для <tex>B_{p}</tex> будет выполняться лемма Огдена при <tex>n = 4</tex>. Выбрав <tex>A_{p}</tex> таким образом, чтобы он был рекурсивно-перечислимым, мы создадим язык для которого будет выполняться лемма Огдена, однако язык не будет контекстно-свободным. (Такие языки существуют)<ref>A.V. Aho & J.D. Ullman, The Theory of Parsing, Translation and Compilimg, Vol. I, 1972</ref> }}
Пусть === Пример <tex>v_12 </tex> — корень <tex>T</tex>, а ==={{Утверждение|statement=Язык <tex>v_L = {i + 1a^mb^nc^l}</tex> — сын , где <tex>v_i</tex>m, который имеет среди своих потомков наибольшее число выделенных листьев (если таких несколькоn, то l </tex>v_{i + 1{---}</tex> самый правый из них). Рассмотрим <tex>v_1} попарно различны, v_2, ..., v_p</tex> — путь от корня до листане является КС-языком. |proof=
Будем называть ветвящейся ту вершинуПредположим, у которой по крайне мере два сына имеют выделенных потомковчто данный язык контекстно-свободный. Докажем по индукции, что если среди Возьмем цепочку <tex>v_1, v_2, ..., v_i\omega = a^kb^{k+(k-1)!} c^{k+k!}</tex> вершин есть , где <tex>k</tex> ветвящихся, то <tex>v_{i + 1{---}}</tex> имеет хотя бы константа из леммы Огдена, выделив в ней все вхождения символа <tex>l^{2m + 3 - k}a</tex> выделенных потомков. <br>База индукции: Тогда при представлении цепочки <tex>i = 0\omega</tex>. Тогда в виде <tex>k = 0uvxyz</tex> и цепочка <tex>v_1x</tex> имеет (по крайне мере условию (1) леммы) обязательно «зацепит» хотя бы одинсимвол <tex>na</tex> выделенных потомков. Cледовательно, поскольку является корнем. <br>Индукционный переход. Если цепочка <tex>v_iv</tex> не является ветвящейся вершиной, то состоит только из символов <tex>v_{i + 1}a</tex> имеет такое же число ветвящихся потомков (как и цепочка <tex>v_iu</tex>). Если А именно,<tex>v_iv = \alpha^p</tex> — ветвящаяся вершина, то <tex>v_{i 1 \leqslant p \leqslant k+ 1}</tex> имеет не более чем в <tex>l</tex> раз меньшее число выделенных потомков.
Поскольку Тогда, если цепочка <tex>x</tex> содержит и другие символы, кроме <tex>a</tex>, цепочка <tex>v_1y</tex> имеет хотя бы может входить либо в «зону» символов <tex>n = l^{2m + 3}b</tex> выделенных потомков(целиком), то либо в «зону» символов <tex>c</tex>v_1(целиком), так как расположение накачиваемых цепочек на стыках зон, v_2очевидно, невозможно...В первом случае «кратность» <tex>\alpha</tex> накачки цепочки <tex>v</tex>, v_pкоторая уравняет числа символов <tex>a</tex> содержит по крайне мере и <tex>2m + 3c</tex> ветвящиеся вершин. Заметим, что определяется из соотношения:<tex>v_pk + \alpha \cdot p = k + k!</tex> — лист, поэтому то есть <tex>\alpha = \dfrac{k!}{p > 2m + 3} </tex>.
[[Файл:derivation_tree_T.png|240px|thumb|left|Дерево вывода Во втором случае <tex>T\dfrac {k-1!}{p}</tex>]]Будем называть - кратная накачка цепочки <tex>v_iv</tex> левой ветвящейся вершиной, если ее сын, не принадлежащий пути уравняет числа вхождений символов <tex>v_1, v_2, ..., v_pa</tex>, имеет выделенного потомка лежащего слева от и <tex>v_pb</tex>. В противном случае назовем <tex>v_i</tex> правой ветвящейся вершиной. Рассмотрим последние <tex>2m + 3</tex> вершины, принадлежащие пути <tex>v_1, v_2Не исключено, ..., v_p</tex>. Предположимнаконец, что хотя бы обе накачиваемые цепочки расположены в «зоне» символов <tex>m + 2a</tex> вкршины левые ветвящиеся (случай, когда хотя бы <tex>m + 2</tex> вершины правые ветвистые, разбирается аналогично). Пусть <tex>u_1, u_2, ..., u_{m + 2}</tex> — последние <tex>m + 2</tex> левые ветвящиеся вершины. Поскольку <tex>m = |N|</tex>, то среди них Но тогда одним из указанных выше способов накачки можно найти как минимум две вершины, соответствующие одному нетерминалу. Обозначим эти вершины уравнять числа либо символов <tex>a</tex> и <tex>b</tex>, причем <tex>b</tex> потомок либо <tex>a</tex>. Тогда на рисунке показано как представить и <tex>\omegac</tex> в требуемом виде.
[[Файл:Ogden1.png|left|Рис. Цепочки контекстно-свободного языка]]
Условие (1) выполненоЗаметим, поскольку <tex>x</tex> содержит выделенную вершинучто возможность выделения символов существенно упрощает анализ данного языка, а именно <tex>v_p</tex>. Очевиднотак как позволяет считать, что условие (4) выполнено в силу предложенного разбиения цепочка <tex>\omegav</tex>может расположиться единственным способом. Кроме того, <tex>u</tex> содержит выделенную вершинуИначе, а именно потомка некоторого сына вершины <tex>u_1</tex>т. Аналогично, выделенный потомок некоторого сына вершины <tex>a</tex> содержится в <tex>v</tex>е. Таким образомпри использовании леммы о разрастании для кс-языков, условие (2) выполнено. Поскольку между <tex>v_p</tex> и <tex>a</tex> не более <tex>2m + 3</tex> вершинрешение задачи было бы, вершина <tex>a</tex> имеет не более <tex>n</tex> выделенных потомковпо меньшей мере, поэтому условие (3) выполненосильно затруднено.
}}
 
== См. также ==
*[[Лемма_о_разрастании_для_КС-грамматик|Лемма о разрастании для КС-грамматик]]
 
==Примечания==
 
<references />
 
== Источники информации ==
 
* [http://ru.wikipedia.org/wiki/Лемма_Огдена Wikipedia {{---}} Лемма Огдена]
* ''Hopcroft, Motwani and Ullman'' {{---}} Automata Theory, Languages, and Computation {{---}} Addison-Wesley, 1979. ISBN 81-7808-347-7.
* ''Ogden, W.'' (1968). A helpful result for proving inherent ambiguity. Mathematical Systems Theory. 2 (3): 191–194.
* [http://archive.numdam.org/ARCHIVE/ITA/ITA_1978__12_3/ITA_1978__12_3_201_0/ITA_1978__12_3_201_0.pdf On languages satisfying Ogden's lemma]
* [http://ccf.ee.ntu.edu.tw/~yen/courses/toc14/chapter-2a.pdf Ogden's lemma]
 
[[Категория: Теория формальных языков]]
[[Категория: Контекстно-свободные грамматики]]
[[Категория: Опровержение контекстно-свободности языка]]
200
правок

Навигация