From 78ab2abd81eb2db48826aa81a0fc4e6a08a3629d Mon Sep 17 00:00:00 2001 From: HumsterProgrammer Date: Fri, 24 Jan 2025 09:56:58 +0300 Subject: [PATCH 01/19] add variant 2, 6. minor fixes 5, 8 --- ...\200\320\270\320\260\320\275\321\202 2.md" | 105 ++++++++++++++++- ...\200\320\270\320\260\320\275\321\202 5.md" | 2 +- ...\200\320\270\320\260\320\275\321\202 6.md" | 51 +++++++- ...\200\320\270\320\260\320\275\321\202 8.md" | 9 -- ...20\260\320\275\321\202\320\260\320\274.md" | 110 +++++++++++++----- 5 files changed, 236 insertions(+), 41 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 2.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 2.md" index fa74eaa..7c1eba7 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 2.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 2.md" @@ -1 +1,104 @@ -#пустой \ No newline at end of file +# 1. Выражение $(?= ba^*(bb\mid aa)^* (?<= a^* ba^*) aa^*ba)(aba \mid ba^*bb)^*$ + +Рассмотрим сначала выражение внутри lookbehind проверки: +$$\begin{aligned} +ba^*(bb\mid aa)^* (?<= a^*ba^*)aa^*ba \to ba^*aa^*ba +\end{aligned}$$ +Рассмотрим теперь lookahead +$$\begin{aligned} +&(?= ba^*aa^*ba) (aba\mid ba^*bb)^* = (?= ba^*aa^*ba) (aba\mid ba^*bb) (aba\mid ba^*bb)^* = \\ +& = (?= ba^*aa^*ba) ba^*bb (aba \mid ba^*bb)^* = \varepsilon +\end{aligned}$$ + + +# 2. Грамматика +$$\begin{aligned} +S \to TaQ \text{ }&S \to RT \\ +T \to QbA \text{ }&T \to BR \\ +Q \to BcD \text{ }&Q \to TR \\ +R \to aR \text{ }& R \to baR \text{ } R \to bbD \\ +B \to cB \text{ }& B \to dRA \\ +A \to DqB \text{ }& A \to aDd \\ +D \to Dca \text{ }& D \to b +\end{aligned}$$ +Заметим, что Q - не рекурсивный символ, так что можем его убрать +Также заметим, что символ D - леворекурсивный - переведем в правую рекурсию +$$\begin{aligned} +&S \to TaBcD \mid TaTR \mid RT \\ +&T \to BcDbA \mid TRbA \mid BR \\ +&R \to aR \mid baR \mid bbD \\ +&B \to cB \mid dRA \\ +&A \to DqB \mid aDd \\ +&D \to b L \\ +&L \to caL \mid \varepsilon +\end{aligned}$$ +Теперь можно спокойно также убрать символ D +$$\begin{aligned} +&S \to TaBcbL \mid TaTR \mid RT \\ +&T \to BcbLbA \mid TRbA \mid BR \\ +&R \to aR \mid baR \mid bbbL \\ +&B \to cB \mid dRA \\ +&A \to bLqB \mid abLd \\ +&L \to caL \mid \varepsilon +\end{aligned}$$ +Избавимся от левой рекурсии нетерминала T +$$\begin{aligned} +&S \to TaBcbL \mid TaTR \mid RT \\ +&T \to BcbLbAP \mid BRP \\ +&P \to RbAP \mid \varepsilon \\ +&R \to aR \mid baR \mid bbbL \\ +&B \to cB \mid dRA \\ +&A \to bLqB \mid abLd \\ +&L \to caL \mid \varepsilon +\end{aligned}$$ + Не знаю как описать следующее преобразование, но мы разные хвосты разбора, с одинаковыми префиксами переводим в новые нетерминалы. ==Для решения задачи это не является необходимым, но мне так удобнее © Денис== + +$$\begin{aligned} +&S \to TaS_1 \mid RT \\ +&S_1 \to BcbL \mid TR\\ +&T \to BT_1 \\ +&T_1 \to cbLbAP \mid RP\\ +&P \to RbAP \mid \varepsilon \\ +&R \to aR \mid baR \mid bbbL \\ +&B \to cB \mid dRA \\ +&A \to bLqB \mid abLd \\ +&L \to caL \mid \varepsilon +\end{aligned}$$ +$$\begin{aligned} +&S = TaS_1 \mid RT = BT_1aB(cb(ca)^* \mid T_1(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* BT_1\\ +&S_1 = BcbL \mid TR = BcbL \mid BT_1R = B(cb(ca)^* \mid T_1(a \mid ba \mid bbb)^*(ca)^*)\\ +&T = BT_1\\ +&T_1 = cbLbAP \mid RP = (cbLbA \mid R) P = (cb(ca)^*b(b(ca)^*qB \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)\\ +&(((a \mid ba \mid bbb)^*(ca)^*)b(b(ca)^*qB \mid ab (ca)^*d))^*\\ +&P = (RbA)^* = (((a \mid ba \mid bbb)^*(ca)^*)b(b(ca)^*qB \mid ab (ca)^*d))^*\\ +&B = (c)^* dRA = (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*qB \mid (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)\\ + &= (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \\ +&A= b(ca)^*qB \mid ab (ca)^*d \text{ // я не буду переписывать регулярку для B} \\ +&R = (a \mid ba \mid bbb)^* L = (a \mid ba \mid bbb)^*(ca)^* \\ +&L = (ca)^* +\end{aligned}$$ + +Таким образом можно весь язык выразить следующей регуляркой(которая не помещается в одну строчку) +$$\begin{aligned} +BT_1aB(cb(ca)^* \mid T_1(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* BT_1 = \\ +(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* \\ +(a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \\ +(cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*) \\ +a (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca^*) \mid (cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)) +\end{aligned}$$ + +в общем, вот код латех +```latex +$$ +(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) (cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*) a (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca^*) \mid (cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)) +$$ +``` + +# 3. Язык $\{wz^Rvz \mid w,v,z \in \{a,b\}^* \& |w|>1 \& |z|>1 \&(v=w^R \vee v \in (ab^*)^+)\}$ +оч-но не VPL +КС ли? + +Лемма о накачке +Пусть p - длинна накачки, рассмотрим слово $w = \underbrace{(ab)^p}_{=p_1} \underbrace{a^{2p}}_{=p_2} \underbrace{(ba)^p}_{=p_3}\underbrace{a^{2p}}_{=p_4}$ +При накачке только $p_i$ ломается соотношение между словами +При накачке перемычек также ломается соотношений палиндромов. Соответсвенно накачать слово нельзя => язык не КС \ No newline at end of file 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 5.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 5.md" index 25e3b86..2e53617 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 5.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 5.md" @@ -1,5 +1,5 @@ ### 1. Язык $\{w \big{|} |w|_{ab} = |w|_{bba} \& |w|_{bbb} = 0 \& w \in \{a, b\}^*\}$. ### 2. Язык слов, первая треть которых не равна последней трети. -### 3. Язык истинных выражений, представляющих собой утверждение вида $N_1 + N_2 > N_0$, где $N_0, N_1, и N_2$ — двоичные числа. +### 3. Язык истинных выражений, представляющих собой утверждение вида $N_1 + N_2 > N_0$, где $N_0, N_1,\text{ и }N_2$ — двоичные числа. #пустой \ No newline at end of file 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 6.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 6.md" index 05ca773..3d551dd 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 6.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 6.md" @@ -1,5 +1,52 @@ -### 1. Язык логических формул $c \Rightarrow$ и без скобок, содержащих только константы $0$ и $1$, таких что их значение равно $1$. Считаем следование правоассоциативным, т.е. $1 \Rightarrow 0 \Rightarrow 0$понимаем как $1 \Rightarrow (0 \Rightarrow 0)$. -### 2. Язык $$\{w_1 v w_2 \big{|} w_2 = h (w_1)h(w_1) \& w_i \in \{a, b\}^* \& v \in b^*a^*\}$$, где h - гомоморфизм, определённый правилами $h(a) = aa, h(b) = a$. +### 1. Язык логических формул с $\Rightarrow$ и без скобок, содержащих только константы $0$ и $1$, таких что их значение равно $1$. Считаем следование правоассоциативным, т.е. $1 \Rightarrow 0 \Rightarrow 0$ понимаем как $1 \Rightarrow (0 \Rightarrow 0)$. + +Если справа 1, то слева может быть все что угодно. +Если справа 0, то слева только 0. + +Соответственно, можно регулярку строить рекурсивно, относительно правого выражения. +- Если справа $0\Rightarrow0$, $0\Rightarrow1$, $1\Rightarrow1$, то слева может быть любое регулярное выражение +- Если справа стоит $1\Rightarrow0$, то слева должно быть $0\Rightarrow X$, где X - это ложное выражение + +Регулярка делает вывод о разборе по первому символу. Если символ 0, то формула будет истинной при любом суффиксе. Если 1, то истина только если истин суффикс. +Выведем регулярку через грамматику +``` +S -> 0 => T | 1 => S | 1 => 1 | 0 => 0 | 0 => 1 // верное логическое выражение +T -> 0 => T | 1 => 1 | 1 => 1 | 0 => 0 | 0 => 1 | 1 => 0 // любое логическое выражение +``` + +Таким образом можно построить НКА, разбирающий язык(приведен без промежуточных состояний): +```dot +digraph{ + rankdir=LR + node[shape=circle] + F[shape=doublecircle] + + S -> F [label="1=>1"] + S -> F [label="0=>1"] + S -> F [label="0=>0"] + S -> S [label="1=>"] + S,T -> T [label="0=>"] + T -> T [label="1=>"] + T -> F [label="1=>1"] + T -> F [label="0=>1"] + T -> F [label="0=>0"] + T -> F [label="1=>0"] +} +``` + +Далее при необходимости можно добавить промежуточные состояния и детерминизирвать. + +### 2. Язык $\{w_1 v w_2 \big{|} w_2 = h (w_1)h(w_1) \& w_i \in \{a, b\}^* \& v \in b^*a^*\}$, где h - гомоморфизм, определённый правилами $h(a) = aa, h(b) = a$. + +Грамматика +``` +S -> aSaaaa | bSaa | T +T -> AB +A -> aA | ε +B -> bB | ε +``` +Так допустимо, так как образы гомоморфизма комутативны, то есть можно спокойно перемещать так как необходимо. Поэтому структуру последовательных слов преобразуем в комутативную ей скобочную структуру + ### 3. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. #пустой \ No newline at end of file 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 8.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 8.md" index 3f006d5..48c3f56 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 8.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 8.md" @@ -1,12 +1,3 @@ -В РК было 3 типа заданий [[Содержание РК1]]:![[Pasted image 20241112182939.png]] -# Что нужно для РК? -Мозги(Опционально) -![[Теорема Майхилла-Нероуда]]![[Лемма о накачке для КС-языков]] -Элементы не академических регулярок -+ $r_1(?<= r_2)r_3 \sim (.^*r_2 \cap r_1) r_3$ - (look behind) ретроспективная проверка -+ $(?= r_1)r_2 \sim (r_1.^* \cap r_2)$ - (look ahead) опережающая проверка -# Разбор вариантов -## Вариант 8 ### 1. Язык правильно построенных логических формул над алфавитом $\{(,),P, Q, \land, \neg\}$, таких что в их каждом подслове длинны 3, кроме, возможно, единственного, первая и последняя буквы совпадают Решение: Рассмотрим сначала возможные "правильные" подслова(P или Q буду обозначать за X) diff --git "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\235\320\260\320\262\320\270\320\263\320\260\321\206\320\270\321\217 \320\277\320\276 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\320\260\320\274.md" "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\235\320\260\320\262\320\270\320\263\320\260\321\206\320\270\321\217 \320\277\320\276 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\320\260\320\274.md" index 6eaddf6..0a7e1f7 100644 --- "a/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\235\320\260\320\262\320\270\320\263\320\260\321\206\320\270\321\217 \320\277\320\276 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\320\260\320\274.md" +++ "b/\320\237\321\200\320\260\320\272\321\202\320\270\320\272\320\260/\320\240\320\2321/\320\235\320\260\320\262\320\270\320\263\320\260\321\206\320\270\321\217 \320\277\320\276 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\320\260\320\274.md" @@ -1,28 +1,82 @@ -[[Вариант 1]] -[[Вариант 2]] -[[Вариант 3]] -[[Вариант 4]] -[[Вариант 5]] -[[Вариант 6]] -[[Вариант 7]] -[[Вариант 8]] -[[Вариант 9]] -[[Вариант 10]] -[[Вариант 11]] -[[Вариант 12]] -[[Вариант 13]] -[[Вариант 14]] -[[Вариант 15]] -[[Вариант 16]] -[[Вариант 17]] -[[Вариант 18]] -[[Вариант 19]] -[[Вариант 20]] -[[Вариант 21]] -[[Вариант 22]] -[[Вариант 23]] -[[Вариант 24]] -[[Вариант 25]] -[[Вариант 26]] -[[Вариант 27]] -[[Вариант 28]] \ No newline at end of file +![[Вариант 1]] + +--- +![[Вариант 2]] + +--- +![[Вариант 3]] + +--- +![[Вариант 4]] + +--- +![[Вариант 5]] + +--- +![[Вариант 6]] + +--- +![[Вариант 7]] + +--- +![[Вариант 8]] + +--- +![[Вариант 9]] + +--- +![[Вариант 10]] + +--- +![[Вариант 11]] + +--- +![[Вариант 12]] + +--- +![[Вариант 13]] + +--- +![[Вариант 14]] + +--- +![[Вариант 15]] + +--- +![[Вариант 16]] + +--- +![[Вариант 17]] + +--- +![[Вариант 18]] + +--- +![[Вариант 19]] + +--- +![[Вариант 20]] + +--- +![[Вариант 21]] + +--- +![[Вариант 22]] + +--- +![[Вариант 23]] + +--- +![[Вариант 24]] + +--- +![[Вариант 25]] + +--- +![[Вариант 26]] + +--- +![[Вариант 27]] + +--- +![[Вариант 28]] \ No newline at end of file From 5a3e1d5143dd01f58735aa668069354f13045a3c Mon Sep 17 00:00:00 2001 From: HumsterProgrammer Date: Sun, 26 Jan 2025 22:18:18 +0300 Subject: [PATCH 02/19] var 1, changes var 2 --- ...\200\320\270\320\260\320\275\321\202 1.md" | 186 ++++++++++++++++-- ...\200\320\270\320\260\320\275\321\202 2.md" | 19 +- 2 files changed, 183 insertions(+), 22 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 1.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 1.md" index 1348491..f7a4382 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 1.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 1.md" @@ -1,16 +1,172 @@ -### 1. Язык чисел в системе счисления с основанием 4, делящихся на 5. -### 2. Грамматика -$$ -\begin{aligned} -S \to bTaT \\ -T \to aS \\ -T \to bT \\ -S \to BB \\ -T \to a \\ -B \to Ba \\ -B \to ab \\ -\end{aligned} -$$ -### 3. Язык lookahead-регулярных выражений, не описывающих пустые языки. lookahead-ы не используются под итерацией и не могут быть вложенными. Алфавит $\{a, b, \$\}$ (причём $\$$ допустим только в конце выражения и в конце lookahead-блоков), допустимые операции - альтернатива, конкатенация и итерация, скобки допускаются. +### 1. Язык чисел в системе счисления с основанием 4, делящихся на 5. +Входной алфавит: $\{0,1,2,3\}$ +Состояния: остатки от 0 до 4. + +**Идея @BaldiSlayer** +> Пусть A - основание системы счисления, B - остаток от деления на который мы смотрим. +> Состояния описывают текущий остаток от деления на B(для произвольной задачи такого вида) +> Переходы по k для состояния q определяются следующей формулой: +> $$q' = (q * A + k) \mod B$$ +> Если в задаче необходима делимость, то отмечаем как финальное состояние 0. Если необходимо, чтобы число *не* делилось, то отмечаем все, кроме 0, финальными. +> +> Построение ДКА для произвольных параметров на Python(выводит на языке Graphviz): + +ДКА для данной задачи: +```dot +digraph{ + rankdir=LR + node[shape=circle] + 0[shape=doublecircle] + 0 -> 0[label=0] + 0 -> 1[label=1] + 0 -> 2[label=2] + 0 -> 3[label=3] + + 1 -> 4[label=0] + 1 -> 0[label=1] + 1 -> 1[label=2] + 1 -> 2[label=3] + + 2 -> 3[label=0] + 2 -> 4[label=1] + 2 -> 0[label=2] + 2 -> 1[label=3] + + 3 -> 2[label=0] + 3 -> 3[label=1] + 3 -> 4[label=2] + 3 -> 0[label=3] + + 4 -> 1[label=0] + 4 -> 2[label=1] + 4 -> 3[label=2] + 4 -> 4[label=3] +} +``` + + + +### 2. Грамматика +$$ +\begin{aligned} +S \to bTaT \\ +T \to aS \\ +T \to bT \\ +S \to BB \\ +T \to a \\ +B \to Ba \\ +B \to ab \\ +\end{aligned} +$$ Перепишем в более компактный вид +$$\begin{aligned} +S &\to bTaT \mid BB \\ +T &\to bT \mid aS \mid a \\ +B &\to Ba \mid ab +\end{aligned}$$ + +Первый вариант решения==(не до конца рабочий)== + +$$\begin{aligned} +B &= aba^* \\ +T &= b^*a ?(S) \\ +S &= bTaT \mid BB = bTaT \mid aba^*aba^* = \\ +&= bb^*a ?(S) ab^*a?(S) \mid aba^* aba^* +\end{aligned}$$ + +Получили не регулярную грамматику(записана в форме расширенной грамматики, чтобы было удобнее преобразовывать в PDA) +$$\begin{aligned} +S &\to bb^*aE ab^*aE \mid aba^*aba^* \\ +E &\to S \mid \varepsilon \\ +&\Rightarrow \\ +S &\to bb^*aE ab^*aE \mid aba^*aba^* \\ +E &\to bb^*aE ab^*aE \mid aba^*aba^* \mid \varepsilon +\end{aligned} $$ +NPDA +```dot +digraph{ +rankdir=LR +node[shape=circle] +f4, g4[shape=doublecircle] + +S,0 -> 1[label="b x/Ax"] +1 -> 1[label=b] +1 -> 0[label=a] + +0 -> g1[label=a] +g1 -> g2[label=b] +g2 -> g2[label=a] +g2 -> g3[label=a] +g3 -> g4[label=b] +g4 -> g4[label=a] -#пустой \ No newline at end of file +0 -> g4[label=epsilon] + +g4 -> 2[label="a A/e"] +2->2[label=b] +2 -> g4[label=a] + +g4 -> 0[label=epsilon] +g4 -> f1[label=a] + +S -> f1[label=a] +f1 -> f2[label=b] +f2 -> f2[label=a] +f2 -> f3[label=a] +f3 -> f4[label=b] +f4 -> f4[label=a] +} +``` + +#### Второй вариант решения +Перепишем в более компактный вид +$$\begin{aligned} +S &\to bTaT \mid BB \\ +T &\to bT \mid aS \mid a \\ +B &\to Ba \mid ab +\end{aligned}$$ +Стоит сказать, что $B = aba^*$ в регулярном смысле(см. левая рекурсия), поэтому можно переписать грамматику следующим образом: +$$\begin{aligned} +S &\to bTaT \mid abEabE \\ +T &\to bT \mid aS \mid a \\ +E &\to aE \mid \varepsilon +\end{aligned}$$ +Заметим, что грамматика красиво преобразовывается в **ослабленную нормальную форму Грейбах** +$$\begin{aligned} +S &\to bTAT \mid aBEABE \\ +T &\to bT \mid aS \mid a \\ +E &\to aE \mid \varepsilon \\ +A &\to a \\ +B &\to b +\end{aligned}$$ +Для нее можно построить NPDA, который будет ее разбирать(чуть модифицированный вариант тривиального PDA по грамматике) - приводится в текстовом виде, так как graphviz не может нормально визуализировать этот автомат +```d +digraph{ + rankdir=LR + node[shape=circle] + f [shape=doublecircle] + + S -> 0 [label="e Z0/SZ0"] + 0 -> f [label="e Z0/Z0"] + + 0 -> 0 [label="b S/TAT"] + 0 -> 0 [label="a S/BEABE"] + + 0 -> 0 [label="b T/T"] + 0 -> 0 [label="a T/S"] + 0 -> 0 [label="a T/."] + + 0 -> 0 [label="a E/E"] + 0 -> 0 [label="epsilon E/."] + + 0 -> 0 [label="a A/."] + 0 -> 0 [label="b B/."] +} +``` + +### 3. Язык lookahead-регулярных выражений, не описывающих пустые языки. lookahead-ы не используются под итерацией и не могут быть вложенными. Алфавит $\{a, b, \$\}$ (причём $\$$ допустим только в конце выражения и в конце lookahead-блоков), допустимые операции - альтернатива, конкатенация и итерация, скобки допускаются. +Язык не КС. Докажем с помощью Леммы о накачке +Пусть p - длинна накачки, рассмотрим слово $w = (?= \underbrace{a^p}_{p_1}\underbrace{b^p}_{p_2}) \underbrace{a^p}_{p_3} \underbrace{b^p}_{p_4}$ +При накачке отдельно $p_i$ выйдем из языка, так как образец lookahead не будет совпадать с регуляркой. +При накачке $p_1p_2$ или $p_3p_4$ аналогично +При накачке $p_2p_3$ мы получаем не симметричное изменение образца и регулярки(в образце изменяются b а в регулярке a), поэтому также выйдем из языка. +Следовательно, слово нельзя накачать — не КС. \ No newline at end of file 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 2.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 2.md" index 7c1eba7..1bf9450 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 2.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 2.md" @@ -94,11 +94,16 @@ $$ $$ ``` -# 3. Язык $\{wz^Rvz \mid w,v,z \in \{a,b\}^* \& |w|>1 \& |z|>1 \&(v=w^R \vee v \in (ab^*)^+)\}$ -оч-но не VPL -КС ли? +# 3. Язык $\{wz^Rvz \mid w,v,z \in \{a,b\}^* \space \& \space |w|>1 \space \& \space |z|>1 \space \&\space (v=w^R \vee v \in (ab^*)^+)\}$ +Очевидно, что язык не является VPL, так как нельзя предъявить разбиение алфавита на вызывающие и возвращающие символы. +Необходимо проверить, является ли язык КС. Для этого воспользуемся леммой о накачке для КС языков. +Перед непосредственным использованием леммы заметим, что $(ab^*)^+ = ab^*(ab^*)^* = ab^* (a|b)^* = a(a|b)^*$ +То есть, одно из условий переписывается как $v = w^R \vee v \in a (a|b)^*$ -Лемма о накачке -Пусть p - длинна накачки, рассмотрим слово $w = \underbrace{(ab)^p}_{=p_1} \underbrace{a^{2p}}_{=p_2} \underbrace{(ba)^p}_{=p_3}\underbrace{a^{2p}}_{=p_4}$ -При накачке только $p_i$ ломается соотношение между словами -При накачке перемычек также ломается соотношений палиндромов. Соответсвенно накачать слово нельзя => язык не КС \ No newline at end of file + + +==Пусть p - длинна накачки, рассмотрим слово $w = \underbrace{(ab)^p}_{p_1} \underbrace{a^{2p}}_{p_2} \underbrace{(ba)^p}_{p_3}\underbrace{a^{2p}}_{p_4}$== +==Рассмотрим, почему допустимо только такое разбиение. Пусть z захватывает $p_3p_4$ полностью или частично.== + +==При накачке только $p_i$ ломается соотношение между словами== +==При накачке перемычек также ломается соотношений палиндромов. Соответсвенно накачать слово нельзя => язык не КС== \ No newline at end of file From 526ba847871d800c8d6a3eb339284974e57b2c45 Mon Sep 17 00:00:00 2001 From: HumsterProgrammer Date: Sun, 26 Jan 2025 23:04:24 +0300 Subject: [PATCH 03/19] add 1, 3 var 4 --- ...\200\320\270\320\260\320\275\321\202 4.md" | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 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 4.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 4.md" index 6bd9135..b89f4f0 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 4.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 4.md" @@ -1,7 +1,33 @@ ### 1. Язык тождественно истинных логических формул без скобок, со связками только V, & и ¬ (с обычным приоритетом операций) и константами Т, F. -### 2. Язык $$\{w | |w|_{ab} = |w|_{baa} \& |w|_{abb} \& |w|_{bba} \& w \in \{a, b\}^+\}$$. +Язык действительно регулярный, так как не рассматривает вложенных структур. +Язык можно описать следующим образом: +- слова - конкатенация через $\vee$ логических формул, среди которых есть хотя бы одна истинная +- Истинная логическая формула - конкатенация истин через & +- Истина - T или четное число отрицаний +- Логическая формула - конкатенация через & логических единиц = T или F перед которыми произвольное число отрицаний +Таким образом можно рекурсивно определить регулярное выражение +$$\begin{aligned} +&L = (\text{} V)^* \text{} (V\text{})^*\\ +&\text{} = \text{} (\& \text{})^* \\ +&\text{} = ¬^* (T|F) \Rightarrow\\ +&\text{} = ¬^* (T|F) (\& ¬^* (T|F)) \\ +&\text{} = \text{} (\& \text{})^*\\ +&\text{} = T | (¬¬)^+ F \Rightarrow \\ +&\\ +&L = (¬^* (T|F) (\& ¬^* (T|F))\space V)^* +(T | (¬¬)^+ F) (\& (T | (¬¬)^+ F))^* (V \space ¬^* (T|F) (\& ¬^* (T|F)))^* +\end{aligned}$$ +### 2. Язык $\{w | |w|_{ab} = |w|_{baa} \& |w|_{abb} \neq |w|_{bba} \& w \in \{a, b\}^+\}$. + +#пустой ### 3. Язык всех не завершающихся систем переписывания строк из одного правила. Алфавит: ${f,g, \to}$. -#пустой \ No newline at end of file +Для длинны накачки n рассмотрим $w = f^ng^n -> f^ng^n$. +В общем случае не завершается, так как либо нельзя применить правило, либо можно применять сколько угодно раз. +При накачке левой части отдельно от правой, система становится завершающейся +При отрицательной накачке правой части, также завершается, так как число нетерминалов уменьшается. +При отрицательной накачке перекрестной, число f уменьшается, поэтому система переписывания рано или поздно закончится. +Следовательно, по лемме о накачке язык не КС. + From f18332cbfba348d3e1c782eb59ffaa6104bdb20d Mon Sep 17 00:00:00 2001 From: HumsterProgrammer Date: Thu, 30 Jan 2025 21:58:11 +0300 Subject: [PATCH 04/19] fix var 1 --- ...\200\320\270\320\260\320\275\321\202 1.md" | 57 +++++++++++++++++-- ...\200\320\270\320\260\320\275\321\202 4.md" | 1 - 2 files changed, 53 insertions(+), 5 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 1.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 1.md" index f7a4382..5dcfd8d 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 1.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 1.md" @@ -7,9 +7,12 @@ > Состояния описывают текущий остаток от деления на B(для произвольной задачи такого вида) > Переходы по k для состояния q определяются следующей формулой: > $$q' = (q * A + k) \mod B$$ -> Если в задаче необходима делимость, то отмечаем как финальное состояние 0. Если необходимо, чтобы число *не* делилось, то отмечаем все, кроме 0, финальными. +> Выделяем финальными состояниями те, которые необходимы принимающими в языке(в зависимости от того, какой требуется остаток от деления): +> - Если требуется, чтобы числа делились выделяем финальным только состояние 0 +> - Если требуется, чтобы числа **не** делились, выделяем финальным все, кроме 0 +> - В остальных случаях выделяем те остатки, которые нам необходимы > -> Построение ДКА для произвольных параметров на Python(выводит на языке Graphviz): +> Построение ДКА для произвольных параметров на Python для задач "числа, (не)делящиеся на B"(выводит на языке Graphviz): ДКА для данной задачи: ```dot @@ -163,10 +166,56 @@ digraph{ } ``` + +Эквивалентный ему PDA +```dot +digraph{ + rankdir=LR + node[shape=circle] + F [shape=doublecircle] + + START + S + T + 0 + + START -> 0 [label=". Z0/SZ0"] + 0 -> F [label=". Z0/Z0"] + + 0 -> S [label=". S/."] + S -> 0 [label="b x/TATx"] + S -> 0 [label="a x/BEABEx"] + + 0 -> T [label=". T/."] + T -> 0 [label="b x/Tx"] + T -> 0 [label="a x/Sx"] + T -> 0 [label="a x/x"] + + 0 -> E [label=". E/."] + E -> 0 [label="a E/E"] + E -> 0 [label=". x/x"] + + 0 -> 0 [label="a A/."] + 0 -> 0 [label="b B/."] +} +``` + ### 3. Язык lookahead-регулярных выражений, не описывающих пустые языки. lookahead-ы не используются под итерацией и не могут быть вложенными. Алфавит $\{a, b, \$\}$ (причём $\$$ допустим только в конце выражения и в конце lookahead-блоков), допустимые операции - альтернатива, конкатенация и итерация, скобки допускаются. +**Первый способ** Язык не КС. Докажем с помощью Леммы о накачке Пусть p - длинна накачки, рассмотрим слово $w = (?= \underbrace{a^p}_{p_1}\underbrace{b^p}_{p_2}) \underbrace{a^p}_{p_3} \underbrace{b^p}_{p_4}$ -При накачке отдельно $p_i$ выйдем из языка, так как образец lookahead не будет совпадать с регуляркой. +При накачке отдельно $p_i$ выйдем из языка, так как образец lookahead не будет совпадать с регуляркой: +- Для $p_1, p_2$ при положительной накачке выйдем из языка, так как lookahead станет больше чем регулярка +- для $p_3, p_4$ отрицательная накачка выводит из языка, так как образец lookahead становится больше чем регулярка + При накачке $p_1p_2$ или $p_3p_4$ аналогично При накачке $p_2p_3$ мы получаем не симметричное изменение образца и регулярки(в образце изменяются b а в регулярке a), поэтому также выйдем из языка. -Следовательно, слово нельзя накачать — не КС. \ No newline at end of file +Следовательно, слово нельзя накачать — не КС. + +**Второй способ** +Произведем сначала преобразования языка +1) Пересечем язык с регуляркой $(?=a^*b^*)a^*b^*$ +2) Используем морфизм $h: h('(') = \varepsilon, h(')')=c, h('?') = \varepsilon, h('=')=\varepsilon, h(a)=a,h(b)=b$ + +После преобразований, мы получаем язык $L' =\{wcwv \mid w \in a^*b^*, v \in b^*\}$ +Докажем, что он не КС с помощью леммы о накачке для КС языков \ No newline at end of file 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 4.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 4.md" index b89f4f0..c60502c 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 4.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 4.md" @@ -1,5 +1,4 @@ ### 1. Язык тождественно истинных логических формул без скобок, со связками только V, & и ¬ (с обычным приоритетом операций) и константами Т, F. - Язык действительно регулярный, так как не рассматривает вложенных структур. Язык можно описать следующим образом: - слова - конкатенация через $\vee$ логических формул, среди которых есть хотя бы одна истинная From b08b84c299d23406f1d23f8510a3ed9300ad212e Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Fri, 4 Apr 2025 23:05:55 +0300 Subject: [PATCH 05/19] minor fix --- ...\321\200\320\270\320\260\320\275\321\202 1.md" | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 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 1.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 1.md" index 5dcfd8d..0323203 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 1.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 1.md" @@ -11,7 +11,7 @@ > - Если требуется, чтобы числа делились выделяем финальным только состояние 0 > - Если требуется, чтобы числа **не** делились, выделяем финальным все, кроме 0 > - В остальных случаях выделяем те остатки, которые нам необходимы -> +> В качестве стартового выделяем состояние 0. > Построение ДКА для произвольных параметров на Python для задач "числа, (не)делящиеся на B"(выводит на языке Graphviz): ДКА для данной задачи: @@ -19,7 +19,11 @@ digraph{ rankdir=LR node[shape=circle] + point[shape=point] 0[shape=doublecircle] + + point -> 0 + 0 -> 0[label=0] 0 -> 1[label=1] 0 -> 2[label=2] @@ -67,8 +71,9 @@ T &\to bT \mid aS \mid a \\ B &\to Ba \mid ab \end{aligned}$$ -Первый вариант решения==(не до конца рабочий)== +# Первый вариант решения==(не до конца рабочий)== +Заметим, что некоторые нетерминалы мы можем описать в качестве регулярных выражений, в составе которых также могут присутствовать другие нетерминалы(что-то вроде RegEx) $$\begin{aligned} B &= aba^* \\ T &= b^*a ?(S) \\ @@ -146,8 +151,11 @@ B &\to b digraph{ rankdir=LR node[shape=circle] + point[shap=point] f [shape=doublecircle] + point -> S + S -> 0 [label="e Z0/SZ0"] 0 -> f [label="e Z0/Z0"] @@ -172,6 +180,7 @@ digraph{ digraph{ rankdir=LR node[shape=circle] + point[shape=point] F [shape=doublecircle] START @@ -179,6 +188,8 @@ digraph{ T 0 + point -> START + START -> 0 [label=". Z0/SZ0"] 0 -> F [label=". Z0/Z0"] From 9400709942749597558bee5d65e002ec69a4b655 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 7 Apr 2025 17:51:21 +0300 Subject: [PATCH 06/19] automata changes --- ...222\320\260\321\200\320\270\320\260\320\275\321\202 1.md" | 5 +---- 1 file changed, 1 insertion(+), 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 1.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 1.md" index 0323203..afc721e 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 1.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 1.md" @@ -50,9 +50,6 @@ digraph{ 4 -> 4[label=3] } ``` - - - ### 2. Грамматика $$ \begin{aligned} @@ -216,7 +213,7 @@ digraph{ Язык не КС. Докажем с помощью Леммы о накачке Пусть p - длинна накачки, рассмотрим слово $w = (?= \underbrace{a^p}_{p_1}\underbrace{b^p}_{p_2}) \underbrace{a^p}_{p_3} \underbrace{b^p}_{p_4}$ При накачке отдельно $p_i$ выйдем из языка, так как образец lookahead не будет совпадать с регуляркой: -- Для $p_1, p_2$ при положительной накачке выйдем из языка, так как lookahead станет больше чем регулярка +- Для $p_1, p_2$ при положительной накачке выйдем из языка, так как lookahead станет больше чем регулярка, с которой сравниваем, то есть даст пустое слово. - для $p_3, p_4$ отрицательная накачка выводит из языка, так как образец lookahead становится больше чем регулярка При накачке $p_1p_2$ или $p_3p_4$ аналогично From df917d76bc20fdd9e8c59f99564398ed0d9453fd Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Sat, 10 May 2025 15:30:23 +0300 Subject: [PATCH 07/19] var 1 fix --- ...\200\320\270\320\260\320\275\321\202 1.md" | 254 ++++++++++++++---- 1 file changed, 204 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 1.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 1.md" index afc721e..9f75dea 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 1.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 1.md" @@ -68,60 +68,190 @@ T &\to bT \mid aS \mid a \\ B &\to Ba \mid ab \end{aligned}$$ -# Первый вариант решения==(не до конца рабочий)== - -Заметим, что некоторые нетерминалы мы можем описать в качестве регулярных выражений, в составе которых также могут присутствовать другие нетерминалы(что-то вроде RegEx) +# Первый вариант решения +Еще раз запишем грамматику в ее компактном виде. $$\begin{aligned} -B &= aba^* \\ -T &= b^*a ?(S) \\ -S &= bTaT \mid BB = bTaT \mid aba^*aba^* = \\ -&= bb^*a ?(S) ab^*a?(S) \mid aba^* aba^* +S &\to bTaT \mid BB \\ +T &\to bT \mid aS \mid a \\ +B &\to Ba \mid ab \end{aligned}$$ +Заметим, что нетерминал B порождает регулярный язык $aba^*$, что не сложно увидеть, если рассмотреть порождаемые слова, или заметить, что нетерминал B задает леворекурсивный вывод и поэтому можно воспользоваться правилом преобразования леворекурсивного вывода. Таким образом +$$B = aba^*$$ +Нетерминал T - праворекурсивный, таким образом нетерминал T порождает язык: +$$T = b^*a?(S)$$ +Теперь нам нужно рассмотреть язык, порождаемый нетерминалом S. Раскроем по ранее полученным замечаниям нетерминалы B и T в правилах переписывания S. +$$S \to bTaT \mid BB;$$ +$$S \to b\underbrace{b^*a?(S)}_Ta\underbrace{b^*a?(S)}_T \mid \underbrace{aba^*}_B\underbrace{aba^*}_B$$ +Таким образом, мы получили, что наш язык можно записать в форме расширенной грамматики с одним нетерминалом: +$$S \to bb^*a?(S)ab^*a?(S)\mid aba^*aba^*$$ +Теперь построим по расширенной грамматике NPDA. +Построим его по методу ограничения правил раскрытия%%не знаю, можно ли его прям считать методом и работает ли он в всех случаях%%. +Сначала построим НКА для языка $S \to aba^*aba^*$. +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 4[shape=doublecircle] + point -> 0 -Получили не регулярную грамматику(записана в форме расширенной грамматики, чтобы было удобнее преобразовывать в PDA) -$$\begin{aligned} -S &\to bb^*aE ab^*aE \mid aba^*aba^* \\ -E &\to S \mid \varepsilon \\ -&\Rightarrow \\ -S &\to bb^*aE ab^*aE \mid aba^*aba^* \\ -E &\to bb^*aE ab^*aE \mid aba^*aba^* \mid \varepsilon -\end{aligned} $$ -NPDA + 0 -> 1[label=a] + 1 -> 2[label=b] + 2 -> 2[label=a] + 2 -> 3[label=a] + 3 -> 4[label=b] + 4 -> 4[label=a] +} +``` +Данный НКА можно детерминировать, если произвести комутативную замену грамматики $S \to ab\underbrace{aa^*}_{\text{поменялись местами}}ba^*$ и теперь мы получим ДКА: ```dot digraph{ -rankdir=LR -node[shape=circle] -f4, g4[shape=doublecircle] - -S,0 -> 1[label="b x/Ax"] -1 -> 1[label=b] -1 -> 0[label=a] - -0 -> g1[label=a] -g1 -> g2[label=b] -g2 -> g2[label=a] -g2 -> g3[label=a] -g3 -> g4[label=b] -g4 -> g4[label=a] - -0 -> g4[label=epsilon] - -g4 -> 2[label="a A/e"] -2->2[label=b] -2 -> g4[label=a] - -g4 -> 0[label=epsilon] -g4 -> f1[label=a] - -S -> f1[label=a] -f1 -> f2[label=b] -f2 -> f2[label=a] -f2 -> f3[label=a] -f3 -> f4[label=b] -f4 -> f4[label=a] + rankdir=LR + node[shape=circle] + point[shape=point] + 4[shape=doublecircle] + point -> 0 + + 0 -> 1[label=a] + 1 -> 2[label=b] + 3 -> 3[label=a] + 2 -> 3[label=a] + 3 -> 4[label=b] + 4 -> 4[label=a] } ``` +Несложно понять, что язык при этой замене не поменялся. Допустимо произвести такую замену, так как $a^*$ и $a$ состоят из одного и того же символа $a$. +Теперь вернемся к первому правилу промежуточной грамматики. Раскрытие по второму правилу всегда будет финальным. Первое же правило порождают язык схожий по структуре с языков правильных скобочных последовательностей. Пусть $L \to bb^*a, R \to ab^*a$, тогда +$$S \to L?(S)R?(S)$$ +порождает язык правильных скобочных последовательностей. Для этого языка можно построить следующий NPDA: +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 0[shape=doublecircle] + + point -> 0 + 0 -> 1[label="L x/Ax"] + 1 -> 1[label="L x/Bx"] + 1:s -> 1:s[label="R B/."] + 1 -> 0[label="R A/."] +} +``` +Теперь расширим язык возможностью присутствия E внутри правильных скобочных последовательностей или после. +$$S \to L?(S)R?(S) \mid E$$ +Для построения PDA заметим следующее правило: в слове после символа E либо ничего не стоит, либо стоит закрывающая скобка. Докажем это. Пусть мы прочитали суффикс $\varphi$ и находимся на глубине вложенности $n$. После суффикса идет $E$. Пусть мы раскрылись в E через первую S в первом правиле раскрытия. Тогда после должно идти R без исключений. Пусть мы раскрылись по второй S в E. Тогда после E могут идти символы, которые могут идти после S, а для данной грамматики это либо R либо конец слова. Что и требовалось доказать. +Из полученного нами утверждения построим PDA для этой промежуточной грамматики. +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 3, F[shape=doublecircle] + + point -> 0 + 0,3 -> F[label="E"] + 0,3 -> 1[label="L x/Ax"] + 1 -> 1[label="L x/Bx"] + 1 -> 1[label="R B/."] + 1 -> 3[label="R A/."] + 1 -> 2[label="E"] + 2 -> 1[label="R B/."] + 2 -> 3[label="R A/."] +} +``` +Поясним, как был построен PDA. Состояния 0 и 3 - состояния, когда мы прочитали правильную скобочную последовательность, в том числе пустую. Но почему мы не можем объединить их? Если бы мы объединили два этих состояния, то наш PDA допускал бы пустое слово, а по грамматики видно, что этого не должно происходить. +Состояние F отвечает за прочитанную в конце слова символ E. Мы можем прочитать его как в самом начале, так и после правильной скобочной последовательности. +Состояние 1 отвечает за накопление в стеке глубины раскрытия скобок и раскрытие в ПСП без внутренних символов. Для понимания того, прочитали мы ПСП или нет, используем классический прием и в стеке оперируем двумя разными стековыми символами. Стековый символ A отвечает за глубину вложенности 1, символ B - за все остальные. Если мы прочитали закрывающую скобку и сняли символ A, то мы понимаем, что мы находимся после правильной скобочной последовательности, иначе - внутри. +Если в состоянии 1 мы встретили внутренний символ E, то переходим в состояние 2, из которого мы обязаны прочитать закрывающую скобку, по ранее доказанному утверждению. + +Теперь несложно заметить, что требуемый от нас язык можно получить из промежуточного применив регулярный морфизм - в данном случае, так обозначаю морфизм, который заменяет каждое вхождение символа на какое-то слово из регулярного языка. +$$L \to bb^*a \quad R \to ab^*a \quad E \to abaa^*ba$$ +Эти языки расбирают соответственно следующие ДКА: +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + L2[shape=doublecircle] + point -> L0 + + L0 -> L1[label=b] + L1 -> L1[label=b] + L1 -> L2[label=a] +} +``` +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + R2[shape=doublecircle] + point -> R0 + + R0 -> R1[label=a] + R1 -> R1[label=b] + R1 -> R2[label=a] +} +``` +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + E4[shape=doublecircle] + point -> E0 + + E0 -> E1[label=a] + E1 -> E2[label=b] + E3 -> E3[label=a] + E2 -> E3[label=a] + E3 -> E4[label=b] + E4 -> E4[label=a] +} +``` + +Теперь вставим в PDA участки построенных автоматов вместо разбора L, R и E соответственно. +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 3, F[shape=doublecircle] + + point -> 0 + 0,3 -> E1[label=a] + E1 -> E2[label=b] + E2,E3 -> E3[label=a] + E3 -> F[label=b] + F -> F[label=a] + + 0,3 -> L[label="b x/Ax"] + L -> L[label=b] + L -> 1[label=a] + 1 -> L[label="b x/Bx"] + + 1 -> R1[label="a B/."] + R1 -> R1[label=b] + R1 -> 1[label=a] + 2 -> R1[label="a B/."] + + 1 -> R2[label="a A/."] + R2 -> R2[label=b] + R2 -> 3[label=a] + 2 -> R2[label="a A/."] + + 1 -> EE1[label="a"] + EE1 -> EE2[label=b] + EE2,EE3 -> EE3[label=a] + EE3 -> 2[label=b] + 2 -> 2[label=a] +} +``` + +Полученный автомат недетерминирован, так как есть переходы, в одних случаях мы кладем что-то на стек, а в других - нет. +%%Предполагаю, что язык недетерминированный, но пока без доказательства.%% #### Второй вариант решения Перепишем в более компактный вид $$\begin{aligned} @@ -172,7 +302,7 @@ digraph{ ``` -Эквивалентный ему PDA +Эквивалентный ему NPDA ```dot digraph{ rankdir=LR @@ -209,7 +339,7 @@ digraph{ ``` ### 3. Язык lookahead-регулярных выражений, не описывающих пустые языки. lookahead-ы не используются под итерацией и не могут быть вложенными. Алфавит $\{a, b, \$\}$ (причём $\$$ допустим только в конце выражения и в конце lookahead-блоков), допустимые операции - альтернатива, конкатенация и итерация, скобки допускаются. -**Первый способ** +**Первый способ(решить задачу в лоб)** Язык не КС. Докажем с помощью Леммы о накачке Пусть p - длинна накачки, рассмотрим слово $w = (?= \underbrace{a^p}_{p_1}\underbrace{b^p}_{p_2}) \underbrace{a^p}_{p_3} \underbrace{b^p}_{p_4}$ При накачке отдельно $p_i$ выйдем из языка, так как образец lookahead не будет совпадать с регуляркой: @@ -220,10 +350,34 @@ digraph{ При накачке $p_2p_3$ мы получаем не симметричное изменение образца и регулярки(в образце изменяются b а в регулярке a), поэтому также выйдем из языка. Следовательно, слово нельзя накачать — не КС. -**Второй способ** +**Второй способ(свести к более простому языку)** Произведем сначала преобразования языка 1) Пересечем язык с регуляркой $(?=a^*b^*)a^*b^*$ 2) Используем морфизм $h: h('(') = \varepsilon, h(')')=c, h('?') = \varepsilon, h('=')=\varepsilon, h(a)=a,h(b)=b$ После преобразований, мы получаем язык $L' =\{wcwv \mid w \in a^*b^*, v \in b^*\}$ -Докажем, что он не КС с помощью леммы о накачке для КС языков \ No newline at end of file +Докажем, что он не КС с помощью леммы о накачке для КС языков. Пусть p - длинна накачки. Рассмотрим слово $\omega = a^pb^pca^pb^p$. Докажем, что это слово нельзя накачать в КС смысле. +Разобъем слово на участки с одинаковым поведением при накачке $$\omega = \underbrace{a^p}_{p_1}\underbrace{b^p}_{p_2}c\underbrace{a^p}_{p_3}\underbrace{b^p}_{p_4}$$ +При накачке отдельно $p_1, p_3$ мы получим, что слово до и после c не равны. +При положительной накачке $p_2$ мы получим, что слово до c больше чем слово после. +При отрицательной накачке $p_4$ мы получим тот же случай, когда слово до с длиннее чем после. +Теперь рассмотрим перекрестные накачки. При перекрестной положительной накачке $p_1p_2$ мы получим ситуацию, когда подслово до разделителя больше чем после. При накачке $p_2p_3$ получим рассинхрон в количестве букв a до и после разделителя c. При отрицательной накачке $p_3p_4$ мы получим, что букв a больше до разделителя с, чем после. Таким образом мы получили, что слово нельзя накачать язык не КС. + +**Третий способ(через стратифицированные периоды)** +Произведем начальные преобразования как в втором способе. Докажем, что язык $L' =\{wcwv \mid w \in a^*b^*, v \in b^*\}$ не КС с помощью анализа стратифицированных периодов. +Для начала затрем $c$ с помощью морфизма +$$\varphi(x) = \begin{cases} +\varepsilon, x = c \\ +x, x\neq c +\end{cases}$$ +Таким образом мы получим язык $L'' =\{wwv \mid w \in a^*b^*, v \in b^*\}$ ограниченный регуляркой $a^*b^*a^*b^*$ + +Рассмотрим соотношения количеств между промежутками +$$a^{k_1}b^{k_2}a^{k_1}b^{k_2 + k_3}$$ +Получаем три вектора +$$\begin{aligned} +k_1 = (1,0,1,0)\\ +k_2 = (0,1,0,1)\\ +k_3 = (0,0,0,1) +\end{aligned}$$ +Как видно, вектора $k_1, k_2$ не удовлетворяют условию теоремы, поэтому язык не КС. \ No newline at end of file From bc15f5d544056f42440313fdc5a63cba0a1e131e Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Sat, 10 May 2025 22:38:23 +0300 Subject: [PATCH 08/19] var 2, 4,6 fixes --- ...\200\320\270\320\260\320\275\321\202 2.md" | 202 +++++++++++------- ...\200\320\270\320\260\320\275\321\202 4.md" | 30 ++- ...\200\320\270\320\260\320\275\321\202 6.md" | 9 +- 3 files changed, 150 insertions(+), 91 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 2.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 2.md" index 1bf9450..100b7ae 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 2.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 2.md" @@ -1,105 +1,143 @@ # 1. Выражение $(?= ba^*(bb\mid aa)^* (?<= a^* ba^*) aa^*ba)(aba \mid ba^*bb)^*$ -Рассмотрим сначала выражение внутри lookbehind проверки: +Рассмотрим сначала выражение внутри lookbehind проверки. Эту проверку очевидно можно упростить: +$$ba^*(bb\mid aa)^* (?<= \cancel{a^*}ba^*) = ba^*(bb\mid aa)^* (?<= ba^*)$$ +Так как при переписывании по определению [[lookbehind]] эту часть можно жадно съесть с помощью $.^*$ +Поэтому мы получим следующее раскрытие: $$\begin{aligned} -ba^*(bb\mid aa)^* (?<= a^*ba^*)aa^*ba \to ba^*aa^*ba -\end{aligned}$$ -Рассмотрим теперь lookahead -$$\begin{aligned} -&(?= ba^*aa^*ba) (aba\mid ba^*bb)^* = (?= ba^*aa^*ba) (aba\mid ba^*bb) (aba\mid ba^*bb)^* = \\ -& = (?= ba^*aa^*ba) ba^*bb (aba \mid ba^*bb)^* = \varepsilon +ba^*(bb\mid aa)^* (?<= ba^*) \to \underbrace{ba^*}_{T_1}\mid b a^*(bb|aa)^*b\underbrace{b(aa^*)}_{T_2} \end{aligned}$$ +Области $T_1, T_2$ - те области, которые подошли для подстановки в lookbehind. В $T_1$ мы взяли случай, когда все слово подставляется в lookbehind. В $T_2$ мы взяли минимальное подслово, чтобы оно удовлетворяло lookbehind. +Теперь упростим полученную регулярку +$$ba^*\mid b a^*(bb|aa)^*bb(aa^*) =$$ +Упростим мы из следующего соображения. Пусть мы прочитали часть слова, удовлетворяющую $ba^*$. Если после мы прочитаем a, то мы можем также его отнести к уже прочитанной регулярке. Если после мы читаем b, то после обязательно должно следовать b. И после прочитанной bb мы можем читать только четные количества a и b, причем сколько угодно раз. Таким образом мы получаем следующее регулярное выражение +$$= ba^*(bb(aa)^*)^*$$ + +Рассмотрим теперь lookahead подстановку. +$$(?= \underbrace{ba^*(bb(aa)^*)^*}_{lookbehind} aa^*ba)(aba \mid ba^*bb)^*$$ +Очевидно, что 0 итераций регулярного выражения $(aba \mid ba^*bb)^*$ не входит в язык, так как нам требуются слова, состоящие как минимум из 4 букв(см. минимальное слово из образца lookahead). +Поэтому раскроем одну итерацию +$$(?= ba^*(bb(aa)^*)^* aa^*ba)(aba \mid ba^*bb)(aba \mid ba^*bb)^*$$ +Очевидно, что первая итерация не может раскрыться в $aba$, так как образец начинается с $b$. Поэтому получаем +$$(?= ba^*(bb(aa)^*)^* aa^*ba)ba^*bb(aba \mid ba^*bb)^*$$ +Сразу можно упростить наше выражение, заметив, что первая b всегда будет совпадать. Поэтому +$$b(?= a^*(bb(aa)^*)^* aa^*ba)a^*bb(aba \mid ba^*bb)^*$$ +Также очевидна возможность следующей перестановки +$$b(?= a^*(bb(aa)^*)^* \underbrace{a^*a}_{swap}ba)a^*bb(aba \mid ba^*bb)^*$$ +Теперь нам необходимо перебрать различные случаи lookahead образцов. +Пусть итерация $(bb(aa)^*)^*$ раскроется 0 раз. Тогда мы получим: +$$b(?= a^*aba)a^*bb(aba \mid ba^*bb)^*$$ +Очевидно, что в таком случае, мы не сможем никак подставить, так как нам необходимо встретить $aba$ после некоторого количества a, а мы можем получить только bb. Поэтому эта итерация раскроется как минимум 1 раз. Тогда мы получаем: +$$b(?= a^*bb(aa)^*(bb(aa)^*)^*a^*aba)a^*bb(aba \mid ba^*bb)^*$$ +И теперь совпадающий префикс $a^*bb$ мы можем выделить в начало, за пределы lookahead +$$ba^*bb(?= (aa)^*(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ +Если первая итерация в этом lookahead раскроется хотя бы 1 раз, то мы не сможем составить слово, поэтому: +$$ba^*bb(?= \cancel{(aa)^*}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ +Далее мы будем рассматривать только lookahead, без префикса языка $ba^*bb$, просто в конце при поиске ответа сконкатенируем с ним. + +--- +Пусть вторая итерация в образце раскроется n раз, тогда +$$(?= \underbrace{bba^* bba^* ... bba^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ +1)Тогда итерацию самого слова мы должны раскрывать по второй альтернативе. +$$(?= \underbrace{bba^* bba^* ... bba^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)b \color{red}{a^*} \color{black}bb(aba \mid ba^*bb)^*$$ +2)Очевидно, что по $a^*$ слова(отмечено красным) мы не можем итерироваться. Поэтому получаем +$$(?= \underbrace{bba^* bba^* ... bba^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ +3)Теперь по первой итерации в образце не можем итерироваться, тогда +$$(?= bb\underbrace{bba^* ... bba^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ +4)Выносим за пределы образца bb и там и там +$$bb(?= \underbrace{bba^* ... bba^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ +5)Теперь при раскрытии по второму правилу мы получим +$$bb(?= \underbrace{\color{red}bba^*\color{black}bba^* ... bba^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)\color{red}bba^*\color{black}bb(aba \mid ba^*bb)^*$$ +6)Красную часть, совпадающую и там и там, можем вынести. +$$bbbba^*(?= \underbrace{bba^* ... bba^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)bb(aba \mid ba^*bb)^*$$ +7)По первому правилу мы все еще не можем раскрыться, поэтому раскрываемся по второму +$$bbbba^*(?= \underbrace{\color{red}bba^*bba^*\color{black}bba^* ... bba^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)\color{red}bbba^*b\color{black}b(aba \mid ba^*bb)^*$$ +8)Если не раскрывать итерации, то получится вынести еще блок из b. +$$bbbba^*bbbb(?= \underbrace{bba^* ... bba^*}_{\text{n-4 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ +И мы снова вернулись к шагу 4, с разросшимся префиксом. Из этого можно понять, что итерация $(bb(aa)^*)^*$ может раскрыться или 0 раз, или если больше, то мы получаем 1 или 2 b между lookahead и итерацией самого слова. +$$\begin{cases} +(?= a^*aba)(aba \mid ba^*bb)^* &n=0 \\ +\varphi_n(?= a^*aba)(b|bb)(aba \mid ba^*bb)^*&n>0\\ +\end{cases}$$ +Но при $n>0$ мы не сможем дальше дораскрыть lookahead, значит допустимо только раскрытие 0 раз. + +--- +Так мы получили итерацию 0 раз. И значит рассмотрим: +$$(?= a^*aba)(aba \mid ba^*bb)^*$$ +Раскрытие итерации в образце сколько нибудь раз, не даст нам сопоставить с словом, поэтому +$$(?= aba)(aba \mid ba^*bb)^*$$ +А такой lookahead раскрывается тривиально в: +$$aba(aba|ba^*bb)^*$$ +Теперь результат нужно сконкатенировать с опущенными ранее префиксами и мы получим **ответ**: +$$ba^*bbaba(aba|ba^*bb)^*$$ # 2. Грамматика $$\begin{aligned} -S \to TaQ \text{ }&S \to RT \\ -T \to QbA \text{ }&T \to BR \\ -Q \to BcD \text{ }&Q \to TR \\ -R \to aR \text{ }& R \to baR \text{ } R \to bbD \\ -B \to cB \text{ }& B \to dRA \\ -A \to DqB \text{ }& A \to aDd \\ -D \to Dca \text{ }& D \to b +&S \to TaQ &S \to RT \\ +&T \to QbA &T \to BR \\ +&Q \to BcD &Q \to TR \\ +&R \to aR &R \to baR & \quad R \to bbD \\ +&B \to cB &B \to dRA \\ +&A \to DqB &A \to aDd \\ +&D \to Dca &D \to b \end{aligned}$$ -Заметим, что Q - не рекурсивный символ, так что можем его убрать -Также заметим, что символ D - леворекурсивный - переведем в правую рекурсию +Перепишем граматику с альтернативами $$\begin{aligned} -&S \to TaBcD \mid TaTR \mid RT \\ -&T \to BcDbA \mid TRbA \mid BR \\ +&S \to TaQ \mid RT \\ +&T \to QbA \mid BR \\ +&Q \to BcD \mid TR \\ &R \to aR \mid baR \mid bbD \\ &B \to cB \mid dRA \\ &A \to DqB \mid aDd \\ -&D \to b L \\ -&L \to caL \mid \varepsilon -\end{aligned}$$ -Теперь можно спокойно также убрать символ D -$$\begin{aligned} -&S \to TaBcbL \mid TaTR \mid RT \\ -&T \to BcbLbA \mid TRbA \mid BR \\ -&R \to aR \mid baR \mid bbbL \\ -&B \to cB \mid dRA \\ -&A \to bLqB \mid abLd \\ -&L \to caL \mid \varepsilon -\end{aligned}$$ -Избавимся от левой рекурсии нетерминала T -$$\begin{aligned} -&S \to TaBcbL \mid TaTR \mid RT \\ -&T \to BcbLbAP \mid BRP \\ -&P \to RbAP \mid \varepsilon \\ -&R \to aR \mid baR \mid bbbL \\ -&B \to cB \mid dRA \\ -&A \to bLqB \mid abLd \\ -&L \to caL \mid \varepsilon +&D \to Dca \mid b \end{aligned}$$ - Не знаю как описать следующее преобразование, но мы разные хвосты разбора, с одинаковыми префиксами переводим в новые нетерминалы. ==Для решения задачи это не является необходимым, но мне так удобнее © Денис== - -$$\begin{aligned} -&S \to TaS_1 \mid RT \\ -&S_1 \to BcbL \mid TR\\ -&T \to BT_1 \\ -&T_1 \to cbLbAP \mid RP\\ -&P \to RbAP \mid \varepsilon \\ -&R \to aR \mid baR \mid bbbL \\ -&B \to cB \mid dRA \\ -&A \to bLqB \mid abLd \\ -&L \to caL \mid \varepsilon -\end{aligned}$$ -$$\begin{aligned} -&S = TaS_1 \mid RT = BT_1aB(cb(ca)^* \mid T_1(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* BT_1\\ -&S_1 = BcbL \mid TR = BcbL \mid BT_1R = B(cb(ca)^* \mid T_1(a \mid ba \mid bbb)^*(ca)^*)\\ -&T = BT_1\\ -&T_1 = cbLbAP \mid RP = (cbLbA \mid R) P = (cb(ca)^*b(b(ca)^*qB \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)\\ -&(((a \mid ba \mid bbb)^*(ca)^*)b(b(ca)^*qB \mid ab (ca)^*d))^*\\ -&P = (RbA)^* = (((a \mid ba \mid bbb)^*(ca)^*)b(b(ca)^*qB \mid ab (ca)^*d))^*\\ -&B = (c)^* dRA = (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*qB \mid (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)\\ - &= (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \\ -&A= b(ca)^*qB \mid ab (ca)^*d \text{ // я не буду переписывать регулярку для B} \\ -&R = (a \mid ba \mid bbb)^* L = (a \mid ba \mid bbb)^*(ca)^* \\ -&L = (ca)^* -\end{aligned}$$ - -Таким образом можно весь язык выразить следующей регуляркой(которая не помещается в одну строчку) -$$\begin{aligned} -BT_1aB(cb(ca)^* \mid T_1(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* BT_1 = \\ -(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* \\ -(a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \\ -(cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*) \\ -a (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca^*) \mid (cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)) -\end{aligned}$$ - -в общем, вот код латех -```latex -$$ -(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) (cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*) a (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca^*) \mid (cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)(a \mid ba \mid bbb)^*(ca)^*) \mid (a \mid ba \mid bbb)^*(ca)^* (c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d)(cb(ca)^*b(b(ca)^*q(c)^*d ((a \mid ba \mid bbb)^*(ca)^* b(ca)^*q)^* (a \mid ba \mid bbb)^*(ca)^* ab(ca)^*d) \mid ab (ca)^*d) \mid (a \mid ba \mid bbb)^*(ca)^*)) -$$ +Проанализируем структуру грамматики - какие нетерминалы в какие переписываются. Построим граф +```dot +digraph{ + S -> T,Q,R + T -> Q,A,B,R + Q -> B,D,T,R + R -> R,D + D -> D + B -> B,R,A + A -> D,B +} ``` +По графу видно, что вырисовывается иерархия между нетерминалами. Так D рекурсивно зависит только от себя, R зависит от себя и от D. Начнем анализировать язык от "листьев" к "корню" +Рассмотрим нетерминал $D \to Dca \mid b$. Этот нетерминал раскрывается леворекурсивно и его язык можно описать регулярным выражением. +$$D = b(ca)^*$$ +Рассмотрим нетерминал $R \to aR \mid baR \mid bbD$. Он в свою очередь является праворекурсивным, и его также можно выразить в виде регулярного выражения: +$$R = (a\mid ba)^*bbD = (a\mid ba)^*bbb(ca)^*$$ +Теперь нам нужно вместе рассмотреть нетерминалы A и B. +$$A \to DqB \mid aDb \qquad B \to cB \mid dRA$$ +Они оба содержат праворекурсивный вывод относительно A и B каждый раз меняясь друг с другом. +$$B = c^*dRA$$ +$$A = Dq\underbrace{B}_{c^*dRA} \mid aDb = Dqc^*dRA \mid aDb = (Dqc^*dR)^*aDb$$ +Таким образом для нетерминалов A и В получаем: +$$A = (Dqc^*dR)^*aDb = (b(ca)^*qc^*d(a\mid ba)^*bbb(ca)^*)ab(ca)^*b$$ +$$B = c^*dR(Dqc^*dR)^*aDb$$ +Языки нетерминалов D,R заменим позже. +Теперь рассмотрим пару нетерминалов Q,T. +$$T \to QbA \mid BR \qquad Q \to BcD\mid TR$$ +Эти нетерминалы действуют также как и A и B, только подвыводы леворекурсивные. Чтобы увидеть наглядно, подставим в первое правило раскрытия T правила раскрытия Q. +$$T \to BcDbA \mid TRbA \mid BR$$ +И поэтому очевиден переход к регулярному +$$T = (BcDbA\mid BR) (RbA)^*$$ +И произведем аналогичную замену для Q +$$Q = BcD \mid (BcDbA\mid BR) (RbA)^*R$$ +И теперь рассмотрим нетерминал S. Он иерархически не саморекурсивен, и раскрывается в "регулярные" нетерминалы, поэтому S порождает регулярный язык. +$$S \to TaQ \mid RT$$ +%%Уже пытаюсь третий раз расписать регулярку, но короткой она не выйдет. Только если не использовать группы захвата какие-нибудь%% # 3. Язык $\{wz^Rvz \mid w,v,z \in \{a,b\}^* \space \& \space |w|>1 \space \& \space |z|>1 \space \&\space (v=w^R \vee v \in (ab^*)^+)\}$ Очевидно, что язык не является VPL, так как нельзя предъявить разбиение алфавита на вызывающие и возвращающие символы. +И точно можно получить, что язык не регулярный, ~~так как $ab a^2b^{n} a b^n a^2$ нельзя накачать в регулярном смысле.~~ + Необходимо проверить, является ли язык КС. Для этого воспользуемся леммой о накачке для КС языков. -Перед непосредственным использованием леммы заметим, что $(ab^*)^+ = ab^*(ab^*)^* = ab^* (a|b)^* = a(a|b)^*$ +Перед непосредственным использованием леммы заметим, что $(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$ То есть, одно из условий переписывается как $v = w^R \vee v \in a (a|b)^*$ - +Очевидно, что если язык не КС, то нам нужно рассмотреть случай, когда при накачках будет справедливо только первое условие, то есть $v = w^R$. ==Пусть p - длинна накачки, рассмотрим слово $w = \underbrace{(ab)^p}_{p_1} \underbrace{a^{2p}}_{p_2} \underbrace{(ba)^p}_{p_3}\underbrace{a^{2p}}_{p_4}$== 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 4.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 4.md" index c60502c..5e71db8 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 4.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 4.md" @@ -10,20 +10,40 @@ $$\begin{aligned} &L = (\text{} V)^* \text{} (V\text{})^*\\ &\text{} = \text{} (\& \text{})^* \\ -&\text{} = ¬^* (T|F) \Rightarrow\\ +&\text{} = ¬^* (T|F \\ &\text{} = ¬^* (T|F) (\& ¬^* (T|F)) \\ &\text{} = \text{} (\& \text{})^*\\ -&\text{} = T | (¬¬)^+ F \Rightarrow \\ +&\text{} = T | (¬¬)^+ F \\ &\\ &L = (¬^* (T|F) (\& ¬^* (T|F))\space V)^* (T | (¬¬)^+ F) (\& (T | (¬¬)^+ F))^* (V \space ¬^* (T|F) (\& ¬^* (T|F)))^* \end{aligned}$$ -### 2. Язык $\{w | |w|_{ab} = |w|_{baa} \& |w|_{abb} \neq |w|_{bba} \& w \in \{a, b\}^+\}$. +### 2. Язык $\{w \mid |w|_{ab} = |w|_{baa} \space\&\space |w|_{abb} \neq |w|_{bba} \space \&\space w \in \{a, b\}^+\}$. +Распишем отдельно языки $L_1$ и $L_2$, которые удовлетворяют первому и второму правилу соответсвенно. +Язык $L_1 = \{w \mid |w|_{ab} = |w|_{baa}\}$ +Внутри этого языка лежат все слова состоящие только из $a$ или только из $b$. +Также внутри лежит $ba$. +Если нам встретилась $ab$, тогда после должна идти baa, причем она может как включать b из ab, так и нет, то есть $a^*abb^*aa$ будет лежать в языке. Более того, итерация произвольного числа раз этого слова будет лежать в языке +$$(a^*abb^*aa)^* \subset L_1$$ +Если у нас встретилась сначала $baa$, то после должно идти $ab$. То есть мы получим слова +$$(b^*baaa^*b)^* \subset L_1$$ +Теперь получим общее выражение для языке $L_1$. +$$L_1 = a^*(abb^*aaa^*)^* \mid b^* (baaa^*bb^*)^*$$ +Как видно, в этой формуле были перемещены a с начала в конец, что сделано только для сокращения выражения. + +Теперь рассмотрим язык $L_2 = \{w \mid |w|_{abb} \neq |w|_{bba}\}$ + +Дополнение к нему можно легко построить, и оно будет регулярным. +==ПОСТРОИТЬ ДОПОЛНЕНИЕ К ЯЗЫКУ== + +Значит $L_2$ - регулярный. Поэтому и $L = L_1 \cap L_2$ также будет регулярным языком. +Теперь нужно построить регулярное выражение для этого языка. +==ПОСТРОИТЬ РЕГУЛЯРКУ ДЛЯ ЯЗЫКА== + -#пустой ### 3. Язык всех не завершающихся систем переписывания строк из одного правила. Алфавит: ${f,g, \to}$. -Для длинны накачки n рассмотрим $w = f^ng^n -> f^ng^n$. +Для длинны накачки n рассмотрим $w = f^ng^n \to f^ng^n$. В общем случае не завершается, так как либо нельзя применить правило, либо можно применять сколько угодно раз. При накачке левой части отдельно от правой, система становится завершающейся При отрицательной накачке правой части, также завершается, так как число нетерминалов уменьшается. 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 6.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 6.md" index 3d551dd..3fa4684 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 6.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 6.md" @@ -41,12 +41,13 @@ digraph{ Грамматика ``` S -> aSaaaa | bSaa | T -T -> AB +T -> BA A -> aA | ε B -> bB | ε ``` -Так допустимо, так как образы гомоморфизма комутативны, то есть можно спокойно перемещать так как необходимо. Поэтому структуру последовательных слов преобразуем в комутативную ей скобочную структуру +Так допустимо, так как образы гомоморфизма комутативны, то есть можно спокойно перемещать так как необходимо и нужно учитывать только количество. Поэтому структуру последовательных слов преобразуем в комутативную ей скобочную структуру. +$$S \to aS\underbrace{aa}_{h(a)}\underbrace{aa}_{h(a)} \mid bS\underbrace{a}_{h(b)}\underbrace{a}_{h(b)} \mid T$$ -### 3. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. -#пустой \ No newline at end of file +### 3. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. +#пустой %%нет, я до сих пор в теме с языками деревьев теряюсь.%% From 3ba5e9c67dc123cd758be6bf4a4fd5fc15236bd0 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Thu, 22 May 2025 12:17:57 +0300 Subject: [PATCH 09/19] var 2 fixes + task 3 --- ...\200\320\270\320\260\320\275\321\202 2.md" | 140 +++++++++++++++--- 1 file changed, 123 insertions(+), 17 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 2.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 2.md" index 100b7ae..876de01 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 2.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 2.md" @@ -39,23 +39,23 @@ $$ba^*bb(?= \cancel{(aa)^*}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ --- Пусть вторая итерация в образце раскроется n раз, тогда -$$(?= \underbrace{bba^* bba^* ... bba^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ +$$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ 1)Тогда итерацию самого слова мы должны раскрывать по второй альтернативе. -$$(?= \underbrace{bba^* bba^* ... bba^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)b \color{red}{a^*} \color{black}bb(aba \mid ba^*bb)^*$$ +$$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)b \textcolor{red}{a^*} bb(aba \mid ba^*bb)^*$$ 2)Очевидно, что по $a^*$ слова(отмечено красным) мы не можем итерироваться. Поэтому получаем -$$(?= \underbrace{bba^* bba^* ... bba^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ +$$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ 3)Теперь по первой итерации в образце не можем итерироваться, тогда -$$(?= bb\underbrace{bba^* ... bba^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ +$$(?= bb\underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ 4)Выносим за пределы образца bb и там и там -$$bb(?= \underbrace{bba^* ... bba^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ +$$bb(?= \underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ 5)Теперь при раскрытии по второму правилу мы получим -$$bb(?= \underbrace{\color{red}bba^*\color{black}bba^* ... bba^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)\color{red}bba^*\color{black}bb(aba \mid ba^*bb)^*$$ +$$bb(?= \underbrace{\textcolor{red}{bb(aa)^*}bb(aa)^* ... bb(aa)^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)\textcolor{red}{bba^*}bb(aba \mid ba^*bb)^*$$ 6)Красную часть, совпадающую и там и там, можем вынести. -$$bbbba^*(?= \underbrace{bba^* ... bba^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)bb(aba \mid ba^*bb)^*$$ +$$bbbb(aa)^*(?= \underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)bb(aba \mid ba^*bb)^*$$ 7)По первому правилу мы все еще не можем раскрыться, поэтому раскрываемся по второму -$$bbbba^*(?= \underbrace{\color{red}bba^*bba^*\color{black}bba^* ... bba^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)\color{red}bbba^*b\color{black}b(aba \mid ba^*bb)^*$$ +$$bbbb(aa)^*(?= \underbrace{\textcolor{red}{bb(aa)^*bb(aa)^*}bb(aa)^* ... bb(aa)^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)\textcolor{red}{bbba^*b}b(aba \mid ba^*bb)^*$$ 8)Если не раскрывать итерации, то получится вынести еще блок из b. -$$bbbba^*bbbb(?= \underbrace{bba^* ... bba^*}_{\text{n-4 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ +$$bbbb(aa)^*bbbb(?= \underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-4 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ И мы снова вернулись к шагу 4, с разросшимся префиксом. Из этого можно понять, что итерация $(bb(aa)^*)^*$ может раскрыться или 0 раз, или если больше, то мы получаем 1 или 2 b между lookahead и итерацией самого слова. $$\begin{cases} (?= a^*aba)(aba \mid ba^*bb)^* &n=0 \\ @@ -131,17 +131,123 @@ $$Q = BcD \mid (BcDbA\mid BR) (RbA)^*R$$ $$S \to TaQ \mid RT$$ %%Уже пытаюсь третий раз расписать регулярку, но короткой она не выйдет. Только если не использовать группы захвата какие-нибудь%% # 3. Язык $\{wz^Rvz \mid w,v,z \in \{a,b\}^* \space \& \space |w|>1 \space \& \space |z|>1 \space \&\space (v=w^R \vee v \in (ab^*)^+)\}$ +Перед анализом языка заметим, что регулярное условие в нем можно упростить: +$$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ +Таким образом $v$ - это либо обращение $w$, либо любое слово начинающееся с $a$. + Очевидно, что язык не является VPL, так как нельзя предъявить разбиение алфавита на вызывающие и возвращающие символы. -И точно можно получить, что язык не регулярный, ~~так как $ab a^2b^{n} a b^n a^2$ нельзя накачать в регулярном смысле.~~ +И точно можно получить, что язык не регулярный, так как $ab a^2b^{n} a b^n a^2$ нельзя накачать в регулярном смысле. + +> [!tip] Док-во, что язык не регулярный, с помощью леммы о накачке. +> Пусть язык регулярный. тогда пересечем его с регулярным языков $aba^2b^*ab^*a^2$, и получим новый регулярный язык. Так как новый также регулярный, значит он накачивается и предположим длинна накачки n. Рассмотрим слово $\omega = ab a^2\underbrace{b^{n}}_{p} a b^n a^2$. По условию леммы о накачке для регулярных языков, мы должны выбрать подслово не далее чем на n символов от начала слова, которое можно накачать. Из-за ограничения регуляркой, это подслово находится только в $p$. +> Рассмотрим почему, если мы попытаемся накачать подслово из $p$, то выйдем из языка. Для данного слова допустимо следующее разбиение на подслова из определения: +> $$w = ab, \quad z = a^2b^n, \quad v = a$$ +> Почему не допустимо другое разбиение? Суффикс z однозначно определяет, что он состоит как минимум из двух букв $a$, тем самым он заякоривает две буквы $a$ в середине слова. Тем самым на подслово $w$ остаются только первые 2 буквы слова. +> $$\underbrace{ab}_w \underbrace{a^2}_{z^R} b^nab^n \underbrace{a^2}_{z}$$ +> Из ограничения на $v$ следует, что так мы не можем разбить слово, так как $v$ в таком случае не начинается на $a$ и не является обращением $w$. Единственное изменение в разбиении, которое мы можем внести, - это расширять $z$. И таким образом мы получим предъявленное нами в начале разбиение слова. +> Теперь вернемся к накачке. Пусть мы можем накачать подслово $b^i$ из $p$, где $i < n-4$. Рассмотрим положительную накачку. Тогда накачанное слово будет иметь вид +> $$aba^2b^nb^{ik}ab^na^2$$ +> Произведем попытку разбить слово на подслова. Первые наши шаги будут аналогичны и при последовательном расширении $z$ мы получим следующее разбиение: +> $$\underbrace{ab}_w\underbrace{a^2b^n}_{a^R}b^{ik}a\underbrace{b^na^2}_{z}$$ +> очевидно, что оставшуюся часть слова мы не можем отнести в $v$, так как оно не удовлетворяет регулярному ограничению и не является оборотом $w$(оно может являться оборотом только при $ik = 1$, а так как $k$ - произвольное, то это условие не выполняется ни для какого $i$) и в то же время мы уже не можем продолжить наращивать $z$. Поэтому мы не можем разбить это слово, и следовательно оно не принадлежит языку. Поэтому делаем вывод, что это слово нельзя накачать, и язык, полученный после пересечения с регулярным, не является регулярным. А из этого следует, что и исходный язык тоже не регулярный, так как класс регулярных языков замкнут по операции пересечения. + Необходимо проверить, является ли язык КС. Для этого воспользуемся леммой о накачке для КС языков. -Перед непосредственным использованием леммы заметим, что $(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$ -То есть, одно из условий переписывается как $v = w^R \vee v \in a (a|b)^*$ -Очевидно, что если язык не КС, то нам нужно рассмотреть случай, когда при накачках будет справедливо только первое условие, то есть $v = w^R$. +Очевидно, что если язык не КС, то нам нужно рассмотреть случай, когда при накачках будет справедливо только первое условие, то есть $v = w^R$. Для построения контрпримера проанализируем слово из рассуждения о нерегулярности языка. +В слове $ab a^2 b^{n} a b^n a^2$ двойная $a$ заякоривала начало подслова $z^R$, что мы можем использовать в построении контрпримера. Также используем явление, что при увеличении количества $b$ мы их не можем переместить в подслово $z^R$. +Чтобы из контрпримера для регулярности построить контрпример для контекстной свободы увеличим число $b$ в подслове $w$. +Хорошо подойдет слово $\omega = \underbrace{ab^n}_w \underbrace{a^2 b^n}_{z^R} \underbrace{b^n a}_v \underbrace{b^n a^2}_{z}$ +Рассуждение почему не допустимы другие разбиения будет почти полностью повторять рассуждение из док-ва нерегулярности языка, поэтому мы его опустим. Кроме того, для ограничения количество накачек нам необходимо ограничить регулярную структуру языка. + + +>[!fail] Наивное неверное доказательство не контекстной свободы +> Пусть язык КС, тогда при пересечении его с регулярным языком $ab^*a^2b^* a b^* a^2$ мы также получим КС язык. Поэтому для полученного языка должна быть справедлива лемма о накачке для КС языков. +> Пусть длинна накачки $n$. Тогда рассмотрим слово $\omega = a\underbrace{b^n}_{p_1} a^2 \underbrace{b^{2n}}_{p_2} a \underbrace{b^n}_{p_3} a^2$ +> Подслово $p_1$ нельзя положительно накачать, так как тогда нам не хватит букв $b$ внутри $v$ чтобы сохранить ограничение $v = w^R$. +> Подслово $p_3$ нельзя положительно накачать, так как тогда не хватит букв b, чтобы произвести соответствие $z^R$. +> И точно также нельзя накачать подслово $p_2$, иначе получим дисбаланс. +> Теперь нужно подумать, что делать с перекрестными симметричными накачками, так как такой контрпример они рушат. +> Почему контрпример не подходит для такой ситуации? +> Из-за того, что участки $b$ внутри $p_2$ представляются одной и той же буквой их можно комутативно переставить и мы получим структуру +> $$a b^n a^2 b^n b^k a b^k a^2$$ +> Из-за чего язык окажется более чем КС. А нам нужно, чтобы после пересечения с регуляркой он оказался контекстно зависимым. Поэтому такой контрпример не работает. + +Проблема такого контрпримера также в том, что этот язык ближе к $\{b^n a b^{n+k} a b^k\}$, который является КС, чем к языку $\{wzw^Rz^R\}$, который КС уже не является. Поэтому контрпример необходимо доработать. +Чтобы не допустить перекрестные накачки заменим $w' = ab^nab$. Такие замены будут пояснены ниже в корректном рассуждении. Таким образом контрпримером к лемме о накачке выступит слово $$\underbrace{ab^nab}_w\underbrace{a^2b^n}_{z^R} \underbrace{bab^na}_v \underbrace{b^n a^2}_z$$ +>[!check] Док-во не контекстной свободы языка с помощью Леммы о накачке. +> Пусть язык КС, тогда при пересечении его с регулярным языком $ab^*aba^2b^*bab^*ab^*a^2$ мы также получим КС язык. Поэтому для полученного языка должна быть справедлива лемма о накачке для КС языков. +> Пусть длинна накачки $n$. Тогда рассмотрим слово +> $$\omega = \underbrace{ab^nab}_w\underbrace{a^2b^n}_{z^R} \underbrace{bab^na}_v \underbrace{b^n a^2}_z$$ +> Почему допустимо только такое разбиение слова на подслова? +> Сначала в конце $a^2$ делает заякоривание в $a^2$. Тогда все что до $a^2$ отходит в $w$. После чего мы получаем следующую структуру разбиения +> $$\omega = \underbrace{ab^nab}_w\underbrace{a^2}_{z^R}b^nbab^na b^n \underbrace{a^2}_z$$ +> После чего мы пытаемся соотнести оставшееся в v. Это у нас не получается, так как это выражение не начинается с $a$ и не является обращением $w$. Поэтому мы расширяем $z$ на букву $b$, до того как не получится соотнести. Последовательно расширяем $v$ на $b^n$. Получаем следующее разбиение. +> $$\omega = \underbrace{ab^nab}_w\underbrace{a^2b^n}_{z^R}bab^na\underbrace{b^na^2}_z$$ +> Получившийся остаток слова мы можем обработать только как обращение $w$. У нас получилось разбить все слово на подслова, поэтому оно принадлежит языку. +> Теперь рассмотрим накачки. Чтобы не нарушить регулярную структуру мы можем накачивать только следующие области: +> $$a\underbrace{b^n}_{p_1} a b a^2 \underbrace{b^{n}}_{p_2} ba \underbrace{b^n}_{p_3} a \underbrace{b^n}_{p_4} a^2$$ +> Теперь нужно перебрать накачки каждой области и накачки всех пересечений областей. +> Если мы накачиваем положительно отдельно $p_1$, то мы не сможем в второй части слова найти соответсвующее обращение слова. +> Если мы накачиваем отдельно $p_3$, то не получится найти соответствующее количество символов в начале слова. +> Если мы накачиваем $p_4$, то мы не сможем найти достаточного количества символов в обращении, и аналогично происходит с $p_2$. +> Теперь рассмотрим перекрестные накачки. +> Накачка $p_1p_2$ аналогично накачкам отдельно $p_1$ и $p_2$, так как мы при накачке не сможем найти необходимое количество символов в второй части слова. +> Накачка $p_2,p_3$ дает нам разбалансировку по количествам с $p_1,p_4$. +> И аналогично для $p_3,p_4$. Таким образом мы показали, что данное слово нельзя накачать в КС смысле. Поэтому язык не КС. + + +Таким образом мы показали, что язык не КС. +Рассмотрим теперь как мы могли с нуля построить контрпример и проанализируем какие контрпримеры еще возможны. +Для начала нужно проанализировать какой вид может иметь $z$, так как оно может давать заякоривания. +По условию $z$ имеет как минимум 2 символа. То есть мы получаем 4 возможных комбинаций. +Теперь рассмотрим случаи, которые идут после этого заякоривания. +Если там идет $b$, то мы не сможем его поглотить с помощью $v$. А если после нам попадется $a$ то мы посчитаем, что это начало $v$ и сможем прочитать, что угодно после прочитанной a. + +Таким образом, самое экономное представление подслова z будет иметь следующий вид $b^n (a|b)^2$, а слово будет принимать вид +$$w \underbrace{(a|b)^2 b^n}_{z^R} v \underbrace{b^n (a|b)^2}_z$$ +Теперь необходимо посмотреть на то, как выбор заякоривания влияет на остальные подслова. +Пусть заякоривание $ab$. +Тогда вероятнее всего, что минимальное подслово $w$ будет иметь вид $b^*a^*$, так как он убирает возможность нахождения $ab$. Аналогично получаем регулярные структуры для остальных заякориваний. +$$\begin{cases} +z=aa \implies w= b^*(ab+)^*?a\\ +z= ba \implies w= b^*a^*\\ +z= ab \implies w= a^* b^*\\ +z= bb \implies w= a^*(ba+)^*?b +\end{cases}$$ +Кроме этих случаев, конечно, возможны и случаи включающие заякоривания, но их мы опустим, так как для построения контрпримера оптимальнее рассматривать простые минимальные случаи, чтобы продемонстрировать не КС свойства. + +Как было отмечено выше, если после подслова $z^R$ мы встречаем букву $a$, то подслово v мы можем распарсить без контекстно-зависимых ограничений с w, что для построение контрпримера нам не подойдет. + +Поэтому для построения контпримера к накачке наилучшим образом подходят заякоривания $aa,ab$. Заякоривание $ba$, при обращении $w$ не даст нам контекстно зависимых ограничений. У заякоривания $bb$ проблема другая - так как $z^R = b^2 b^n$ то мы получаем очень большое количество кандидатов для заякоривания, тем самым мы сильно усложним доказательство, поэтому такой вариант рассматривать крайне не рекомендуется. + +Теперь рассмотрим каждый случай заякоривания. +Для заякоривания $aa$, имеем +$$b^*(ab^+)^* ?a a^2 b^n \underbrace{...}_v b^n a$$ +Очевидно, что мы не можем ставить $?a$ в слово, так как тогда мы не получим контекстных зависимостей на $v$. +Теперь нам нужно рассмотреть разные структуры подслова w, с условием, чтобы не допустить возможность перекрестной накачки. +Рассмотрим 0 итераций $ab^+$, тогда имеем слово +$$b^k a^2 b^n b^k b^n a$$ +Очевидно, что оно нам не дает контекстной зависимости. + +Поэтому $ab^+$ должно иметь как минимум 1 итерацию. При желании можно показать, что случаи при количестве итераций больших 1 можно свести к случаю одной итерации. + +Тогда получаем слово +$$b^{k_1} ab^{k_2} a^2 b^n b^{k_2} a b^{k_1} b^{n} a^2$$ +Если мы возьмем $k_2$ фиксированным, например $k_2 = 1$, тогда получим слово +$$b^{k_1} ab a^2 b^n b a b^{k_1} b^{n} a^2$$ +Которое имеет структуру схожей с структуро +$$a^{n} b a^{k} b a^n b a^{k}$$ +А это нам уже дает контестную зависимость, что и требовалось найти. + +Кроме этого можно было занулить $k_1$ и сделать несколько итераций $ab^+$ получив случай, который мы рассматривали в доказательстве контексной-зависимости. -==Пусть p - длинна накачки, рассмотрим слово $w = \underbrace{(ab)^p}_{p_1} \underbrace{a^{2p}}_{p_2} \underbrace{(ba)^p}_{p_3}\underbrace{a^{2p}}_{p_4}$== -==Рассмотрим, почему допустимо только такое разбиение. Пусть z захватывает $p_3p_4$ полностью или частично.== +Теперь рассмотрим заякоривание $ab$. +$$ a^* b^* ba b^n \underbrace{...}_v b^n ab$$ +Для данного случая намного проще построить возможное слово +$$a^{k_1} b^{k_2} ba b^n b^{k_2} a^{k_1} b^n ab$$ +Для данного слова, чтобы получить контекстную зависимость, мы должны потребовать, что $k_2=const$, иначе мы получим комутативную накачку $b^{k_2}$ и $b^n b^{k_2}$. +Но если мы возьмум такой случай, то тогда мы опять получим отсутсвие контекстных зависимостей на $v$, так как мы сможем взять второе вхождение подслова $ba$ внутри $b^na^k$ как заякоривание. +$$a^{k} ba b^n a^{k} b^n ab$$ -==При накачке только $p_i$ ломается соотношение между словами== -==При накачке перемычек также ломается соотношений палиндромов. Соответсвенно накачать слово нельзя => язык не КС== \ No newline at end of file +Тем самым мы получили, что для доказательства контексной зависимости языка подходит только 2 контрпримера с одинаковой структурой $w z w^R z^R$. \ No newline at end of file From 2267e213edbbb427cf69ad3ac58e9d3edd2edf44 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 24 Jun 2025 22:21:18 +0300 Subject: [PATCH 10/19] minor fixes --- ...0\260\321\200\320\270\320\260\320\275\321\202 2.md" | 10 +++++----- ...0\260\321\200\320\270\320\260\320\275\321\202 4.md" | 7 +++---- ...0\260\321\200\320\270\320\260\320\275\321\202 6.md" | 9 ++++++++- 3 files changed, 16 insertions(+), 10 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 2.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 2.md" index 876de01..b340dc0 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 2.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 2.md" @@ -139,7 +139,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ И точно можно получить, что язык не регулярный, так как $ab a^2b^{n} a b^n a^2$ нельзя накачать в регулярном смысле. > [!tip] Док-во, что язык не регулярный, с помощью леммы о накачке. -> Пусть язык регулярный. тогда пересечем его с регулярным языков $aba^2b^*ab^*a^2$, и получим новый регулярный язык. Так как новый также регулярный, значит он накачивается и предположим длинна накачки n. Рассмотрим слово $\omega = ab a^2\underbrace{b^{n}}_{p} a b^n a^2$. По условию леммы о накачке для регулярных языков, мы должны выбрать подслово не далее чем на n символов от начала слова, которое можно накачать. Из-за ограничения регуляркой, это подслово находится только в $p$. +> Пусть язык регулярный. тогда пересечем его с регулярным языков $aba^2b^*ab^*a^2$, и получим новый регулярный язык. Так как новый также регулярный, значит он накачивается и предположим длина накачки n. Рассмотрим слово $\omega = ab a^2\underbrace{b^{n}}_{p} a b^n a^2$. По условию леммы о накачке для регулярных языков, мы должны выбрать подслово не далее чем на n символов от начала слова, которое можно накачать. Из-за ограничения регуляркой, это подслово находится только в $p$. > Рассмотрим почему, если мы попытаемся накачать подслово из $p$, то выйдем из языка. Для данного слова допустимо следующее разбиение на подслова из определения: > $$w = ab, \quad z = a^2b^n, \quad v = a$$ > Почему не допустимо другое разбиение? Суффикс z однозначно определяет, что он состоит как минимум из двух букв $a$, тем самым он заякоривает две буквы $a$ в середине слова. Тем самым на подслово $w$ остаются только первые 2 буквы слова. @@ -171,7 +171,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ > Почему контрпример не подходит для такой ситуации? > Из-за того, что участки $b$ внутри $p_2$ представляются одной и той же буквой их можно комутативно переставить и мы получим структуру > $$a b^n a^2 b^n b^k a b^k a^2$$ -> Из-за чего язык окажется более чем КС. А нам нужно, чтобы после пересечения с регуляркой он оказался контекстно зависимым. Поэтому такой контрпример не работает. +> Эту структуру можно будет контекстно-свободно накачать. А нам нужно, чтобы после пересечения с регуляркой он оказался контекстно зависимым. Поэтому такой контрпример не работает. Проблема такого контрпримера также в том, что этот язык ближе к $\{b^n a b^{n+k} a b^k\}$, который является КС, чем к языку $\{wzw^Rz^R\}$, который КС уже не является. Поэтому контрпример необходимо доработать. Чтобы не допустить перекрестные накачки заменим $w' = ab^nab$. Такие замены будут пояснены ниже в корректном рассуждении. Таким образом контрпримером к лемме о накачке выступит слово $$\underbrace{ab^nab}_w\underbrace{a^2b^n}_{z^R} \underbrace{bab^na}_v \underbrace{b^n a^2}_z$$ @@ -233,12 +233,12 @@ $$b^k a^2 b^n b^k b^n a$$ Поэтому $ab^+$ должно иметь как минимум 1 итерацию. При желании можно показать, что случаи при количестве итераций больших 1 можно свести к случаю одной итерации. Тогда получаем слово -$$b^{k_1} ab^{k_2} a^2 b^n b^{k_2} a b^{k_1} b^{n} a^2$$ +$$\underbrace{b^{k_1} ab^{k_2}}_{w} \underbrace{a^2}_z b^n b^{k_2} a b^{k_1} b^{n} \underbrace{a^2}_{z^R}$$ Если мы возьмем $k_2$ фиксированным, например $k_2 = 1$, тогда получим слово $$b^{k_1} ab a^2 b^n b a b^{k_1} b^{n} a^2$$ -Которое имеет структуру схожей с структуро +Которое имеет структуру схожей с структурой $$a^{n} b a^{k} b a^n b a^{k}$$ -А это нам уже дает контестную зависимость, что и требовалось найти. +А это нам уже дает контекстную зависимость, что и требовалось найти. Кроме этого можно было занулить $k_1$ и сделать несколько итераций $ab^+$ получив случай, который мы рассматривали в доказательстве контексной-зависимости. 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 4.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 4.md" index 5e71db8..b20ceec 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 4.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 4.md" @@ -13,11 +13,10 @@ $$\begin{aligned} &\text{} = ¬^* (T|F \\ &\text{} = ¬^* (T|F) (\& ¬^* (T|F)) \\ &\text{} = \text{} (\& \text{})^*\\ -&\text{} = T | (¬¬)^+ F \\ -&\\ -&L = (¬^* (T|F) (\& ¬^* (T|F))\space V)^* -(T | (¬¬)^+ F) (\& (T | (¬¬)^+ F))^* (V \space ¬^* (T|F) (\& ¬^* (T|F)))^* +&\text{} = T | (¬¬)^+ F \end{aligned}$$ +$$L = (¬^* (T|F) (\& ¬^* (T|F))\space V)^* +(T | (¬¬)^+ F) (\& (T | (¬¬)^+ F))^* (V \space ¬^* (T|F) (\& ¬^* (T|F)))^*$$ ### 2. Язык $\{w \mid |w|_{ab} = |w|_{baa} \space\&\space |w|_{abb} \neq |w|_{bba} \space \&\space w \in \{a, b\}^+\}$. Распишем отдельно языки $L_1$ и $L_2$, которые удовлетворяют первому и второму правилу соответсвенно. Язык $L_1 = \{w \mid |w|_{ab} = |w|_{baa}\}$ 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 6.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 6.md" index 3fa4684..bb36063 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 6.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 6.md" @@ -50,4 +50,11 @@ $$S \to aS\underbrace{aa}_{h(a)}\underbrace{aa}_{h(a)} \mid bS\underbrace{a}_{h( ### 3. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. -#пустой %%нет, я до сих пор в теме с языками деревьев теряюсь.%% +#пустой +В-первых, определим как задается язык деревьев арифметических выражений, вычисляющих простое число $p$. +В листьях может быть одноразрядные числа $0,1,2,3,4,5,6,7,8,9$. +В ветвях может быть только $+(T1, T2)$ и $*(T1, T2)$. + + +Что мы знаем про вычисления простых чисел? +- Простое число не может иметь делителей $\implies$ в корне дерева не может быть операции умножения \ No newline at end of file From cc02f277a5931d69ac0b14f1e73fd6a53d0ccfd0 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Fri, 4 Jul 2025 19:04:12 +0300 Subject: [PATCH 11/19] var 6: task 3 --- ...\200\320\270\320\260\320\275\321\202 6.md" | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 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 6.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 6.md" index bb36063..1a7b5d7 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 6.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 6.md" @@ -50,11 +50,33 @@ $$S \to aS\underbrace{aa}_{h(a)}\underbrace{aa}_{h(a)} \mid bS\underbrace{a}_{h( ### 3. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. -#пустой В-первых, определим как задается язык деревьев арифметических выражений, вычисляющих простое число $p$. В листьях может быть одноразрядные числа $0,1,2,3,4,5,6,7,8,9$. В ветвях может быть только $+(T1, T2)$ и $*(T1, T2)$. +Очевидно, что на поддеревьях естественно возникает отношение эквивалентности по равенству значений, которые они вычисляют. Это соответствует определению эквивалентности, так как мы можем поменять любые поддеревья, вычисляющие одинаковое число местами и общий результат арифметического выражения не изменится. Более того, такое отношение эквивалентности возникает для любых вычисляющих деревьев: будь то деревья булевой алгебры или другие. -Что мы знаем про вычисления простых чисел? -- Простое число не может иметь делителей $\implies$ в корне дерева не может быть операции умножения \ No newline at end of file +В соответствии с этим, мы получаем счетное число классов эквивалентности, поэтому по теореме Майхилла-Нероуда этот язык **не будет древесно-автоматным.** + +Почему нельзя задать другое отношение эквивалентности? Полученное нами отношение эквивалентности естественно возникает из того, что деревья являются вычисляющими. Так рассмотрим операции, и проверим, когда они будут равны. +$$+(X,Y) = +(Z, Y) \Leftrightarrow X = Z$$ +$$*(X,Y) = *(Z,Y) \Leftrightarrow X = Z$$ + +>[!note] Излишнее рассуждение о том, что мы не можем ввести другое отношение эквивалентности на вычисляющих деревьях +>Пусть мы задали какое-то другое отношение эквивалентности, отличное от построенного ранее. Обозначим как $\operatorname{eqv}$, тогда существуют такие X,Y, что +>$$\begin{matrix} +X \neq Y \text{ и } X \operatorname{eqv} Y\space (1)\\ +\text{ или }\\ +X = Y \text{ и не } X \operatorname{eqv} Y \space (2) +\end{matrix}$$ +> Случай 2 не может быть, так как если $X = Y$, то тогда нарушается определение эквивалентности, что $X \operatorname{eqv} X$. и мы получаем противоречие. +> Случай 1 означает, что общее число классов эквивалентности уменьшается, поэтому мы не можем просто отбросить этот случай. Из определения эквивалентности имеем +> $$X \operatorname{eqv} Y \Leftrightarrow +(X, Z) = +(Y,Z)$$ +> А это вновь нас сводит к тому, что построенное нами отношение эквивалентности соответствует отношению равенства. Поэтому даже если мы очень захотим построить другое отношение эквивалентности на вычисляющих деревьях в полугруппах, то у нас это не получится =(. +> Почему важно требование, что мы работаем в группе? Потому что наше рассуждение целиком опирается на факт, что $+(X,Y) = +(Z, Y) \Leftrightarrow X = Z$. Слева направо факт следует в всех случаях, но обратно следует не всегда. Докажем его. +> $$f(x,z) = f(y,z) \text{, но } x \neq y$$ +> $$f(f(x,z),a) = f(f(y,z), a)$$ +> ассоциативность +> $$f(x, f(z,a)) = f(y, f(z,a))$$ +> $$f(x,b) = f(y,b)$$ +> Причем, мы так можем сделать для любого a, таким образом мы получаем, что все множество значений разбивается на 2 класса эквивалентности(так как $x\neq y$): для которых $f(x,z) = f(y,z)$ и для которых не выполнено это равенство. Но если это равенство не выполнено, то не выполнено определение эквивалентных поддеревьев. Соответственно для любых элементов выполено равенство, из чего следует равенство x,y. Так как мы воспользовались только свойством ассоциативности бинарной операции, то это свойство будет выполняться для любых вычисляющих деревьев в полугруппах. From 5bdefc0637bbbd64c4bf6ff08d11d9c934f58a93 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Tue, 22 Jul 2025 10:23:11 +0300 Subject: [PATCH 12/19] =?UTF-8?q?task=204.2:=20Myhill=E2=80=93Nerode=20the?= =?UTF-8?q?orem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\320\270\320\260\320\275\321\202 4.md" | 57 +++++++++++++++++-- 1 file changed, 51 insertions(+), 6 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 4.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 4.md" index b20ceec..f1311a7 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 4.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 4.md" @@ -10,7 +10,8 @@ $$\begin{aligned} &L = (\text{} V)^* \text{} (V\text{})^*\\ &\text{} = \text{} (\& \text{})^* \\ -&\text{} = ¬^* (T|F \\ +&\text{} = ¬^* (T|F) \\ +\implies\\ &\text{} = ¬^* (T|F) (\& ¬^* (T|F)) \\ &\text{} = \text{} (\& \text{})^*\\ &\text{} = T | (¬¬)^+ F @@ -28,17 +29,62 @@ $$(a^*abb^*aa)^* \subset L_1$$ $$(b^*baaa^*b)^* \subset L_1$$ Теперь получим общее выражение для языке $L_1$. $$L_1 = a^*(abb^*aaa^*)^* \mid b^* (baaa^*bb^*)^*$$ -Как видно, в этой формуле были перемещены a с начала в конец, что сделано только для сокращения выражения. +Как видно, в этой формуле были перемещены a с начала в конец, что сделано только для сокращения выражения. Тем самым, мы показали, что язык $L_1$ - регулярный. Теперь рассмотрим язык $L_2 = \{w \mid |w|_{abb} \neq |w|_{bba}\}$ Дополнение к нему можно легко построить, и оно будет регулярным. -==ПОСТРОИТЬ ДОПОЛНЕНИЕ К ЯЗЫКУ== +$$\overline{L_2} = \left\{\omega \mid |\omega|_{abb} = |\omega|_{bba}\right\}$$ +Здесь подойдет последовательный анализ. В-первых, в языке лежат все слова состоящие либо только из букв $a$, либо только из букв $b$, так как они будут соответсвовать нулевому количеству искомых подслов. Также подходят слова, в которых нет двух подряд идущих букв $b$. +Пусть в слове первое входит подслово $abb$, тогда после него может быть либо $b$ либо $a$, либо конец строки. Так как мы требуем одинаковое количество вхождений $abb$ и $bba$, то после подслова $abb$ мы требуем, что может идти сколько угодно букв b и обязательно буква a, что соответсвует регулярному выражению $\rho abb b^* a$ +после буквы a мы также можем ожидать какие-угодно символы, до первого вхождения $abb$. И кроме этого возможен перекрестный случай, который мы также должны учесть в регулярном выражении. +$$\underbrace{a\textcolor{red}{bb}}\underbrace{\textcolor{red}{a}bb}$$ +Таким образом получаем +$$\rho a bbb^*a ((\rho a \mid \varepsilon)bbb^*a)^*$$ +где $\rho \in (a \mid ba)^* (b \mid \varepsilon)$ - слова, в которых нет двух подряд идущих b. +Теперь рассмотрим, что первое в слово входит подслово $bba$. -Значит $L_2$ - регулярный. Поэтому и $L = L_1 \cap L_2$ также будет регулярным языком. +==случай 2== + +Таким образом мы нашли регулярное задание языка $\overline{L_2}$, из чего следует что и $L_2$ - также регулярный язык. Поэтому и $L = L_1 \cap L_2$ также будет регулярным языком. Теперь нужно построить регулярное выражение для этого языка. -==ПОСТРОИТЬ РЕГУЛЯРКУ ДЛЯ ЯЗЫКА== +Попробуем рассмотреть классы эквивалентности по Майхиллу-Нероде для регулярного языка $L$. + +Очевидно, из анализа языков $L_1$ и $L_2$, что для всевозможных слов, максимальная разница между количествами подслов может быть только 1. Поэтому в отдельные классы эквивалентности можно будет выделить префиксы, в которых +- $|w|_{ab} = |w|_{baa}$ и $|w|_{abb}=|w|_{bba}$ +- $|w|_{ab} = |w|_{baa}$ и $|w|_{abb}>|w|_{bba}$ +- $|w|_{ab} = |w|_{baa}$ и $|w|_{abb}<|w|_{bba}$ +- $|w|_{ab} > |w|_{baa}$ и $|w|_{abb}=|w|_{bba}$ +- $|w|_{ab} > |w|_{baa}$ и $|w|_{abb}>|w|_{bba}$ +- $|w|_{ab} > |w|_{baa}$ и $|w|_{abb}<|w|_{bba}$ +- $|w|_{ab} < |w|_{baa}$ и $|w|_{abb}=|w|_{bba}$ +- $|w|_{ab} < |w|_{baa}$ и $|w|_{abb}>|w|_{bba}$ +- $|w|_{ab} < |w|_{baa}$ и $|w|_{abb}<|w|_{bba}$ + +Обозначим эти состояния в троичной системе счисления от $00$ до $22$. + +Кроме этих префиксов, в отдельные классы эквивалентности нужно будет выделить и их префиксы, как промежуточные состояния. + +| КЭ/Суффикс | $\varepsilon$ | $a$ | $b$ | $bb$ | +| ------------- | ------------- | --- | --- | ---- | +| $\varepsilon$ | + | | | | +| $a$ | + | + | - | - | +| $b$ | + | + | + | | +| | | | | | + +Построенные классы эквивалентности, соответсвуют минимальному ДКА, распознающему язык $L$, поэтому построим его в явном виде. +```dot +digraph{ + rankdir=LR; + node[shape=circle] + point[label="", shape=point] + + S[label="00"] + + point -> S +} +``` ### 3. Язык всех не завершающихся систем переписывания строк из одного правила. Алфавит: ${f,g, \to}$. @@ -48,4 +94,3 @@ $$L_1 = a^*(abb^*aaa^*)^* \mid b^* (baaa^*bb^*)^*$$ При отрицательной накачке правой части, также завершается, так как число нетерминалов уменьшается. При отрицательной накачке перекрестной, число f уменьшается, поэтому система переписывания рано или поздно закончится. Следовательно, по лемме о накачке язык не КС. - From d7735c05bd5ce901d84a8b75c1ff9713e91276de Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Sun, 25 Jan 2026 08:33:36 +0300 Subject: [PATCH 13/19] 4.2 reg l2 + dfa l1 --- ...\200\320\270\320\260\320\275\321\202 4.md" | 85 ++++++++++++++++--- 1 file changed, 71 insertions(+), 14 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 4.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 4.md" index f1311a7..be007c5 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 4.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 4.md" @@ -19,35 +19,42 @@ $$\begin{aligned} $$L = (¬^* (T|F) (\& ¬^* (T|F))\space V)^* (T | (¬¬)^+ F) (\& (T | (¬¬)^+ F))^* (V \space ¬^* (T|F) (\& ¬^* (T|F)))^*$$ ### 2. Язык $\{w \mid |w|_{ab} = |w|_{baa} \space\&\space |w|_{abb} \neq |w|_{bba} \space \&\space w \in \{a, b\}^+\}$. -Распишем отдельно языки $L_1$ и $L_2$, которые удовлетворяют первому и второму правилу соответсвенно. +Распишем отдельно языки $L_1$ и $L_2$, которые удовлетворяют первому и второму правилу соответственно. Язык $L_1 = \{w \mid |w|_{ab} = |w|_{baa}\}$ -Внутри этого языка лежат все слова состоящие только из $a$ или только из $b$. -Также внутри лежит $ba$. -Если нам встретилась $ab$, тогда после должна идти baa, причем она может как включать b из ab, так и нет, то есть $a^*abb^*aa$ будет лежать в языке. Более того, итерация произвольного числа раз этого слова будет лежать в языке +Внутри этого языка лежат все слова состоящие только из $a$ или только из $b$. Также внутри лежит $ba$ и ~~пустое слово~~ (по условию слова не пустые). Все эти случаи соответствуют нулевому количеству вхождения обоих подстрок. +Если нам встретилась $ab$, тогда после должна идти $baa$, причем она может как включать $b$ из $ab$, так и нет, то есть $a^*abb^*aa$ будет лежать в языке. Более того, итерация произвольного числа раз этого слова будет лежать в языке $$(a^*abb^*aa)^* \subset L_1$$ Если у нас встретилась сначала $baa$, то после должно идти $ab$. То есть мы получим слова $$(b^*baaa^*b)^* \subset L_1$$ -Теперь получим общее выражение для языке $L_1$. +Теперь получим общее выражение для языке $L_1$, без учета условия на отсутствие пустого слова. $$L_1 = a^*(abb^*aaa^*)^* \mid b^* (baaa^*bb^*)^*$$ -Как видно, в этой формуле были перемещены a с начала в конец, что сделано только для сокращения выражения. Тем самым, мы показали, что язык $L_1$ - регулярный. +Как видно, в этой формуле были перемещены $a$ с начала в конец, что сделано только для сокращения выражения. Тем самым, мы показали, что язык $L_1$ - регулярный. Теперь рассмотрим язык $L_2 = \{w \mid |w|_{abb} \neq |w|_{bba}\}$ Дополнение к нему можно легко построить, и оно будет регулярным. -$$\overline{L_2} = \left\{\omega \mid |\omega|_{abb} = |\omega|_{bba}\right\}$$ -Здесь подойдет последовательный анализ. В-первых, в языке лежат все слова состоящие либо только из букв $a$, либо только из букв $b$, так как они будут соответсвовать нулевому количеству искомых подслов. Также подходят слова, в которых нет двух подряд идущих букв $b$. -Пусть в слове первое входит подслово $abb$, тогда после него может быть либо $b$ либо $a$, либо конец строки. Так как мы требуем одинаковое количество вхождений $abb$ и $bba$, то после подслова $abb$ мы требуем, что может идти сколько угодно букв b и обязательно буква a, что соответсвует регулярному выражению $\rho abb b^* a$ -после буквы a мы также можем ожидать какие-угодно символы, до первого вхождения $abb$. И кроме этого возможен перекрестный случай, который мы также должны учесть в регулярном выражении. +$$\overline{L_2} = \left\{w \mid |w|_{abb} = |w|_{bba}\right\}$$ +Здесь подойдет последовательный анализ. В-первых, в языке лежат все слова состоящие либо только из букв $a$, либо только из букв $b$, так как они будут соответствовать нулевому количеству искомых подслов. Также подходят слова, в которых нет двух подряд идущих букв $b$. +Пусть в слове первое входит подслово $abb$, тогда после него может быть либо $b$ либо $a$, либо конец строки. Так как мы требуем одинаковое количество вхождений $abb$ и $bba$, то после подслова $abb$ мы требуем, что может идти сколько угодно букв $b$ и обязательно буква $a$, что соответствует регулярному выражению $\rho abb b^* a$ +после буквы $a$ мы также можем ожидать какие-угодно символы, до первого вхождения $abb$. И кроме этого возможен перекрестный случай, который мы также должны учесть в регулярном выражении. $$\underbrace{a\textcolor{red}{bb}}\underbrace{\textcolor{red}{a}bb}$$ Таким образом получаем $$\rho a bbb^*a ((\rho a \mid \varepsilon)bbb^*a)^*$$ где $\rho \in (a \mid ba)^* (b \mid \varepsilon)$ - слова, в которых нет двух подряд идущих b. -Теперь рассмотрим, что первое в слово входит подслово $bba$. -==случай 2== +Теперь рассмотрим, что первое в слово входит подслово $bba$. После него может идти $a$, $b$ или конец строки. Из-за ограничения на количества вхождений подслов, мы можем ожидать после этого слова любое слово, не имеющее двух $b$ подряд. После этого должно присутствовать вхождение $abb$. Таким образом получаем регулярное выражение на уравнавешанный случай +$$\textcolor{green}{bba}\rho \textcolor{green}{abb}$$ +Здесь также возможен перекрестный случай $bbabb$ Кроме того стоит помнить о перекрестных случаях между парами вхождений таких подслов. Они будут перекрестны всегда, что обеспечивает конечную разницу между количествами подслов, и тем самым регулярность языка. +$$bba\rho a\textcolor{green}{bba}\rho \textcolor{green}{abb}$$ +Тогда можно получить регулярное выражения для всех таких слов +$$bbb^*a(\rho a|\varepsilon)bbb^*(\rho abbb^* )^*$$ +2 выражения можно объединить вместе через операцию альтернативы. +$$\rho a bbb^*a ((\rho a \mid \varepsilon)bbb^*a)^* \mid bbb^*a(\rho a|\varepsilon)bbb^*(\rho abbb^* )^*$$ -Таким образом мы нашли регулярное задание языка $\overline{L_2}$, из чего следует что и $L_2$ - также регулярный язык. Поэтому и $L = L_1 \cap L_2$ также будет регулярным языком. -Теперь нужно построить регулярное выражение для этого языка. +Таким образом мы нашли регулярное задание языка $\overline{L_2}$, из чего следует что и $L_2$ - также регулярный язык. Поэтому и $L = L_1 \cap L_2$ также будет **регулярным языком**. +Теперь нужно построить распознаватель данного языка. + +**Подход 1 - в лоб (не доделан)** Попробуем рассмотреть классы эквивалентности по Майхиллу-Нероде для регулярного языка $L$. @@ -86,6 +93,56 @@ digraph{ } ``` +**Подход 2 - пересечение автоматов** +Вместо того, чтобы в лоб строить КЭ для языка, и страдать просчитывая переходы между всеми его состояниями, можно построить отдельно автомат для $L_1$ и $\overline L_2$. После чего нужно преобразовать состояния для автомата $L_2$. И найти пересечение двух автоматов. + +Автомат для языка $L_1 = \{w \mid |w|_{ab} = |w|_{baa}\}$ +Из задания регулярным выражением $a^*(abb^*aaa^*)^* \mid b^* (baaa^*bb^*)^*$ +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 1,4[shape=doublecircle] + + point -> 0 + + 0,1 -> 1[label=a] + 1,2 -> 2[label=b] + 2 -> 3[label=a] + 3 -> 1 [label=a] + + 3 -> E [label=b] + E -> E [label="a,b"] + + 0,4 -> 4 [label=b] + 4 -> 5 [label=a] + 5,6 -> 6 [label=a] + 6 -> 4 [label=b] + 5 -> 2 [label=b] +} +``` + +Стоит сказать, что в данном автомате был добавлен неучтенный путь построения слова $5 \to 2$. Если после $bb^*a$ будет идти $b$, то очевидно, что это будет эквивалентно дисбалансу по первой ветви, когда число $ab$ больше чем число $baa$. В остальных аспектах, автомат реализует идею заданную регулярным выражением. + +Автомат для языка $\overline L_2 = \left\{w \mid |w|_{abb} = |w|_{bba}\right\}$ +Построение будет производиться по регулярному выражению $\rho a bbb^*a ((\rho a \mid \varepsilon)bbb^*a)^* \mid bbb^*a(\rho a|\varepsilon)bbb^*(\rho abbb^* )^*$, где $\rho=(a|ba)^*(b |\varepsilon)$ + +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 0[shape=doublecircle] + + point -> 0 + + 0 -> 1[label=a] + + 0 -> 200[label=b] +} +``` + ### 3. Язык всех не завершающихся систем переписывания строк из одного правила. Алфавит: ${f,g, \to}$. Для длинны накачки n рассмотрим $w = f^ng^n \to f^ng^n$. From 577e5c6fb7f521cd8a7dfc4aad19510b8bbd3be4 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 26 Jan 2026 00:36:03 +0300 Subject: [PATCH 14/19] task 4.2 --- ...\200\320\270\320\260\320\275\321\202 4.md" | 146 +++++++++++++++++- 1 file changed, 143 insertions(+), 3 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 4.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 4.md" index be007c5..5f60a2b 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 4.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 4.md" @@ -133,16 +133,156 @@ digraph{ rankdir=LR node[shape=circle] point[shape=point] - 0[shape=doublecircle] + 0,1,2,4,5[shape=doublecircle] point -> 0 - 0 -> 1[label=a] + 0 -> 1 [label=a] + 1 -> 1 [label=a] + 1 -> 2 [label=b] + 2 -> 3 [label=b] + 2 -> 1 [label=a] + 3 -> 3 [label=b] + 3 -> 1 [label=a] + + 0 -> 4 [label=b] + 4 -> 1 [label=a] + 4 -> 5 [label=b] + 5 -> 5 [label=b] + 5 -> 6 [label=a] + + 6 -> 6 [label=a] + 6 -> 7 [label=b] + 7 -> 6 [label=a] + 7 -> 5 [label=b] +} +``` + +Теперь для построения автомата распознающего $L_2$ нужно поменять принимающие и промежуточные состояния местами. + +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + 3,6,7[shape=doublecircle] + + point -> 0 + + 0 -> 1 [label=a] + 1 -> 1 [label=a] + 1 -> 2 [label=b] + 2 -> 3 [label=b] + 2 -> 1 [label=a] + 3 -> 3 [label=b] + 3 -> 1 [label=a] + + 0 -> 4 [label=b] + 4 -> 1 [label=a] + 4 -> 5 [label=b] + 5 -> 5 [label=b] + 5 -> 6 [label=a] + + 6 -> 6 [label=a] + 6 -> 7 [label=b] + 7 -> 6 [label=a] + 7 -> 5 [label=b] +} +``` + +Теперь необходимо построить автомат, соответствующий пересеченению языков. Это можно сделать по классическому алгоритму. Оба автомата имеют 8 состояний, тогда пересечение будет иметь не более $8^2$ состояний - фактически 20 состояний без минимизации. + +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + A43, A47, A16[shape=doublecircle] + + point -> A00 + A00 [label="0,0"] + A11 [label="1,1"] + A44 [label="4,4"] + A22 [label="2,2"] + A31 [label="3,1"] + A23 [label="2,3"] + A51 [label="5,1"] + A45 [label="4,5"] + A61 [label="6,1"] + A56 [label="5,6"] + A42 [label="4,2"] + A66 [label="6,6"] + A43 [label="4,3"] + A27 [label="2,7"] + A36 [label="3,6"] + A25 [label="2,5"] + A47 [label="4,7"] + A16 [label="1,6"] + + A00 -> A11[label=a] + + A11 -> A11 [label=a] + A11 -> A22 [label=b] + + A22 -> A31 [label=a] + A22 -> A23 [label=b] + + A31 -> A11 [label=a] + A31 -> E [label=b] + + E -> E [label="a,b"] + + A23 -> A31 [label=a] + A23 -> A23 [label=b] + + A00 -> A44[label=b] + + A44 -> A51 [label=a] + A44 -> A45 [label=b] + + A51 -> A61 [label=a] + A51 -> A22 [label=b] + + A45 -> A56 [label=a] + A45 -> A45 [label=b] + + A61 -> A61 [label=a] + A61 -> A42 [label=b] + + A56 -> A66 [label=a] + A56 -> A27 [label=b] + + A42 -> A51 [label=a] + A42 -> A43 [label=b] + + A66 -> A66 [label=a] + A66 -> A47 [label=b] + + A43 -> A51 [label=a] + A43 -> A43 [label=b] + + A27 -> A36 [label=a] + A27 -> A25 [label=b] + + A36 -> A16 [label=a] + A36 -> E [label=b] + + A25 -> A36 [label=a] + A25 -> A25 [label=b] + + A47 -> A56 [label=a] + A47 -> A45 [label=b] - 0 -> 200[label=b] + A16 -> A16 [label=a] + A16 -> A27 [label=b] } ``` +Данный автомат был построен по простому алгоритму: +- начинают 2 автомата в состояниях 0,0 +- для всех недостроенных состояний строится переход по символу, между парами состояний автоматов +- финальными помечаются только те пары, которые состоят из финальных состояний этих двух автоматов. +Данный язык не является конечным, так как данный автомат принимает например слова $baabbb^*$, которые также соответствуют условию. ### 3. Язык всех не завершающихся систем переписывания строк из одного правила. Алфавит: ${f,g, \to}$. Для длинны накачки n рассмотрим $w = f^ng^n \to f^ng^n$. From cd43bd609d105cda84beb236d7665e6ce28b0d04 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 26 Jan 2026 12:41:33 +0300 Subject: [PATCH 15/19] minor fixes --- ...0\222\320\260\321\200\320\270\320\260\320\275\321\202 6.md" | 3 +++ 1 file changed, 3 insertions(+) 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 6.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 6.md" index 1a7b5d7..8e55926 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 6.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 6.md" @@ -19,8 +19,11 @@ T -> 0 => T | 1 => 1 | 1 => 1 | 0 => 0 | 0 => 1 | 1 => 0 // любое логи digraph{ rankdir=LR node[shape=circle] + point[shape=point] F[shape=doublecircle] + point -> S + S -> F [label="1=>1"] S -> F [label="0=>1"] S -> F [label="0=>0"] From 5292e5ab2d13cb4350f40243aaa5c729226a6d7f Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 26 Jan 2026 14:27:02 +0300 Subject: [PATCH 16/19] format fixes + minimize 4.2 --- ...\200\320\270\320\260\320\275\321\202 1.md" | 34 ++++---- ...\200\320\270\320\260\320\275\321\202 2.md" | 57 +++++++------ ...\200\320\270\320\260\320\275\321\202 4.md" | 84 +++++++++++++++++-- ...\200\320\270\320\260\320\275\321\202 6.md" | 6 +- 4 files changed, 125 insertions(+), 56 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 1.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 1.md" index 9f75dea..8ce4054 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 1.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 1.md" @@ -3,9 +3,9 @@ Состояния: остатки от 0 до 4. **Идея @BaldiSlayer** -> Пусть A - основание системы счисления, B - остаток от деления на который мы смотрим. -> Состояния описывают текущий остаток от деления на B(для произвольной задачи такого вида) -> Переходы по k для состояния q определяются следующей формулой: +> Пусть $A$ - основание системы счисления, $B$ - остаток от деления на который мы смотрим. +> Состояния описывают текущий остаток от деления на $B$ (для произвольной задачи такого вида) +> Переходы по $k$ для состояния $q$ определяются следующей формулой: > $$q' = (q * A + k) \mod B$$ > Выделяем финальными состояниями те, которые необходимы принимающими в языке(в зависимости от того, какой требуется остаток от деления): > - Если требуется, чтобы числа делились выделяем финальным только состояние 0 @@ -75,11 +75,11 @@ S &\to bTaT \mid BB \\ T &\to bT \mid aS \mid a \\ B &\to Ba \mid ab \end{aligned}$$ -Заметим, что нетерминал B порождает регулярный язык $aba^*$, что не сложно увидеть, если рассмотреть порождаемые слова, или заметить, что нетерминал B задает леворекурсивный вывод и поэтому можно воспользоваться правилом преобразования леворекурсивного вывода. Таким образом +Заметим, что нетерминал $B$ порождает регулярный язык $aba^*$, что не сложно увидеть, если рассмотреть порождаемые слова, или заметить, что нетерминал B задает леворекурсивный вывод и поэтому можно воспользоваться правилом преобразования леворекурсивного вывода. Таким образом $$B = aba^*$$ -Нетерминал T - праворекурсивный, таким образом нетерминал T порождает язык: +Нетерминал $T$ - праворекурсивный, таким образом нетерминал $T$ порождает язык: $$T = b^*a?(S)$$ -Теперь нам нужно рассмотреть язык, порождаемый нетерминалом S. Раскроем по ранее полученным замечаниям нетерминалы B и T в правилах переписывания S. +Теперь нам нужно рассмотреть язык, порождаемый нетерминалом $S$. Раскроем по ранее полученным замечаниям нетерминалы $B$ и $T$ в правилах переписывания $S$. $$S \to bTaT \mid BB;$$ $$S \to b\underbrace{b^*a?(S)}_Ta\underbrace{b^*a?(S)}_T \mid \underbrace{aba^*}_B\underbrace{aba^*}_B$$ Таким образом, мы получили, что наш язык можно записать в форме расширенной грамматики с одним нетерминалом: @@ -139,9 +139,9 @@ digraph{ 1 -> 0[label="R A/."] } ``` -Теперь расширим язык возможностью присутствия E внутри правильных скобочных последовательностей или после. +Теперь расширим язык возможностью присутствия $E$ внутри правильных скобочных последовательностей или после. $$S \to L?(S)R?(S) \mid E$$ -Для построения PDA заметим следующее правило: в слове после символа E либо ничего не стоит, либо стоит закрывающая скобка. Докажем это. Пусть мы прочитали суффикс $\varphi$ и находимся на глубине вложенности $n$. После суффикса идет $E$. Пусть мы раскрылись в E через первую S в первом правиле раскрытия. Тогда после должно идти R без исключений. Пусть мы раскрылись по второй S в E. Тогда после E могут идти символы, которые могут идти после S, а для данной грамматики это либо R либо конец слова. Что и требовалось доказать. +Для построения PDA заметим следующее правило: в слове после символа $E$ либо ничего не стоит, либо стоит закрывающая скобка. Докажем это. Пусть мы прочитали суффикс $\varphi$ и находимся на глубине вложенности $n$. После суффикса идет $E$. Пусть мы раскрылись в $E$ через первую $S$ в первом правиле раскрытия. Тогда после должно идти $R$ без исключений. Пусть мы раскрылись по второй $S$ в $E$. Тогда после $E$ могут идти символы, которые могут идти после $S$, а для данной грамматики это либо $R$ либо конец слова. Что и требовалось доказать. Из полученного нами утверждения построим PDA для этой промежуточной грамматики. ```dot digraph{ @@ -162,9 +162,9 @@ digraph{ } ``` Поясним, как был построен PDA. Состояния 0 и 3 - состояния, когда мы прочитали правильную скобочную последовательность, в том числе пустую. Но почему мы не можем объединить их? Если бы мы объединили два этих состояния, то наш PDA допускал бы пустое слово, а по грамматики видно, что этого не должно происходить. -Состояние F отвечает за прочитанную в конце слова символ E. Мы можем прочитать его как в самом начале, так и после правильной скобочной последовательности. -Состояние 1 отвечает за накопление в стеке глубины раскрытия скобок и раскрытие в ПСП без внутренних символов. Для понимания того, прочитали мы ПСП или нет, используем классический прием и в стеке оперируем двумя разными стековыми символами. Стековый символ A отвечает за глубину вложенности 1, символ B - за все остальные. Если мы прочитали закрывающую скобку и сняли символ A, то мы понимаем, что мы находимся после правильной скобочной последовательности, иначе - внутри. -Если в состоянии 1 мы встретили внутренний символ E, то переходим в состояние 2, из которого мы обязаны прочитать закрывающую скобку, по ранее доказанному утверждению. +Состояние $F$ отвечает за прочитанную в конце слова символ $E$. Мы можем прочитать его как в самом начале, так и после правильной скобочной последовательности. +Состояние 1 отвечает за накопление в стеке глубины раскрытия скобок и раскрытие в ПСП без внутренних символов. Для понимания того, прочитали мы ПСП или нет, используем классический прием и в стеке оперируем двумя разными стековыми символами. Стековый символ $A$ отвечает за глубину вложенности 1, символ $B$ - за все остальные. Если мы прочитали закрывающую скобку и сняли символ $A$, то мы понимаем, что мы находимся после правильной скобочной последовательности, иначе - внутри. +Если в состоянии 1 мы встретили внутренний символ $E$, то переходим в состояние 2, из которого мы обязаны прочитать закрывающую скобку, по ранее доказанному утверждению. Теперь несложно заметить, что требуемый от нас язык можно получить из промежуточного применив регулярный морфизм - в данном случае, так обозначаю морфизм, который заменяет каждое вхождение символа на какое-то слово из регулярного языка. $$L \to bb^*a \quad R \to ab^*a \quad E \to abaa^*ba$$ @@ -212,7 +212,7 @@ digraph{ } ``` -Теперь вставим в PDA участки построенных автоматов вместо разбора L, R и E соответственно. +Теперь вставим в PDA участки построенных автоматов вместо разбора $L$, $R$ и $E$ соответственно. ```dot digraph{ rankdir=LR @@ -339,7 +339,7 @@ digraph{ ``` ### 3. Язык lookahead-регулярных выражений, не описывающих пустые языки. lookahead-ы не используются под итерацией и не могут быть вложенными. Алфавит $\{a, b, \$\}$ (причём $\$$ допустим только в конце выражения и в конце lookahead-блоков), допустимые операции - альтернатива, конкатенация и итерация, скобки допускаются. -**Первый способ(решить задачу в лоб)** +**Первый способ (решить задачу в лоб)** Язык не КС. Докажем с помощью Леммы о накачке Пусть p - длинна накачки, рассмотрим слово $w = (?= \underbrace{a^p}_{p_1}\underbrace{b^p}_{p_2}) \underbrace{a^p}_{p_3} \underbrace{b^p}_{p_4}$ При накачке отдельно $p_i$ выйдем из языка, так как образец lookahead не будет совпадать с регуляркой: @@ -347,10 +347,10 @@ digraph{ - для $p_3, p_4$ отрицательная накачка выводит из языка, так как образец lookahead становится больше чем регулярка При накачке $p_1p_2$ или $p_3p_4$ аналогично -При накачке $p_2p_3$ мы получаем не симметричное изменение образца и регулярки(в образце изменяются b а в регулярке a), поэтому также выйдем из языка. +При накачке $p_2p_3$ мы получаем не симметричное изменение образца и регулярки (в образце изменяются $b$, а в регулярке $a$), поэтому также выйдем из языка. Следовательно, слово нельзя накачать — не КС. -**Второй способ(свести к более простому языку)** +**Второй способ (свести к более простому языку)** Произведем сначала преобразования языка 1) Пересечем язык с регуляркой $(?=a^*b^*)a^*b^*$ 2) Используем морфизм $h: h('(') = \varepsilon, h(')')=c, h('?') = \varepsilon, h('=')=\varepsilon, h(a)=a,h(b)=b$ @@ -361,9 +361,9 @@ digraph{ При накачке отдельно $p_1, p_3$ мы получим, что слово до и после c не равны. При положительной накачке $p_2$ мы получим, что слово до c больше чем слово после. При отрицательной накачке $p_4$ мы получим тот же случай, когда слово до с длиннее чем после. -Теперь рассмотрим перекрестные накачки. При перекрестной положительной накачке $p_1p_2$ мы получим ситуацию, когда подслово до разделителя больше чем после. При накачке $p_2p_3$ получим рассинхрон в количестве букв a до и после разделителя c. При отрицательной накачке $p_3p_4$ мы получим, что букв a больше до разделителя с, чем после. Таким образом мы получили, что слово нельзя накачать язык не КС. +Теперь рассмотрим перекрестные накачки. При перекрестной положительной накачке $p_1p_2$ мы получим ситуацию, когда подслово до разделителя больше чем после. При накачке $p_2p_3$ получим рассинхрон в количестве букв $a$ до и после разделителя $c$. При отрицательной накачке $p_3p_4$ мы получим, что букв $a$ больше до разделителя $c$, чем после. Таким образом мы получили, что слово нельзя накачать язык не КС. -**Третий способ(через стратифицированные периоды)** +**Третий способ (через стратифицированные периоды)** Произведем начальные преобразования как в втором способе. Докажем, что язык $L' =\{wcwv \mid w \in a^*b^*, v \in b^*\}$ не КС с помощью анализа стратифицированных периодов. Для начала затрем $c$ с помощью морфизма $$\varphi(x) = \begin{cases} 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 2.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 2.md" index b340dc0..29ad2c7 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 2.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 2.md" @@ -11,24 +11,24 @@ ba^*(bb\mid aa)^* (?<= ba^*) \to \underbrace{ba^*}_{T_1}\mid b a^*(bb|aa)^*b\und Области $T_1, T_2$ - те области, которые подошли для подстановки в lookbehind. В $T_1$ мы взяли случай, когда все слово подставляется в lookbehind. В $T_2$ мы взяли минимальное подслово, чтобы оно удовлетворяло lookbehind. Теперь упростим полученную регулярку $$ba^*\mid b a^*(bb|aa)^*bb(aa^*) =$$ -Упростим мы из следующего соображения. Пусть мы прочитали часть слова, удовлетворяющую $ba^*$. Если после мы прочитаем a, то мы можем также его отнести к уже прочитанной регулярке. Если после мы читаем b, то после обязательно должно следовать b. И после прочитанной bb мы можем читать только четные количества a и b, причем сколько угодно раз. Таким образом мы получаем следующее регулярное выражение +Упростим мы из следующего соображения. Пусть мы прочитали часть слова, удовлетворяющую $ba^*$. Если после мы прочитаем a, то мы можем также его отнести к уже прочитанной регулярке. Если после мы читаем $b$, то после обязательно должно следовать $b$. И после прочитанной $bb$ мы можем читать только четные количества $a$ и $b$, причем сколько угодно раз. Таким образом мы получаем следующее регулярное выражение $$= ba^*(bb(aa)^*)^*$$ Рассмотрим теперь lookahead подстановку. $$(?= \underbrace{ba^*(bb(aa)^*)^*}_{lookbehind} aa^*ba)(aba \mid ba^*bb)^*$$ -Очевидно, что 0 итераций регулярного выражения $(aba \mid ba^*bb)^*$ не входит в язык, так как нам требуются слова, состоящие как минимум из 4 букв(см. минимальное слово из образца lookahead). +Очевидно, что 0 итераций регулярного выражения $(aba \mid ba^*bb)^*$ не входит в язык, так как нам требуются слова, состоящие как минимум из 4 букв (см. минимальное слово из образца lookahead). Поэтому раскроем одну итерацию $$(?= ba^*(bb(aa)^*)^* aa^*ba)(aba \mid ba^*bb)(aba \mid ba^*bb)^*$$ Очевидно, что первая итерация не может раскрыться в $aba$, так как образец начинается с $b$. Поэтому получаем $$(?= ba^*(bb(aa)^*)^* aa^*ba)ba^*bb(aba \mid ba^*bb)^*$$ -Сразу можно упростить наше выражение, заметив, что первая b всегда будет совпадать. Поэтому +Сразу можно упростить наше выражение, заметив, что первая $b$ всегда будет совпадать. Поэтому $$b(?= a^*(bb(aa)^*)^* aa^*ba)a^*bb(aba \mid ba^*bb)^*$$ Также очевидна возможность следующей перестановки $$b(?= a^*(bb(aa)^*)^* \underbrace{a^*a}_{swap}ba)a^*bb(aba \mid ba^*bb)^*$$ Теперь нам необходимо перебрать различные случаи lookahead образцов. Пусть итерация $(bb(aa)^*)^*$ раскроется 0 раз. Тогда мы получим: $$b(?= a^*aba)a^*bb(aba \mid ba^*bb)^*$$ -Очевидно, что в таком случае, мы не сможем никак подставить, так как нам необходимо встретить $aba$ после некоторого количества a, а мы можем получить только bb. Поэтому эта итерация раскроется как минимум 1 раз. Тогда мы получаем: +Очевидно, что в таком случае, мы не сможем никак подставить, так как нам необходимо встретить $aba$ после некоторого количества $a$, а мы можем получить только $bb$. Поэтому эта итерация раскроется как минимум 1 раз. Тогда мы получаем: $$b(?= a^*bb(aa)^*(bb(aa)^*)^*a^*aba)a^*bb(aba \mid ba^*bb)^*$$ И теперь совпадающий префикс $a^*bb$ мы можем выделить в начало, за пределы lookahead $$ba^*bb(?= (aa)^*(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ @@ -38,7 +38,7 @@ $$ba^*bb(?= \cancel{(aa)^*}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ Далее мы будем рассматривать только lookahead, без префикса языка $ba^*bb$, просто в конце при поиске ответа сконкатенируем с ним. --- -Пусть вторая итерация в образце раскроется n раз, тогда +Пусть вторая итерация в образце раскроется $n$ раз, тогда $$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)(aba \mid ba^*bb)^*$$ 1)Тогда итерацию самого слова мы должны раскрывать по второй альтернативе. $$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)b \textcolor{red}{a^*} bb(aba \mid ba^*bb)^*$$ @@ -46,7 +46,7 @@ $$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a $$(?= \underbrace{bb(aa)^* bb(aa)^* ... bb(aa)^*}_{\text{n раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ 3)Теперь по первой итерации в образце не можем итерироваться, тогда $$(?= bb\underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)bbb(aba \mid ba^*bb)^*$$ -4)Выносим за пределы образца bb и там и там +4)Выносим за пределы образца $bb$ и там и там $$bb(?= \underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ 5)Теперь при раскрытии по второму правилу мы получим $$bb(?= \underbrace{\textcolor{red}{bb(aa)^*}bb(aa)^* ... bb(aa)^*}_{\text{n-1 раз}}(bb(aa)^*)^*a^*aba)\textcolor{red}{bba^*}bb(aba \mid ba^*bb)^*$$ @@ -54,9 +54,9 @@ $$bb(?= \underbrace{\textcolor{red}{bb(aa)^*}bb(aa)^* ... bb(aa)^*}_{\text{n-1 $$bbbb(aa)^*(?= \underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)bb(aba \mid ba^*bb)^*$$ 7)По первому правилу мы все еще не можем раскрыться, поэтому раскрываемся по второму $$bbbb(aa)^*(?= \underbrace{\textcolor{red}{bb(aa)^*bb(aa)^*}bb(aa)^* ... bb(aa)^*}_{\text{n-2 раз}}(bb(aa)^*)^*a^*aba)\textcolor{red}{bbba^*b}b(aba \mid ba^*bb)^*$$ -8)Если не раскрывать итерации, то получится вынести еще блок из b. +8)Если не раскрывать итерации, то получится вынести еще блок из $b$. $$bbbb(aa)^*bbbb(?= \underbrace{bb(aa)^* ... bb(aa)^*}_{\text{n-4 раз}}(bb(aa)^*)^*a^*aba)b(aba \mid ba^*bb)^*$$ -И мы снова вернулись к шагу 4, с разросшимся префиксом. Из этого можно понять, что итерация $(bb(aa)^*)^*$ может раскрыться или 0 раз, или если больше, то мы получаем 1 или 2 b между lookahead и итерацией самого слова. +И мы снова вернулись к шагу 4, с разросшимся префиксом. Из этого можно понять, что итерация $(bb(aa)^*)^*$ может раскрыться или 0 раз, или если больше, то мы получаем 1 или 2 $b$ между lookahead и итерацией самого слова. $$\begin{cases} (?= a^*aba)(aba \mid ba^*bb)^* &n=0 \\ \varphi_n(?= a^*aba)(b|bb)(aba \mid ba^*bb)^*&n>0\\ @@ -104,30 +104,30 @@ digraph{ A -> D,B } ``` -По графу видно, что вырисовывается иерархия между нетерминалами. Так D рекурсивно зависит только от себя, R зависит от себя и от D. Начнем анализировать язык от "листьев" к "корню" +По графу видно, что вырисовывается иерархия между нетерминалами. Так $D$ рекурсивно зависит только от себя, $R$ зависит от себя и от $D$. Начнем анализировать язык от "листьев" к "корню" Рассмотрим нетерминал $D \to Dca \mid b$. Этот нетерминал раскрывается леворекурсивно и его язык можно описать регулярным выражением. $$D = b(ca)^*$$ Рассмотрим нетерминал $R \to aR \mid baR \mid bbD$. Он в свою очередь является праворекурсивным, и его также можно выразить в виде регулярного выражения: $$R = (a\mid ba)^*bbD = (a\mid ba)^*bbb(ca)^*$$ -Теперь нам нужно вместе рассмотреть нетерминалы A и B. +Теперь нам нужно вместе рассмотреть нетерминалы $A$ и $B$. $$A \to DqB \mid aDb \qquad B \to cB \mid dRA$$ -Они оба содержат праворекурсивный вывод относительно A и B каждый раз меняясь друг с другом. +Они оба содержат праворекурсивный вывод относительно $A$ и $B$ каждый раз меняясь друг с другом. $$B = c^*dRA$$ $$A = Dq\underbrace{B}_{c^*dRA} \mid aDb = Dqc^*dRA \mid aDb = (Dqc^*dR)^*aDb$$ -Таким образом для нетерминалов A и В получаем: +Таким образом для нетерминалов $A$ и $B$ получаем: $$A = (Dqc^*dR)^*aDb = (b(ca)^*qc^*d(a\mid ba)^*bbb(ca)^*)ab(ca)^*b$$ $$B = c^*dR(Dqc^*dR)^*aDb$$ -Языки нетерминалов D,R заменим позже. +Языки нетерминалов $D,R$ заменим позже. -Теперь рассмотрим пару нетерминалов Q,T. +Теперь рассмотрим пару нетерминалов $Q,T$. $$T \to QbA \mid BR \qquad Q \to BcD\mid TR$$ -Эти нетерминалы действуют также как и A и B, только подвыводы леворекурсивные. Чтобы увидеть наглядно, подставим в первое правило раскрытия T правила раскрытия Q. +Эти нетерминалы действуют также как и $A$ и $B$, только подвыводы леворекурсивные. Чтобы увидеть наглядно, подставим в первое правило раскрытия $T$ правила раскрытия $Q$. $$T \to BcDbA \mid TRbA \mid BR$$ И поэтому очевиден переход к регулярному $$T = (BcDbA\mid BR) (RbA)^*$$ -И произведем аналогичную замену для Q +И произведем аналогичную замену для $Q$ $$Q = BcD \mid (BcDbA\mid BR) (RbA)^*R$$ -И теперь рассмотрим нетерминал S. Он иерархически не саморекурсивен, и раскрывается в "регулярные" нетерминалы, поэтому S порождает регулярный язык. +И теперь рассмотрим нетерминал $S$. Он иерархически не саморекурсивен, и раскрывается в "регулярные" нетерминалы, поэтому S порождает регулярный язык. $$S \to TaQ \mid RT$$ %%Уже пытаюсь третий раз расписать регулярку, но короткой она не выйдет. Только если не использовать группы захвата какие-нибудь%% # 3. Язык $\{wz^Rvz \mid w,v,z \in \{a,b\}^* \space \& \space |w|>1 \space \& \space |z|>1 \space \&\space (v=w^R \vee v \in (ab^*)^+)\}$ @@ -139,10 +139,10 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ И точно можно получить, что язык не регулярный, так как $ab a^2b^{n} a b^n a^2$ нельзя накачать в регулярном смысле. > [!tip] Док-во, что язык не регулярный, с помощью леммы о накачке. -> Пусть язык регулярный. тогда пересечем его с регулярным языков $aba^2b^*ab^*a^2$, и получим новый регулярный язык. Так как новый также регулярный, значит он накачивается и предположим длина накачки n. Рассмотрим слово $\omega = ab a^2\underbrace{b^{n}}_{p} a b^n a^2$. По условию леммы о накачке для регулярных языков, мы должны выбрать подслово не далее чем на n символов от начала слова, которое можно накачать. Из-за ограничения регуляркой, это подслово находится только в $p$. +> Пусть язык регулярный. тогда пересечем его с регулярным языков $aba^2b^*ab^*a^2$, и получим новый регулярный язык. Так как новый также регулярный, значит он накачивается и предположим длина накачки $n$. Рассмотрим слово $\omega = ab a^2\underbrace{b^{n}}_{p} a b^n a^2$. По условию леммы о накачке для регулярных языков, мы должны выбрать подслово не далее чем на n символов от начала слова, которое можно накачать. Из-за ограничения регуляркой, это подслово находится только в $p$. > Рассмотрим почему, если мы попытаемся накачать подслово из $p$, то выйдем из языка. Для данного слова допустимо следующее разбиение на подслова из определения: > $$w = ab, \quad z = a^2b^n, \quad v = a$$ -> Почему не допустимо другое разбиение? Суффикс z однозначно определяет, что он состоит как минимум из двух букв $a$, тем самым он заякоривает две буквы $a$ в середине слова. Тем самым на подслово $w$ остаются только первые 2 буквы слова. +> Почему не допустимо другое разбиение? Суффикс $z$ однозначно определяет, что он состоит как минимум из двух букв $a$, тем самым он заякоривает две буквы $a$ в середине слова. Тем самым на подслово $w$ остаются только первые 2 буквы слова. > $$\underbrace{ab}_w \underbrace{a^2}_{z^R} b^nab^n \underbrace{a^2}_{z}$$ > Из ограничения на $v$ следует, что так мы не можем разбить слово, так как $v$ в таком случае не начинается на $a$ и не является обращением $w$. Единственное изменение в разбиении, которое мы можем внести, - это расширять $z$. И таким образом мы получим предъявленное нами в начале разбиение слова. > Теперь вернемся к накачке. Пусть мы можем накачать подслово $b^i$ из $p$, где $i < n-4$. Рассмотрим положительную накачку. Тогда накачанное слово будет иметь вид @@ -151,7 +151,6 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ > $$\underbrace{ab}_w\underbrace{a^2b^n}_{a^R}b^{ik}a\underbrace{b^na^2}_{z}$$ > очевидно, что оставшуюся часть слова мы не можем отнести в $v$, так как оно не удовлетворяет регулярному ограничению и не является оборотом $w$(оно может являться оборотом только при $ik = 1$, а так как $k$ - произвольное, то это условие не выполняется ни для какого $i$) и в то же время мы уже не можем продолжить наращивать $z$. Поэтому мы не можем разбить это слово, и следовательно оно не принадлежит языку. Поэтому делаем вывод, что это слово нельзя накачать, и язык, полученный после пересечения с регулярным, не является регулярным. А из этого следует, что и исходный язык тоже не регулярный, так как класс регулярных языков замкнут по операции пересечения. - Необходимо проверить, является ли язык КС. Для этого воспользуемся леммой о накачке для КС языков. Очевидно, что если язык не КС, то нам нужно рассмотреть случай, когда при накачках будет справедливо только первое условие, то есть $v = w^R$. Для построения контрпримера проанализируем слово из рассуждения о нерегулярности языка. @@ -165,7 +164,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ > Пусть язык КС, тогда при пересечении его с регулярным языком $ab^*a^2b^* a b^* a^2$ мы также получим КС язык. Поэтому для полученного языка должна быть справедлива лемма о накачке для КС языков. > Пусть длинна накачки $n$. Тогда рассмотрим слово $\omega = a\underbrace{b^n}_{p_1} a^2 \underbrace{b^{2n}}_{p_2} a \underbrace{b^n}_{p_3} a^2$ > Подслово $p_1$ нельзя положительно накачать, так как тогда нам не хватит букв $b$ внутри $v$ чтобы сохранить ограничение $v = w^R$. -> Подслово $p_3$ нельзя положительно накачать, так как тогда не хватит букв b, чтобы произвести соответствие $z^R$. +> Подслово $p_3$ нельзя положительно накачать, так как тогда не хватит букв $b$, чтобы произвести соответствие $z^R$. > И точно также нельзя накачать подслово $p_2$, иначе получим дисбаланс. > Теперь нужно подумать, что делать с перекрестными симметричными накачками, так как такой контрпример они рушат. > Почему контрпример не подходит для такой ситуации? @@ -182,7 +181,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ > Почему допустимо только такое разбиение слова на подслова? > Сначала в конце $a^2$ делает заякоривание в $a^2$. Тогда все что до $a^2$ отходит в $w$. После чего мы получаем следующую структуру разбиения > $$\omega = \underbrace{ab^nab}_w\underbrace{a^2}_{z^R}b^nbab^na b^n \underbrace{a^2}_z$$ -> После чего мы пытаемся соотнести оставшееся в v. Это у нас не получается, так как это выражение не начинается с $a$ и не является обращением $w$. Поэтому мы расширяем $z$ на букву $b$, до того как не получится соотнести. Последовательно расширяем $v$ на $b^n$. Получаем следующее разбиение. +> После чего мы пытаемся соотнести оставшееся в $v$. Это у нас не получается, так как это выражение не начинается с $a$ и не является обращением $w$. Поэтому мы расширяем $z$ на букву $b$, до того как не получится соотнести. Последовательно расширяем $v$ на $b^n$. Получаем следующее разбиение. > $$\omega = \underbrace{ab^nab}_w\underbrace{a^2b^n}_{z^R}bab^na\underbrace{b^na^2}_z$$ > Получившийся остаток слова мы можем обработать только как обращение $w$. У нас получилось разбить все слово на подслова, поэтому оно принадлежит языку. > Теперь рассмотрим накачки. Чтобы не нарушить регулярную структуру мы можем накачивать только следующие области: @@ -197,14 +196,14 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ > И аналогично для $p_3,p_4$. Таким образом мы показали, что данное слово нельзя накачать в КС смысле. Поэтому язык не КС. -Таким образом мы показали, что язык не КС. -Рассмотрим теперь как мы могли с нуля построить контрпример и проанализируем какие контрпримеры еще возможны. -Для начала нужно проанализировать какой вид может иметь $z$, так как оно может давать заякоривания. +Таким образом мы показали, что язык **контекстно-зависимый**. + +Рассмотрим теперь как мы могли с нуля построить контрпример и проанализируем какие контрпримеры еще возможны. Для начала нужно проанализировать какой вид может иметь $z$, так как оно может давать [[Анализ заякориваний|заякоривания]]. По условию $z$ имеет как минимум 2 символа. То есть мы получаем 4 возможных комбинаций. Теперь рассмотрим случаи, которые идут после этого заякоривания. -Если там идет $b$, то мы не сможем его поглотить с помощью $v$. А если после нам попадется $a$ то мы посчитаем, что это начало $v$ и сможем прочитать, что угодно после прочитанной a. +Если там идет $b$, то мы не сможем его поглотить с помощью $v$. А если после нам попадется $a$ то мы посчитаем, что это начало $v$ и сможем прочитать, что угодно после прочитанной $a$. -Таким образом, самое экономное представление подслова z будет иметь следующий вид $b^n (a|b)^2$, а слово будет принимать вид +Таким образом, самое экономное представление подслова $z$ будет иметь следующий вид $b^n (a|b)^2$, а слово будет принимать вид $$w \underbrace{(a|b)^2 b^n}_{z^R} v \underbrace{b^n (a|b)^2}_z$$ Теперь необходимо посмотреть на то, как выбор заякоривания влияет на остальные подслова. Пусть заякоривание $ab$. @@ -217,7 +216,7 @@ z= bb \implies w= a^*(ba+)^*?b \end{cases}$$ Кроме этих случаев, конечно, возможны и случаи включающие заякоривания, но их мы опустим, так как для построения контрпримера оптимальнее рассматривать простые минимальные случаи, чтобы продемонстрировать не КС свойства. -Как было отмечено выше, если после подслова $z^R$ мы встречаем букву $a$, то подслово v мы можем распарсить без контекстно-зависимых ограничений с w, что для построение контрпримера нам не подойдет. +Как было отмечено выше, если после подслова $z^R$ мы встречаем букву $a$, то подслово $v$ мы можем распарсить без контекстно-зависимых ограничений с $w$, что для построение контрпримера нам не подойдет. Поэтому для построения контпримера к накачке наилучшим образом подходят заякоривания $aa,ab$. Заякоривание $ba$, при обращении $w$ не даст нам контекстно зависимых ограничений. У заякоривания $bb$ проблема другая - так как $z^R = b^2 b^n$ то мы получаем очень большое количество кандидатов для заякоривания, тем самым мы сильно усложним доказательство, поэтому такой вариант рассматривать крайне не рекомендуется. @@ -225,7 +224,7 @@ z= bb \implies w= a^*(ba+)^*?b Для заякоривания $aa$, имеем $$b^*(ab^+)^* ?a a^2 b^n \underbrace{...}_v b^n a$$ Очевидно, что мы не можем ставить $?a$ в слово, так как тогда мы не получим контекстных зависимостей на $v$. -Теперь нам нужно рассмотреть разные структуры подслова w, с условием, чтобы не допустить возможность перекрестной накачки. +Теперь нам нужно рассмотреть разные структуры подслова $w$, с условием, чтобы не допустить возможность перекрестной накачки. Рассмотрим 0 итераций $ab^+$, тогда имеем слово $$b^k a^2 b^n b^k b^n a$$ Очевидно, что оно нам не дает контекстной зависимости. 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 4.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 4.md" index 5f60a2b..15680f8 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 4.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 4.md" @@ -2,9 +2,9 @@ Язык действительно регулярный, так как не рассматривает вложенных структур. Язык можно описать следующим образом: - слова - конкатенация через $\vee$ логических формул, среди которых есть хотя бы одна истинная -- Истинная логическая формула - конкатенация истин через & +- Истинная логическая формула - конкатенация истин через $\&$ - Истина - T или четное число отрицаний -- Логическая формула - конкатенация через & логических единиц = T или F перед которыми произвольное число отрицаний +- Логическая формула - конкатенация через $\&$ логических единиц = T или F перед которыми произвольное число отрицаний Таким образом можно рекурсивно определить регулярное выражение $$\begin{aligned} @@ -54,7 +54,7 @@ $$\rho a bbb^*a ((\rho a \mid \varepsilon)bbb^*a)^* \mid bbb^*a(\rho a|\varepsil Таким образом мы нашли регулярное задание языка $\overline{L_2}$, из чего следует что и $L_2$ - также регулярный язык. Поэтому и $L = L_1 \cap L_2$ также будет **регулярным языком**. Теперь нужно построить распознаватель данного языка. -**Подход 1 - в лоб (не доделан)** +**Подход 1 - в лоб** ==(не доделан)== Попробуем рассмотреть классы эквивалентности по Майхиллу-Нероде для регулярного языка $L$. @@ -81,7 +81,7 @@ $$\rho a bbb^*a ((\rho a \mid \varepsilon)bbb^*a)^* \mid bbb^*a(\rho a|\varepsil | | | | | | Построенные классы эквивалентности, соответсвуют минимальному ДКА, распознающему язык $L$, поэтому построим его в явном виде. -```dot +``` digraph{ rankdir=LR; node[shape=circle] @@ -93,6 +93,8 @@ digraph{ } ``` +==Данный подход не дописан== + **Подход 2 - пересечение автоматов** Вместо того, чтобы в лоб строить КЭ для языка, и страдать просчитывая переходы между всеми его состояниями, можно построить отдельно автомат для $L_1$ и $\overline L_2$. После чего нужно преобразовать состояния для автомата $L_2$. И найти пересечение двух автоматов. @@ -190,7 +192,7 @@ digraph{ } ``` -Теперь необходимо построить автомат, соответствующий пересеченению языков. Это можно сделать по классическому алгоритму. Оба автомата имеют 8 состояний, тогда пересечение будет иметь не более $8^2$ состояний - фактически 20 состояний без минимизации. +Теперь необходимо построить автомат, соответствующий пересеченению языков. Это можно сделать по классическому алгоритму. Оба автомата имеют 8 состояний, тогда пересечение будет иметь не более $8^2$ состояний - фактически 20 состояний без минимизации. ```dot digraph{ @@ -282,10 +284,80 @@ digraph{ - для всех недостроенных состояний строится переход по символу, между парами состояний автоматов - финальными помечаются только те пары, которые состоят из финальных состояний этих двух автоматов. +Стоит отметить, что состояние-ловушка позволила убрать большое число состояний, так как если один из автоматов попал в состояние ловушку, автомат-пересечение никогда не достигнет финального состояния. Поэтому данный автомат можно уменьшить еще сильнее, если убрать ветвь начинающуюся с состояния $1,1$, так как по графу видно, что из нее нельзя достигнуть ни одного финального состояния. Поэтому оптимизированный автомат будет выглядеть следующим образом. +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + A43, A47, A16[shape=doublecircle] + + point -> A00 + A00 [label="0,0"] + A44 [label="4,4"] + A51 [label="5,1"] + A45 [label="4,5"] + A61 [label="6,1"] + A56 [label="5,6"] + A42 [label="4,2"] + A66 [label="6,6"] + A43 [label="4,3"] + A27 [label="2,7"] + A36 [label="3,6"] + A25 [label="2,5"] + A47 [label="4,7"] + A16 [label="1,6"] + + A00 -> E[label=a] + E -> E [label="a,b"] + + A00 -> A44[label=b] + + A44 -> A51 [label=a] + A44 -> A45 [label=b] + + A51 -> A61 [label=a] + A51 -> E [label=b] + + A45 -> A56 [label=a] + A45 -> A45 [label=b] + + A61 -> A61 [label=a] + A61 -> A42 [label=b] + + A56 -> A66 [label=a] + A56 -> A27 [label=b] + + A42 -> A51 [label=a] + A42 -> A43 [label=b] + + A66 -> A66 [label=a] + A66 -> A47 [label=b] + + A43 -> A51 [label=a] + A43 -> A43 [label=b] + + A27 -> A36 [label=a] + A27 -> A25 [label=b] + + A36 -> A16 [label=a] + A36 -> E [label=b] + + A25 -> A36 [label=a] + A25 -> A25 [label=b] + + A47 -> A56 [label=a] + A47 -> A45 [label=b] + + A16 -> A16 [label=a] + A16 -> A27 [label=b] +} +``` + Данный язык не является конечным, так как данный автомат принимает например слова $baabbb^*$, которые также соответствуют условию. ### 3. Язык всех не завершающихся систем переписывания строк из одного правила. Алфавит: ${f,g, \to}$. -Для длинны накачки n рассмотрим $w = f^ng^n \to f^ng^n$. +Для длинны накачки $n$ рассмотрим $w = f^ng^n \to f^ng^n$. В общем случае не завершается, так как либо нельзя применить правило, либо можно применять сколько угодно раз. При накачке левой части отдельно от правой, система становится завершающейся При отрицательной накачке правой части, также завершается, так как число нетерминалов уменьшается. 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 6.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 6.md" index 8e55926..1681562 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 6.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 6.md" @@ -50,8 +50,6 @@ B -> bB | ε ``` Так допустимо, так как образы гомоморфизма комутативны, то есть можно спокойно перемещать так как необходимо и нужно учитывать только количество. Поэтому структуру последовательных слов преобразуем в комутативную ей скобочную структуру. $$S \to aS\underbrace{aa}_{h(a)}\underbrace{aa}_{h(a)} \mid bS\underbrace{a}_{h(b)}\underbrace{a}_{h(b)} \mid T$$ - - ### 3. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. В-первых, определим как задается язык деревьев арифметических выражений, вычисляющих простое число $p$. В листьях может быть одноразрядные числа $0,1,2,3,4,5,6,7,8,9$. @@ -66,7 +64,7 @@ $$+(X,Y) = +(Z, Y) \Leftrightarrow X = Z$$ $$*(X,Y) = *(Z,Y) \Leftrightarrow X = Z$$ >[!note] Излишнее рассуждение о том, что мы не можем ввести другое отношение эквивалентности на вычисляющих деревьях ->Пусть мы задали какое-то другое отношение эквивалентности, отличное от построенного ранее. Обозначим как $\operatorname{eqv}$, тогда существуют такие X,Y, что +>Пусть мы задали какое-то другое отношение эквивалентности, отличное от построенного ранее. Обозначим как $\operatorname{eqv}$, тогда существуют такие $X,Y$, что >$$\begin{matrix} X \neq Y \text{ и } X \operatorname{eqv} Y\space (1)\\ \text{ или }\\ @@ -82,4 +80,4 @@ X = Y \text{ и не } X \operatorname{eqv} Y \space (2) > ассоциативность > $$f(x, f(z,a)) = f(y, f(z,a))$$ > $$f(x,b) = f(y,b)$$ -> Причем, мы так можем сделать для любого a, таким образом мы получаем, что все множество значений разбивается на 2 класса эквивалентности(так как $x\neq y$): для которых $f(x,z) = f(y,z)$ и для которых не выполнено это равенство. Но если это равенство не выполнено, то не выполнено определение эквивалентных поддеревьев. Соответственно для любых элементов выполено равенство, из чего следует равенство x,y. Так как мы воспользовались только свойством ассоциативности бинарной операции, то это свойство будет выполняться для любых вычисляющих деревьев в полугруппах. +> Причем, мы так можем сделать для любого $a$, таким образом мы получаем, что все множество значений разбивается на 2 класса эквивалентности(так как $x\neq y$): для которых $f(x,z) = f(y,z)$ и для которых не выполнено это равенство. Но если это равенство не выполнено, то не выполнено определение эквивалентных поддеревьев. Соответственно для любых элементов выполено равенство, из чего следует равенство $x,y$. Так как мы воспользовались только свойством ассоциативности бинарной операции, то это свойство будет выполняться для любых вычисляющих деревьев в полугруппах. From 72da310f0446f3f2105952bd8514ea3117a98efa Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Mon, 26 Jan 2026 15:12:54 +0300 Subject: [PATCH 17/19] task 2.3 fixes --- ...\200\320\270\320\260\320\275\321\202 2.md" | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 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 2.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 2.md" index 29ad2c7..87cfcb0 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 2.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 2.md" @@ -156,7 +156,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ Очевидно, что если язык не КС, то нам нужно рассмотреть случай, когда при накачках будет справедливо только первое условие, то есть $v = w^R$. Для построения контрпримера проанализируем слово из рассуждения о нерегулярности языка. В слове $ab a^2 b^{n} a b^n a^2$ двойная $a$ заякоривала начало подслова $z^R$, что мы можем использовать в построении контрпримера. Также используем явление, что при увеличении количества $b$ мы их не можем переместить в подслово $z^R$. Чтобы из контрпримера для регулярности построить контрпример для контекстной свободы увеличим число $b$ в подслове $w$. -Хорошо подойдет слово $\omega = \underbrace{ab^n}_w \underbrace{a^2 b^n}_{z^R} \underbrace{b^n a}_v \underbrace{b^n a^2}_{z}$ +Хорошо подойдет слово $w = \underbrace{ab^n}_w \underbrace{a^2 b^n}_{z^R} \underbrace{b^n a}_v \underbrace{b^n a^2}_{z}$ Рассуждение почему не допустимы другие разбиения будет почти полностью повторять рассуждение из док-ва нерегулярности языка, поэтому мы его опустим. Кроме того, для ограничения количество накачек нам необходимо ограничить регулярную структуру языка. @@ -189,7 +189,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ > Теперь нужно перебрать накачки каждой области и накачки всех пересечений областей. > Если мы накачиваем положительно отдельно $p_1$, то мы не сможем в второй части слова найти соответсвующее обращение слова. > Если мы накачиваем отдельно $p_3$, то не получится найти соответствующее количество символов в начале слова. -> Если мы накачиваем $p_4$, то мы не сможем найти достаточного количества символов в обращении, и аналогично происходит с $p_2$. +> Если мы накачиваем $p_4$, то мы не сможем найти достаточного количества символов в обращении, и аналогично происходит с $p_2$. Более того, так как количества $p_2$ и $p_4$ связаны, но ограничены разными символами ($a...b$ для $p_2$ и $a...a$ для $p_4$), то это ограничивает возможность иной интерпретации подслов при последующей накачки - то ест ситуации, когда из-за накачки, разбиение на подслова перестроится, из-за чего возможно будет вхождение слова в язык. > Теперь рассмотрим перекрестные накачки. > Накачка $p_1p_2$ аналогично накачкам отдельно $p_1$ и $p_2$, так как мы при накачке не сможем найти необходимое количество символов в второй части слова. > Накачка $p_2,p_3$ дает нам разбалансировку по количествам с $p_1,p_4$. @@ -204,7 +204,7 @@ $$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ Если там идет $b$, то мы не сможем его поглотить с помощью $v$. А если после нам попадется $a$ то мы посчитаем, что это начало $v$ и сможем прочитать, что угодно после прочитанной $a$. Таким образом, самое экономное представление подслова $z$ будет иметь следующий вид $b^n (a|b)^2$, а слово будет принимать вид -$$w \underbrace{(a|b)^2 b^n}_{z^R} v \underbrace{b^n (a|b)^2}_z$$ +$$w =\underbrace{(a|b)^2 b^n}_{z^R} v \underbrace{b^n (a|b)^2}_z$$ Теперь необходимо посмотреть на то, как выбор заякоривания влияет на остальные подслова. Пусть заякоривание $ab$. Тогда вероятнее всего, что минимальное подслово $w$ будет иметь вид $b^*a^*$, так как он убирает возможность нахождения $ab$. Аналогично получаем регулярные структуры для остальных заякориваний. @@ -218,9 +218,11 @@ z= bb \implies w= a^*(ba+)^*?b Как было отмечено выше, если после подслова $z^R$ мы встречаем букву $a$, то подслово $v$ мы можем распарсить без контекстно-зависимых ограничений с $w$, что для построение контрпримера нам не подойдет. -Поэтому для построения контпримера к накачке наилучшим образом подходят заякоривания $aa,ab$. Заякоривание $ba$, при обращении $w$ не даст нам контекстно зависимых ограничений. У заякоривания $bb$ проблема другая - так как $z^R = b^2 b^n$ то мы получаем очень большое количество кандидатов для заякоривания, тем самым мы сильно усложним доказательство, поэтому такой вариант рассматривать крайне не рекомендуется. +Поэтому для построения контпримера к накачке наилучшим образом подходят заякоривания $aa,ab$. Заякоривание $ba$, при обращении $w$ не даст нам контекстно зависимых ограничений. У заякоривания $bb$ проблема другая - так как $z^R = b^2 b^n$ то мы получаем очень большое количество кандидатов для заякоривания, тем самым мы сильно усложним доказательство, поэтому такой вариант рассматривать крайне не рекомендуется. С другой стороны если $z^R = b^2 a^*$, то тогда не будет ограничений на структуру $v$, что также не даст контекстной зависимости. Теперь рассмотрим каждый случай заякоривания. + +**Заякоривание аа** Для заякоривания $aa$, имеем $$b^*(ab^+)^* ?a a^2 b^n \underbrace{...}_v b^n a$$ Очевидно, что мы не можем ставить $?a$ в слово, так как тогда мы не получим контекстных зависимостей на $v$. @@ -235,18 +237,25 @@ $$b^k a^2 b^n b^k b^n a$$ $$\underbrace{b^{k_1} ab^{k_2}}_{w} \underbrace{a^2}_z b^n b^{k_2} a b^{k_1} b^{n} \underbrace{a^2}_{z^R}$$ Если мы возьмем $k_2$ фиксированным, например $k_2 = 1$, тогда получим слово $$b^{k_1} ab a^2 b^n b a b^{k_1} b^{n} a^2$$ -Которое имеет структуру схожей с структурой -$$a^{n} b a^{k} b a^n b a^{k}$$ -А это нам уже дает контекстную зависимость, что и требовалось найти. +Рассмотрим возможные разбиения данного слова на подслова. Очевидно, что пары $a^2$ все также ограничивают $z$ подслова в последовательности, и все что ранее будет отнесено к $w$ +$$\underbrace{b^{k_1} ab}_w \underbrace{a^2}_z b^n b a b^{k_1} b^{n} \underbrace{a^2}_{z^R}$$ +Но в дальнейшем можно избежать ограничений на структуру $v$, если расширить $z$ до $a^2 b^{n+1}$, в этом ничего не ограничивает нас, так как символы этих подслов совпадают, тем самым контрпример не работает. + +Чтобы контрпример заработал, нужно ограничить возможность расширить подслово $z$ до определенной длины. Это можно сделать, ограничив разными символами подслова. + +Простой мыслью является добавить символ $a$ к первому вхождению $a^2$ и перед последним вхождением $b^n$, но это сделает разбиение на подслова снова плавающим. Рассмотрим почему. +$$b^{k_1} aba aa b^n b a b^{k_1} b^{n} a^2$$ +В данном случае также присутствует заякоривание, но оно может иметь 2 вариации в подслове $a^3$. Если заякоривание влияет на первые 2 буквы a, то все ломается - скидываем все лишние буквы в v и радуемся. Точнее грустим, так как это не дало никакой новой информации. -Кроме этого можно было занулить $k_1$ и сделать несколько итераций $ab^+$ получив случай, который мы рассматривали в доказательстве контексной-зависимости. +Второй вариант - добавить символ $a$ в начало слова и середину слова, что уже дает рабочий контрпример, разобранный выше +**Заякоривание ab** Теперь рассмотрим заякоривание $ab$. $$ a^* b^* ba b^n \underbrace{...}_v b^n ab$$ Для данного случая намного проще построить возможное слово $$a^{k_1} b^{k_2} ba b^n b^{k_2} a^{k_1} b^n ab$$ Для данного слова, чтобы получить контекстную зависимость, мы должны потребовать, что $k_2=const$, иначе мы получим комутативную накачку $b^{k_2}$ и $b^n b^{k_2}$. -Но если мы возьмум такой случай, то тогда мы опять получим отсутсвие контекстных зависимостей на $v$, так как мы сможем взять второе вхождение подслова $ba$ внутри $b^na^k$ как заякоривание. +Но если мы возьмем такой случай, то тогда мы опять получим отсутсвие контекстных зависимостей на $v$, так как мы сможем взять второе вхождение подслова $ba$ внутри $b^na^k$ как заякоривание. $$a^{k} ba b^n a^{k} b^n ab$$ -Тем самым мы получили, что для доказательства контексной зависимости языка подходит только 2 контрпримера с одинаковой структурой $w z w^R z^R$. \ No newline at end of file +Заякоривания через $ba$ будет иметь схожие проблемы при построении. А заякоривание $bb$ элементарно было отброшено в самом начале рассуждений. Поэтому на данный момент подходит только 1 контрпример. Возможно, контрпример не единственный, но наиболее вероятно, что другие будут построены по той же схеме. \ No newline at end of file From c48287df5d0a0526a593b21c12cefe9892e8995c Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Thu, 5 Feb 2026 12:12:50 +0300 Subject: [PATCH 18/19] fix --- ...0\260\321\200\320\270\320\260\320\275\321\202 1.md" | 10 +++++----- ...0\260\321\200\320\270\320\260\320\275\321\202 6.md" | 4 ++++ 2 files changed, 9 insertions(+), 5 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 1.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 1.md" index 8ce4054..e2f7ffe 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 1.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 1.md" @@ -78,12 +78,12 @@ B &\to Ba \mid ab Заметим, что нетерминал $B$ порождает регулярный язык $aba^*$, что не сложно увидеть, если рассмотреть порождаемые слова, или заметить, что нетерминал B задает леворекурсивный вывод и поэтому можно воспользоваться правилом преобразования леворекурсивного вывода. Таким образом $$B = aba^*$$ Нетерминал $T$ - праворекурсивный, таким образом нетерминал $T$ порождает язык: -$$T = b^*a?(S)$$ +$$T = b^*a(S)?$$ Теперь нам нужно рассмотреть язык, порождаемый нетерминалом $S$. Раскроем по ранее полученным замечаниям нетерминалы $B$ и $T$ в правилах переписывания $S$. $$S \to bTaT \mid BB;$$ -$$S \to b\underbrace{b^*a?(S)}_Ta\underbrace{b^*a?(S)}_T \mid \underbrace{aba^*}_B\underbrace{aba^*}_B$$ +$$S \to b\underbrace{b^*a(S)?}_Ta\underbrace{b^*a(S)?}_T \mid \underbrace{aba^*}_B\underbrace{aba^*}_B$$ Таким образом, мы получили, что наш язык можно записать в форме расширенной грамматики с одним нетерминалом: -$$S \to bb^*a?(S)ab^*a?(S)\mid aba^*aba^*$$ +$$S \to bb^*a(S)?ab^*a(S)?\mid aba^*aba^*$$ Теперь построим по расширенной грамматике NPDA. Построим его по методу ограничения правил раскрытия%%не знаю, можно ли его прям считать методом и работает ли он в всех случаях%%. Сначала построим НКА для языка $S \to aba^*aba^*$. @@ -123,7 +123,7 @@ digraph{ Несложно понять, что язык при этой замене не поменялся. Допустимо произвести такую замену, так как $a^*$ и $a$ состоят из одного и того же символа $a$. Теперь вернемся к первому правилу промежуточной грамматики. Раскрытие по второму правилу всегда будет финальным. Первое же правило порождают язык схожий по структуре с языков правильных скобочных последовательностей. Пусть $L \to bb^*a, R \to ab^*a$, тогда -$$S \to L?(S)R?(S)$$ +$$S \to L(S)?R(S)?$$ порождает язык правильных скобочных последовательностей. Для этого языка можно построить следующий NPDA: ```dot digraph{ @@ -140,7 +140,7 @@ digraph{ } ``` Теперь расширим язык возможностью присутствия $E$ внутри правильных скобочных последовательностей или после. -$$S \to L?(S)R?(S) \mid E$$ +$$S \to L(S)?R(S)? \mid E$$ Для построения PDA заметим следующее правило: в слове после символа $E$ либо ничего не стоит, либо стоит закрывающая скобка. Докажем это. Пусть мы прочитали суффикс $\varphi$ и находимся на глубине вложенности $n$. После суффикса идет $E$. Пусть мы раскрылись в $E$ через первую $S$ в первом правиле раскрытия. Тогда после должно идти $R$ без исключений. Пусть мы раскрылись по второй $S$ в $E$. Тогда после $E$ могут идти символы, которые могут идти после $S$, а для данной грамматики это либо $R$ либо конец слова. Что и требовалось доказать. Из полученного нами утверждения построим PDA для этой промежуточной грамматики. ```dot 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 6.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 6.md" index 1681562..99b70fe 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 6.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 6.md" @@ -81,3 +81,7 @@ X = Y \text{ и не } X \operatorname{eqv} Y \space (2) > $$f(x, f(z,a)) = f(y, f(z,a))$$ > $$f(x,b) = f(y,b)$$ > Причем, мы так можем сделать для любого $a$, таким образом мы получаем, что все множество значений разбивается на 2 класса эквивалентности(так как $x\neq y$): для которых $f(x,z) = f(y,z)$ и для которых не выполнено это равенство. Но если это равенство не выполнено, то не выполнено определение эквивалентных поддеревьев. Соответственно для любых элементов выполено равенство, из чего следует равенство $x,y$. Так как мы воспользовались только свойством ассоциативности бинарной операции, то это свойство будет выполняться для любых вычисляющих деревьев в полугруппах. + +Стоит сказать, что такой вывод об эквивалентности работает далеко не всегда. Например, если бы вычислялись четные выражения с теми же самыми структурами, то язык был бы древесным, так как можно выделить лишь 2 класса эквивалентности: четные и нечетные подвыражения, и на основе этих данных можно делать вывод о четности их суммы или произведения. Аналогично, можно расширить на другие остатки от деления. + +Почему нельзя представить другую факторизацию чисел, то есть перейти к гомоморфизму в другую полугруппу, в которой все будет работать? ==Для обоснования этого можно привести== From 7da5ac94afa97d4410816f981d351cd505712bf5 Mon Sep 17 00:00:00 2001 From: Denis Kochetkov Date: Thu, 5 Feb 2026 12:29:41 +0300 Subject: [PATCH 19/19] fix prime trees --- ...20\222\320\260\321\200\320\270\320\260\320\275\321\202 6.md" | 2 ++ 1 file changed, 2 insertions(+) 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 6.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 6.md" index 99b70fe..4f7b78f 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 6.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 6.md" @@ -85,3 +85,5 @@ X = Y \text{ и не } X \operatorname{eqv} Y \space (2) Стоит сказать, что такой вывод об эквивалентности работает далеко не всегда. Например, если бы вычислялись четные выражения с теми же самыми структурами, то язык был бы древесным, так как можно выделить лишь 2 класса эквивалентности: четные и нечетные подвыражения, и на основе этих данных можно делать вывод о четности их суммы или произведения. Аналогично, можно расширить на другие остатки от деления. Почему нельзя представить другую факторизацию чисел, то есть перейти к гомоморфизму в другую полугруппу, в которой все будет работать? ==Для обоснования этого можно привести== + +Возьмем подмножество деревьев только из 1 и сложений, вычисляющих простые числа. Очевидно, что если взять 2 дерева, вычисляющих $x < y$ - простые числа, то $x$ - поддерево $y$, причем $y$ линейно зависит от значения поддерева $x$, то есть пожно представить как $y = x + b$. Так как мы полагаем, что они принадлежат одному классу эквивалентности, то справедливо $z = y+ b = x+ 2b$ - также простое. Если провести соответствующую накачку $x$ раз, то получим $z = x + xb = x(1 + b)$ - очевидно составное число. Получаем противоречие $\implies$ бесконечное число классов эквивалентности в силу общности рассуждения относительно двух простых чисел и бесконечного количества простых чисел $\implies$ не древесно-автоматный язык. \ No newline at end of file