- •Предисловие
- •Введение
- •Глава 1. Множества
- •§ 1. Множества н их спецификация
- •§ 2. Простейшие операции над множествами
- •X ∉ ø при любом х.
- •§ 3. Диаграммы Венна
- •§ 4. Подмножества и доказательства
- •§ 5. Произведения множеств
- •Глава 2. Отношения
- •§ 1. Основные понятия
- •§ 2. Графические представления
- •§ 3. Свойства отношений
- •§ 4. Разбиения и отношения эквивалентности
- •§ 5. Отношения порядка
- •§ 6. Отношения на базах данных и структурах данных
- •§ 7. Составные отношения
- •§ 8. Замыкание отношений
- •Глава 3. Функции
- •§ 1. Функции и отображения
- •§ 2. Обратные функции и отображения
- •§ 3. Мощность множеств и счетность
- •§ 4. Некоторые специальные классы функций
- •§ 5. Аналитические свойства вещественных функций
- •§ 6. Операции
- •Глава 4. Основные понятия арифметики
- •§ 1. «Малая» конечная арифметика
- •§ 2. «Большая» конечная арифметика
- •§ 3. Двоичная арифметика
- •§ 4. Логическая арифметика
- •Глава 5. Алгебраические структуры
- •§ 1. Алгебраические структуры и подструктуры
- •§ 2. Простейшие операционные структуры
- •§ 3. Кольца и поля
- •§ 4. Линейная алгебра
- •4.1. Векторные пространства о линейные преобразования.
- •§ 5. Решетка и булевы алгебры
- •§ 6. Замкнутые полукольца
- •Глава 6. Матрицы
- •§ 1. Матрицы и бинарные отношения на конечных множествах
- •§ 2. Матрицы над другими алгебраическими структурами
- •§ 3. Матрицы и векторные пространства
- •Глава 7. Теория графов
- •§ 1. Вводные понятия
- •§ 2. Маршруты, циклы и связанность.
- •§ 3. Планарные графы
- •3.1. Теоремы Эйлера и Куратовского.
- •3.2. Раскраска карт и графов.
- •§ 4. Структуры данных для представления графа
- •§ 5. Обход графа
- •5.2. Обход графа по глубине.
- •5.4. Остовные леса обходов по глубине и ширине.
- •§ 6. Ориентированные графы
- •6.2. Маршруты и связность в орграфах.
- •Глава 8. Языки и грамматики
- •§ 1. Основные понятия
- •§ 2. Грамматики с фразовой структурой
- •2.1. Основные определения.
- •§ 3. Контекстно-свободные языки
- •§ 4. Понятия грамматического разбора и грамматических модификаций
- •§ 5. Грамматики операторного предшествования
- •Глава 9. Конечные автоматы
- •§ 1. Общие понятия
- •§ 2. Конечные автоматы
- •§ 3. Регулярная алгебра
- •Глава 10.Компьютерная геометрия
- •§ 1. Системы координат для подмножеств r3
- •§ 2. Преобразования
- •§ 3. Кривые и поверхности
§ 3. Контекстно-свободные языки
3.1. Основные определения. Контекстно-свободные грамматики (КСГ) и контекстно-свободные языки (КСЯ) важны для практических вычислений, так как, хотя большинство языков является некоторым расширением контекстно зависимых языков, их легче изучать как контекстно свободные языки, а затем по другим (семантическим) критериям отбросить некоторые из предложений. В этих случаях на КЗГ можно ссылаться как на грамматики, специфицированные связанным синтаксисом, а на КСГ — как специфицированные несвязанным синтаксисом. КСГ также дают возможность прояснить вопросы, содержащие (синтаксическую) неоднозначность.
Последовательность вывода
может быть изображена как упорядоченное
дерево (см. ниже). Корень дерева обозначен
через
,
и если
и
,
то выходы помечены по порядку
.
Предположим, что
и что
достигается в результате применения
продукции
,
где
.
В дереве это представляется пометкой
вершины С и m ее
преемников (точек, из которых С достигается
за один шаг)
.
Поэтому метки могут быть одинаковыми.
П р и м е р 3.1. Рассмотрим грамматику с продукциями
Обычно в случае контекстно-свободных
грамматик мы будем опускать другие
элементы грамматики; первое правило
специфицирует источник, а нетерминалами
являются только символы в левой
стороне продукций. В этом случае вывод
предложения
может быть изображен так, как это
сделано на рис. 8.4. //
Р
ис.
8.4
С конструктивной точки зрения это изображение называется деревом вывода. (Когда это дерево используют для того, чтобы проанализировать, могут или не могут строки содержаться в L(G), оно называется деревом грамматического разбора.) Легко видеть, что предложение является неоднозначным, если оно имеет два неизоморфных дерева вывода, и что для контекстно-свободных грамматик канонический грамматический разбор изоморфен любой другой схеме обхода дерева.
Мы уже установили тот очевидный факт, что КСГ являются более ограниченными, чем КЗГ, но тем не менее они все же обладают весьма широкими изобразительными возможностями.
П р и м е р 3.2. Используя контекстно-свободные правила, можно породить:
все последовательности из символов А:
=
;
все непустые списки из символов А, отделенные друг от друга символами В:
те же списки, что и в примере 3.2,2, однако допускается возможность пустого списка:
все строки, начинающиеся с последовательности символов А или В и оканчивающиеся символами С или D соответственно:
например,
В этих примерах А, В, С, D и X могут быть определены дополнительно. //
3.2. Характеристические свойства. Особенностью рассмотренных выше примеров, о которых вскоре мы сможем сказать несколько больше, является свойство рекурсии (один шаг рекурсии при каждом ). Трудности возникают тогда, когда требуется наложить некоторые ограничения на глубину рекурсии, не придумывая новых правил для каждой допустимой глубины рекурсии. Поскольку N и Р конечны, то очевидно, что если не разрешать никаких рекурсий, то также будет конечен, и этот случай не очень интересен.
Прежде чем идти дальше, введем необходимую терминологию. Говорят, что грамматика :
а) леворекурсивная, если в ней имеются выводы вида
,
где
,
;
б) праворекурсивная, если в ней имеются выводы вида
,
где
и
такие же, как и выше;
в) самовключающая, если она имеет выводы вида
.
Говорят, что КСГ рекурсивна, если имеется один из случаев а) — в). Из сделанных выше замечаний ясно, что желательно бы иметь в грамматике «петли», однако не произвольного типа. К этому вопросу мы вернемся в § 4.
Сформулируем результат о возможностях КСГ. В теории КСЯ это, вероятно, наиболее известный результат. Его доказательство использует рекурсивные свойства КСГ и структуру деревьев. Этот результат известен как лемма о разрастании для КСЯ или же как uvwxy теорема.
Т
е о р е м а. Если L —
контекстно-свободный язык, то
существует
такое,
что если
,
то z может быть записано в виде
,
где
,
и для любого
выполняется
условие
u
.
Д
о к а з а т е л ь с т в о. Поскольку L
—контекстно-свободный язык, то он может
быть порожден некоторой грамматикой
и не имеет продукций, за исключением,
возможно,
,
уменьшающих длину сентенциальных форм,
(
,
то S также исключают из
правых частей продукций для того, чтобы
не уменьшалась длина сентенциальных
форм. В § 4 показано, что такая грамматика
может быть найдена.)
Если
не рекурсивна, то, поскольку
и
конечны,
также конечен, и, следовательно, теорема
справедлива, если взять n
большим, чем длина самой длинной строки
в
.
С другой стороны, если
рекурсивна, то существует дерево вывода,
в котором некоторый нетерминал, например
,
встречается дважды на пути от корня к
листу. Эта ситуация изображена на рис.
8.5. (Сюда включены лишь необходимые нам
свойства.)
Более
того, поскольку
рекурсивна, то мы можем добиться
выполнения соотношения |
,
где
больше длины самого длинного предложения,
полученного путем нерекурсивного
вывода(
km,
где k — длина самой длинной
продукции
,
а m
Таким
образом, если
и
то z должно иметь требуемый
вид для некоторых пяти строк.
Тогда
)
и
Следовательно,
для любого
.
Отсюда, так
,
имеем
для любого и, таким образом,
для любого . //
Этот результат может быть использован для проверки того, что некоторые конструкции в языках программирования не могут быть определены с помощью КСГ. Дадим более реальный пример, который не требует знания конкретного языка.
П
р и м е р 3.3. Грамматика из примера 2.4
порождает язык
Сейчас мы можем показать, что
Рис.8.5
этот язык является контекстно-зависимым
и не может быть порожден КСГ. Из теоремы
следует, что существует некоторое
достаточно большое n, при
котором
может быть записано в виде
(требуется очевидная замена символов)
для некоторых строк
.
Поскольку х и z в строке
разделены, то очевидно, что строки а и
b не могут содержать все
символы х, у и z; аналогично
и для всех других пар из {а, b,
с, d, f}. В
частности, по крайней мере один из
символов
и z не может быть одновременно
в строках
и
;
таким образом, строка
,
которая по теореме содержится в L,
содержит не все символы х, у и z
(они также могут быть расположены в
другом порядке, однако в дальнейшем мы
не будем рассматривать эту возможность).
Следовательно, мы не получаем тот же
самый язык, из чего и следует требуемый
результат. //
Подобные противоречия могут быть получены во многих ситуациях, когда информация, содержащаяся в более ранней части строки, влияет на требуемую структуру последующей подстроки. Следующий пример является типичным в этом отношении.
П
р и м е р 3.4. Язык
не является контекстно-свободным:
.
Предположим, что является КСЯ. Так как существует бесконечное множество простых чисел, то имеется простое число q такое, что
для всех
(это следует из приведенной выше леммы). Таким образом, существуют а, b, с, d, е такие, что
при b+ d > 0 и
для всех
,
так что
—простое число и
,
a
—простое
число для всех i
N. В частности, qi
— простое число при i = a
+ b + c + d
+ e + 1, и в этом случае
Однако
и
;
следовательно,
не является простым числом для всех
,
и мы получаем противоречие. Поэтому L
=
не является КСЯ.
Этот пример также демонстрирует практическую важность связанного и несвязанного синтаксисов. Можно придумать жесткий фиксированный синтаксис, который включает правильную семантику. Однако, где это возможно, часто гораздо удобнее и эффективнее разрешить использование более широкого языка, порожденного (обычно контекстно-свободной) грамматикой, а затем, если необходимо, сузить множество путем дальнейшей семантической проверки.
В примере 3.4 мы могли бы использовать правило
,
чтобы породить все строки
,
и после этого проверить, что «q
— простое число», с помощью подходящего
арифметического алгоритма.
Короче говоря, контекстно-зависимые грамматики являются сложными и не изучены с достаточной полнотой. С другой стороны, контекстно-свободным грамматикам уделяется достаточно много внимания, и они составляют основу почти всех практических компьютерных трансляционных систем.
У п р а ж н е н и е 8.3.
1. Вывести КСГ, которая порождает множество всех строк над {а, b}, имеющих равное количество а и b.
2. Построить грамматики, порождающие следующие языки:
а)
б)
в) {
:
1},
n,
.
3. Используя лемму о разрастании, показать, что язык
не является контекстно-свободным.
4.
Показать, что если
являются КСЯ, то таким же является язык
5. Доказать, что множества
{xnynzm:
,
},
{xmynzn:
,
}
являются КСЯ; показать, что если языки
и
являются контекстно-свободными, то
отсюда не следует, что язык
является контекстно-свободным.
