Równoważność DFA, NFA oraz RE

by Jerry Sky

2020-10-15



1. Fakt: Każdy DFA jest NFA


2. Twierdzenie#1

Niech LL będzie językiem akceptowanym przez NFA. Wówczas istnieje DFA akceptujący język LL.**

2.1. D-d

Niech

Q=2Qsˊledzimy wszystkie podzbiory stanoˊwMFQqFpqpFq0={q0}δ(q,a)=pqδ(p,a) \begin{aligned} Q' = 2^Q & \quad \text{śledzimy wszystkie podzbiory stanów} M\\ F' \subseteq Q' &\quad q \in F' \Leftrightarrow \exists p\in q \enspace p\in F\\ q_0' = \{q_0\}\\ \delta'(q,a) &= \bigcup_{p\in q} \delta(p,a) \end{aligned}

>Dowód indukcyjny po długości wczytywanego słowa.


2.2. Przykład NFA → DFA

Mamy NFA M=({q0,q1},{0,1},δ,q0,{q1})M = (\{q_0, q_1\}, \{0,1\}, \delta, q_0, \{q_1\}) | δ\delta | 00 | 11 | | ——– | ————– | ————– | | q0q_0 | {q0,q1}\{q_0, q_1\} | {q1}\{q_1\} | | q1q_1 | \emptyset | {q0,q1}\{q_0, q_1\} |

Równoważny DFA M=({{q0},{q1},{q0,q1},},{0,1},δ,{q0},{{q1}})M' = \left(\big\{ \{q_0\}, \{q_1\}, \{q_0, q_1\}, \emptyset \big\}, \{0,1\}, \delta', \{q_0\}, \big\{\{q_1\}\big\}\right) | δ\delta' | 00 | 11 | | ————– | ————– | ————– | | {q0}\{q_0\} | {q0,q1}\{q_0, q_1\} | {q1}\{q_1\} | | {q1}\{q_1\} | \emptyset | {q0,q1}\{q_0, q_1\} | | {q0,q1}\{q_0, q_1\} | {q0,q1}\{q_0, q_1\} | {q0,q1}\{q_0, q_1\} | | \empty | \empty | \empty |


3. Fakt: Każdy NFA jest NFAϵ_\epsilon


4. Twierdzenie#2

Jeśli LL jest językiem akceptowanym przez NFAϵ_\epsilon to jest również akceptowany przez NFA.

4.1. D-d

Niech

F={F{q0}jesˊli z q0 moz˙na dojsˊcˊ do qF ϵ-przejsˊciamiFoth. F' = \begin{cases} F \cup \{q_0\} & \text{jeśli z } q_0 \text{ można dojść do } q \in F ~\epsilon\text{-przejściami}\\ F & \text{oth.} \end{cases}

δ(q,a)=x(ϵaϵ)δ^(q,x) \delta'(q,a) = \bigcup_{x \in (\epsilon^*a\epsilon^*)}\hat{\delta}(q,x)

MM' nie ma ϵ\epsilon-przejść. Równość języków przez dowód indukcyjny po długości słowa.


5. Twierdzenie#3

Niech rr będzie wyrażeniem regularnym opisującym język LL. Wówczas istnieje NFAϵ_\epsilon, który akceptuje LL.

5.1. D-d

Indukcja po budowie wyrażenia regularnego.


(r+s)(r+s)

doklejamy nowe stany początkowe i końcowe


rsrs

łączymy w łańcuch


rr^*

r=n|r| = n jak duży, ile stanów ma automat
O(n)O(n)


6. Twierdzenie#4

Jeżeli LL jest akceptowany przez DFA, to LL jest reprezentowany przez wyrażenie regularne.

6.1. D-d

Niech LL będzie akceptowany przez DFA M=({q1,,qn},Σ,δ,q1,F)M = (\{ q_1,\dots, q_n \}, \Sigma, \delta, q_1, F).

Zdefiniujmy Rijk={xΣ: δ^(qi,x)=qj (y=prefix(x),yϵ,yx)(δ^(qi,y)=ql    lk)} R_{ij}^k = \{ x \in \Sigma^*:~ \hat{\delta}(q_i, x) = q_j \land \\ \land~ (\forall y=\mathrm{prefix}(x), y\neq \epsilon, y\neq x)(\hat{\delta}(q_i, y) = q_l \implies l \le k) \}

Innymi słowy, RijkR_{ij}^k to zbiór wszystkich słów, z jakimi można przejść ze stanu qiq_i do stanu qjq_j używając po drodze tylko pierwszych kk stanów (i,ji,j mogą być większe od kk).
RijkR_{ij}^k — wszystkie łańcuchy, z którymi możemy przejść z qiq_i do qjq_j.

L=qjFR1jn L = \bigcup_{q_j \in F} R_{1j}^n

Definicja rekurencyjna: Rij0={{a: δ(q1,a)=qj}ij{a: δ(qi,a)=qi}{ϵ}i=j R_{ij}^0 = \begin{cases} \{ a:~ \delta(q_1, a) = q_j \} & i \neq j\\ \{ a:~ \delta(q_i, a) = q_i \} \cup \{ \epsilon \} & i = j \end{cases} Rijk=Rikk1(Rkkk1)Rkjk1Rijk1k>0R_{ij}^k = R_{ik}^{k-1} \left( R_{kk}^{k-1} \right)^* R_{kj}^{k-1} \cup R_{ij}^{k-1} \quad k>0

Łatwo skonstruować wyrażenie regularne rijkr_{ij}^{k} opisujące RijkR_{ij}^k.

Dowód poprawności przez indukcję po kk.


6.2. Przykład

~ dla ({q1,q2},{0,1},{((q1,0),q1),((q1,1),q2),((q2,0),q1),((q2,1),q2)},q1,{q1})( \{ q_1, q_2 \}, \{ 0, 1 \},\\ \{ ((q_1, 0), q_1), ((q_1, 1), q_2), ((q_2, 0), q_1), ((q_2, 1), q_2) \}, q_1, \{ q_1 \} )

rijk=rikk1(rkkk1)rkjk1+rijk1k>0r_{ij}^k = r_{ik}^{k-1} \left( r_{kk}^{k-1} \right)^* r_{kj}^{k-1} + r_{ij}^{k-1} \quad k>0

r110=0+ϵr120=1r210=0r220=1+ϵr111=(0+ϵ)+(0+ϵ)(0+ϵ)(0+ϵ)0r121=1+(0+ϵ)(0+ϵ)101r211=0+0(0+ϵ)(0+ϵ)00r221=(1+ϵ)+0(0+ϵ)1ϵ+01r112=0+01(01)00 \begin{aligned} r_{11}^0 &= 0 + \epsilon\\ r_{12}^0 &= 1\\ r_{21}^0 &= 0\\ r_{22}^0 &= 1 + \epsilon\\ r_{11}^1 &= (0 + \epsilon) + (0 + \epsilon)(0 + \epsilon)^* (0 + \epsilon) \equiv 0^*\\ r_{12}^1 &= 1 + (0 + \epsilon)(0 + \epsilon)^* 1 \equiv 0^*1\\ r_{21}^1 &= 0 + 0(0 + \epsilon)^*(0 + \epsilon) \equiv 00^*\\ r_{22}^1 &= (1 + \epsilon) + 0(0 + \epsilon)^* 1 \equiv \epsilon + 0^*1\\ r_{11}^2 &= 0^* + 0^*1(0^*1)^*0^*0 \end{aligned}

A tak naprawdę, najprostszym wyrażeniem regularnym dla tego języka jest ϵ+(0+1)0\epsilon + (0 + 1)^*0