句法模式识别/结构模式识别(五)---自动机


相关文章:
句法模式识别/结构模式识别(一)—概述
句法模式识别/结构模式识别(二)—形式语言
句法模式识别/结构模式识别(三)—文法推断
句法模式识别/结构模式识别(四)—句法分析


一、自动机的概念

自动机就是一个句法模式识别器,作用是识别输入链是否符合与该机相对应的文法。其中,每类文法对应一类自动机:
链文法:

  • 0型文法:图灵机
  • 1型文法:线性有界自动机
  • 2型文法:下推自动机
  • 3型文法:有限态自动机

其他

  • 树文法:树自动机

二、有限态自动机与正则文法

2.1 有限态自动机

在这里插入图片描述

2.2 有限态自动机接受语言的方式

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

2.3 有限态自动机与正则文法的对应状态

1)按正则文法构造有限态自动机
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述2)按有限态自动机确定正则文法
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

三、下推自动机与上下文无关文法

3.1下推自动机

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

例:设计识别 L 01 = { 0 n 1 n ∣ n ⩾ 1 } \boldsymbol{L}_{01}=\left\{ 0^{\boldsymbol{n}}1^{\boldsymbol{n}}|\boldsymbol{n}\geqslant 1 \right\} L01={0n1nn1}的PDA。
解:
因为 0 n 1 n 0^{\boldsymbol{n}}1^{\boldsymbol{n}} 0n1n不是一个正则语言,所以不能使用有限自动机来识别。但是PDA具有一个栈的结构,我们可以用栈来保存一些信息,所以PDA可以识别 0 n 1 n 0^{\boldsymbol{n}}1^{\boldsymbol{n}} 0n1n这样的语言
,当PDA读入0的时候,我们将0全部都压入栈中,当读入一个1的时候,每读入一个1,从栈中弹出一个0,使得0和1的数量是相等的。当扫描完整个输入串的时候,如果刚好把栈底符号 Z 0 \boldsymbol{Z}_0 Z0露出来了,那么我们可以通过一个空转移跳转到一个接收状态,去接收这样一个串。
我们可以通过状态转移图来分析这个PDA:

① 利用开始状态来压入全部的0
在这里插入图片描述
其中, 0 , Z 0 / 0 Z 0 0,\boldsymbol{Z}_0/0\boldsymbol{Z}_0 0,Z0/0Z0的意思是:当读入一个0的时候,如果当前的栈顶是 Z 0 \boldsymbol{Z}_0 Z0,那么我们就把 Z 0 \boldsymbol{Z}_0 Z0替换成0 Z 0 \boldsymbol{Z}_0 Z0

② 当读入一个0时,栈顶就已经不是 Z 0 \boldsymbol{Z}_0 Z0了,而是0了,所以其他剩下的0,要通过与第一个用0把 Z 0 \boldsymbol{Z}_0 Z0替换掉的相同的方法来处理,将栈顶的一个0替换成两个0:0,0/00
在这里插入图片描述
③ 此时,这个动作已经可以将前面的全部0压栈,因为我们所有的0都在1的前面,所以将0压入栈和将0弹出栈必须使用不同的状态,当读入一个1的时候,我们要求栈顶是0才能跳转过来,我们把0弹出 ( 1 , 0 / ε ) \left( 1,0/\boldsymbol{\varepsilon } \right) (1,0/ε),修改为状态 q 1 \boldsymbol{q}_1 q1

在这里插入图片描述

④ 接下来将其他的1和0进行匹配,当读入其他的1的时候,将其他的0弹出 ( 1 , 0 / ε ) \left( 1,0/\boldsymbol{\varepsilon } \right) (1,0/ε),在 q 1 \boldsymbol{q}_1 q1的时候就会保证所有的0和所有的1的数量都是相等的
在这里插入图片描述⑤ 当扫描完整个输入串之后,刚好把栈底的符号 Z 0 \boldsymbol{Z}_0 Z0露出来了,我们利用空转移,通过栈顶的 Z 0 \boldsymbol{Z}_0 Z0不变 ( ε , Z 0 / Z 0 ) \left( \boldsymbol{\varepsilon },\boldsymbol{Z}_0/\boldsymbol{Z}_0 \right) (ε,Z0/Z0),跳转到一个接收状态 q 2 \boldsymbol{q}_2 q2,就完成了PDA的设计
在这里插入图片描述
接下来检验一下是否正确:比如00111,我们用所设计的PDA来处理他时,会不会被接受呢?当读入前面两个0时会被压栈。再读入前面两个1的时候刚好把前面两个0都弹出来了,这个时候已经把栈底符号 Z 0 \boldsymbol{Z}_0 Z0露出来了,并且可以通过空转移跳转到接收状态 q 2 \boldsymbol{q}_2 q2,那么就不会接收这个串00111,因为我们判断一个字符串是否被接收的时候,一定要在扫描完整个字符串之后,也就是读入最后一个1之后再去判断,但是如果在之前就经过空转移跳转到 q 2 \boldsymbol{q}_2 q2了,相当于会卡死,所以不接受这个输入串。

3.2 下推自动机接受语言的方式

在这里插入图片描述

3.3 下推自动机与上下文无关文法的对应关系

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值