Классификация грамматик и языков
Напомним, что единственное ограничение, накладываемое на правило вывода любой грамматики, состоит в том, что в левую часть правила должен входить хотя бы один нетерминал. В зависимости от дополнительных ограничений, накладываемых на правила вывода грамматики, различают следующие основные классы грамматик.
1. Грамматики типа 0, или грамматики общего вида. Здесь на правила вывода не накладывается никаких дополнительных ограничений.
2. Неукорачивающие грамматики. Каждое правило такой грамматики имеет вид , где . Таким образом, длина правой части правила не меньше длины левой. Грамматика из примера 7.5 есть неукорачивающая грамматика, но грамматика из того же примера таковой не является.
3. Контекстно-зависимые грамматики (КЗ-грамматики). Грамматику называют контекстно-зависимой грамматикой (КЗ-грамматикой), если любое ее правило вывода имеет вид , где — нетерминал, — некоторая цепочка, . Каждое такое правило, называемое КЗ-правилом, позволяет заменить нетерминал в "контексте", образуемом цепочками и в объединенном алфавите, непустой цепочкой (см. замечание 7.1). Иногда цепочку называют левым контекстом, а цепочку — правым контекстом данного КЗ-правила. Из определения видно, что каждая КЗ-грамматика является неукорачивающей.
Грамматика из примера 7.5 не является КЗ-грамматикой, так как правило не является КЗ-правилом. Остальные же правила вывода этой грамматики — КЗ-правила. Грамматика из примера 7.5 не является КЗ-грамматикой хотя бы из-за наличия правила вывода с пустой правой частью. КЗ-грамматикой является грамматика из примера 7.3.
Если в КЗ-правиле снять требование непустоты цепочки , то получим грамматику, которую называют обобщенной КЗ-грамматикой (или, коротко, ОКЗ-грамматикой).
4. Контекстно-свободные грамматики (КС-грамматики). Каждое правило такой грамматики имеет вид , т.е. левая часть каждого правила вывода есть нетерминал, а правая — произвольная (может быть и пустая) цепочка в объединенном алфавите.
С практической точки зрения это наиболее важный класс грамматик, поскольку именно в терминах КС-грамматик описывается синтаксис языков программирования, и этим грамматикам будет посвящена отдельная глава. Грамматики из примера 7.5 являются КС-грамматиками.
5. Линейные грамматики. Каждое правило такой грамматики имеет вид или , т.е. в правой части правила может содержаться не более одного вхождения нетерминала. Если во всех правилах вида имеет место , то грамматика называется праволинейной, а если — леволинейной.
Пример 7.6. Линейной является грамматика , где множество правил вывода есть
Можно доказать, что эта грамматика порождает все палиндромы в алфавите , т.е. все цепочки, читаемые слева направо так же, как и справа налево. Например, для цепочка — палиндром. Вывод его в грамматике (для данного терминального алфавита) будет иметь вид
Замечание 7.2. Формальное определение палиндрома таково. Назовем инверсией непустой цепочки
 цепочку  .
Для пустой цепочки по определению считаем . Палиндром в алфавите — это любая цепочка , для которой .
6. Регулярные грамматики. У такой грамматики каждое правило имеет вид или , где есть либо терминал, либо пустая цепочка. Регулярные грамматики — частный случай праволинейных грамматик.
Эти грамматики подробно будут рассмотрены в следующей лекции.
Утверждения о классах грамматик
Приведем без доказательства некоторые утверждения о классах грамматик.
Теорема 7.2.1. Для любой грамматики типа 0 может быть построена эквивалентная ей ОКЗ-грамматика. 2. Для любой неукорачивающей грамматики может быть построена эквивалентная ей КЗ-грамматика. 3. Для любой леволинейной грамматики может быть построена эквивалентная ей праволинейная грамматика, и, наоборот, для любой праволинейной грамматики может быть построена эквивалентная ей леволинейная грамматика. 4. Для любой праволинейной грамматики может быть построена эквивалентная ей регулярная грамматика.
Отметим, что доказательства первых двух пунктов теоремы 7.2 весьма нетривиальны.
Классификация языков, порождаемых грамматиками, тесно связана с классификацией самих грамматик, хотя и не тождественна ей. Язык относят к классу , если существуем грамматика класса , порождающая данный язык. Таким образом определяются языки типа 0, неукорачивающие языки, контекстно-зависимые языки (КЗ-языки), обобщенные контекстно-зависимые языки (ОКЗ-языки), контекстно-свободные языки (КС-языки), линейные языки, право- и леволинейные языки, регулярные языки.
Так как всякая ОКЗ-грамматика является грамматикой типа 0, то в соответствии с пункт 1 теоремы 7.2 классы языков типа О и ОКЗ-языков совпадают. В силу пункт 2 того же утверждения, а также ввиду того, что любая КЗ-грамматика является неукорачивающей грамматикой, совпадают классы неукорачивающих и КЗ-языков. В силу пункты 3 и 4 теоремы 7.2 совпадают классы право-, леволинейных и регулярных языков.
Но можно доказать следующие факты.
Теорема 7.3. 1. Существует ОКЗ-язык, не являющийся КЗ-языком. 2. Существует КЗ-язык, не являющийся КС-языком. 3. Существует КС-язык, не являющийся линейным языком. 4. Существует линейный язык, не являющийся регулярным языком.
Некоторые из утверждений теоремы 7.3 мы докажем позже. Сейчас заметим только, что языки, порождаемые грамматиками и из примера 7.5, не являются КС-языками, хотя для языка, порождаемого грамматикой , можно построить порождающую его КЗ-грамматику. Язык правильных скобочных структур, порождаемый грамматикой из примера 7.5, не является линейным языком, а язык палиндромов из примера 7.6 не есть регулярный язык.
Итак, можно утверждать, что имеют место следующие строгие включения классов языков:
РЕГ  ЛИН  КС  ОКЗ = ТИП 0; КЗ  ОКЗ,
где РЕГ, ЛИН, КС, КЗ, ОКЗ, ТИП 0 — классы регулярных, линейных, КС-языков, КЗ-языков, ОКЗ-языков и языков типа 0 соответственно.
Замечание 7.3. В силу п. 1 теоремы 7.3 требование, состоящее в том, чтобы в КЗ-правиле цепочка была непустой, является принципиальным. В одной из следующих лекций мы докажем, что с определенными оговорками класс КС-языков можно включить в класс КЗ-языков, поскольку любую КС-грамматику можно преобразовать к эквивалентной КС-грамматике, не содержащей правила вывода вида .
Принципиальное различие между классификацией грамматик и языков состоит в следующем. Чтобы определить класс грамматики, достаточно посмотреть на множество ее правил вывода. Чтобы доказать "положительное" утверждение о том, что заданный язык есть язык такого-то класса, достаточно придумать любую грамматику из соответствующего класса, которая его порождает. Но чтобы доказать "отрицательное" утверждение о классе языка, т.е. доказать, что язык не принадлежит такому-то классу языков, нужно доказать, что не существует грамматики соответствующего класса, которая его порождает. Эта задача гораздо труднее. Некоторые методы построения подобных доказательств будут рассмотрены далее.
Если заметили ошибку, опечатку или есть предложения, напишите в комментариях.
|