From 784f3e65f41e64605e7d2e65a52dd1b1624c9529 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Sat, 22 Mar 2025 19:25:20 +0300 Subject: [PATCH 1/3] initial rk2 --- ...200\320\270\320\260\320\275\321\202 23.md" | 107 ++++++++++++++++++ ...\200\320\270\320\260\320\275\321\202 8.md" | 80 +++++++++++++ ...20\270\320\260\320\275\321\202 epsilon.md" | 62 ++++++++++ 3 files changed, 249 insertions(+) create mode 100644 "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" create mode 100644 "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" create mode 100644 "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" new file mode 100644 index 0000000..e9bab6c --- /dev/null +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" @@ -0,0 +1,107 @@ +# 1. Язык SRS $a \to bab \quad a^3 \to a^2 \quad ba \to ac$ над множеством базисных слов $b^n a^n$ + +Рассмотрим слова получаемых из базисного $a$ применением SRS + +Такие слова порождаются грамматикой +``` +T -> bTb | aR +R -> cRb | . +``` +Где `.` - пустое слово, $\varepsilon$ +Это не трудно заметить, проанализировав поведение первого и третьего правил переписывания. + +Для $a^n$ нужно дополнительно учитывать, что мы можем произвольным образом сначала уменьшить число `a` до двух и более, а после применять правила 1 и 3. + +Таким образом при рассмотрении языка над базисом $b^na^n$ нужно отдельно расмотреть случаи $n=0, n=1, n\geq 2$ + +При $n = 0$ имеем только пустое слово. + +При n = 1 язык состоит либо из присоединения слева b к T (нетерминалу рассмотренному в самом начале), либо справа c. +``` +S -> bT | Tc +... +``` + +При $n\geq2$ необходимо допустить, что третье правило будет пременено к исходному базисному слову произвольное число раз. + +Приведем грамматику без условия на n +``` +S -> bST | bS | TE +E -> cET | cE | . +... +``` + +Преобразуем ее с $n\geq2$ +``` +P -> bbSTT | bTET | TcET + +S -> bST | bS | TE +E -> cET | cE | . +... +``` + +Объединяем вместе грамматики +``` +S' -> bT | Tc | P | . +P -> bbSTT | bTET | TcET +S -> bST | bS | TE +E -> cET | cE | . +T -> bTb | aR +R -> cRb | . +``` + +Таким образом мы предъявили КС грамматику(недетерминированную), порождающую все слова языка => язык КС. + +Проверим детерминированность. +Пусть n - длинна накачки. Рассмотрим два слова из языка +$$\begin{aligned} +b^{n+2} a b^n &\mid b \\ +b^{n+2} a b^n &\mid b a b^{n+1} a^n +\end{aligned}$$ +1) в втором слове нельзя накачать префикс в КС смысле, так как первый отрезок b уравновешивается a в суффиксе, а второй отрезок b уравновешивается b из суффикса +2) накачка конец префикса + суффикс не работает в первом слове, так как b уравновешивается первым отрезком b в префиксе + +Таким образом по лемме о накачки для DCFL получили, что язык не DCFL + +Также автоматически проверили, что нарушается префикс свойство. + +> Линейность языка можно опровергнуть с помощью леммы о накачке для линейных: +> Пусть n - длинна накачки. Рассмотрим $w = b^{n+1} a (b^n a b^n)^n$ +> При накачке первых n символов и последних n символов мы гарантированно выйдем из языка, так как они уравновешиваются разными структурами => язык не линейный КС. +# 2. Язык $\{w \mid |w|_{ab}=|w|_{baa} \text{ \& } w=w^R\}$ +#пусто +# 3. Атрибутная грамматика +``` +S -> [regexp] +[regexp] -> ([regexp][regexp]) +... +Пока опущу грамматику из условия +``` + +Текстовое описание языка: +Язык описывает регулярные выражения, состоящие из a, b и epsilon. Операции построения регулярки абрамляются в круглые скобочки, причем: +- не допускаются вложенные звездочки вида (a* b*)* +- внутри альтернативы есть как минимум одна не пустая альтернатива, и первый элемент не может быть альтернативой +- не допускается звездочка или конкатенация с пустым словом + +Таким образом можно построить грамматику, которая учитывает эти условия: +``` +R -> E | T | A | Cs | C +S -> (T)* | (C)* | (A)* +C -> (TT) | (TS) | (TCs) | (TA) | (TC) | (ST) | (SA) | (SC) | (CsT) | (CsA) | (CsC) | (AT) | (AS) | (ACs) | (AA) | (AC) | (CT) | (CS) | (CCs) | (CA) | (CC) +Cs -> (SS) | (CsS) | (SCs) | (CsCs) +A -> (E|T) | (E|S) | (E|C) | (E|Cs) | (E|A) | (T|E) | (T|S) | (T|C) | (T|Cs) | (T|A) | (T|T) | (S|E) | (S|S) | (S|C) | (S|Cs) | (S|A) | (S|T) | (C|E) | (C|S) | (C|C) | (C|Cs) | (C|A) | (C|T) | (Cs|E) | (Cs|S) | (Cs|C) | (Cs|Cs) | (Cs|A) | (Cs|T) +E -> epsilon +T -> a | b +``` + +Язык беспрефиксный, так как все операции обрамляются скобками. + +По построенной грамматике возможно построить lr(0) парсер => язык детерминированный. +Ссылка на построенную таблицу LR(0) разбора(Я вручную это все делать не буду) +``` +https://smlweb.cpsc.ucalgary.ca/lr0.php?grammar=R+-%3E+E+%7C+T+%7C+A+%7C+Cs+%7C+C+%7C+S.%0AS+-%3E+%28+T+%29+%2A+%7C+%28+C+%29+%2A+%7C+%28+A+%29+%2A.%0AC++-%3E+%28+T+T+%29+%7C+%28+T+S+%29+%7C+%28+T+Cs+%29+%7C+%28+T+A+%29+%7C+%28+T+C+%29+%7C+%28+S+T+%29+%7C+%28+S+A+%29+%7C+%28+S+C+%29+%7C+%28+Cs+T+%29+%7C+%28+Cs+A+%29+%7C+%28+Cs+C+%29+%7C+%28+A+T+%29+%7C+%28+A+S+%29+%7C+%28+A+Cs+%29+%7C+%28+A+A+%29+%7C+%28+A+C+%29+%7C+%28+C+T+%29+%7C+%28+C+S+%29+%7C+%28+C+Cs+%29+%7C+%28+C+A+%29+%7C+%28+C+C+%29.%0ACs+-%3E+%28+S+S+%29+%7C+%28+Cs+S+%29+%7C+%28+S+Cs+%29+%7C+%28+Cs+Cs+%29.%0AA+-%3E+%28+E+%21+T+%29+%7C+%28+E+%21+S+%29+%7C+%28+E+%21+C+%29+%7C+%28+E+%21+Cs+%29+%7C+%28+E+%21+A+%29+%7C+%28+T+%21+E+%29+%7C+%28+T+%21+S+%29+%7C+%28+T+%21+C+%29+%7C+%28+T+%21+Cs+%29+%7C+%28+T+%21+A+%29+%7C+%28+T+%21+T+%29+%7C+%28+S+%21+E+%29+%7C+%28+S+%21+S+%29+%7C+%28+S+%21+C+%29+%7C+%28+S+%21+Cs+%29+%7C+%28+S+%21+A+%29+%7C+%28+S+%21+T+%29+%7C+%28+C+%21+E+%29+%7C+%28+C+%21+S+%29+%7C+%28+C+%21+C+%29+%7C+%28+C+%21+Cs+%29+%7C+%28+C+%21+A+%29+%7C+%28+C+%21+T+%29+%7C+%28+Cs+%21+E+%29+%7C+%28+Cs+%21+S+%29+%7C+%28+Cs+%21+C+%29+%7C+%28+Cs+%21+Cs+%29+%7C+%28+Cs+%21+A+%29+%7C+%28+Cs+%21+T+%29.%0AE+-%3E+epsilon.%0AT+-%3E+a+%7C+b.&substs= +``` + +Неформальное обоснование - все продукции однозначно зависят от наполнения внутри. В том числе из-за беспрефиксности исключаются конфликты в LR(0) разборе. + diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" new file mode 100644 index 0000000..8770f4a --- /dev/null +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" @@ -0,0 +1,80 @@ +# 1 +Язык SRS с правилами над базисом $a^nba^n$ +$$\begin{aligned} +aba \to b^2ab\\ +ab^2 \to b^2a^2\\ +ab^2 \to b^2a +\end{aligned}$$ +Решение: + +# 2 +Язык $\{a^*a^kb^nc^ma^i \mid (k+n=m^2) \vee (n>m \& k n \Rightarrow$ нельзя накачать c. + +Таким образом слово нельзя накачать ни одним способом, значит язык не КС. + +Атрибутная грамматика для этого языка строится достаточно просто: +$$\begin{aligned} +S \to AABCA\text{ ; } & (A_2.v+B_3.v == C_4.v^2) \vee\\ &\vee(B_3.v>C_4.v \text{ \& }A_3.v [Pred] ; +[Pred] -> [Poly] [Expr] [Expr] ; Expr1.out == Expr2.out +[Expr] -> [Op].[Expr] ; Op.in == Expr1.out, Expr0.out = Op.out +[Expr] -> [Op] [Val] ; Op.in == Val.type, Expr.out = Op.out +[Op] -> G ; Op.in = R, Op.out = A +[Op] -> A ; Op.in = A, Op.out = R +[Op] -> R ; Op.in = A, Op.out = A +[Poly] -> E ; +[Val] -> ([Val]) | [Val]* | [Val][Val] | a ; Val.type = R +``` + +Словесное описание языка: +Выражения вида "E Op Val Op Val", где +Val - правильные регулярные выражения из символов a, скобок и звездочки. +Op - последовательность операторов G, A, R через точку, такие что: +- Последним оператором может быть оператор G; +- Перед A могут идти G; +- Перед G может идти A или R; +- Перед R может идти A или R; + +Можно переформулировать так: +- После A должен следовать G или R +- После R должен идти G или R +- После G идет либо регулярка, либо A + +Пары Op Val Op Val должны начинаться либо обе с A, либо обе с G или R. + +Пример строк принадлежащих языку +``` +E A.G (a)* A.R.R.G aaaa +E R.G.A.R.G aa* G a(a(aa*)) +``` + +Язык КС, так как соответствует следующей грамматике: +$$\begin{aligned} + \to &E\_ \\ + \to & A \_ \_ A\_ \mid\\ +&R \_ \_ R\_ \mid \\ +&R \_ \_ G\_ \mid \\ +&G \_ \_ R\_ \mid \\ +&G \_ \_ G\_ \\ + \to &.R\mid .G \\ + \to & .A \mid \varepsilon \\ + \to & \mid () \mid * \mid a +\end{aligned}$$ diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" new file mode 100644 index 0000000..524d5e8 --- /dev/null +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" @@ -0,0 +1,62 @@ +# 1. Язык синтаксически корректных вызовов функций на языке Рефал. Вызов функции заключается в угловые скобки, аргумент-выражение от имени функции отделяется пробелом, выражение может быть вызовом функции, конкатенацией двух выражений, выражением в скобках, строкой(в одинарных кавычках) или переменная. Внутри строки могут быть экранированные обратным слешем одинарные кавычки. Также обратным слешем внутри кавычек экранируется сам обратный слеш. +Язык КС, так как задается КС грамматикой: +``` +[S] -> <[Name] [Expr]> +[Expr] -> [E][Expr_Tail] +[Expr_Tail] -> [E][Expr_Tail] | epsilon +[E] -> ([Expr]) | "[String]" | [Name] | [S] +[String] -> \w [String] | \ [Special] [String] | epsilon +[Special] -> \ | " +[Name] -> \w [Name_Tail] +[Name_Tail] -> \w [Name_Tail] | epsilon +``` + +Построенная грамматика является LL(1) => язык **детерминированный КС**. + +**Префикс-свойство выполняется** так как требуется уравновешанность угловых скобок. То есть если слово `` является префиксом другого слова, то после закрывающей угловой скобки должно идти еще что-то, что не возможно по условиям грамматики. + +Проверка на VPL +Неформальное доказательство +Основной проблемой в том, чтобы язык был VPL является строки в двойных кавычках, так как там допускается наличие каких угодно символов, в том числе и открывающих и закрывающих скобок(круглых и угловых). +Тем самым, так как они обязаны быть в call, ret классах, и обязаны класть или снимать с стека ровно один символ, то язык не VPL. Если бы они не были в классах call, return то не получилось бы регулярно отслеживать вложенные структуры. +Формальное доказательство + +# 2. Язык образцов в языке Рефал, которые распознают множества слов, обладающие префикс-свойством. Алфавит образцов: $\{e_1, e_2, s_1, s_2, a,b\}$. Здесь $e_i$ - переменные типа выражение, $s_i$ - переменные типа буква, $a,b$ - буквы. +Пусть в слове есть $e_i$. Тогда можно разделить слово на три части: $v_1 e_i v_2$. +Тогда можно $e_iv_2$ можно полностью включить в $e_i$. Значит нарушается префикс свойство. => в слове не допустимы $e_i$. + +Если образец состоит из всех остальных символов, то он кодирует слова фиксированной длинны, для которых автоматически выполняется префикс свойство. +Поэтому язык можно записать с помощью регулярного выражения $(a|b|s_1|s_2)^*$. + +> Очевидно, что для самого языка образцов префикс свойство не выполняется. +> Очевидно, что минимальный НКА состоит из двух состояний(принимающее и не принимающее) и совпадает с минимальным ДКА. + +# 3. Язык атрибутной грамматики для Рефал-предложений: +``` +[S] → [Pattern] = [Expr] ; Expr.vars ⊆ Pattern.vars +[Pattern] → [Evar][Pattern] ; Pattern0.vars := Pattern1.vars ∪ {Evar.name} +[Pattern] → [Const] ; Pattern.vars := ∅ +[Const] → (a|b|c)∗ ; +[Expr] →< [Function]_[Expr] > [Expr] ; Expr0.vars := Expr1.vars∪Expr2.vars +[Expr] → [Expr][Expr] ; Expr0.vars := Expr1.vars ∪ Expr2.vars +[Expr] → [Const] ; Expr.vars := ∅ +[Expr] → [Evar] ; Expr.vars := {Evar.name} +[Evar] → e.[Num] ; Evar.name := e.(Num.str) +[Num] →1[Num] ; Num0.str := 1Num1.str +[Num] →0[Num] ; Num0.str := 0Num1.str +[Num] →ε ; Num.str := ε +``` + +**Текстовое описание атрибутной грамматики** +Атрибутная грамматика задает рефал предложения вида `Паттерн из переменных и констант = выражение`, где паттерн - набор переменных и констант `a,b,c`, а выражение может быть из функций, переменных и констант. +Функции записываются также как в первом задании +Переменные `e.n`, n - двоичное число обозначающее номер переменной. +Атрибутами задается свойство, что *в выражении можно использовать только переменные, использованные в паттерне.* + +**Язык не является КС.** +Доказательство 1 *(aka очевидно)* +На лекции доказывалось, что свойство "переменная была объявлена ранее" не является КС. И поэтому язык не КС, так как в нем есть это свойство + +Доказательство 2 *(aka лемма о накачке)* + +Доказательство 3 *(aka анализ стратифицированных периодов)* \ No newline at end of file From 840ed8b60bbfb981d962fbd102884fb3b1265df8 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 26 Jan 2026 17:56:44 +0300 Subject: [PATCH 2/3] minor fixes + var 23.2 --- ...200\320\270\320\260\320\275\321\202 23.md" | 180 ++++++++++++++++++ ...\200\320\270\320\260\320\275\321\202 8.md" | 0 ...20\270\320\260\320\275\321\202 epsilon.md" | 0 ...200\320\270\320\260\320\275\321\202 23.md" | 107 ----------- 4 files changed, 180 insertions(+), 107 deletions(-) create mode 100644 "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" rename "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" => "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" (100%) rename "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" => "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" (100%) delete mode 100644 "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" new file mode 100644 index 0000000..29df6e4 --- /dev/null +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" @@ -0,0 +1,180 @@ +# 1. Язык SRS $a \to bab \quad a^3 \to a^2 \quad ba \to ac$ над множеством базисных слов $b^n a^n$ +## Анализ завершимости SRS +Данная система очевидно является незавершимой, так как возможно бесконечно применять первое правило для любого слова, содержащее символ $a$. +## Анализ класса языка, порождаемого SRS над множеством базисных слов +Рассмотрим слова получаемых из базисного $a$ применением SRS + +Такие слова порождаются грамматикой +``` +T -> bTb | TR | a +R -> cRb | . +``` +Где `.` - пустое слово, $\varepsilon$ +Это не трудно заметить, проанализировав поведение первого и третьего правил переписывания. Первое правило позволяет сколько угодно наращивать с обеих сторон символы $b$. С другой стороны третье правило позволяет часть из них перекинуть на другую сторону. Тем самым справа от корня роста (символ $a$ окруженный равным количеством $b$ в том числе и отдельным символом $a$) может наблюдаться уравновешенный блок $c^n b^n$. Для учета этого вводится отдельный нетерминал и отдельное правило переписывания. + +Для $a^n$ нужно дополнительно учитывать, что мы можем произвольным образом сначала уменьшить число $a$ до двух и более, а после применять правила 1 и 3. + +Таким образом при рассмотрении языка над базисом $b^na^n$ нужно отдельно рассмотреть случаи $n=0, n=1, n\geq 2$ + +При $n = 0$ имеем только пустое слово. + +При n = 1 язык состоит либо из присоединения слева b к T (нетерминалу рассмотренному в самом начале), либо справа $c$. +``` +S -> bT | Tc +... +``` + +При $n\geq2$ необходимо допустить, что третье правило будет применено к исходному базисному слову произвольное число раз. + +Приведем грамматику без условия на $n$ +``` +S -> bST | bS | TE +E -> cE | . +... +``` + +Преобразуем ее с $n\geq2$ +``` +P -> bbSTT | bTET | TcET + +S -> bST | bS | TE +E -> cE | . +... +``` + +Объединяем вместе грамматики +``` +S'-> bT | Tc | P | . +P -> bbSTT | bTET | TcET +S -> bST | bS | TE +E -> cE | . +T -> bTb | aR +R -> cRb | . +``` + +Таким образом мы предъявили КС грамматику (недетерминированную), порождающую все слова языка $\implies$ язык КС. +## Анализ детерминированности данного языка +Пусть $n$ - длинна накачки. Рассмотрим два слова из языка +$$\begin{aligned} +b^{n+2} a b^n &\mid b \\ +b^{n+2} a b^n &\mid b a b^{n+1} a^n +\end{aligned}$$ +1) в втором слове нельзя **отрицательно** накачать префикс в КС смысле, так как первый отрезок $b$ уравновешивается $a$ в суффиксе, а второй отрезок $b$ уравновешивается $b$ из суффикса. Стоит сказать, что в положительную сторону накачка легко осуществима, например, при синхронной накачке участков $b$ они будут засчитаны за применение первого правила SRS. +2) накачка конец префикса + суффикс не работает в первом слове, так как $b$ уравновешивается первым отрезком $b$ в префиксе. + +Таким образом по лемме о накачки для DCFL получили, что язык не DCFL + +Также автоматически проверили, что нарушается *префикс свойство*. + +> Линейность языка можно опровергнуть с помощью леммы о накачке для линейных языков: +> Пусть $n$ - длинна накачки. Рассмотрим $w = b^{n+1} a (b^n a b^n)^n$ +> При накачке первых $n$ символов и последних $n$ символов мы гарантированно выйдем из языка, так как они уравновешиваются разными структурами $\implies$ язык не линейный КС. +# 2. Язык $\{w \mid |w|_{ab}=|w|_{baa} \text{ \& } w=w^R\}$ +## Анализ класса языка +Язык $L$ состоит из слов в котором число подслов $ab$ равно числу подслов $baa$ и при этом слова являются палиндромами (причем как четными так и нечетными). Можно заметить также дополнительный факт, что в силу обратимости языка, будет выполнено следующее условие $|w|_{ba}= |w|_{aab}$. + +Примеры слов из языка: +- очевидно, что слова, состоящие только из $a$ или символов $b$ (в том числе и пустое слово), очевидно принадлежат языку, так как количество подслов обоих типов будут равны 0. +- $baab \in L$ ровно как и $baabaab, baabaabaab$ и так далее. То есть можно сказать, что $baab(aab)^* \subseteq L$. Кроме того, каждый символ $b$ и $a$ можно расширить, если дополнительно уравновесить их в другой части слова, для сохранения палиндромности. +- $aabaa \in L$, и аналогично $aabaabaa \in L$. То есть можно сказать, что $aabaa(baa)^* \subseteq L$ + +Стоит сказать, что из структуры подслов очевидно наблюдается, что количество подслов $ab$ может значительно расти по сравнению с $baa$, например последовательность $(ab)^*$. В то время как количество $baa$ не может превышать число $ab$ больше чем на 1. + +>[!note] Доказательство утверждения о количестве подслов +> Пусть у нас есть строка $w : |w|_{ab}=|w|_{baa} \& |w| \ge 1$. Пусть оно заканчивается на $a$, тогда чтобы увеличить число $baa$ нужно будет добавить соответствующую подстроку к слову. Но вместе с тем и число $ab$ вырастет как минимум на 1. Если даже мы до этого добавим произвольную подстроку, то если там не встретится $ab$, то ситуация не поменяется, а если встретится, то количество вырастет еще сильнее. +> Если слово $w$ заканчивалось на $b$, то тогда для увеличения количества хватит добавить $a^2$, что увеличит разницу на 1, но после ситуация сведется к первому случаю. Стоит сказать, что такой дисбаланс возможен только в случае, если первым в слове встретилось именно $baa$, что возможно если префикс слова имеет вид $b^*baa$ (для большего детерминизма $bb^*aa$) +> Теперь пусть мы начинаем с пустого слова, тогда общая ситуация сводится лишь к тому, какой символ будет написан первым, что сведет задачу к предыдущим случаям. + +Таким образом можно выделить только 4 возможных основ языка +$$a^* \mid b^* \mid baab(aab)^* \mid aabaa(baa)^*$$ +и в каждой из этих основ могут дополнительно разрастаться количества $a$ и $b$ сохраняя соотношения между количествами слов. Есть ли ограничения на итерацию? Для первой и второй альтернативы очевидно нет. Для третьей и четвертой, итерации задают бесконечное количество одинаковых симметричных накладывающихся подслов, поэтому ограничений так же нет. + +Поэтому для данного языка можно построить следующую грамматику: +$$\begin{matrix} +S \to A \mid B \mid C \mid D \\ +A \to aA \mid \varepsilon \\ +B \to bB \mid \varepsilon \\ +\\ +C \to bC_1b \mid B\\ +C_1 \to aC_2a \mid A\\ +C_2 \to aCa \\ +\\ +D \to C_1 +\end{matrix}$$ +Объяснение данной грамматики + +Данная грамматика не в полной мере отражает возможности по дополнительной накачке символов, и кроме того имеет не совсем удобную нумерацию и расположения. Поэтому финальный вариант грамматики выглядит следущим образом +$$\begin{matrix} +S \to C \mid D \\ +C \to bCb \mid bDb \mid B\\ +D \to aDa \mid aEa \mid A\\ +E \to aEa \mid aCa \\ +\\ +A \to aA \mid \varepsilon \\ +B \to bB \mid \varepsilon \\ +\end{matrix}$$ + +Таким образом, язык является КС. +## Анализ на детерминированность +В-первых для повышения детерминированности стоит немного доработать грамматику, убрав лишний недетерминизм (например правила $C \to bCb \mid b^*$) +$$\begin{matrix} +S \to C \mid D \mid \varepsilon \\ +C \to bCb \mid bDb \mid bb \mid b \\ +D \to aDa \mid aEa \mid aa \mid a \\ +E \to aEa \mid aCa \\ +\end{matrix}$$ +Потенциально уже сейчас можно сказать, что данный язык будет недетерминированным, приведя в качестве аргумента недетерминированность языков палиндромов. Но фактически это не означает недетерминированность, а только намекает на нее. + +Наибольший недетерминизм создают нетерминалы $D$ и $E$, так как мы никогда не можем четко сказать, какой из них необходимо использовать. Именно это мы можем использовать для оценки недетерминированности языка + + + +## Прочие свойства +Очевидно, нарушение префикс свойства (контрпример - $baab(aab)^*$) +Построенная грамматика является линейной $\implies$ линейный язык. + + +# 3. Атрибутная грамматика +``` +S -> [regexp] +[regexp] -> ([regexp][regexp]) +... +Пока опущу грамматику из условия +``` + +Текстовое описание языка: +Язык описывает регулярные выражения, состоящие из a, b и epsilon. Операции построения регулярки обрамляются в круглые скобочки, причем: +- не допускаются вложенные звездочки вида (a* b*)* +- внутри альтернативы есть как минимум одна не пустая альтернатива, и первый элемент не может быть альтернативой +- не допускается звездочка или конкатенация с пустым словом + +Таким образом можно построить грамматику, которая учитывает эти условия: +``` +R -> E | T | A | Cs | C +S -> (T)* | (C)* | (A)* +C -> (TT) | (TS) | (TCs) | (TA) | (TC) | (ST) | (SA) | (SC) | (CsT) | (CsA) | (CsC) | (AT) | (AS) | (ACs) | (AA) | (AC) | (CT) | (CS) | (CCs) | (CA) | (CC) +Cs -> (SS) | (CsS) | (SCs) | (CsCs) +A -> (E|T) | (E|S) | (E|C) | (E|Cs) | (E|A) | (T|E) | (T|S) | (T|C) | (T|Cs) | (T|A) | (T|T) | (S|E) | (S|S) | (S|C) | (S|Cs) | (S|A) | (S|T) | (C|E) | (C|S) | (C|C) | (C|Cs) | (C|A) | (C|T) | (Cs|E) | (Cs|S) | (Cs|C) | (Cs|Cs) | (Cs|A) | (Cs|T) +E -> epsilon +T -> a | b +``` + +Описание смыслов нетерминалов: +- $T$ - внутренний символ алфавита +- $E$ - пустой символ выделен в отдельный символ, так как в грамматике требуется учет непустых альтернатив +- $A$ - нетерминал, отвечающий за операцию альтернатива, которая учитывает правила языка - в альтернативе есть одна непустая альтернатив и первый элемент не может быть альтернативой. +- $S$ - операция звездочка +- $C$ - операция конкатенации без вложенных звездочек +- $Cs$ - конкатенация двух звездочек +- $R$ - нетерминал регулярного выражения. + +Язык беспрефиксный, так как все операции обрамляются скобками. + +По построенной грамматике возможно построить lr(0) парсер => язык детерминированный. +Ссылка на построенную таблицу LR(0) разбора(Я вручную это все делать не буду) +``` +https://smlweb.cpsc.ucalgary.ca/lr0.php?grammar=R+-%3E+E+%7C+T+%7C+A+%7C+Cs+%7C+C+%7C+S.%0AS+-%3E+%28+T+%29+%2A+%7C+%28+C+%29+%2A+%7C+%28+A+%29+%2A.%0AC++-%3E+%28+T+T+%29+%7C+%28+T+S+%29+%7C+%28+T+Cs+%29+%7C+%28+T+A+%29+%7C+%28+T+C+%29+%7C+%28+S+T+%29+%7C+%28+S+A+%29+%7C+%28+S+C+%29+%7C+%28+Cs+T+%29+%7C+%28+Cs+A+%29+%7C+%28+Cs+C+%29+%7C+%28+A+T+%29+%7C+%28+A+S+%29+%7C+%28+A+Cs+%29+%7C+%28+A+A+%29+%7C+%28+A+C+%29+%7C+%28+C+T+%29+%7C+%28+C+S+%29+%7C+%28+C+Cs+%29+%7C+%28+C+A+%29+%7C+%28+C+C+%29.%0ACs+-%3E+%28+S+S+%29+%7C+%28+Cs+S+%29+%7C+%28+S+Cs+%29+%7C+%28+Cs+Cs+%29.%0AA+-%3E+%28+E+%21+T+%29+%7C+%28+E+%21+S+%29+%7C+%28+E+%21+C+%29+%7C+%28+E+%21+Cs+%29+%7C+%28+E+%21+A+%29+%7C+%28+T+%21+E+%29+%7C+%28+T+%21+S+%29+%7C+%28+T+%21+C+%29+%7C+%28+T+%21+Cs+%29+%7C+%28+T+%21+A+%29+%7C+%28+T+%21+T+%29+%7C+%28+S+%21+E+%29+%7C+%28+S+%21+S+%29+%7C+%28+S+%21+C+%29+%7C+%28+S+%21+Cs+%29+%7C+%28+S+%21+A+%29+%7C+%28+S+%21+T+%29+%7C+%28+C+%21+E+%29+%7C+%28+C+%21+S+%29+%7C+%28+C+%21+C+%29+%7C+%28+C+%21+Cs+%29+%7C+%28+C+%21+A+%29+%7C+%28+C+%21+T+%29+%7C+%28+Cs+%21+E+%29+%7C+%28+Cs+%21+S+%29+%7C+%28+Cs+%21+C+%29+%7C+%28+Cs+%21+Cs+%29+%7C+%28+Cs+%21+A+%29+%7C+%28+Cs+%21+T+%29.%0AE+-%3E+epsilon.%0AT+-%3E+a+%7C+b.&substs= +``` + +Неформальное обоснование - все продукции однозначно зависят от наполнения внутри. В том числе из-за беспрефиксности исключаются конфликты в LR(0) разборе. + diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" similarity index 100% rename from "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" rename to "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 8.md" diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" similarity index 100% rename from "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" rename to "\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 epsilon.md" diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" deleted file mode 100644 index e9bab6c..0000000 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" +++ /dev/null @@ -1,107 +0,0 @@ -# 1. Язык SRS $a \to bab \quad a^3 \to a^2 \quad ba \to ac$ над множеством базисных слов $b^n a^n$ - -Рассмотрим слова получаемых из базисного $a$ применением SRS - -Такие слова порождаются грамматикой -``` -T -> bTb | aR -R -> cRb | . -``` -Где `.` - пустое слово, $\varepsilon$ -Это не трудно заметить, проанализировав поведение первого и третьего правил переписывания. - -Для $a^n$ нужно дополнительно учитывать, что мы можем произвольным образом сначала уменьшить число `a` до двух и более, а после применять правила 1 и 3. - -Таким образом при рассмотрении языка над базисом $b^na^n$ нужно отдельно расмотреть случаи $n=0, n=1, n\geq 2$ - -При $n = 0$ имеем только пустое слово. - -При n = 1 язык состоит либо из присоединения слева b к T (нетерминалу рассмотренному в самом начале), либо справа c. -``` -S -> bT | Tc -... -``` - -При $n\geq2$ необходимо допустить, что третье правило будет пременено к исходному базисному слову произвольное число раз. - -Приведем грамматику без условия на n -``` -S -> bST | bS | TE -E -> cET | cE | . -... -``` - -Преобразуем ее с $n\geq2$ -``` -P -> bbSTT | bTET | TcET - -S -> bST | bS | TE -E -> cET | cE | . -... -``` - -Объединяем вместе грамматики -``` -S' -> bT | Tc | P | . -P -> bbSTT | bTET | TcET -S -> bST | bS | TE -E -> cET | cE | . -T -> bTb | aR -R -> cRb | . -``` - -Таким образом мы предъявили КС грамматику(недетерминированную), порождающую все слова языка => язык КС. - -Проверим детерминированность. -Пусть n - длинна накачки. Рассмотрим два слова из языка -$$\begin{aligned} -b^{n+2} a b^n &\mid b \\ -b^{n+2} a b^n &\mid b a b^{n+1} a^n -\end{aligned}$$ -1) в втором слове нельзя накачать префикс в КС смысле, так как первый отрезок b уравновешивается a в суффиксе, а второй отрезок b уравновешивается b из суффикса -2) накачка конец префикса + суффикс не работает в первом слове, так как b уравновешивается первым отрезком b в префиксе - -Таким образом по лемме о накачки для DCFL получили, что язык не DCFL - -Также автоматически проверили, что нарушается префикс свойство. - -> Линейность языка можно опровергнуть с помощью леммы о накачке для линейных: -> Пусть n - длинна накачки. Рассмотрим $w = b^{n+1} a (b^n a b^n)^n$ -> При накачке первых n символов и последних n символов мы гарантированно выйдем из языка, так как они уравновешиваются разными структурами => язык не линейный КС. -# 2. Язык $\{w \mid |w|_{ab}=|w|_{baa} \text{ \& } w=w^R\}$ -#пусто -# 3. Атрибутная грамматика -``` -S -> [regexp] -[regexp] -> ([regexp][regexp]) -... -Пока опущу грамматику из условия -``` - -Текстовое описание языка: -Язык описывает регулярные выражения, состоящие из a, b и epsilon. Операции построения регулярки абрамляются в круглые скобочки, причем: -- не допускаются вложенные звездочки вида (a* b*)* -- внутри альтернативы есть как минимум одна не пустая альтернатива, и первый элемент не может быть альтернативой -- не допускается звездочка или конкатенация с пустым словом - -Таким образом можно построить грамматику, которая учитывает эти условия: -``` -R -> E | T | A | Cs | C -S -> (T)* | (C)* | (A)* -C -> (TT) | (TS) | (TCs) | (TA) | (TC) | (ST) | (SA) | (SC) | (CsT) | (CsA) | (CsC) | (AT) | (AS) | (ACs) | (AA) | (AC) | (CT) | (CS) | (CCs) | (CA) | (CC) -Cs -> (SS) | (CsS) | (SCs) | (CsCs) -A -> (E|T) | (E|S) | (E|C) | (E|Cs) | (E|A) | (T|E) | (T|S) | (T|C) | (T|Cs) | (T|A) | (T|T) | (S|E) | (S|S) | (S|C) | (S|Cs) | (S|A) | (S|T) | (C|E) | (C|S) | (C|C) | (C|Cs) | (C|A) | (C|T) | (Cs|E) | (Cs|S) | (Cs|C) | (Cs|Cs) | (Cs|A) | (Cs|T) -E -> epsilon -T -> a | b -``` - -Язык беспрефиксный, так как все операции обрамляются скобками. - -По построенной грамматике возможно построить lr(0) парсер => язык детерминированный. -Ссылка на построенную таблицу LR(0) разбора(Я вручную это все делать не буду) -``` -https://smlweb.cpsc.ucalgary.ca/lr0.php?grammar=R+-%3E+E+%7C+T+%7C+A+%7C+Cs+%7C+C+%7C+S.%0AS+-%3E+%28+T+%29+%2A+%7C+%28+C+%29+%2A+%7C+%28+A+%29+%2A.%0AC++-%3E+%28+T+T+%29+%7C+%28+T+S+%29+%7C+%28+T+Cs+%29+%7C+%28+T+A+%29+%7C+%28+T+C+%29+%7C+%28+S+T+%29+%7C+%28+S+A+%29+%7C+%28+S+C+%29+%7C+%28+Cs+T+%29+%7C+%28+Cs+A+%29+%7C+%28+Cs+C+%29+%7C+%28+A+T+%29+%7C+%28+A+S+%29+%7C+%28+A+Cs+%29+%7C+%28+A+A+%29+%7C+%28+A+C+%29+%7C+%28+C+T+%29+%7C+%28+C+S+%29+%7C+%28+C+Cs+%29+%7C+%28+C+A+%29+%7C+%28+C+C+%29.%0ACs+-%3E+%28+S+S+%29+%7C+%28+Cs+S+%29+%7C+%28+S+Cs+%29+%7C+%28+Cs+Cs+%29.%0AA+-%3E+%28+E+%21+T+%29+%7C+%28+E+%21+S+%29+%7C+%28+E+%21+C+%29+%7C+%28+E+%21+Cs+%29+%7C+%28+E+%21+A+%29+%7C+%28+T+%21+E+%29+%7C+%28+T+%21+S+%29+%7C+%28+T+%21+C+%29+%7C+%28+T+%21+Cs+%29+%7C+%28+T+%21+A+%29+%7C+%28+T+%21+T+%29+%7C+%28+S+%21+E+%29+%7C+%28+S+%21+S+%29+%7C+%28+S+%21+C+%29+%7C+%28+S+%21+Cs+%29+%7C+%28+S+%21+A+%29+%7C+%28+S+%21+T+%29+%7C+%28+C+%21+E+%29+%7C+%28+C+%21+S+%29+%7C+%28+C+%21+C+%29+%7C+%28+C+%21+Cs+%29+%7C+%28+C+%21+A+%29+%7C+%28+C+%21+T+%29+%7C+%28+Cs+%21+E+%29+%7C+%28+Cs+%21+S+%29+%7C+%28+Cs+%21+C+%29+%7C+%28+Cs+%21+Cs+%29+%7C+%28+Cs+%21+A+%29+%7C+%28+Cs+%21+T+%29.%0AE+-%3E+epsilon.%0AT+-%3E+a+%7C+b.&substs= -``` - -Неформальное обоснование - все продукции однозначно зависят от наполнения внутри. В том числе из-за беспрефиксности исключаются конфликты в LR(0) разборе. - From 39f446153a60bdd3a76450eede292dd256aa87fb Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 26 Jan 2026 18:05:32 +0300 Subject: [PATCH 3/3] 23.2 determinisation + ll(3) --- ...\200\320\270\320\260\320\275\321\202 23.md" | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" index 29df6e4..985cc5d 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/2024 \320\240\320\2322/\320\240\320\2322 - \320\222\320\260\321\200\320\270\320\260\320\275\321\202 23.md" @@ -125,10 +125,20 @@ E \to aEa \mid aCa \\ \end{matrix}$$ Потенциально уже сейчас можно сказать, что данный язык будет недетерминированным, приведя в качестве аргумента недетерминированность языков палиндромов. Но фактически это не означает недетерминированность, а только намекает на нее. -Наибольший недетерминизм создают нетерминалы $D$ и $E$, так как мы никогда не можем четко сказать, какой из них необходимо использовать. Именно это мы можем использовать для оценки недетерминированности языка - - - +Наибольший недетерминизм создают нетерминалы $D$ и $E$, так как мы никогда не можем четко сказать, какой из них необходимо использовать. Это можно незначительно уменьшить, если убрать рекурсию нетерминала $E$ и если объединить оставшееся правило с D +$$\begin{matrix} +S \to C \mid D \mid \varepsilon \\ +C \to bCb \mid bDb \mid bb \mid b \\ +D \to aDa \mid aaCaa \mid aa \mid a \\ +\end{matrix}$$ +Таким образом мы теперь имеем 2 отдельных нетерминала, которые отвечают за разные символы в языке. И таким образом можно построить LL(3) разбор данного языка, который будет гарантировать детерминированность разбора. Можно добавить большую детерминированность, если перенести обязательные символы из последнего шага к первому в силу коммутативности перестановок одинаковых символов: +$$\begin{matrix} +S \to C \mid D \mid \varepsilon \\ +C \to bC_1b \mid bb \mid b \\ +C_1 \to bC_1b \mid D \\ +D \to aaD_1aa \mid aa \mid a \\ +D_1 \to aD_1a \mid C +\end{matrix}$$ ## Прочие свойства Очевидно, нарушение префикс свойства (контрпример - $baab(aab)^*$) Построенная грамматика является линейной $\implies$ линейный язык.