title: 形式语言与自动机
date: 2024-01-24 17:44:49
tags: Computer Science
文章目录
形式语言与自动机
带有空转移能力的非有限状态自动机
状态的空转移
- 允许输入空串进行状态转移
一个举例:
设计
L
=
ω
∈
{
0
,
1
}
∗
∣
ω
倒数
3
个字符至少有一个是
1
的
N
F
A
设计L={\omega \in \{0,1\}^*|\omega 倒数3个字符至少有一个是1}的NFA
设计L=ω∈{0,1}∗∣ω倒数3个字符至少有一个是1的NFA
DFA:
NFA:
空转移的NFA:
由此得出定义:
注意状态转移的输入发生了变化,包含了空输入。其余与NFA定义一致。
正则表达式
- 通过表达式描述正则语言,代数表示方法
递归定义
我们可以定义一个四则运算:
-
任何数都是四则表达式;
-
如果a和b是四则运算表达式,那么a,b满足:
- a+b
- a-b
- a*b
- a/b
都是四则运算.
由此我们可以得出正则表达式的递归定义:
语言的运算
运算优先级
这里着重说明“”的用法:
**表示被“”修饰的表达式任意组成**
给出正则表达式(aa)*(bb)*b定义的语言.
L ( ( a a ) ∗ ( b b ) ∗ b ) = L ( ( a a ) ∗ ) L ( ( b b ) ∗ ) L ( b ) = ( { a } { a } ) ∗ ( { b } { b } ) ∗ b = { a 2 } ∗ { b 2 } ∗ { b } = { a 2 n b 2 m + 1 ∣ n > = 0 , m > = 0 } L((aa)*(bb)*b) = L((aa)*)L((bb)*)L(b)=(\{a\}\{a\})*(\{b\}\{b\})*{b} = \{a^2\}*\{b^2\}*\{b\} = \{a^{2n}b^{2m+1}|n >=0,m>=0\} L((aa)∗(bb)∗b)=L((aa)∗)L((bb)∗)L(b)=({a}{a})∗({b}{b})∗b={a2}∗{b2}∗{b}={a2nb2m+1∣n>=0,m>=0}
化简规则
自动机和正则表达式的等价性
若L=L(A)是某DFA A的表达式,那么存在正则表达式R满足L = L ®.
我们需要构造一个和正则表达式等价的自动机来完成这一点的证明。
递归表达式
我们可以得出普遍的状态转移图如上,比如得到接受状态需要通过输入x和y,那么R = x + y,由此我们知道R应当是所有初始状态到接收状态路径的集合,我们要用正则表达式构造这个表达。
更一般的,R应该是通过更多个输入到达接受状态,我们可以画出以下图像:
其中 R i j 表示从 i 节点到 j 节点的路径, R i j ( k ) , 表示不经过 k 的 i 到 j 的路径,我们推断任意两节点的路径可以用以下表达: 其中R_{ij}表示从i节点到j节点的路径,R_{ij}^{(k)},表示不经过k的i到j的路径,我们推断任意两节点的路径可以用以下表达: 其中Rij表示从i节点到j节点的路径,Rij(k),表示不经过k的i到j的路径,我们推断任意两节点的路径可以用以下表达:
R i j = R i j ( K ) + R i k ( k ) ( R k ( k ) ) ∗ R k j ( k ) R_{ij} = R_{ij}^{(K)} + R_{ik}^{(k)}(R_k^{(k)})^*R_{kj}^{(k)} Rij=Rij(K)+Rik(k)(Rk(k))∗Rkj(k)
递归到直接相连的两个节点。
将DFA的状态从1开始编号,1为初始状态:
那么与A等价的正则表达式为:
⋃
j
∈
F
R
1
j
(
n
)
\bigcup_{j\in F} R_{1j}^{(n)}
j∈F⋃R1j(n)
递归表达为:
R
i
j
(
k
)
=
R
i
j
(
k
−
1
)
+
R
i
k
(
k
−
1
)
+
(
R
k
k
k
−
1
)
∗
R
k
j
(
k
−
1
)
R_{ij}^{(k)} = R_{ij}^{(k-1)}+R_{ik}^{(k-1)}+(R_{kk}^{k-1})^*R_{kj}^{(k-1)}
Rij(k)=Rij(k−1)+Rik(k−1)+(Rkkk−1)∗Rkj(k−1)
R i j 0 = { a ∣ δ ( q i , a ) = q j , i ≠ j a ∣ δ ( q i , a ) = q j , ∪ { ϵ } , i = j R_{ij}^0 = \begin{cases} {a|\delta(q_i,a) =q_j, i\neq j} \\[2ex] {a|\delta(q_i,a) =q_j, \cup \{\epsilon \},i=j} \end{cases} Rij0=⎩ ⎨ ⎧a∣δ(qi,a)=qj,i=ja∣δ(qi,a)=qj,∪{ϵ},i=j
证明递归表达式正确: