【形式语言与自动机】学习day2--正则语言与自动机

113 阅读2分钟

形式语言与自动机

带有空转移能力的非有限状态自动机

状态的空转移

  • 允许输入空串进行状态转移

一个举例:

设计L=ω{0,1}ω倒数3个字符至少有一个是1NFA设计L={\omega \in \{0,1\}^*|\omega 倒数3个字符至少有一个是1}的NFA

DFA:

屏幕截图 2024-01-24 175728.png NFA:屏幕截图 2024-01-24 175738.png

空转移的NFA:

屏幕截图 2024-01-24 180049.png

由此得出定义:

屏幕截图 2024-01-24 180135.png

注意状态转移的输入发生了变化,包含了空输入。其余与NFA定义一致。

正则表达式

  • 通过表达式描述正则语言,代数表示方法

递归定义

我们可以定义一个四则运算:

  • 任何数都是四则表达式;

  • 如果a和b是四则运算表达式,那么a,b满足:

    • a+b
    • a-b
    • a*b
    • a/b

    都是四则运算.

由此我们可以得出正则表达式的递归定义: 屏幕截图 2024-01-24 201100.png

语言的运算

屏幕截图 2024-01-24 183100.png

运算优先级

屏幕截图 2024-01-24 193752.png 这里着重说明“*”的用法:

屏幕截图 2024-01-24 194251.png

*表示被“*”修饰的表达式任意组成

给出正则表达式(aa)*(bb)*b定义的语言.

L((aa)(bb)b)=L((aa))L((bb))L(b)=({a}{a})({b}{b})b={a2}{b2}{b}={a2nb2m+1n>=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\}

化简规则

屏幕截图 2024-01-24 203442.png

自动机和正则表达式的等价性

若L=L(A)是某DFA A的表达式,那么存在正则表达式R满足L = L (R).

我们需要构造一个和正则表达式等价的自动机来完成这一点的证明。

屏幕截图 2024-01-24 204505.png

递归表达式

屏幕截图 2024-01-24 205256.png

我们可以得出普遍的状态转移图如上,比如得到接受状态需要通过输入x和y,那么R = x + y,由此我们知道R应当是所有初始状态到接收状态路径的集合,我们要用正则表达式构造这个表达。

更一般的,R应该是通过更多个输入到达接受状态,我们可以画出以下图像:

屏幕截图 2024-01-24 205921.png

其中Rij表示从i节点到j节点的路径,Rij(k),表示不经过kij的路径,我们推断任意两节点的路径可以用以下表达:其中R_{ij}表示从i节点到j节点的路径,R_{ij}^{(k)},表示不经过k的i到j的路径,我们推断任意两节点的路径可以用以下表达:
Rij=Rij(K)+Rik(k)(Rk(k))Rkj(k)R_{ij} = R_{ij}^{(K)} + R_{ik}^{(k)}(R_k^{(k)})^*R_{kj}^{(k)}

递归到直接相连的两个节点。

将DFA的状态从1开始编号,1为初始状态:

屏幕截图 2024-01-24 210801.png

那么与A等价的正则表达式为:

jFR1j(n)\bigcup_{j\in F} R_{1j}^{(n)}

递归表达为:

Rij(k)=Rij(k1)+Rik(k1)+(Rkkk1)Rkj(k1)R_{ij}^{(k)} = R_{ij}^{(k-1)}+R_{ik}^{(k-1)}+(R_{kk}^{k-1})^*R_{kj}^{(k-1)}
Rij0={aδ(qi,a)=qj,ijaδ(qi,a)=qj,{ϵ},i=jR_{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}

证明递归表达式正确:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述