Лекция 12

Теория формальных языков (IV)

(Конспект: А. Крючков)

12.1 Контекстно-зависимые языки

Нас интересует, выводима ли строка x в контекстно-зависимой (неукорачивающей) грамматике G. Будем строить дерево: применим каждое из правил к стартовому символу; полученные строки — его сыновья.

S / | \ u v w /\ /\ /\ ............

Применим каждое из правил к каждому из сыновей (всеми возможными способами), и т. д. Так будем поступать только для строк, которые не длиннее x (остальные ветки не продолжаем); более того, если строка уже встречалась, соответствующую ветку (“дубликат”) продолжать не будем.

Рано или поздно либо мы выведем x, либо все ветки оборвутся (строк длины ⩽ |x| — конечное число, а вывод в неукорачивающей грамматике обязательно использует только такие строки).

12.2 Рекурсивно-перечислимые языки

Машина Тьюринга (детерминированная):

(Q, Σ, >, _, q_{s}, q_{y}, q_{n},
δ : Q × (Σ ∪ {>, _}) → Q × (Σ ∪ {>, _}) × {−1, 0, 1},

где

> — символ начала строки,

_— пустой символ,

q_{s} ∈ Q — начальное состояние,

q_{y}, q_{n} ∈ Q — конечные состояния (принимающее и отвергающее),

Σ — алфавит,

Q — конечное множество состояний,

δ — функция перехода.

________________________

| | | | | | | > |a |b |a |c |_|_|... __|__|__|__|__|__|__|___

<-- ^--> \ \ головка

На каждом шаге мы меняем символ, на который указывает головка, в соответствии с функцией δ, а затем сдвигаем головку на −1, 0 или 1 позицию вправо.

Определение 12.1. q ⟶^{a/b,+} p ⇔ (p, b, +1) = δ(q, a) (заменяем a на b и идем вправо). Аналогично с −1 и 0.

Попав в конечное состояние, машина обязательно останавливается. Если на входе x мы попадаем в q_{y}, обозначим это M(x) = 1; если в q_{n}, то M(x) = 0; никуда (работаем бесконечно долго) — M(x) = +∞.

Теорема 12.1. По любой машине Тьюринга M можно построить RAMмашину M′, такую, что ∀x M(x) = M′(x), а время работы машины M′ ограничено полиномом от времени работы M (коэффициенты этого полином зависят только от M, но не от входа). И наоборот.

Задача 12.1. Доказать теорему 12.1.

Теорема 12.2. Пусть L ⊆ Σ^{∗}. Тогда существует грамматика (с произвольными правилами) G, порождающая L, тогда и только тогда, когда существует ДМТ M, такая, что для любого x ∈ L выполняется M(x) = 1, а для любого x ∉ L выполняется M(x) ≠ 1.

Доказательство. ⇒ Ведем себя аналогично тому, как решали задачу принадлежности в разделе 12.1, только не обрываем никаких ветвей (которые можно продолжить). Найдем строку — хорошо (M(x) = 1); нет — не заканчиваем работу (M(x) = +∞).

⇐ Строим грамматику. Подготовим начальную конфигурацию машины Тьюринга: S ⟶ S′Z; Z ⟶ _Z; Z ⟶ E′; S′ ⟶ aS′a (∀a ∈ Σ); S′ ⟶ E>q_{s}.

Так мы выведем строку “перевернутый вход E > q_{s} вход _… _E′”. Также нетерминалами будут состояния машины Тьюринга. Модели-

руем работу машины Тьюринга следующим образом:

aq ⟶ bp, если q ⟶^{a/b,0} p;

aq ⟶ pb, если q ⟶^{a/b,−} p;

aq ⟶ q′ и q′c ⟶ cp, если q ⟶^{a/b,+} p;

Остается в конце работы убрать оставшееся на ленте (а вместе с символами E и E′ — и состояние q_{y}): q_{y}c ⟶ q_{y} (∀c ∈ Σ ∪ {_, >}); cq_{y} ⟶ q_{y} (∀c ∈ Σ ∪ {_, >}); Eq_{y}E′ ⟶ ϵ.

Определение 12.2. Язык L ⊆ Σ^{∗} — рекурсивно-перечислимый, если существует машина Тьюринга M, такая, что ∀x ∈ Σ^{∗} (x ∈ L ⇔ M(x) = 1).

Определение 12.3. Язык L ⊆ Σ^{∗} — рекурсивный, если существует машина Тьюринга M, такая, что ∀x ∈ Σ^{∗} ((x ∈ L ⇔ M(x) = 1) ∧ (x ∉ L ⇔ M(x) = 0)).

Заметим, что рекурсивные языки — в точности те, для которых проблема принадлежности разрешима.

Теорема 12.3. Существует язык, являющийся рекурсивно-перечислимым, но не рекурсивным.

Лемма 12.1. Существует универсальная машина Tьюринга U: на вход U подается описание машины T и вход, а выдает она то, что выдала бы машина T на данном входе.

Задача 12.2. Доказать лемму 12.1.

Доказательство теоремы. Определим язык L так: (M, x) ∈ L ⇔ M(x) = 1. Он, очевидно, рекурсивно-перечислимый. Покажем, что он не рекурсивный.

Пусть он все же рекурсивный. Тогда существует машина A, такая, что A((M, x)) = 1 ⇔ M(x) = 1, A((M, x)) = 0 ⇔ M(x) ≠ 1.

Построим еще одну машину, D, на вход которой подается описание машины R: D(R) = 0, если A((R, R)) = 1; D(R) = 1, если A((R, R)) = 0 (чтобы построить ее, воспользуемся леммой 12.1: применим U к A с входом (R, R)).

Чему равно D(D)? Если D(D) = 1, то A((D, D)) = 0, т.е. D(D) ≠ 1 (противоречие). Если же D(D) = 0, то A((D, D)) = 1, т.е. D(D) = 1 (противоречие). По построению не может быть и D(D) = +∞, т.е. машины D (а вместе с ней — и машины A) не существует.