计算理论基础:1、自动机与语言

计算理论基础

NP问题:可以被快速验证的问题

P问题:可以被高效计算的问题(在 n O ( 1 ) n^{O(1)} nO(1)的时间内)

1.正则语言

正则语言:一些不需要内存就可以解决的问题(可以被有限自动机解决的问题)

1.1 有限自动机(finite automaton)

L L L的上界:证明 L L L是可以在时间 T ( n ) T(n) T(n)内解决的。

L L L的下界:证明 L L L是不可能在时间 T ( n ) T(n) T(n)内解决。

例1.1:自动门(门内和门外两个区域),有两个状态(开、关),

输入情况:

frontrearbothneither
front××
rear××
neither
neither
front,rear,both
front,rear,both
closed
open

例1.2: L = { ω ∈ { 0 , 1 } ∗ , ω = ω 1 ω 2 ⋯ ω n , ω n = 0 } L=\{\omega \in\{0,1\}^* ,\omega=\omega_1\omega_2\cdots\omega_n,\omega_n=0\} L={ω{0,1},ω=ω1ω2ωn,ωn=0},可以用有限自动机解决。

Q = { q 0 , q 1 } , ∑ = { 0 , 1 } , δ : Q × ∑ → Q Q=\{q_0,q_1\},\sum=\{0,1\},\delta:Q\times\sum\rightarrow Q Q={q0,q1},={0,1}δ:Q×Q如下表所示

01
q 0 q_0 q0 q 0 q_0 q0 q 1 q_1 q1
q 1 q_1 q1 q 0 q_0 q0 q 1 q_1 q1
0
1
1
0
q 0
q 1

例1.3: L = { ω ∈ { 0 , 1 } ∗ , ω = ω 1 ω 2 ⋯ ω n , ω n = 2 ⋅ ω n − 1 + 2 2 ⋅ ω n − 2 + ⋯ ☰  0   m o d 3 } L=\{\omega\in\{0,1\}^*,\omega=\omega_1\omega_2 \cdots \omega_n,\omega_n=2\cdot\omega_{n-1}+2^2\cdot\omega_{n-2}+\cdots ☰\ 0\ mod3\} L={ω{0,1},ω=ω1ω2ωn,ωn=2ωn1+22ωn2+ 0 mod3}(读一个二进制数,从高往低读,判断是否模3)

0
1
1
0
0
1
q 0
q 1
q 2

D e f   2.1 Def\ 2.1 Def 2.1 有限自动机:一个有限自动机是一个五元组 ( Q , ∑ , δ , q 0 , F ) (Q,\sum,\delta,q_0,F) (Q,,δ,q0,F)

  1. Q Q Q是一个有限集(状态集合)
  2. ∑ \sum 是一个字母表
  3. δ : Q × ∑ → Q \delta:Q\times\sum\rightarrow Q δ:Q×Q是转移函数
  4. q 0 q_0 q0:初始状态
  5. F F F:接收状态, F ⊆ Q F\subseteq Q FQ,可以是空集

D e f   2.2 Def\ 2.2 Def 2.2 接收(accept) M = ( Q , ∑ , δ , q 0 , F ) M=(Q,\sum,\delta,q_0,F) M=(Q,,δ,q0,F),令 M M M是一个有限自动机,令 w = w 1 ⋯ w n w=w_1\cdots w_n w=w1wn是一个字符串,有 w i ∈ ∑ w_i\in\sum wi,若 ∃ \exists 一系列状态 r 0 , r 1 , ⋯   , r n ∈ Q r_0,r_1,\cdots,r_n\in Q r0,r1,,rnQ,有:

  1. r 0 = q 0 r_0 =q_0 r0=q0
  2. δ ( r i , w i + 1 ) = r i + 1 , i = 0 , 1 , 2 , ⋯   , n − 1 \delta(r_i,w_{i+1})=r_{i+1}, i =0,1,2,\cdots,n-1 δ(ri,wi+1)=ri+1,i=0,1,2,,n1
  3. r n ∈ F r_n \in F rnF

则称 M M M接收 w w w

D e f   2.3 Def\ 2.3 Def 2.3 可识别 L L L M M M可接受的一系列字符串(strings),我们就称 L L L M M M的语言,记为 L ( M ) = L L(M)=L L(M)=L,称 M M M可识别(判定、接收) L L L,如果 M M M不接受任何字符串,则称它接收的语言为空语言(the empty language)。

例1.4: L = { ω ∈ { 0 , 1 } ∗ , ω = ω 1 ω 2 ⋯ ω n , ω 1 ≠ ω n } L=\{\omega\in\{0,1\}^*,\omega=\omega_1\omega_2\cdots\omega_n,\omega_1\neq\omega_n\} L={ω{0,1},ω=ω1ω2ωn,ω1=ωn}

0
1
0
1
1
0
q 0
q 1
q 3
q 2
q 4

q 1 , q 3 q_1,q_3 q1,q3是可接收的,分支可归约到例二的情况。

例1.5:回文数问题, L = { ω ∈ { 0 , 1 } ∗ , ω R = ω } L=\{\omega \in \{0,1\}^*,\omega^R=\omega\} L={ω{0,1},ωR=ω}

无法用有限自动机解决

D e f   2.4 Def\ 2.4 Def 2.4 正则语言: L ⊆ ∑ ∗ L\subseteq \sum^* L是正则语言,若存在有限自动机接收 L L L

L e t   A , B ⊆ ∑ ∗ , D e f i n e Let\ A,B\subseteq \sum^*,Define Let A,B,Define

  • (union) A ∪ B = { x ∈ ∑ ∗ , x ∈ A   o r   x ∈ B } A\cup B=\{x\in\sum^*,x\in A \ or\ x\in B \} AB={x,xA or xB}
  • (concatenation) A ∘ B   o r   A B = { x y : x ∈ A , y ∈ B } A\circ B\ or\ AB=\{xy:x\in A,y\in B\} AB or AB={xy:xA,yB}
  • (start) A ∗ = x 1 x 2 ⋯ x k , k ≥ 0 , x 1 , x 2 , ⋯   , x k ∈ A A^*={x_1x_2\cdots x_k,k\ge0,x_1,x_2,\cdots,x_k\in A} A=x1x2xk,k0,x1,x2,,xkA

例:
∑ = { 0 , 1 } A = { ϵ , 0 , 00 , 000 , ⋯   } B = { ϵ , 1 , 11 , 111 , ⋯   } A B = { 0 i 1 j , i , j > 0 } A ∗ = A B ∗ = B ( A B ) ∗ = ∑ ∗ {\small\sum}=\{0,1\}\\ A=\{\epsilon,0,00,000,\cdots\}\\ B=\{\epsilon,1,11,111,\cdots\}\\ AB=\{0^i1^j,i,j>0\}\\ A^*=A\\ B^*=B\\ (AB)^*=\small {\sum}^* ={0,1}A={ϵ,0,00,000,}B={ϵ,1,11,111,}AB={0i1j,i,j>0}A=AB=B(AB)=
T h m   2.5 Thm\ 2.5 Thm 2.5 如果 A 1 , A 2 A_1,A_2 A1,A2是正则语言,那么 A 1 ∪ A 2 A_1\cup A_2 A1A2是正则语言

P r o o f Proof Proof M 1 = ( Q 1 , ∑ , δ 1 , q 1 , F 1 ) M_1=(Q_1,\sum,\delta_1,q_1,F_1) M1=(Q1,,δ1,q1,F1)接收 A 1 A_1 A1, M 2 = ( Q 2 , ∑ , δ 2 , q 2 , F 2 ) M_2=(Q_2,\sum,\delta_2,q_2,F_2) M2=(Q2,,δ2,q2,F2)接收 A 2 A_2 A2,构造一个有限自动机 M M M来接收 A 1 ∪ A 2 A_1\cup A_2 A1A2,其中 M = ( Q , ∑ , δ , q 0 , F ) M=(Q,\sum,\delta,q_0,F) M=(Q,,δ,q0,F)

  1. Q = Q 1 × Q 2 = { ( r 1 , r 2 ) : r 1 ∈ Q 1 , r 2 ∈ Q 2 } Q=Q_1\times Q_2=\{(r_1,r_2):r_1\in Q_1,r_2\in Q_2\} Q=Q1×Q2={(r1,r2):r1Q1,r2Q2}
  2. δ : Q × ∑ → \delta:Q\times\sum \rightarrow δ:Q×定义为 ∀ ( r 1 , r 2 ) ∈ Q , a ∈ ∑ , \forall(r_1,r_2)\in Q, a\in\sum, (r1,r2)Q,a, δ ( ( r 1 , r 2 ) , a ) = ( δ 1 ( r 1 , a ) , δ 2 ( r 2 , a ) ) \delta((r_1,r_2),a)=(\delta_1(r_1,a),\delta_2(r_2,a)) δ((r1,r2),a)=(δ1(r1,a),δ2(r2,a))
  3. q 0 = ( q 1 , q 2 ) q_0=(q_1,q_2) q0=(q1,q2)
  4. F = { ( r 1 , r 2 ) : r 1 ∈ F 1   o r   r 2 ∈ F 2 } F=\{(r_1,r_2):r_1\in F_1 \ or \ r_2\in F_2\} F={(r1,r2):r1F1 or r2F2}

类似将

or改为and,就识别了 A 1 ∩ A 2 A_1\cap A_2 A1A2

T h m   2.6 Thm\ 2.6 Thm 2.6 A 1 , A 2 A_1,A_2 A1,A2是正则语言,则 A 1 A 2 A_1A_2 A1A2也是正则语言。

D F A ( d e t e r m i n i s t i c   f i n i t e   a u t o m a t o n ) DFA (deterministic\ finite\ automaton) DFA(deterministic finite automaton):确定有限自动机

N F A ( n o n d e t e r m i n i s t i c   f i n i t e   a u t o m a t o n ) NFA(nondeterministic\ finite\ automaton) NFA(nondeterministic finite automaton):不确定有限自动机,转移的情况时不确定的,最终可能接收,可能拒绝,但只要有一条路径接收,就接收了。

1.2 非确定性

D e f   2.7 Def\ 2.7 Def 2.7 非确定有限自动机:一个 N F A NFA NFA是一个五元组 ( Q , ∑ , δ , q 0 , F ) (Q,\sum,\delta,q_0,F) (Q,,δ,q0,F),有如下定义:

  1. Q Q Q是一个有限状态集合
  2. ∑ \sum 是一个字符表
  3. δ : Q × ( ∑ ∪ { ϵ } ) → P ( Q ) \delta:Q\times(\sum\cup\{\epsilon\})\rightarrow P(Q) δ:Q×({ϵ})P(Q)是转移函数(可以空转移,下一个状态并不确定,可抵达多个状态,即为状态的集合)
  4. q 0 ∈ Q q_0\in Q q0Q 是初始状态
  5. F ⊆ Q F\subseteq Q FQ是一可接受状态集合

D e f   2.8 Def\ 2.8 Def 2.8 N = ( Q , ∑ , δ , q 0 , F ) N=(Q,\sum,\delta,q_0,F) N=(Q,,δ,q0,F)是一个NFA, w ∈ ∑ ∗ w\in\sum^* w,若 w = y 1 y 2 ⋯ y m , y i ∈ ∑ ∪ { ϵ } w=y_1y_2\cdots y_m,y_i\in\sum \cup\{\epsilon\} w=y1y2ym,yi{ϵ}, ∃ r 0 , r 1 , ⋯   , r m ∈ Q \exist r_0,r_1,\cdots,r_m\in Q r0,r1,,rmQ,则我们称 N F A NFA NFA接受 w w w。(即只要有一条路径可接收,就接收了)

N F A NFA NFA例1.6:( q 4 q_4 q4有效)

0,1
1
ε,0
0
1
0,1
0,1
q 1
q 2
q 3
q 5
q 4

若输入 010110,则在 q 1 q_1 q1状态输入1时,则可能为 q 1 , q 2 , q 3 q_1,q_2,q_3 q1,q2,q3( ϵ 为空转移 \epsilon为空转移 ϵ为空转移)

例1.7:设计一个 N F A NFA NFA,判断倒数第三位是0。

猜哪位是倒数第三位, N F A NFA NFA每次都猜对, q 3 q_3 q3是有效的, N F A NFA NFA每次都能在倒数第三位是0时空转移到 q 1 q_1 q1

ε
0,1
0,1
q 0
q 1
q 2
q 3

例1.8: L = { 0 k , k 是 2 或 3 的倍数 } L=\{0^k,k是2或3的倍数\} L={0k,k23的倍数}

N F A NFA NFA直接猜是2的倍数还是3的倍数,每次都猜对, q 3 , q 2 q_3,q_2 q3q2是有效的,分别2的倍数和3的倍数

ε
ε
0
0
0
0
0
q 1
q 2
q 3
q 4
q 5
q 6

V a n a n t   1    δ : Q × ∑ ∗ → Q Vanant\ 1\ \ \delta:Q\times \sum^*\rightarrow Q Vanant 1  δ:Q×Q

问题(输入011时,可以从01转移,也可以从011转移)

两个处理方法:

1.我们保证最多只有一条转移路径(与DFA等价)

2.在存在多条转移路径时,任意选择一条(与NFA等价)

01
011
q 0
q 1
q 2

E x a m p l e Example Example 证明变体(Vanant)是与DFA或NFA等价的

例:

1
0,1
0,ε
1
0,1
q 0
q 1
q 2
q 3
Q / ∑ Q/\sum Q/01 ϵ \epsilon ϵ
q 0 q_0 q0 { q 0 } \{q_0\} {q0} { q 0 , q 1 } \{q_0,q_1\} {q0,q1} ∅ \varnothing
q 1 q_1 q1 { q 2 } \{q_2\} {q2} ∅ \varnothing { q 2 } \{q_2\} {q2}
q 2 q_2 q2 ∅ \varnothing { q 3 } \{q_3\} {q3} ∅ \varnothing
q 3 q_3 q3 { q 3 } \{q_3\} {q3} { q 3 } \{q_3\} {q3} ∅ \varnothing

语言为 L = { w ∈ { 0 , 1 } ∗ , w 含有子串 11 或 101 } L=\{w\in\{0,1\}^*,w含有子串11或101\} L={w{0,1},w含有子串11101} q 2 q_2 q2处如果是0则转入空集,需从头( q 0 q_0 q0)再来

T h m   2.9 Thm\ 2.9 Thm 2.9 任意一个NFA都有一个等价的DFA

P r o o f     N = ( Q , ∑ , δ , q 0 , F ) Proof\ \ \ N=(Q,\sum,\delta,q_0,F) Proof   N=(Q,,δ,q0,F)是NFA,识别语言A。

构造一个DFA, M = ( Q ′ , ∑ , δ ′ , q 0 ′ , F ) M=(Q',\sum,\delta',q_0',F) M=(Q,,δ,q0,F)也识别语言A。注意到NFA中有空字符转移,

定义 R ⊆ Q , E ( R ) = { q ∈ Q : q 可以从 R 通过 0 个或更多的 ϵ 到达 } R\subseteq Q,E(R)=\{q\in Q:q可以从R通过0个或更多的\epsilon到达\} RQ,E(R)={qQ:q可以从R通过0个或更多的ϵ到达}(非常简洁美丽的良定义)

定义 M M M如下:

  1. Q ′ = P ( Q ) Q'=P(Q) Q=P(Q)
  2. R ∈ Q ′ R\in Q' RQ a ∈ ∑ a\in \sum a,定义 δ ′ ( R , a ) = { q ∈ Q : q ∈ E ( δ ( r , a ) ) , f o r   s o m e   r ∈ R } = ⋃ r ∈ R E ( δ ( r , a ) ) \delta'(R,a)=\{q\in Q:q\in E(\delta(r,a)),for\ some \ r \in R\}=\bigcup\limits_{r\in R}E(\delta(r,a)) δ(R,a)={qQ:qE(δ(r,a)),for some rR}=rRE(δ(r,a))(路径扩展,NFA中的每条路径都扩展为DFA的一个可到达的节点)
  3. q ′ = E ( q 0 ) q'=E({q_0}) q=E(q0)
  4. F ′ = { R ∈ Q ′ : R ∩ F ≠ ∅ } F'=\{R\in Q':R\cap F\ne\varnothing\} F={RQ:RF=}

E x a m p l e Example Example
如何将一个NFA转换为DFA
NFA

ε
0
1
0
0,1
1
3
2

DFA

0,1
0
1
0
1
1
0
0,1
0
1
1
0
0
1
空集
1
2
3
1,2
2,3
1,3
1,2,3

C o r o l l o y   2.10 Corolloy\ 2.10 Corolloy 2.10 语言A是正则的,当且仅当存在NFA可接收他

T h m   2.5 Thm\ 2.5 Thm 2.5 两个正则语言的并集也是正则的

在这里插入图片描述

图1 N 1∪N 2的形象化证明

N 1 = ( Q 1 , ∑ , δ 1 , q 1 , F 1 ) N_1=(Q_1,\sum,\delta_1,q_1,F_1) N1=(Q1,,δ1,q1,F1)接受 A 1 A_1 A1 N 2 = ( Q 2 , ∑ , δ 2 , q 2 , F 2 ) N_2=(Q_2,\sum,\delta_2,q_2,F_2) N2=(Q2,,δ2,q2,F2)接受 A 2 A_2 A2,构造 N = ( Q , ∑ , δ , q 0 , F ) N=(Q,\sum,\delta,q_0,F) N=(Q,,δ,q0,F),如下:

  1. Q = Q 1 ∪ Q 2 ∪ { q 0 } Q=Q_1\cup Q_2\cup \{q_0\} Q=Q1Q2{q0}
  2. q 0 q_0 q0是初始状态
  3. F = F 1 ∪ F 2 F=F_1\cup F_2 F=F1F2
  4. F o r   q ∈ Q , a ∈ ∑ ∪ { ϵ } For\ q\in Q,a\in \sum\cup\{\epsilon\} For qQ,a{ϵ}

δ ( q , a ) = { δ 1 ( q , a )        q ∈ Q 1 δ 2 ( q , a )        q ∈ Q 2 { q 1 , q 2 }        q = q 0   a n d   a = ϵ ∅                  q = q 0   a n d   a ≠ ϵ \delta(q,a)=\begin{cases} \delta_1(q,a)\ \ \ \ \ \ q\in Q_1\\ \delta_2(q,a)\ \ \ \ \ \ q\in Q_2\\ \{q_1,q_2\} \ \ \ \ \ \ q=q_0 \ and\ a=\epsilon\\ \varnothing\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ q=q_0\ and\ a\ne \epsilon \end{cases} δ(q,a)= δ1(q,a)      qQ1δ2(q,a)      qQ2{q1,q2}      q=q0 and a=ϵ                q=q0 and a=ϵ

T h m   2.11 Thm\ 2.11 Thm 2.11 两个正则语言的连接是正则的

在这里插入图片描述

图2 N 1N 2的图形化证明

N 1 = ( Q 1 , ∑ , δ 1 , q 1 , F 1 ) N_1=(Q_1,\sum,\delta_1,q_1,F_1) N1=(Q1,,δ1,q1,F1)接受 A 1 A_1 A1 N 2 = ( Q 2 , ∑ , δ 2 , q 2 , F 2 ) N_2=(Q_2,\sum,\delta_2,q_2,F_2) N2=(Q2,,δ2,q2,F2)接受 A 2 A_2 A2,构造 N = ( Q , ∑ , δ , q 0 , F ) N=(Q,\sum,\delta,q_0,F) N=(Q,,δ,q0,F),如下:

  1. Q = Q 1 ∪ Q 2 ∪ { q 0 } Q=Q_1\cup Q_2\cup \{q_0\} Q=Q1Q2{q0}
  2. q 0 = q 1 q_0=q_1 q0=q1是初始状态
  3. F = F 2 F=F_2 F=F2
  4. F o r   q ∈ Q , a ∈ ∑ ∪ { ϵ } For\ q\in Q,a\in\sum\cup\{\epsilon\} For qQ,a{ϵ}

δ ( q , a ) = { δ 1 ( q , a )         q ∈ Q 1   a n d   q ∉ F 1 δ 2 ( q , a )         q ∈ Q 2 q 2                  q ∈ F 1   a n d   a = ϵ ∅                  q = q 0   a n d   a ≠ ϵ \delta(q,a)=\begin{cases} \delta_1(q,a)\ \ \ \ \ \ \ q\in Q_1\ and \ q\notin F_1\\ \delta_2(q,a)\ \ \ \ \ \ \ q\in Q_2\\ q_2\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ q\in F_1\ and\ a=\epsilon\\ \varnothing\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ q=q_0\ and\ a\ne\epsilon \end{cases} δ(q,a)= δ1(q,a)       qQ1 and q/F1δ2(q,a)       qQ2q2                qF1 and a=ϵ                q=q0 and a=ϵ

T h m Thm Thm 2.12 正则语言的*也是正则的。

在这里插入图片描述

图3 N *的图形化证明

N 1 = ( Q 1 , ∑ , δ 1 , q 1 , F 1 ) N_1=(Q_1,\sum,\delta_1,q_1,F_1) N1=(Q1,,δ1,q1,F1)接受 A 1 A_1 A1,构造 N = ( Q , ∑ , δ , q 0 , F ) N=(Q,\sum,\delta,q_0,F) N=(Q,,δ,q0,F),如下:

  1. Q = Q 1 ∪ { q 0 } Q=Q_1\cup \{q_0\} Q=Q1{q0}
  2. q 0 q_0 q0是初始状态
  3. F = F 1 ∪ { q 0 } F=F_1\cup\{q_0\} F=F1{q0}
  4. F o r   q ∈ Q , a ∈ ∑ ∪ { ϵ } For\ q\in Q,a\in\sum\cup\{\epsilon\} For qQ,a{ϵ}

δ ( q , a ) = { δ 1 ( q , a )        q ∈ Q 1 q 0                 q ∈ F 1   a n d   a = ϵ q 1                 q = q 0   a n d   a = ϵ ∅                 q ∈ F 1   a n d   a ≠ ϵ \delta(q,a)=\begin{cases} \delta_1(q,a)\ \ \ \ \ \ q\in Q_1\\ q_0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ q\in F_1\ and \ a=\epsilon\\ q_1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ q=q_0\ and\ a=\epsilon\\ \varnothing\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ q\in F_1\ and\ a\ne \epsilon \end{cases} δ(q,a)= δ1(q,a)      qQ1q0               qF1 and a=ϵq1               q=q0 and a=ϵ               qF1 and a=ϵ

T h m 2.13 Thm 2.13 Thm2.13 正则语言的补也是正则的

M = ( Q , ∑ , δ , q 0 , F ) M=(Q,\sum,\delta,q_0,F) M=(Q,,δ,q0,F),构造 M ′ = ( Q , ∑ , δ , q 0 , Q − F ) M'=(Q,\sum,\delta,q_0,Q-F) M=(Q,,δ,q0,QF),后者显然接收前者的补

1.3正则表达式

E x a m p l e Example Example

  1. 奇数结尾: ( 0 ∪ 1 ∪ 2 ∪ ⋯ ∪ 9 ) ∗ ( 1 ∪ 3 ∪ 5 ∪ 7 ∪ 9 ) (0\cup1\cup2\cup\cdots\cup9)^*(1\cup3\cup5\cup7\cup9) (0129)(13579)
  2. 偶数结尾: ( 0 ∪ 1 ∪ 2 ∪ ⋯ ∪ 9 ) ∗ ( 2 ∪ 4 ∪ 6 ∪ 8 ∪ 0 ) (0\cup1\cup2\cup\cdots\cup9)^*(2\cup4\cup6\cup8\cup0) (0129)(24680)
  3. ( 0 ∪ 1 ) 0 ∗ (0\cup1)0^* (01)0,以0或1开头,后面接任意多个0
  4. ( 0 ∪ 1 ) ∗ = ∑ ∗ (0\cup1)^*=\sum^* (01)=
  5. ( 0 ∪ ∑ ∗ ) ∪ ( ∑ ∗ 1 ) (0\cup\sum^*)\cup(\sum^*1) (0)(1):所有以0开头或者以1结尾的字符串

D e f   2.14 Def\ 2.14 Def 2.14正则表达式 如果 R R R满足以下条件, R R R是正则表达式:

  1. a   f o r   s o m e   a ∈ ∑ a\ for\ some \ a \in\sum a for some a
  2. ϵ \epsilon ϵ
  3. ∅ \varnothing
  4. ( R 1 ∪ R 2 ) (R_1\cup R_2) (R1R2),如果 R 1 , R 2 R_1,R_2 R1,R2是正则表达式
  5. ( R 1 R 2 ) (R_1R_2) (R1R2),如果 R 1 , R 2 R_1,R_2 R1,R2是正则表达式
  6. ( R 1 ∗ ) (R_1^*) (R1):如果 R 1 R_1 R1是正则表达式

括号可被忽略。

E x a m p l e Example Example

  1. 0 ∗ 1 0 ∗ 0^*10^* 010,只有一个1的字符串
  2. ∑ ∗ 1 ∑ ∗ \sum^*1\sum^* 1,至少有一个1的字符串
  3. ∑ ∗ 001 ∑ ∗ \sum^*001\sum^* 001,含001子串的字符串
  4. 1 ∗ ( 0 1 + ) ∗ 1^*(01^+)^* 1(01+),没有连续0的字符串
  5. ( ∑ ∑ ) ∗ (\sum\sum)^* (∑∑),偶数长度的字符串
  6. ( 01 ∪ 10 ) = { 01 , 10 } (01\cup10)=\{01,10\} (0110)={01,10}
  7. ( 0 ∪ ϵ ) 1 ∗ = ( 0 1 ∗ ∪ 1 ∗ ) (0\cup\epsilon)1^*=(01^*\cup1^*) (0ϵ)1=(011)
  8. ( 0 ∪ ϵ ) ( 1 ∪ ϵ ) = { ϵ , 0 , 1 , 01 } (0\cup\epsilon)(1\cup\epsilon)=\{\epsilon,0,1,01\} (0ϵ)(1ϵ)={ϵ,0,1,01}
  9. 1 ∗ ∅ = ∅ 1^*\varnothing=\varnothing 1=
  10. ∅ ∗ = { ϵ } \varnothing^*=\{\epsilon\} ={ϵ}

∑ ∗ 110 ∑ ∗ \sum^*110\sum^* 110 :含有子串110

( ϵ ∪ 0 ∪ 1 ) ( 10 ∪ 1 ) ∗ (\epsilon\cup0\cup1)(10\cup1)^* (ϵ01)(101):没有字串00(用1把0隔开)

( 0 ∗ 1 0 ∗ 1 0 ∗ 1 0 ∗ ) ∗ (0^*10^*10^*10^*)^* (0101010):含有3的倍数个1

∑ ∗ 1 + ∑ ∗ 1 + ∑ ∗ 0 + ∪ ∑ ∗ 1 + ∑ ∗ 0 + ∑ ∗ 1 + ∪ 0 + ∑ ∗ 1 + ∑ ∗ 1 + \sum^*1^+\sum^*1^+\sum^*0^+\cup\sum^*1^+\sum^*0^+\sum^*1^+\cup0^+\sum^*1^+\sum^*1^+ 1+1+0+1+0+1+0+1+1+:至少有2个1和1个0

T h m   2.15 Thm\ 2.15 Thm 2.15 一个语言是正则的 ⟺ \Longleftrightarrow 某一正则表达式能表示它

( ⇐ \Leftarrow ):如果一个语言可以被正则表达式描述,那么它是正则的:

P r o o f : Proof: Proof:

  1. R = a , a ∈ ∑ ,   L ( R ) = { a } R=a,a\in\sum,\ L(R)=\{a\} R=a,a, L(R)={a}
  2. R = ϵ R=\epsilon R=ϵ
  3. R = ∅ R=\varnothing R=
  4. R = R 1 ∪ R 2 ( b y   T h m   2.5 ) R=R_1\cup R_2 (by\ Thm\ 2.5) R=R1R2(by Thm 2.5)
  5. R = R 1 R 2 ( b y   T h m   2.11 ) R=R_1R_2(by\ Thm\ 2.11) R=R1R2(by Thm 2.11)
  6. R = R 1 ∗ ( b y    T h m   2.12 ) R=R_1^*(by\ \ Thm\ 2.12) R=R1(by  Thm 2.12)

E x a m p l e   ( a b ∪ a ) ∗ Example\ (ab\cup a)^* Example (aba)

a
b
a
ε
1
2
3

( ⇒ \Rightarrow )为了证明充分性,先引入GNFA的定义

D e f   2.18 Def\ 2.18 Def 2.18广义非确定型有穷自动机(GNFA)

是一个五元组 ( Q , ∑ , δ , q s t a r t , q a c c e p t ) (Q,\sum,\delta,q_{start},q_{accept}) (Q,,δ,qstart,qaccept)

  1. Q是有穷的状态集
  2. ∑ \sum 是输入字母表
  3. δ : ( Q − { q a c c e p t } ) × R → ( Q − { q s t a r t } ) \delta:(Q-\{q_{accept}\})\times R\rightarrow (Q-\{q_{start}\}) δ:(Q{qaccept})×R(Q{qstart}),R是所有正则表达式的集合
  4. q s t a r t q_{start} qstart是起始状态
  5. q a c c e p t q_{accept} qaccept是接收状态

起始状态没有入边,接收状态没有出边,除了起始状态,和接收状态之外,任何两个状态之间必须有一条边,不能有多重边。

CONVERT(G):

  1. 设k是G的状态数

  2. 如果k=2,则G一定是由1个起始状态,一个接收状态和连接这两个状态的箭头组成,设箭头上的标记为正则表达式R,返回这个表达式R

  3. 如果k>2,则任取 q r i p ∈ Q − { q s t a r t , q a c c e p t } q_{rip}\in Q-\{q_{start},q_{accept}\} qripQ{qstart,qaccept},并且令G’为 G N F A ( Q ′ , ∑ , δ ′ , q s t a r t , q a c c e p t ) GNFA(Q',\sum,\delta',q_{start},q_{accept}) GNFA(Q,,δ,qstart,qaccept),其中 Q ′ = Q − { q r i p } Q'=Q-\{q_{rip}\} Q=Q{qrip},令
    δ ′ ( q i , q j ) = ( R 1 ) ( R 2 ) ∗ ( R 3 ) ∪ R 4 \delta'(q_i,q_j)=(R_1)(R_2)^*(R_3)\cup R_4 δ(qi,qj)=(R1)(R2)(R3)R4

  4. 计算CONVERT(G’) 且返回这个值

R1
R3
R2
R4
q i
q rip
q j

C l a i m Claim Claim 对任意的 G N F A     G GNFA\ \ \ G GNFA   G, C O N V E R T ( G ) CONVERT(G) CONVERT(G) 等价于 C O N V E R T ( G ′ ) CONVERT(G') CONVERT(G)

$Proof\ $1) L ( G ) ⊆ L ( G ′ ) L(G)\subseteq L(G') L(G)L(G)

F o r   a n y   w ∈ ∑ ∗ , i f   G   a c c e p t s   w , t h e n   G ′   a c c e p t s   w : For\ any\ w\in\sum^{*},if\ G\ accepts\ w,then\ G'\ accepts \ w: For any w,if G accepts w,then G accepts w:
q s t a r t , q 1 , q 2 , q 3 , ⋯   , q a c c e p t q_{start},q_1,q_2,q_3,\cdots,q_{accept} qstart,q1,q2,q3,,qaccept
i f   n o n e   o f   t h e m   i s   q r i p , t h e n   G ′   a l s o   a c c e p t s   w if\ none\ of\ them\ is \ q_{rip},then\ G'\ also\ accepts\ w if none of them is qrip,then G also accepts w

i f   q r i p   a p p e a r s , if\ q_{rip}\ appears, if qrip appears,
q s t a r t , q 1 , ⋯   , q i t 1 , q i t 2 = q r i p , q i t 3 , ⋯   , q a c c e p t q_{start},q_1,\cdots,q_{i_{t_1}},q_{i_{t_2}}=q_{rip},q_{i_{t_3}},\cdots ,q_{accept} qstart,q1,,qit1,qit2=qrip,qit3,,qaccept
T h e n   G ′   a l s o   a c c e p t s   w Then\ G'\ also\ accepts\ w Then G also accepts w

2 ) L ( G ′ ) ⊆ L ( G ) 2)L(G')\subseteq L(G) 2)L(G)L(G)

将DFA转换成等价的正则表达式

a
b
a,b
1
2
a
b
a,b
ε
ε
1
2
s
a
a
b(a|b)*
ε
1
a
s
a*b(a|b)*
s
a

1.4 非正则语言

L o m a   2.17 Loma\ 2.17 Loma 2.17(泵引理)若A是一个正则语言,则存在一个数 p p p(泵长度)使得,如果 s s s A A A中任一长度不小于 p p p的字符串,那么 s s s可被分成三段, s = x y z s=xyz s=xyz,满足下述条件:

  1. 对每一个 i ≥ 0 , x y i z ∈ A i\ge 0,xy^iz\in A i0,xyizA
  2. ∣ y ∣ > 0 |y|>0 y>0
  3. ∣ x y ∣ ≤ p |xy|\le p xyp

P r o o f Proof Proof (p48)

M = ( Q , ∑ , δ , q 1 , F ) M=(Q,\sum,\delta,q_1,F) M=(Q,,δ,q1,F)是一台识别A的DFA, p = ∣ Q ∣ p=|Q| p=Q

s = s 1 s 2 ⋯ s n s=s_1s_2\cdots s_n s=s1s2sn是A中长度为 n n n的字符串,这里 n ≥ p n\ge p np,又设 r 1 , ⋯   , r n + 1 r_1,\cdots,r_{n+1} r1,,rn+1是M在处理 s s s的过程中进入的状态序列,因而 r i + 1 = δ ( r i , s i ) , 1 ≤ i ≤ n r_{i+1}=\delta(r_i,s_i),1\le i\le n ri+1=δ(ri,si),1in,该序列长度为 n + 1 n+1 n+1,不小于 p + 1 p+1 p+1。根据鸽巢原理,在该序列的前 p + 1 p+1 p+1个元素中,一定有两个相同的状态,设第一个是 r j r_j rj,第二个是 r l r_l rl,由于 r l r_l rl出现在序列的前 p + 1 p+1 p+1个位置中,而且序列是从 r 1 r_1 r1开始的,故有 l ≤ p + 1 l\le p+1 lp+1。此时,令 x = s 1 ⋯   , s j − 1 , y = s j ⋯ s l − 1 , z = s l ⋯ s n x=s_1\cdots,s_{j-1},y=s_j\cdots s_{l-1},z=s_l\cdots s_n x=s1,sj1,y=sjsl1,z=slsn

例:

1.证明 D = { 1 n 2 ∣ n ≥ 0 } D=\{1^{n^2}|n\ge0\} D={1n2n0}不是正则的。

假设是正则的,设 p p p是泵长度。 s s s是字符串 1 p 2 1^{p^2} 1p2,显然长度大于 p p p,则可被分为三段, s = x y z s=xyz s=xyz,使得对任意的 i ≥ 0 i\ge 0 i0,字符串 x y i z xy^iz xyiz D D D中。

考虑 x y z xyz xyz x y 2 z xy^2z xy2z,它们之间相差 y y y的一次重复,长度差 y y y的长度。

易知 ∣ x y ∣ ≤ p |xy|\le p xyp,从而 ∣ y ∣ ≤ p |y|\le p yp,又 ∣ x y z ∣ = p 2 |xyz|=p^2 xyz=p2,则 ∣ x y 2 z ∣ = p 2 + p |xy^2z|=p^2+p xy2z=p2+p,但 p 2 + p < p 2 + 2 p + 1 = ( p + 1 ) 2 p^2+p\lt p^2+2p+1=(p+1)^2 p2+p<p2+2p+1=(p+1)2,又 ∣ y ∣ > 0 |y|\gt 0 y>0,则 ∣ x y 2 z ∣ > p 2 |xy^2z|>p^2 xy2z>p2,则 x y 2 z xy^2z xy2z的长度严格在两个相邻的完全平方数之间,肯定不是完全平方数,不是正则的

2.证明 D = { 1 p ∣ p 是素数 } D=\{1^p|p是素数\} D={1pp是素数}不是正则的。

假设正则的,设p是泵长度。s是字符串 1 q , q ≥ p 1^q,q\ge p 1q,qp,则可被分为三段, s = x y z s=xyz s=xyz,使得对任意的 i ≥ 0 i\ge 0 i0,字符串 x y i z xy^iz xyiz D D D中。不妨假设 x = 1 a , y = 1 b , z = 1 c x=1^a,y=1^b,z=1^c x=1a,y=1b,z=1c,则 a + i b + c a+ib+c a+ib+c要为素数,注意到,当 i = a + b + c + 1 , a + i b + c = ( b + 1 ) ( a + b + c ) i=a+b+c+1,a+ib+c=(b+1)(a+b+c) i=a+b+c+1,a+ib+c=(b+1)(a+b+c),不是素数。

注意的过程:希望是 ( b + w ) ( k a + m b + t c ) = ( k a b + m b 2 + t b c + k w a + m w b + t w c ) (b+w)(ka+mb+tc)=(kab+mb^2+tbc+kwa+mwb+twc) (b+w)(ka+mb+tc)=(kab+mb2+tbc+kwa+mwb+twc),则对应不难发现可令w=1,有k=1,t=1,则可化为 ( b + 1 ) ( a + m b + c ) = ( a b + m b 2 + b c + a + m b + c ) (b+1)(a+mb+c)=(ab+mb^2+bc+a+mb+c) (b+1)(a+mb+c)=(ab+mb2+bc+a+mb+c),则 i b = ( a b + m b 2 + b c + m b ) , i = ( a + c + m b + m ) ib=(ab+mb^2+bc+mb),i=(a+c+mb+m) ib=(ab+mb2+bc+mb)i=(a+c+mb+m),令 m = 1 m=1 m=1即可得到

3.有点不一样的例子,对于语言 B = { 0 n 1 n ∣ n ≥ 0 } B=\{0^n1^n|n\ge 0 \} B={0n1nn0},是容易判断它不是正则的,分成三段,y要么是0串,要么是1串,要么含有01字串,都很容易证明这些不在 B B B中。类似的方法做这个就不太行:

证明 C = { w ∣ w 中 0 和 1 的个数相同 } C=\{w|w中0和1的个数相同\} C={ww01的个数相同}不是正则的

显然分3段后 y y y无论重复几次都是可能满足的,因为没有限制0,1的先后顺序。

但考虑定理的条件3: ∣ x y ∣ ≤ p |xy|\le p xyp,可以取字串 s = 0 p 1 p s=0^p1^p s=0p1p,则无论怎么取, y y y只能是0串,那么它的重复显然不属于C

可利用条件3来构造一个良好的字串,证明它是不可抽取的

  • 63
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值