Базис. Для произвольной цепочки а терминалов и переменных считаем, что а => а.
g
Таким образом, любая цепочка порождает саму себя.
Индукция. Если а => f3 и /3 => у, то а => у. Таким образом, если а может породить
g g g
13 за нуль или несколько шагов, и из /3 еще за один шаг порождается у, то а может породить у. Иными словами, а => /3 означает, что для некоторого п> 1 существует последовательность цепочек yh у2, ..., у„, удовлетворяющая следующим условиям. 1. а=у,. 2- 13=у„.
3. Для i = 1,2, ..., п-1 имеет место отношение у, => yf4.
* •
Если грамматика G подразумевается, то вместо => используется обозначение =>.
Пример 5.5. Вывод о том, что а*(а + 600) принадлежит языку переменной Ј, можно отразить в порождении этой цепочки, начиная с Е. Запишем одно из таких порождений. Ј=> Е* Ј=> /* Ј=> а* Ј=> а * (Ј) =>а*(Е + Е)=>а*(1 + Е)=>а* (а+ Е)=> а*(а + Г)=$а*(а + Ю)=$а*(а + /00) => а * (а + 600) На первом шаге Ј заменяется телом продукции 3 (см. рис. 5.2). На втором шаге применяется продукция 1 для изменения Ј на / и т. д. Заметим, что мы систематически придерживались тактики замены крайней слева переменной в цепочке. На каждом шаге, однако, мы можем произвольно выбирать переменную для замены и использовать любую из продукций для этой переменной. Например, на втором шаге мы могли бы изменить второе Ј на (Ј), используя продукцию 4. В этом случае Ј*Ј=>Ј* (Ј). Мы могли бы также выбрать замену, не приводящую к той же самой цепочке терминалов. Простым примером было бы использование продукции 2 на первом же шаге, в результате чего Е=> Е + Е, но теперь никакая замена переменных Ј не превратит цепочку Е + Ева* (а + 600).
Мы можем использовать отношение => для сокращения порождения. На основании
базиса нам известно, что Ј => Ј Несколько использований индукции дают нам утвер - * * *
ждения Ј=> Ј*Ј, Ј=> I* Е и так далее до заключительного Ј => а* (а + 600).
Две точки зрения — рекурсивный вывод и порождение — являются эквивалентными. Таким образом, можно заключить, что цепочка терминалов w принадлежит языку некоторой переменной А тогда и только тогда, когда А => w. Доказательство этого факта, однако, требует некоторых усилий, и мы отложим его до раздела 5.2. □
5.1.4. Левые и правые порождения
Для ограничения числа выборов в процессе порождения цепочки полезно потребовать, чтобы на каждом шаге мы заменяли крайнюю слева переменную одним из тел ее продукций. Такое порождение называется левым (leftmost), и для его указания используются отношения => и =>. Если используемая грамматика G не очевидна из контекста, то
lm 1т
ее имя G также добавляется внизу.
Аналогично можно потребовать, чтобы на каждом шаге заменялась крайняя справа
переменная на одно из тел. В таком случае порождение называется правым (rightmost), и
*
для его обозначения используются символы => и =>. Имя используемой грамматики
rm гт
также при необходимости записывается внизу.
Пример 5.6. Порождение из примера 5.5 в действительности было левым, и его можно представить следующим образом.
Ј=>Ј*Ј=>1*Е=>а*Е=>
lm lm lm 1т
а * (Ј) => а *(Ј + Ј) => а* (1 + Е) => а * (а + Ј) =>
Im Im Im 1т
а * (а + I) => а * (а + /0) а* (а + /00) => а * (а + Ь00)
Im 1т /т
Обозначения для порождений, заданных КС-грамматиками
Существует немало соглашений, напоминающих о роли тех или иных символов, используемых в КС-грамматиках. Будем использовать следующие соглашения.
Строчные буквы из начала алфавита (а, Ъ и т. д.) являются терминальными символами. Будем предполагать, что цифры и другие символы типа знака + или круглых скобок — также терминалы. Прописные начальные буквы (А, В и т. д.) являются переменными. Строчные буквы из конца алфавита, такие как w или z, обозначают цепочки терминалов. Это соглашение напоминает, что терминалы аналогичны входным символам конечного автомата. Прописные буквы из конца алфавита, вроде X или У, могут обозначать как терминалы, так и переменные. Строчные греческие буквы (а, (5 и т. д.) обозначают цепочки, состоящие из терминалов и/или переменных.Для цепочек, состоящих только из переменных, специального обозначения нет, поскольку это понятие не имеет большого значения. Вместе с тем, цепочка, обозначенная а или другой греческой буквой, возможно, состоит только из переменных.
Можно резюмировать левое порождение в виде Е => а * (а + 300) или записать несколь-
1т
ко его шагов в виде выражений типа Е* Е => а* (Е).
1т
Следующее правое порождение использует те же самые замены для каждой переменной, хотя и в другом порядке.
Ј=> Е* Е => Е*(Е) => Ј * (Ј + Е) =>
rm rm гт гт
Ј*(Ј + /) => Ј*(Ј +10) => Ј * (Ј + /00) Ј * (Ј + 600)
гт гт гт гт
Ј*(/+М)0) => Е*(а + Ь00) => I*(a + b00) => а*(а + 600)
гт гт гт
Данное порождение также позволяет заключить, что Ј => а* (а + 600).
гт
Любое порождение имеет эквивалентные левое и правое порождения. Это означает, что если w — терминальная цепочка, а А — переменная, то А => w тогда и только тогда, когда А => w, а также А => w тогда и только тогда, когда А => w. Эти утверждения дока-
1п! гт
зываются также в разделе 5.2.
5.1.5. Язык, задаваемый грамматикой
Если G = (V, T, P,S)— КС-грамматика, то язык, задаваемый грамматикой G, или язык грамматики G, обозначается L(G) и представляет собой множество терминальных цепочек, порождаемых из стартового символа. Таким образом,
L(G)={we f\S=>w}.
g
Если язык L задается некоторой КС-грамматикой, то он называется контекстно - свободным, или КС-языком. Например, мы утверждали, что грамматика, представленная на рис. 5.1, определяет множество палиндромов в алфавите {0, 1}. Таким образом, множество палиндромов является КС-языком. Можем доказать это утверждение следующим образом.
Теорема 5.7. Язык L(Gpal), где Gpai— грамматика из примера 5.1, является множеством палиндромов над {0, 1}.
Доказательство. Докажем, что цепочка w в {0, 1}* принадлежит L(Gpa,) тогда и только тогда, когда она является палиндромом, т. е. w = wR.
(Достаточность) Пусть w — палиндром. Докажем индукцией по |w|, что w е L(Gpai).
Базис. Если |w| = 0 или |w| = 1, то w представляет собой е, 0 или 1. Поскольку в грам-
♦
матике есть продукции Р —> Ј, Р —> О, Р —> 1, то во всех случаях Р => w.
Индукция. Пусть |w| > 2. Так как w = wR, она должна начинаться и заканчиваться одним и тем же символом, т. е. w = 0x0 или w = 1x1. Кроме того, х является палиндромом, т. е. х = xR. Заметим, что нам необходим факт w > 2, чтобы обеспечить наличие двух различных нулей или единиц на обоих концах w.
*
Если w = 0x0, то по предположению индукции Р => х. Тогда существует порождение
w из Р: Р 0Р0 => 0x0 = w. Если w = 1x1, то рассуждения аналогичны, но с использованием продукции Р —> \Р\ на первом шаге. В обоих случаях заключаем, что we L(Gpai), тем самым завершая доказательство.
*
(Необходимость) Предположим, что we L(Gpai), т. е. Р => w. Докажем, что w— палиндром. Проведем доказательство индукцией по числу шагов в порождении w из Р.
Базис. Если порождение имеет один шаг, то он использует одну из трех продукций, не имеющих Р в теле, т. е. порождение представляет собой Р => Ј, Р => 0 или Р => \. Так как Ј, 0 и 1 — палиндромы, то базис доказан.
Индукция. Предположим, что порождение состоит из п+ 1 шагов, где п> 1, и что утверждение индукции верно для всех порождений из п шагов. Таким образом, если
Р =ф х за п шагов, то х является палиндромом.
Рассмотрим (п + 1)-шаговое порождение, которое должно иметь вид
Р 0Л) =» 0x0 = w
или Р => lPl => lxl = w, поскольку п + 1 шаг— это как минимум два шага, и только использование продукций Р —> Of0 или Р —» 1Р1 делает возможными дополнительные ша-
*
ги порождения. Заметим, что в обоих случаях Р => х за п шагов.
По предположению индукции х является палиндромом, т. е. x=xR. Но тогда и 0x0, и 1x1 — палиндромы. Например, (0x0)R = 0xR0 = 0x0. Делаем вывод, что w— палиндром и завершаем доказательство. □
5.1.6. Выводимые цепочки
Порождения из стартового символа грамматики приводят к цепочкам, имеющим особое значение. Они называются "выводимыми цепочками" ("sentential form"). Итак, если
*
G = (У, Т, Р, S) — КС-грамматика, то любая цепочка а из (FU Т), для которой S ==> а, называется выводимой цепочкой. Если S => а, то а является левовыводимой цепочкой, a
Im
если S => а, то — правовыводимой. Заметим, что язык L(G) образуют выводимые це-
тт
почки из Т*, состоящие исключительно из терминалов.
Пример 5.8. Рассмотрим грамматику выражений (см. рис. 5.2). Например, Е* (1+ Е) является выводимой цепочкой, поскольку существует следующее порождение.
Ј=>Ј*Ј=>Ј*(Ј) Ј*(Ј + Ј) =>Ј*(/ + Ј) Однако это порождение не является ни левым, ни правым, так как на последнем шаге заменяется среднее Ј.
Примером левовыводимой цепочки может служить а * Ј со следующим левым порождением.
Ј=>Ј*Ј=> /*Ј=> а*Ј
hn Im Im
Аналогично, порождение
rm rm rm
показывает, что Ј*(Ј + Ј) является правовыводимой цепочкой. □
Способ доказательства теорем о грамматиках
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |


