Ключевые автоматы

advertisement
Ключевые автоматы
• Как было отмечено ранее, конечные автоматы
являются простейшими распознавателями. Конечный
автомат является моделью лексического
анализатора языка.
Определение 14.6
• Недетерминированный конечный автомат – это
пятерка M=(Q, , , q0, F), где
• Q – конечное множество состояний управляющего
устройства;
•  – конечное множество допустимых входных
символов (алфавит входной ленты);
• : Q  2Q (отображение множества Q   в
множество всех подмножество множества Q) функция переходов конечного автомата;
• q0  Q – начальное состояние управляющего
устройства;
• F  Q – множество заключительных состояний.
• Для того, чтобы определить будущее
поведение конечного автомата, нужно знать
лишь:
• текущее состояние управляющего устройства
и
• цепочку символов на входной ленте,
состоящую из символа под головкой и всех
символов, расположенных вправо от него.
Определение 14.7
• Если М = (Q, , , q, F) – конечный автомат, то
пара (q,)  Q  * называется
конфигурацией автомата М.
Определение 14.7
• Конфигурация (q0, ) называется начальной,
а конфигурация (q, ), где qF, а  - пустая
цепочка, называется заключительной (или
допускающей).
• Таким образом, конфигурация конечного автомата
является заключительной лишь тогда, когда справа
от входной головки нет ни одного символа. Если же в
процессе работы состоянием управляющего
устройства является некоторое состояние из
множества заключительных состояний, а справа от
входной головки есть символы, то такая
конфигурация конечного автомата не является
заключительной.
• Такт автомата М представляется бинарным
отношением |-M (или |-, если М подразумевается).
Определим отношение |- следующим образом.
Определение 14.9
• Будем говорить, что между двумя
конфигурациями (q, a) и (q', ) имеет место
отношение |- (записывается как (q, a) |- (q',
)), если q'  (q, a).
• Наличие отношения |- между двумя
конфигурациями конечного автомата говорит
о том, что если М находится в состоянии q, и
входная головка обозревает символ a, то
автомат М может сделать шаг, за который он
переходит в состояние q' и сдвигает головку
на один символ вправо.
• Запись C |- 0M C' означает, что C=C', а C0 |kM Ck (для k1) – что существуют такие
конфигурации C1,…,Ck, что Ci |-M Ci+1 для
всех 0i<k, C |- +M C' означает, что C |- kM C'
для некоторого k1, а C |- *M C'– что C |- kM
C' для k0.
• Таким образом, отношения |- +M, |-*M
являются транзитивным и рефлексивнотранзитивным замыканием отношения |-M.
Определение 14.10
• Будем говорить, что автомат М допускает цепочку ,
если (q0, ) |- *(q, ) для некоторого qF.
Определение 14.10
• Языком, определяемым (распознаваемым,
допускаемым) автоматом М (обозначается L(M)),
называется множество входных цепочек,
допускаемых автоматом М, т. е.
• L(M)={ | * и (q0, ) |-* (q, ) для некоторого qF}
• Язык, допускаемый конечным автоматом,
будем называть конечно-автоматным языком.
• Заметим, что конечный автомат допускает
пустую цепочку, если его начальное
состояние принадлежит множеству
заключительных состояний.
• Одним из способов представления конечных
автоматов является таблица переходов.
Информация размещается в таблице
переходов в соответствии со следующими
соглашениями:
•
•
•
•
•
Столбцы помечены входными символами.
Строки помечены символами состояний.
Элементами таблицы являются множества
(возможно, пустые) символов новых
состояний, если автомат
недетерминированный, либо символ нового
состояния, если автомат
детерминированный.
Первая строка помечена символом
начального состояния.
В детерминированном автомате строки,
соответствующие заключительным
состояниям, помечены справа единицами.
• Пример 14.1.
• Пусть М=({p, q, r}, {0,1}, , p, {r}) – конечный
автомат, где  задаётся следующей
таблицей переходов:
• М допускает все цепочки нулей и единиц,
содержащие два стоящих рядом нуля.
• Начальное состояние p можно интерпретировать
так: «два стоящих рядом нуля еще не появились, и
предыдущий символ не был нулем».
• Состояние q означает, что «два стоящих рядом
нуля еще не появились, но предыдущий символ был
нулем».
• Состояние r означает, что «два стоящих рядом
нуля уже появились».
• Заметим, что, попав в состояние r, автомат М
остается в этом состоянии.
• Для входа 01001 единственной возможной
последовательностью конфигураций,
начинающейся конфигурацией (p,01001), будет
•
•
•
•
•
•
(p,01001) |– (q,1001)
|– (p,001)
|– (q,01)
|– (r,1)
|– (r, )
Таким образом, 01001  L (M).
• Часто бывает удобным использовать графическое
представление конечного автомата в виде
диаграммы (пример такого представления приведен
на рис. 14.2).
Определение 14.12
• Пусть M = (Q, , , q0, F) – недетерминированный
конечный автомат. Диаграммой (или графом
переходов) автомата М называют неупорядоченный
помеченный граф, вершины которого помечены
именами состояний и в котором есть дуга (p, q), если
существует такой символ a  , что q  (p,a). Кроме
того, дуга (p, q) помечается списком, состоящим из
таких a, что q  (p,a). Начальное состояние
указывается на диаграммах направленной в него
стрелкой, помеченной словом "начало", а
заключительные состояния обводятся кружком.
Определение 14.13
• Назовем автомат M = (Q,   q0, F)
детерминированным, если для любой пары q  Q и
a множество (q,a) содержит не более одного
состояния для любых q  Q и a  .
Определение 14.14
• Пусть M = (Q,   q0, F) - конечный автомат. Если
для любой пары q  Q и a множество (q, a) не
пусто, то автомат M назовем полностью
определенным.
• Таким образом, можно ввести следующую
классификацию конечных автоматов:
• 1. Недетерминированный не полностью
определенный: для всех пар q  Q и a имеет
место ((q,a))  0, причем существует хотя бы одна
пара q  Q и a   такая, что ((q,a)) = 0, а также
хотя бы одна пара q'  Q и a'   такая, что ((q',a'))
> 1.
• 2. Недетерминированный полностью определенный:
для всех пар q  Q и a имеет место ((q,a)) > 0,
причем существует хотя бы одна пара q'  Q и a'
такая, что ((q',a')) > 1.
• 3. Детерминированный не полностью определенный:
для всех пар q  Q и a имеет место ((q,a))  1,
причем существует хотя бы одна пара q  Q и a  
такая, что ((q,a)) = 0.
• 4. Детерминированный полностью определенный:
для всех пар q  Q и a имеет место ((q,a)) = 1.
• Конечный автомат примера 15.1. является полностью
определенным детерминированным автоматом.
Определение 14.15
• Состояние p называется достижимым, если
существует такая цепочка w, что (q0, w) |– *
(p, ).
Определение 14.16
• Назовем два конечных автомата M и M'
эквивалентными, если имеет место L(M) =
L(M') (т.е. два конечных автомата являются
эквивалентными, если они допускают
одинаковые языки).
Теорема 14.1
• Если L = L(M) для некоторого недетерминированного
конечного автомата M, то L= L(M') для некоторого
детерминированного конечного автомата M'.
• Доказательство. Пусть M = (Q,   q0, F). Построим
M' = (Q',  ' q'0, F') следующим образом:
• Q' есть множество всех подмножеств Q, т.е.
состояниями автомата M' являются множества
состояний автомата M;
• q'0 = {q0};
• F' состоит из всех таких подмножеств S множества Q,
что S  F  ;
• '(S,a) = S' для всех S  Q, где S' = {p p  (q,a) для
некоторого q  S}.
• Легко показать, что оба автомата эквивалентны.
• Далее будем говорить только о детерминированных
конечных автоматах.
Лемма 14.1
• Если L = L(M) для некоторого конечного автомата M,
то L = L(G) для некоторой праволинейной грамматики
G.
• Доказательство. Пусть M = (Q,   q0, F) – конечный
(детерминированный) автомат. Возьмем грамматику
G = (Q, , P, q0), где схема P определяется
следующим образом:
• q  ar  P, если (q,a) = r,
• p    P, если p  F.
• Покажем индукцией по i, что
• (*) q i+1 w для q  Q тогда и только тогда, когда
(q,w) |– i (r, ) для некоторого r  F.
• Базис для i = 0 очевиден, т.е. q   тогда и только
тогда, когда (q, ) |– 0 (q, ) для q  F.
• Шаг индукции. Предположим, что (*) истинно для i.
Покажем что (*) истинно для i+1. Возьмем w = ax, где
x = i. Тогда q i+1 w равносильно тому, что q  as
 i ax для некоторого s  Q. По определению
грамматики q  as равносильно (q,a) = s. По
предположению индукции s  i x тогда и только
тогда, когда (s, x) |– i-1 (r, ) для некоторого r  F.
Следовательно, q i+1 w равносильно (q,w) |– i (r, ).
• Отсюда заключаем, что q + w тогда и только тогда,
когда (q0,w) |– * (r, ) для некоторого r  F. Таким
образом, L(M) = L(G).
Лемма 14.2
• Пусть  - конечный алфавит. Множества ,
{}, {a} для всех a   являются конечноавтоматными языками.
• Доказательство.
• Любой конечный автомат с пустым
множеством заключительных состояний
допускает язык .
• Пусть M = ({q0},   q0, {q0}), где ((q,a)) = 0
при всех a  . Тогда L = {}.
• Пусть M = ({q0, q1},   q0, {q1}), где
((q0,a)) = q1, а в остальных случаях
функция  не определена. Тогда L = {a}.
Лемма 14.3
• Пусть L1 = L(M1) и L2 = L(M2) для конечных автоматов M1 и M2.
Множества L1 L2, L1 L2, L1* являются конечно-автоматными
языками.
• Доказательство. Пусть M1 =(Q1, 1, 1, q1, F1) и M2 =(Q2, 2,
2, q2, F2), Q1Q2=
• I. Построим конечный автомат M, допускающий язык L1 L2: M
= (Q1  Q2  {q0}, , , q0, F), где
• -  = 1  2;
•
•
•
•
- q0  Q1  Q2 – новое состояние;
- если   L1 L2, то F = F1  F2;
- если   L1 L2, то F = F1  F2  {q0};
- для всех q  Q1 и a   определим (q, a) = 1(q, a);
• - для всех q  Q2 и a   определим (q, a) = 2(q, a);
• - для всех a   определим (q0, a) = (q1, a)  (q2,
a).
• Таким образом, данный автомат из начального
состояния может перейти к моделированию автомата
M1 либо автомата M2.
• II. Построим конечный автомат M, допускающий язык
L1 L2:
• M = (Q1  Q2, , , q1, F), где
• (1)  = 1  2;
• (2) если q2  F2, то F = F2;
• (3) если q2  F2, то F = F1  F2;
• (4) для всех q  Q1 \ F1 и a  1 определим (q, a) =
1(q, a);
• (5) для всех q  F1 и a  1  2 определим (q, a) =
1(q, a)  2(q2,a);
• (6) для всех q  Q2 и a  2 определим (q, a) = 2(q,
a).
• Таким образом, автомат M начинает работу с
моделирования M1, а когда приходит в
заключительное состояние автомата M1, может
начать моделировать автомат M2.
• Докажем, что L(M) = L1 L2.
• Вначале докажем L1 L2  L(M). Пусть x  L1, y  L2
(xy  L1L2). Тогда (q1,xy) |–M *(q, y) для некоторого q
 F1. Если x = , то q = q1. Если y, то, применяя
один раз (4) и нуль или более раз (5), получим (q,y) |–
M+ (r,) для некоторого r  F2. Если y = , то q2  F2
и, следовательно, q  F, xy  L(M) и L1L2  L(M).
• Теперь докажем L(M)  L1L2. Пусть w  L(M). Тогда
(q1,w) |–M+ (q,) для некоторого q  F. Возможные
случаи: q  F1 либо q  F2.
• Пусть q  F2, тогда w = xay для a  , причем (q1,
xay) |–M* (r, ay) |–M (s, y) |–M*(q, ), где r  F1, s  Q2,
s  2(r, a), следовательно, x  L1, ay  L2, w  L1L2.
• Пусть q  F1, тогда q2  F2 и   L2, следовательно,
w  L1, w L1L2 и L(M)  L1L2 , из чего следует, что
L(M) = L1L2.
• III. Построим конечный автомат M, допускающий язык
L1*:
• M = (Q1  {q'}, 1, , q', F1 {q'}), где q' – новое
состояние (q'Q1), а функция переходов 
определяется следующим образом
• (1) для всех q  Q1 \ F1 и a  1 определим
(q, a) = 1(q, a);
• (2) для всех q  F1 и a  1 определим (q, a)
= 1(q, a)  1(q1,a);
• (3) для всех a  1 определим (q', a) = 1(q1,
a).
• Таким образом, когда M попадет в
заключительное состояние, автомата M1, он
может либо продолжить моделирование
автомата M1, либо начать заново
моделировать M1 с начального состояния.
Цепочка   L(M), т.к. q'  F – заключительное
состояние для автомата M.
Теорема 14.2
• Язык допускается конечным автоматом тогда и
только тогда, когда он является праволинейным
языком.
• Доказательство следует из предыдущих лемм
Задание 15
• Для праволинейной грамматики задания 6 построить
конечный автомат, допускающий тот же язык.
• По данному конечному автомату M можно построить
наименьший эквивалентный ему конечный автомат.
Определение 14.17
• Пусть М=(Q, , , q0, F) – конечный автомат, а q1 и q2
– различные его состояния. Будем говорить, что
цепочка x  * различает состояния q1 и q2, если (q1,
x) |–* (q3, ), (q2, x) |–* (q4, ) и одно из состояний q3
или q4 принадлежит F (является заключительным), а
другое нет.
Определение 14.18
• Будем говорить, что состояния q1 и q2 являются kнеразличимыми (и писать q1 k q2), если не
существует цепочки x, длина которой |x|  k, которая
бы различала q1 и q2.
Определение 14.19
• Будем говорить, что состояния q1 и q2
неразличимы (и писать q1q2), если они kнеразличимы для любого k0.
Определение 14.19
• Состояние qQ называется недостижимым,
если не существует такой входной цепочки x,
что (q0, x) |–* (q, ).
Определение 14.21
• Автомат М называется приведённым (каноническим),
если множество Q не содержит недостижимых
состояний и не существует двух неразличимых
состояний.
Лемма 14.4
• Пусть M = (Q, , , q0, F) — конечный автомат с n
состояниями. Состояния q1 и q2 неразличимы тогда
и только тогда, когда они (n–2)-неразличимы.
• Доказательство.
• Необходимость условия тривиальна. Достаточность
тривиальна в тех случаях, когда F имеет 0 или n
элементов.
• Покажем, что
•   n-2  n-3...  2  1  0
• Для этого заметим, что для любых состояний q1 и q2
• 1) q1 0 q2 тогда и только тогда, когда q1 и q2 оба
либо принадлежат, либо не принадлежат F.
• 2) q1 k q2 тогда и только тогда, когда q1 k–1 q2 и
(q1,a) k–1 (q2,a) для всех a  .
• Отношение 0 грубейшее, оно разбивает Q на два
класса: F и Q\F.
• Если k+1  k, то отношение k+1 тоньше,
чем k, т.е. в нем по крайней мере на один
класс эквивалентности больше, чем в k. Так
как каждое из множеств содержит не более,
чем (n-1) элементов, то можно получить не
более (n-2) последовательных уточнений
отношения 0. Если же k+1 = k, то в силу
условия (2) k+1 = k+2 = ... . Таким образом,
 это первое из отношений k, для которых
k+1 = k. Лемма доказана.
• Тем самым, если два состояния можно
различить, то их можно различить с помощью
входной цепочки, длина которой меньше
числа состояний автомата.
Алгоритм 14.1
• Построение канонического конечного автомата.
• Вход:
Конечный автомат M = (Q, , , q0,
F).
• Выход:
Эквивалентный приведенный конечный
автомат M'.
• Метод.
• Шаг 1.
Устранить все недостижимые состояния.
• Шаг 2.
Строить отношения эквивалентности 0,
1, …, как описано в лемме 14.4. до тех пор, пока не
будет найдено k, такого что отношение k+1 совпадет
с отношением k. Взять в качестве отношения 
отношение k.
• Шаг 3. Построить конечный автомат M'=(Q',
, ', q0', F'), где
• а) Q' — множество классов эквивалентности
отношения  (обозначим через [p] класс
эквивалентности отношения , содержащий
состояние p);
• б) ([p],a) = [q], если (p,a) = q;
• в) q0' — это [q0];
• г) F' = {[q] | qF}.
• Пример 14.2. Пусть конечный автомат
задан таблицей 14.1.
• Отношения k для k  0 имеют следующие
классы эквивалентности:
• классы отношения 0 : {A,F},{B,C,D,E}
• классы отношения 1 : {A,F},{B,E},{C,D}
• классы отношения 2 : {A,F},{B,E},{C,D}
• Так как 2 = 1, то  = 1. Приведенным
автоматом M' будет автомат
({[A],[B],[C]},{a,b},',A,{[A]}), где функция '
определяется таблицей 14.2.
• Здесь мы выбрали [A] для представления класса
{A,F}, [B] — для представления {B,E} и [C] — для
{C,D}.
Теорема 14.3
• Автомат M', который строится алгоритмом 14.1,
имеет наименьшее число состояний среди всех
конечных автоматов, допускающих язык L(M).
• Разрешимые проблемы, связанные с
конечными автоматами:
• Проблема принадлежности: «Даны
определенного типа описание языка и
цепочка w; принадлежит ли w этому языку?»
• Проблема пустоты: «Дано определенного
типа описание языка; пуст ли этот язык?»
• Проблема эквивалентности: «Даны два
описания одинакового типа; определяют ли
они один и тот же язык?»
Алгоритм 14.2
• Решение проблемы принадлежности для
конечных автоматов.
• Вход:
конечный автомат M=(Q, , , q0, F) и
цепочка w*.
• Выход: «Да», если wL(M); «Нет», если
wL(M).
• Метод: Пусть w=a1a2 … an. Найти
последовательно состояния q1=(q0, a1),
q2=(q1, a2), … , qn=(qn-1, an). Если qnF,
сказать «Да»; если qnF, сказать «нет».
Алгоритм 14.4
• Решение проблемы пустоты для конечных
автоматов.
• Вход:
конечный автомат M=(Q, , , q0, F).
• Выход: «Да», если L(M); «Нет» в
противном случае.
• Метод: Вычислить множество состояний,
достижимых q0. Если это множество
содержит какое-нибудь заключительное
состояние, то сказать «Да», в противном
случае сказать «нет».
Алгоритм 14.4
• Решение проблемы эквивалентности для конечных
автоматов.
• Вход:
два конечных автомата
• M1=(Q1, 1, 1, q1, F1) и
• M2=(Q2, 2, 2, q2, F2), таких, что Q1Q2=.
• Выход:
«Да», если L(M1) = L(M2); «Нет» в
противном случае.
• Метод:
Построить конечный автомат M=(Q1Q2,
12, 12, q1, F1F2). С помощью леммы
определить, различимы ли состояния q1 и q2. Если
да, то сказать «Нет», в противном случае сказать
«Да».
Задание 16
• Привести пример конечного автомата.
Описать допускаемый им язык. Построить
для него канонический конечный автомат.
Download