From 7427e18a64f2ec82809986edfa65f1cd6fcef979 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 24 Jun 2025 22:24:39 +0300 Subject: [PATCH 01/14] tree languages: part 1 --- ...213\320\262\320\276\320\264\320\260(I).md" | 331 ++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 "\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" new file mode 100644 index 0000000..ae5538a --- /dev/null +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -0,0 +1,331 @@ +Мы уже знаем, что КС-грамматики состоят из +$$\{N, \Sigma, S, R\}$$ +N - множество нетерминалов +$\Sigma$ - множество терминалов +$S$ - стартовый нетерминал +$R$ - множество правил вывода вида $N \times (N \cup \Sigma)^*$ +$$A \to \varphi_1...\varphi_k$$ +Поэтому разбор по грамматики в сути своей является построением дерева вывода слова по грамматики. Вы об этом уже знаете с первого курса, но повторить стоит. + +Рассмотрим граммматику +$$\begin{aligned} +S \to aBS \mid \varepsilon \\ +B \to b \mid aBB +\end{aligned}$$ +Рассмотрим разбор слова `aababb`. +Так как в b может раскрываться только нетерминал B, то сразу очевидно, что +$$aa\underbrace{b}_Ba\underbrace{b}_B\underbrace{b}_B$$ +Дальше видим ситуацию, что одна a зажата между двумя развертками B, поэтому она может раскрываться по двум случаям(как S или как B). + +Получаем несколько деревьев, порождающих слово `aababb`. + +```dot +digraph{ + B1,B2[label=B] + a1,a2,a3[label=a] + b2,b3,b4[label=b] + eps1[label="ε"] + S -> a1, B1, eps1 + {rank=same; a1 -> B1 -> eps1[style=invis]} + B1 -> a2, b2, B2 + {rank=same; a2 -> b2 -> B2[style=invis]} + B2 -> a3, b3, b4 + {rank=same; a3 -> b3 -> b4[style=invis]} +} +``` + +>[!note] Определение +> Дерево разбора - это дерево, в листьях которого находятся терминалы, ветвления помечены нетерминалами, при этом каждое ветвление, помеченное нетерминалом $A \in N$, может иметь только потомков $\beta_1...\beta_k$, где $A \to \beta_1...\beta_k \in R$ +> И корень помечен стартовым нетерминалом + +Как мы могли бы еще описывать такие структуры? Понятно, что это дерево, которое получается из грамматики. Но если посмотрим, на эти все рассуждения, то можем заметить, что если бы мы имели более выразительный язык автоматов, то мы бы получили автомат. Получается, мы можем рассмотреть автоматы, порождающие деревья вывода. + +Рассмотрим соответствующее расширение. + +>[!note] Определение +>Сигнатура - набор пар $\{\}$, где $f_i$ - функциональный символ, а $n_i$ - арность или местность, обозначающая количество аргументов, которое может он принимать. + +Теперь будем действовать аналогично тому, как мы действовали с конечными автоматами, только теперь будут подаваться на вход автоматов не отдельные строки, а некоторые функциональные символы. + +Есть 2 типа таких автоматов: **top-bottom** автоматы и **bottom-top** автоматы, в первом варианте автомат идет от корня к листьям, а в втором от листьев к корню, но они в сути своей ничем не отличаются в смысле выразительной силы. Обычно рассматривают bottom-top автоматы. + +Далее будем рассматривать bottom-top автоматы. + +>[!note] Определение +Конфигурация автомата $\mathcal A$ - дерево сигнатуры $T[S]$, в котором есть $\boxed{}$ - "дыра", говорящая то, что в этом месте еще что-то не вычислили. + +Рассмотрим дерево разбора слова `aabb` для грамматики, рассмотренной ранее. + +```dot +digraph{ + S,S1[label=S] + B1,B2,B3[label=B] + a1,a2[label=a] + b3,b4[label=b] + eps1[label="ε"] + + a1,a2,b3,b4,eps1[shape=square, xlabel=q0] + + S -> a1, B1, S1 + {rank=same; a1 -> B1 -> S1[style=invis]} + S1 -> eps1 + B1 -> a2, B2, B3 + {rank=same; a2 -> B2 -> B3[style=invis]} + B2 -> b3 + B3 -> b4 +} +``` + +Здесь начальные состояния помечены квадратными вершинами, и подписаны стартовым состоянием $q0$. Поскольку их много и они на листьях по умолчанию, то листовые конструкторы или конструкторы имеющие арность 0, считаются стартовыми состояниями. Поэтому мы говорим, что + +> [!note] Определение +> Конструктор $C_0$, такой что $\operatorname{ar}(C_0) = \emptyset$ - это **стартовый конструктор** bottom-top автомата. +> Записывается, как +> $$C_0 \to q_i(C_0)$$ +> где $q_i$ - состояние bottom-top автомата. На практике это состояние согласовывают с конструктором(терминальным символом). + +Поэтому для нашего дерева мы получим следующую конструкцию +```dot +digraph{ + S,S1[label=S] + B1,B2,B3[label=B] + a1,a2[label=a] + b3,b4[label=b] + eps1[label="ε"] + + a1,a2[shape=square, xlabel=qa] + b3,b4[shape=square, xlabel=qb] + eps1[shape=square, xlabel=qe] + + S -> a1, B1, S1 + {rank=same; a1 -> B1 -> S1[style=invis]} + S1 -> eps1 + B1 -> a2, B2, B3 + {rank=same; a2 -> B2 -> B3[style=invis]} + B2 -> b3 + B3 -> b4 +} +``` + +Дальше нам нужно научиться собирать дерево из своих листьев. Здесь нам как раз и понадобятся "дыры", причем все "дыры" считаются независимыми, контекстно-свободными. Как это выглядит? +Если у нас есть некоторый конструктор $f_k$ арности k от $q_1...q_k$, то мы можем вычислить состояние, которое мы наблюдаем над ветвлением: +$$f_k(q_1(X_1), ... q_k(X_k)) \to q_f(X_1...X_k)$$ +И наша конфигурация говорит, что "тут мы начинаем продвигаться выше по дереву". +Перерисуем нашу конфигурацию +```dot +digraph{ + node[shape=none] + S,S1[label=S] + B1,B2[label=B] + a1,a2[label=a] + b3,b4[label=b] + eps1[label="ε"] + + a1,a2[xlabel=qa] + b3,b4[xlabel=qb] + eps1[xlabel=qe] + b3[shape=square, style=filled] + + S -> a1, B1, S1 + {rank=same; a1 -> B1 -> S1[style=invis]} + S1 -> eps1 + B1 -> a2, B2, B3 + {rank=same; a2 -> B2 -> B3[style=invis]} + B2 -> b3 + B3 -> b4 +} +``` + +Пусть мы начинаем двигаться от вершины, помеченной квадратом. Теперь смотрим, какие у нас есть конструкторы и относящиеся к ним правила переписывания. +$$\begin{aligned} +a &\to q_a(a)\\ +b &\to q_b(b)\\ +\varepsilon &\to q_\varepsilon(\varepsilon)\\ +B(q_b(X)) &\to q_B(B(X))\\ +B(q_a(X_1), q_B(X_2), q_B(X_3)) &\to q_B(B(X_1, X_2, X_3)) \\ +S(q_\varepsilon(X)) &\to q_S(S(X))\\ +S(q_a(X_1), q_B(X_2), q_S(X_3)) &\to q_S(S(X_1, X_2, X_3)) +\end{aligned}$$ + + Получим +```dot +digraph{ + node[shape=none] + + + + S,S1[label=S] + B1,B3[label=B] + a1,a2[label=a] + b3,b4[label=b] + eps1[label="ε"] + + a1,a2[xlabel=qa] + b4[xlabel=qb] + eps1[xlabel=qe] + + S -> a1, B1, S1 + {rank=same; a1 -> B1 -> S1[style=invis]} + S1 -> eps1 + B1 -> a2, B2, B3 + { + a2 -> B2 -> B3[style=invis] + subgraph cluster_sidjfisd { + label="qB" + style=filled; + B2[label=B] + b3[shape=square] + B2 -> b3; + } + } + + B3 -> b4 +} +``` + +Далее подняться не можем, так как нам нужно собрать другие ребра. Переместимся на листок `a`. +```dot +digraph{ + node[shape=none] + S,S1[label=S] + B1,B3[label=B] + a1,a2[label=a] + b3,b4[label=b] + eps1[label="ε"] + + a1,a2[xlabel=qa] + b4[xlabel=qb] + eps1[xlabel=qe] + + a2[shape=square, style=filled] + + S -> a1, B1, S1 + {rank=same; a1 -> B1 -> S1[style=invis]} + S1 -> eps1 + B1 -> a2, B2, B3 + { + a2 -> B2 -> B3[style=invis] + subgraph cluster_sidjfisd { + label="qB" + B2[label=B] + b3[shape=square] + B2 -> b3; + } + } + + B3 -> b4 +} +``` + +переместимся на листок b. И аналогично поднимемся на одну ступеньку выше. +```dot +digraph{ + node[shape=none] + S,S1[label=S] + B1,B3[label=B] + a1,a2[label=a] + b3,b4[label=b] + eps1[label="ε"] + + a1,a2[xlabel=qa] + b4[xlabel=qb] + eps1[xlabel=qe] + + a2[shape=square] + + S -> a1, B1, S1 + {rank=same; a1 -> B1 -> S1[style=invis]} + S1 -> eps1 + B1 -> a2, B2, B3 + { + a2 -> B2 -> B3[style=invis] + subgraph cluster_0 { + label="qB" + B2[label=B] + b3[shape=square] + B2 -> b3; + } + subgraph cluster_1 { + style=filled; + label="qB" + B3[label=B] + b4[shape=square] + B3 -> b4 + } + } +} +``` + +Теперь мы можем подняться на вершину выше с помощью правила $B(q_a(X_1), q_B(X_2), q_B(X_3)) \to q_B(B(X_1, X_2, X_3))$. +```dot +digraph{ +node[shape=none] +S,S1[label=S] +B1,B3[label=B] +a1,a2[label=a] +b3,b4[label=b] +eps1[label="ε"] +a1,a2[xlabel=qa] +b4[xlabel=qb] +eps1[xlabel=qe] +a2[shape=square] +S -> a1, B1, S1 +S1 -> eps1 +{rank=same; a1 -> B1 -> S1[style=invis]} +B1 [group=cluster_2]; +subgraph cluster_2{ +style=filled; +label=qB; +B1 -> a2, B2, B3 +{ a2 -> B2 -> B3[style=invis] +subgraph cluster_0 { +label="qB" +B2[label=B] +b3[shape=square] +B2 -> b3; +} +subgraph cluster_1 { +style=filled; +label="qB" +B3[label=B] +b4[shape=square] +B3 -> b4 +} } } } +``` + + +Далее точно также поднимаемся по остальным ребрам. Если над корнем мы получили $q_S$, то значит слово действительно порождается нашей грамматикой. + +> [!warning] Но здесь есть нюанс с сигнатурой. +> Мы видим, что конструктор $S$ может быть как одноместным, так и трехместным. Такую неоднозначность нужно учитывать: либо мы заводим разные нетерминалы, для разных арностей, либо мы меняем грамматику, чтобы везде была однаковая арность. Для теоретических целей мы можем сказать, что всегда можно перейти к [[Нормальная форма Хомского|нормальной форме Хомского]], и получим, что все конструкторы имеют арность 2. + +Если в грамматике G есть правило вида +$$\begin{aligned} +A_i \to \varphi_i \\ +A_i \to \varphi_j +\end{aligned} \qquad |\varphi_i| \neq |\varphi_j|$$ +Тогда заводим нетерминалы $A_{i,|\varphi_i|}, A_{i, |\varphi_j|}$ используемые произвольно вместо $A_i$, и имеющие сигнатуры соответствующей длинны. +Так наша грамматика перепишется в следующий вид +$$\begin{aligned} +S &\to S_1 \mid S_3 \\ +S_1 &\to \varepsilon \\ +S_3 &\to aB_1S_1\mid a B_3 S_1 \mid a B_1 S_3\mid aB_3S_3 \\ +B_1 &\to b \\ +B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 +\end{aligned}$$ +Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. + +>[!note] Определение +> Грамматика G находится в нормальной форме Хомского $\Leftrightarrow$ правила G имеют вид +> $$\begin{matrix} +> A_i \to A_j A_k \quad (A_i, A_j, A_k \in N)\\ +> \text{или} \\ +> A_i \to c \quad(c \in \Sigma) +> \end{matrix}$$ + +Что нам мешает получить НФХ? +1) $A \to \varepsilon$ + Нужно понять какие нетерминалы могут выродиться в пустое слово. Здесь алгоритм крайне похож на нахождение и удаление эпсилон-замыканий в автоматах. Из грамматики мы убираем все эпсилон правила, кроме случаем когда пустое слово принадлежит языку. Тогда мы добавляем стартовый символ $S_0 \to S \mid \varepsilon$. +2) Смешанные правила ($A_i \to a A_j$) убираем добавляя новые нетерминалы в грамматику. +3) Длинные правила разбиваем на последовательность коротких правил +4) Цепные правила $A_i \to A_j$ значат, что с точки зрения НКА есть переход по пустому слову из $A_i$ в $A_j$. Мы заменяем все вхождения $A_i$ на $A_j$. \ No newline at end of file From d135ba93b17459ea60a8cf06db9b307d6cebfdac Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Fri, 4 Jul 2025 18:22:31 +0300 Subject: [PATCH 02/14] fixes and half of part 2 --- ...213\320\262\320\276\320\264\320\260(I).md" | 33 +---- ...13\320\262\320\276\320\264\320\260(II).md" | 130 ++++++++++++++++++ ...21\201\320\272\320\276\320\263\320\276.md" | 30 ++++ 3 files changed, 161 insertions(+), 32 deletions(-) create mode 100644 "\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" create mode 100644 "\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" index ae5538a..ee3b126 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -297,35 +297,4 @@ B3 -> b4 Далее точно также поднимаемся по остальным ребрам. Если над корнем мы получили $q_S$, то значит слово действительно порождается нашей грамматикой. > [!warning] Но здесь есть нюанс с сигнатурой. -> Мы видим, что конструктор $S$ может быть как одноместным, так и трехместным. Такую неоднозначность нужно учитывать: либо мы заводим разные нетерминалы, для разных арностей, либо мы меняем грамматику, чтобы везде была однаковая арность. Для теоретических целей мы можем сказать, что всегда можно перейти к [[Нормальная форма Хомского|нормальной форме Хомского]], и получим, что все конструкторы имеют арность 2. - -Если в грамматике G есть правило вида -$$\begin{aligned} -A_i \to \varphi_i \\ -A_i \to \varphi_j -\end{aligned} \qquad |\varphi_i| \neq |\varphi_j|$$ -Тогда заводим нетерминалы $A_{i,|\varphi_i|}, A_{i, |\varphi_j|}$ используемые произвольно вместо $A_i$, и имеющие сигнатуры соответствующей длинны. -Так наша грамматика перепишется в следующий вид -$$\begin{aligned} -S &\to S_1 \mid S_3 \\ -S_1 &\to \varepsilon \\ -S_3 &\to aB_1S_1\mid a B_3 S_1 \mid a B_1 S_3\mid aB_3S_3 \\ -B_1 &\to b \\ -B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 -\end{aligned}$$ -Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. - ->[!note] Определение -> Грамматика G находится в нормальной форме Хомского $\Leftrightarrow$ правила G имеют вид -> $$\begin{matrix} -> A_i \to A_j A_k \quad (A_i, A_j, A_k \in N)\\ -> \text{или} \\ -> A_i \to c \quad(c \in \Sigma) -> \end{matrix}$$ - -Что нам мешает получить НФХ? -1) $A \to \varepsilon$ - Нужно понять какие нетерминалы могут выродиться в пустое слово. Здесь алгоритм крайне похож на нахождение и удаление эпсилон-замыканий в автоматах. Из грамматики мы убираем все эпсилон правила, кроме случаем когда пустое слово принадлежит языку. Тогда мы добавляем стартовый символ $S_0 \to S \mid \varepsilon$. -2) Смешанные правила ($A_i \to a A_j$) убираем добавляя новые нетерминалы в грамматику. -3) Длинные правила разбиваем на последовательность коротких правил -4) Цепные правила $A_i \to A_j$ значат, что с точки зрения НКА есть переход по пустому слову из $A_i$ в $A_j$. Мы заменяем все вхождения $A_i$ на $A_j$. \ No newline at end of file +> Мы видим, что конструктор $S$ может быть как одноместным, так и трехместным. Такую неоднозначность нужно учитывать: либо мы заводим разные нетерминалы, для разных арностей, либо мы меняем грамматику, чтобы везде была однаковая арность. Для теоретических целей мы можем сказать, что всегда можно перейти к [[Нормальная форма Хомского|нормальной форме Хомского]], и получим, что все конструкторы имеют арность 2. \ No newline at end of file diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" new file mode 100644 index 0000000..865f41b --- /dev/null +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -0,0 +1,130 @@ +Мы получили [[Нормальная форма Хомского|нормальную форму Хомского]], задаваемую правилами переписывания вида: +$$\begin{matrix} +A \to BC \\ +A \to a +\end{matrix}$$ +В нормальной форме Хомского: +- нет $\varepsilon$-правил +- нет цепных правил +- нет смешения терминалов и нетерминалов в правилах раскрытия. +- нет длинных правил + +Она нам была нужна, чтобы достаточно красиво строить деревья посредством конечных автоматов над деревьями, описывающих деревья разбора соответствующий грамматик. Так как язык является КС тогда и только тогда когда есть порождающая его КС-грамматика. А деревья разбора КС-грамматики обязательно описываются каким-то древесным автоматом. Тогда деревья разбора любого КС языка обязательно описываются каким-то древесным автоматом. Но обратное верно не всегда. + +>[!tip] Классический контрпример древесного не КС языка. +>$$\{S[S(a,b), S(a,b)], S[a,b]\}$$ +>Древесный язык в этом случае состоит всего из двух деревьев +>```dot +>digraph{ +> S -> a,b +>} +>``` +>```dot +>digraph{ +> S1,S2,S3[label=S] +> a1,a2[label=a] +> b1,b2[label=b] +> S1->S2,S3 +> S2 -> a1, b1 +> S3 -> a2, b2 +>} +>``` +>Причем конструкторы в втором дереве на разных уровнях совпадают. Если бы это было дерево разбора для какой-нибудь грамматики, в силу того что оно КС свободно, то мы могли бы разворачивать $S \to SS$ сколько угодно раз, что противоречит описанию языка. +>Но этот язык очевидно порождается древесным автоматом, но он уже будет различать уровень вложенности 1 и уровень вложенности 2. Построим этот автомат($q_*$ - состояние-ловушка): +>$$\begin{matrix} +>a \to q_a(a)\\ +>b \to q_b(b)\\ +>S(q_a(X), q_b(Y)) \to q_F(S(X,Y))\\ +>S(q_F(X), q_F(Y)) \to q_{F'}(S(X,Y))\\ +>S(q_{F'}(X), q_x(Y)) \to q_*(S(X,Y))\\ +>S(q_b(X), q_x(Y)) \to q_*(S(X,Y))\\ +>S(q_x(X), q_a(Y)) \to q_*(S(X,Y))\\ +>S(q_*(X), q_x(Y)) \to q_*(S(X,Y))\\ +>\text{если один из аргументов S в qf а второй нет - то ловушка} +>\end{matrix} \quad q_F, q_{F'} \in \mathcal F$$ + +Нормальная форма Хомского позволяет очень интересно анализировать КС языки с помощью порождающих деревьев. Но перед этим нужно сформулировать теорему Майхилла-Нероде для древесных языков. %%здесь было лирическое отступление на обсуждение лабораторной номер 1 2024 года%% + +>[!note] Теорема Майхилла-Нероде для древесных автоматов +>Построим отношение на деревьях $\equiv_R$, такое что для любых деревьев с единственной переменной $x$(лиственной) u,v +>$$t_1 \equiv_R t_2 \Leftrightarrow \forall u[x] \left(u[x \to t_1] \in \mathcal L \Leftrightarrow u[x \to t_2] \in \mathcal L\right)$$ +>То есть замена поддеревьев не меняет принадлежность языку. +> +>**Теорема М-Н** +>Язык $\mathcal L$ древесно-автоматный $\Leftrightarrow$ имеет конечное число классов эквивалентности по $\equiv_R$ + +Посмотрим примеры таких поддеревьев. +$$S \to SS \mid ab$$ +И рассмотрим 2 дерева +```dot +digraph{ +S -> a,b +} +``` + +```dot +digraph{ + S1,S2,S3[label=S] + a1,a2[label=a] + b1,b2[label=b] + S1->S2,S3 + S2 -> a1, b1 + S3 -> a2, b2 +} +``` + +Тогда воспользуемся дырой и попробуем туда подставить деревья +```dot +digraph{ + S1,S2[label=S] + S3[shape=square, label=""] + a1[label=a] + b1[label=b] + S1->S2,S3 + S2 -> a1, b1 +} +``` +или запись в форме терма $S(S(a,b), X)$. Нам будет абсолютно не важно что подставить вместо X, и это не поменяет принадлежность языку. Вместо X подходят все деревья разбора S. Тем самым все деревья разбора S образуют класс эквивалентности относительно $\equiv_R$. Какие есть еще классы эквивалентности в этом языке? +1) деревья разбора $S$; +2) листок $a$; +3) листок $b$; +4) любое нелегальное поддерево или ловушка. + +Теперь рассмотрим чуть расширенную грамматику +$$\begin{matrix} +S_0 \to S \mid T\\ +S \to SS \mid ab \mid ST \mid TS \mid TT \\ +T \to TT \mid ab \mid ST \mid SS \mid TS +\end{matrix}$$ +Тогда получим классы эквивалентности: +1) $\operatorname{tree}[T] \equiv_R \operatorname{tree}[S]$ +2) $\operatorname{tree}[S_0]$ +3) a +4) b +5) trap + +Мы получили, что нетерминалы S и T симулируют друг друга. Это ровно то отношение бисимуляции, которое мы знаем из автоматов. Значит T и S взаимозаменимы в любом месте в грамматике. + +Классы эквивалентности по $\equiv_R$ определяют состояния в минимальном древесном автомате. + +> Фактор-автомат это и есть минимальный автомат. +> _© Вова Пирко_ + +Более того, эти классы эквивалентности задают неподвижные точки относительно конгруэнтности и являются пределами в теоретико-категорном смысле. + +Теперь рассмотрим просто дерево. +```dot +digraph{ + I11, I21, I31, I41, I51, I12, I22, I32, I42, I52[label=I] + I41, I42[shape=none, label="..."] + Z1, Z2[label=Z0] + S -> I11, I12 + I11 -> I21 -> I31 -> I41 -> I51 -> Z1 + I12 -> I22 -> I32 -> I42 -> I52 -> Z2 +} +``` +Получается имеем 3 конструктора $S_2, I_1, Z_0$. +Определим следующий язык $L = \{S(I^k(Z_0), I^k(Z_0)) \mid k \in \mathbb N\}$, то есть язык, который имеет одинаковую глубину поддеревьев. Вопрос: является ли он автоматным? +При ограниченном k - да является, так как мы получим конечный язык. Иначе мы получаем бесконечное число классов эквивалентности по М-Н. +>[!done] Док-во, что язык не древесно автоматный +>Пусть язык L - древесно-автоматный. \ No newline at end of file diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" new file mode 100644 index 0000000..fbd0028 --- /dev/null +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" @@ -0,0 +1,30 @@ +Если в грамматике G есть правило вида +$$\begin{aligned} +A_i \to \varphi_i \\ +A_i \to \varphi_j +\end{aligned} \qquad |\varphi_i| \neq |\varphi_j|$$ +Тогда заводим нетерминалы $A_{i,|\varphi_i|}, A_{i, |\varphi_j|}$ используемые произвольно вместо $A_i$, и имеющие сигнатуры соответствующей длинны. +Так наша грамматика перепишется в следующий вид +$$\begin{aligned} +S &\to S_1 \mid S_3 \\ +S_1 &\to \varepsilon \\ +S_3 &\to aB_1S_1\mid a B_3 S_1 \mid a B_1 S_3\mid aB_3S_3 \\ +B_1 &\to b \\ +B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 +\end{aligned}$$ +Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. + +>[!note] Определение +> Грамматика G находится в нормальной форме Хомского $\Leftrightarrow$ правила G имеют вид +> $$\begin{matrix} +> A_i \to A_j A_k \quad (A_i, A_j, A_k \in N)\\ +> \text{или} \\ +> A_i \to c \quad(c \in \Sigma) +> \end{matrix}$$ + +Что нам мешает получить НФХ? +1) $A \to \varepsilon$ + Нужно понять какие нетерминалы могут выродиться в пустое слово. Здесь алгоритм крайне похож на нахождение и удаление эпсилон-замыканий в автоматах. Из грамматики мы убираем все эпсилон правила, кроме случаем когда пустое слово принадлежит языку. Тогда мы добавляем стартовый символ $S_0 \to S \mid \varepsilon$. +2) Смешанные правила ($A_i \to a A_j$) убираем добавляя новые нетерминалы в грамматику. +3) Длинные правила разбиваем на последовательность коротких правил +4) Цепные правила $A_i \to A_j$ значат, что с точки зрения НКА есть переход по пустому слову из $A_i$ в $A_j$. Мы заменяем все вхождения $A_i$ на $A_j$. \ No newline at end of file From f405628d224510db0afcc1c89d3b8b94fd0d1360 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Fri, 4 Jul 2025 20:42:10 +0300 Subject: [PATCH 03/14] tree languages part 2: 2/3 --- .../Bottom-top automata.md" | 1 + ...13\320\262\320\276\320\264\320\260(II).md" | 71 +++++++++++++++++-- ...21\200\320\276\321\203\320\264\320\260.md" | 7 +- 3 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 "\320\242\320\265\320\276\321\200\320\270\321\217/Bottom-top automata.md" diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/Bottom-top automata.md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/Bottom-top automata.md" new file mode 100644 index 0000000..ae2899e --- /dev/null +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/Bottom-top automata.md" @@ -0,0 +1 @@ +Один из видов древесных автоматов. \ No newline at end of file diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" index 865f41b..befb9b3 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -15,7 +15,7 @@ A \to a >$$\{S[S(a,b), S(a,b)], S[a,b]\}$$ >Древесный язык в этом случае состоит всего из двух деревьев >```dot ->digraph{ +> digraph{ > S -> a,b >} >``` @@ -43,7 +43,7 @@ A \to a >\text{если один из аргументов S в qf а второй нет - то ловушка} >\end{matrix} \quad q_F, q_{F'} \in \mathcal F$$ -Нормальная форма Хомского позволяет очень интересно анализировать КС языки с помощью порождающих деревьев. Но перед этим нужно сформулировать теорему Майхилла-Нероде для древесных языков. %%здесь было лирическое отступление на обсуждение лабораторной номер 1 2024 года%% +Нормальная форма Хомского позволяет очень интересно анализировать КС языки с помощью порождающих деревьев. Но перед этим нужно сформулировать [[Теорема Майхилла-Нероуда|теорему Майхилла-Нероде]] для древесных языков. %%здесь было лирическое отступление на обсуждение лабораторной номер 1 2024 года%% >[!note] Теорема Майхилла-Нероде для древесных автоматов >Построим отношение на деревьях $\equiv_R$, такое что для любых деревьев с единственной переменной $x$(лиственной) u,v @@ -103,14 +103,15 @@ T \to TT \mid ab \mid ST \mid SS \mid TS 4) b 5) trap -Мы получили, что нетерминалы S и T симулируют друг друга. Это ровно то отношение бисимуляции, которое мы знаем из автоматов. Значит T и S взаимозаменимы в любом месте в грамматике. +Мы получили, что нетерминалы S и T симулируют друг друга. Это ровно то отношение бисимуляции, которое мы знаем из автоматов. Значит T и S взаимнозаменимы в любом месте в грамматике. -Классы эквивалентности по $\equiv_R$ определяют состояния в минимальном древесном автомате. +Классы эквивалентности по $\equiv_R$ определяют состояния в минимальном древесном автомате. Так как если два нетерминала эквивалентны, то их можно слить заменив фактор-нетерминалом. > Фактор-автомат это и есть минимальный автомат. > _© Вова Пирко_ -Более того, эти классы эквивалентности задают неподвижные точки относительно конгруэнтности и являются пределами в теоретико-категорном смысле. +> Более того, эти классы эквивалентности задают неподвижные точки относительно конгруэнтности и являются пределами в теоретико-категорном смысле. +> _© Антонина Непейвода _ Теперь рассмотрим просто дерево. ```dot @@ -124,7 +125,63 @@ digraph{ } ``` Получается имеем 3 конструктора $S_2, I_1, Z_0$. -Определим следующий язык $L = \{S(I^k(Z_0), I^k(Z_0)) \mid k \in \mathbb N\}$, то есть язык, который имеет одинаковую глубину поддеревьев. Вопрос: является ли он автоматным? +Определим следующий язык $L = \{S(I^k(Z_0), I^k(Z_0)) \mid k \in \mathbb N\}$, то есть язык, который имеет одинаковую глубину поддеревьев. Вопрос: является ли он древесно-автоматным? При ограниченном k - да является, так как мы получим конечный язык. Иначе мы получаем бесконечное число классов эквивалентности по М-Н. + >[!done] Док-во, что язык не древесно автоматный ->Пусть язык L - древесно-автоматный. \ No newline at end of file +>Пусть язык L - древесно-автоматный. Тогда он содержит n классов эквивалентности. Возьмем $k>n$. Тогда на пути в дереве к листку $Z_0$, мы встретим два $I_1$, принадлежащих одному классу эквивалентности. Пусть они соответствуют состоянию автомата $q_i$. +>Как мы обрабатываем верхнюю вершину? Мы видим, что дочерняя вершина находится в состоянии $q_i$ и что они эквивалентны. Внутрь поддерева мы смотреть не можем. +>Но так как меньшее поддерево(обозначим как $T_2$) соответсвует также состоянию $q_i$, то большее поддерево(обозначим за $T_1$) заменить на $T_2$ без потери принадлежности языку. Но при такой замене, мы получим несбалансированные поддеревья слева и справа от $S_2$. Таким образом получаем противоречие. Следовательно, классов эквивалентности бесконечное число. +> +>#### Альтернативное доказательство. +> Пусть поддерево $I^k(Z_0)$ порождает какой-то класс эквивалентности. Пусть этому же классу эквивалентности принадлежит $I^n(Z_0), n \neq k$, тогда можно спокойно заменить его в любом месте исходногго дерева. Но при такой замене, мы получим несбалансированные слева и справа поддеревья. Поэтому этому классу эквивалентности принадлежит только единственное поддерево $I^k(Z_0)$. +>Таким образом мы получаем, что язык разбивается на бесконечное число классов эквивалентности, соответсвующее натуральному k $\{I^k(Z_0)\}$ и отдельно классы эквивалентности для $Z_0$ и $S_2$, но мы их можем не рассматривать, так как уже получили бесконечное число классов эквивалентности. + +Используя эту идею, мы можем вывести метод для анализа древесных языков, и кроме того, этот метод подойдет для анализа на контекстную-свободу языков. +Пусть язык $\mathcal L$ - древесно-автоматный и пусть $\tau$ содержит путь длинны большей чем $|\{\equiv_{/R}\}|$, количество классов эквивалентности, тогда $\exists$ $\tau_1, \tau_2$ из одного класса эквивалентности, такие что $\tau_1$ содержится в $\tau_2$ +```dot +digraph{ + S -> T2 + subgraph cluster_T2{ + A[label="..." shape=none] + T2 -> A -> T1 + subgraph cluster_T1{ + T1 -> B + B[label="..." shape=none] + } + } +} +``` +Тогда мы их можем свободно взаимозаменять в дереве. То есть +$$\tau_2 \to \tau_1 \in \mathcal L$$ +$$\tau_1 \to \tau_2 \in \mathcal L$$ +Причем для второго варианта, мы эту замену можем повторять сколько угодно раз и принадлежность языку не должна измениться! А теперь посмотрим на КС грамматики и их деревья разбора. Так как каждое дерево разбора образует элемент древесного языка, то для любого достаточно длинного слова можно придумать такое его разбиение, что есть 2 боковых элемента, есть 2 элемента $\tau_2$, которые могут повторяться сколько угодно раз, и элемент $\tau_1$, который остается всегда. +$$w_1 \tau_2 \tau_1 \tau_2' w_2$$ +Если $\mathcal L$ - контекстно свободный язык и $\omega \in \mathcal L$. Если $|\omega| > N$(оценка на число нетерминалов в грамматике), то тогда мы можем разбить +$$\omega = \omega_0 \underbrace{\omega_1}_{\tau_2} \underbrace{\omega_2}_{\tau_1} \underbrace{\omega_3}_{\tau_2} \omega_4$$ +и при этом выполнено: (Если мы синхронно проитерируем $\omega_1,\omega_3$ сколько угодно раз(от 0 до бесконечности), то мы останемся в языке) +$$\forall k (\omega_0 \omega_1^k \omega_2 \omega_3^k \omega_4 \in \mathcal L)$$ +Если $\tau_2,\tau_1$ - самые близкие к листьям поддеревья, то тогда мы знаем, что этот путь от листа до $\tau_2,\tau_1$ ограничен по длине числом классов эквивалентности. И тогда высота дерева определяет длину выводимого слова. Таким образом мы получаем оценку на длину $\omega_1\omega_2\omega_3$. +То есть, если $h(\tau_2) < K+1$, то $|\omega_1\omega_2\omega_3| < N$. Можно для обоих длин взять одну и ту же оценку. + +Таким образом бонусом к [[Теорема Майхилла-Нероуда|теореме Майхилла-Нероуда]] о древесных языках мы получаем широко известную [[Лемма о накачке для КС-языков|лемму о накачке для контекстно-свободных языков]]. + +1) мы научились искать классы эквивалентности по бисимуляции +2) научились оценивать древесные языки, которые даже не являются языками вывода контекстно-свободных грамматик. Мы получили более сильный метод, чем если бы изучали только отдельно лемму о накачке. + + +Вообще, в анализе классов языков [[Теорема Майхилла-Нероуда|теорема Майхилла-Нероуда]] является базой, зная которую, мы знаем почти все о языка, так как она задает самую широкую факторизацию, при попытке факторизовать дальше которой мы начинаем терять информацию. Лемма о накачке в свою очередь являются некоторыми частностями, которые выводятся из [[Теорема Майхилла-Нероуда|теоремы Майхилла-Нероуда]] и не дает характеризации. + +Как пример рассмотрим следующий язык +$$\mathcal L = \{ww \mid w \in \{a,b\}^*\}$$ +То что он не контекстно-свободный можно доказать с помощью леммы о накачке. +Рассмотрим слово $\omega = a^n b^n a^n b^n$, где $n > 2^{k+1}$, k - число классов эквивалентности по М-Н в [[Bottom-top automata|BTA]]. +Тогда в этом слове встретятся 2 эквивалентных поддерева(или что одно и то же эквивалентных нетерминала). +==СХЕМА== + +Так как мы ограничили высоту подеревьев $T2$, то нетерминал может породить подслово длинной не более чем n. + +Если $T2$ прождает подслово в первой половине, то ... +%% если мы накачаем это подслово, то получим неравные слова для какого-то k%% + +Если $T2$ порождает подслово в второй половине, то мы можем просто перевернуть слово и получим ту же ситуацию. \ No newline at end of file diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\242\320\265\320\276\321\200\320\265\320\274\320\260 \320\234\320\260\320\271\321\205\320\270\320\273\320\273\320\260-\320\235\320\265\321\200\320\276\321\203\320\264\320\260.md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\242\320\265\320\276\321\200\320\265\320\274\320\260 \320\234\320\260\320\271\321\205\320\270\320\273\320\273\320\260-\320\235\320\265\321\200\320\276\321\203\320\264\320\260.md" index ac02e8a..9852cf9 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\242\320\265\320\276\321\200\320\265\320\274\320\260 \320\234\320\260\320\271\321\205\320\270\320\273\320\273\320\260-\320\235\320\265\321\200\320\276\321\203\320\264\320\260.md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\242\320\265\320\276\321\200\320\265\320\274\320\260 \320\234\320\260\320\271\321\205\320\270\320\273\320\273\320\260-\320\235\320\265\321\200\320\276\321\203\320\264\320\260.md" @@ -4,4 +4,9 @@ Теорема М-Н(для PDA) -Теорема М-Н(для древесных языков) \ No newline at end of file +## Теорема М-Н(для древесных языков) +Построим отношение на деревьях $\equiv_R$, такое что для любых деревьев с единственной переменной $x$(лиственной) u,v +$$t_1 \equiv_R t_2 \Leftrightarrow \forall u[x] \left(u[x \to t_1] \in \mathcal L \Leftrightarrow u[x \to t_2] \in \mathcal L\right)$$ +То есть замена поддеревьев не меняет принадлежность языку. +**Теорема М-Н** +Язык $\mathcal L$ древесно-автоматный $\Leftrightarrow$ имеет конечное число классов эквивалентности по $\equiv_R$ \ No newline at end of file From 2e427b28347c733015c1b2f02b6d97fd6e0161ea Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 22 Jul 2025 11:30:25 +0300 Subject: [PATCH 04/14] tree languages part 2: 3/3 + fixes --- ...13\320\262\320\276\320\264\320\260(II).md" | 56 ++++++++++++++++++- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" index befb9b3..056d26c 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -131,10 +131,10 @@ digraph{ >[!done] Док-во, что язык не древесно автоматный >Пусть язык L - древесно-автоматный. Тогда он содержит n классов эквивалентности. Возьмем $k>n$. Тогда на пути в дереве к листку $Z_0$, мы встретим два $I_1$, принадлежащих одному классу эквивалентности. Пусть они соответствуют состоянию автомата $q_i$. >Как мы обрабатываем верхнюю вершину? Мы видим, что дочерняя вершина находится в состоянии $q_i$ и что они эквивалентны. Внутрь поддерева мы смотреть не можем. ->Но так как меньшее поддерево(обозначим как $T_2$) соответсвует также состоянию $q_i$, то большее поддерево(обозначим за $T_1$) заменить на $T_2$ без потери принадлежности языку. Но при такой замене, мы получим несбалансированные поддеревья слева и справа от $S_2$. Таким образом получаем противоречие. Следовательно, классов эквивалентности бесконечное число. +>Но так как меньшее поддерево(обозначим как $T_2$) соответсвует также состоянию $q_i$, то большее поддерево(обозначим за $T_1$) можно заменить на $T_2$ без потери принадлежности языку. Но при такой замене, мы получим несбалансированные поддеревья слева и справа от $S_2$. Таким образом получаем противоречие. Следовательно, классов эквивалентности бесконечное число. > >#### Альтернативное доказательство. -> Пусть поддерево $I^k(Z_0)$ порождает какой-то класс эквивалентности. Пусть этому же классу эквивалентности принадлежит $I^n(Z_0), n \neq k$, тогда можно спокойно заменить его в любом месте исходногго дерева. Но при такой замене, мы получим несбалансированные слева и справа поддеревья. Поэтому этому классу эквивалентности принадлежит только единственное поддерево $I^k(Z_0)$. +> Пусть поддерево $I^k(Z_0)$ порождает какой-то класс эквивалентности. Пусть этому же классу эквивалентности принадлежит $I^n(Z_0), n \neq k$, тогда можно спокойно заменить его в любом месте исходного дерева. Но при такой замене, мы получим несбалансированные слева и справа поддеревья. Поэтому этому классу эквивалентности принадлежит только единственное поддерево $I^k(Z_0)$. >Таким образом мы получаем, что язык разбивается на бесконечное число классов эквивалентности, соответсвующее натуральному k $\{I^k(Z_0)\}$ и отдельно классы эквивалентности для $Z_0$ и $S_2$, но мы их можем не рассматривать, так как уже получили бесконечное число классов эквивалентности. Используя эту идею, мы можем вывести метод для анализа древесных языков, и кроме того, этот метод подойдет для анализа на контекстную-свободу языков. @@ -184,4 +184,54 @@ $$\mathcal L = \{ww \mid w \in \{a,b\}^*\}$$ Если $T2$ прождает подслово в первой половине, то ... %% если мы накачаем это подслово, то получим неравные слова для какого-то k%% -Если $T2$ порождает подслово в второй половине, то мы можем просто перевернуть слово и получим ту же ситуацию. \ No newline at end of file +Если $T2$ порождает подслово в второй половине, то мы можем просто перевернуть слово и получим ту же ситуацию. + +Обозначим +$$\omega = \underbrace{a^n}_{\rho1}\underbrace{b^n}_{\rho_2}\underbrace{a^n}_{\rho_3}b^n$$ +Поскольку КС языки замкнуты относительно обращения, то возможны накачки только $\rho_1, \rho_2, \text{соединение } \rho_1\rho_2$(далее обозначать будем как $\rho_1|\rho_2$) и $\rho_2|\rho_3$. Другие случаи накачки выводятся из этих путем обращения языка и переименовыванием букв. +Пусть $T2$ выводит $a^j$ в $\rho_1$, $T1$ выводит $a^i$ в $\rho_1$, тогда если мы проитерируем 0 раз $T2$, то есть сразу заменим $T2$ на эквивалентное ему поддерево $T1$, то мы получим слово, в котором в блоке $\rho_1$ меньше букв $a$, чем в $\rho_3$, тем самым слово уже не будет принадлежать языку, тем самым в $\rho_1$ не может находиться $T2$. +Аналогично рассуждаем для $\rho_2$, и получаем, что $T2$ не может находиться в $\rho_2$. +Если мы находимся на стыке $\rho_2|\rho_3$, тогда мы получаем дополнительные возможности для накачки. Если $T2$ находится только в одном из них, то это сводится к уже рассмотренным случаям. Поэтому рассматриваем, что $T2$ порождает некоторые символы и в $\rho_2$, и в $\rho_3$. Но в таком случае, мы получаем рассинхрон как по буквам b c последним блоком, так и по буквам a с первым блоком. Поэтому $T2$ не может находиться на этом стыке. +Если мы рассматриваем $\rho_1|\rho_2$, то мы получаем те же противоречия, что и для $\rho_2\rho_3$. +Из чего следует противоречие с нашим предположением о контекстной-свободе языка $\mathcal L$, потому что в нем оказывается бесконечное число классов эквивалентности для поддеревьев вывода, что и используется в лемме о накачке. + +Как можно было бы сократить перебор вариантов накачек? +Чтобы сократить перебор подслов в $\omega$ при доказательстве не-КС, можно пересекать язык с регулярным языком, так как +> $\mathcal L$ - КС $\implies$ $\mathcal L \cap R$ - КС + +Обратное утверждение, кстати, не верно. Возьмем тривиальный регулярный язык, состоящий из одного слова. Тогда при пересечении с любым другим языков мы получим либо тот же язык из 1 слова, либо пустой язык. Из чего мы не можем сделать вывод про исходный язык. + +Пересечение с регулярным языком позволяет нам отвлечься от накачек, ломающих структуру языка и думать только о степенях однородных подслов. + +В нашем примере с $\omega\omega$ мы можем пересечь язык с регуляркой $a^+b^+a^+b^+$, тогда если исходный язык был КС, то и полученный язык тоже будет КС. Тогда случаи накачки в $\rho_1|\rho_2$ и $\rho_2|\rho_3$ сразу можно не рассматривать, так как они будут выводить из структуры регулярного выражения. + +Для практики разберем еще одну задачу на древесные языки. +Пусть дан следующий язык +$$\begin{matrix} +\mathcal L = \{B(t,t) \mid t - \text{бинарное дерево},\\\text{все пути в котором имеют одну и ту же длинну}\} +\end{matrix}$$ +И в этих деревьях есть 2 типа конструкторов $B_2, l_0$. То есть какие деревья нам подходят? +```dot +digraph{ + subgraph{ + l1[label="l0"] + l2[label="l0"] + B1[label="B"] + B1 -> l1, l2 + } + subgraph{ + l3,l4,l5,l6[label="l0"] + B2,B3,B4[label="B"] + B2 -> B3, B4 + B3 -> l3,l4 + B4 -> l5,l6 + } +} +``` + +Является ли язык таких деревьев древесно-автоматным? +Какие в этом языке классы эквивалентности? +Пусть в языке k классов эквивалентности и рассмотрим дерево с глубиной $k+1$, значит в каком-то пути этого дерева есть 2 поддерева, принадлежащие одному и тому же классу эквивалентности, но имеющие разную высоту. Назовем их $\tau_1 \equiv_R \tau_2$. Но при замене одного поддерева на другое мы получим дерево, в котором не все пути равны. +Почему эти 2 поддерева эквивалентны? По выбору. Мы предположили, что язык древесно-автоматный, значит в нем конечное число классов эквивалентности. Возьмем дерево, которое выше по высоте, чем число классов эквивалентности. Значит в этом дереве должны встречаться 2 поддерева из одного класса эквивалентности, что по сути является принципом Дирихле. Дальше заменяем одно на другое и получаем дерево, в котором есть пути разной длинны, что выводит нас из языка, что является противоречием. Значит исходный язык L не древесно-автоматный. + +Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных, и, как видно, техника абсолютно одинаковая. \ No newline at end of file From f1f383d2068dd08b8b189660bb9b56a4c37ee53e Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 22 Jul 2025 11:32:44 +0300 Subject: [PATCH 05/14] fix nta --- ...\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" index ee3b126..c52838b 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -47,7 +47,7 @@ digraph{ Теперь будем действовать аналогично тому, как мы действовали с конечными автоматами, только теперь будут подаваться на вход автоматов не отдельные строки, а некоторые функциональные символы. -Есть 2 типа таких автоматов: **top-bottom** автоматы и **bottom-top** автоматы, в первом варианте автомат идет от корня к листьям, а в втором от листьев к корню, но они в сути своей ничем не отличаются в смысле выразительной силы. Обычно рассматривают bottom-top автоматы. +Есть 2 типа таких автоматов: **top-bottom** автоматы и **bottom-top** автоматы, в первом варианте автомат идет от корня к листьям, а в втором от листьев к корню, но они в сути своей ничем не отличаются в смысле выразительной силы, но только в **недетерминированном** варианте. Для детерминированного разбора bottom-top имеет большую выразительную силу, поэтому обычно рассматривают bottom-top автоматы. Далее будем рассматривать bottom-top автоматы. From 29955bfcfe9db5429ea61e237ada447ff300eae1 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 22 Jul 2025 12:34:15 +0300 Subject: [PATCH 06/14] init var 3 --- ...\200\320\270\320\260\320\275\321\202 3.md" | 113 +++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" index fa74eaa..86db24e 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" @@ -1 +1,112 @@ -#пустой \ No newline at end of file +# 1. Язык слов в алфавите $a,b$, у которых совпадает число подвыражений, удовлетворяющих условиям $ab^+ab^+$ и $b^+ab^+a$ +язык регулярный. +Рассуждение классическое для похожих языков. +В-первых, подходят все слова, для которых эти количества равны 0, то есть слова не содержащие подслова соответсвующего вида. + + +# 2. Грамматика +$$\begin{matrix} +S \to baTaT \quad T \to aSbS \quad T \to bT\\ +T \to a +\end{matrix}$$ +В втором задании РК был дан КС язык в виде грамматики. Для него нужно либо построить PDA, либо регулярное выражение(или автомат) с доказательством регулярности языка. + +## Первый вариант +Для анализа этого языка мы можем сначала рассмотреть некоторые ограниченные его варианты. +Если ограничить язык двумя правилами $\boxed{T \to bT \mid a}$, то мы получаем регулярный язык $b^*a$, что не требует особых пояснений. +Для наглядности выделим его в отдельный нетерминал R, тогда грамматика примет вид +$$\begin{matrix} +S \to baTaT\\ +T \to aSbS \mid R \\ +R \to bR \mid a +\end{matrix}$$ +Преобразуем правила переписывания внутри S таким образом, чтобы исключить из грамматики нетерминал T. Для этого мы заменим внутри правила переписывания S нетерминал T на его варианты раскрытия. Таким образом получим +$$\begin{matrix} +S \to baRaR \mid baaSbSaR \mid baRaaSbS \mid baaSbSaaSbS\\ +R \to bR \mid a +\end{matrix}$$ +Отрежем одинаковый префикс от S +$$\begin{matrix} +S \to baP \\ +P \to RaR \mid aSbSaR \mid RaaSbS \mid aSbSaaSbS\\ +R \to bR \mid a +\end{matrix}$$ + +## Второй вариант(aka LL разбор) +Воспользуемся идеями построения стекового автомата для LL разбора. +Рассмотрим нетерминал S +$$S \to baTaT$$ +Перед чтением слова мы кладем на стек $S$, после чего снимаем + + +```dot +digraph{ + point[shape=point] + + point -> S [label=". x/Sx"] + S -> 1 [label="b S/."] + 1 -> S [label="a x/TAT"] + + S -> S [label a A/A] + T -> +} +``` + + +## Теоретический анализ языка +Язык очевидно КС, так как задается грамматикой. + +Язык не является регулярным, что можно доказать с помощью отрицания леммы о накачке для регулярных языков. +Пусть n - длинна накачки, тогда +$$\omega = (baa)^n S (bSaT)^n$$ +Раскроем S +$$\omega = (baa)^n baTaT (baTaTaT)^n$$ +Раскроем T по самому маленькому правилу +$$\omega = (baa)^n baaaa (baaaaaa)^n$$ +По лемме о накачке для регулярных языков, у любого слова есть подслово не дальше чем на n символов от начала строки, которое можно накачать и не выйти из языка. Применяя отрицательную накачку, на первых n символах(дополнительно можно ограничить регулярную структуру $(baa)^* ba^3 (ba^5)^n$) мы выходим из языка. Значит язык нельзя накачать и поэтому язык не регулярный. + +Доказав, что язык не является регулярным(язык также очевидно не VPL), мы можем задаться вопросом является ли он детерминированным КС. Для этого применим лемму о накачке для детерминированных КС языков. + +>[!note] Отрицание леммы о накачке для детерминированных КС +> Для любого n - длинны накачки, существует 2 словf $\omega_1, \omega_2$ с общим префиксом, но разными суффиксами для которых выполнены оба условия +> 1) префикс не накачивается в КС смысле +> 2) не накачиваются префикс + суффикс в кс смысле +> тогда язык не детерминированный КС. + +Рассмотрим следующие 2 слова +$$\begin{aligned} +w&|\\ +&|w +\end{aligned}$$ + + +# 3. Язык всех палиндромов в $\{a,b\}$ таких, что они являются конкатенацией префикса некоторого палиндрома $v_1$ длинны больше $\frac{2|v_1|}{3}$ и суффикса некоторого палиндрома $v_2$ длинны больше $\frac{2|v_2|}{3}$ +Язык не КС, так как в нем наблюдаются перекрестные зависимости между подсловами, которую нельзя выразить с помощью стека. +Для доказательства, что язык не КС, используем лемму о накачке. +Пусть $n$ - длинна накачкию. Рассмотрим тогда слово +$$\omega = \underbrace{ba^{2n}ba^n}_{v_1}\underbrace{a^nba^{2n}b}_{v_2}$$ + + +%% +Пусть n - длинна накачки. Рассмотрим тогда слово из языка +$$\omega = \underbrace{a^nb^nab^n}_{v_1}\underbrace{b^nab^na^n}_{v_2}$$ +Очевидно, что это слово лежит в языке, соответствующее разбиение на подслова обозначено в примере. +Возможно ли произвести другое разбиение этого слова на подслова $v_1,v_2$? Рассмотрим расширение $v_1$. +Пусть $v_1$ расширено только на некоторое количество $b$, тогда мы имеем +$$\omega = \underbrace{a^nb^nab^{n+k}}_{v_1} \underbrace{b^{n-k} ab^na^n}_{v_2}$$ +Но в таком случае, мы получаем, что центр суффикса палиндрома $v_2$ должен сместиться в область $b^n$, чтобы удовлетворять ограничению на длинну. Но для любых k мы имеем структуру, которая не соответствует структуре суффикса палиндрома, тем самым получаем противоречие. +Аналогичную ситуацию мы имеем при попытке расширить $v_1$ до $b^n$. +Пусть мы расширили $v_1$ так, что $v_2$ состоит только из букв $a$, тогда +$$\omega = \underbrace{a^nb^nab^{2n}ab^na^k}_{v_1} \underbrace{a^{n-k}}_{v_2}$$ + + + +Так как данный язык симметричен относительно разворота(при развороте слова, мы получаем слово из того же языка), то мы можем ограничиться рассотрением только случая расширения $v_1$. + +Теперь мы должны рассмотреть накачки. Для простоты доказательства ограничим язык регулярной структурой(пересечем с регулярным выражением - при пересечении КС языка мы должны получить КС язык) +$$a^*b^*ab^*ab^*a^*$$ +Рассмотрим возможные области накачки +$$\omega = \underbrace{a^n}_{p_1}\underbrace{b^n}_{p_2}a\underbrace{b^{2n}}_{p_3}a\underbrace{b^n}_{p_4}\underbrace{a^n}_{p_5}$$ +> Если говорить в общих словах, то ограничения языка задают строгие соотношения между количествами в областях $p_1p_5, p_2p_3p_4$, тем самым мы не можем накачать ни одну из областей и не можем накачать перекрестно соседние области. + +%% From 47c12fdad0d3356644514ad1d07678e713311fb9 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 22 Jul 2025 12:43:05 +0300 Subject: [PATCH 07/14] fixes --- ...21\200\320\270\320\260\320\275\321\202 3.md" | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" index 86db24e..f26e9e2 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" @@ -11,7 +11,16 @@ T \to a \end{matrix}$$ В втором задании РК был дан КС язык в виде грамматики. Для него нужно либо построить PDA, либо регулярное выражение(или автомат) с доказательством регулярности языка. -## Первый вариант +## Нулевой вариант(aka полный недетерминизм) +==!!!АХТУНГ - Так делать на РК нельзя!!!== + +Для любой КС грамматики всегда есть способ построить максимально недетерминированный PDA, по следующему принципу +- с помощью переходов по пустому символу недетерминированно порождаем на стеке строку по правилам переписывания +- После недетерминированно выбираем, что мы остановились и начинаем разбирать стек и читать слово + +Но такой метод дает самый неэффективный автомат, поэтому мы его пропускаем. + +## Первый вариант(aka попытка в смысловой анализ языка) Для анализа этого языка мы можем сначала рассмотреть некоторые ограниченные его варианты. Если ограничить язык двумя правилами $\boxed{T \to bT \mid a}$, то мы получаем регулярный язык $b^*a$, что не требует особых пояснений. Для наглядности выделим его в отдельный нетерминал R, тогда грамматика примет вид @@ -47,8 +56,8 @@ digraph{ S -> 1 [label="b S/."] 1 -> S [label="a x/TAT"] - S -> S [label a A/A] - T -> + S -> S [label="a A/A"] + T -> RR } ``` @@ -83,7 +92,7 @@ w&|\\ # 3. Язык всех палиндромов в $\{a,b\}$ таких, что они являются конкатенацией префикса некоторого палиндрома $v_1$ длинны больше $\frac{2|v_1|}{3}$ и суффикса некоторого палиндрома $v_2$ длинны больше $\frac{2|v_2|}{3}$ Язык не КС, так как в нем наблюдаются перекрестные зависимости между подсловами, которую нельзя выразить с помощью стека. Для доказательства, что язык не КС, используем лемму о накачке. -Пусть $n$ - длинна накачкию. Рассмотрим тогда слово +Пусть $n$ - длинна накачки. Рассмотрим тогда слово $$\omega = \underbrace{ba^{2n}ba^n}_{v_1}\underbrace{a^nba^{2n}b}_{v_2}$$ From f5c193c7d67a9260cfbc70557cc6fd62f4bde50f Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Sun, 27 Jul 2025 11:58:40 +0300 Subject: [PATCH 08/14] base for task 2, 3 --- ...\200\320\270\320\260\320\275\321\202 3.md" | 78 ++++++++++++++++--- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" index f26e9e2..12a8e56 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" @@ -63,7 +63,7 @@ digraph{ ## Теоретический анализ языка -Язык очевидно КС, так как задается грамматикой. +Язык очевидно КС, так как задается грамматикой. Приведенная грамматика является недетерминированной, что ничего не говорит о детерминированности самого языка. Язык не является регулярным, что можно доказать с помощью отрицания леммы о накачке для регулярных языков. Пусть n - длинна накачки, тогда @@ -72,9 +72,10 @@ $$\omega = (baa)^n S (bSaT)^n$$ $$\omega = (baa)^n baTaT (baTaTaT)^n$$ Раскроем T по самому маленькому правилу $$\omega = (baa)^n baaaa (baaaaaa)^n$$ -По лемме о накачке для регулярных языков, у любого слова есть подслово не дальше чем на n символов от начала строки, которое можно накачать и не выйти из языка. Применяя отрицательную накачку, на первых n символах(дополнительно можно ограничить регулярную структуру $(baa)^* ba^3 (ba^5)^n$) мы выходим из языка. Значит язык нельзя накачать и поэтому язык не регулярный. +Слово гарантировано лежит в языке, так как мы его породили по правилам грамматики. По лемме о накачке для регулярных языков, у любого слова есть подслово не дальше чем на $n$ символов от начала строки, которое можно накачать и не выйти из языка. Применяя отрицательную накачку, на первых n символах(дополнительно можно ограничить регулярную структуру $(baa)^* ba^3 (ba^5)^*$) мы выходим из языка. Значит язык нельзя накачать и поэтому язык не регулярный. -Доказав, что язык не является регулярным(язык также очевидно не VPL), мы можем задаться вопросом является ли он детерминированным КС. Для этого применим лемму о накачке для детерминированных КС языков. +Доказав, что язык не является регулярным(язык также очевидно не VPL, можно использовать тот же контрпример), мы можем задаться вопросом является ли он детерминированным КС. +%%Для этого применим лемму о накачке для детерминированных КС языков. >[!note] Отрицание леммы о накачке для детерминированных КС > Для любого n - длинны накачки, существует 2 словf $\omega_1, \omega_2$ с общим префиксом, но разными суффиксами для которых выполнены оба условия @@ -82,21 +83,80 @@ $$\omega = (baa)^n baaaa (baaaaaa)^n$$ > 2) не накачиваются префикс + суффикс в кс смысле > тогда язык не детерминированный КС. -Рассмотрим следующие 2 слова -$$\begin{aligned} -w&|\\ -&|w -\end{aligned}$$ +Здесь подозрение на недетрминизм вызывает правила $T \to aSbS \mid a$ +%% +На наше счастье мы можем произвести преобразование грамматики к следующему виду +$$\begin{matrix} +S \to baTaT\\ +T \to abaTaTbbaTaTaT \mid bT \mid a +\end{matrix}$$ +И уже по этой грамматике видно, что она является $LL(3)$. + +| нетерминал/префикс | aaa | aab | aba | abb | baa | bab | bba | bbb | +| ------------------ | --- | --- | --- | --- | --- | --- | --- | --- | +| $S$ | - | - | - | - | 1 | 1 | - | - | +| $T$ | 3 | 3 | 1 | 3 | 2 | 2 | 2 | 2 | +Таблица $LL(3)$ разбора не содержит противоречий, поэтому мы получили, что рассматриваемый нами язык является $LL$-языком. # 3. Язык всех палиндромов в $\{a,b\}$ таких, что они являются конкатенацией префикса некоторого палиндрома $v_1$ длинны больше $\frac{2|v_1|}{3}$ и суффикса некоторого палиндрома $v_2$ длинны больше $\frac{2|v_2|}{3}$ +%%Используя оракул, мы можем получить за $O(1)$, что язык не является КС, но для этого нам нужно выделить подмножество слов, которые не накачиваются.%% + +Данный язык можно описать иначе, как палиндром, к которому присоединен непалиндромный префикс или суффикс, который меньше по длине чем половина. +Таким образом все слова описываются как +$$\{v xx^R yy^Ru \mid |v| < |x| \space \& \space |u| < |y|\}$$ +Но также эти слова сами по себе должны быть палиндромными, то есть +$$vxx^Ryy^R u = ww^R$$ +Также стоит учесть, что все подслова $v,x,y,u$ могут быть также пустыми. +На этом этапе нужно четко оценить место в слове, на которое выпадают переходы между левыми и правыми частями палиндрома. +Всего возможны , которые можно дополнить симметричными случаями путем обращения языка(также стоит заметить, что при обращении языка мы получим тот же язык, так как все слова - палиндромы): +1) центр слова внутри $v$ нельзя предъявить, так как тогда мы получим противоречие: $|v| > 2|x|+2|y|+|u| \space\&\space |v| < |x|$ +2) центр слова находится между $v$ и $x$ также невозможен, по тем же причинам(вместо знака ">" знак равенства) +3) центр слова находится внутри $x$. Разобьем подслово еще на 3(с двумя случаями) $x=aa^Rb$ или $x = baa^R$(центр слова между $aa^R$) + 3.1. $x=aa^Rb$, тогда $$\underbrace{va}\underbrace{a^Rbb^Raa^Ryy^Ru}$$ + получаем противоречие между длинами подслов + 3.2. $x=baa^R$, тогда + $$\underbrace{vba}\underbrace{a^Raa^Rb^Ryy^Ru}$$ + также получаем противоречие между длинами подслов. +4) центр слова находится на перемычке $xx^R$. Тогда мы имеем, что $v^R = yy^Ru \implies v = u^Ryy^R$, тогда + $$\underbrace{u^Ryy^R x}\underbrace{x^Ryy^Ru}$$ + и дополнительное ограничение $|u^Ryy^R| < |x|$. Здесь можно в всех случаях накачать перемычки $xx^R$ и $yy^R$. +5) центр слова находится внутри $x^R$ также приводит к двум вариантам: $x^R=aa^Rb$ или $x^R = baa^R$ + 5.1 $x^R = aa^Rb$($x=b^Raa^R$), тогда + $$\underbrace{vb^Raa^Ra} \underbrace{a^Rb yy^Ru}$$ + и получаем дополнительное ограничение + $$\begin{cases} + |v| < |b| + 2|a|\\ + |v| + |b| + 2|a| = |b| + 2|y| + |u| + \end{cases}$$ + 5.2 $x^R=baa^R(x=aa^Rb^R)$, тогда + $$\underbrace{vaa^Rb^Rba} \underbrace{a^Ryy^Ru}$$ + и получаем дополнительное ограничение + $$\begin{cases} + |v| < |b| + 2|a|\\ + |v| + 2|b| + 2|a| = 2|y| + |u| + \end{cases}$$ +6) центр слова находится на перемычке $x^Ry$ приводит к ситуации, когда $x^R=y \& u=v$. И мы получаем $vxx^Rxx^Rv^R$ без дополнительных ограничений кроме $|v| < |x|$. Эта ситуация полностью валидна, но при этом всегда допустимы накачки(полложительные без ограничений) в центр слова, что не поможет в нашем доказательстве. + +Из наших рассуждений получили, что для слов из языка допустимы только следующие ситуации +1) центр слова находится по середине $xx^R$(или $yy^R$) +2) центр слова находится в $x^R$(или $y$) +3) центр слова находится по середине $x^Ry$ - накачивается + +%%дописать%% + +--- + +Меня терзают смутные сомнения, что этот язык в целом полностью совпадает с языком палиндромов над $\{a,b\}$, так как мы любое слово из языка можем представить как конкатенацию префикса, который совпадает с всем словом, и суффиксом пустого палиндрома. + +%% Язык не КС, так как в нем наблюдаются перекрестные зависимости между подсловами, которую нельзя выразить с помощью стека. Для доказательства, что язык не КС, используем лемму о накачке. Пусть $n$ - длинна накачки. Рассмотрим тогда слово $$\omega = \underbrace{ba^{2n}ba^n}_{v_1}\underbrace{a^nba^{2n}b}_{v_2}$$ -%% + Пусть n - длинна накачки. Рассмотрим тогда слово из языка $$\omega = \underbrace{a^nb^nab^n}_{v_1}\underbrace{b^nab^na^n}_{v_2}$$ Очевидно, что это слово лежит в языке, соответствующее разбиение на подслова обозначено в примере. From db3b9b635568e41606d3304d86b41bc5e12f3366 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Sun, 27 Jul 2025 15:06:51 +0300 Subject: [PATCH 09/14] conflict fixes --- ...320\262\321\213\320\262\320\276\320\264\320\260(I).md" | 3 --- ...20\262\321\213\320\262\320\276\320\264\320\260(II).md" | 8 -------- ...76\320\274\321\201\320\272\320\276\320\263\320\276.md" | 2 ++ 3 files changed, 2 insertions(+), 11 deletions(-) diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" index 199dc08..1266f6b 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -13,7 +13,6 @@ $$\begin{aligned} S \to aBS \mid \varepsilon \\ B \to b \mid aBB \end{aligned}$$ - Разберём в ней слово `aababb`. Мы можем заметить, что буквы `b` в слове порождаются каждая нетерминалом $B$. Тем самым мы можем все вхождения `b` заменить на вхождения нетерминала $B$. И в свою очередь заметить еще одну замену по правилу на $B$. $$aababb \to aaB\underbrace{aBB}_B \to a\underbrace{aBB}_B \to aB \underbrace{\varepsilon}_S \to \underbrace{aBS}_S \to S$$ @@ -140,7 +139,6 @@ digraph{ Дальше нам нужно научиться собирать дерево из своих листьев. Здесь как раз и понадобятся "дыры", причем все "дыры" считаются независимыми, контекстно-свободными. Как выглядит разбор с учётом "дыр"? Если у нас есть некоторый конструктор $f_k$ арности $k$ от $q_1...q_k$, то мы можем вычислить состояние, которое мы наблюдаем над ветвлением: $$f_k(q_1(X_1), ... q_k(X_k)) \to q_f(f_k(X_1...X_k))$$ - И наша конфигурация говорит, что "тут мы начинаем продвигаться выше по дереву". Перерисуем нашу конфигурацию ```dot @@ -346,4 +344,3 @@ B_1 &\to b \\ B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 \end{aligned}$$ Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. Как уже говорилось, можно также перейти к эквивалентной грамматике в [[Нормальная форма Хомского|нормальной форме Хомского]]. - diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" index 9aab7e0..563372c 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -55,7 +55,6 @@ A \to a >Язык $\mathcal L$ древесно-автоматный $\Leftrightarrow$ имеет конечное число классов эквивалентности по $\equiv_R$ Посмотрим примеры таких поддеревьев на примере грамматики: - $$S \to SS \mid ab$$ И рассмотрим 2 дерева ```dot @@ -76,7 +75,6 @@ digraph{ ``` Воспользуемся дырой и попробуем туда подставить деревья - ```dot digraph{ S1,S2[label=S] @@ -87,7 +85,6 @@ digraph{ S2 -> a1, b1 } ``` - Такому дереву соответствует запись в форме терма $S(S(a,b), X)$. Нам будет абсолютно не важно, какое дерево разбора $S$ подставить вместо $X$, это не поменяет принадлежность языку. Тем самым все деревья разбора $S$ образуют класс эквивалентности относительно $\equiv_R$. Какие есть классы эквивалентности в этом языке? 1) деревья разбора $S$; 2) листок $a$; @@ -100,7 +97,6 @@ S_0 \to S \mid T\\ S \to SS \mid ab \mid ST \mid TS \mid TT \\ T \to TT \mid ab \mid ST \mid SS \mid TS \end{matrix}$$ - В ней получим классы эквивалентности: 1) $\operatorname{tree}[T] \equiv_R \operatorname{tree}[S]$ 2) $\operatorname{tree}[S_0]$ @@ -119,7 +115,6 @@ T \to TT \mid ab \mid ST \mid SS \mid TS > _© Антонина Непейвода_ Теперь рассмотрим такое дерево. - ```dot digraph{ I11, I21, I31, I41, I51, I12, I22, I32, I42, I52[label=I] @@ -145,7 +140,6 @@ digraph{ Используя эту идею, мы можем вывести метод для анализа древесных языков, который подойдет для анализа языков на контекстную свободу. Пусть язык $\mathcal L$ - древесно-автоматный и пусть $\tau$ содержит путь длины большей, чем $|\{\equiv_{/R}\}|$, количество классов эквивалентности, которую мы обозначим как $K = |\{\equiv_{/R}\}|$, тогда на нём $\exists$ $\tau_1, \tau_2$ из одного класса эквивалентности такие, что $\tau_1$ содержится в $\tau_2$ как поддерево - ```dot digraph{ S -> T2 @@ -162,7 +156,6 @@ digraph{ Тогда мы их можем свободно взаимозаменять в дереве. То есть $$\tau_2 \to \tau_1 \in \mathcal L$$ $$\tau_1 \to \tau_2 \in \mathcal L$$ - Причем для второго варианта, мы эту замену можем повторять сколько угодно раз и принадлежность языку не должна измениться! А теперь посмотрим на КС грамматики и их деревья разбора. Так как каждое дерево разбора образует элемент древесного языка, то для любого достаточно длинного слова можно придумать такое его разбиение, что есть 2 боковых элемента, левая и правая часть вывода $\tau_2$, которые могут повторяться сколько угодно раз, и элемент $\tau_1$, который остается всегда. $$w_1 \tau_2 \tau_1 \tau_2' w_2$$ Пусть $\mathcal L$ - контекстно-свободный язык и $\omega \in \mathcal L$. Если $|\omega| > N$ (оценку на N разберём ниже, она связана с числом нетерминалов в грамматике), то тогда мы можем разбить @@ -228,7 +221,6 @@ $$\begin{matrix} \mathcal L = \{B(t,t) \mid t - \text{бинарное дерево},\\\text{все пути в котором имеют одну и ту же длину}\} \end{matrix}$$ И в этих деревьях есть 2 типа конструкторов $B_2, l_0$. То есть какие деревья нам подходят? - ```dot digraph{ subgraph{ diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" index 098de6b..d3ff7de 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\235\320\276\321\200\320\274\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \320\245\320\276\320\274\321\201\320\272\320\276\320\263\320\276.md" @@ -1,3 +1,4 @@ + >[!note] Определение > Грамматика G находится в нормальной форме Хомского $\Leftrightarrow$ правила G имеют вид > $$\begin{matrix} @@ -53,3 +54,4 @@ >B \to b >\end{matrix}$$ >Полученная грамматика находится в нормальной форме Хомского + From cdab5ff2ac6ac641231ae05deb85c707e4cc1c6c Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 26 Aug 2025 18:55:51 +0300 Subject: [PATCH 10/14] fix diff --- ...217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" | 1 + ...17 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" index 1266f6b..c92ae6e 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -344,3 +344,4 @@ B_1 &\to b \\ B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 \end{aligned}$$ Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. Как уже говорилось, можно также перейти к эквивалентной грамматике в [[Нормальная форма Хомского|нормальной форме Хомского]]. + diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" index 563372c..ade5b32 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -244,4 +244,5 @@ digraph{ Пусть в языке $k$ классов эквивалентности. Рассмотрим дерево с высотой $k+1$, значит, на каком-то пути этого дерева есть 2 поддерева, принадлежащие одному и тому же классу эквивалентности, но имеющие разную высоту. Назовем их $\tau_1 \equiv_R \tau_2$. При замене одного поддерева на другое мы получим дерево, в котором не все пути равны. Почему эти 2 поддерева эквивалентны? По выбору. Мы предположили, что язык древесно-автоматный, значит в нем конечное число классов эквивалентности. Возьмем дерево больше по высоте, чем число классов эквивалентности. По принципу Дирихле, в этом дереве должны встречаться 2 поддерева из одного класса эквивалентности. Дальше заменяем одно на другое и получаем дерево, в котором есть пути разной длины, что выводит за рамки языка. Значит, исходный язык $\mathcal L$ не древесно-автоматный. -Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных - техника абсолютно одинаковая. +Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных - техника абсолютно одинаковая. + From cc2caacba5e3e5658aa8bdff629a92c246451177 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 26 Aug 2025 18:58:59 +0300 Subject: [PATCH 11/14] fix diff 2 --- ...217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" | 1 - ...17 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" index c92ae6e..1266f6b 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -344,4 +344,3 @@ B_1 &\to b \\ B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 \end{aligned}$$ Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. Как уже говорилось, можно также перейти к эквивалентной грамматике в [[Нормальная форма Хомского|нормальной форме Хомского]]. - diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" index ade5b32..563372c 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -244,5 +244,4 @@ digraph{ Пусть в языке $k$ классов эквивалентности. Рассмотрим дерево с высотой $k+1$, значит, на каком-то пути этого дерева есть 2 поддерева, принадлежащие одному и тому же классу эквивалентности, но имеющие разную высоту. Назовем их $\tau_1 \equiv_R \tau_2$. При замене одного поддерева на другое мы получим дерево, в котором не все пути равны. Почему эти 2 поддерева эквивалентны? По выбору. Мы предположили, что язык древесно-автоматный, значит в нем конечное число классов эквивалентности. Возьмем дерево больше по высоте, чем число классов эквивалентности. По принципу Дирихле, в этом дереве должны встречаться 2 поддерева из одного класса эквивалентности. Дальше заменяем одно на другое и получаем дерево, в котором есть пути разной длины, что выводит за рамки языка. Значит, исходный язык $\mathcal L$ не древесно-автоматный. -Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных - техника абсолютно одинаковая. - +Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных - техника абсолютно одинаковая. From c34f9c55f66bfe40aeb65bd98354020117da86d8 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 26 Aug 2025 19:02:21 +0300 Subject: [PATCH 12/14] fix diff 3 --- ...\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" | 2 +- ...217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" index 1266f6b..e8fc45c 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(I).md" @@ -343,4 +343,4 @@ S_3 &\to aB_1S_1\mid a B_3 S_1 \mid a B_1 S_3\mid aB_3S_3 \\ B_1 &\to b \\ B_3 &\to a B_1 B_1 \mid a B_1 B_3 \mid a B_3 B_1 \mid a B_3 B_3 \end{aligned}$$ -Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. Как уже говорилось, можно также перейти к эквивалентной грамматике в [[Нормальная форма Хомского|нормальной форме Хомского]]. +Такое преобразование является некоторого рода "костылем", нужным для избавления от конструкторов разной арности. Это преобразование является чисто техническим для соответствия определению. Как уже говорилось, можно также перейти к эквивалентной грамматике в [[Нормальная форма Хомского|нормальной форме Хомского]]. \ No newline at end of file diff --git "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" index 563372c..d2ec7f0 100644 --- "a/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" +++ "b/\320\242\320\265\320\276\321\200\320\270\321\217/\320\232\320\276\320\275\321\201\320\277\320\265\320\272\321\202 - \320\224\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260 \320\262 \320\232\320\241-\320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\320\272\320\260\321\205 \320\270 \320\264\320\265\321\200\320\265\320\262\321\214\321\217 \320\262\321\213\320\262\320\276\320\264\320\260(II).md" @@ -244,4 +244,4 @@ digraph{ Пусть в языке $k$ классов эквивалентности. Рассмотрим дерево с высотой $k+1$, значит, на каком-то пути этого дерева есть 2 поддерева, принадлежащие одному и тому же классу эквивалентности, но имеющие разную высоту. Назовем их $\tau_1 \equiv_R \tau_2$. При замене одного поддерева на другое мы получим дерево, в котором не все пути равны. Почему эти 2 поддерева эквивалентны? По выбору. Мы предположили, что язык древесно-автоматный, значит в нем конечное число классов эквивалентности. Возьмем дерево больше по высоте, чем число классов эквивалентности. По принципу Дирихле, в этом дереве должны встречаться 2 поддерева из одного класса эквивалентности. Дальше заменяем одно на другое и получаем дерево, в котором есть пути разной длины, что выводит за рамки языка. Значит, исходный язык $\mathcal L$ не древесно-автоматный. -Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных - техника абсолютно одинаковая. +Как видно, метод, который мы рассмотрели, можно применять как для КС языков, так и для древесно-автоматных - техника абсолютно одинаковая. \ No newline at end of file From 66a67ecd8a9df1a99cd51605eaa687fdd648f2e5 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 26 Aug 2025 19:59:37 +0300 Subject: [PATCH 13/14] task2 LL+theory and task3 --- ...\200\320\270\320\260\320\275\321\202 3.md" | 149 ++++++++++++------ 1 file changed, 99 insertions(+), 50 deletions(-) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" index 12a8e56..9419dd1 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" @@ -45,22 +45,103 @@ R \to bR \mid a Воспользуемся идеями построения стекового автомата для LL разбора. Рассмотрим нетерминал S $$S \to baTaT$$ -Перед чтением слова мы кладем на стек $S$, после чего снимаем +Перед чтением слова мы кладем на стек $BATAT$, после чего последовательно снимаем стековые символы. Принимаем слово только по пустому стеку из начального состояния. Стековые символы $A,B$ соответствуют единственному символу слова $a,b$ соответственно и являются служебными. Стековый символ $T$ соответствует нетерминалу T. Здесь приведен черновик PDA разбирающий язык. +```dot +digraph{ + rankdir=LR + point[shape=point] + + T[label="..." shape=none] + + point -> S [label=". x/BATATx"] + S:n -> S:n [label="b B/."] + S:s -> S:s [label="a A/."] + S -> T [label=". T/."] + T -> S +} +``` +Теперь нужнно рассмотреть нетерминал $T$. Как было доказано в разделе "теоретический анализ языка" его правила имеют вид: +$$T \to abaTaTbbaTaTaT \mid bT \mid a$$ +Здесь основная проблема в том, что на первый взгляд, мы не можем сказать, когда мы прочитали нетерминал полностью, а когда мы его еще продолжаем читать. Очевидно, что сначала мы пытаемся прочитать какое-то количество символов $b$, после чего начинаем читать нетерминал по правилу 1 или 3. Таким образом мы получаем следующий PDA. 1 и 3 помечены переходы по правилу 1 или по правилу 3. ```dot digraph{ + rankdir=LR point[shape=point] - point -> S [label=". x/Sx"] - S -> 1 [label="b S/."] - 1 -> S [label="a x/TAT"] + T[label="T" ] + + point -> S [label=". x/BATATx"] + S:n -> S:n [label="b B/."] + S:s -> S:s [label="a A/."] + S -> T [label=". T/."] + T -> T [label=b] + T -> S:n [label="1"] + T -> S:s [label="3"] +} +``` + +Теперь необходимо понять, что нужно делать в случае когда при разборе $T$ мы видим букву $a$. Один из способов - это добавить дополнительное состояние, которое также будет соответстовать дополнительному символу грамматики. +$$\begin{matrix} +T \to bT \mid aP \\ +P \to baTaTbbaTaTaT \mid \varepsilon +\end{matrix}$$ +На данный момент нами уже рассмотрены префиксы $T$, начинающиеся с b. По таблице разбора и по грамматике видно, что если при разборе P мы видим $a$ то нужно раскрываться в пустое правило, и(так как мы уже прочитали этот символ, то нужно его снять с стека) Если мы видим $b$, то необходимо прочитать еще один символ, от которого зависит: +- если мы видим, что следующий символ $a$, то мы раскрываемся по длинному правилу P; +- если мы видим, что следующий символ $b$, то значит мы уже прочитали 2 символа с стека $BB$. + +Описанные выводы теперь интегрируем в PDA. +```dot +digraph{ + rankdir=LR + point[shape=point] + + T[label="T" ] + + point -> S [label=". x/BATATx"] + S:n -> S:n [label="b B/."] + S:s -> S:s [label="a A/."] + S -> T [label=". T/."] + T -> T [label=b] + T -> P [label=a] + P -> S [label="a A/."] + P -> P1 [label="b"] + P1 -> S [label="a x/TATBBATATAT"] + P1 -> P2[label="b B/."] + P2 -> S [label=". B/."] +} +``` + +Теперь нужно аккуратно добавить финальные состояния. В финальное состояние мы можем перейти только по пустому стеку. Перейти в него из состояния $S$ нельзя, так как последним символом на стеке всегда будет $T$, которое мы разбираем в всех остальных состояниях. Из состояния T мы также не можем перейти по пустому стеку, так как оно соответствует рекурсивному правилу $T \to bT$. Если в состоянии P мы оказались в конце слова и при этом с пустым стеком, то тогда мы имеем полное право закончить разбор и принять слово, поэтому добавляем переход. Из состояний $P1, P2$ мы не можем добавить такой переход, так как он будет противоречить разбору. Поэтому наш автомат примет следующий вид: + +```dot +digraph{ + rankdir=LR + point[shape=point] - S -> S [label="a A/A"] - T -> RR + F[shape=doublecircle] + + point -> S [label=". x/BATATx"] + S:n -> S:n [label="b B/."] + S:s -> S:s [label="a A/."] + S -> T [label=". T/."] + T -> T [label=b] + T -> P [label=a] + P -> S [label="a A/."] + P -> P1 [label="b"] + P1 -> S [label="a x/TATBBATATAT"] + P1 -> P2[label="b B/."] + P2 -> S [label=". B/."] + + P -> F [label=". ./."] } ``` +Этот PDA не идеален, так как, например, его можно дополнить состоянием ловушкой, чтобы все переходы по всем символам языка и стека были явно прописаны, но идейно уже в этом виде он описывает разбор. + +%%## Третий вариант(aka LR разбор) +Так как мы получили, что описываемый нами язык является LR(0) язком, то для него возможно построить грамматику и соответственно позиционный автомат, разбирающий язык.%% ## Теоретический анализ языка Язык очевидно КС, так как задается грамматикой. Приведенная грамматика является недетерминированной, что ничего не говорит о детерминированности самого языка. @@ -75,16 +156,7 @@ $$\omega = (baa)^n baaaa (baaaaaa)^n$$ Слово гарантировано лежит в языке, так как мы его породили по правилам грамматики. По лемме о накачке для регулярных языков, у любого слова есть подслово не дальше чем на $n$ символов от начала строки, которое можно накачать и не выйти из языка. Применяя отрицательную накачку, на первых n символах(дополнительно можно ограничить регулярную структуру $(baa)^* ba^3 (ba^5)^*$) мы выходим из языка. Значит язык нельзя накачать и поэтому язык не регулярный. Доказав, что язык не является регулярным(язык также очевидно не VPL, можно использовать тот же контрпример), мы можем задаться вопросом является ли он детерминированным КС. -%%Для этого применим лемму о накачке для детерминированных КС языков. - ->[!note] Отрицание леммы о накачке для детерминированных КС -> Для любого n - длинны накачки, существует 2 словf $\omega_1, \omega_2$ с общим префиксом, но разными суффиксами для которых выполнены оба условия -> 1) префикс не накачивается в КС смысле -> 2) не накачиваются префикс + суффикс в кс смысле -> тогда язык не детерминированный КС. -Здесь подозрение на недетрминизм вызывает правила $T \to aSbS \mid a$ -%% На наше счастье мы можем произвести преобразование грамматики к следующему виду $$\begin{matrix} S \to baTaT\\ @@ -97,12 +169,14 @@ T \to abaTaTbbaTaTaT \mid bT \mid a | $S$ | - | - | - | - | 1 | 1 | - | - | | $T$ | 3 | 3 | 1 | 3 | 2 | 2 | 2 | 2 | -Таблица $LL(3)$ разбора не содержит противоречий, поэтому мы получили, что рассматриваемый нами язык является $LL$-языком. +Таблица $LL(3)$ разбора не содержит противоречий, поэтому мы получили, что рассматриваемый нами язык является $LL$-языком, а соответственно является детерминированным КС языком. + +Более того, мы можем говорить, что язык является LR(0) так как для данного языка возможно построить распознаватель, принимающий язык только по пустому символу. # 3. Язык всех палиндромов в $\{a,b\}$ таких, что они являются конкатенацией префикса некоторого палиндрома $v_1$ длинны больше $\frac{2|v_1|}{3}$ и суффикса некоторого палиндрома $v_2$ длинны больше $\frac{2|v_2|}{3}$ -%%Используя оракул, мы можем получить за $O(1)$, что язык не является КС, но для этого нам нужно выделить подмножество слов, которые не накачиваются.%% +Здесь сначала приведены попытки доказательства, что язык является контекстно зависимым. В конце приведен вывод о истинном виде языка, но данные рассуждения все равно оставлены в обучающих целях. -Данный язык можно описать иначе, как палиндром, к которому присоединен непалиндромный префикс или суффикс, который меньше по длине чем половина. +Данный язык можно описать иначе, как палиндром, к которому присоединен непалиндромный префикс или суффикс, который меньше по длине чем половина. Такое описание получается, если рассматривать язык только как конкатенацию префикса и суффикса палиндромов. Таким образом все слова описываются как $$\{v xx^R yy^Ru \mid |v| < |x| \space \& \space |u| < |y|\}$$ Но также эти слова сами по себе должны быть палиндромными, то есть @@ -143,39 +217,14 @@ $$vxx^Ryy^R u = ww^R$$ 2) центр слова находится в $x^R$(или $y$) 3) центр слова находится по середине $x^Ry$ - накачивается -%%дописать%% +Здесь дальнейшие рассуждения прекращаются, потому что было замечено, какой именно вид имеет рассматриваемый язык. --- -Меня терзают смутные сомнения, что этот язык в целом полностью совпадает с языком палиндромов над $\{a,b\}$, так как мы любое слово из языка можем представить как конкатенацию префикса, который совпадает с всем словом, и суффиксом пустого палиндрома. - -%% -Язык не КС, так как в нем наблюдаются перекрестные зависимости между подсловами, которую нельзя выразить с помощью стека. -Для доказательства, что язык не КС, используем лемму о накачке. -Пусть $n$ - длинна накачки. Рассмотрим тогда слово -$$\omega = \underbrace{ba^{2n}ba^n}_{v_1}\underbrace{a^nba^{2n}b}_{v_2}$$ +%%Меня терзают смутные сомнения%% Заметим, что этот язык полностью совпадает с языком палиндромов над $\{a,b\}$, так как мы любое слово из языка можем представить как конкатенацию префикса, который совпадает с всем словом, и суффиксом пустого палиндрома. Собственно поэтому представленные выше рассуждения, по доказательству контекстной зависимости приводили в тупик. - - -Пусть n - длинна накачки. Рассмотрим тогда слово из языка -$$\omega = \underbrace{a^nb^nab^n}_{v_1}\underbrace{b^nab^na^n}_{v_2}$$ -Очевидно, что это слово лежит в языке, соответствующее разбиение на подслова обозначено в примере. -Возможно ли произвести другое разбиение этого слова на подслова $v_1,v_2$? Рассмотрим расширение $v_1$. -Пусть $v_1$ расширено только на некоторое количество $b$, тогда мы имеем -$$\omega = \underbrace{a^nb^nab^{n+k}}_{v_1} \underbrace{b^{n-k} ab^na^n}_{v_2}$$ -Но в таком случае, мы получаем, что центр суффикса палиндрома $v_2$ должен сместиться в область $b^n$, чтобы удовлетворять ограничению на длинну. Но для любых k мы имеем структуру, которая не соответствует структуре суффикса палиндрома, тем самым получаем противоречие. -Аналогичную ситуацию мы имеем при попытке расширить $v_1$ до $b^n$. -Пусть мы расширили $v_1$ так, что $v_2$ состоит только из букв $a$, тогда -$$\omega = \underbrace{a^nb^nab^{2n}ab^na^k}_{v_1} \underbrace{a^{n-k}}_{v_2}$$ - - - -Так как данный язык симметричен относительно разворота(при развороте слова, мы получаем слово из того же языка), то мы можем ограничиться рассотрением только случая расширения $v_1$. - -Теперь мы должны рассмотреть накачки. Для простоты доказательства ограничим язык регулярной структурой(пересечем с регулярным выражением - при пересечении КС языка мы должны получить КС язык) -$$a^*b^*ab^*ab^*a^*$$ -Рассмотрим возможные области накачки -$$\omega = \underbrace{a^n}_{p_1}\underbrace{b^n}_{p_2}a\underbrace{b^{2n}}_{p_3}a\underbrace{b^n}_{p_4}\underbrace{a^n}_{p_5}$$ -> Если говорить в общих словах, то ограничения языка задают строгие соотношения между количествами в областях $p_1p_5, p_2p_3p_4$, тем самым мы не можем накачать ни одну из областей и не можем накачать перекрестно соседние области. - -%% +Итак, описываемый в задаче язык, является языком палиндромов над алфавитом $\{a,b\}$, без пустого слова, так как оно не подходит по определению($|\varepsilon|\not>\frac23|\varepsilon|$). Описывается классической грамматикой +$$\begin{matrix} +S \to aSa \mid bSb \mid a \mid b \mid aa \mid bb +\end{matrix}$$ +Как известно, является недетерминированным КС языком. From 0de18ec28eca827f847370ee0317837c326d034c Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 26 Aug 2025 20:09:00 +0300 Subject: [PATCH 14/14] task2 LL fix --- ...0\321\200\320\270\320\260\320\275\321\202 3.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" index 9419dd1..45c3986 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\222\320\260\321\200\320\270\320\260\320\275\321\202\321\213/\320\222\320\260\321\200\320\270\320\260\320\275\321\202 3.md" @@ -63,7 +63,7 @@ digraph{ ``` Теперь нужнно рассмотреть нетерминал $T$. Как было доказано в разделе "теоретический анализ языка" его правила имеют вид: -$$T \to abaTaTbbaTaTaT \mid bT \mid a$$ +$$T \to abaTaTbbaTaT \mid bT \mid a$$ Здесь основная проблема в том, что на первый взгляд, мы не можем сказать, когда мы прочитали нетерминал полностью, а когда мы его еще продолжаем читать. Очевидно, что сначала мы пытаемся прочитать какое-то количество символов $b$, после чего начинаем читать нетерминал по правилу 1 или 3. Таким образом мы получаем следующий PDA. 1 и 3 помечены переходы по правилу 1 или по правилу 3. ```dot digraph{ @@ -85,7 +85,7 @@ digraph{ Теперь необходимо понять, что нужно делать в случае когда при разборе $T$ мы видим букву $a$. Один из способов - это добавить дополнительное состояние, которое также будет соответстовать дополнительному символу грамматики. $$\begin{matrix} T \to bT \mid aP \\ -P \to baTaTbbaTaTaT \mid \varepsilon +P \to baTaTbbaTaT \mid \varepsilon \end{matrix}$$ На данный момент нами уже рассмотрены префиксы $T$, начинающиеся с b. По таблице разбора и по грамматике видно, что если при разборе P мы видим $a$ то нужно раскрываться в пустое правило, и(так как мы уже прочитали этот символ, то нужно его снять с стека) Если мы видим $b$, то необходимо прочитать еще один символ, от которого зависит: - если мы видим, что следующий символ $a$, то мы раскрываемся по длинному правилу P; @@ -107,7 +107,7 @@ digraph{ T -> P [label=a] P -> S [label="a A/."] P -> P1 [label="b"] - P1 -> S [label="a x/TATBBATATAT"] + P1 -> S [label="a x/TATBBATAT"] P1 -> P2[label="b B/."] P2 -> S [label=". B/."] } @@ -130,7 +130,7 @@ digraph{ T -> P [label=a] P -> S [label="a A/."] P -> P1 [label="b"] - P1 -> S [label="a x/TATBBATATAT"] + P1 -> S [label="a x/TATBBATAT"] P1 -> P2[label="b B/."] P2 -> S [label=". B/."] @@ -150,9 +150,9 @@ digraph{ Пусть n - длинна накачки, тогда $$\omega = (baa)^n S (bSaT)^n$$ Раскроем S -$$\omega = (baa)^n baTaT (baTaTaT)^n$$ +$$\omega = (baa)^n baTaT (bbaTaTaT)^n$$ Раскроем T по самому маленькому правилу -$$\omega = (baa)^n baaaa (baaaaaa)^n$$ +$$\omega = (baa)^n baaaa (bbaaaaaa)^n$$ Слово гарантировано лежит в языке, так как мы его породили по правилам грамматики. По лемме о накачке для регулярных языков, у любого слова есть подслово не дальше чем на $n$ символов от начала строки, которое можно накачать и не выйти из языка. Применяя отрицательную накачку, на первых n символах(дополнительно можно ограничить регулярную структуру $(baa)^* ba^3 (ba^5)^*$) мы выходим из языка. Значит язык нельзя накачать и поэтому язык не регулярный. Доказав, что язык не является регулярным(язык также очевидно не VPL, можно использовать тот же контрпример), мы можем задаться вопросом является ли он детерминированным КС. @@ -160,7 +160,7 @@ $$\omega = (baa)^n baaaa (baaaaaa)^n$$ На наше счастье мы можем произвести преобразование грамматики к следующему виду $$\begin{matrix} S \to baTaT\\ -T \to abaTaTbbaTaTaT \mid bT \mid a +T \to abaTaTbbaTaT \mid bT \mid a \end{matrix}$$ И уже по этой грамматике видно, что она является $LL(3)$.