Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Теория вычислительных процессов и структур. Учебное пособие
.pdf
является множество X Y, элементами которого являются упорядоченные пары (x, y) для всех возможных x X и y Y.
Таким образом, применяя операцию конкатенации к любой паре цепочек из множества A*, мы получим в результате цепочку, также
принадлежащую множеству A*.
3. Отсутствие коммутативности:
γ • В ≠ В • γ.
4. Пустая цепочка ε является нейтральным («единичным»)
элементом:
ε • В = В • ε = B.
5. Длина конкатенации двух цепочек равняется сумме длин
этих цепочек:
|γ • В| = |γ| + |В|.
Из общей алгебры известно, что множество с заданной на нем
ассоциативной бинарной операцией называется полугруппой. Если по-
лугруппа включает нейтральный элемент, то она называется моноидом.
Таким образом, согласно представленным выше свойствам и определениям, множество А* является моноидом, а множество А*\{ε} – полугруппой.
В качестве примера рассмотрим множество букв латинского
алфавита. Пусть множество цепочек, составленных из семи букв,
представляет собой формальный язык L1. Если мы введем еще одно
условие и потребуем, чтобы все указанные цепочки можно было найти
в каком-нибудь конкретном словаре (например, терминологическом
или орфографическом), то получим другой формальный язык L2, причем очевидно, что множество L2 будет являться подмножеством L1.
Теперь, опираясь на определение конкатенации, определим
произведение двух множеств. Пусть M и N – некоторые подмножества
множества А*. Произведением множеств M и N называется множество
K цепочек, являющихся конкатенацией цепочек из В и С, т.е.
K = {X • Y | Х M, Y N}.
Будем использовать запись
K = MN.
11

Зная определение произведения множеств, мы можем ввести
0*n
n
AA
.
1
.
n
n
AA
понятие возведения в степень. Рассмотрим алфавит А. Обозначим
множество, состоящее из {ε}, как A0. Тогда степень алфавита A будет
определена как
n - 1
An = A
A n 1.
Множество всех возможных цепочек алфавита может быть
представлено как объединение всех степеней этого алфавита:
.
Выражение в правой части называют итерацией алфавита A.
Если исключить из нее пустую цепочку ε, соответствующую нулевой
степени A, то получим усеченную итерацию алфавита A:
Если X, Y A*, и существуют такие цепочки U, V A*, что
Y = U • X • V,
то цепочку X называют подцепочкой цепочки Y.
Если при этом U = ε, то X называют головой цепочки Y, а если
V = ε, – то, соответственно, хвостом.
Правила, согласно которым любой цепочке X = UPiV ставится в
соответствие цепочка
Y = UQiV (X A*, Y A*, (P1, Q1),… (Pn, Qn) A* A*, i = 1, 2,…n),
называются соотношениями Туэ. При этом цепочки X и Y называются
смежными, если цепочка Y получается из цепочки X однократным
применением одного соотношения Туэ (производится замена Pi на Qi).
Если существует такая последовательность цепочек X0, X1,…, Xn,
что i > 0 X
и Xi – смежные, то говорят, что цепочка Xn соотносима
i–1
с цепочкой X0.
В качестве примера рассмотрим множество букв русского ал-
фавита. Пусть на этом множестве определено соотношение Туэ, поз-
12

воляющее заменить любую букву в слове на любую другую букву.
Выберем X0 = КРАН. Применяя на каждом шаге выбранное соотношение Туэ, можно получить следующую последовательность: X0 = КРАН,
X1 = УРАН, X2 = УРОН, X3 = УРОК, X4 = СРОК, X5 = СТОК. Любые две
цепочки в данной последовательности являются смежными, откуда
следует, что цепочки КРАН и СТОК соотносимы в смысле заданного
соотношения Туэ.
Соотношения Туэ могут быть двух- и односторонними. В по-
следнем случае их называют полусоотношениями Туэ, или продукциями.
Соотношения Туэ являются двусторонними, если цепочка X является смежной по отношению к цепочке Y, и наоборот, цепочка Y является смежной по отношению к цепочке X. Для односторонних соотношений Туэ, соответственно, цепочка X является смежной по отношению к цепочке Y, но Y не является смежной по отношению к цепочке X.
Продукции обозначаются следующим образом:
(P1 → Q1), (P2 → Q2), …, (Pn → Qn).
Если при этом существуют такие цепочки U и V, что
X = UPiV, Y = UQiV,
а (Pi → Qi) – продукция из данного набора, то говорят, что цепочка Y
непосредственно порождается из цепочки X, и пишут: X Y.
Если существует такая последовательность цепочек
X0, X1,…, Xn, что i > 0 X
Xi, то говорят, что цепочка Xn порож-
i–1
дается цепочкой X0.
2.2. Формальные грамматики и формальные языки
Как мы уже отмечали ранее, формальные грамматики позволяют порождать правильные цепочки данного языка, а также определять принадлежность отдельно взятой цепочки данному языку. Сформулируем теперь определение формальной грамматики на языке математики. Для этого введем еще несколько важных понятий.
Терминальный символ, или терминал – объект, непосредственно присутствующий в словах языка, соответствующего грамматике, и
имеющий конкретное, неизменяемое значение.
13

Чтобы наиболее просто понять этот термин, можно представить
YXG
i
G
i
YX
1
n
G
YX
*
0
себе обычную букву, например, используемую в русском языке. В общем случае в качестве терминалов могут выступать и другие символы,
допускаемые данным алфавитом: цифры, специальные символы и т.д.
Нетерминальный символ, или нетерминал, – объект, обозначающий какую-либо сущность языка и не имеющий конкретного символьного значения.
Нетерминал представляет собой не символ и не конкретное
слово в языке, а сущность. Например, слова русского языка состоят из
букв русского алфавита. Эти буквы являются терминальными символами. А такие понятия, как «слово» или «предложение», являются
нетерминальными символами: это сущности языка. Другие примеры нетерминалов: формула, команда, арифметическое выражение и т.д.
Пусть имеются две цепочки γ и δ, а также правило α → β грамматики G. Тогда про цепочки X и Y – такие, что X = γαδ, Y = γβδ, –
говорят, что цепочка Y непосредственно выводима из цепочки X в
грамматике G, что обозначается как
, т.е. цепочка Y получается
из X подстановкой β вместо α.
Пусть существует такая последовательность цепочек
X0, X1,…, Xn, что i > 0
. Тогда последовательность цепочек
X0, X1,…, Xn – это вывод Хп из Х0 в грамматике G, что обозначается как
.
Рассмотрим язык L. Пусть VТ – алфавит терминальных символов, из которых строятся цепочки этого языка, а VN – алфавит нетерминальных символов, представляющий собой совокупность сущностей языка. Тогда объединение этих двух алфавитов будет представлять
собой словарь языка L:
V = VN VT.
Будем обозначать элементы алфавита VT строчными латинскими буквами, элементы множества VN – прописными латинскими
буквами, элементы V* – греческими буквами.
Введем множество упорядоченных пар, представляющих собой
продукции, следующим образом:
П = {(, ) | V*VNV*, V+}.
14

Данное определение не предполагает в правой части продук-
*
G
S
ций → возможность пустой цепочки ( ≠ ε), т.к. используется усе-
ченная итерация словаря V+. В литературе также встречается определение, в котором V*.
Определим теперь формальную грамматику G как совокупность следующих четырех объектов:
G = (VT, VN, P, S).
С первыми двумя объектами мы уже познакомились; P П –
не что иное, как правила данной грамматики; S – это начальный сим-
вол, являющийся нетерминалом, который обозначает класс языковых
объектов, для описания которых предназначается данная грамматика.
Например, в грамматике, порождающей предложения, начальным будет символ, обозначающий предложение.
Языком, порожденным грамматикой G, называется множество
всех терминальных цепочек, выводимых из начального символа в
грамматике G. Такой язык обозначается L(G):
L(G) = { | VT*,
}.
Две грамматики называются эквивалентными, если они порождают один и тот же язык.
2.3. Классификация языков Н. Хомского
Американский лингвист Ноам Хомский создал классификацию
формальных языков, в которой определил четыре типа грамматик, с
помощью которых эти языки строятся. Типы нумеруются от 0 до 3.
Каждый тип определяется ограничениями, которые налагаются на
продукцию (правило грамматики) → .
Тип 0. Какие-либо ограничения на продукции отсутствуют.
Тип 1. На продукцию наложено единственное ограничение,
касающееся длины цепочек:
|| ||.
Такие грамматики называются контекстно-зависимыми
(КЗ-грамматиками).
15

Тип 2. Цепочка состоит из одного нетерминального символа:
VN. Такие грамматики называют бесконтекстными, или контекст-
но-свободными (КС-грамматики).
Тип 3. Этот тип поддерживает наиболее жесткие ограничения.
Во-первых, VN. Во-вторых, VTVN, либо VT, т.е. может
состоять либо из одного терминального и одного нетерминального
символов, либо из одного терминального символа. Такие грамматики
называются регулярными.
Тип конкретного формального языка соответствует типу грамматики, которая лежит в его основе. Поэтому, когда мы говорим о
классификации формальных грамматик, мы одновременно говорим и о
классификации формальных языков.
Отметим, что множество грамматик, относящихся к типу с
меньшим номером, включает в себя множества грамматик, относящихся к типу с большим номером. Например, грамматику типа 3 можно рассматривать как специальный случай грамматики типа 2. А множество грамматик типа 0, в котором отсутствуют ограничения, очевидно, включает в себя как подмножества множества грамматик всех
остальных типов, в которых ограничения присутствуют (точно также,
например, множество слов русского языка, состоящих из 6 букв, это
лишь подмножество множества всех слов русского языка).
2.4. Пример построения формальной грамматики
и порождения цепочки
Рассмотрим пример, позволяющий подробно проследить по-
строение грамматики и процесс порождения грамматикой правильной
цепочки в рамках конкретного формального языка. Этот язык
будет представлять собой некоторое подмножество множества
арифметических формул. Эти формулы будут содержать целые числа
и знаки арифметических операций. Определим составляющие данного
языка:
Терминальный алфавит
VT ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '*', '/'}.
Нетерминальный алфавит:
VN = {ФОРМУЛА, ЗНАК, ЧИСЛО, ЦИФРА}.
16

Определим правила P следующим образом:
1. ФОРМУЛА → ФОРМУЛА ЗНАК ФОРМУЛА. Правило за-
мены формулы на две формулы, соединенные знаком.
2. ФОРМУЛА → ЧИСЛО. Правило замены формулы на число.
3. ЗНАК → + | – | * | / . Символ « | » соответствует логической
операции «или»; правило замены знака: знак может быть представлен
одним из четырех символов арифметических операций.
4. ЧИСЛО → ЦИФРА. Правило замены числа на цифру.
5. ЧИСЛО → ЧИСЛО ЦИФРА. Правило замены числа на чис-
ло и цифру.
6. ЦИФРА → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9. Правило замены
цифры: цифра может быть представлена как «0», или «1», или «2», или
«3» и так далее до «9».
Начальный нетерминал S: ФОРМУЛА.
Отметим, что здесь в каждом правиле с левой стороны от
стрелки стоит только один нетерминальный символ. Таким образом,
мы построили контекстно-свободную грамматику.
Осуществим вывод выражения «7 * 25» с помощью перечисленных правил вывода. На каждом шаге мы будем производить только
одну элементарную операцию, т.е. замену.
Вывод начинается с начального нетерминального символа:
ФОРМУЛА.
Взглянув на список правил, обнаруживаем, что структура выражения, которое мы хотим вывести, имеет вид, сходный со структурой правила 1. Воспользуемся им:
ФОРМУЛА → ФОРМУЛА ЗНАК ФОРМУЛА.
Наиболее просто из конструкции справа поддается замене нетерминальный символ ЗНАК. Для этого у нас есть правило 3:
ФОРМУЛА ЗНАК ФОРМУЛА → ФОРМУЛА * ФОРМУЛА.
Теперь нам необходимо получить из формул в правой части
нужные нам числа. Сделать это напрямую установленные правила
грамматики не позволяют. Придется применить правила 2, 4, 5, 6.
Начнем с левой ФОРМУЛЫ в выражении, для обозначения которой требуется только один символ цифры. При этом получить цифру
17

из формулы напрямую мы не можем. Нам придется вначале применить правило 2 превращения формулы в число:
ФОРМУЛА * ФОРМУЛА → ЧИСЛО * ФОРМУЛА.
Теперь, применив последовательно правила 4 и 6, мы получим
искомое представление левой части выводимого выражения:
ЧИСЛО * ФОРМУЛА → ЦИФРА* ФОРМУЛА.
ЦИФРА* ФОРМУЛА → 7 * ФОРМУЛА.
Займемся теперь его правой частью. Отметим, что для ее представления нам потребуется уже два символа цифр, поэтому примененных для левой части выражения правил будет недостаточно. Итак,
произведем в соответствии с правилом 2 первую замену:
7 * ФОРМУЛА → 7 * ЧИСЛО.
Если теперь по аналогии с выводом числа 7 мы прибегнем к
правилу 4, то окажемся в тупике, т.к. вместо нетерминала ЦИФРА мы
сможем подставить только один из символов цифр, указанных в этом
правиле. Например, мы сможем построить «2», но не сможем уже после этого дописать «5» и получить «25». Правило, которым нам необходимо здесь воспользоваться, это правило 5:
7 * ЧИСЛО → 7 * ЧИСЛО ЦИФРА.
После этого мы можем получить первую из двух необходимых
нам цифр выводимого числа:
7 * ЧИСЛО ЦИФРА → 7 * ЧИСЛО 5.
Теперь, используя уже знакомую нам схему, по правилам 4 и 6
мы получим вторую нужную нам цифру:
7 * ЧИСЛО 5 → 7 * ЦИФРА 5.
7 * ЦИФРА 5 → 7 * 2 5.
Таким образом, вывод выражения «7 * 25» в рамках построенной грамматики завершен.
18

3. АВТОМАТНЫЕ МОДЕЛИ
Выше мы рассмотрели первый из двух основных способов
описания классификации формальных языков. Этот способ был основан на ограничениях, налагаемых на правила грамматики. Другим способом является классификация языков по принципу распознаваемости
их определенным видом абстрактного распознающего устройства.
Такие устройства называют автоматами. Можно определить взаимно-однозначное соответствие между типами формальных языков по
классификации Хомского и типами распознающих автоматов.
3.1. Конечные автоматы
Изучение автоматов мы начнем с наиболее простого их типа –
конечного автомата. Этот автомат способен распознавать языки только наиболее ограниченного типа по Хомскому – языки типа 3, или регулярные языки. Различают детерминированные и недетерминированные конечные автоматы.
Детерминированный конечный автомат – это совокупность
следующих пяти объектов:
А = (X, Q, δ, q0, F),
где X = {x1,..., xn} – входной алфавит; Q = {q0,…, q
} – алфавит
m–1
состояний автомата; δ : Q X Q – функция переходов; q0 Q – начальное состояние автомата; F Q – множество заключительных
состояний автомата. Все представленные множества конечны.
Если представить себе конечный автомат как реально существующее физическое устройство, то его структура и принципы работы
будут выглядеть следующим образом (рис. 3.1):
Рис. 3.1. Устройство конечного автомата
В его состав входят бесконечная лента, разбитая на ячейки, и
управляющее устройство. На ленте записана некоторая цепочка X*,
19

причем один символ занимает одну ячейку. Ячейки справа и слева от
пусты. Управляющее устройство, начиная с начального состояния
q0Q, движется слева направо вдоль ленты. За один такт своей рабо-
ты, находясь в некотором состоянии qQ, оно может прочитать символ xiX в текущей ячейке, после чего, в соответствии с функцией пе-
реходов δ, перейдет в следующее состояние q'Q.
Зависимость перехода в новое состояние от текущего состояния
и текущего входного символа можно представить следующим образом:
(q, х) q'.
Такое представление называют командой конечного автомата, а
ее левую часть – ситуацией конечного автомата. Число команд конечно.
Команду можно представить также в функциональном виде:
δ(q, х) = q'.
Для графического представления команды наиболее естественным будет использование графов: состояния q и q' будут представлять
собой вершины, а дуга, направленная из q в q', будет помечена символом входного алфавита x (рис. 3.2).
Рис. 3.2. Графическое представление команды автоматы
Распространяя эту идею на все команды данного конечного автомата, получим ориентированный граф, иллюстрирующий правила
его работы, называемый также диаграммой состояний.
Если автомат оказывается в ситуации (q, х), не являющейся левой частью какой-либо его команды, то он завершает свою работу.
Если управляющее устройство прочитает все символы цепочки
с входной ленты и окажется в одном из своих заключительных
состояний qf F, то цепочка допускается данным автоматом. Мно-
жество цепочек, допускаемых данным автоматом, образует его язык.
Следует подчеркнуть, что, если автомат считал целиком всю цепочку
, но не оказался ни в одном из своих заключительных состояний, це-
почка допустимой не является.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
