-
№1 Пусть регулярный язык задан своим описанием:
-
Множество всех цепочек из {0,1,a}*, заканчивающихся цепочкой ’a1’ и содержащих чётное количество нулей. Например, ‘a1’, ‘00a1’, ‘010a1’ и т.п.
-
Построить регулярное выражение, задающее этот язык.
-
-
Решение:
В соответствии с условием задачи цепочки регулярного языка заканчиваются последовательностью «a1», причем цепочка должна содержать чётное количество нулей. Следовательно, длина итоговой цепочки без учета конечных «a» и «1» должны быть равна: связка из четного количества нулей и произвольного количества единиц и символов «a». Таким образом, итоговое регулярное выражение можно разбить на две части:
-
Последовательность из четного количества нулей и произвольного количества единиц и символов «a»: ((1+a)*0(1+a)*0(1+a)*). Так как данная последовательность может быть повторена произвольное количество раз, добавим соответствующий оператор: ((1+a)*0(1+a)*0(1+a)*)*.
-
Конечные «a» и единица: a1.
Для получения результирующего выражения необходимо объединить данные выражения:
-
((1+a)*0(1+a)*0(1+a)*)*a1
Чётное количество нулей м.б. и нулевым, например, «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)*)*. Тогда первое правило будет иметь вид: SBa1. В правиле для B будут присутствовать A: BA0A0A, надо добавить рекурсию и пустое правило: BA0A0AB|. Нетерминал A рекурсивно порождает любые символы кроме ‘0’: A1A|aA|. Итак, рамматика построена, выпишем её полностью.
-
G({0,1,a},{S,A,B},P,S), где P:
-
SBa1,
-
A1A|aA|,
-
BA0A0AB|.
-
Аналогично №1.
-
Эта грамматика более наглядна, чем регулярная.
-
Ещё в этом же задании требовалось сгенерировать цепочки языка по полученной грамматике. Покажем на примере одной цепочки, подчёркивая каждый раз нетерминал, который будем раскрывать, и используя правосторонний вывод (каждый раз заменяем крайний правый нетерминал в цепочке вывода).
-
S (правило SBa1) Ba1 (правило BA0A0AB) A0A0ABa1 (правило A) 0A0ABa1 (правило A1A) 0A10ABa1 (правило A) 010ABa1 (правило A) 010Ba1 (правило B) 010a1.
-
Выделено неверное применение правила.
-
Получили цепочку, соответствующую требованиям языка.
№4 Построить детерминированный конечный автомат (ДКА), распознающий язык из задачи №1. Функцию переходов ДКА представить в двух видах: таблицей и графом переходов. Проверить с помощью этого ДКА допустимость цепочек языка, полученных в задаче №3. Процесс проверки выписать в виде последовательности конфигураций построенного ДКА.
-
-
Решение:
-
При построении ДКА полезно следовать трём правилам:
-
1) Если распознаваемый язык допускает пустую цепочку, то начальное состояние автомата является также и конечным.
-
2) Минимальная непустая цепочка языка должна переводить автомат из начального состояния в конечное.
-
3) Если все цепочки языка должны иметь длину заданной кратности, то в функции переходов количество состояний в цикле равно этой кратности (и не может быть меньшим!!!). Тогда для цепочек произвольной длины на вершинах графа функции переходов допустимы петли, для чётной длины циклы включают по два состояния, и т.д.
-
-
Для наглядности построение функции переходов ДКА будем выполнять сначала в виде графа:
-
Ваш автомат примет цепочки вида а10а1, что неверно.
-
Выпишем полностью построенный ДКА: M({q0,q1,q2,q3},{0,1,a},,q0,{q2})
-
Осталось согласно заданию представить функцию переходов ещё и в виде таблицы, а также проверить по автомату построенные в предыдущей задаче цепочку.
-
|
вход
|
состояние
|
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,). Поскольку q2F, это означает, что ‘010a1’L(M).
-
№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)}
|
(q3,c,a)={(q3,)}
|
(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,)}
|
Конец работы.
|
|
|
По выделенным правилам Ваш автомат успешно прочтет недопустимую цепочку с несколькими подряд расположенными «а». Это неверно.
Осталось выписать полностью ДМПА 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) ├─ (q2,cc,aaZ) ├─ (q3,c,aZ) ├─ (q3,,Z) ├─ (q3,,).
Поскольку q3F, это означает, что ‘ababababcc‘ L(P).
|