Рассмотрите регулярное выражение (a|b)*abb — опишите язык, постройте недетерминированный конечный автомат (NFA) и затем сведите его к минимальному детерминированному автомату (DFA)
Язык: - Регулярное выражение: (a∣b)∗abb (a|b)^*abb (a∣b)∗abb. - Язык L={w∈{a,b}∗∣w оканчивается на abb}L=\{w\in\{a,b\}^* \mid w\text{ оканчивается на }abb\}L={w∈{a,b}∗∣wоканчиваетсянаabb} — все строки над {a,b}\{a,b\}{a,b}, которые имеют суффикс «abb». NFA (недетерминированный КА): - Состояния Q={q0,q1,q2,q3}Q=\{q_0,q_1,q_2,q_3\}Q={q0,q1,q2,q3}, начальное q0q_0q0, принимающее q3q_3q3. - Переходы (без ε\varepsilonε-переходов): δ(q0,a)={q0,q1},δ(q0,b)={q0},δ(q1,a)=∅,δ(q1,b)={q2},δ(q2,a)=∅,δ(q2,b)={q3},δ(q3,a)=∅,δ(q3,b)=∅.
\begin{aligned} \delta(q_0,a)&=\{q_0,q_1\}, & \delta(q_0,b)&=\{q_0\},\\ \delta(q_1,a)&=\varnothing, & \delta(q_1,b)&=\{q_2\},\\ \delta(q_2,a)&=\varnothing, & \delta(q_2,b)&=\{q_3\},\\ \delta(q_3,a)&=\varnothing, & \delta(q_3,b)&=\varnothing. \end{aligned} δ(q0,a)δ(q1,a)δ(q2,a)δ(q3,a)={q0,q1},=∅,=∅,=∅,δ(q0,b)δ(q1,b)δ(q2,b)δ(q3,b)={q0},={q2},={q3},=∅.
- Интерпретация: q0q_0q0 реализует (a∣b)∗(a|b)^*(a∣b)∗ (петля по a,ba,ba,b) и недетерминированный переход по aaa в цепочку a − b − ba\!-\!b\!-\!ba−b−b через q1,q2,q3q_1,q_2,q_3q1,q2,q3. DFA (методом подмножеств) — построение иreachable множества: - Начальное состояние DFA: {q0}\{q_0\}{q0}. - Вычисляем переходы: δD({q0},a)={q0,q1},δD({q0},b)={q0};δD({q0,q1},a)={q0,q1},δD({q0,q1},b)={q0,q2};δD({q0,q2},a)={q0,q1},δD({q0,q2},b)={q0,q3};δD({q0,q3},a)={q0,q1},δD({q0,q3},b)={q0}.
\begin{aligned} \delta_D(\{q_0\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0\},b)&=\{q_0\};\\ \delta_D(\{q_0,q_1\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0,q_1\},b)&=\{q_0,q_2\};\\ \delta_D(\{q_0,q_2\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0,q_2\},b)&=\{q_0,q_3\};\\ \delta_D(\{q_0,q_3\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0,q_3\},b)&=\{q_0\}. \end{aligned} δD({q0},a)δD({q0,q1},a)δD({q0,q2},a)δD({q0,q3},a)={q0,q1},={q0,q1},={q0,q1},={q0,q1},δD({q0},b)δD({q0,q1},b)δD({q0,q2},b)δD({q0,q3},b)={q0};={q0,q2};={q0,q3};={q0}.
- Достижимые состояния DFA: {q0}, {q0,q1}, {q0,q2}, {q0,q3}\{q_0\},\ \{q_0,q_1\},\ \{q_0,q_2\},\ \{q_0,q_3\}{q0},{q0,q1},{q0,q2},{q0,q3}. Принимающее — любое множество, содержащее q3q_3q3, т.е. {q0,q3}\{q_0,q_3\}{q0,q3}. Удобно переименовать состояния: S0={q0},S1={q0,q1},S2={q0,q2},S3={q0,q3} (принимающее).
S_0=\{q_0\},\quad S_1=\{q_0,q_1\},\quad S_2=\{q_0,q_2\},\quad S_3=\{q_0,q_3\}\ (\text{принимающее}). S0={q0},S1={q0,q1},S2={q0,q2},S3={q0,q3}(принимающее).
Тогда таблица переходов DFA: abS0S1S0S1S1S2S2S1S3S3S1S0
\begin{array}{c|cc} & a & b\\\hline S_0 & S_1 & S_0\\ S_1 & S_1 & S_2\\ S_2 & S_1 & S_3\\ S_3 & S_1 & S_0 \end{array} S0S1S2S3aS1S1S1S1bS0S2S3S0 Минимизация DFA: - Разбиение по принимающим/непринимающим: {S3}\{S_3\}{S3} и {S0,S1,S2}\{S_0,S_1,S_2\}{S0,S1,S2}. - Проверка различимости внутри непринимающих: - У S2S_2S2 переход по bbb ведёт в S3S_3S3 (принимающее), у S0,S1S_0,S_1S0,S1 — нет, значит S2S_2S2 отделяется. - Далее S0S_0S0 и S1S_1S1 различны (переход по bbb: S0→S0S_0\to S_0S0→S0, S1→S2S_1\to S_2S1→S2 — в разные классы). - В результате получаем четыре класcа {S0},{S1},{S2},{S3}\{S_0\},\{S_1\},\{S_2\},\{S_3\}{S0},{S1},{S2},{S3} — автомат минимален и имеет 4 состояния (то есть DFA уже минимален). Итог (минимальный DFA): четыре состояния с переходами, приведёнными в таблице выше, начальное S0S_0S0, принимающее S3S_3S3. Этот автомат распознаёт язык всех слов, оканчивающихся на «abb».
- Регулярное выражение: (a∣b)∗abb (a|b)^*abb (a∣b)∗abb.
- Язык L={w∈{a,b}∗∣w оканчивается на abb}L=\{w\in\{a,b\}^* \mid w\text{ оканчивается на }abb\}L={w∈{a,b}∗∣w оканчивается на abb} — все строки над {a,b}\{a,b\}{a,b}, которые имеют суффикс «abb».
NFA (недетерминированный КА):
- Состояния Q={q0,q1,q2,q3}Q=\{q_0,q_1,q_2,q_3\}Q={q0 ,q1 ,q2 ,q3 }, начальное q0q_0q0 , принимающее q3q_3q3 .
- Переходы (без ε\varepsilonε-переходов):
δ(q0,a)={q0,q1},δ(q0,b)={q0},δ(q1,a)=∅,δ(q1,b)={q2},δ(q2,a)=∅,δ(q2,b)={q3},δ(q3,a)=∅,δ(q3,b)=∅. \begin{aligned}
\delta(q_0,a)&=\{q_0,q_1\}, & \delta(q_0,b)&=\{q_0\},\\
\delta(q_1,a)&=\varnothing, & \delta(q_1,b)&=\{q_2\},\\
\delta(q_2,a)&=\varnothing, & \delta(q_2,b)&=\{q_3\},\\
\delta(q_3,a)&=\varnothing, & \delta(q_3,b)&=\varnothing.
\end{aligned}
δ(q0 ,a)δ(q1 ,a)δ(q2 ,a)δ(q3 ,a) ={q0 ,q1 },=∅,=∅,=∅, δ(q0 ,b)δ(q1 ,b)δ(q2 ,b)δ(q3 ,b) ={q0 },={q2 },={q3 },=∅. - Интерпретация: q0q_0q0 реализует (a∣b)∗(a|b)^*(a∣b)∗ (петля по a,ba,ba,b) и недетерминированный переход по aaa в цепочку a − b − ba\!-\!b\!-\!ba−b−b через q1,q2,q3q_1,q_2,q_3q1 ,q2 ,q3 .
DFA (методом подмножеств) — построение иreachable множества:
- Начальное состояние DFA: {q0}\{q_0\}{q0 }.
- Вычисляем переходы:
δD({q0},a)={q0,q1},δD({q0},b)={q0};δD({q0,q1},a)={q0,q1},δD({q0,q1},b)={q0,q2};δD({q0,q2},a)={q0,q1},δD({q0,q2},b)={q0,q3};δD({q0,q3},a)={q0,q1},δD({q0,q3},b)={q0}. \begin{aligned}
\delta_D(\{q_0\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0\},b)&=\{q_0\};\\
\delta_D(\{q_0,q_1\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0,q_1\},b)&=\{q_0,q_2\};\\
\delta_D(\{q_0,q_2\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0,q_2\},b)&=\{q_0,q_3\};\\
\delta_D(\{q_0,q_3\},a)&=\{q_0,q_1\}, & \delta_D(\{q_0,q_3\},b)&=\{q_0\}.
\end{aligned}
δD ({q0 },a)δD ({q0 ,q1 },a)δD ({q0 ,q2 },a)δD ({q0 ,q3 },a) ={q0 ,q1 },={q0 ,q1 },={q0 ,q1 },={q0 ,q1 }, δD ({q0 },b)δD ({q0 ,q1 },b)δD ({q0 ,q2 },b)δD ({q0 ,q3 },b) ={q0 };={q0 ,q2 };={q0 ,q3 };={q0 }. - Достижимые состояния DFA: {q0}, {q0,q1}, {q0,q2}, {q0,q3}\{q_0\},\ \{q_0,q_1\},\ \{q_0,q_2\},\ \{q_0,q_3\}{q0 }, {q0 ,q1 }, {q0 ,q2 }, {q0 ,q3 }. Принимающее — любое множество, содержащее q3q_3q3 , т.е. {q0,q3}\{q_0,q_3\}{q0 ,q3 }.
Удобно переименовать состояния:
S0={q0},S1={q0,q1},S2={q0,q2},S3={q0,q3} (принимающее). S_0=\{q_0\},\quad S_1=\{q_0,q_1\},\quad S_2=\{q_0,q_2\},\quad S_3=\{q_0,q_3\}\ (\text{принимающее}).
S0 ={q0 },S1 ={q0 ,q1 },S2 ={q0 ,q2 },S3 ={q0 ,q3 } (принимающее). Тогда таблица переходов DFA:
abS0S1S0S1S1S2S2S1S3S3S1S0 \begin{array}{c|cc}
& a & b\\\hline
S_0 & S_1 & S_0\\
S_1 & S_1 & S_2\\
S_2 & S_1 & S_3\\
S_3 & S_1 & S_0
\end{array}
S0 S1 S2 S3 aS1 S1 S1 S1 bS0 S2 S3 S0
Минимизация DFA:
- Разбиение по принимающим/непринимающим: {S3}\{S_3\}{S3 } и {S0,S1,S2}\{S_0,S_1,S_2\}{S0 ,S1 ,S2 }.
- Проверка различимости внутри непринимающих:
- У S2S_2S2 переход по bbb ведёт в S3S_3S3 (принимающее), у S0,S1S_0,S_1S0 ,S1 — нет, значит S2S_2S2 отделяется.
- Далее S0S_0S0 и S1S_1S1 различны (переход по bbb: S0→S0S_0\to S_0S0 →S0 , S1→S2S_1\to S_2S1 →S2 — в разные классы).
- В результате получаем четыре класcа {S0},{S1},{S2},{S3}\{S_0\},\{S_1\},\{S_2\},\{S_3\}{S0 },{S1 },{S2 },{S3 } — автомат минимален и имеет 4 состояния (то есть DFA уже минимален).
Итог (минимальный DFA): четыре состояния с переходами, приведёнными в таблице выше, начальное S0S_0S0 , принимающее S3S_3S3 . Этот автомат распознаёт язык всех слов, оканчивающихся на «abb».