1. Алфавит, слова, операции над словами

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ
ФЕДЕРАЦИИ
МОСКОВСКИЙ ИНЖЕНЕРНО-ФИЗИЧЕСКИЙ ИНСТИТУТ
(ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ)
Сергиевский Г.М., Короткова М.А.
Введение в математическую лингвистику
и теорию автоматов.
Конспект лекций
МОСКВА 2004
УДК 519.713(075)+519.76(075)
ББК 22.18я7
С32
Сергиевский Г.М., Короткова М.А. Введение в математическую
лингвистику и теорию автоматов. Конспект лекций. – М., МИФИ,
2004
Учебное пособие предназначено для студентов факультета Кибернетики, изучающих на пятом семестре математическую лингвистику и основы теории автоматов. Пособие представляет собой
конспект лекций по этому курсу. В дальнейшем планируется расширить представленный материал и дополнить его методическими
указаниями, примерами и задачами. Пособие может быть полезно
всем желающим получить начальные знания по изложенным
разделам дискретной математики.
Рецензент В.П. Румянцев
Рекомендовано редсоветом МИФИ
в качестве учебного пособия
© Г.М.Сергиевский, М.А.Короткова, 2004
© Московский инженерно-физический институт
(государственный университет), 2004
2
Содержание
1. Алфавит, слова, операции над словами ..................................................... 4
2. Языки. Операции над языками ................................................................... 5
2.1. Теоретико-множественные операции ...........................................5
2.2.Специфические операции ...............................................................6
3. Абстрактные формальные системы ............................................................ 7
4. Формальные порождающие грамматики ................................................... 8
5. Классификация грамматик ........................................................................ 10
6. А-языки. Конечные лингвистические автоматы ............................. 12
6.1. Диаграмма грамматики ................................................................12
6.2. Порождение и распознавание цепочек .......................................14
6.3. Детерминизация недетерминированных автоматов..................17
6.4. Автоматы с -переходами ...........................................................20
6.5. Минимизация числа состояний автомата...................................25
6.6. Регулярные множества и регулярные выражения .....................31
6.7. Разрешимые проблемы для А-грамматик ..................................37
7. Нотации для задания КС-грамматик. ....................................................... 38
7.1. Математическая нотация .............................................................38
7.2. Бекусова нормальная форма ........................................................38
7.3. Расширенная форма Бекуса – Наура (РБНФ) ............................40
7.4. Синтаксическая диаграмма .........................................................41
8. Структура цепочек. СУ-схемы .................................................................. 42
9. Преобразования КС-грамматик ................................................................ 47
9.1 Устранение непроизводящих правил ..........................................47
9.2. Устранение недостижимых нетерминалов ................................48
9.3. Устранение -правил ...................................................................50
9.4. Устранение цепных правил (правил вида А  В)....................51
10. Разрешимые и неразрешимые свойства КС-грамматик........................ 52
10.1. Разрешимые свойства КС-грамматик .......................................52
10.2. Неразрешимые свойства КС-грамматик ..................................55
11. Синтаксический анализ для КС-языков ................................................. 56
11.1. Типовая задача синтаксического анализа ................................57
11.2. LL(k)-грамматики .......................................................................58
11.3. Восходящий анализ ....................................................................64
12.Элементы теории конечных автоматов ................................................... 68
12.1. Автомат Мили.............................................................................68
12.2. Автоматы Мура ..........................................................................74
12.3. Частичные автоматы ..................................................................78
13. Сети автоматов. Их анализ и синтез ....................................................... 81
13.1. Синхронные сети автоматов......................................................82
13.2. Правильно построенные логические сети................................86
3
Пособие рассматривает основные понятия и теоремы математической лингвистики, а также включает некоторые аспекты теории
автоматов.
1. Алфавит, слова, операции над словами
Пусть V={v1, v2,…,vn}, n1 – некоторый алфавит. Тогда любая
последовательность x1x2…xk, k0, где xi V, 1  i k , слово в
алфавите V; при k=0 –получается пустое слово, обозначим его .
Множество всех слов алфавита V обозначается V*.
Слово X =x1…xk графически совпадает со словом Y=y1…ym, если xiV (1  i k), yjV (1  j m), m=k, и для любого i ,1  i k,
xi=yi. Графическое совпадение слов обозначается X=Y.
Длиной слова Х (обозначается Х) называется число вхождений символов в слово Х. Если X =x1…xk, то Х=k . =0.
Конкатенацией слов X =x1…xk и Y=y1…yl называется слово Z=
=XY= x1…xk y1…yl. Например, конкатенацией слов «поло» и «вина» будет слово «половина».
Свойства конкатенации:
1.  является единицей для конкатенации, т.е. для любого слова Х
верно, что Х=Х=Х.
2. Операция конкатенации является ассоциативной, т.е.
(XY)Z=X(YZ).
3. Операция конкатенации не является коммутативной, XYYX.
Для конкатенации, как и для произведения, конкатенация n
одинаковых слов X обозначается Xn. Считаем, что
X0= для любого слова Х. Множество V* всех слов алфавита V
является полугруппой относительно операции конкатенации.
Полугруппа – множество с заданной на нем ассоциативной бинарной операцией.
Если слово Х=Х1 Х2, то Х1 – начало слова Х, а Х2 – конец слова
Х.
Определим, что слово P входит в слово Q, если существует пара слов R и S, такая, что R – первый элемент пары, S – второй
элемент пары, и Q =R P S.
Легко доказать следующее
Утверждение. Если слово P входит в слово Q, то существует
некоторое слово U, такое, что P – начало U, а U – конец Q.
Следствие. Если слово P входит в слово Q, то P есть начало некоторого конца Q (или конец некоторого начала Q).
4
Если P есть некоторое начало (конец) Q и P  Q, то P – собственное начало (конец) Q.
Конкретные вхождения слова P в слово Q обозначаются
RPS, где R, P,S – слова в алфавите V, V. Тогда R – левое
крыло вхождения, S – правое крыло вхождения, P – основа.
Определим, что вхождение P1 слова P в слово Q предшествует
вхождению P2 слова P в это же слово, если левое крыло
вхождения P1 является собственным началом левого крыла
вхождения P2.
2. Языки. Операции над языками
Произвольное множество цепочек над алфавитом V, иначе любое подмножество свободной полугруппы V*, называется фомальным языком над V. Поэтому язык может быть задан как любое
множество:
 перечислением элементов;
 ограничивающим свойством;
 через известные множества;
 порождающей процедурой.
В основном будем использовать четвёртый способ, но рассмотрение языков начнем с третьего способа их представления.
Например, для любого V множество слов четной длины является языком. Множество слов нечетной длины также является языком, но в отличие от первого — не замкнутым относительно операции конкатенации. Будем обозначать языки буквой L (с индексами или без них). Рассмотрим операции над языками.
Так как язык является множеством, то применимы все соответствующие операции, для которых выполняются все законы теории
множеств.
В частности,  L,  L.
2.1. Теоретико-множественные операции
Пусть L1 и L2 – два языка над алфавитом V. Язык L называется
объединением этих языков ( обозначается L = L1  L2 ), если
L ={x / x L1  x L2}.
Пересечением языков L1 и L2 называется язык L (обозначается
L = L1 L2 ), такой, что L ={x / x L1 & x L2}.
5
Дополнением языка L1 до V* называется язык L (обозначается
L=V*\L1), такой, что L={ x/ xV* & x L1}.
2.2.Специфические операции
Произведением (иначе конкатенацией) языков L1 и L2 называется язык L (обозначается L=L1L2), если L={x y/xL1 & yL2}.
Например, L1={ ac, a }, L2={ cb, b}, тогда L1L2 ={ acb, accb, ab}.
Свойства операции конкатенации:
1) операция умножения языков ассоциативна:
L1 (L2 L3)= (L1 L2) L3;
2) операция умножения языков дистрибутивна относительно
объединения:
L (L1L2 ) = LL1  LL2 ,
(L1L2 ) L = L1L  L2L;
3) операция умножения языков не коммутативна: L1 L2 L2 L1.
4) L {}= {} L = L;
5) L(L1L2 )  LL1  LL2 , в общем случае равенства нет, что
легко показать, подобрав соответствующий пример.
В силу ассоциативности операции произведения, как и в случае
конкатенации цепочек, L = L1 L1 ... L1 записывается как
n раз
L=L1n. По определению, L0={}. Отметим, что {}   . так как 
(пустой язык) вообще не содержит никаких цепочек.
Итерацией языка L1 называется язык L (обозначается L=L1*), если
L=L10  L11  L12 … =

n0
Ln1 . Как нетрудно видеть, итерация
алфавита V* (алфавит можно рассматривать как язык, состоящий
из односимвольных слов) образует язык, состоящий из всех возможных цепочек, составленных из символов V. Это обстоятельство и объясняет, почему V* используется для обозначения всех
слов над алфавитом V.
Вводится также операция усеченной итерации. L называется усеченной итерацией языка L1 (обозначается L=L1+), если
L=L10
 L1 
1
L12
… =

n 1
Ln1 .
6
3. Абстрактные формальные системы
Абстрактная формальная система – это
1. Алфавит А ( множество слов в этом алфавите – А*).
2. Разрешимое множество А1  А*, элементы множества А1
называют аксиомами.
3. Конечное множество вычислимых отношений Ri (1, …, n, )
на множестве A*, называемых правилами вывода. В этом случае
слово  непосредственно выводимо из слов 1, …, n по правилу
Ri.
Аксиомы тоже могут быть заданы как унарные отношения, но
это не всегда удобно.
Выводимость. Вывод формулы В из формул A1, A2, … , An –
последовательность формул F1, F2, … , Fm = B, такая, что
Fi (i=1,…, m) – либо аксиома, либо одна из формул A1, A2, … , An,
либо непосредственно выводима из некоторого подмножества
множества {F1, F2, … , Fi-1}по одному из правил вывода. Если
существует вывод формулы В из формул A1, A2, … , An, то В
выводима из A1, A2, … , An . Множество формул, выводимых из
аксиом, называется теоремами теории.
Теорема 1. Для любой формальной теории множество выводимых в ней слов перечислимо.
Доказательство.
Рассмотрим А** – множество всех конечных последовательностей 1, …, n, где i – слова в алфавите А. А** – перечислимо.
Из-за разрешимости множества аксиом и вычислимости правил
вывода по любой последовательности можно эффективно узнать,
является ли она выводом в данной формальной системе (FS).
Если в процессе перечисления А** отбрасывать все последовательности, не являющиеся выводами, то получаем перечисление
множества выводов, а значит, последних слов выводов.
Следовательно, множество слов (формул), выводимых в произвольной формальной системе, перечислимо.
Примеры формальных систем: системы продукций Поста (канонические системы), системы подстановок, формальные грамматики, исчисления и т.д.
Каноническая система – это <A, X, M, R>, где
A= {a1,a2,…, an} – алфавит констант,
X= {x1, x2,…,xm} – алфавит переменных,
7
M= {M1, M2, …, Mk} – множество аксиом, Mi(AX)*,
R = {R1, R2, …, Rl} – множество продукций, имеющих вид 1,
2,…, j, где i, (AX)*, 1, 2,…,j называются посылками, 
– следствием (заключением).
Слова в (AX)* называются термами, слова в А* – просто словами.
Слово  называется применением аксиомы , если  получается из  подстановкой слов вместо переменных.
Слово  непосредственно выводимо из 1, …, n применением
продукции R , если существует подстановка слов вместо переменных в продукцию R, которая посылки превратит в 1, …, n, а
заключение – в .
Например, из acab , cabb применением продукции a x1 b, x1 b x2
 b x2 (подстановка x1=ca, x2=b) непосредственно выводимо bb.
Выводимость – транзитивное и рефлексивное замыкание непосредственной выводимости.
Доказуемое в формальной системе утверждение (теорема формальной системы) – утверждение, выводимое из множества аксиом.
Например, формальная система <{I}, {x}, {I}, {xx I I}> позволяет построить множество нечетных чисел в унарном представлении.
Теорема 2. Для любого перечислимого множества М слов в
алфавите А существует каноническая система над А, множество
теорем которой совпадает с М (доказательство с использованием
машин Тьюринга приводится в [3]).
4. Формальные порождающие грамматики
Порождающей грамматикой называется упорядоченная четверка G=< VN, VT, S, R>, где VT – алфавит терминальных или основных символов; VN — алфавит нетерминальных или вспомогательных символов (VTVN =  ); S – начальный символ или аксиома, S
VN, R – конечное множество правил или продукций вида   ,
где  (VTVN )* VN (VTVN )*,  (VTVN )* – различные
цепочки, а  специальный символ, не принадлежащий VTVN и
служащий для отделения левой части правила  от правой . Такие
символы, которые служат для описания языка, но не принадлежат
самому языку, будем называть метасимволами. Определим, что
8
цепочка 1 непосредственно выводима из цепочки 0 (обозначается 01 ), если существуют такие 1, 2, , , что 01  2,
11  2 и существует правило  ( R). Иными словами 01, если в 0 найдется вхождение левой части какоголибо правила грамматики, а цепочка 1 получена заменой этого
вхождения на правую часть правила.
Существенно, что при определении отношения непосредственной выводимости обозначаемого  (, разумеется, также метасимвол) не указывается, какое правило нужно применять и к какому именно вхождению (если их несколько). Здесь проявляются
характерные черты исчислений, к классу которых относятся и
порождающие грамматики. Исчисления представляют собой "разрешения" в отличие от алгоритмов, являющихся "предписаниями".
Определим, что цепочка n выводима из цепочки 0 за один
или несколько шагов или просто выводима (обозначается
0+n ), если существует последовательность цепочек 0, 1,
2,…, n (n>0), такая, что ii+1, i{0, …, n-1}. Эта последовательность называется выводом n из 0, а n – длиной вывода.
Выводимость за n шагов иногда обозначается 0n n. Наконец,
если 0+n или 0=n , то пишут 0*n.
Нетрудно видеть, что + есть транзитивное, а * – транзитивно-рефлексивное замыкание отношения .
Цепочка  называется сентенциальной формой, если она совпадает или выводима из начального символа грамматики, т.е. если
S * .
Множество цепочек в основном алфавите грамматики, выводимых из начального символа, иначе множество сентенциальных
форм, состоящих из терминальных символов (иначе, сентенций),
называется языком, порождаемым грамматикой G, и обозначается
L(G).
L(G) = {x / S * x & xVT* }.
Справедливо, что для любого перечислимого множества слов М
существует грамматика G, такая, что М = L(G).
Определим, что грамматики G1 и G2 эквивалентны, если
L(G1 )=L(G2).
Например,
9
G1 = < {S}, {a}, S, { Sa, S a a S}>, L(G1)= {a 2n+1, n 0}.
G2 = < {S, A}, {0, 1}, S, R>, R = {S  1 A, A  1 A, A  0 A,
A  0 }, L(G2) – множество четных двоичных чисел, больших
нуля.
G3 = < {S, A}, {0, 1}, S, R>, R = {S  1 A 0, A  1 A, A  0 A,
A  }, L(G2) = L(G3), грамматики G2 и G3 эквивалентны.
Для сокращения записи грамматик и выводов будем изображать
нетерминальные символы прописными буквами латинского алфавита А , В , С , … , S с индексами или без них, терминальные –
строчными буквами a, b, c,… и цифрами. Прописными буквами U,
V, Z будем обозначать символы, которые могут быть как терминальными, так и нетерминальными; строчными буквами u, v, x, y,
z c индексами или без них – цепочки, составленные из терминальных символов, а буквами    … – из любых символов. Кроме
того, для обозначения правил  1,  2,…,  n будем пользоваться записью  12… n .
Правила вида   , где   VT*, называются заключительными.
5. Классификация грамматик
Выделяются определенные классы грамматик, основными среди
которых являются контекстно-свободные (КС), контекстнозависимые (КЗ), автоматные…
Основными типами грамматик являются:
Грамматики класса «0» – не накладываются ограничения на вид
правила.
Контекстно-зависимые (КЗ-грамматики), все правила которых
имеют вид   , где (VTVN)*VN(VTVN)*,  (VTVN )*
    .
Например, этому классу принадлежит грамматика G4 с правилами
S  abA ab ,
bA  Ab ,
aA  aabA ,
aA  aab .
10
Контекстно-свободные (КС-грамматики) – грамматики, все правила которых имеют вид А , где АVN ,  (VTVN )*.
Например, это грамматика G5 с правилами S  a S b ab ,
L(G5) = L(G4)= {anbn, n>0}.
Автоматные грамматики (А-грамматики) – это грамматики, все
правила которых имеют вид Аа, Аa B, А, aVT, A,B VN.
Иногда выделяется еще один класс грамматик: контекстные
грамматики, или грамматики класса 1, все правила которых имеют
вид , где , (VTVN), A VN, (VTVN )*.
Здесь пара цепочек  и  составляет неизменяемый контекст
правила. Между контекстными грамматиками и КЗ-грамматиками
существует взаимно-однозначное соответствие, не всегда очевидное. По выразительной мощности эти классы грамматик совпадают, однако, поскольку для одного и того же языка контекстная
грамматика содержит большее число правил, мы будем изучать
именно КЗ-грамматики.
Пример.
Грамматика G6, КЗ-грамматика с правилами
S aAc ,
A aABc ,
L(G6)= {anbncn, n.
A b ,
bBbb ,
cB Bc .
Эквивалентная G6 контекстная грамматика G7 с правилами
S аBC ,
B аBDC ,
L(G7)= {anbncn, n
B b ,
bDbb ,
CD ED ,
ED EC ,
EC DC ,
Cc .
В ней правило переноса символа B заменяется на три правила.
В соответствии с классом грамматики, порождающей язык,
классифицируются языки. То есть язык, который может быть
порожден КС-грамматикой, называется КС-языком (язык, для
11
которого существует порождающая его КС-грамматика, и не существует А-грамматики, порождающей этот язык).
А-язык – язык, для которого может быть построена порождающая его А-грамматика.
КЗ-язык – язык, который может быть построен только КЗграмматикой.
Непосредственная классификация грамматик выглядит следующим образом.
Класс А-грамматик включается в класс КС-грамматик. Все
грамматики принадлежат классу 0.
Однако класс КС-грамматик не включается в класс КЗграмматик, так как правила вида А могут принадлежать КСграмматикам, но не КЗ-грамматикам, так как А.
Поэтому общий вид классификации грамматик следующий:
6. А-языки. Конечные лингвистические
автоматы
6.1. Диаграмма грамматики
Пусть дана А-грамматика G=< VN, VT, S, R> . Диаграмма Аграмматики – граф с помеченными вершинами и дугами. Множество вершин графа соответствует множеству нетерминалов А12
грамматики, приведенной к каноническому виду, а множество дуг
– множеству правил грамматики.
Приведение грамматики к каноническому виду:
1. Вводим дополнительный нетерминальный символ К, тогда
VN’= VN  К.
2. Заменяем правила вида Аа на правила АаК.
3. Вводим дополнительное правило К.
Таким образом, все правила грамматики теперь приобрели
"стандартный" вид AaB или A.
Построение диаграммы опишем следующими правилами.
1. Каждому нетерминальному символу поставим в соответствие
вершину и пометим ее этим символом.
2. Каждому правилу AaB сопоставим дугу из вершины A в
вершину В и пометим ее терминальным символом а.
3. Отметим в графе как начальную вершину – вершину, соответствующую начальному символу, и как заключительные – все
такие вершины В, что B (на диаграмме используется символ #).
Пример. Пусть грамматика G8 описывается правилами:
S aBbC ,
B bbB ,
C aS .
Грамматика в канонической форме будет иметь вид:
S aBbC ,
B bKbB ,
C aS ,
K  .
Диаграмма грамматики приводится на рис.1.
Рис.1
Рис.2
13
Очевидно, что существует взаимно однозначное соответствие
между грамматикой в каноническом виде и диаграммой.
Например, рассмотрим диаграмму грамматики, представленную
на рис.2. Очевидно, что диаграмме соответствует грамматика G9 с
правилами
S aSaB ,
B bKbB ,
K  .
6.2. Порождение и распознавание цепочек
Лингвистический автомат – это SL= <Q, VT, q0, F, K>,
где Q = {q0, q1,…, qk}, k0 – множество состояний автомата (внутренний алфавит),
VT ={a1, a2,…, am}, m1– множество терминальных символов
(внешний алфавит) автомата,
q0 – начальное состояние автомата, q0 Q,
F: Q VTQ функция переходов,
K Q – множество конечных (заключительных) состояний.
Рассмотрим автомат как распознающий, тогда ему соответствует следующая абстрактная модель: входная лента, на которой
расположена анализируемая цепочка, считывающая (входная)
головка и устройство управления. На каждом шаге обозревается
ровно один символ.
Пара (q, a), где a – обозреваемый символ, q – состояние автомата, называется ситуацией автомата. Если автомат находится в
ситуации (qi, aj) и F(qi, aj)=qk, то считывающая головка перемещается на один символ вправо, автомат переходит в состояние qk.
Получается ситуация (qk, aj+1) (обозревается следующий символ на
ленте). Если же функция F(qi, aj) не определена, то входная цепочка не допускается автоматом.
Если в результате прочтения входной цепочки автомат окажется
в заключительном состоянии, то считается, что автомат допустил
цепочку.
Более строго:
в начале работы автомат находится в состоянии q0, на входе –
цепочка a1 a2 … an , обозревается самый левый символ цепочки –
ситуация (q0, a1) , затем переход в некоторую ситуацию (qi, a2),…,
14
(qj, an), и, наконец, в ситуацию (qs, ) &qsK. Назовём конфигурацией автомата пару H=(q, x), где q — текущее состояние автомата;
x — остаток входной цепочки, самый левый символ которой обозревается входной головкой. Конфигурация, очевидно, определяет
и ситуацию. Определим, что конфигурация (p, x1) получена из
конфигурации (q, x) за один такт (обозначается (q, x) ├ (p, x1) ),
если x= a x1 и F(q, a)= p.
Если H0, H1,…, Hn (n 1) – последовательность конфигураций,
таких, что Hi ├ Hi+1 , i {0,1,…, n-1}, то, как и раньше, будем
использовать обозначения H0 ├
+
Hn или H0 ├ * Hn , если спра-
ведливо H0 ├ +Hn  H0=Hn.
Пусть x — анализируемая цепочка. Начальная конфигурация
имеет вид (q0, x), заключительная – (qs, ), qs  K. Определим, что
автомат A допустил цепочку x, если (q0, x) ├ * (q, ) и q  K
(использование отношения ├ * позволяет включить в множество
допускаемых цепочек и пустую цепочку , если q0 K).
Языком L(A), допускаемым конечным автоматом A, называется
множество допускаемых им цепочек:
L(A) = { x / (q0, x) ├ * (q, ) & q K}.
Например, для лингвистического автомата SA= < {q0, q1}, {a, b,
c}, q0, F, {q1}>, функция переходов которого
F(q0,c)=q0,
F(q0,a)=q1,
F(q1, b)= q1,
диаграмма представлена на рис. 3.
Рис.3
Язык, распознаваемый автоматом SA, L(SA)= {cn a bm, n, m0}.
15
Цепочка не распознается автоматом, если или нет перехода по
читаемому символу, или в результате прочтения цепочки состояние, в которое перешел автомат – не конечное.
Процесс допускания цепочки соответствует движению по графу. Цепочка допущена, если существует путь из начальной вершины в заключительную, при котором последовательно выписанные метки проходимых дуг составляют анализируемую цепочку.
Граф автомата в силу тождественности его структуры с диаграммой грамматик всегда может рассматриваться как диаграмма
некоторой грамматики, роль нетерминальных символов в которой
будут играть метки состояний автомата. Нетрудно видеть, что
грамматика, полученная по графу переходов автомата, при интерпретации последнего как ее диаграммы будет порождать тот же
самый язык, который допускается автоматом. В обоих случаях
язык однозначно определяется множеством путей из начальной
вершины в заключительные, а множество путей совпадает, так как
граф один и тот же. Таким образом, по любому конечному автомату может быть построена эквивалентная А-грамматика и, следовательно, абстрактно взятый ориентированный граф с помеченными
вершинами и дугами, в котором выделена начальная и множество
заключительных вершин и удовлетворяются требования однозначности отображения F, может рассматриваться и как диаграмма
грамматики, и как граф переходов автомата – все дело в интерпретации.
По диаграмме автомата всегда легко построить эквивалентную
грамматику (автомат по грамматике строить сложнее, так как в
грамматике одному символу входного алфавита может соответствовать более одного перехода, см., например, рис. 2).
Правила грамматики по диаграмме автомата строятся следующим образом:
1. Каждому состоянию автомата сопоставляем нетерминал грамматики.
2. Каждой дуге, соответствующей переходу из состояния P в
состояние Q, помеченной терминалом a, сопоставляется правило
грамматики PaQ.
3. Каждому конечному состоянию R сопоставляется правило
R.
16
4. Начальному состоянию автомата сопоставляется начальный
символ грамматики.
Например, автомату SA, диаграмма которого представлена на
рис.3, соответствует грамматика G10 с правилами
S cS a A ,
A b A .
где состоянию q0 сопоставлен нетерминал S, а состоянию q1 –
нетерминал A.
Таким образом, состояния конечного автомата однозначно
отображаются в нетерминалы грамматики.
Однако если мы рассмотрим грамматику G9, диаграмма которой представлена на рис. 2, то однозначность отображения нарушается неоднозначностью переходов, допустимой в грамматиках,
но не в автоматах.
Для того чтобы построить соответствующее таким грамматикам автоматы, можно рассматривать функцию переходов F автомата как отображение Q  VT в множество подмножеств Q ( т.е. в
P(Q)). При этом P(Q)=2Q.
6.3. Детерминизация недетерминированных автоматов
Будем называть недетерминированным конечным автоматом S
пятерку объектов S = <Q, VT, q0, F, K>, где интерпретация Q, VT,
q0, K такая же, как и раньше, а F – отображение Q  VT в P(Q).
Определение цепочек, допускаемых автоматом,
остается
прежним, но если в детерминированном автомате последовательность конфигураций однозначно определялась заданием входной
цепочки, так как из каждой конфигурации автомат мог перейти не
более чем в одну конфигурацию, то в недетерминированном случае это не так. Поэтому при интерпретации определения "цепочка
x допущена" как (q0,x) ├ (q, )&qK необходимо при анализе
цепочки, моделируя работу автомата, перебрать варианты выполнения тактов, чтобы найти тот (или те), который приводит в
заключительную ситуацию. В силу тех же соображений (тождественность движений по графу и при порождении цепочки, и
при ее допускании) можем утверждать, что для любой грамматики
G может быть построен конечный автомат A (в общем случае
17
недетерминированный), такой, что L(G)=L(A) . Соответствия
между параметрами грамматики и автомата остаются те же.
Возникает естественный вопрос о соотношении класса языков,
допускаемых детерминированными и недетерминированными
автоматами. Ясно, что для любого детерминированного автомата A
существует недетерминированный A', допускающий тот же самый
язык (достаточно в качестве A' взять А). Но верно ли обратное?
Ответ на этот вопрос дает следующая теорема.
Теорема 3. Если L=L(A) для некоторого недетерминированного
автомата A, то найдется конечный автомат A', такой, что
L(A')=L(A).
Доказательство.
Пусть дан недетерминированный конечный автомат А = < Q,
VT, q0, F, K>. Построим соответствующий детерминированный
автомат А’= <Q’, VT, q0’, F’, K’>
1


Q’ = P(Q) . При этом множество состояний q i ,q i ,...,q i , будем
1
2
l
обозначать как [q i ,q i ,...,q i ] .
l
1
2
2
q0’=[q0].
3
K’ = { [q i ,q i ,...,q i ] / q i ,q i ,...,q i K }.
l
l
1
2
4
F’( [q i ,q i ,...,q i ] , a)=
l
1
2

1

2
l
j1
F (q ij , a) .
Несложно доказать методом математической индукции, что для
любого i справедливо:
([q0],xy) ├iA’(B, y)  B={p/ (q0, xy) ├iA(p,y)} при x=i.
Значит, для любой цепочки x
([q0],x) ├iA’(B,)  B={p/ (q0, x) ├iA(p,)}.
Поэтому, в случае B K’, т.е. если x – цепочка, допускаемая детерминированным автоматом, то в исходном недетерминированном автомате существует путь из начального в конечное состояние
при чтении этой цепочки и, следовательно, L(A)=L(A’).
Таким образом, сопоставляя доказанные утверждения, получаем
утверждение:
Класс А-языков и класс языков, распознаваемых конечными автоматами, совпадает.
18
Так, например, для автомата, представленного на рис. 2, соответствующий детерминированный автомат, порождающий L(G9),
представлен на рис. 4.
Рис.4
Для этого автомата F(S,a)= [S,A] = A’,
F([S,A], a) = [S,A] = A’,
F([S,A],b) = [A, K] = K’,
F([A,K],b)= [A, K] = K’.
Для автомата на рис. 5,а детерминированный автомат представлен на рис.5,б.
Алгоритм построения детерминированного автомата по недетерминированному.
1. Строим начальное состояние q0’= [q0], помечаем его как
начальное.
2. Для каждого состояния qi’, построенного на предыдущем шаге,
строим F(qi’, a) для всех aVT. Если для какого-нибудь из построенных состояний функция перехода ещё не построена, возвращаемся к шагу 2.
3. Помечаем как конечные все состояния qi’= [q i ,q i ,...,q i ] /
1
q ,q ,...,q  K  .
i1
i2
2
l
il
Конечность процесса обеспечивается конечностью множества
P(Q).
19
Рис.5
6.4. Автоматы с -переходами
Автоматы с -переходами естественно возникают в различных
приложениях и позволяют представить любой автомат в виде
двухполюсников с одним входом и одним выходом, а так же строить сети из таких автоматов, сохраняя в них единственный вход и
единственный выход. От рассмотренных ранее автоматов они
отличаются тем, что в них присутствуют переходы, осуществляемые без чтения входной цепочки (на диаграмме такие переходы
обозначаются стрелками, помеченными символом , рис.6).
Рис. 6
Например, рассмотрим автомат с двумя выходами, представленный на рис. 7. Если просто объединить две выходные вершины
автомата, то получившийся автомат не будет эквивалентен исходному, т.к. после построения символа b в результирующем автомате
возможно будет построить символы а, что было невозможно в
исходном автомате. Автомат, эквивалентный исходному, и являющийся двухполюсником, представлен на рис. 8.
20
Рис.7
Рис.8
Иногда в двухполюснике конечные состояния изображаются
как
.
Детерминизация автоматов с -переходами
Процедура детерминизации автоматов с -переходами
задаётся следующей теоремой.
Теорема 4. Классы языков, допускаемых детерминированными
автоматами и автоматами с -переходами, совпадают.
Доказательство.
Пусть автомат А = <Q, VT, q0, F, K> – автомат с -переходами.
Построим соответствующий детерминированный автомат А’= <Q’,
VT, q0’, F’, K’>, такой, что L(A)=L(A’). Определим F’(q,a) и K’
следующим образом:
F’(q,a)={p / (q,ax) ├+ (p,x)}
K’ = K {q / (q, ) ├* ( p, )& pK}
Несложно показать, с использованием математической индукции по числу символов в распознаваемой цепочке, что получаемый
таким образом автомат А’ переходит при распознавании цепочки x
в конечное состояние тогда и только тогда, когда существует
последовательность переходов в конечное состояние автомата А
при распознавании этой же цепочки символов.
Очевидно, что если L – А-язык, то ему можно сопоставить некоторый двухполюсник.
Пусть языкам L1 и L2 сопоставлены соответствующие двухполюсники (рис.9,а). Тогда их объединению, конкатенации и итера21
ции языка L1 будут, соответственно, сопоставлены двухполюсники
на рис. 9,б, 9,в и 9,г.
Рис.9
Сопоставляя доказанные ранее утверждения, получаем следующую теорему.
Теорема 5. Класс А-языков замкнут относительно операций
объединения, конкатенации и итерации.
Оптимизация автоматов с -переходами
1. Если из состояния А исходит единственная дуга и это -дуга в
состояние В, то вершины А и В можно слить.
2. Если из вершины А выходит -дуга в вершину В, являющуюся
начальной вершиной некоторой дуги( не петли) или последовательности дуг, а С – конечная вершина этой дуги (последовательности дуг), и единственная дуга из С – -дуга в вершину А, то
вершины А, В и С можно слить (примеры такого слияния приводятся на рис. 10 ( для одной дуги – а, б; для последовательности –
в, г).
22
Рис.10
Пример. Пусть автомат SB представлен диаграммой на рис. 11,а.
Объединим по правилу 1 упрощения автоматов с -переходами
состояния 4 и 5 и переобозначим состояния, как показано на рис.
11,б.
Рис.11
23
Построим функцию переходов детерминированного автомата SB’.
F(A, a) = [B,C, D, F], F([B, C, D, F], a) = [C,D, F],
F(A, b) = [E],
F([B, C, D, F], b) = [D, E],
F(A,c) = ,
F([B, C, D, F], c) = ,
F([D, E], a) = [D, F], F([D, F], a) = [D, F],
F([E], a) = ,
F([D, E], b) = [E],
F([D, F], b) = [E],
F([E], b) = ,
F([D, E],c) = [D],
F([D, F], c) = ,
F([E], c) = [D],
F([D], a) = [D, F],
F([D], b) = [E],
F([D], c) = ,
F([C, D, F], a) = [C, D, F],
F([C, D, F], b) = [E],
F([C, D, F],c) =  .
Диаграмма детерминированного автомата SB’ представлена на
рис. 12. Для него K’ = { [B, C, D, F] , [ D, F], [C, D, F]}.
Рис.12
Тот же автомат после переобозначения состояний представлен
на рис. 13.
24
Рис.13
6.5. Минимизация числа состояний автомата
Минимизация автоматов методом таблиц различий
Алгоритм основан на анализе языка L, порождаемого (или распознаваемого) автоматом.
Идея: разбить множество состояний на непересекающиеся множества неразличимых состояний (т.е. состояний, порождающих
или распознающих одинаковые множества строк).
Строятся матрицы D0, D1,… , указывающие различимость состояний по строкам длины n. Состояния qi и qj различимы по
строке длины 0 (T на пересечении строки i и столбца j матрицы
D0): qi D0 qj  (qiK) & ( qj K)  (qi K)&( qjK).
Различимость для строк ненулевой длины определяется по индукции: при i > 0 состояния qk и qj различимы по строке длины i,
т.е. (qk Di qj )  qk Di-1 qj или aVT , такой, что F(qk,a) Di-1
F(qj,a).
Состояние qk различимо от состояния qj , если  i 0 , такое,
что qk Di qj .
Очевидно, что qk Di qj  существует строка x, x i , что
(F(qk, x)K ) & ( F(qj, x) K)  (F(qk, x) K) & (F(qj, , x)K).
25
Если же состояния неразличимы, то их можно объединить в одно состояние; получившийся автомат будет эквивалентен исходному.
Пример. Рассмотрим автомат SC, диаграмма которого представлена на рис. 14.
Рис.14
Матрицы, получающиеся при анализе автомата:
D0
FTFT
TFT
TF
T
TTFT
TTT
TF
T
D1
D2=D1
Из анализа полученной матрицы получаем три класса эквивалентных состояний:
Рис.15
26
K1 = {1, 4}, K2 = {2}, K3 = {3,5}. Диаграмма автомата, получающегося при объединении эквивалентных состояний автомата
SC, представлена на рис. 15.
Минимизация автоматов по методу Хафмена
Этот метод применим как для лингвистических автоматов, так и
для автоматов Мили (для них метод описан в разделе 12).
Идея: объединение в один класс предположительно эквивалентных состояний, а затем проверка, являются ли состояния
действительно эквивалентными (неразличимыми). Затем, если
состояния неэквивалентны, классы разбиваем на подклассы, и
проверка повторяется. Если состояния ведут себя одинаково, то
процедура закончена, и получившиеся классы являются состояниями минимизированного автомата.
Алгоритм минимизации лингвистического автомата методом
Хафмена.
1. Составляем таблицы переходов и выходов. По строкам указываются входы, по столбцам – состояния, в которые автомат переходит при данном входе.
2. Составляем классы предположительно эквивалентных состояний. В этом случае начальное разбиение происходит на класс
конечных состояний и тех состояний, которые не являются конечными.
3. Составляем таблицу переходов, где в ячейках вместо состояний
указываются классы, которым принадлежат эти состояния. Затем
анализируем полученную таблицу: если в пределах одного класса
состояния ведут себя по-разному, то класс разбивается на соответствующие подклассы, и возвращаемся к шагу 3.
4. Если во всех классах состояния ведут себя одинаково, то это
действительно классы эквивалентности, и процедура закончена.
Строится автомат, состояниями которого являются классы эквивалентности исходного автомата.
Применение метода к автомату, диаграмма которого представлена на рис. 14, имеющему таблицу переходов
a
b
1
2
3
2
2
4
3
1
2
4
2
5
5
4
2
27
и конечные состояния 3, 5, на первом шаге дает классы К1 = {3, 5},
K2= {1, 2, 4} и, соответственно, получаем таблицу переходов (для
наглядности в таблицу добавлена строка, с указанием номера
класса, которому принадлежит состояние):
№ класса
2
2
1
2
1
Вход\состоя
1
2
3
4
5
ние
a
K
K
K
K
K
2
2
К
b
1
2
2
K
2
2
К
K
2
1
K
2
Видно, что класс K2 разбивается на два
K4={2}. Получается таблица переходов:
№ класса
3
4
1
3
Вход\состоя
1
2
3
4
ние
a
K
K
K
K
4
4
К
b
1
3
4
K
3
1
5
K
3
К
K
4
класса K3= {1, 4},
1
K
4
Состояния в классах оказываются эквивалентными. Очевидно,
что, как и следовало ожидать, получившийся минимальный автомат совпадает с тем, который получен методом таблиц различий.
Диаграмма полученного автомата приведена на рис. 15.
Минимизация не полностью определенных автоматов
(на примере лингвистического автомата, диаграмма которого
представлена на рис. 13).
При минимизации не полностью определенных лингвистических автоматов начальное разбиение множества состояний делается так же, как для полностью определённого автомата: на конечные
и неконечные состояния. Для данного случая классы K1={B, C, F}
– конечные состояния, K2= {A, D, E, G} – неконечные. Приведем
таблицы переходов состояний для этого автомата.
Исходная таблица:
a
b
A
C
E
B
B
E
C
B
G
D
F
E
E
28
F
F
E
G
F
E
c
-
-
-
-
D
-
D
Проставляем классы состояний (в дополнительной верхней
строке указываем номер класса состояния):
№
2
A
K
a
1
b
1
B
K
1
K
2
c
1
C
K
1
K
2
-
2
E
-
K
-
1
K
2
-
2
D
K
1
2
-
1
F
K
1
K
2
-
2
G
K
K
K
2
-
2
K
2
Далее разбиваем классы на подклассы в соответствии с одинаковостью и различием столбцов. Класс K2 разбивается на 3 класса
K3 = {A, D}, K4 = {E}, K5 = {G}.
№
3
A
K
a
1
b
1
B
K
1
K
4
c
1
C
K
1
K
4
-
4
E
-
K
-
1
K
5
-
3
D
K
1
4
-
1
F
K
1
K
4
-
5
G
K
K
K
4
-
3
K
3
Получившаяся таблица показывает, что класс K1 также разбивается на два класса K6= {B, F}, K7 = {C}.
№
3
A
K
a
7
b
6
B
K
6
K
4
7
C
K
6
K
4
4
E
-
K
-
6
K
5
3
D
K
6
F
K
6
4
6
K
4
29
5
G
K
K
4
c
-
-
-
-
K
-
3
K
3
И, наконец, разбивается класс K3 : K8= {A}, K9={D}.
№
8
A
K
a
7
b
6
K
4
c
6
B
K
6
K
4
-
7
C
K
4
E
-
K
-
6
K
5
-
9
D
K
6
4
-
6
F
K
6
K
4
-
K
9
5
G
K
K
4
-
K
9
Это разбиение не приводит в дальнейшему разбиению классов и
получившиеся классы состояний автомата являются классами
эквивалентности, а автомат, состояниями которого являются классы эквивалентности исходного автомата, – минимальный. Диаграмма минимизированного автомата SB’, на которой все классы,
кроме 6-го, поименованы единственным входящим в них состоянием, а класс K6 – символом B, представлена на рис. 16.
30
Рис.16
6.6. Регулярные множества и регулярные выражения
Определим еще некоторый класс языков — регулярные множества. Соотношение его с классом А-языков определим позднее.
Пусть VT – конечный алфавит. Регулярные множества в алфавите VT определяются рекурсивно:
1)  – регулярное множество;
2) {} – регулярное множество;
3) {a} – регулярное множество для любого aVT;
4) если P и Q – регулярные множества, то таковы также и множества: PQ, PQ, P*;
5) никаких других регулярных множеств нет.
По-другому можно определить регулярное множество как такое, которое можно получить из , {} , {a} путем конечного
числа применений операций "", "" и "*".
Определим теперь специальную нотацию для задания регулярных множеств.
Регулярные выражения в алфавите VT и регулярные множества,
которые они обозначают, определяются рекурсивно:
31
1) 0 – регулярное выражение, обозначающее регулярное множество ;
2) 1 – регулярное выражение, обозначающее регулярное множество {};
3) если a VT, то a – регулярное выражение, обозначающее регулярное множество {a};
4) если p и q – регулярные выражения, обозначающие регулярные множества P и Q, то:
a) (p+q)– регулярное выражение, обозначающее регулярное
множество PQ ,
б) (pq) – регулярное выражение, обозначающее регулярное
множество PQ,
в) (p*) – регулярное выражение, обозначающее регулярное
множество P*;
5) никаких других регулярных выражений нет.
Как обычно, когда можно опустить лишние скобки без потери
однозначности понимания, мы будем это делать. Так, a+bba*
обозначает (a+((bb)(a)*)). Считается, что * обладает наивысшим
приоритетом, затем • и, наконец, +.
Очевидно, что для каждого регулярного множества можно
найти регулярное выражение, его обозначающее, и наоборот. К
сожалению, как будет показано дальше, одному и тому же регулярному множеству может соответствовать бесконечно много
регулярных выражений.
Считаем, что регулярные выражения равны (обозначается значком =), если они обозначают одно и то же регулярное множество.
Запишем основные алгебраические тождества для регулярных
выражений. Часть из них уже известны, остальные легко доказываются. Если , ,  – регулярные выражения, то:
1. 
2. ;
3. 
4. +()=(;
5. 11
6. 000
7. ;
8. 
32
*=*;
(*)*=*;
** = *;
* =*;
0 ;
1*=1 ;
0*=1
()*()*;
(*)**=(+)*=(* +*)*;
(*)*=(+)*+1;
(*)*=(+)* +1;
Если  = *, то =+;
Если  и , то *.
Последнее тождество является основным при решении уравнений.
Теорема 6 (Клини). Каждому А-языку над V соответствует регулярное выражение над V. Каждому регулярному выражению над
V соответствует А-язык.
Идея доказательства:
L – регулярное множество  L – А-язык.
1.  – регулярное множество, ему соответствует грамматика с
пустым множеством правил;
2. {} – регулярное множество, ему соответствует грамматика с
множеством правил {S};
3. {a}, а VT – регулярное множество, ему соответствует грамматика с множеством правил {S а };
4. если P, Q – регулярные множества, которым сопоставлены Аграмматики, то регулярным множествам PQ, P Q, P* – также
соответствуют А-грамматики, что легко показать через соединение
двухполюсников, порождающих языки, соответствующие P и Q.
L – А-язык  L – регулярное множество.
Пусть есть А-грамматика G = < VT,VN, S, R>, правила для Ai:
Ai  a1 a2… ak b1Aj1 b2Aj2 … bmAjm
где as, bqVT, AjsVN. Обозначим Xi – язык, порождаемый грамматикой Gi, в которой в качестве начального символа выбран символ
Аi.Тогда указанные правила эквивалентны следующему уравнению:
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
33
Xi = a1 + a2 + …+ ak + b1Xj1 + b2 Xj2 + … + bm Xjm.
Действительно, если Xi обозначает язык, порождаемый грамматикой Gi, когда Ai – начальный символ, то, так как возможны
выводы Ai  a1, Ai  a2, Ai  ak , можно написать, что a1, a2,…,
ak Xi и, следовательно, Xi = a1 + a2 +…+ ak +… С другой стороны,
пусть Ajkxjk, т.е. xjkXjk, тогда возможен вывод Ai + bkAjk +
bkxjk.Следовательно, bkxjkXi , и это верно для любой цепочки
xjkXjk. Поэтому, дополняя предыдущую запись, можем написать
регулярное выражение, соответствующее Xi:
Xi = a1 + a2 + …+ ak + b1Xj1 + b2 Xj2 + … + bm Xjm.
Полное доказательство проводится индукцией по числу правил
грамматики.
Как по регулярному выражению построить А-грамматику?
Конкатенация моделируется последовательным соединением
двухполюсников, + – параллельным соединением, * – - замыканием. Таким образом, последовательно выполняя операции, получим двухполюсники, соответствующие регулярному выражению.
Построенные двухполюсники можно упростить, а затем записать
соответствующую А-грамматику .
Например,
регулярным
выражениям
(a+b)c,
(a+b)*c,
(ab+bc)*(ab+c) будут соответствовать диаграммы, представленные на рис. 17,а, б, в соответственно.
Обратная задача: есть А-грамматика. Надо найти язык, порождаемый этой грамматикой, записанный в виде регулярного выражения.
Например, имеется А-грамматика G11 с правилами:
A a AbB ,
BbBc.
Обозначим язык, порождаемый грамматикой с начальным символом A, – Xa, и язык, порождаемый грамматикой с начальным
символом B, – Xb.
34
Рис.17
Тогда соответствующие уравнения примут вид:
Xa = a Xa + b Xb ;
Xb = b Xb + c .
Система уравнений может иметь бесконечно много решений,
определяется минимальное по мощности решение.
Систему уравнений с регулярными коэффициентами назовем
стандартной над множеством неизвестных ={X1,X2,..., Xn}, если
она имеет вид
X1 = 10 + 11 X1 + 12 X2 + ... + 1n Xn;
X2 = 20 + 21 X1 + 22 X2 + ... + 2n Xn;
…
Xn =  n0 + n1 X1 + n2 X2 + ... + nn Xn;
где все  i j – регулярные выражения. Если какое-либо i-е уравнение не содержит переменную Xj, то достаточно
положить
соответствующий коэффициент  i j = 0, если  i j =1 , то этот коэффициент можно не писать.
В общем случае система уравнений имеет вид:
X1= f1(X1, X2,…, Xn),
X2= f2(X1, X2,…, Xn),
….
Xn= fn(X1, X2,…, Xn) ,
35
где fi – конечная функция, Xj – конечное множество строк над VT,
на множестве X1, X2,…, Xn определены операции объединения и
конкатенации. Обозначим X1, X2,…, Xn как Х, а систему X=F(X).
Решение системы S=(S1,S2,…,Sn) – совокупность подмножеств VT*,
такая, что S=F(S).
Определим S  T = Df S1T1 , S2 T2, …, Sn  Tn.
Функция F: P(A)P(A) P(A) называется монотонно возрастающей, если из A1B1 и A2 B2 следует, что F(A1,A2)  F(B1,B2).
Лемма. Операция конкатенации – монотонно возрастающая
функция.
Очевидно, что операция объединения также является монотонно возрастающей функцией.
Кроме того, из дистрибутивности операции объединения относительно конкатенации и ассоциативности объединения следует,
что f(AB)=f(A)F(B).
Теорема 7. Система уравнений X=F(X ) имеет решение

S=
 F (). Если S
i
1
– другое решение, то SS1.
i 0
Доказательство.
Так как = (,, …,), то  F(). Легко показать, что если
A  B, то F(A)  F(B). Поэтому F()F(F()) и т.д. Получаем
возрастающую последовательность:   F()  F2() 
 F3() …

Пусть S=
 F (). Тогда
i
S=F(S). Если T – некоторое другое
i 0
решение, то T = F(T), но  T, значит, F()  F(T)=T. Очевидно, по индукции можно доказать, что Fi()  T для всех i, следо
вательно,
 F ()T.
i
i 0
Пример. Рассмотрим систему
Xa = a Xa + b Xb ,
Xb = b Xb + c .
Для удобства работы обозначим Xa – x, Xb – y.
f1(x,y)= ax + b y;
f2(x,y)=by+c;
36
f1(,)=;
f2(,)=c;
f1(,c)=bc;
f2(,c)=bc+c;
f1(bc,bc+c)= abc+b(b+)c
f2(bc,bc+c)=(b2+b+)c
f1(abc+b(b+)c, (b2+b+)c) =(a+)ab(b+)c+b(b+)2c;
f2(abc+b(b+)c, (b2+b+)c) = (b3+b2+b+)c;
f1((a+)ab(bc+c)+b(b+)2c, (b3+b2+b+)c) = (a+)2ab(b+)2c +
+b(b3+b2+b+)c;
f2((a+)ab(bc+c)+b(b+)2c, (b3+b2+b+)c) = (b4 + b3+b2+b+)c .
Откуда получаем
y=b*c,
x=a*bb*c .
Тем не менее основным способом решения стандартной системы уравнений является метод последовательного исключения
неизвестных, подобный методу Гаусса. Покажем применение
метода на том же примере:
Xa = a Xa + b Xb ,
Xb = b Xb + c .
Из тождества 21 для регулярных выражений получаем
Xb=b*c ,
Xa = a Xa + b b*c= a*bb*c .
Таким образом, существуют следующие основные способы задания А-языков:
1. А-грамматика.
2. Конечные лингвистические автоматы.
3. Стандартная система уравнений.
4. Регулярное выражение.
6.7. Разрешимые проблемы для А-грамматик
Теорема 8 .Если L – А-язык, и ZL имеет длину  числа состояний детерминированного автомата, то Z=WXY, гдеX1 и W Xi
Y L для всех i0.
Доказательство.
Пусть есть некоторый А-язык и автомат ML, порождающий
этот язык.
Q={ q0,.q1,q2,…,qn-1} – множество состояний автомата ML , n –
число состояний автомата, q0 – начальное состояние автомата.
37
F(q0,Z)K т.к. ZL. Zn , поэтому qjQ , что Z=WXY,
X 1, F(q0,W)= qj, F(qj,X )= qj, F(qj, Y)K. Но тогда F(q0,W
XiY)K для всех i0, что требовалось доказать.
Теорема 9. Проблема непустоты для А-грамматик разрешима,
т.е., если задана А-грамматика G, то существует алгоритм, позволяющий ответить на вопрос: L(G)= ?
Доказательство.
Например, по предыдущей теореме, если L(G), то существует цепочка длины меньшей n, где n – число состояний детерминированного автомата, и перебирая все цепочки длины , не превосходящей n, можно определить, принадлежит ли какая-нибудь из них
языку, порождаемому автоматом(хотя это и не оптимальное решение).
Теорема 10. Проблема равносильности А-грамматик разрешима. т.е., если G1 и G2 – А-грамматики, то существует алгоритм,
позволяющий определить, L(G1)=L(G2)?
Доказательство.
В случае равенства языков минимизированные детерминированные автоматы, построенные по этим грамматикам, будут совпадать с точностью до обозначений состояний.
Теорема 11. Проблема конечности языка, порождаемого Аграмматикой, разрешима.
Доказательство.
Обозначим множество состояний, достижимых из состояния Ai ,
как H(Ai). Тогда, если  Ai, такое, что Ai H(q0 )& Ai H(Ai)& Aj
 H(Ai )& AjK, то язык, порождаемый автоматом, бесконечен.
Интересно отметить, что подобная теорема существует и для
КС-грамматик.
7. Нотации для задания КС-грамматик
7.1. Математическая нотация
Математическая нотация (которую рассматривали до сих пор) –
чисто синтаксическое задание.
7.2. Бекусова нормальная форма
БНФ (Бекусова нормальная форма, или форма Бекуса — Наура)
есть способ записи грамматики, который широко используется для
описания синтаксиса языков программирования. В БНФ:
38
1. Нетерминальные символы записываются как имена, заключенные в угловые скобки < > .
2. Знак  записывается как :: = (читается "заменяется на").
3. Альтернативы замены, соответствующие одному и тому же
нетерминалу в левой части, отделяются друг от друга вертикальной чертой  (читается "или").
4.  не обозначается, для того чтобы не пропустить эту альтернативу, она обычно записывается первой в конструкции выбора.
Используя БНФ описание идентификатора как произвольной
последовательности букв и цифр, начинающейся с буквы, можно,
например, записать:
<идентификатор> ::= <буква> | <буква> <продолжение>
<продолжение> ::= < символ> | < символ> <продолжение>
<символ> ::= < буква> | <цифра>
<буква> :: = А | В | С|….| Z
<цифра> ::= 0 | 1 | ... | 9
Или:
<идентификатор> ::= <буква> <продолжение>
<продолжение> ::= | < символ> <продолжение>
<символ> ::= < буква> | <цифра>
<буква> :: = А | В | С|….| Z
<цифра> ::= 0 | 1 | ... | 9
При записи в виде грамматики G12 семантику увидеть сложнее
(запись полностью соответствует последнему варианту БНФ):
S  S1 S2 ,
S2  S3 S2  ,
S3  S1 S4 ,
S1  А | В | С| … | Z ,
S4  0 | 1 | ... | 9 .
Нетерминал БНФ может интерпретироваться как язык, который
порождается грамматикой, в которой данный символ является
начальным символом грамматики. БНФ может использоваться для
описания синтаксиса любого языка, не только искусственного,
например:
<Существительное > :: =<основа > <окончание>
<окончание > ::= окончание множественного числа
окончание единственного числа…
Или:
39
формула исчисления высказываний::= элементарная
формула(формула исчисления высказыванийбинарная
операция формула исчисления высказываний) (отрицание формула исчисления высказываний)
элементарная формула::= константа пропозициональная переменная
константа::= 01
пропозициональная переменная ::=ab…z
отрицание::= N
бинарная операция ::= 
7.3. Расширенная форма Бекуса – Наура (РБНФ)
Часто применяется так называемая расширенная БНФ – РБНФ,
в которой используются метасимволы (,); [,]; {,}. Введение метасимволов позволяет сделать запись более лаконичной. Синтаксис
РБНФ следующий:
1. Нетерминалы записываются как последовательность символов.
2. Терминалы (последовательности символов) заключаются в
кавычки.
3. Знак  , используемый в математической записи грамматик, обозначается как =.
4. Альтернативы, как и в математической записи грамматик,
разделяются знаком .
5. Конструкция, заключенная в  ,  , является необязательной.
6. Конструкция, заключенная в  , , может повторяться произвольное число раз, от 0 (эквивалент * в регулярных выражениях).
7. (
) служат для факторизации, т.е. конструкция 
может быть представлена в виде (). Это позволяет использовать конструкцию выбора на более глубоком уровне.
8. В конце каждого описания ставится точка.
Например, идентификатор в РБНФ можно описать так:
Идентификатор = буква  буква цифра.
буква = 'А’ | ‘В’ | ‘С’ |….| ‘Z’.
цифра = ‘0’ | ‘1’ | ... | ‘9’.
Существительное описывается как
40
существительное = основа ( окончание единственного числа окончание множественного числа).
Фактически, в правой части правил в РБНФ записывается некоторое регулярное выражение, в котором могут использоваться
нетерминалы (т.е. расширение возможностей относительно выразительной мощности обычных регулярных выражений, т.к. обычные регулярные выражения позволяют описывать А-языки, а
РБНФ – КС-языки).
7.4. Синтаксическая диаграмма
Синтаксическая диаграмма – графическая форма представления
РБНФ. Для каждого нетерминала рисуется своя диаграмма. Приняты следующие обозначения:
1. Нетерминалы заключаются в прямоугольники.
2. Терминалы заключаются в овалы.
3. Образы нетерминалов и терминалов соединяются линиями
(со стрелками или без них, далее используются стрелки для указания направления движения) так, чтобы множество путей соответствовало множеству цепочек из терминалов и нетерминалов, задаваемому правилами РБНФ, для которых строится диаграмма.
Диаграммы для конструкции выбора и итерации представлены
на рис. 18, а и б, соответственно. Скругленный прямоугольник
может быть заменен как прямоугольником (в случае нетерминала),
так и овалом ( в случае терминала). Набор диаграмм для идентификатора приведён на рис.19.
Рис.18
В большинстве случаев существует не единственная форма
представления для одних и тех же объектов.
41
Рис.19
Легко показать, что выразительная мощность РБНФ и БНФ
совпадает:
Условная запись РБНФ Условная запись БНФ для данной РБНФ
А= (12).
А= [ ] .
А= { } .
<А> ::=<>< 1>< ><2>
<А> ::=<>< >< >
<А> ::= <B ><>
<B> ::= <> < B>
8. Структура цепочек. СУ-схемы
Цепочка – последовательность лексем(терминалов). Структура
цепочки – способ задания семантики (смысла) правильной последовательности лексем (т.е. принадлежащей формальному языку).
Структура может выражать непосредственно семантические
связи слов (для естественного языка) или, например, порядок
вычислений (для арифметических выражений), вложенность конструкций (для языков программирования).
Например, для цепочки ad2+c структура (рис.20) будет выражать порядок действий (знак  использован для обозначения
возведения в степень).
42
Рис.20
Структура этой же цепочки может быть представлена также в
виде скобочной записи: (( (a)  ( (d)(2)) )+ (c) ).
Обычной задачей является определение структуры цепочки, построенной в некоторой конкретной грамматике G.
Пусть дана грамматика G13 с множеством правил:
S T + ST
T M  T  M
M (S)  i
ализируемая цепочка x = i + i  i. Для неё можно построить несколько выводов, различающихся порядком замены нетерминалов,
например: S  T +S  T + T  T+ M  TT + M  M 
 M + M  M i + M  Mi + M  ii + i  i , или S T +S 
M + S  i + Ti + M  T i + i  T i + i  Mi + i  i.
Легко заметить, что по существу эти выводы различаются незначительно. Для придания единообразия процессу построения
вывода определим: вывод, в котором на каждом шаге правило
применяется к самому правому (левому) нетерминалу, называется
правым (левым) выводом. Второй из приведенных выводов для
цепочки i + i  i является левым выводом, т.к. на каждом шаге
правило применяется к самому левому нетерминалу.
Одна из форм представления вывода – синтаксические дерево.
Правила построения синтаксического дерева.
1. Каждому правилу вывода A12…nR, где i – некоторые лексемы, сопоставляется куст.
A
43
1
2
n
…
2. Строим дерево с корнем, растущее вниз. Корню дерева приписываем начальный символ.
3. Для каждого применяемого правила в выводе приклеиваем
соответствующий куст к вершине построенного дерева.
4. Повторяем шаг 3 до тех пор, пока всем висячим вершинам
будут сопоставлены терминалы.
Для грамматики G13 кусты, соответствующие правилам грамматики, приведены на рис. 21,а; синтаксическое дерево для цепочки i
+ i  i в этой грамматики представлено на рис. 21,б.
Теорема 12. Каждому выводу некоторой терминальной цепочки
соответствует единственное синтаксическое дерево. Каждому
синтаксическому дереву соответствует единственный правый
(левый) вывод.
Доказательство.
1. Для построенного вывода дерево единственно по построению.
2. Пусть для данной цепочки имеется некоторое синтаксическое
дерево. Построим левый вывод, соответствующий этому дереву.
Для этого в дереве на каждом шаге применяем соответствующее
правило к самому левому нетерминалу. Предположим, что одному
дереву соответствует более одного правого (левого) вывода. Если
существует 2 вывода, соответствующих этому дереву, то существует нетерминал, к которому применяются разные правила,
следовательно, соответствующие деревья будут различными.
Поэтому каждому дереву соответствует единственный правый
(левый) вывод.
Соответствие дерево – вывод не является взаимнооднозначным, т.к. порядок применения правил не задан и одному
дереву может соответствовать более одного вывода, например,
правый и левый.
Цепочка xL(G) называется неоднозначной в G, если для неё
существует более одного синтаксического дерева в G. Грамматика
G называется неоднозначной, если L(G) содержит неоднозначные
в G цепочки.
44
а)
б)
Рис.21
Язык L называется неоднозначным, если для него не существует однозначной грамматики.
Например, L={anbncm, anbmcm , n,m 1} – неоднозначный язык в
классе КС-грамматик.
Регулярные выражения всегда задают однозначный язык: можно построить детерминированный автомат, и каждой цепочке
(однозначному проходу по диаграмме) соответствует единственное
синтаксическое дерево, т.к. этот проход задаёт однозначный порядок применения правил.
Неоднозначные грамматики часто проще однозначных, но они
пригодны только для построения цепочек, а не для их анализа, т.е.
задания семантики.
Для задания структуры цепочек часто используются СУ-схемы,
т.е. схемы синтаксически управляемого перевода.
СУ- схема T=< Vвх,Vвых, VN, I, R>, где Vвх – входной алфавит ,
Vвых – выходной алфавит , VN – множество нетерминалов, I –
начальный нетерминал, R={ A1,2}, где A VN, 1(Vвх VN)*,
2(Vвых VN)*, а «,» – метасимвол, разделяющий 1 и 2. При
этом количество и состав нетерминалов в 1 и 2 совпадают. Если
в 1 более одного вхождения некоторого нетерминала А, то устанавливается соответствие между всеми вхождениями А в 1 и 2:
А(1), А(2)…А(n).
45
СУ-схема называется простой, если порядок вхождений нетерминалов в 1 совпадают с порядком вхождений нетерминалов в 2.
Вывод в СУ-схеме строится из пары начальных символов <I, I>.
Определение выводимости в СУ-схеме подобно определению
выводимости (выводимость за один шаг обозначаем )для обычных грамматик:
11 22 (из 11 непосредственно выводима
22)  11 А 2, 21 1 2 1=1 А 2, 2 =1 2 2, и
А1,2 R, при этом вхождения А в 1 и 1 –соответствующие.
Выводимость является рефлексивным и транзитивным замыканием непосредственной выводимости.
Применение СУ-схемы к цепочке состоит в том, из пары
начальных символов по правилам схемы строится вывод таким
образом, чтобы до запятой получилась исходная цепочка, в этом
случае после запятой получается перевод этой цепочки.
Перевод, порождаемый СУ-схемой Т:
(T) = {<x,y>/ <I, I> + <x,y> & xVвх*, yVвых*}.
Из СУ-схемы T можно извлечь две грамматики Gвх=< VN,Vвх,
I, Rвх>, где Rвх={A 1/ A1,2 R} и Gвых=< VN, Vвых, I, Rвых>,
где Rвых={A 2/ A1,2 R}.
СУ-схемы позволяют задавать структуры на уровне описания
языка, где (T) = {<x,y>/ x – входная цепочка, y – выходная цепочка}.
Например, СУ-схема Т, описывающая перевод арифметического выражения, составленного с использованием символов сложения, умножения и скобок, в скобочную запись, отражающую порядок построения формулы (а следовательно, и порядок проведения
вычислений), выглядит следующим образом.
S T+S, (T+S);
S T,T;
TMT, (MT);
TM, M;
M (S), (S);
M i, ( i ).
Применение данной СУ- схемы к цепочке i+ii проиллюстрируем выводом (приводится левый вывод):
46
<S,S>  <T+S, (T+S)>  <M+S, (M+S)>  <i+ S, ((i)+S)> 
 < i + T, ( ( i ) + T) >  < i + M  T , ( ( i ) + ( M  T ) ) > 
 < i + i  T, ( ( i ) + ( ( i )  T ) )>  < i+ i  M, ( ( i ) + ((i)M))> 
 <i+ii,((i)+((i)(i))) >
В результате получается перевод цепочки, отражающий порядок её построения.
Можно построить СУ-схему для других преобразований цепочки, например, для построения по цепочке её польской записи. СУсхема для построения прямой польской записи для цепочек, использующих только знаки умножения и сложения, выглядит следующим образом:
S T+S, +TS;
S T, T;
T MT, MT;
T M, M;
M (S), S;
M i, i.
Применение этой схемы к цепочке i+ii:
<S,S><Т+S,+TS><M+S,+MS><i+S,+iS><i+T,+iT>
 <i+ MT,+i  M T ><i+ iM,+ i  i M ><i+ ii,+ i i i >.
Следует обратить внимание, что в обоих случаях применяемые
СУ-схемы были простыми.
9. Преобразования КС-грамматик
В данном разделе приводятся такие преобразования грамматик,
которые не выводят нас из класса эквивалентности, т.е. грамматика
G1 таким образом преобразуется в грамматику G2, чтобы
L(G1)=L(G2).
9.1 Устранение непроизводящих правил
Непроизводящими правилами грамматики называются правила,
применение которых никогда не приводит к построению терминальных цепочек.
Например, пусть правила для нетерминала А имеют следующий
вид и других правил для А нет:
АА А В А
47
В этом случае, появившись в цепочке, нетерминал А никогда не
будет заменен терминальной цепочкой. Естественно, в реальности
ситуации бывают не столь простые.
Алгоритм устранения непроизводящих нетерминалов.
Пусть дана грамматика G = < VN, VT,S, R>, строится эквивалентная грамматика без непроизводящих символов G’ = < VN’,
VT, S, R’>.
1. Построение множества производящих нетерминалов NR:
1.1) Строится множество NR1 = {A/ A j,  jVT*}
1.2) Последовательно строятся множества NRi+1={ A/ A j,
j(NRiVT)*}
1.3) Построение продолжается до тех пор, пока не получим
NRi+1= NRi или же NRi= VN. Тогда NR = NRi.
2. Исключаем из грамматики все правила, в которых присутствуют нетерминалы из VN\ NR.
Например, рассмотрим грамматику G14 с множеством правил
S ABBC;
A AAAB;
B bBa;
СсСd AC.
Построим множество NR. NR1={B,C}, NR2={S, B, C}, NR3= NR2=
=NR.
Правила преобразованной грамматики:
S BC;
B bBa;
СсСd .
9.2. Устранение недостижимых нетерминалов
Недостижимыми нетерминалами называются нетерминалы, которые никогда не могут быть построены при построении вывода,
начиная с начального символа грамматики.
Следует отметить, что такие нетерминалы в грамматиках встречаются в основном тогда, когда исключены некоторые непроизводящие символы, т.е. недостижимым нетерминал становится чаще
всего после исключения некоторых непроизводящих символов.
Например, если в грамматике правила для нетерминала А: АА
48
А В А, и нетерминал В не встречается в других правых частях
правил грамматики, то в этом случае, после устранения нетерминала А нетерминал В становится недостижимым, и, следовательно,
его можно исключить из грамматики без изменения порождаемого
ей языка. Построение множества недостижимых нетерминалов
похоже на построение множества непроизводящих нетерминалов:
строится множество всех достижимых нетерминалов, а затем
исключаются все остальные нетерминалы грамматики.
Алгоритм преобразования грамматики.
Строится грамматика, в которой используются только достижимые нетерминалы (множество достижимых нетерминалов – D) ,
выглядит следующим образом:
Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика без недостижимых нетерминалов G’ =< VN’,
VT, S, R’>.
1. Построение множества достижимых нетерминалов:
1.1) Начальное значение D0=S.
1.2) Итерационное построение множества D:
Di+1= Di  { A/B  AR B Di}
1.3) Построение продолжается до тех пор, пока Di+1= Di или Di+1=
=VN, в обоих случаях VN’= Di+1,
2. Построение множества правил преобразованной грамматики:
R’={ Ri / Ri=(A), A VN’, ( VN’ VT)*}. Построенная грамматика не содержит недостижимых нетерминалов.
Например, рассмотрим грамматику G15 с множеством правил
S A C B C;
A AD DF;
D aA  D A;
F b F;
B bBa;
СсСd.
Тогда здесь A и D непроизводящие нетерминалы, после их
устранения нетерминал F становится недостижимым, поэтому
нетерминалы A, D и F могут быть исключены из грамматики с
сохранением языка, порождаемого грамматикой.
Правила преобразованной грамматики:
49
S B C
B bBa
СсСd
9.3. Устранение -правил
Устранение -правил связано с исключением построения цепочек, которые после преобразований превращаются в пустую цепочку. Цель такого преобразования грамматики – если в грамматике строится пустая цепочка, то она строится в результате первого
шага построения. Применение любого из оставшихся правил приводит к построению непустых цепочек, более того, цепочка, получающаяся из каждого нетерминала, состоит не менее чем из одного
терминального символа.
Алгоритм преобразования грамматики.
Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика G’ =< VN’, VT, S, R’>.
1. Построение множества N = { A / A +  } – множества нетерминальных символов, из которых возможен вывод пустой цепочки. Множество N строится итерационно.
1.1) На первом шаге строится N0:
N0 = { B / B    R}
1.2) Последовательно строятся множества
Ni+1 = Ni { B / B    R &   ( Ni)* }.
1.3) Построение продолжается до тех пор, пока не получим Ni+1 =
= Ni, тогда N = Ni.
2. Построение R’ — множества правил эквивалентной грамматики:
2.1) если A0 B1 1 B2 ... Bk k  R , k  0 и Bi  N для 0  i  k,
но ни один символ в цепочках j, 1  j  k не содержит символа из N, то включить в R’ все правила вида A  0 X1 1 X2
... Xkk, где Xi — либо Bi, либо  (при этом правило A   не
включать; это соответствует случаю, когда все i =  );
2.2) если S  N, включить в R’ также правило S’ S, где S’ –
новый начальный символ.
50
Таким образом, любая КС-грамматика может быть приведена к
виду, когда R либо не содержит -правил, либо есть точно одно
правило S’   и S’ не встречается в правых частях остальных
правил из R.
Например, пусть дана грамматика G16 с множеством правил
SA B BC;
A aAb  ;
B dBc ;
C CCAc . Строим N0= {A, C}, N1= {A, C}= N. Поскольку L(G) (т.к. S N), правила грамматики примут вид
SA B B BC;
A aAb ab;
B dBc;
C CCAc c .
9.4. Устранение цепных правил (правил вида А  В)
Применение цепных правил приводит к увеличению длины ветвей синтаксического дерева, исключение цепных правил часто
приводит к большей «прозрачности» грамматики и уменьшению
длины выводов, которые можно построить.
Алгоритм исключения цепных правил.
Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика G’ =< VN’, VT, S, R’> без цепных правил.
1. Построение для каждого A VN множества NA = { B / A  B },
т.е. множества нетерминальных символов, выводимых из данного символа. Итерационная процедура построения NA:
1.1)
Начальное значение NA0 ={A}.
1.2)
NAi+1 = NAi { C / B  C  R & B  NAi }.
1.3)
Построение продолжается до тех пор, пока не получим
NAi+1 = NAi, тогда NA = NAi
2. Построение множества R’ (множества правил эквивалентной
грамматики): если B    R и не является цепным правилом,
то включить в R’ все правила вида A  , для всех таких A,
что B  NA.
51
Рассмотрим пример. Пусть множество правил грамматики
G17 имеет вид:
ST+ST;
T MTM;
M (S) i .
Построим для данной грамматики множества NA: NS ={S, T, M};
NT = {T, M}; NM = {M}.
После преобразования грамматики она примет вид:
ST+S MT(S) i ;
T MT (S) i ;
M (S) i .
В данном случае преобразование грамматики не привело к её
упрощению, но построенные синтаксические деревья будут иметь
меньшую глубину, и построение дерева будет происходить быстрее.
Грамматика называется неукорачивающей, если для любого
правила грамматики  выполняется. Такое определение применимо как к КС-грамматикам, так и к КЗ-грамматикам. Аграмматика также может быть неукорачивающей. Для КС и Аграмматик необходимым и достаточным условием принадлежности к классу неукорачивающих грамматик является отсутствие в
них -правил.
Грамматика называется приведенной, если она неукорачивающая и не содержит непроизводящих символов.
Поэтому, если L(G), то существует приведенная грамматика
G1, такая, что L(G1)=L(G).
В случае же L(G), существует эквивалентная грамматика с
единственным укорачивающим правилом.
10. Разрешимые и неразрешимые свойства КСграмматик
10.1. Разрешимые свойства КС-грамматик
Теорема 13. Свойство L(G) разрешимо для КС-грамматик.
Разрешимость этого свойства обеспечивается алгоритмом исключения -правил, приведенным в разделе 9.
Теорема 14. Если G=< VT,VN, S, R> – КС, неукорачивающая
грамматика, то язык L(G) разрешим, т.е. для любой цепочки 
VT* можно определить, L(G) или же L(G).
52
Доказательство.
Пусть L(G) и =n. Тогда существует вывод цепочки :
S,…, , ,…, , … , , т.е. некоторая цепочка  может встретиться
в выводе более одного раза. Тогда, удалив из вывода фрагмент
,…, ,получим опять вывод цепочки .
Значит, для любого слова L(G) существует его бесповторный вывод в G, т.е. вывод, в котором все цепочки различны, причем длина каждой цепочки  n. Число таких цепочек ограничено
i
n
числом r (n)   Vn  VT , а значит, число выводов ограничена
i 1
числом r(n)! (в принципе можно дать более точную оценку, но
здесь достаточно и этой). Откуда получается простой алгоритм
распознавания L(G) или же L(G)?
Перебираем все бесповторные последовательности цепочек
длины  n , в которых каждая следующая цепочка не короче предшествующей, и проверяем, является ли она выводом в данной
грамматике. Сложность такой проверки ограничена, т.к. на каждом
шаге проверяем выводимость ai+1 из ai. Если хоть одна последовательность является выводом требуемой цепочки, то L(G), иначе
L(G).
Теорема 15. Если G – приведенная грамматика без цепных правил, то существуют константы с1 и с2, зависящие от G, такие что
для любого вывода () цепочки L(G) c1 ()c2,
где  () – длина вывода цепочки .
Доказательство.
Пусть имеется грамматика G=< VT,VN, S, R>. Вводятся обозначения K – VN, L – максимальная длина правой части правила в
R, т.е. L={max A R & A VN}. Так как G не содержит
цепных и укорачивающих правил, то для любого вывода K ,
>, значит, для вывода SK, , следовательно,
()K, с другой стороны, L(), поэтому,
L (), что требовалось доказать.
Теорема 16. Если G=< VN, VT,S, R> – КС-грамматика, то L(G)
бесконечен  существует нетерминальный символ Ai такой, что
S* x Ai y, Ai+ z Ai w, zw 1, и Ai+ v, где x, y, z, w,v VT*.
Доказательство.
53
Считаем, что рассматриваемая грамматика не содержит цепных
правил.
1.Доказательство бесконечности языка при условии S* x Ai y,
Ai+ z Aiw, z w 1 и Ai+v очевидно, так как при данных условиях фрагмент вывода Ai+ z Aiw может быть включен в вывод
произвольное число раз; следовательно, S+ x v y, и S+ x zj v
wjy для всех j0,что и обеспечивает построение бесконечного
множества цепочек заданного вида.
2. Пусть язык, порождаемый грамматикой, является бесконечным, а условие теоремы не выполняется. Тогда максимальная
глубина (длина ветви) синтаксического дерева для цепочки, порождаемой грамматикой, не превышает  VN . Число таких деревьев конечно, значит, конечно число цепочек, порождаемых грамматикой.
Если же язык бесконечен, то глубина деревьев не ограничена,
значит, в каком-нибудь синтаксическом дереве Т существует
нетерминал Ai, через который ветвь дерева проходит неоднократно, причем это дерево соответствует выводу терминальной цепочки. Поэтому
во-первых, существует путь из начальной вершины в данную
вершину S*  Ai, *x, *y, где x, yVT*;
во-вторых, в силу выводимости из Ai терминальной цепочки,
Ai+ v  vVT*;
в третьих, из-за повторения нетерминала Ai в ветви дерева
Ai+Ai, *z, *w, где z, w  VT*, значит, Ai+ z Aiw , и
вследствие отсутствия цепных правил,z w 1. Что и требовалось
доказать.
Из доказанной теоремы следует
Следствие 1. Для КС-грамматики G=< VN, VT, S, R> существуют числа p, q, такие, что для любой цепочки L(G), если 
p, то она имеет вид  =     , где  ,    q, и для
любого n цепочка вида nn L(G), n0.
Следствие 2. Язык {an bn cn, n} не порождается КСграмматикой.
Теорема 17. Свойство L(G)= разрешимо для КС-грамматик.
54
Разрешимость свойства следует из рассмотренных ранее алгоритмов: Язык L(G) не пуст тогда и только тогда, когда начальный
символ грамматики является производящим.
10.2. Неразрешимые свойства КС-грамматик
Поскольку класс множеств (слов), порождаемых грамматиками,
совпадает с классом перечислимых множеств, то для языков класса
«0» справедлив аналог теоремы Райса «никакое нетривиальное
свойство языков класса 0 не является алгоритмически разрешимым» (т.е. для нетривиального свойства не существует алгоритма,
который бы по произвольной грамматике G выяснял, обладает ли
данным свойством язык L(G)).
Для КЗ-грамматик проблемы пустоты и бесконечности неразрешимы. Для КС-грамматик эти проблемы разрешимы.
Неразрешимые проблемы для КС-грамматик следуют из неразрешимости проблемы Поста.
Формулировка этой проблемы в виде, удобном для наших целей, следующая: для двух списков цепочек X=(1, 2,…, m) и
Y=( 1,  2,…,  m) в алфавите U определить, существует ли последовательность индексов i1, i2,…, in, такая, что выполняется
i1 i2 ... in  i1 i2 ...in .
Пусть U и m фиксированы. Введём алфавит дополнительных
символов U0={b1,b2,…bm}, U0  U=,
U1= U0 U. Пусть X=(1, 2,…, m) – цепочки в U. Тогда Q(X) –
множество цепочек вида bin ... bi2 bi1 i1 i2 ... in , n1.
Тогда для Q(X) справедливы утверждения:
1. Если X=(1, 2,…, m) и Y=( 1,  2,…,  m) – списки цепочек в U, то комбинаторная проблема Поста разрешима тогда и
только тогда, когда разрешимо свойство Q(X)  Q(Y) =.
Пусть
существует

Q(X)
и
Q(Y).
Тогда
  bin ... bi2 bi1 i1 i2 ... in  bin ... bi2 bi1 i1 i2 ... in , а значит,
i1 i2 ... in  i1 i2 ... in .
2. Для любого списка X=(1, 2,…, m) цепочек в U, Q(X) – КСязык в U1. Соответствующая КС-грамматика G=< VN, VT,S, R> для
языка Q(X) – G=< {I} , U1, I, R>; R = { Ibi I i, Ibi i }. Грамматика является однозначной.
55
Из введенных утверждений следует теорема:
Теорема 18. Не существует алгоритма, который по двум КСграмматикам G1 и G2 определял бы L(G1) L(G2)=?
Доказательство.
Если бы такой алгоритм существовал, то проблема Поста была
бы разрешима.
Теорема 19. Не существует алгоритма, который по любой КСграмматике позволял бы определить, является ли эта грамматика
однозначной.
Доказательство.
Рассмотрим множества Q(X) для X=(1, 2,…, m) и Q(Y) для
Y=( 1,  2,…,  m). Правила грамматики для порождения Q(X):
RX={Abi A i, Abi i } правила грамматики для построения
множества Q(Y): RY={ Bbi B  i, Bbi  i }.
Грамматика для порождения Q(X)Q(Y) G=<{A,B},U, I, R>,
где R=RXRY {IAB}. Эта грамматика однозначна, если
Q(X)Q(Y)=, а это свойство неразрешимо.
Другие неразрешимые проблемы для КС-языков:
1. Является ли КС-языком пересечение КС-языка?
2. Является ли КС-языком дополнение КС-языков?
3. Проблема тривиальности КС-языка L=V*(= проблеме пустоты
дополнения)?
4. Проблема эквивалентности КС-грамматик.
11. Синтаксический анализ для КС-языков
Синтаксический анализ может рассматриваться в широком или
же узком смысле. Синтаксический анализ в узком смысле – по
цепочке определить её структуру (или же построить синтаксическое дерево), то есть задача сводится к построению вывода данной
цепочки в данной грамматике.
Синтаксический анализ в широком смысле – определение, можно ли данную цепочку построить с использованием данной грамматики. Это в общем случае гораздо более сложная задача.
Существующие алгоритмы синтаксического анализа классифицируются по способу:
1. построения вывода (нисходящие, восходящие, смешанные);
56
2. выбора альтернативы (детерминированные и недетерминированные). В первом случае на каждом шаге выбирается правильная
альтернатива, во втором – альтернатива выбирается наугад;
3. возврата (для недетерминированного выбора альтернативы) –
разбор с быстрым или медленным возвратом, а так же
4. степени доступности цепочки: или цепочка доступна вся сразу,
или же читается слева направо посимвольно (при этом доступно
для анализа определенное число символов).
Обычно рассматривается нисходящий или восходящий разбор
при чтении цепочки слева направо.
11.1. Типовая задача синтаксического анализа
Имеется активный нетерминал S, множество альтернатив для
него Sk и текущее состояние анализируемой цепочки
y.
Пусть выбрана альтернатива SX1X2…Xn, XiVNVT, при
i[1,n].
Если X1 VT, то он должен совпадать с первым символом цепочки y. Если совпадает, то укорачиваем цепочку на этот символ и
переходим к X2. Если не совпадает, то переходим к другой альтернативе.
Если же XiVN, тогда из Xi необходимо вывести какое-нибудь
начало цепочки y. Если из Xi нельзя вывести никакое начало цепочки y, то возможны 2 варианта:
1. Перейти к Xi-1 и попытаться вывести из Xi-1 другое начало и
т.д. ( получаем полный перебор вариантов вывода) – разбор с
медленным возвратом.
2. Сразу отказаться от альтернативы SX1X2…Xn и выбрать
другую (разбор с быстрым возвратом).
Очевидно, что наиболее удобными при анализе цепочек являются грамматики, допускающие детерминированный разбор, когда
на каждом шаге мы можем однозначно выбрать альтернативу, и в
случае невозможности подобрать нужную альтернативу цепочка не
принадлежит языку (никакой вывод не может быть построен).
Одним из таких типов грамматик являются LL(k)-грамматики.
57
11.2. LL(k)-грамматики
LL(k)-грамматиками называются грамматики, допускающие детерминированное построение левого разбора (left) при чтении
анализируемой цепочки слева (left) направо, при подсматривании
вперед не более чем на k символов.
Например, рассмотрим грамматику G18 с множеством правил:
S a SbB;
B  b B .
Эта грамматика является LL(1)-грамматикой, т.к. для выбора
правильной альтернативы на каждом шаге нам достаточно анализировать один (текущий) символ цепочки.
Грамматика называется разделённой, если все правила грамматики имеют вид:Aa11a2 2…akk, причём aiaj при ij,
aiVT, i(VTVN)* при i[1,k]. Очевидно, что в случае разделённой грамматики строится детерминированный нисходящий разбор.
Очевидно, что разделённые грамматики принадлежат к классу
LL(1)-грамматик.
Грамматики могут оказаться LL(k)-грамматиками для различных k, например, грамматика может быть LL(3)-грамматикой, но
не LL(2)-грамматикой. Бывают и грамматики, которые не являются LL(k)-грамматикой ни для какого k.
Например, рассмотрим грамматику G19 с множеством правил:
S 0 A0B
A  0 A ac
L(G)= {0n+1 c an, 0n+1 d bn, n 0}
B  0 B bd
В этой грамматике возможны выводы: S A n+10n+1 с an и
SB n+1 0n+1 d bn ( n  0 ).
Чтобы определить по заданной терминальной цепочке, какое
правило ( S  A или S  B ) было применено на первом шаге
вывода, нужно прочитать n+1 символ, следовательно данная грамматика не является LL(k) ни при каком k.
Дадим формальное определение LL(k) грамматики. Для этого
введем определение
u, uy  x, u  k

first k (x)   x, 0  x  k

, x  

58
т.е. определяются первые k символов терминальной цепочки. Так
как для пустой цепочки это пустое множество, то определим для
данной грамматики пополненную грамматику, в которой не будут
встречаться пустые цепочки:
Для грамматики G=< VN, VT, S, R> соответствующая пополненная грамматика G’=< VN{S’}, VT{$}, S’, R’>, где множество
правил R’=R{S’ S $ }, здесь каждая цепочка имеет справа
граничный маркер ($).
Расширим определение множества first k так, чтобы охватить
произвольные цепочки (VTVN)*:
Для (VTVN)* Firstk()= { x/ * Z, ZVT*, x= first k (Z) }.
Например, рассмотрим грамматику G20 с множеством правил
S  abAabB;
A  ab A c;
L(G)= {(ab)nc, (abc)n, n 1}
B  cab Bc .
Правила соответствующей пополненной грамматики:
S’ S $;
S  abAabB;
A  ab A c;
B  cab Bc.
Для данной грамматики
First1(S’)=First1(S)={a},
First1(A)={a,
c},
First1(B)={c};
First2(S)={ab}, First2(A)={ab, c}, First2(B)={c, ca}, First2(S’)=
=First2(S)={ab}; First3(S)= First3(S’)={abc, aba}, First3(A)={abc,
aba, c}, First3(A$)={abc, aba, c$},First3(B)={c, cab}, First3(B$)={c$,
cab}.
Тогда мы можем формально определить LL(k)-грамматику как
грамматику, для которой для любых двух левых выводов
S* A      * x
S* A      * y
AVN, , x, y  VT*,     (VN  VT)*, из условия
Firstk(x)=Firstk(y) следует .
Несложно показать, что данное формальное определение соответствует неформальному.
Теорема 20. LL(k)-грамматика является однозначной.
59
Неоднозначность грамматики противоречит LL(k) свойству.
Неоднозначна – значит, существуют два вывода для некоторой
цепочки, поэтому не сможем определить по k символам, какое из
правил следует применить.
Теорема 21. КС-грамматика G=< VN, VT, S, R> является LL(k)грамматикой  для любых двух правил А1 и А2 и для
любой цепочки , такой что S*A из условия 12 следует,
что Firstk(1 ) Firstk(2 )=.
Использование LL(k) свойства при построении анализатора.
1. Пусть текущее состояние левого вывода цепочки z=y имеет
вид А, где  – выведенное терминальное начало цепочки, А –
текущий нетерминал( самый левый нетерминал), y – не просмотренная часть цепочки.
2. Рассмотрим Firstk(y). Пусть для нетерминала А существуют
альтернативы: А12n R. Надо найти i для применения
на данном шаге.

3. Вычисляем M Ai (  ) = Firstk(i). Это множество может быть
заранее вычислено для всех А, , i. При этом из LL(k) свойства


следует, что M Ai ( )  M Aj (  )   при ij.
4. Выбираем i, такое, что Firstk(y)= Firstk(i). Если такого i
нет, то zL(G).
5. Переходим к анализу полученной цепочки ’y’ (xy’y’),
где ’ – терминальное начало цепочки 1. Шаги повторяются,
пока не разберём всю цепочку, или не установим, что zL(G).
Пример:
Рассмотрим анализ цепочки acbbd в грамматике G21
S ac SbB;
B  b Bd.
Эта грамматика является LL(1) грамматикой. На первом шаге
определяем, какое правило применялось вначале: First1(acS)={a},
First1(bB)={b}, поэтому на первом шаге применяется правило S
ac S, выведенная цепочка принимает вид: acS, First1(bbd)={b},
поэтому применяется правило S  bB, и выведенная цепочка
принимает вид acbB. Определяем First1(bB)={b}, First1(d)={d},
60
поэтому применяемое правило B  b B, выведенная цепочка
принимает вид acbbB, применяем правило B  d, получаем исходную цепочку acbbd, значит, анализируемая цепочка принадлежит языку, порождаемому грамматикой.
Проблемы, возникающие при построении анализатора для
LL(k)-грамматик:
1. При k1 MAi ( ) может стать неприемлемо большой, т.к.

M Ai ( ) пропорциональна k.

2. M Ai (  ) является функцией от трёх переменных: А, i, , т.е.
велик сам объём предварительных вычислений.
Однако можно упростить задачу, усилив условия, накладываемые на грамматику.

Обозначим M Ai 

First k (i  ) и потребуем, чтобы
S*  A 
i
A
j
M  M A   при ij.
Грамматика G называется строго LL(k)-грамматикой, если для
любых двух левых выводов
S*1 A 1 1  1 *1x
S*2A 2  2  2  *2 y
AVN, 1, 2, x, y  VT*, 1 2    (VN  VT)*, из условия
Firstk(x)=Firstk(y) следует .
Несложно показать, что G является строго LL(k)-грамматикой
 для любого AVN из того, что AR, AR, , следует
MAMA=.
Теорема 22. LL(1)-грамматика всегда строго LL(1)-грамматика.
Доказательство.
Предположим, что некоторая грамматика G – LL(1) грамматика, но не строго LL(1)-грамматика. Тогда существуют два вывода:
S*1 A 1 1  1 * 1x11* 1x1y1
S*2A 2  2  2  * 2 x22* 2 x2y2,
(AVN, 1, 2, x1,y1, x2,y2  VT*, 1 2    (VN  VT)*), такие, что First1 (x1y1) = First1(x2y2) &  – Условие (*).
Но так как G – LL(1)-грамматика, то
61
S* 1 A 1 1  1* 1x11 * 1x1y1
S* 1 A 1 1  1* 1x21* 1x2y1
(AVN, 1, 2, x1,y1, x2 VT*, 1 2    (VN  VT)*) и из
First1 (x1y1) = First1(x2y1) следует  – Условие (**).
Покажем, что условия (*) и (**) несовместны.
Рассмотрим следующие случаи:
1. x1, x2 , тогда First1(x1y1)=First1(x1), First1(x2y2)=First1(x2),
First1(x1 )=First1(x2) и, по условию (*), .
С другой стороны, по условию (**), из First1(x1 )=First1(x2)
следует . Противоречие.
2. x1=, x2= приводит к неоднозначности грамматики.
3. Пусть x1=, x2. Тогда в условии (*)First1(x1y1)=First1(y1)=
=First1(x2y2)=First1(x2) & .
По условию (**) First1(x1y1)=First1(y1)= First1(x2y1)=First1(x2) &
=. Противоречие.
4. Случай 4, x1, x2= разбирается аналогично случаю 3.
Из теоремы следует критерий принадлежности грамматики
классу LL(1):
G – LL(1) грамматика  AVN, , AR & AR &
First1 ( )
&   MAMA=, где MA=

S *  A 
При этом если
а) , *, , то MA=First1()
б) *, MA=First1()
First1 ( )

S *  A 
Определим множество Follow1(X)={a/ S+Xa&aVT}, для
X(VNVT).
Тогда условие б) можно переписать следующим образом:
б) *, MA=First1()Follow1(A).
Так как рассматриваем пополненную грамматику, то 
(First1()=).
Определения и алгоритмы нахождения множеств First и Follow
1. First1()
1.1. First1()=
1.2. aVT First1(a)=a
62
First1(A)={ First1(xi) / Ax1x2…xnR & (i=1  i=m &
& x1…xm-1+)}
1.4. First1(x1x2…xn)={ First1(xi)/ i=1i=m&x1…xm-1+}
Например, рассмотрим грамматику G22 с правилами:
S  ABCCA;
Aa;
B  b B;
CcCd .
В пополненной грамматике добавляется начальное правило
S’ S$:
S’ S $;
S  ABCCA;
Aa;
B  b B;
CcCd .
First1(A)={a};
First1(B)={b};
First1(C)={c,d};
First1(S)= First1(ABC) First1(CA)={a, b, c, d}.
1.
Follow1(A)=
First1 ( ) ={First1()/ S * A  }.

S *  A 
Рассматриваем грамматику без непроизводящих правил, тогда если
S * B    A  , то First1( ) Follow1(A).
1.1. , *, , тогда First1()=First1().
1.2. *, тогда First1()=First1()First1().
Поэтому Follow1(A)={ First1(Xm)/ B A X1 X2…XnR &
& (m=1X1X2…Xm-1*)} {Follow1(B)/B A  R &*}
То есть просматриваются все правые части правил, в которые
входит исследуемый нетерминал.
Рассмотрим пополненную грамматику G23, в этой грамматике
N={A,B};
Follow1(S)={$},
Follow1(A)= First1(B) First1(C)  Follow1(S)={b, c, d, $},
Follow1(B)= First1(C)={c,d},
Follow1(C)= First1(A)  Follow1(S)={a,$}.
Проанализируем LL(1)-свойство грамматики:
63
MSABC= First1(A) First1(B) First1(C)={a, b, c, d},
MSCA= First1(C)={c,d}.
Так как MSABC MSCA , то грамматика не является LL(1) –
грамматикой.
11.3. Восходящий анализ
При восходящем анализе цепочка сворачивается путем применения правил в обратном порядке (дерево вывода строится снизу
вверх).
Введенные строки анализируются слева направо, полученные
подстроки сопоставляются с правыми частями правил грамматики,
и при совпадении заменяются на соответствующий нетерминальный символ в левой части правила (свёртка). Цепочка, заменяемая
на этот символ, называется основой.
Если свёртываемая основа выбирается случайно, то может потребоваться возврат, и тогда число шагов построения вывода
пропорционально длине цепочки.
Среди грамматик выделяется класс LR(k)-грамматик – тот тип
грамматик, для которых однозначно восстанавливается правый
вывод (R) при чтении цепочки слева (L) направо, при подглядывании вперёд не более чем на k символов.
Алгоритм такого разбора в общем случае сложен, поэтому чаще
всего рассматривается удобный подкласс класса LR(k)-грамматик
– грамматики простого предшествования (ГПП ). Грамматики
простого предшествования – частный случай LR(k) грамматик, в
которых для выделения основы используются отношения простого
предшествования.
Пусть цепочка z получена в грамматике G=< VN, VT, S, R> с
помощью правого вывода:
S 12…. n=x (VT)*.
Тогда при восходящем анализе будем иметь
z= n ├  n-1 …├  0 = S.
Выделим i-й шаг вывода S*Ay (= i-1)   y (= i)*x y,
здесь Ay – текущее состояние правого вывода, A – самый правый
нетерминал в выводе. Свёртка состоит в переходе от   y к Ay,
(  y├ Ay) т.е. мы должны выделить подцепочку , которая
64
сворачивается в нетерминал A применением правила A  в
обратном порядке.
Пример разбора цепочки для грамматики G21(курсивом выделена основа): acacbbd├ acacbbB ├ acacbB ├ acacS ├ acS ├ S
Для ГПП техника выделения основы следующая:
строится матрица отношений предшествования между символами VTVN. При этом между парой символов х и y может существовать не более одного отношения предшествования, обозначаемого символами <, ≗, >.
Отношения предшествования отражают порядок появления
символов в правом выводе.
Если   y – текущее состояние цепочки, где  – основа, то
между:
1. всеми смежными символами цепочки  выполняется отношение < или ≗ .
2. последним символом цепочки  и первым символом цепочки
 (основы) выполняется отношение < .
3. смежными символами основы выполняются отношения ≗.
4. последним символом основы и первым символом цепочки у
выполняется отношение >.
Если такое свойство отношений имеет место и для каждой пары
символов определено не более одного отношения, то основу легко
выделить, просматривая цепочку y слева направо до тех пор,
пока впервые не встретится отношение >. Для нахождения левого
конца основы надо возвращаться назад, пока впервые не встретится отношение < . Цепочка, заключенная между < и >, и будет
основой. Если в грамматике нет правил с одинаковыми правыми
частями, то однозначно находится нетерминал А, такой, что A 
 , что позволяет свернуть основу, получая цепочку  i-1 .
Этот процесс продолжается до тех пор, пока цепочка либо не
свернется к начальному символу S, либо дальнейшие свертки
окажутся невозможными.
Отношения простого предшествования с указанными свойствами могут быть определены на VNVT следующим образом [1]:
X < Y, если в R есть правило A  X B , и при этом BY;
X ≗ Y, если в R есть правило A  X Y .
Отношение > определяется на (VNVT)  VT , так как
непосредственно справа от основы может быть только терминальный символ.
65
X > a, если в R есть правило A  B Y , и B +  X, Y* a .
Так как основа может являться правым или левым концом цепочки, то удобно заключить анализируемую цепочку в концевые
маркеры $ и $, положив X > $ для всех X VNVT, для которых
S   X и $ < X для всех X VNVT, для которых S  X .
Грамматика G называется грамматикой простого предшествования, если она не содержит -правил, для любой пары символов
из VNVT выполняется не более одного отношения простого
предшествования и в ней нет правил с одинаковыми правыми
частями.
Выполнение этих требований, очевидно, гарантирует возможность на любом шаге разбора однозначно выделить основу и произвести свертку.
Пример. Пусть множество правил грамматики G24: S a S S b,
S c. Для заключения цепочки в маркеры вводим новый начальный символ S’и правило S’$S$. Отношения предшествования
для этой грамматики приведены в таблице 1.
Таблица 1
S
a
b
c
$
S
≗ < ≗ < ≗
a
≗
<
≗
>
>
<
b
c
$
<
>
>
>
>
<
>
>
Разбор цепочки $accb$:
$<a<c>cb$├$<a≗S<c>b$├$<a≗S≗S≗b>$├$S$
Вывод, соответствующий этому разбору:
S’ $ S $  $ a S S b $  $ a S c b $  $ a c c b $
Способ построения свёртки для цепочки связан с использованием
стека, куда посимвольно переносится информация из входного
буфера, до тех пор, пока не встретится отношение >. Тогда к
цепочке от отношения > до ближайшего слева отношения <
должна применяться свёртка.
66
Алгоритм разбора для ГПП.
1. Анализируемая цепочка заключается в маркеры.
2. Берём очередной символ из входного буфера (слева направо).
Если между верхним символом стека и первым символом входной
цепочки отношение < или ≗ , то заносим этот символ из входной
цепочки в стек и возвращаемся к шагу 2; если же между верхним
символом стека и первым символом входной цепочки отношение
>, то переходим к шагу 3. Если между символами нет никакого
отношения предшествования, то цепочка не принадлежит языку,
порождаемому грамматикой.
3. Обратное движение: из стека вынимаются символы до первого отношения < между первым символом стека и символом цепочки во входном буфере. Если такой символ появился, то переходим к шагу 4, иначе цепочка не принадлежит языку, порождаемому
грамматикой.
4. Применяем свёртку (заменяем выделенный фрагмент на левую часть правила грамматики, правая часть которого совпадает с
основой) и возвращаемся к шагу 2. Если свёртка неприменима (нет
такой правой части правила), то цепочка не принадлежит языку,
порождаемому грамматикой.
Если в результате применения свёртки приходим к цепочке
$ S $, то исходная цепочка принадлежит языку, порождаемому
грамматикой, в противном случае цепочка не принадлежит языку,
порождаемому грамматикой.
Обозначим
Head(A)={X/A+X} (First1(A)=Head(A)VT),
Tail(A)= {X/A+  X},
тогда
X < Y  A X B  & Y Head(B)
X  > a  A B C  & X Tail(B) & aFirst1(C).
Пример разбора цепочки aaccbbcb с использованием построенной таблицы отношений предшествования приведен в табл.2.
67
Таблица 2
Стек
$
$a
$aa
$aac
$aaS
$aaSc
$aaSS
$aaSSb
$aS
$aSc
$aSS
$aSSb
$S
Отношение
Входная
предшествования строка
aaccbcb$
accbcb$
ccbcb$
cbcb$
cbcb$
bcb$
bcb$
cb$
cb$
b$
b$
$
$
<
<
<
>
<
>
≗
>
<
>
≗
>
Операция
сдвиг
сдвиг
сдвиг
«Свертка»
сдвиг
«Свертка»
сдвиг
«Свертка»
сдвиг
«Свертка»
сдвиг
«Свертка»
«Конец»
12.Элементы теории конечных автоматов
12.1. Автомат Мили
Конечный автомат (автомат Мили) S=< Va, Q, Vb, q0, F, G>,
где
Va={a1,a2,…, am}, m1 – входной алфавит автомата,
Vb= {b1, b2, …, bn}, n1 – выходной алфавит автомата,
Q= {q0,q1,…, qk}, k0 – внутренний алфавит (алфавит состояний),
q0Q – начальное состояние автомата,
F – функция переходов; F: Q Va Q,
G – функция выходов, G: Q Va  Vb .
Автомат однозначно задает отображение Va*  Vb* (входной
цепочки в выходную).
Здесь рассматриваются инициальные автоматы, где входное состояние задано статически, в ряде случаев начальное состояние
рассматривается как q0= q(0).
Например, автомат S1=< Va, Q, Vb, q0, F, G>:
68
Пусть Va = Vb= {a, b}, Q = {A, B}, q0=A. Функции переходов и
выходов могут быть заданы в функциональной форме:
F(A, a) = A;
G(A, a) = a;
F(A, b) = B;
G(A, b) = a;
F(B, a) = A;
G(B, a) = b;
F(B, b) = B;
G(B, b) = b.
Эти функции так же могут быть заданы в виде объединенной
таблицы входов-выходов, в которой по столбцам указаны исходные состояния, по строкам – входы, в соответствующей ячейке
через запятую указываются состояние, в которое переходит автомат и соответствующий выходной сигнал.
A
B
a
A, a
A, b
b
B, a
B, b
Граф переходов автомата определяется следующим образом:
множество вершин графа: каждому элементу множества Q соответствует вершина;
множество ребер определяется отображениями F и G, причём F
определяет связи (переходы состояний), а G – выходы. Если
f(qi,aj)=qk и g(qi,aj)=bs, то на диаграмме рисуется дуга из qi в qk с
пометкой aj/bs (входной символ/ выходной символ).
Диаграмма (граф переходов автомата), представляющая автомат
S1, изображена на рис. 22.
Рис. 22
Модель автомата – абстрактное устройство с входной и выходной лентами и управляющей головкой. В каждый момент времени
автомат находится в одном из состояний множества Q, воспринимает один из символов входного алфавита (содержащийся в ячейке, с которой происходит считывание), и печатает один символ
69
выходного алфавита на выходной ленте. Время считаем дискретным.
Существуют две традиции в задании автоматов. Первая из них –
явное задание дискретного времени, т.е. номера такта tN (N =
{0,1,2,…}), a(t)Va, b(t) Vb, q(t) Q.
Тогда работа автомата описывается с помощью рекуррентных
соотношений:
q(t+1)=f (q(t),a(t))
b(t)=g(q(t),a(t))
Иногда рассматривается b(t+1)=g(q(t),a(t)) – автомат с задержкой; далее такие автоматы не рассматриваются.
Отображения F и G в общем случае частичные, но g(qi,aj) определено только, если определено f(qi,aj). Если f(qi,aj) определено, а
g(qi,aj) не определено, то вместо выходного символа ставится
прочерк.
Пример. Пусть граф переходов автомата представлен на рис.23.
При входной цепочке aabb получается выходная цепочка cdcc.
Рис.23
Рис.24
Функции переходов и выходов определяют автоматное отображение Va*Vb* . При этом для любой входной цепочки
=a1a2….ak – f(q0, a1a2….ak )= f(…f(f(q0, a1), a2)…. ak )
Дадим эквивалентное индуктивное определение:
1. f(qi, aj) определяется по таблице перехода автомата,
2. f(qi,  aj)= f (f(qi, ), aj).
Соответствующая функция выхода:
70
1. g(qi, aj) определяется по таблице перехода автомата,
2. g(qi,  aj)= g (f(qi, ), aj).
Тогда входному слову =a1a2….ak ставится в соответствие выходное слово ()=g(q0,a1)g(q0,a1 a2) …g (q0, a1a2….ak).
Это отображение, ставящее в соответствие входным словам выходные слова, называется автоматным отображением, или автоматным оператором, реализуемым автоматом S. Автоматный
оператор обозначается: S()=.
Автоматное отображение можно определить индуктивно, как и
функцию переходов:
1. S(qi, aj)= g(qi, aj),
2. S(qi,  aj)= S(qi, ) g (f(qi, ), aj).
Как и ранее, длина цепочки  обозначается.
Свойства автоматного отображения (S() рассматриваем как
S(q0, )):
1.  и  = S() имеют одинаковую длину  S().
2. Если =12, и S(12)=12, где 1=1, то S(1)= 1.
То есть автоматный оператор является оператором без «предвосхищения», без заглядывания вперед, например, невозможно
построить инверсию слова.
Определим, что состояние qj достижимо из состояния qi, если
 Va*, такое, что f(qi, )=qj.
Автомат S называется сильно связным, если любое состояние
достижимо из любого другого.
Два автомата S и T изоморфны, если входы, выходы и состояния автомата S можно переименовать таким образом, чтобы таблица переходов автомата S превратилась в таблицу переходов автомата Т.
Например, автомат на рис. 23 изоморфен автомату на рис. 24
Соответствия: входов: a – b, b – a; выходов: c – c, d – f ; состояний: q0 – qA, q1 – qB, q2 – qC.
Пусть T и S – автоматы с одинаковыми входными и выходными
алфавитами. Состояние q автомата S и состояние r автомата T
называются неразличимыми, если для любой входной цепочки
Va* выполнено S(q,)=T(r,). При T=S говорят о неразличимых состояниях одного автомата.
71
Если неразличимы входные состояния двух автоматов, то они
реализуют одно и то же автоматное отображение. В этом случае
автоматы эквивалентны.
Переход от автомата к эквивалентному – эквивалентное преобразование автомата. Одним из таких преобразований является
минимизация числа состояний автомата.
Метод Хафмена минимизации числа состояний автомата
Этот метод работает как для лингвистических автоматов, так и
для автоматов Мили.
Идея – объединение в один класс предположительно эквивалентных состояний, а затем проверка, являются ли состояния
действительно эквивалентными (неразличимыми). Затем, если
состояния не эквивалентны, классы разбиваем на подклассы, и
проверка повторяется. Если состояния ведут себя одинаково, то
процедура закончена и получившиеся классы являются состояниями минимизированного автомата.
Например, рассмотрим автомат SD, диаграмма которого представлена на рис. 25
Рис.25
Алгоритм минимизации автомата
1. Составляем таблицы переходов и выходов. По строкам указываются входы, по столбцам – состояния, в первом подстолбце
каждого столбца указаны переходы, во втором – соответствующие
выходы.
72
A
B
C
D
E
F
G
0 B 1 D 1 E 0 D 1 A 0 G 0 D 0
1 F 0 C 0 G 1 C 0 F 1 E 1 C 1
2. Составляем классы предположительно эквивалентных состояний (состояний, при переходе из которых при одинаковых входах
выдаются одинаковые выходы, т.е. тех, у которых одинаковы
вторые подстолбцы).
В данном случае это классы K1= {A, B, D}, K2= {C, E, F, G}.
3. Составляем таблицу переходов, в которой вместо состояний
указываются классы, которым принадлежат состояния. Для
наглядности в таблицу добавлена строка, с указанием номера
классов, которым принадлежат состояния.
№ класса
1
1
2
1
2
2
2
Вход\состояние A B C D E F G
0
K1 K1 K 2 K1 K1 K2 K 1
1
K2 K2 K 2 K2 K2 K2 K 2
Если в пределах одного класса состояния ведут себя поразному, то класс разбивается на подклассы, включающие состояния, ведущие себя одинаково, и возвращаемся к шагу 3 (в рассматриваемом случае классы разбиваются, таблицы приводятся после
алгоритма).
4. Если во всех классах состояния ведут себя одинаково, то это
действительно классы эквивалентности. Строится автомат, состояниями которого являются классы эквивалентности исходного
автомата.
В нашем примере класс К2 разбивается на 2 класса: К3= {C, F} и
К4 = {E,G}
№ класса
1
1
3
1
4
3
4
Вход\состояние A B C D E F G
0
K 1 K 1 К 4 K 1 К1 К4 К 1
1
К3 К3 К 4 К3 К3 К4 К 3
После этого разбиения состояния в классах действительно эквиваленты. Диаграмма полученного автомата представлена на рис.26.
Этот автомат эквивалентен исходному автомату SD.
73
Рис.26
12.2. Автоматы Мура
Автоматы Мура отличаются от автоматов Мили тем, что здесь
одному состоянию (а не переходу) соответствует один выход.
Конечный автомат Мура: S=< Va, Q, Vb, q0, F, G>, где
Va={a1,a2,…, am}, m1 – входной алфавит автомата,
Vb= {b1, b2, …, bn}, n1 – выходной алфавит автомата,
Q = {q0,q1,…, qk}, k0 – внутренний алфавит (алфавит состояний),
q0Q – начальное состояние автомата (инициальный автомат,
иногда рассматривают q0= q(0)),
F – функция переходов; F: Q Va Q,
G – функция выходов, G: Q  Vb .
Приняты две схемы задания автоматов Мура:
Первая схема
Вторая схема
q (t+1) =f (q(t), a(t))
q (t+1) =f (q(t), a(t))
b(t)= g(q(t))
b(t)= g(q(t+1))
При работе по первой схеме выход автомата однозначно соответствует состоянию, из которого совершается переход, по второй
– состоянию, в которое автомат переходит. Хотя при записи уравнений первая схема выглядит более естественно, условие второй
схемы реализовать проще: в соответствующих автоматах Мили для
первой схемы должны быть одинаковые выходы на всех дугах,
выходящих из состояния, для второй – одинаковые выходы должны быть на дугах, ведущих в состояние. Первое условие может
выполняться, а может и не выполняться, выполнения второго
74
условия можно достичь с помощью эквивалентного преобразования автомата.
Рассмотрим автомат Мура, представленный на рис. 27
Рис.27
Здесь выходы, соответствующие состояниям, изображены справа от состояния. Если рассматривать работу автомата по первой
схеме, то входу aabb будет соответствовать выход EDDC, если же
по второй схеме, то этому же входу соответствует выход DDCE.
По автомату Мура всегда можно построить автомат Мили.
Автомат Мили, эквивалентный автомату Мура, представленному на рис. 27, при работе по первой схеме, дан на рис. 28(все дуги,
ведущие из состояния, имеют одинаковые выходы), а при работе
по второй схеме – на рис.29 (все дуги, ведущие в состояние, имеют
одинаковые выходы).
Рис.28
Рис.29
Очевидно, что по автомату Мура всегда можно построить автомат Мили.
75
По выразительной мощности эти модели (автоматы Мили и
Мура) эквивалентны, если используется вторая схема для представления автоматов Мура.
Построение автомата Мура (вторая схема) по автомату Мили:
а) если все дуги, ведущие в некоторое состояние qk, имеют одинаковые выходные пометки bs, то эта пометка просто переносится
на это состояние (рис.30).
Рис. 30
Формально это условие для состояния qk и выхода bs можно
записать так:
qi,qj,an,am (f(qi,an)= f(qj,am)= qk  g(qi,an)= g(qj,am)= bs);
б) общий случай: в некоторые вершины ведут дуги, помеченные
разными символами. В этом случае все такие вершины qk расщепляются на множество вершин (расщепление состояния), помечаемых символами <qk,bj> (рис.31). Условная запись расщепления
состояний:qk{<qk, bj>/ f(qi, a)=qk, g(qi, a)=bj}
Рис. 31
В общем случае число состояний увеличивается. Затем для
каждого состояния qi исходного автомата Мили и для каждой дуги
из состояния qi в состояние qk с пометкой ap/bs (ap – вход, bs –
выход) строятся дуги из всех <qi,bj> в <qk, bs> и помечаются ap.
76
Кроме того, если начальное состояние q0 расщепилось, вводится
новое начальное состояние, в которое не ведет ни одна дуга.
Затем приписываем состояниям соответствующие выходы и переобозначаем состояния.
Например, рассмотрим автомат Мили (рис. 32, а), приведенный
так же на рис. 25. У этого автомата состояния q1 и q2 расщепляются, а q0 не расщепляется, поэтому новое входное состояние не
вводится. Полученный эквивалентный автомат Мура приведён на
рис. 32,б. Тот же автомат после переобозначения состояний приведен на рис. 32,в.
Рис. 32
Полный алгоритм построения эквивалентного автомата Мура
по автомату Мили выглядит следующим образом:
1) расщепляем состояния;
77
2) вводим дополнительное входное состояние (если входное
состояние расщепилось);
3) строим дуги, соответствующие дугам исходного автомата;
4) переносим выходные символы на соответствующие состояния;
5) переобозначаем состояния.
Таким образом, установлено соответствие между разными типами автоматов.
12.3. Частичные автоматы
Автомат S называется частичным автоматом, если хотя бы одна
из двух функций (F или G) не полностью определена, т.е. для
некоторых пар (состояние, вход) значение F или G не определено
(обозначается прочерками в таблице).
Состояния A и B называются псевдоэквивалентными (обозначается AB), если для них одновременно не определены или определены и равны функции F и G. Эти функции для частичных автоматов определяются следующим образом:
f(qi,)
1) f(qi, aj) – по таблице переходов автомата
2) если f(qi,) определена, то f(qi, aj)f(f(qi,),aj)
3) если f(qi,) не определена, то не определена и f(qi, aj) для
всех aj.
g(qi, aj)
1) g(qi, aj) – по таблице автомата
2) g(qi,  aj)  g (f(qi,), aj).
3) Автоматное отображение:
4) S(qi, aj)= g(qi, aj) (если g(qi, aj) не определено, то S(qi, aj) считаем равным прочерку)
5) если f(qi,) определена, то S(qi, aj)=S(qi,) g(f(qi,) aj). Если
g(f(qi,), aj) не определена, то считаем её равной прочерку)
6) если f(qi,) не определена, то не определено и S(qi, aj) для
всех aj.
Входное слово , для которого S(q0,) определено, называется
допустимым для S.
Отметим неравноправность функций f и g – неопределенность g
не препятствует допустимости слова, а неопределенность функции
f для некоторого слова означает недопустимость любого его продолжения.
78
Состояния qi  S и rjT псевдонеотличимы (псевдоэквивалентны), если для любой цепочки  S(qi,)T(rj,) (т.е. области определённости и неопределённости для qi и rj совпадают, и в области
определённости отображения совпадают).
Автоматы S и T псевдонеотличимы, если для любого состояния
автомата S найдётся псевдонеотличимое от него состояние автомата T, и, наоборот, для любого состояния автомата T найдётся
псевдонеотличимое от него состояние автомата S.
Для полностью определённых автоматов псевдонеотличимость
совпадает с обычной неотличимостью.
Отношение псевдонеотличимости является отношением эквивалентности.
Пример псевдоэквивалентных автоматов приведён на рис.33 а,б.
Рис.33
Состояниям первого автомата соответствуют состояния: S0 – A,
S1 – C, S2 – B и D, S3 – B, D; соответствия состояния второго автомата: A – S0, B – S3 и S2, C – S1, D – S2 и S3.
Недостаток введённого определения псевдоэквивалентности –
необходимость совпадения областей определения. Можно дать
эквивалентное определение, не требующее анализа совпадения
областей: вводим новое, дополнительное состояние, переход в
которое осуществляется при отсутствии перехода по данному
входу, для которого переход по любому входу осуществляется в
само себя, а в функции выхода прочерк будем рассматривать как
дополнительную букву. Таким образом, автомат становится полностью определённым.
Минимизация не полностью определённых автоматов возможна
двух типов: «строгая», с сохранением областей определения (что
79
производится просто, как для доопределённого автомата), и через
покрытия состояний, когда требуется совпадение переходов только
в области определённости[3], здесь не рассматривается.
Если проводить строгую минимизацию, то автомат на рис. 33, а
минимизируется до автомата, граф переходов которого приведен
на рис. 34.
Рис. 34
Два основных аспекта работы автомата:
1. Автоматы распознают входные слова, т.е. отвечают на вопрос М? (распознаватели)
2. Преобразуют входные слова в выходные ( автоматные
отображения):
Сравним эти аспекты работы автоматов. С одной стороны, последовательность ответов распознавателя на входные слова а1,
а1а2, а1а2а3, … образуют выходное слово, которое является автоматным отображением; с другой стороны, выходные буквы можно
разбить на два класса С1 и С2, и считать, что слово распознаётся,
если g(q0,) С1. Таким образом, эти два представления автоматов
являются эквивалентными.
Автомат может интерпретироваться как дискретное устройство,
входная буква – входной сигнал, выходное слово – последовательность выходных сигналов.
Хотя с помощью автоматов может быть представлен достаточно
широкий класс событий, существуют ограничения на вид событий,
задаваемых автоматами, одно из них описывается в следующей
теореме.
Теорема 23. Существуют события, не представимые в конечных автоматах: никакая непериодическая последовательность не
распознаваема в конечных автоматах (например, последовательность 010110111011110111110…)
Доказательство.
80
Пусть непериодическая последовательность a1a2…aj… распознаётся автоматом S с n состояниями. Любой начального отрезок последовательности a1a2…aj также является допустимым,
следовательно, f(q0,a1a2…aj)= qk Q1 (множество состояний, соответствующих допустимым цепочкам). При этом автомат проходит
последовательность состояний из конечного множества Q1, значит,
некоторое состояние встретится дважды: qs=qs+p. Это означает, что
f(qs, as+1…as+p)=qs, поэтому периодическая последовательность
также будет распознаваться автоматом, и, следовательно, непериодическая последовательность не может распознаваться конечным
автоматом вопреки предположению.
13. Сети автоматов. Их анализ и синтез
Автомат (Мили) называется комбинационным, если для любого
входного символа a и любых состояний qi и qj g(qi,a)=g(qj,a).
Неформально, в комбинационном автомате выходной символ не
зависит от текущего состояния и определяется входным символом
(все состояния автомата в данном случае эквивалентны, т.е. минимизированный автомат будет иметь всего одно состояние).
Комбинационный автомат называется логическим, если его
входной алфавит состоит из 2m двоичных наборов длиной m, а
выходной алфавит – 2n двоичных наборов длиной n. Тогда функция выхода – набор из n логических функций от m переменных.
Можно получать автоматные блок-схемы, например, схему, представленную на рис. 35.
Рис. 35
Следует отметить, что автоматы в такой схеме должны уметь
останавливаться.
81
Возможны различные случаи рассмотрения автоматных схем.
1. Алфавиты автоматов не пересекаются. В этом случае действуют обычные правила минимизации для частичных автоматов, и для
правильных последовательностей входных сигналов число суммарное состояний получаемого автомата – max Qi.
2. Входные алфавиты исходных автоматов совпадают или включают друг друга. Тогда множество состояний является объединением множества состояний исходных состояний, затем могут
производиться эквивалентные преобразования автомата, в этом
случае число состояний   Qi.
В любом случае блок-схема автоматов, работающих последовательно – конечный автомат S, значит, множество автоматов замкнуто относительно операции условного и безусловного перехода( следовательно, каждая программа и каждый алгоритм являются
автоматом).
13.1. Синхронные сети автоматов
Поскольку автомат – устройство с входом и выходом, то присоединение к входам одного автомата выходов другого автомата
образует сеть, или схему автоматов.
Под состоянием сети из m автоматов S1, S2,…,Sm понимается
вектор (qi1,…,qim), где каждое qij – состояние автомата j в момент
времени i. В общем случае число состояний автомата, полученного
в результате построения сети, – произведение чисел состояний
исходных автоматов.
Является ли полученная схема автоматом?
Один из способов введения времени – синхронный: такты, границы тактов нумеруются натуральными числами, начиная с 0.
Длина такта рассматривается как единица времени. Входное
слово – временная последовательность сигналов (импульсов).
Интервал между соседними импульсами – длина такта. Слово
длины k будет обрабатываться за k тактов. Входная информация
(последовательность входных сигналов) – a(t).
Автоматная функция f реализуется с задержкой; f (q(t),
a(t))=q(t+1), q(0) –задаётся отдельно (вместо задания q0 в инициальных автоматах), обычно g(q(t),a(t))=b(t), ( иногда g(q(t),a(t))=
b(t+1), тогда задаётся b(0)).
Рассмотрим различные виды соединения автоматов.
82
Пусть даны автоматы S1 =<A1, Q1,V1, q01, F1,G1> и S2 =<A2,
Q2,V2, q02, F2,G2>
1. Параллельное соединение автоматов:
1.1) с разделительными входами и алфавитами А1 и А2 (рис. 36,а),
В получаемом автомате S =<A, Q, V, q0, F, G> входной алфавит
A= А1А2, внутренний алфавит Q= Q1Q2, выходной алфавит V=
V1V2, q0=(q01, q02). S называется прямым произведением автоматов S1 и S2. В этом случае a=(a1,a2); здесь верхний индекс означает
отнесение к соответствующему алфавиту. Функция переходов
f((q1,q2), (a1,a2)) = (f1(q1,a1),f2(q2,a2)).
Рис. 36
Мы рассмотрели случай двух входов и двух выходов. Может
быть рассмотрен случай произвольное число входов и выходов.
1.2) с общим входом и алфавитом А (рис. 36,б).
В получаемом автомате S =<A, Q, V, q0, F, G> функция переходов f((q1,q2), a)=(f1(q1,a),f2(q2,a)).
Определение выходов в обоих случаях очевидно.
2. Последовательное соединение автоматов (рис.37).
Рис.37
В получаемом автомате S =<A, Q, V, q0, F,G> A=A1, V=V2,
V1=A2, Q= Q1Q2. Для F и G существенна задержка g1. Если задержка g1 равна 0, т.е. g1(q1(t), a(t))=v1(t), то q(t+1) =
=(q1(t+1),q2(t+1)) = (f1(q1(t),a(t)), f2(q2(t), g1 (q1(t),a(t)))), т.е. зависимость q(t+1) существует только от q(t), a(t), при этом состояние
q(t+1)=f(q(t),a(t)), выход g((q1,q2),a)=g2(q2,g1(q1,a)).
83
Если же задержка g1 равна 1, т.е. g1(q1(t), a(t))=v1(t+1), то
q(t+1)= (f1(q1(t),a(t)), f2(q2(t), g1 (q1(t-1),a(t-1)))), и такой простой
зависимости, как для прошлого случая, нет.
Пример.
Рассмотрим схему (диаграмма автоматов представлена на рис.
38) из двух элементов задержки, воспроизводящих вход через 1
такт. S1 и S2 имеют по два состояния, начальное значение выхода
=0, S()=00 – 2 (отбрасываются два последних символа последовательности).
Рис. 38
Таблица переходов автомата, реализующего задержку:
q0
q1
0
q 0, 0
q0, 1
1
q 1, 0
q1, 1
Считаем, что задержка g равна 0, g(q(t),a(t))= v(t)=g(t).
Обозначим состояние (qi,qj) через i j. Тогда таблица переходов/выходов результирующего автомата следующая:
0
0
1
1
0
1
0
1
0
0
0
0
0
0,0
0,1
1,0
1,1
1
1
1
1
1
0,0
0,1
1,0
1,1
Таким образом, цепь из двух элементов задержки описывается
автоматом без задержки.
3) Соединение автоматов с обратной связью. Общая схема представлена на рис. 39.
84
Рис.39
Если рассматривать вариант обратной связи без задержки, то
могут возникать противоречия. Например, если g(x1,x2) – функция
Шеффера x1  x 2 и v(t)=0, тогда x2=0, значит, v(t)=1, а при x1=1
это даёт v(t)=0. Возникает противоречие в определении состояния
автомата, т.е. в реальности состояние будет не определено. Поэтому в общую схему автомата вводится задержка (рис.39).
Рис.40
Всякий автомат при синхронной интерпретации может быть реализован как сеть, составленная из комбинационных автоматов и
элементов задержки.
На рис. 40 приведена схема для автомата с функциями
q(t+1)=f(q(t),a(t));
v(t)=g(q(t),a(t)) .
На рис. 40:
g – комбинационный автомат с входным алфавитом AQ и выходным алфавитом V,
f – комбинационный автомат с входным алфавитом AQ и выходным алфавитом Q,
D – блок задержки (на 1 такт).
D – реализуется автоматом Мура, входной и выходной алфавит
которого Q= { q1, q2,…, qn}, множество состояний этого автомата –
– R={r1,r2,…,rn}, RQ, функции g(ri)=qi, fD(ri,qj)=rj.
Частный случай D – двоичный элемент задержки, тогда
q’(t)=f(q(t), a(t))= q(t+1).
В важном частном случае, когда A,V,Q состоят из двоичных
наборов, f и g – логические комбинационные автоматы, двоичные
85
выходы которых в момент t являются логическими функциями от
двоичных переменных, образующих наборы a(t) и q(t), D – параллельное соединение элементов задержки. Число элементов
задержки равно длине вектора Q, а число состояний D равно
мощности внутреннего алфавита Q= 2n.
Так как произвольные конечные алфавиты могут быть закодированы двоичными наборами, то получается следующая теорема.
Теорема 24. Любой конечный автомат при любом двоичном
кодировании может быть реализован синхронной сетью из логических комбинационных автоматов и двоичных задержек, причем
число задержек не может быть меньше log2Q.
13.2. Правильно построенные логические сети
Сеть из логических блоков и элементов задержки будем называть правильно построенной логической сетью (ППЛС), если
1. к каждому входу блока сети присоединён не более чем
один выход блока сети (однако допускается присоединение выхода
более чем к одному входу, т.е. допускается разветвление выходов);
2. в каждом контуре обратной связи, т.е. в каждом цикле, образованном блоками и соединениями между ними, имеется не
менее одного элемента задержки.
Входами такой сети называются те входы блоков, к которым не
присоединены никакие выходы, выходами сети называются те
выходы блоков, которые не присоединены ни к каким входам.
Схематическое изображение ППЛС приведено на рис.41.
Рис. 41
86
На представленной схеме:
Mx – множество входных векторов,
Mz – множество выходных векторов,
My- – множество векторов, характеризующих входные каналы
обратной связи (памяти),
My+ – множество векторов, характеризующих выходные каналы
обратной связи (памяти).
Каждый из каналов в случае k-значной логики может находиться в одном из k значений из множества {0, 1,…,k-1}.
Правила вывода в грамматике, соответствующей автомату,
можно определить как подстановку
XY+ Z Y-, Y+(t=0)=Y0+, Y+(t+)=Y-(t).
Состояния каналов обратной связи будем называть внутренними состояниями автомата, а  – временем перехода из одного
состояния в другое, причём  может быть постоянной для данного
автомата или же зависеть от изменения X. В первом случае автомат называется синхронным, во втором – асинхронным.
При заданном значении Y0+ последовательность входных векторов X (входная последовательность) однозначно определяет последовательность векторов Z (выходную последовательность).
По Глушкову – ЭВМ – преобразователь информации, который
целесообразно рассматривать как композицию пар автоматов
(операционный + управляющий).
Объём памяти управляющего автомата (число внутренних состояний автомата) обычно гораздо меньше объема памяти операционного автомата.
Общая структура такого автомата, отображающего структуру
ЭВМ, представлена на рис.42.
Рис. 42
87
На схеме цифрами обозначены:
1 – преобразуемая информация;
2 – результат преобразования;
3 – управляющее воздействие, соответствующее реализуемому
алгоритму;
4 – признаки, характеризующие результат;
5 – сигнал, определяющий выполняемое преобразование и его
начало;
6 – сигнал окончания операции.
При этом каналы 1-2 – информационные, а каналы 3-6– управляющие.
Основные этапы проектирования автоматов подробно разобраны в [4,5] и здесь не рассматриваются.
Литература
1. Сергиевский Г.М. Лингвистические модели. М.: МИФИ, 1983.
2. Рейуорд-Смит В.Дж. Теория формальных языков. М.: Радио и
связь, 1988.
3. Кузнецов О.П., Адельсон-Вельский Г.М. Дискретная математика для инженера.М.: Энергоатомиздат, 1988
4. Горбатов В.А. Основы дискретной математики. М.: Высшая
школа, 1986
5. Горбатов В.А. Фундаментальные основы дискретной математики. М.: Наука, 2000.
88
Download