Дан регулярный язык L, описанный выражением '(ab|a)*b' — постройте эквивалентный детерминированный конечный автомат (DFA) на словесном уровне и объясните, как вы проверяете членство слова в L
Регулярное выражение: (ab∣a)∗b (ab|a)^* b (ab∣a)∗b. DFA (словесно и формально): - Множество состояний: Q={q0,q1,q2,q3,qd}Q=\{q_0,q_1,q_2,q_3,q_d\}Q={q0,q1,q2,q3,qd}. - Начальное состояние: q0q_0q0. - Допускающие состояния: F={q2,q3}F=\{q_2,q_3\}F={q2,q3}. - Интуитивный смысл состояний: - q0q_0q0 — на границе токенов (старт или сразу после целого блока), нет незавершённого «a». - q1q_1q1 — прочитана «a», она может быть либо отдельным блоком «a», либо началом блока «ab». - q2q_2q2 — текущее слово может быть уже принятым (существует разбор, где финальный bbb уже прочитан), но возможны дальнейшие корректные продолжения (то есть одновременно возможны варианты «ещё в цикле» и «уже закончено»). - q3q_3q3 — слово точно заканчивается на финальный bbb и дальнейшее чтение приведёт к провалу (финальный bbb однозначно использован). - qdq_dqd — мёртвое состояние (невозможный префикс). - Функция переходов (неполный список — остальные очевидны, переходы из qdq_dqd в qdq_dqd): - δ(q0,a)=q1\delta(q_0,a)=q_1δ(q0,a)=q1, δ(q0,b)=q3\delta(q_0,b)=q_3δ(q0,b)=q3. - δ(q1,a)=q1\delta(q_1,a)=q_1δ(q1,a)=q1, δ(q1,b)=q2\delta(q_1,b)=q_2δ(q1,b)=q2. - δ(q2,a)=q1\delta(q_2,a)=q_1δ(q2,a)=q1, δ(q2,b)=q3\delta(q_2,b)=q_3δ(q2,b)=q3. - δ(q3,a)=qd\delta(q_3,a)=q_dδ(q3,a)=qd, δ(q3,b)=qd\delta(q_3,b)=q_dδ(q3,b)=qd. - δ(qd,a)=qd\delta(q_d,a)=q_dδ(qd,a)=qd, δ(qd,b)=qd\delta(q_d,b)=q_dδ(qd,b)=qd. Как проверять членство слова w в LLL: 1. Положить текущее состояние =q0=q_0=q0. 2. Последовательно для каждой буквы ccc из www переходить в состояние δ(текущее,c)\delta(\text{текущее},c)δ(текущее,c). 3. После обработки всех символов: если текущее состояние принадлежит F={q2,q3}F=\{q_2,q_3\}F={q2,q3}, то w∈Lw\in Lw∈L, иначе w∉Lw\notin Lw∈/L. Короткие примеры: - "b""b""b": q0→bq3q_0 \xrightarrow{b} q_3q0bq3 — принимается. - "ab""ab""ab": q0→aq1→bq2q_0 \xrightarrow{a} q_1 \xrightarrow{b} q_2q0aq1bq2 — принимается. - "bb""bb""bb": q0→bq3→bqdq_0 \xrightarrow{b} q_3 \xrightarrow{b} q_dq0bq3bqd — не принимается. - "abb""abb""abb": q0→aq1→bq2→bq3q_0 \xrightarrow{a} q_1 \xrightarrow{b} q_2 \xrightarrow{b} q_3q0aq1bq2bq3 — принимается.
DFA (словесно и формально):
- Множество состояний: Q={q0,q1,q2,q3,qd}Q=\{q_0,q_1,q_2,q_3,q_d\}Q={q0 ,q1 ,q2 ,q3 ,qd }.
- Начальное состояние: q0q_0q0 .
- Допускающие состояния: F={q2,q3}F=\{q_2,q_3\}F={q2 ,q3 }.
- Интуитивный смысл состояний:
- q0q_0q0 — на границе токенов (старт или сразу после целого блока), нет незавершённого «a».
- q1q_1q1 — прочитана «a», она может быть либо отдельным блоком «a», либо началом блока «ab».
- q2q_2q2 — текущее слово может быть уже принятым (существует разбор, где финальный bbb уже прочитан), но возможны дальнейшие корректные продолжения (то есть одновременно возможны варианты «ещё в цикле» и «уже закончено»).
- q3q_3q3 — слово точно заканчивается на финальный bbb и дальнейшее чтение приведёт к провалу (финальный bbb однозначно использован).
- qdq_dqd — мёртвое состояние (невозможный префикс).
- Функция переходов (неполный список — остальные очевидны, переходы из qdq_dqd в qdq_dqd ):
- δ(q0,a)=q1\delta(q_0,a)=q_1δ(q0 ,a)=q1 , δ(q0,b)=q3\delta(q_0,b)=q_3δ(q0 ,b)=q3 .
- δ(q1,a)=q1\delta(q_1,a)=q_1δ(q1 ,a)=q1 , δ(q1,b)=q2\delta(q_1,b)=q_2δ(q1 ,b)=q2 .
- δ(q2,a)=q1\delta(q_2,a)=q_1δ(q2 ,a)=q1 , δ(q2,b)=q3\delta(q_2,b)=q_3δ(q2 ,b)=q3 .
- δ(q3,a)=qd\delta(q_3,a)=q_dδ(q3 ,a)=qd , δ(q3,b)=qd\delta(q_3,b)=q_dδ(q3 ,b)=qd .
- δ(qd,a)=qd\delta(q_d,a)=q_dδ(qd ,a)=qd , δ(qd,b)=qd\delta(q_d,b)=q_dδ(qd ,b)=qd .
Как проверять членство слова w в LLL:
1. Положить текущее состояние =q0=q_0=q0 .
2. Последовательно для каждой буквы ccc из www переходить в состояние δ(текущее,c)\delta(\text{текущее},c)δ(текущее,c).
3. После обработки всех символов: если текущее состояние принадлежит F={q2,q3}F=\{q_2,q_3\}F={q2 ,q3 }, то w∈Lw\in Lw∈L, иначе w∉Lw\notin Lw∈/L.
Короткие примеры:
- "b""b""b": q0→bq3q_0 \xrightarrow{b} q_3q0 b q3 — принимается.
- "ab""ab""ab": q0→aq1→bq2q_0 \xrightarrow{a} q_1 \xrightarrow{b} q_2q0 a q1 b q2 — принимается.
- "bb""bb""bb": q0→bq3→bqdq_0 \xrightarrow{b} q_3 \xrightarrow{b} q_dq0 b q3 b qd — не принимается.
- "abb""abb""abb": q0→aq1→bq2→bq3q_0 \xrightarrow{a} q_1 \xrightarrow{b} q_2 \xrightarrow{b} q_3q0 a q1 b q2 b q3 — принимается.