【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )

文章目录





一、推广型的非确定性有限自动机 ( GNFA ) 引入



1 . 给定一个自动机 , 必有一个正则表达式可以表示其所识别的语言 ;


2 . 引入 推广型的非确定性有限自动机 ( GNFA ) : 首先要构造一个推广的一般型的非确定性有限自动机 , 每次消除一个状态 , 最后只剩下两个状态 , 此时箭头上的正则表达式就是最终的正则表达式 ;

在这里插入图片描述

上述自动机是一个 推广型的非确定性有限自动机 ( GNFA ) , 箭头上 不是单个字符 或 空字符 , 而是 正则表达式 ;



3 . 推广型的非确定性有限自动机 ( GNFA ) 中的推广的体现 :


① 非确定性有限自动机 ( NFA ) : 箭头上 只能出现 字符 , 空字符串 , 2 2 2 种输入 , 不能出现其它输入内容 ;

② 推广型的非确定性有限自动机 ( GNFA ) : 箭头上 可以出现 字符 , 空字符串 , 空集 , 正则表达式 , 4 4 4 种输入 ;


4 . 推广型的非确定性有限自动机 ( GNFA ) 与 非确定性有限自动机 ( NFA ) 是等价的 ;





二、推广型的非确定性有限自动机 ( GNFA ) 删除状态



给定一个 推广型的非确定性有限自动机 ( GNFA ) , 找到一个正则表达式 , 代表给定自动机的语言 ;

在这里插入图片描述

1 . 需求描述 : 上述自动机中 , R 1 , R 2 , R 3 , R 4 R_1 , R_2, R_3, R_4 R1,R2,R3,R4 都是正则表达式 ;


删除 q 0 q_0 q0 状态 : 目前希望能删除 自动机中的 q 0 q_0 q0 状态 , 删除 q 0 q_0 q0 之后 , 会省略一部分语言 , 这里 省略了 R 1 , R 2 , R 3 R_1 , R_2 , R_3 R1,R2,R3 ;

语言要求 : q 0 q_0 q0 状态删除后 , 不影响整个自动机所接受的语言 , 那么需要将省略的部分语言 , 补充到 R 4 R_4 R4 中 ;



2 . R 1 , R 2 , R 3 R_1 , R_2 , R_3 R1,R2,R3 关系分析 :


R 2 R_2 R2 星运算 : R 2 R_2 R2 是一个循环 , q 0 q_0 q0 接受 R 2 R_2 R2 后 , 仍然保持 q 0 q_0 q0 状态 , 这里的该循环的正则表达式表示为 ( R 2 ) ∗ (R_2)^* (R2) ;

R 1 R_1 R1 ( R 2 ) ∗ (R_2)^* (R2) 串联运算 : R 1 R_1 R1 ( R 2 ) ∗ (R_2)^* (R2) 是串联关系 , 表示为 R 1 ( R 2 ) ∗ R_1 (R_2)^* R1(R2)

③ 与 R 3 R_3 R3 的串联运算 : R 1 ( R 2 ) ∗ R_1 (R_2)^* R1(R2) R 3 R_3 R3 是串联关系 , 表示为 R 1 ( R 2 ) ∗ R 3 R_1 (R_2)^* R_3 R1(R2)R3 ;


3 . 并运算 : R 1 ( R 2 ) ∗ R 3 R_1 (R_2)^* R_3 R1(R2)R3 R 4 R_4 R4 是并集关系 , 都是 q i q_i qi q j q_j qj 的输入的正则表达式 ;


4 . 两个正则表达式并运算表示为 : ( R 1 ( R 2 ) ∗ R 3 ) ∪ R 4 ( R_1 (R_2)^* R_3 ) \cup R_4 (R1(R2)R3)R4

在这里插入图片描述





三、确定性有限自动机 ( DFA ) 转为 正则表达式



在这里插入图片描述

上图中的自动机是一个 3 3 3 个状态的 确定性有限自动机 ( DFA ) ;


将上述 确定性有限自动机 ( DFA ) 转为正则表达式 ;





四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 1 ) 添加开始状态 S S S 和结束状态 T T T



1 . 添加开始和结束状态 :


① 添加开始状态 : 添加新的开始状态 S S S , 使用 ε \varepsilon ε 箭头指向当前 确定性有限自动机 ( DFA ) 的 开始状态 ;

在这里插入图片描述


② 添加结束状态 : 再次添加一个 接受状态 , 从 确定性有限自动机 ( DFA ) 的接受状态 指向该新的结束状态 , 该新添加的结束状态 是 接受状态 ;

在这里插入图片描述


2 . 确定性有限自动机 ( DFA ) 转为 正则表达式 思想 : 逐步删除 1 , 2 , 3 1,2,3 1,2,3 状态 , 每次删除一个状态 , 生成新的正则表达式 , 最后就剩下 开始状态 S S S , 和结束状态 T T T , 最后剩下的就是 S S S T T T 状态的正则表达式 , 也是自动机的正则表达式 ;





五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 删除方法



1 . 删除 2 2 2 状态 :


① 信息抽取转移 : 找到 与 2 2 2 状态 所有的相关的信息 , 添加到其它的箭头上 , 如果没有创建一个新的箭头 ;

2 2 2 状态的输入和输出 : 哪些状态 有箭头 输入到 2 2 2 状态 , 2 2 2 状态 有哪些箭头 输出到了其它状态 ;

③ 信息转移 : 将每个输入 和 每个输出的信息全部转移 , 一条信息也不能遗漏 ;

2 2 2 状态的输入输出统计 : 3 3 3 条输入 , 2 2 2 条输出 ; 其中有 一条输入输出是从 2 2 2 状态输出指向 它自己 , 共有 4 4 4 个箭头信
息 ; 外部输入有 2 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息个数是 外 部 输 入 条 数 × 外 部 输 出 条 数 外部输入条数 \times 外部输出条数 × ;


2 . 2 2 2 状态的循环 ( 1 1 1 输入 1 1 1 输出 ) : 2 2 2 状态下读取 b b b , 仍然回到 2 2 2 状态 ; 这 1 1 1 个输入 , 1 1 1 个输出 , 是从 2 2 2 状态输出到 2 2 2 状态 , 这是一个 星计算 ; 使用 b ∗ b^* b 表示 ;





六、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 信息梳理



状态 2 2 2 信息梳理如下 ;


1 . 2 2 2 状态信息输入 :


S S S 状态 读取 ε \varepsilon ε 跳转到 1 1 1 状态 ;

3 3 3 状态 读取 a a a 跳转到 1 1 1 状态 ;


2 . 2 2 2 状态信息输出 :

1 1 1 状态读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 正则表达式 跳转到 3 3 3 状态 ;


3 . 箭头信息生成个数 : 外部输入有 2 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息条数 :

外 部 输 入 条 数 × 外 部 输 出 条 数 = 2 × 1 = 2 外部输入条数 \times 外部输出条数 = 2 \times 1 = 2 ×=2×1=2





七、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 : 1 1 1 -> 2 2 2 -> 3 3 3 生成信息 1 1 1 -> 3 3 3



1 . 1 1 1 -> 2 2 2 -> 3 3 3 状态跳转 :


1 1 1 状态读取 a a a 跳转到 2 2 2 状态 : 这里是状态 2 2 2 的一条输入 , 使用 a a a 表示 ;

2 2 2 状态读取 b b b 跳转到 2 2 2 状态 : 这是无限的星计算 , 使用 b ∗ b^* b 表示 ;

2 2 2 状态读取 a a a 跳转到 3 3 3 状态 : 这里是状态 2 2 2 的一条输出 , 使用 a a a 表示 ;


2 . 3 3 3 个正则表达式是串联关系 ;


中间经历的过程是 1 1 1 状态输入 a a a 跳转到 2 2 2 状态 , 2 2 2 本身可以有无限个星计算 , 2 2 2 状态输入 a a a 跳转到 3 3 3 状态 ;

使用正则表达式表示为 a b ∗ a ab^*a aba ;


4 . 生成箭头信息 :


1 1 1 状态下 , 读取 a b ∗ a ab^*a aba 正则表达式 , 可以跳转到 3 3 3 状态 ;

a b ∗ a ab^*a aba 正则表达式 与 1 1 1 3 3 3 跳转箭头上的 b b b 进行并计算 , 得到

( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b

这是 1 1 1 跳转到 3 3 3 的正则表达式 ;

在这里插入图片描述





八、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 : 3 3 3 -> 2 2 2 -> 3 3 3 生成信息 3 3 3 -> 3 3 3



1 . 3 3 3 -> 2 2 2 -> 3 3 3 状态跳转 :


3 3 3 状态读取 b b b 跳转到 2 2 2 状态 : 这里是状态 2 2 2 的一条输入 , 使用 b b b 表示 ;

2 2 2 状态读取 b b b 跳转到 2 2 2 状态 : 这是无限的星计算 , 使用 b ∗ b^* b 表示 ;

2 2 2 状态读取 a a a 跳转到 3 3 3 状态 : 这里是状态 2 2 2 的一条输出 , 使用 a a a 表示 ;


2 . 3 3 3 个正则表达式是串联关系 ;


中间经历的过程是 3 3 3 状态输入 b b b 跳转到 2 2 2 状态 , 2 2 2 本身可以有无限个星计算 , 2 2 2 状态输入 a a a 跳转到 3 3 3 状态 ;

三者串联关系 , 使用正则表达式表示为 b b ∗ a bb^*a bba ;

3 3 3 状态下 , 读取 b b ∗ a bb^*a bba 正则表达式 , 可以跳转到 3 3 3 状态 ;


3 . 生成箭头信息 :


3 3 3 状态添加一个箭头指向它自身 , 箭头的接收的正则表达式是

b b ∗ a bb^*a bba

这是 1 1 1 跳转到 3 3 3 的正则表达式 ; 表示 3 3 3 状态下接收 b b ∗ a bb^*a bba 正则表达式 , 仍然跳转到 3 3 3 状态 ;

在这里插入图片描述





九、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 阶段性结果



删除 2 2 2 状态结果 :

在这里插入图片描述





十、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 信息梳理



状态 1 1 1 信息梳理如下 ;


1 . 1 1 1 状态信息输入 :


S S S 状态 读取 ε \varepsilon ε 跳转到 1 1 1 状态 ;

3 3 3 状态 读取 a a a 跳转到 1 1 1 状态 ;


2 . 1 1 1 状态信息输出 :

1 1 1 状态读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 正则表达式 跳转到 3 3 3 状态 ;


3 . 箭头信息生成个数 : 外部输入有 2 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息条数 :

外 部 输 入 条 数 × 外 部 输 出 条 数 = 2 × 1 = 2 外部输入条数 \times 外部输出条数 = 2 \times 1 = 2 ×=2×1=2





十一、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 : 3 3 3 -> 1 1 1 -> 3 3 3 生成信息 3 3 3 -> 3 3 3



1 . 3 3 3 -> 1 1 1 -> 3 3 3 状态跳转 :


3 3 3 状态 读取 a a a 跳转到 1 1 1 状态 , 正则表达式 表示为 a a a ;

1 1 1 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 正则表达式 跳转到 3 3 3 , 正则表达式 表示为 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b ;


2 . 正则表达式 : 上述两个正则表达式是串联关系 , 正则表达式表示为 a ( ( a b ∗ a ) ∪ b ) a ( (ab^*a) \cup b ) a((aba)b)


3 . 生成新的箭头信息 :


新增加的 3 3 3 状态下读取 a ( ( a b ∗ a ) ∪ b ) a ( (ab^*a) \cup b ) a((aba)b) 跳转到 3 3 3 ;

与原来的 3 3 3 读取 b b ∗ a bb^*a bba 跳转到 3 3 3 是并联关系 ,

最终的 3 3 3 读取一个正则表达手 跳转到 3 3 3 状态 , 的正则表达式为

( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((aba)b))(bba)

在这里插入图片描述





十二、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 : S S S -> 1 1 1 -> 3 3 3 生成信息 S S S -> 3 3 3



1 . S S S -> 1 1 1 -> 3 3 3 状态跳转 :


S S S 状态 读取 ε \varepsilon ε 跳转到 1 1 1 状态 , 正则表达式 表示为 ε \varepsilon ε ;

1 1 1 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 正则表达式 跳转到 3 3 3 , 正则表达式 表示为 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b ;


上述两个正则表达式是串联关系 , 正则表达式表示为 ε ∪ ( ( a b ∗ a ) ∪ b ) \varepsilon \cup ( (ab^*a) \cup b ) ε((aba)b) , 其中 ε \varepsilon ε 可以省略 , 最终表示为 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b


2 . 新增加 S S S 状态 到 3 3 3 状态之间的跳转 : S S S 状态下读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 正则表达式 , 跳转到 3 3 3 状态 ;

在这里插入图片描述





十三、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 , 1 2 , 1 2,1 阶段性结果



在这里插入图片描述





十四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 3 3 3 信息梳理



状态 3 3 3 信息梳理 :


1 . 3 3 3 状态信息输入 :


S S S 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 跳转到 3 3 3 状态 ;

3 3 3 状态 读取 ( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((aba)b))(bba) 跳转到 3 3 3 状态 ;


2 . 3 3 3 状态信息输出 :


3 3 3 状态 读取 ( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((aba)b))(bba) 跳转到 3 3 3 状态 ;

3 3 3 状态读取 ε \varepsilon ε 正则表达式 跳转到 T T T 状态 ;


3 . 箭头信息生成个数 : 自身循环有一个 , 从 3 3 3 状态 自身输出到输入 , 外部输入有 1 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息条数 :

外 部 输 入 条 数 × 外 部 输 出 条 数 = 1 × 1 = 1 外部输入条数 \times 外部输出条数 = 1 \times 1 = 1 ×=1×1=1





十五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 3 3 3 : S S S -> 3 3 3 -> T T T 生成信息 S S S -> T T T



1 . S S S -> 3 3 3 -> T T T 状态跳转 :


S S S 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (aba)b 跳转到 3 3 3 状态 ;

3 3 3 状态 读取 ( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((aba)b))(bba) 跳转到 3 3 3 状态 , 星计算 , 表示成 ( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ∗ ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )^* (a((aba)b))(bba)

3 3 3 状态读取 ε \varepsilon ε 正则表达式 跳转到 T T T 状态 ;


上述 3 3 3 个正则表达式是串联关系 , 正则表达式表示为 :

( ( a b ∗ a ) ∪ b ) ∘ ( ( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ) ∗ ( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^* ((aba)b)((a((aba)b))(bba))


2 . 新增加 S S S 状态 到 T T T 状态之间的跳转 : S S S 状态下读取 ( ( a b ∗ a ) ∪ b ) ∘ ( ( a    (    ( a b ∗ a ) ∪ b    ) ) ∪ ( b b ∗ a ) ) ∗ ( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^* ((aba)b)((a((aba)b))(bba)) 正则表达式 , 跳转到 T T T 状态 ;

在这里插入图片描述





十六、确定性有限自动机 ( DFA ) 转为 正则表达式 总结



由上述示例可知 , 任何 确定性有限自动机 都可以转为 正则表达式 , 非确定性有限自动机 与 确定性有限自动机 又是等价的 , 因此 有限自动机 都可以转为 正则表达式 ;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值