【计算理论】下推自动机 PDA 及 计算示例

举报
韩曙亮 发表于 2022/01/11 01:36:20 2022/01/11
【摘要】 文章目录 一、 下推自动机二、下推自动机 计算过程三、下推自动机 计算结果四、下推自动机 计算示例 一、 下推自动机 1 . 下推自动机 由来 : 下推自动机 ( ...





一、 下推自动机



1 . 下推自动机 由来 : 下推自动机 ( PDA ) 是在 确定性有限自动机 ( DFA ) 基础上 扩展而来的 ;


2 . 下面是 下推自动机 ( PDA ) 的示意图 :

在这里插入图片描述

① 输入字符串 : 将输入的字符写在右侧的带子上 ;

② 开始状态 : 读取指针 ( 读头 ) 开始指向最左端字符 , 此时处于开始状态 ;

③ 启动自动机 , 自动机根据读取的指令进行计算 ;

④ 读取指令 : 每读取一个字符 , 自动机跳转到一个新的状态 , 指针向后移动一个格子 ;

⑤ 自动机停止 : 当读取指针指向输入的最右端 , 此时自动机就停止了 , 此时查看当前状态 , 如果当前是接受状态 , 称自动机接受该字符串 ( 带子上写的字符组成的字符串 ) , 反之 , 自动机不接受该字符串 ;





二、下推自动机 计算过程



1 . 下推自动机 ( PDA ) 提升了自动机计算能力 : 在上述自动机的基础上 , 提升该自动机的计算能力 , 引入一个新的栈结构 ;

栈特点 : ① 后进先出 , ② 存储能力无限 ;


2 . 下推自动机计算有两个部分 , 一个是字符的读取 , 一个是栈内字符的存取 , 栈内只有最上面的字符会被替换 ;


3 . 下推自动机 ( PDA ) 的指令格式 : 该指令包含了 上述讲的两个操作 ;


1 , 0 → ε 1 , 0 \to \varepsilon 1,0ε


① 自动机字符读取 : 左侧的 1 1 1 是从带子上读取的字符 ;

② 栈内字符存取操作 : 0 → ε 0 \to \varepsilon 0ε 是需要在栈上进行的操作 , 将栈顶的 0 0 0 取出 , 然后将 ε \varepsilon ε 放入到栈中 , 相当于在栈中 , 使用 ε \varepsilon ε 将栈顶的 0 0 0 替换掉 ;





三、下推自动机 计算结果



1 . 下推自动机 ( PDA ) 是否接受字符串 : 将带子上的字符全部读取完毕后 , 此时的状态如果是 接受状态 , 那么带子上的字符组成的字符串就可以被 下推自动机接受 ;


2 . 计算能力 : 下推自动机 ( PDA ) 比 确定性有限自动机 ( DFA ) 多了栈上的操作 , 下推自动机 ( PDA ) 的计算能力比有限自动机 ( DFA ) 计算能力高 ;


3 . 语言识别能力 : 确定性有限自动机 ( DFA ) 是不能识别 { 0 n 1 n : n ≥ 0 } \{ 0^n 1^n : n \geq 0\} {0n1n:n0} 语言的 , 但是 下推自动机 ( PDA ) 是可以认识该语言的 ;





四、下推自动机 计算示例



在这里插入图片描述

上图的下推自动机有 4 4 4 个状态 q 1 , q 2 , q 3 , q 4 q_1 , q_2 , q_3 , q_4 q1,q2,q3,q4 ;

读取 0011 0011 0011 字符串 , 并给出 下推自动机 计算过程 ;


ε , ε → S \varepsilon , \varepsilon \to S ε,εS 指令含义 : 当读取 ε \varepsilon ε 字符后 , ε → S \varepsilon \to S εS 指的是在栈上的操作 , 从栈内取出 ε \varepsilon ε 字符 , 向栈内放入一个 S S S 字符 , 本质是在栈中使用 S S S 替换 ε \varepsilon ε 字符 ;





1 . 开始状态 是 q 1 q_1 q1 , 此时读头指向 0 0 0 位置 , 栈内是空的 ;

在这里插入图片描述


2 . 开始状态 q 1 q_1 q1 : 读取 ε , ε → S \varepsilon , \varepsilon \to S ε,εS 指令 , 读取 ε \varepsilon ε 字符后 , ε → S \varepsilon \to S εS 指的是在栈上的操作 , 从栈内拿走 ε \varepsilon ε , ε \varepsilon ε 是空字符 , 相当于不用拿 , 并将 S S S 字符放入栈 , 相当于使用 S S S 替换 栈内 空字符 ε \varepsilon ε ,

S S S 字符的作用 : 下推自动机是无法识别栈底的 , S S S 作用是辅助下推自动机识别栈底元素 , 当下推自动机读取到 S S S 时 , 就知道已经读取到栈底了 ;

开始状态 读取字符 操作 ε , ε → S \varepsilon , \varepsilon \to S ε,εS , 最终向栈中放入了字符 S S S ;

状态跳转 : 此时 自动机状态 跳转到了 q 2 q_2 q2 状态 ;

在这里插入图片描述


3 . q 2 q_2 q2 状态 : 读取 0 , ε → 0 0 , \varepsilon \to 0 0,ε0 指令 , 读取到一个 0 0 0 , 从栈内拿走 ε \varepsilon ε , 使用 0 0 0 替换 ε \varepsilon ε , 并将该替换后的 0 0 0 放入栈中 ; 相当于在栈中 , 使用 0 0 0 替换 ε \varepsilon ε ; 之后依然保持 q 2 q_2 q2 状态不变 ;

状态跳转 : 下推自动机状态 仍保持 q 2 q_2 q2 状态 ;

在这里插入图片描述


4 . q 2 q_2 q2 状态 : 再次读取 0 , ε → 0 0 , \varepsilon \to 0 0,ε0 指令 , 读取到一个 0 0 0 , 从栈内拿走 0 0 0 字符 , 使用 0 0 0 替换 ε \varepsilon ε , 并将该替换后的 0 0 0 放入栈中 ; 之后依然保持 q 2 q_2 q2 状态不变 ;

状态跳转 : 下推自动机状态 仍保持 q 2 q_2 q2 状态 ;
在这里插入图片描述


5 . q 2 q_2 q2 状态 , 读取 1 , 0 → ε 1 , 0 \to \varepsilon 1,0ε 指令 , 读取到一个 1 1 1 , 从栈中拿走一个 0 0 0 , 并将 ε \varepsilon ε 放入栈中 , ε \varepsilon ε 是空字符串 , 从栈内拿取放入 ε \varepsilon ε 栈不变 , 相当于将一个 0 0 0 从栈内拿出 ;

状态跳转 : 下推自动机状态 从 q 2 q_2 q2 状态跳转到 q 3 q_3 q3 状态 ;

在这里插入图片描述


6 . q 3 q_3 q3 状态 : 读取 1 , 0 → ε 1 , 0 \to \varepsilon 1,0ε 指令 , 从栈中 , 拿走一个 0 0 0 , 将 ε \varepsilon ε 放入栈内 , 相当于在栈内使用 ε \varepsilon ε 空字符 替换 0 0 0 , 操作完成后 , 栈内少一个 0 0 0 ;

状态跳转 : 下推自动机状态 仍保持 q 3 q_3 q3 状态 ;

在这里插入图片描述


7 . q 3 q_3 q3 状态 , 读头读取到了最右端 , 所有字符都读取完毕 , 此时不需要读取任何字符 , 读取 ε , S → ε \varepsilon , S \to \varepsilon ε,Sε 指令 , 从栈内拿走 S S S , 将 ε \varepsilon ε 放入栈中 , 跳转到 q 4 q_4 q4 状态 ;

在这里插入图片描述

此时 , 栈清空 , 下推自动机停止计算 ;

q 4 q_4 q4 是个双圈 , 接受状态 , 说明该下推自动机接受该 0011 0011 0011 字符串 ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/106222997

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。