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..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" @@ -1,16 +1,383 @@ -### 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} -$$ +### 1. Язык чисел в системе счисления с основанием 4, делящихся на 5. +Входной алфавит: $\{0,1,2,3\}$ +Состояния: остатки от 0 до 4. + +**Идея @BaldiSlayer** +> Пусть $A$ - основание системы счисления, $B$ - остаток от деления на который мы смотрим. +> Состояния описывают текущий остаток от деления на $B$ (для произвольной задачи такого вида) +> Переходы по $k$ для состояния $q$ определяются следующей формулой: +> $$q' = (q * A + k) \mod B$$ +> Выделяем финальными состояниями те, которые необходимы принимающими в языке(в зависимости от того, какой требуется остаток от деления): +> - Если требуется, чтобы числа делились выделяем финальным только состояние 0 +> - Если требуется, чтобы числа **не** делились, выделяем финальным все, кроме 0 +> - В остальных случаях выделяем те остатки, которые нам необходимы +> В качестве стартового выделяем состояние 0. +> Построение ДКА для произвольных параметров на Python для задач "числа, (не)делящиеся на B"(выводит на языке Graphviz): + +ДКА для данной задачи: +```dot +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] + 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} +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 + + 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] + 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} +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] + point[shap=point] + f [shape=doublecircle] + + point -> S + + 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/."] +} +``` + + +Эквивалентный ему NPDA +```dot +digraph{ + rankdir=LR + node[shape=circle] + point[shape=point] + F [shape=doublecircle] + + START + S + T + 0 + + point -> START + + 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_1, p_2$ при положительной накачке выйдем из языка, так как lookahead станет больше чем регулярка, с которой сравниваем, то есть даст пустое слово. +- для $p_3, p_4$ отрицательная накачка выводит из языка, так как образец lookahead становится больше чем регулярка + +При накачке $p_1p_2$ или $p_3p_4$ аналогично +При накачке $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^*\}$ +Докажем, что он не КС с помощью леммы о накачке для КС языков. Пусть 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$ больше до разделителя $c$, чем после. Таким образом мы получили, что слово нельзя накачать язык не КС. + +**Третий способ (через стратифицированные периоды)** +Произведем начальные преобразования как в втором способе. Докажем, что язык $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^*$ -#пустой \ No newline at end of file +Рассмотрим соотношения количеств между промежутками +$$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 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..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" @@ -1 +1,261 @@ -#пустой \ No newline at end of file +# 1. Выражение $(?= ba^*(bb\mid aa)^* (?<= a^* ba^*) aa^*ba)(aba \mid ba^*bb)^*$ + +Рассмотрим сначала выражение внутри lookbehind проверки. Эту проверку очевидно можно упростить: +$$ba^*(bb\mid aa)^* (?<= \cancel{a^*}ba^*) = ba^*(bb\mid aa)^* (?<= ba^*)$$ +Так как при переписывании по определению [[lookbehind]] эту часть можно жадно съесть с помощью $.^*$ +Поэтому мы получим следующее раскрытие: +$$\begin{aligned} +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{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)^*$$ +2)Очевидно, что по $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$ и там и там +$$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)^*$$ +6)Красную часть, совпадающую и там и там, можем вынести. +$$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$. +$$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 \\ +\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 &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}$$ +Перепишем граматику с альтернативами +$$\begin{aligned} +&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 Dca \mid b +\end{aligned}$$ +Проанализируем структуру грамматики - какие нетерминалы в какие переписываются. Построим граф +```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$ и $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$ заменим позже. + +Теперь рассмотрим пару нетерминалов $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^*)^+)\}$ +Перед анализом языка заметим, что регулярное условие в нем можно упростить: +$$(ab^*)^+ = ab^*(ab^*)^* = a(a|b)^*$$ +Таким образом $v$ - это либо обращение $w$, либо любое слово начинающееся с $a$. + +Очевидно, что язык не является VPL, так как нельзя предъявить разбиение алфавита на вызывающие и возвращающие символы. +И точно можно получить, что язык не регулярный, так как $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$. Поэтому мы не можем разбить это слово, и следовательно оно не принадлежит языку. Поэтому делаем вывод, что это слово нельзя накачать, и язык, полученный после пересечения с регулярным, не является регулярным. А из этого следует, что и исходный язык тоже не регулярный, так как класс регулярных языков замкнут по операции пересечения. + +Необходимо проверить, является ли язык КС. Для этого воспользуемся леммой о накачке для КС языков. + +Очевидно, что если язык не КС, то нам нужно рассмотреть случай, когда при накачках будет справедливо только первое условие, то есть $v = w^R$. Для построения контрпримера проанализируем слово из рассуждения о нерегулярности языка. +В слове $ab a^2 b^{n} a b^n a^2$ двойная $a$ заякоривала начало подслова $z^R$, что мы можем использовать в построении контрпримера. Также используем явление, что при увеличении количества $b$ мы их не можем переместить в подслово $z^R$. +Чтобы из контрпримера для регулярности построить контрпример для контекстной свободы увеличим число $b$ в подслове $w$. +Хорошо подойдет слово $w = \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_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$. +> И аналогично для $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$ то мы получаем очень большое количество кандидатов для заякоривания, тем самым мы сильно усложним доказательство, поэтому такой вариант рассматривать крайне не рекомендуется. С другой стороны если $z^R = b^2 a^*$, то тогда не будет ограничений на структуру $v$, что также не даст контекстной зависимости. + +Теперь рассмотрим каждый случай заякоривания. + +**Заякоривание аа** +Для заякоривания $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 можно свести к случаю одной итерации. + +Тогда получаем слово +$$\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^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 и радуемся. Точнее грустим, так как это не дало никакой новой информации. + +Второй вариант - добавить символ $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$ как заякоривание. +$$a^{k} ba b^n a^{k} b^n ab$$ + +Заякоривания через $ba$ будет иметь схожие проблемы при построении. А заякоривание $bb$ элементарно было отброшено в самом начале рассуждений. Поэтому на данный момент подходит только 1 контрпример. Возможно, контрпример не единственный, но наиболее вероятно, что другие будут построены по той же схеме. \ 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 6bd9135..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" @@ -1,7 +1,365 @@ ### 1. Язык тождественно истинных логических формул без скобок, со связками только V, & и ¬ (с обычным приоритетом операций) и константами Т, F. +Язык действительно регулярный, так как не рассматривает вложенных структур. +Язык можно описать следующим образом: +- слова - конкатенация через $\vee$ логических формул, среди которых есть хотя бы одна истинная +- Истинная логическая формула - конкатенация истин через $\&$ +- Истина - T или четное число отрицаний +- Логическая формула - конкатенация через $\&$ логических единиц = T или F перед которыми произвольное число отрицаний -### 2. Язык $$\{w | |w|_{ab} = |w|_{baa} \& |w|_{abb} \& |w|_{bba} \& w \in \{a, b\}^+\}$$. +Таким образом можно рекурсивно определить регулярное выражение +$$\begin{aligned} +&L = (\text{} V)^* \text{} (V\text{})^*\\ +&\text{} = \text{} (\& \text{})^* \\ +&\text{} = ¬^* (T|F) \\ +\implies\\ +&\text{} = ¬^* (T|F) (\& ¬^* (T|F)) \\ +&\text{} = \text{} (\& \text{})^*\\ +&\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}\}$ +Внутри этого языка лежат все слова состоящие только из $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_1$ - регулярный. +Теперь рассмотрим язык $L_2 = \{w \mid |w|_{abb} \neq |w|_{bba}\}$ + +Дополнение к нему можно легко построить, и оно будет регулярным. +$$\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$. После него может идти $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$ также будет **регулярным языком**. +Теперь нужно построить распознаватель данного языка. + +**Подход 1 - в лоб** ==(не доделан)== + +Попробуем рассмотреть классы эквивалентности по Майхиллу-Нероде для регулярного языка $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$, поэтому построим его в явном виде. +``` +digraph{ + rankdir=LR; + node[shape=circle] + point[label="", shape=point] + + S[label="00"] + + point -> S +} +``` + +==Данный подход не дописан== + +**Подход 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,1,2,4,5[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] +} +``` + +Теперь для построения автомата распознающего $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] + + A16 -> A16 [label=a] + A16 -> A27 [label=b] +} +``` +Данный автомат был построен по простому алгоритму: +- начинают 2 автомата в состояниях 0,0 +- для всех недостроенных состояний строится переход по символу, между парами состояний автоматов +- финальными помечаются только те пары, которые состоят из финальных состояний этих двух автоматов. + +Стоит отметить, что состояние-ловушка позволила убрать большое число состояний, так как если один из автоматов попал в состояние ловушку, автомат-пересечение никогда не достигнет финального состояния. Поэтому данный автомат можно уменьшить еще сильнее, если убрать ветвь начинающуюся с состояния $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}$. -#пустой \ No newline at end of file +Для длинны накачки $n$ рассмотрим $w = f^ng^n \to f^ng^n$. +В общем случае не завершается, так как либо нельзя применить правило, либо можно применять сколько угодно раз. +При накачке левой части отдельно от правой, система становится завершающейся +При отрицательной накачке правой части, также завершается, так как число нетерминалов уменьшается. +При отрицательной накачке перекрестной, число f уменьшается, поэтому система переписывания рано или поздно закончится. +Следовательно, по лемме о накачке язык не КС. 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..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" @@ -1,5 +1,89 @@ -### 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] + point[shape=point] + F[shape=doublecircle] + + point -> S + + 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 -> 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. Язык деревьев арифметических выражений с операциями бинарного сложения и умножения, а также одноразрядными числами, таких, что они вычисляют простое число. +В-первых, определим как задается язык деревьев арифметических выражений, вычисляющих простое число $p$. +В листьях может быть одноразрядные числа $0,1,2,3,4,5,6,7,8,9$. +В ветвях может быть только $+(T1, T2)$ и $*(T1, T2)$. + +Очевидно, что на поддеревьях естественно возникает отношение эквивалентности по равенству значений, которые они вычисляют. Это соответствует определению эквивалентности, так как мы можем поменять любые поддеревья, вычисляющие одинаковое число местами и общий результат арифметического выражения не изменится. Более того, такое отношение эквивалентности возникает для любых вычисляющих деревьев: будь то деревья булевой алгебры или другие. + +В соответствии с этим, мы получаем счетное число классов эквивалентности, поэтому по теореме Майхилла-Нероуда этот язык **не будет древесно-автоматным.** + +Почему нельзя задать другое отношение эквивалентности? Полученное нами отношение эквивалентности естественно возникает из того, что деревья являются вычисляющими. Так рассмотрим операции, и проверим, когда они будут равны. +$$+(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$. Так как мы воспользовались только свойством ассоциативности бинарной операции, то это свойство будет выполняться для любых вычисляющих деревьев в полугруппах. + +Стоит сказать, что такой вывод об эквивалентности работает далеко не всегда. Например, если бы вычислялись четные выражения с теми же самыми структурами, то язык был бы древесным, так как можно выделить лишь 2 класса эквивалентности: четные и нечетные подвыражения, и на основе этих данных можно делать вывод о четности их суммы или произведения. Аналогично, можно расширить на другие остатки от деления. + +Почему нельзя представить другую факторизацию чисел, то есть перейти к гомоморфизму в другую полугруппу, в которой все будет работать? ==Для обоснования этого можно привести== -#пустой \ No newline at end of file +Возьмем подмножество деревьев только из 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 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