Опубликован: 06.08.2007 | Доступ: свободный | Студентов: 1901 / 1054 | Оценка: 4.45 / 4.29 | Длительность: 18:50:00
Специальности: Программист
Лекция 3:

Языки и их представление

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Линейно-ограниченные автоматы и их связь с контекстно-зависимыми грамматиками

Каждый КЗ-язык является рекурсивным, но обратное не верно. Покажем что существует алгоритм, позволяющий для произвольного КЗ-языка L в алфавите T, и произвольной цепочки w \in T^* определить, принадлежит ли w языку L.

Теорема 2.6. Каждый контекстно-зависимый язык является рекурсивным языком.

Доказательство. Пусть L - контекстно-зависимый язык. Тогда существует некоторая неукорачивающая грамматика G = (N, T, P, S), порождающая L.

Пусть w \in T^* и \mid \!w \! \mid = n. Если n = 0, то есть w = e, то принадлежность w \in L проверяется тривиальным образом. Так что будем предполагать, что n > 0.

Определим множество Tm как множество строк u \in (N \cup T)^+ длины не более n таких, что вывод S \Rightarrow^* \; u имеет не более m шагов. Ясно, что T0 = {S}.

Легко показать, что Tm можно получить из Tm-1 просматривая, какие строки с длиной, меньшей или равной n можно вывести из строк из Tm-1 применением одного правила, то есть

T_m=T_{m-1} \cup \{u \mid v \Rightarrow для \; некоторого \; v \in T_{m-1}, \;где \mid \! u \! \mid \leq n \}

Если S\Rightarrow^* \; u и \mid \!u \! \mid \leq n, \; то \; u \in T_m для некоторого m. Если из S не выводится u или |u| > n, то u не принадлежит Tm ни для какого m.

Очевидно, что T_m \subseteq T_{m-1} для всех m > 1. Поскольку Tm зависит только от Tm-1, если Tm = Tm-1, то Tm = Tm+1 = Tm+2 = .... Процедура будет вычислять T1, T2, T3, . .. пока для некоторого m не окажется Tm = Tm-1. Если w не принадлежит Tm, то не принадлежит и L(G), поскольку для j > m выполнено Tj = Tm. Если w \in T_m, то S \Rightarrow^* w.

Покажем, что существует такое m, что Tm = T m-1. Поскольку для каждого i > 1 справедливо T_i \supseteq T_{i-1}, то если T_i \neq T_{i-1}, то число элементов в Ti по крайней мере на 1 больше, чем в Ti-1. Пусть \mid \! N \cup T \! \mid = k. Тогда число строк в ( N \cup T )^+ длины меньшей или равной n равно k+k^2+ \ldots +k^n \leq nk^n. Только эти строки могут быть в любом Ti. Значит, Tm = Tm-1 для некоторого m \leq nk^n. Таким образом, процедура, вычисляющая Ti для всех i \geq 1 до тех пор, пока не будут найдены два равных множества, гарантированно заканчивается, значит, это алгоритм.

Линейно-ограниченный автомат (ЛОА) - это недетерминированная машина Тьюринга с одной лентой, которая никогда не выходит за пределы |w| ячеек, где w - вход. Формально, линейно-ограниченный автомат обозначается как M = (Q, \Sigma, \Gamma, D, q_0, F). Обозначения имеют тот же смысл, что и для машин Тьюринга. Q - это множество состояний, F \subseteq Q - множество заключительных состояний, \Gamma - множество ленточных символов, \Sigma \subseteq \Gamma - множество входных символов, q_0 \in Q - начальное состояние, D - отображение из Q \times \Gamma в подмножество Q \times \Gamma  \times \{ L, R\}.

\Sigma содержит два специальных символа, обычно обозначаемых \copyright и $, - левый и правый концевые маркеры, соответственно. Эти символы располагаются сначала по концам входа и их функция - предотвратить переход головки за пределы области, в которой расположен вход.

Конфигурация M и отношение \vdash M, связывающее две конфигурации, если вторая может быть получена из первой применением D, определяются так же, как и для машин Тьюринга. Конфигурация M обозначается как

(q,A1A2,...,An,i) где q \in Q, \; A_1,A_2, \ldots ,A_n \in \Gamma, i -целое от 1 до n. Предположим, что (p,A,L) \in D(q,A_i) и i > 1

Будем говорить, что

(q,A_1,A_2 \ldots A_n,i)\vdash_M (p,A_1,A_2 \ldots A_{i-1}AA_{i+1} \ldots A_n,i-1)

(p,A,R) \in D(q,A_i) и i < n, будем говорить, что

(q,A_1,A_2 \ldots A_n,i)\vdash_M (p,A_1,A_2 \ldots A_{i-1}AA_{i+1} \ldots A_n,i+1)

То есть M печатает A поверх Ai, меняет состояние на p и передвигает головку влево или вправо, но не за пределы области, в которой символы располагались исходно. Как обычно, определим отношение \vdash *_M как

(q, \alpha , i )\vdash *_M (q, \alpha , i ) и

Если (q_1, \alpha_1 , i_1 )\vdash *_M (q_2, \alpha_2 , i_2 )  и (q_2, \alpha_2 , i_2 )\vdash *_M (q_3, \alpha_3 , i_3 ),

то (q_1, \alpha_1 , i_1 )\vdash *_M (q_3, \alpha_3 , i_3 )

Язык, допускаемый M - это \{w \mid w \in (\Sigma \ \{ \copyright, \$ \})^* и (q_0,\copyright  w \$, 1) \vdash * (q, \alpha , i) для некоторого q \in F, \alpha \in \Gamma^* и целого i}.

Будем называть M детерминированным, если D(q, A) содержит не более одного элемента для любых q \in Q, A \in \Gamma. Не известно, совпадает ли класс множеств, допускаемых детерминированными и недетеминированными ЛОА. Ясно, что любое множество, допускаемое недетерминированным ЛОА, допускается некоторой детерминированной МТ. Однако, число ячеек ленты, требуемой этой МТ, может экспоненциально зависеть от длины входа.

Класс множеств, допускаемых ЛОА, в точности совпадает с классом контекстно - зависимых языков.

Теорема 2.7. Если L - контекстно-зависимый язык, то L допускается ЛОА.

Доказательство. Пусть G = (VN, VT, P, S) - контекстно- зависимая грамматика. Построим ЛОА M такой, что он допускает язык L(G). Не вдаваясь в детали построения M, поскольку он довольно сложен, рассмотрим схему его работы. В качестве ленточных символов будем рассматривать пары (s^1_i,s^2_i), \; \text{где} \; s^1_i \in \Sigma, \;\Sigma= V_T \cup \{@,\$ \}, \; s^2_i \; \in \Gamma, \; \Gamma = V_T \cup V_N \cup \{B \} В начальной конфигурации лента содержит (@, B), (a1, B), ... (an, B), ($, B), где a1 ... an = w - входная цепочка, n=|w|. Цепочку символов s^1_1 \ldots s^1_n n будем называть " первым треком ", s^2_1 \ldots s^2_n n - " вторым треком ". Первый трек будет содержать входную строку x с концевыми маркерами. Второй трек будет использоваться для вычислений. На первом шаге M помещает символ S в самой левой ячейке второго трека. Затем M выполняет процедуру генерации в соответствии со следующими шагами:

  1. Процедура выбирает подстроку символов \alpha из второго трека такую, что \alpha \rightarrow \beta \in P.
  2. Подстрока \alpha заменяется на \beta, перемещая, если необходимо, вправо символы справа от \alpha. Если эта операция могла бы привести к перемещению символа за правый концевой маркер, ЛОА останавливается.
  3. Процедура недетерминированно выбирает перейти на шаг 1 или завершиться.

На выходе из процедуры первый трек все еще содержит строку x, а второй трек содержит строку \gamma такую, что S \Rightarrow_G^*G \; \gamma ЛОА сравнивает символы первого трека с соответствующими символами второго трека. Если сравнение неуспешно, строки символов первого и второго треков не одинаковы и ЛОА останавливается без допуска. Если строки одинаковы, ЛОА останавливается и допускает.

Если x \; \in \; L(G), то существует некоторая последовательность шагов, на которой ЛОА строит x на втором треке и допускает вход. Аналогично, для того, чтобы ЛОА допустил x, должна существовать последовательность шагов такая, что x может быть построен на втором треке. Таким образом, должен быть вывод x из S в G.

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

Теорема 2.8. Если L допускается ЛОА, то L - контекстно - зависимый язык.

Доказательство. Конструкция КЗГ по ЛОА аналогична конструкции грамматики типа 0, моделирующей машину Тьюринга. Различие заключатся в том, что нетерминалы КЗГ должны указывать не только текущее и исходное содержимое ячеек ленты ЛОА, но и то, является ли ячейка соседней справа или слева с концевым маркером. Кроме того, состояние ЛОА должно комбинироваться с символом под головкой, поскольку КЗГ не может иметь раздельные символы для концевых маркеров и состояния ЛОА, так как эти символы должны были бы быть заменены на e, когда строка превращается в терминальную.

Теорема 2.9. Существуют рекурсивные множества, не являющиеся контекстно - зависимыми.

Доказательство. Все строки в {0,1}* можно занумеровать. Пусть xi - i -ое слово. Мы можем занумеровать все грамматики типа 0, терминальными символами которых являются 0 и 1. Поскольку имена переменных не важны и каждая грамматика имеет конечное их число, можно предположить, что существует счетное число переменных.

Представим переменные в двоичной кодировке как 01, 011, 0111, 01111 и т.д. Предположим, что 01 всегда является стартовым символом. Кроме того, в этой кодировке терминал 0 будет представляться как 00, а терминал 1 как 001. Символ " -> " представляется как 0011, а запятая как 00111. Любая грамматика с терминалами 0 и 1 может быть представлена строкой правил, использующей стрелку (0011) для разделения левой и правой частей, и запятой (00111) для разделения правил. Строки, представляющие символы, используемые в правилах, - это 00, 001 и 01i для i = 1, 2, ... Множество используемых переменных определяется неявно правилами.

Отметим, что не все строки из 0 и 1 представляют грамматики, и не обязательно КЗГ. Однако, по данной строке легко можно сказать, представляет ли она КЗГ. i - ю грамматику можно найти, генерируя двоичные строки в описанном порядке пока не сгенерируется i -я строка, являющаяся КЗГ. Поскольку имеется бесконечное число КЗГ, их можно занумеровать в некотором порядке G1, G2, ...

Определим L = \{ x_{i}|x_{i} \notin  L(G_{i})\}. L рекурсивно. По строке xi легко можно определить i и затем определить Gi. По теореме 2.6. имеется алгоритм, определяющий для xi принадлежит ли он L(Gi), поскольку Gi КЗГ. Таким образом имеется алгоритм для определения для любого x принадлежит ли он G.

Покажем теперь, что L не генерируется никакой КЗ-грамматикой. Предположим, что L генерируется КЗ- грамматикой Gi. Во-первых, предположим, что x_i \in  L. Поскольку L(G_i) = L, x_i \in L(G_i). Но тогда по определению xi \notin  L(G_{i}) - противоречие. Таким образом предположим, что x_{i} \notin  L. Поскольку L(G_{i}) = L, x_{i} \notin  L(G_{i}). Но тогда по определению x_i \in L(G_i) - снова противоречие. Из чего можно заключить, что L не генерируется Gi. Поскольку приведенный выше аргумент справедлив для каждой КЗ- грамматики Gi в перечислении, и поскольку перечисление содержит все КЗ-грамматики, можно заключить, что L не КЗ-язык. Поэтому L - рекурсивное множество, не являющееся контекстно-зависимым.

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >