TonitaN / FormalLanguageTheory

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Л.Р. №1

TonitaN opened this issue · comments

Здесь можно обсудить условия первой лабораторной работы.

Вопросы по варианту 2 (Кнут-Бендикс)

  1. Правильно ли я понимаю, что в constructors = ([буква]([нат. число]),)* [буква]([нат. число])) последняя скобка лишняя?
  2. Константа из тз исчезла?
  3. Считаем, что переменные вычисляются за неизвестное время, сравнивать их нельзя, единственное, что мы знаем о переменных:
    Для любой f из множества конструкторов и любого x из множества переменных => f(x) > x
  4. Результатом выполнения алгоритма будет частичный порядок на множестве конструкторов, либо сообщение о невозможности подбора такого порядка (+ дерево разбора)?
  1. Скобка лишняя, спасибо, исправлю!
  2. Да, константа исчезла. Потому что константы - нульместные конструкторы, а по условию есть только одноместные и двухместные.
  3. Всё верно. Можно и более сильное высказывание сделать (которое, впрочем, доказывается через это): любое выражение, содержащее переменную, больше, чем эта переменная. Но, например, f(x)>y уже не верное утверждение. Две переменные между собой также не сравнимы.
  4. Всё верно, но дерево разбора при неудаче выводить не обязательно (это хорошая идея, но это можно оставить тем, кто будет допиливать лабу, например).

Вопрос по варианту 2 (Кнут-Бендикс)
Если в изначальных правилах переписывание встретится что-то вроде (y ::= f(x)), т.е. слева одна переменная, а справа её нет, то такую строку отбрасываем как на имеющую смысла? Или считать завершаемость системы неразрешимой по К-Б?
Не понятно, как к таким можно применить порядок К-Б, а в процессе применения условий К-Б такие правила могут возникнуть.

Можно ли предположить, что переменная - конструктор с 0 параметров, и тогда второе правило
∃i(1 ⩽ i ⩽ n & ti >lo g(u1 , . . . , um ));
неприменимо, т.к. !∃i(1 ⩽ i ⩽ n )

Переменная - не конструктор, потому что на них порядок не выстраивается вообще (а на нульместных конструкторах можно было бы, т.к. просто объявили бы, что y>x, y>f). Поэтому такие правила, в которых справа есть переменная, которой нет слева, точно не завершаемые по Кнуту-Бендиксу. Впрочем, они не завершаемые в принципе (чтобы убедиться, достаточно подставить вместо этой переменной там опять левую часть правила, и продолжать этот процесс сколько угодно раз).

Вопросы от Дмитрия Головкина по варианту mod1 ("упрощение грамматик"):

  1. До какого момента происходит ввод грамматик построчно?
  2. Что должно являться ответом?

Ответ на 1: поток чтения я перенаправляю в файл, поэтому до конца файла. Но если хочется ещё вариант чтения с консоли, то можно ввести свою комбинацию клавиш для прекращения ввода.

Ответ на 2: классы эквивалентности нетерминалов + новая грамматика, где в терминальные формы подставлены соответствующие представители классов эквивалентности. Например:

S -> a S T a
T -> a T S a
S -> b
T -> b

Ответ:

{T,S}
S -> a S S a
S -> b

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

Если вы получили зачёт +8 (или больше) по первой Л.Р., то можно писать здесь, если хотите кому-то передать на доработку свою лабу. Естественно, только кому-то одному, и кому именно - решать вам.
Относится к @theElusiveJoe (К-Б), @Espenario, @xendalm , placeholder4VladBelezckiy, @xtoter (бисимуляция), @dak151449 (М-М унификация).

Лучшая реализация бисимуляции сейчас у Белецкого Владислава.

Возможные вопросы по алгоритму Мартелли-Монтанари.

  1. Ответом является список подстановок (вида [переменная] = [терм]), а также унификатор (терм, в котором сделаны все эти подстановки). Либо ответ не унифицируется (можно также указать, какие именно термы, либо же вывести список циклических подстановок - но это можно оставить на доделывание другим).
  2. Нужен именно настоящий Мартелли-Монтанари, а не из википедии! Для сомневающихся: см. статья указанных авторов. Нам нужен алгоритм 3, а не алгоритм 1 (который приведён там лишь для примера и чтобы показать, где этот стандартный алгоритм не эффективен).

Вопрос от сеньоров ТФЯ: все правила с непорождающими нетерминалами можно удалить без ущерба для классов эквивалентности (или приравнять), верно ли это?

Ответ: в рамках лабы нельзя. Потому что алгоритм по смыслу должен подходить для инкрементальной обработки грамматик. Я это в описание не вставляла, но построен он именно так. Если вы удалите правила с некоторым нетерминалом слишком рано, а потом добавится правило на этот нетерминал и он станет порождающим, классы эквивалентности уже станут не адекватны.

Приравнивать все синтаксически непорождающие нетерминалы (т.е. такие, для которых нет правил, где они стоят в левой части) можно и нужно (т.к. они соответствуют одному классу эквивалентности - с пустым множеством терминальных форм). Но приравнивать все нетерминалы, ссылающиеся на непорождающие нетерминалы, уже нет.

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

У нас первый сдавший на 8+3, @Ankalot. Надеюсь, не последний :)
EDIT: @p0rtale второй.

Вопросы по Мартелли-Монтанари: как делать компактификацию, какие уравнения должны быть в начале работы алгоритма и что значит выбрать очередное уравнение.

Ответы по пунктам с разбором примера.

  1. На первом шаге унификации рассматривается система {xi}={}, {X}={t1,t2}, где X — свежая переменная, t1, t2 — входные термы, xi — переменные из t1 или t2.
  2. Мультиуравнений, как видно из пункта 1, может быть много. Но нам нужно выбрать такое, в котором в правой части есть хотя бы два терма, и притом ни одна переменная левой части которого не встречается в правой части никакого уравнения вообще. Мультиуравнение имеет вид S=M, где S --- это множество переменных, M --- множество термов, которые не являются переменными (это необходимо проверять). Если остались только уравнения, в которых в правой части по терму, то можно выбрать такое уравнение без зависимостей в правых частях и сразу вынести его в итоговую подстановку.
  3. Компактификация: ищем все мультиуравнения вида S1 ∪ {xi} = M1, S2 ∪ {xi} = M2 (xi один и тот же) и объединяем их в S1∪{xi}∪S2 = M1∪M2. Не столь критично, но тоже желательно поступить аналогично и с правыми частями: найти все пары S1 = M1∪{ti}, S2 = M2∪{ti} и объединить их.

На примере: пара F(q,q,q) и F(F(x,y,R),F(a,w,a),F(w,x,y)). Все строчные — это переменные, заглавные — конструкторы.
Первый этап --- система

{x0} = {F(q,q,q), F(F(x,y,R),F(a,w,a),F(w,x,y))}
{q} = {}
{x} = {}
{y} = {}
{a} = {}
{w} = {}

Ищем общую часть и границу. Граница формирует новые уравнения. Пока что в лоб.
общая часть: F(q,q,q)
граница:

{q} = {F(x,y,R)}
{q} = {F(a,w,a)}
{q} = {F(w,x,y)}

Плюс прежние уравнения:

{x} = {}
{y} = {}
{a} = {}
{w} = {}

Это ситуация, к которой необходимо применить компактификацию (объединить всё по q). Получаем

{q} = {F(x,y,R),F(a,w,a),F(w,x,y)}
{x} = {}
{y} = {}
{a} = {}
{w} = {}

Здесь только одно уравнение, которое содержит несколько термов справа (но, как видим, их могло бы быть и больше, если бы, например, сопоставлялось F(q,q,F(x,x,x)) с F(t1,t2,F(t3,t4,f5)), то получились бы два уравнения {q}={t1,t2}, {x}={t3,t4,t5} с учётом компактификации).
Строим общую часть: F(x,y,a) (порождая подстановку {q} := F(x,y,a)), и границу:

{x,a,w}={}
{y,w,x}={}
{a,y}={R}

Опять ситуация, где необходимо сделать компактификацию. Получаем:

{x,a,w,y}={R}

Это и есть итоговая подстановка, т.к. никакой неоднозначности справа ни в одном уравнении нет. Результат: терм F(q,q,q) с подстановками {q} := F(x,y,a), {x,a,w,y}=R.
Ещё стоит обратить внимание на уравнения вида {xi,xj} = {}. Они не задают никакой общей части, поэтому шаг унификации к ним не применяется, но в итоговую подстановку эти уравнения нужно будет перенести после завершения всех шагов (т.к. они определяют подстановку xi := xj).

P.S. - Я знаю, что минимум 4 человека ждут проверки, но похоже что отвечу всем только завтра, и возможно - вечером, как позволит время.

Всё-таки по бисимуляции никто пока не смог превзойти работу Влада Белецкого (по чистоте решения и скорости). А по К-Б пальма первенства у первого сдавшего (@theElusiveJoe ), как (пока) и по унификации (@dak151449) :)
Лучшим работам, сданным в срок, начислю бонусные баллы.

EDIT: @Pur3Vessel тоже сделал отличную работу, да ещё на 11 баллов. Впрочем, к @p0rtale также никаких вопросов (унификация).

Лидер по быстродействию из питонистов на варианте К-Б --- @UsefulTornado (на мой взгляд, повлияла более эффективная проверка правила 2, и эвристики в правиле 4). Его реализацию рекомендую к использованию в лабораторной номер 2.

Хотя @N1X41 показал хорошие результаты на тестировании на больших тестах (>100 правил), к сожалению, рекомендовать питонистам его бисимуляцию могу только с оговоркой - уж очень много там глобальных переменных. Впрочем, у @Gervva тоже всё чисто работает, поэтому советую его выложить его лабу и тем самым дать возможность другим использовать её.

У плюсов пока нет быстрой и точной реализации. Есть ещё отличные реализации (например, у @Pur3Vessel - у него корректно обрабатываются даже повторные правила), но "какой социальной активности можно ожидать от тех, кто пишет на хаскеле?"(с) --- увы, это никому не доведётся переиспользовать.

Унификация на больших термах лучшая у @Lasadaf (особенно - раст-вариант), а также у @p0rtales (lua). Концептуально хорошо показала себя также работа @boomb0om, но из-за багов парсера не на всех тестах удалось её проверить. Поэтому кто не выложил ещё свои работы (или скрывает), просьба открыть общественности.

Итоговые плюсы (бонусы) для всех сдавших вовремя (и успевших исправить замечания до середины воскресенья):

Белецкий, Герман, Баев +1 (немного разные задачи решали, но все справились чисто)
Петряев +1
Степанов +1 (дополнительно к тому +1, что уже есть)
Павлов +1 (да, не все тесты запустились, зато остальные проходят чисто, включая >500 символов, и удобный дебаг)
Иванов Артём +2 (по скорости превзошёл всех, в том числе работы прошлого года)
Матвеев +2 (первый сдавший из всех вариантов и причём сразу чисто + удобный дебаг)

Если кто-то пожелает продолжить указанные работы, тот получит поощрение +1 балл. Также поощрение +1 полагается за доработку лабораторных Панова и Котова (поддержим lua и котлин), а ещё Дельмана, Беляковой и Макарова (поддержим группу С++, там мало народа, а использоваться лабы будут). То есть, базовая стоимость доработки в этих случаях будет такая же, как и выполнение лабы со штрафом -1 (учитывая бонус языка, т.е. на lua это сразу +10). Что именно требуется добавить (поменять) в каждом случае, разберёмся, если будут желающие за это взяться. Но срок, когда вы можете заявить это пожелание, равен только одной неделе (с заявки начнётся отсчёт времени выполнения) - дальше уже никаких доработок не будет.

P.S. - Похоже что за C++ бонус +1 даже маловат: по итогу оказался самый непрактичный для первой лабы язык.

P.P.S. - Все, кто ещё не получил зачёт, но уже сдал лабу, получат зачёт без штрафа. Также аннулирован штраф на ближайшие три дня для всех, кто сдаст в течение этого срока лабы не на питоне.

Если вы получили зачёт +8 (или больше) по первой Л.Р., то можно писать здесь, если хотите кому-то передать на доработку свою лабу. Естественно, только кому-то одному, и кому именно - решать вам. Относится к @theElusiveJoe (К-Б), @Espenario, @xendalm , placeholder4VladBelezckiy, @xtoter (бисимуляция), @dak151449 (М-М унификация).

Лучшая реализация бисимуляции сейчас у Белецкого Владислава.

Здравствуйте!
Хочу передать свою лабу на доработку Максиму Куценкову @megamax625.

@boomb0om , принято.

Передаю свою лабораторную работу на доработку Ярославу Жавтяку @Dibydo