Лекция 9

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

(Конспект: А. Ю. Волков)

Эта лекция почти целиком состоит из определений.

9.1 Формальные языки

Будем называть алфавитом произвольное конечное множество (например, {0, 1} — алфавит). Строкой в алфавите Σ будет называться конечная последовательность его элементов (пустой строкой, обозначаемой ϵ, будет называться последовательность из нуля элементов).

Языком в алфавите Σ называется множество некоторых строк в алфавите Σ. Например: \{ϵ, 1, 00, 01\}. Или: \{\underbrace{0 … 0}_{n} \underbrace{1 … 1}_{n} |n ∈ ℕ\}.

Далее определим регулярные выражения в алфавите Σ. Они будут определяться индуктивно:

• ∅ — регулярное выражение;

• {ϵ} — регулярное выражение;

• {a} — регулярное выражение (для каждого a ∈ Σ);

• Если A, B — регулярные выражения, то A ∪ B — тоже регулярное выражение;

• Если A, B — регулярные выражения, то A · B — тоже регулярное выражение;

• Если A — регулярное выражение, то A^{∗} — тоже регулярное выражение.

Это определение исчерпывает все возможные регулярные выражения.

Каждое регулярное выражение определяет некоторый язык. Для большинства пунктов определения очевидно, какой язык имеется в виду; оставшиеся пункты:

• для данных языков A и B язык A · B состоит из строк вида ab, где a ∈ A, b ∈ B (значок операции “точка” — конкатенации строк — часто опускается);

• A^{∗} = {ϵ} ∪ A ∪ A · A ∪ A · A · A … (все конечные A · . . . · A).

Например, ({0} ∪ {11})^{∗} · {000} обозначает множество всех последовательностей нулей и пар единиц, заканчивающихся на три нуля.

9.2 Формальные грамматики

Формальной грамматикой называется упорядоченная четверка (N, Σ, S, R), где

• N — множество нетерминальных символов (будут обозначаться заглавными латинскими буквами),

• Σ — множество терминальных символов (будут обозначаться маленькими латинскими буквами и цифрами),

• S — стартовый символ (S ∈ N),

• R ⊆ (N ∪Σ)^{∗}N(N ∪Σ)^{∗}×(N ∪Σ)^{∗} — множество правил (вида α → β, где α, β — произвольные строки терминалов и нетерминалов, но α содержит хотя бы один нетерминал).

Пример 9.1. N = {S, A}, Σ = {0, 1}. Правила: S → 0S1, 0S → 1A, A → ϵ.

Для данной грамматики введем отношение выводимости:

• γ ⇒ δ, если γ = γ_{1}αγ_{2}, δ = γ_{1}βγ_{2} и существует правило α → β из R;

• ⇒^{∗} — транзитивно-рефлексивное замыкание ⇒.

Пример 9.2. Продолжая пример 9.1: S ⇒ 0S1 ⇒ 00S11 ⇒ 01A11 ⇒ 0111; S ⇒^{∗} 01A11, S ⇒^{∗} 0111, S ⇒^{∗} S.

Строка α, для которой S ⇒^{∗} α, называется выводимой в данной грамматике. Язык L(G), порождаемый грамматикой G, состоит из всех строк терминалов, выводимых в ней, т.е. L(G) = {α ∈ Σ^{∗}|S ⇒^{∗} α}.

Пример 9.3. В примере 9.2 указано три выводимых строки, но лишь одна из них (0111) попадает в язык, порождаемый рассматриваемой грамматикой (туда еще много строк попадает: он бесконечный).

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

Грамматика называется бесконтекстной (контекстно-свободной), если все ее правила имеют вид A → α (A ∈ N) (т.е. у каждого правила слева — ровно один символ).

Грамматика называется праволинейной, если каждое ее правило имеет вид A → α, A → αB (где α ∈ Σ^{∗}; A, B ∈ N). (Замечание: не забудем, что ϵ ∈ Σ^{∗}.)

Две грамматики называются эквивалентными, если они порождают одинаковые языки.

Лемма 9.1. Для любой праволинейной грамматики G_{1}, такой что ϵ ∉ L(G_{1}), существует грамматика G_{2}, эквивалентная G_{1}, в которой имеются только правила вида A → a и A → aB (где a ∈ Σ; A, B ∈ N).

Доказательство. Введем обозначение →^{∗} для транзитивно-рефлексивного замыкания отношения →. Пусть S(A) = {B ≠ A | B →^{∗} A}; S(ϵ) = {A | A →^{∗} ϵ}.

Будем заменять правила G_{1}:

• для каждого правила A → γ, где γ ∉ N, и для каждого B ∈ S(A), добавим правило B → γ;

• для каждого правила A → γB, где γ ≠ ϵ, и для каждого B ∈ S(ϵ), добавим правило A → γ;

• выкинем все правила вида A → B, A → ϵ (где A, B ∈ N).

Далее, если осталось правило A → abγ (где a, b ∈ Σ), заменим это правило на два правила: A → aZ, Z → bγ, введя новый нетерминал Z. Так, постепенно укорачивая правила, мы заменим все правила на правила вида, требуемого в условии леммы.

Легко убедиться в том, что полученная грамматика эквивалентна исходной.

9.3 Конечные автоматы

Недетерминированный конечный автомат — упорядоченная пятерка (Q, Σ, q_{S}, F, δ), где

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

• Σ — алфавит,

• q_{S} ∈ Q — стартовое состояние,

• F ⊆ Q — множество конечных состояний,

• δ : Q × (Σ ∪ {ϵ}) → 2^{Q} — функция перехода.

Обозначение: будем писать q_{1} →^{a} q_{2}, если q_{2} ∈ δ(q_{1}, a) (здесь a ∈ Σ ∪ {ϵ}).

Недетерминированному конечному автомату дают строку в алфавите Σ; он, по очереди считывая ее символы, переходит из своего текущего состояния q (начинает он с q = q_{S}) в одно из состояний из множества δ(q, a) (считав символ a ∈ Σ) или одно из состояний из множества δ(q, ϵ) (не считав ничего — такой переход называется ϵ-переходом).

Если таким образом он \underline{может} ^{1} попасть в одно из состояний из F (полностью считав данную ему строку и, быть может, сделав несколько ϵ-переходов), то говорят, что он принимает данную строку. Множество всех строк в алфавите Σ, принимаемых данным автоматом A, называется языком, принимаемым этим автоматом, и обозначается L(A).

(Продолжение секции 9.3 следует…)

1На каждом шаге у него может быть несколько возможностей; нас интересует “наилучший вариант”.