- •Дискретная математика
- •Введение
- •1. Введение в теорию множеств
- •1.1. Множества
- •Основные понятия
- •Операции над множествами
- •Свойства операций объединения и пересечения
- •1.2. Отношения
- •1.2.1. Бинарные отношения. Основные определения
- •1.2.2. Свойства бинарных отношений
- •2. Теория графов
- •2.1. Основные понятия
- •2.2. Способы задания графов
- •2.4. Сети и их свойства1
- •3. Введение в математическую логику
- •3.1. Логика высказываний
- •3.1.1. Высказывания
- •3.1.1.1. Понятие высказывания
- •2.1.1.2. Логические связки
- •1.1.3. Условные высказывания
- •1.1.4. Эквивалентные высказывания
- •3.1.2. Аксиоматические системы
- •3.1.2.1. Умозаключения
- •3.1.3. Полнота в логике высказываний
- •3.1.3.1. Эквивалентные замены логических связок
- •3.2. Логика предикатов
- •3.2.1. Определение предиката
- •3.2.2. Кванторы. Их свойства и применение
- •3.2.2.1. Квантор всеобщности и квантор существования
- •4. Прикладная теория алгоритмов
- •4.1. Алгоритм: определение и основные свойства
- •4.2. Реализация управляющих алгоритмов
- •4.3. Формализация понятия алгоритма
- •4.4. Машина Тьюринга
- •4.5. Свойства машины Тьюринга
- •4.6. Реализация машины Тьюринга
- •4.7. Формальные системы и алгоритмы.
- •5. Комбинаторный анализ
- •5.1. Основное правило комбинаторики
- •5.2. Правило суммы
- •5.3. Правило прямого произведения
- •5.4. Перестановки
- •5.5. Число различных k-элементарных подмножеств n-элементарного множества
- •5.6. Число подмножеств данного множества
- •5.7. Размещение элементов множества
- •5.7. Размещения с повторениями
- •5.8. Размещения без повторений
- •5.9. Комбинации элементов с повторениями
- •6. Языки и грамматики
- •6.1. Основные определения
- •6.2. Формальные грамматики
- •6.3. Грамматики с ограничениями на правила
- •6.4. Способы записи синтаксиса языка
- •Метаязык Хомского
- •Метаязык Хомского-Щутценберже
- •Бэкуса-Наура формы (бнф)
- •Список рекомендуемой литературы
6. Языки и грамматики
6.1. Основные определения
Описание языков программирования во многом опирается на теорию формальных языков. Эта теория является фундаментом для организации синтаксического анализа и перевода.
Существует два основных способа определения языков:
механизм порождения или генератор;
механизм распознавания или распознаватель.
Порождающая грамматика состоит из четырех компонент: Г = (V, W, J, R), где V и W - непересекающиеся конечные множества, называющиеся основным и вспомогательным алфавитами (или словарями). Элементы этих множеств называются соответственно основными (или терминальными) и вспомогательными (или нетерминальными) символами; J - выделенный вспомогательный символ, называемый начальным символом; R - конечный набор правил вывода, имеющих вид , где и - цепочки, состоящие из основных и вспомогательных символов.
В грамматиках составляющих на каждом шаге вывода заменяется только один символ, поэтому в них с каждым выводом ассоциируется так называемое дерево вывода. Корень дерева отвечает начальному символу. Каждому символу цепочки, на которую заменяется начальный символ на первом шаге вывода, ставится в соответствие узел дерева, и к нему проводится дуга из корня. Для тех из полученных узлов, которые помечены вспомогательными символами, делается аналогичное построение и т.д. Дерево вывода, рассматриваемое как дерево составляющих предложения, задает на нем систему составляющих. Это делает грамматики составляющих хорошим инструментом для описания естественных и искусственных языков.
Они тесно связаны. Первый обычно используется для описания языков, а второй для их реализации. Оба способа позволяют описать языки конечным образом, несмотря на бесконечное число порождаемых ими цепочек.
Неформально язык L - это множество цепочек конечной длины в алфавите T. Механизм порождения позволяет описать языки с помощью системы правил, называемой грамматикой. Цепочки (предложения) языка строятся в соответствии с этими правилами. Достоинство определения языка с помощью грамматик в том, что операции, производимые в ходе синтаксического анализа и перевода, можно делать проще, если воспользоваться структурой, предписываемой цепочкам с помощью этих грамматик.
Механизм распознавания использует алгоритм, который для произвольной входной цепочки остановится и ответит "да" после конечного числа шагов, если эта цепочка принадлежит языку. Если цепочка не принадлежит языку, алгоритм ответит "нет". Распознаватели используются непосредственно при построении синтаксических анализаторов и являются как бы их формальной моделью. Распознаватели строятся на основе теорий конечных автоматов и автоматов с магазинной памятью.
6.2. Формальные грамматики
Теория формальных грамматик - раздел дискретной математики, изучающий способы описания закономерностей, характеризующих всю совокупность правильных текстов того или иного языка.
Формальные грамматики - это абстрактные системы, позволяющие с помощью единообразных процедур получать правильные тексты данного языка вместе с описанием их структуры. Теория формальных грамматик занимает центральное место в математической лингвистике, так как именно она позволяет моделировать наиболее существенный аспект функционирования языка - переработку смыслов в тексты и обратно. Вместе с тем она выделяется среди других разделов математической лингвистики большей сложностью математического аппарата (сходного с аппаратом теории алгоритмов и общей теории автоматов) и возникающих в ней математических задач. Формальные грамматики наиболее разработанных типов представляют собой системы (устройства), которые позволяют порождать или распознавать множества конечных последовательностей (цепочек), интерпретируемые обычно как множества правильных предложений, а также сопоставлять входящим в эти множества цепочкам описания их синтаксической структуры в терминах систем составляющих или деревьев подчинения.
Грамматикой называется четверка G = (N, T, P, S), где N - конечное множество нетерминальных символов (нетерминалов), T - множество терминалов (не пересекающихся с N), S - символ из N, называемый начальным, Р - конечное подмножество множества:
(N T)* N (N T)* x (N T)*,
называемое множеством правил. Множество правил Р описывает процесс порождения цепочек языка. Элемент pi = (, ) множества Р называется правилом (продукцией) и записывается в виде . Здесь и - цепочки, состоящие из терминалов и нетерминалов. Данная запись может читаться одним из следующих способов:
цепочка порождает цепочку ;
из цепочки выводится цепочка.
Таким образом, правило P имеет две части: левую, определяемую, и правую, подставляемую. То есть правило pi - это двойка (p i1, pi2), где p i1 = (N T)* N (N T)* - цепочка, содержащая хотя бы один нетерминал, pi2 = (N T)* - произвольная, возможно пустая цепочка ( - цепочка).
Если цепочка содержит pi1, то, в соответствии с правилом pi, можно образовать новую цепочку заменив одно вхождение pi1 на pi2. Говорят также, что цепочка выводится из в данной грамматике.
Для описания абстрактных языков в определениях и примерах будем пользоваться следующими обозначениями:
терминалы обозначим буквами a, b, c, d или цифрами 0, 1, ..., 9;
нетерминалы будем обозначать буквами A, B, C, D, S (причем нетерминал S - начальный символ грамматики);
буквы U, V, ..., Z используем для обозначения отдельных терминалов или нетерминалов;
через , , ... обозначим цепочки терминалов и нетерминалов;
u, v, w, x, y, z - цепочки терминалов;
для обозначения пустой цепочки (не содержащей ни одного символа) будем использовать знак ;
знак “” будет отделять левую часть правила от правой и читаться как “порождает” или “есть по определению”. Например, Acd, читается как “A порождает cd”.
Эти обозначения определяют некоторый язык, предназначенный для описания правил построения цепочек, а значит, для описания других языков. Язык, предназначенный для описания другого языка, называется метаязыком.
Пример грамматики G1:
G1 = ({A, S}, {0, 1}, P, S),
где P:
S 0A1;
0A 00A1;
A .
Выводимая цепочка грамматики G, не содержащая нетерминалов, называется терминальной цепочкой, порождаемой грамматикой G.
Язык L(G), порождаемый грамматикой G, - это множество терминальных цепочек, порождаемых грамматикой G.
Введем отношение G непосредственного вывода на множестве (N T)*, которое будем записывать следующим образом:
G.
Данная запись читается: непосредственно выводима из для грамматики G = (N, T, P, S) и означает: если - цепочка из множества (N T)* и - правило из Р то G.
Через G+ обозначим транзитивное замыкание (нетривиальный вывод за один и более шагов). Тогда G+ читается как: выводима из нетривиальным образом.
Через G*- обозначим рефлексивное и транзитивное замыкание (вывод за ноль и более шагов). Тогда G* означает: выводима из .
Пусть k k - я степень отношения То есть, если k, то существует последовательность 0123 ... k из к+1 цепочек
=0, 1, ... i -1 i, 1 ≤ i ≤ k и k = .
Пример выводов для грамматики G1:
S 0A1 00A11 0011;
S 1 0A1; S 2 00A11; S 3 0011;
S + 0A1; S + 00A11; S + 0011;
S * S; S * 0A1; S * 00A11; S * 0011;
где 0011 L(G1).