Опубликован: 06.08.2007 | Доступ: свободный | Студентов: 1163 / 400 | Оценка: 4.45 / 4.29 | Длительность: 18:50:00
Специальности: Программист
Лекция 3:

Языки и их представление

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Рис. 2.1.

Теперь можно дать процедуру перечисления цепочек L. Нумеруем упорядоченные пары целых положительных чисел - (1,1), (2,1), (1,2), (3,1), (2,2), ... . При нумерации пары (i, j) генерируем i -ю цепочку из V* и применяем к цепочке первые j шагов процедуры P. Как только мы определили, что сгенерированная цепочка принадлежит L, добавляем цепочку к списку элементов L. Если цепочка i принадлежит L, это будет определено P за j шагов для некоторого конечного j. При перечислении (i; j) будет сгенерирована цепочка с номером i. Легко видеть, что эта процедура перечисляет все цепочки L.

Если мы имеем процедуру генерации цепочек языка, то мы всегда можем построить процедуру распознавания предложений языка, но не всегда алгоритм. Для определения того, принадлежит ли x языку L, просто нумеруем предложения L и сравниваем x с каждым предложением. Если сгенерировано x, процедура останавливается, распознав, что x принадлежит L. Конечно, если x не принадлежит L, процедура никогда не закончится.

Язык, предложения которого могут быть сгенерированы процедурой, называется рекурсивно перечислимым. Язык рекурсивно перечислим, если имеется процедура, распознающая предложения языка. Говорят, что язык рекурсивен, если существует алгоритм для распознавания языка. Класс рекурсивных языков является собственным подмножеством класса рекурсивно перечислимых языков. Мало того, существуют языки, не являющиеся даже рекурсивно перечислимыми.

Грамматики

Формальное определение грамматики

Для нас наибольший интерес представляет одна из систем генерации языков - грамматики. Понятие грамматики изначально было формализовано лингвистами при изучении естественных языков. Предполагалось, что это может помочь при их автоматической трансляции. Однако, наилучшие результаты в этом направлении достигнуты при описании не естественных языков, а языков программирования. Примером может служить способ описания синтаксиса языков программирования при помощи БНФ - формы Бэкуса-Наура.

Определение. Грамматика - это четверка G = (N,T,P,S), где

(1) N - алфавит нетерминальных символов ;

(2) T - алфавит терминальных символов, N \cap T = {\O}

(3) P - конечное множество правил вида \alpha \rightarrow \beta, где \alpha \in (N \cup T)^* N (N \cup T)^*, \beta \in (N \cup T)^*

(4) S \in N - начальный знак (или аксиома) грамматики.

Мы будем использовать большие латинские буквы для обозначения нетерминальных символов, малые латинские буквы из начала алфавита для обозначения терминальных символов, малые латинские буквы из конца алфавита для обозначения цепочек из T^* и, наконец, малые греческие буквы для обозначения цепочек из (N \cup T)^*.

Будем использовать также сокращенную запись A \rightarrow \alpha_1|\alpha_2|\ldots|\alpha_n для обозначения группы правил A\rightarrow\alpha_1,A\rightarrow\alpha_2,\ldots,A\rightarrow\alpha_n.

Определим на множестве (N \cup T)^* бинарное отношение выводимости \Rightarrow следующим образом: если \delta \rightarrow \gamma \in P, то \alpha \delta \beta \Rightarrow \alpha \gamma \beta для всех \alpha, \beta \in (N \cup T)^*. Если \alpha_1 \Rightarrow \alpha_2, то говорят, что цепочка \alpha_2 непосредственно выводима из \alpha_1.

Мы будем использовать также рефлексивно-транзитивное и транзитивное замыкания отношения \Rightarrow, а также его степень k \geq 0 (обозначаемые соответственно \Rightarrow^*, \Rightarrow^+ и \Rightarrow^k ). Если \alpha_1\Rightarrow^*\alpha_2(\alpha_1\Rightarrow^+\alpha_2, \alpha_1\Rightarrow^k \alpha_2), то говорят, что цепочка \alpha_2 выводима (нетривиально выводима, выводима за k шагов) из \alpha_1.

Если \alpha\Rightarrow^k \beta(k \geq 0), то существует последовательность шагов

\gamma_0 \Rightarrow \gamma_1 \Rightarrow \gamma_2 \Rightarrow \ldots \Rightarrow \gamma_{k-1} \Rightarrow \gamma_k

где \alpha \; = \; \gamma_0 и \beta\; = \;\gamma_k. Последовательность цепочек \gamma_0, \gamma_1, \gamma_2, \ldots, \gamma_k в этом случае называют выводом \beta из \alpha

Сентенциальной формой грамматики G называется цепочка, выводимая из ее начального символа.

Языком, порождаемым грамматикой G (обозначается L(G) ), называется множество всех ее терминальных сентенциальных форм, то есть

L(G)\;=\; \{\omega\mid\omega\in T^*, S\Rightarrow^+\omega\}

Грамматики G1 и G2 называются эквивалентными, если они порождают один и тот же язык, то есть L(G_1) = L(G_2)

Пример 2.5. Грамматика G = ({S, B, C}, {a, b, c}, P, S), где P   =  \{S  \rightarrow  aSBC, \; S  \rightarrow  aBC,\; CB \rightarrow BC, \; aB \rightarrow ab,\; bB \rightarrow bb,\; bC \rightarrow bc, \; cC \rightarrow cc\}, порождает язык L(G) = \{a^nb^nc^n\mid n>0\}

Действительно, применяем n - 1 раз правило 1 и получаем a^{n-1}S(BC)^{n-1}, затем один раз правило 2 и получаем a^n(BC)^n, затем n(n - 1)/2 раз правило 3 и получаем a^nB^nC^n.

Затем используем правило 4 и получаем anbBn-1Cn. Затем применяем n - 1 раз правило 5 и получаем anbnCn. Затем применяем правило 6 и n - 1 раз правило 7 и получаем anbncn. Можно показать, что язык L(G) состоит из цепочек только такого вида.

Пример 2.6. Рассмотрим грамматику G \;= \; (\{S\},\{0,1\},\{S \rightarrow 0S1,\;S\rightarrow01\},S). Легко видеть, что цепочка 000111 \in L(G), так как существует вывод

S \Rightarrow 0S1 \Rightarrow 00S11 \Rightarrow 000111

Нетрудно показать, что грамматика порождает язык L(G)\; = \; \{0^n1^n \mid n>0\}.

Пример 2.7. Рассмотрим грамматику G \;= \; (\{S,A\},\{0,1\},\{S\rightarrow\ 0S, \; S \rightarrow 0A, \; A \rightarrow 1A, \; A \rightarrow 1\}, \; S). Нетрудно показать, что грамматика порождает язык L(G)=\{0^n1^m\mid n, \;m>0\}

Типы грамматик и их свойства

Рассмотрим классификацию грамматик (предложенную Н.Хомским), основанную на виде их правил.

Определение. Пусть дана грамматика G = (N, T, P, S). Тогда

(1) если правила грамматики не удовлетворяют никаким ограничениям, то ее называют грамматикой типа 0, или грамматикой без ограничений.

(2) если

  1. каждое правило грамматики, кроме S \rightarrow e, имеет вид \alpha \rightarrow \beta, где |\alpha|\leq |\beta|, и
  2. в том случае, когда S \; \rightarrow \; e \; \in \; P, символ S не встречается в правых частях правил, то грамматику называют грамматикой типа 1, или неукорачивающей или контекстно-зависимой (КЗ- грамматикой) или контекстно - чувствительной (КЧ- грамматикой).

(3) если каждое правило грамматики имеет вид A \rightarrow \beta, где A \in N, \beta \in (N \cup T)^*, то ее называют грамматикой типа 2, или контекстно-свободной (КС-грамматикой).

(4) если каждое правило грамматики имеет вид либо A \rightarrow xB, либо A \rightarrow x, где A, B \in N, x \in T^* то ее называют грамматикой типа 3, или праволинейной.

Легко видеть, что грамматика в примере 2.5 - неукорачивающая, в примере 2.6 - контекстно-свободная, в примере 2.7 - праволинейная.

Язык, порождаемый грамматикой типа i, называют языком типа i. Язык типа 0 называют также языком без ограничений, язык типа 1 - контекстно-зависимым (КЗ), язык типа 2 - контекстно-свободным (КС), язык типа 3 - праволинейным.

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
Виталий Черкасов
Виталий Черкасов
Украина, Краматорск
Урюпа Гречанов
Урюпа Гречанов
Россия