№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)*)*. Тогда первое правило будет иметь вид: 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. Выделено неверное применение правила. Получили цепочку, соответствующую требованиям языка. 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,). Поскольку q2F, это означает, что ‘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,,). Поскольку q3F, это означает, что ‘ababababcc‘ L(P). 5