TonitaN / FormalLanguageTheory

Slides and tasks for theory of formal languages course BMSTU IU9 (in Russian)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Вопрос по ЛР-3

TonitaN opened this issue · comments

Часть из ребят имеет хорошие заготовки проектов (контест, л.р. номер 2). Если кому-то они нравятся и вы к ним привыкли, то в рамках л.р.3 можно будет продолжить. Но для этого вы должны здесь записаться и сказать, что хотите делать дальше уже имеющийся проект.

К @Qmask26 и @stasstaf есть специальное предложение от Данилы Павловича, но это мы с ним ещё обсудим, когда он вернётся, и когда почти закончится основной групповой проект по л.р. номер 2. Возможно, будете переносить НКА на микроконтроллеры :)

P.S. - Подведение итогов по индивидуальным вариантам ЛР 2 будет, когда я у всех всё допроверю (@pugprogram, @ynastt, простите, я знаю, что вы давно ждёте, но с этими РК и прочими делами только сейчас дойдут руки). То есть завтра или послезавтра.

За специальное предложение специальные баллы полагаются?)

Точно сохранится бонус lua и добавится бонус за железо. Но пока что не предлагаю соглашаться сразу, надо сперва на ваш проект посмотреть и определиться, какие тут появятся задачи. Опять-таки, не думаю, что если кроме вас будет кто-то желающий, Данила Павлович откажется с ним работать.

@Qmask26 , вот у вас вообще море альтернативных вариантов: продолжать делать библиотеку автоматов на lua - раз, вместе с Матвеевым развивать анализатор КС-грамматик - два, или специальное предложение.

Вопрос по 3 варианту. В синтаксисе грамматики указано, что {rule} ::= {nterm}->({nterm}|{term})*. Если правая часть пустая, то это значит, что нетерминал переходит в пустую строку (эпсилон)? Допустим, есть правило [S]-> - значит S раскрывается в пустую строку?

Да, правильно.

Вопрос, что делать, если в 0 варианте у нас в некоторый момент возникло уравнениеA = (bA)*b (т.е. с рекурсией под звёздочкой и без других рекурсивных выходов).

Как и написано в слайде 4, итерацию нужно раскрыть, перебрав случаи, когда A явно входит в регулярку: A = (bA)*bbA + b (первое слагаемое соответствует непустой итерации, второе - пустой). И дальше по Ардену: A = ((bA)*bb)*b и подставляем выход из рекурсии: A = ((bb)*bb)*b`.

Ещё один пример от @pugprogram: B->(b)*B|b|a(aB)*a. Преобразуем в уравнение (сразу же переставляю местами константы и итерации): B = (b)*B + aa(aB)* + b. Здесь также два случая по второму слагаемому: B = (b)*B + aaa(aB)*B + (aa + b) . И дальше: B = (b*|aaa(aB)*)B+(aa|b). И дальше стандартно.

Тоже вопрос по 3 варианту. Как выводить конечные автоматы, определяющие поведение сентенциальных форм? Нужно выводить красиво, как во 2 групповой лабе? Также вопрос нужно ли строить грамматику по автоматам и приводить ее к нормальной форме? или достаточно выводить автомат после реверса, а строить грамматику, при этом используя бисимуляцию уже на доп баллы?

Грамматику строить нужно, а вот упрощать не обязательно (это доп баллы). Выводить автоматы красиво тоже не обязательно - главное, чтобы это было читаемо.

Также, если кто-то хочет записаться на доделывание индивидуальных вариантов 2 л.р., но забыл сообщить об этом, вы можете исправить ситуацию до 13 ноября.

Беру 6 вариант доработки л.р. 2

@Qmask26 , Артём и Владимир не с вами остаются?

@Qmask26 , Артём и Владимир не с вами остаются?

Да. Нам всем один вариант или нужно взять три разных?

Еще Стас хочет с нами

Я бы у вас завернула в другую сторону: и заодно это на перспективу к микроконтроллерам будет (если удастся всё-таки с Посевиным договориться про 4-5 л.р) - не демонстрация теоретических конструкций, а скорость и расширение синтаксиса регулярок. Мне очень понравилась в целом скорость lua и в частности скорость работы многого из вашего функционала. REPL и перенос алгебры автоматов в интерфейс оставим, это в любом случае удобно, а остальные варианты я сейчас накидаю вам в соответствующей теме.

Синтаксис входной КС-грамматики для всех трёх вариантов приведён на слайде 10! Пожалуйста, будьте внимательны.

Вопрос по 3 варианту: я правильно понимаю, что в первом способе надо сначала устранить левую рекурсию, а потом нумеровать нетерминалы и делать подстановки (в презентации к лекции 6 как-то странно это описано, там зацикливание на подстановках получается + только удаление непосредственной левой рекурсии + введение нового нетерминала может нарушить порядок, если он уже введен, а подстановки произведены)?

Там реально пропущен рекурсивный шаг, спасибо, сейчас исправлю: нужно подстановками добиться того, чтобы для конкретного k (начиная с k=1) не было правил вида A_k -> A_n W, где n<k, при этом могут быть правила вида A_k -> A_k W. Для последних удалить левую рекурсию и рекурсивно продолжить то же самое действие уже для k+1.

Вопросы по 3 варианту насчет алгоритма Блюма-Коха.

  1. Я правильно понимаю, что то, что выделено красным означает: И ((C_B != B_B) ИЛИ (из B_B есть стрелки в обратном автомате M_B))?
    image
    (кстати еще тут в третьем пункте в третьем подпункте по идее опечатка: должно быть <D_B, E, C_B>)

  2. В первом пункте из скриншота выше E означает последовательность терминалов и нетерминалов? Если это так, то на следующем слайде
    image
    S_E существует, только если E - нетерминал, это как-то странно (я написал программу и протестировал: часть нетерминалов ни во что не переписываются из-за этого).

  3. Насчет последнего слайда: я считаю все одинаковые нетерминалы с разными индексами (например D_B и D_C) за один нетерминал при объединении всех G_i. Верно ли это? Ведь G_i не имеют общих нетерминалов, они между собой не связаны (если различать одинаковые нетерминалы с разными индексами).

UPD: возможно будет проще, если вы скинете статью по этому алгоритму (я не смог найти)

  1. S_B действительно должно быть D_B в третьем подпункте, а вот условие правильное, и да, там "ИЛИ". По факту оно означает, что если из N_N стрелок нет, то вход в него соответствует всегда терминальному правилу (нерекурсивен). Когда вы порождаете регулярную грамматику по автомату, и там есть конечные состояния, из которых нет переходов, то они обрабатываются точно так же: переход в них соответствует правилу без нетерминальных символов.
  2. Нет, Е - это только нетерминалы, с учётом того, что в данном алгоритме исходной предполагается форма ХНФ (см. слайд 9).
  3. Связь есть - осуществляется она в пунктах 3 и 4 последнего слайда. Т.е. если S_E -> a A_E, например, а D_B -> E C_B, то по третьему правилу получается D_B -> a A_E C_B. Когда я показывала примеры, в этом случае я говорила, что нужно заменить все неразмеченные E на соответствующие S_E, а потом подставить в S_E правила переписывания, которые точно начинаются с терминального символа.
    В статье как раз написано так же, как на слайде (имхо на примерах было попроще), но я её сейчас пришлю.

Кстати, забыла: @boomb0om уже несколько дней назад сделал 2*ГНФ, см. https://github.com/boomb0om/FormalLanguageTheory
Бонусные баллы будут обязательно, но опять-таки через неделю, чтобы все успели закончить (и я успела нормально проверить).

Поскольку с дополнениями и прочим с автоматами грустная ситуация (в том числе из-за багов в детерминизации в группе @Postlog), в варианте 1 на зачёт достаточно сделать только пункт 2 (пересечение грамматики ПСП и регулярки и парсинг). Пункт 1 уходит в допбаллы (+4). ХНФ для парсинга берём у товарищей.

На 3 лабораторной каминг-аут как рефальщики сделало достаточно много народа. Поимённо перечислять не буду: они пока ещё слишком стесняются, поскольку рефал-стиль использовали не в рефале, а в языках, которые легче принимаются общественностью. Зачем же вы так, создали себе много неудобств. Быть рефальщиком и вести рефал-пропаганду пока что не запрещено законом )

Кто ещё не сдал 3 лабораторную - у вас есть ещё завтра до вечера, чтобы успеть до раздачи бонусов. Проверять буду всех тоже завтра.
Пользуясь случаем, передаю привет @maksimellian и напоминаю, что пора заводить репозиторий для курсовой работы.

Список тех, кто будет делать 5 лабораторную работу на Рефале:

  • @pugprogram
  • @Espenario
  • @Lasadaf
  • (лучше всех замаскировался, но рефальщик сразу узнает рефальщика, так что...) @N1X41

...и to be continued.
Добро пожаловать в клуб! Не бойтесь: всему научу, всё покажу ))

UPD: Ну если уж так не хочется Рефала, то последний шанс его избежать - будет вам коллективная 5 лаба на автоматическое определение рефал-стиля в программах по тфя. Но лишь в том случае, если я не обнаружу соответствующей стилистики в 4 лабе. Иначе Рефал неизбежен )

Ура! Свершилось! Появились избранные! И сразу целых две штуки, чему я очень рада, т.к. не могло же быть, чтобы в 7 семестре обошлось без кровавой жатвы. Желаю удачи, чтобы непременно дожить до него... и встретимся на курсовой :)