Множество всех цепочек из {0,1,a}*, ... содержащих чётное количество нулей. Например, ... №1

advertisement
№1Пусть регулярный язык задан своим описанием:
Множество всех цепочек из {0,1,a}*, заканчивающихся цепочкой ’a1’ и
содержащих чётное количество нулей. Например, ‘a1’, ‘00a1’, ‘010a1’ и
т.п.
Построить регулярное выражение, задающее этот язык.
Решение:
В соответствии с условием задачи цепочки регулярного языка
заканчиваются
последовательностью
«a1»,
причем
цепочка
должна
содержать чётное количество нулей. Следовательно, длина итоговой цепочки
без учета конечных «a» и «1» должны быть равна: связка из четного
количества нулей и произвольного количества единиц и символов «a». Таким
образом, итоговое регулярное выражение можно разбить на две части:
1. Последовательность из четного количества нулей и произвольного
количества единиц и символов «a»: ((1+a)*0(1+a)*0(1+a)*). Так как
данная последовательность может быть повторена произвольное
количество
раз,
добавим
соответствующий
оператор:
((1+a)*0(1+a)*0(1+a)*)*.
2. Конечные «a» и единица: a1.
Для получения результирующего выражения необходимо объединить
данные выражения:
((1+a)*0(1+a)*0(1+a)*)*a1
Чётное
количество
нулей
м.б.
и
нулевым,
например,
«1а1»,
«аа1а1а1а1»… По Вашему РВ такое не получить.
1
№3 Построить КС-грамматику, задающую язык из задачи №1.
Сгенерировать две цепочки языка по построенной грамматике. Процесс
генерации цепочек языка записать в виде цепочки вывода, указывая номера
применённых правил (или сами правила, как показано в примере).
Использовать левосторонний или правосторонний вывод.
Решение:
Регулярное выражение имело вид ((1+a)*0(1+a)*0(1+a)*)*a1. Обозначим
A(1+a)*, B((1+a)*0(1+a)*0(1+a)*)*. Тогда первое правило будет иметь вид:
SBa1. В правиле для B будут присутствовать A: BA0A0A, надо
добавить рекурсию и пустое правило: BA0A0AB|. Нетерминал A
рекурсивно порождает любые символы кроме ‘0’: A1A|aA|. Итак,
рамматика построена, выпишем её полностью.
G({0,1,a},{S,A,B},P,S), где P:
SBa1,
A1A|aA|,
BA0A0AB|.
Аналогично №1.
Эта грамматика более наглядна, чем регулярная.
Ещё в этом же задании требовалось сгенерировать цепочки языка по
полученной
грамматике.
Покажем
на
примере
одной
цепочки,
подчёркивая каждый раз нетерминал, который будем раскрывать, и
используя правосторонний вывод (каждый раз заменяем крайний правый
нетерминал в цепочке вывода).
S  (правило SBa1) Ba1  (правило BA0A0AB) A0A0ABa1  (правило
A) 0A0ABa1 
(правило
A1A)
0A10ABa1 
(правило
A) 010ABa1  (правило A) 010Ba1  (правило B) 010a1.
Выделено неверное применение правила.
Получили
цепочку,
соответствующую
требованиям
языка.
2
№4 Построить
детерминированный
конечный
автомат
(ДКА),
распознающий язык из задачи №1. Функцию переходов ДКА представить
в двух видах: таблицей и графом переходов. Проверить с помощью этого
ДКА допустимость цепочек языка, полученных в задаче №3. Процесс
проверки
выписать
в
виде
последовательности
конфигураций
построенного ДКА.
Решение:
При построении ДКА полезно следовать трём правилам:
1) Если распознаваемый язык допускает пустую цепочку, то начальное
состояние автомата является также и конечным.
2) Минимальная непустая цепочка языка должна переводить автомат из
начального состояния в конечное.
3) Если все цепочки языка должны иметь длину заданной кратности, то в
функции переходов количество состояний в цикле равно этой кратности
(и не может быть меньшим!!!). Тогда для цепочек произвольной длины на
вершинах графа функции переходов допустимы петли, для чётной длины
циклы включают по два состояния, и т.д.
Для наглядности построение функции переходов ДКА будем выполнять
сначала в виде графа:
1
1,a
q3
0,1
a
0
q0
0
a
q1
1
q2
a
0
Ваш автомат примет цепочки вида а10а1, что неверно.
Выпишем полностью построенный ДКА: M({q0,q1,q2,q3},{0,1,a},,q0,{q2})
3
Осталось согласно заданию представить функцию переходов ещё и в виде
таблицы, а также проверить по автомату построенные в предыдущей
задаче цепочку.
вход
состояние 0
1
а
q0
{q3} {q0} {q1}
q1
{q3} {q2} {q1}
q2
{q0} {q0} {q1}
q3
{q0} {q3} {q3}
Для наглядности закрасим ячейки таблицы, соответствующие переходам
минимальной допустимой цепочки. Рассмотрим разбор построенной в
задаче 3 цепочки:
(q0,010a1) ├─ (q3,10a1) ├─ (q3,0a1) ├─ (q0,a1) ├─ (q1,1) ├─ (q2,).
Поскольку q2F, это означает, что ‘010a1’L(M).
4
№6Построить
детерминированный
автомат
с
магазинной
памятью,
распознающий язык из задачи №5 и работающий с опустошением стека.
Проверить с помощью этого ДМПА допустимость цепочек языка,
полученных в задаче №5. Процесс проверки выписать в виде
последовательности
конфигураций
построенного
ДМПА,
указывая
номера правил.
Решение:
При построении функции переходов ДМПА потребуется учитывать
несколько факторов – равенство и чётность количества символов ‘a’ и ‘b’,
количество символов ‘c’, равное половине количества пар ‘ab’.
Таким образом, определим несколько состояний q0, q1, q2, q3:
q0 – прочитан только первый символ ‘a’;
q1 – прочитана одна пара ‘ab’;
q2 – прочитано две пары ‘ab’;
q3 – считан символ ‘с’.
Итак, функция переходов  будет иметь вид:
(q0,a,Z)={(q0,aZ)}
(q1,a,a)={(q1,aa)}
(q2,a,a)={(q2,aa)}
(q0,b,a)={(q1,)}
(q1,b,a)={(q2,a)}
(q2,b,a)={(q1,)}
(q1,a,Z)={(q1,aZ)}
(q2,c,a)={(q3,)}
(q3,,Z)={(q3,)}
(q3,c,a)={(q3,)}
Конец работы.
По выделенным правилам Ваш автомат успешно прочтет недопустимую
цепочку с несколькими подряд расположенными «а». Это неверно.
Осталось выписать полностью ДМПА P и проверить допустимость
полученной в предыдущей задаче цепочки, для примера возьмём
‘ababababcc’.
P({q0,q1,q2,q3},{a,b,c},{Z,a},,q0,Z,{q3});
(q0,ababababcc,Z) ├─ (q0,babababcc,aZ) ├─ (q1,abababcc,Z) ├─ (q1,bababcc
,aZ) ├─ (q2,ababcc,aZ) ├─(q2,babcc,aaZ) ├─ (q1,abcc,aZ) ├─ (q1,bcc,aaZ) ├─ (q
2,cc,aaZ) ├─ (q3,c,aZ) ├─ (q3,,Z) ├─ (q3,,).
Поскольку q3F, это означает, что ‘ababababcc‘ L(P).
5
Download