I . 下推自动机 设计



设计下推自动机 , 可以识别 {wwR:w{0,1}}\{ ww^R : w \in \{ 0, 1\} ^* \} 语言 ;


RR 表示镜面反射 , 如果 ww 是由 0,10 , 1 组成的字符串 011011 , 那么 wRw^R 就是其镜面反射 100100 字符串 , 然后将 wwwRw^R 串联在一起 , wwR=011100ww^R = 011100 ;


1 . 首先生成开始状态 ;

开始状态是接受状态 , 因为如果字符串是空字符串 , 空字符串的镜面反射还是空字符串 , 因此读取空字符串后的状态 , 是接受状态 , 开始状态其本身就是接受状态 ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


2 . 向栈底放入 字符 SS , 用于作为栈底的标识 , 生成 ε,εS\varepsilon , \varepsilon \to S 指令 ;


ε,εS\varepsilon , \varepsilon \to S 指令包含 22 部分 : 读取字符 , 和 栈内操作 ;

  • 读取字符 : 指的是读取的带子上的字符串 , ε,εS\varepsilon , \varepsilon \to S 中前面的 ε\varepsilon 指的是从带子上读取 ε\varepsilon ;

  • 栈内操作 : 使用某个字符 替换 栈顶字符 ; ε,εS\varepsilon , \varepsilon \to S 中后面的 εS\varepsilon \to S 指的是使用 SS 字符替换栈顶的空字符 ε\varepsilon ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


3 . 镜面反射的前半个镜面 :


00 入栈 : 每读取一个 00 , 就将 00 放入栈中 , 生成指令 0,ε00, \varepsilon \to 0 ;

11 入栈 : 每读取一个 11 , 就将 11 放入栈中 , 生成指令 1,ε11, \varepsilon \to 1 ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


4 . 跳转到新的状态 , 在新的状态执行 后半个镜面的操作 :


无条件跳转就是读取 ε\varepsilon , 并且栈中元素保持不变 , 即使用 ε\varepsilon 替换栈顶的 ε\varepsilon ;

生成的指令为

ε,εε\varepsilon , \varepsilon \to \varepsilon


当前的下推自动机 :

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


5 . 镜面反射的后半个镜面 :


00 出栈 : 每读取一个 00 , 从栈里拿走一个 00 , 生成指令 0,0ε0, 0 \to \varepsilon ;

11 出栈 : 每读取一个 11 , 从栈里拿走一个 00 , 生成指令 1,1ε1, 1 \to \varepsilon ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


6 . 栈清空 , 跳转到最后的 接受状态 : 上述出栈操作执行若干次后, 总能将栈内的字符取出完毕 , 只剩下一个 SS 字符 , 该字符是栈底的标识 ; 此时将 SS 字符从栈内取出即可 ;


生成如下指令 :

ε,Sε\varepsilon , S \to \varepsilon

指令含义是 读取 ε\varepsilon 字符 , 使用 ε\varepsilon 字符替换栈中的 SS 字符 ;


最后跳转到的状态是接受状态 ;


当前下推自动机为 :

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )





II . 上下文无关语法 ( CFG ) 等价于 下推自动机 ( PDA )



假设某语言由 上下文无关语法 ( CFG ) 生成 , 找到一个 下推自动机 ( PDA ) 识别该语言 ;


构造下推自动机流程 ( PDA ) :


构造下推自动机 , 包含 33 个状态 , 开始状态 qstartq_{start} , Loop 循环状态 qloopq_{loop} , 可接受状态 qacceptq_{accept} ;


1 . qstartq_{start} 开始状态 :

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )

读取 ε\varepsilon 字符 , 使用 TSTS 替换栈顶的 ε\varepsilon , 对应的指令为


ε,εTS\varepsilon , \varepsilon \to TS

其中的 SS 是栈顶的标识 , TT 是栈内的实际字符 ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


2 . qloopq_{loop} 循环阶段 , 根据 上下文无关语法 ( CFG ) 做替换 ;


① 当栈顶是变元时 , 作变换 , 读取 ε\varepsilon , 即什么都不读取 , 将栈顶的变元 替换成 ww , 生成的 下推自动机 指令为 " ε,Aw\varepsilon , A \to w " , 对应着的上下文无关语法规则为 AwA \to w ;

② 当栈顶是终端字符 ( 常元 ) , 让带子上的 读头 读取一个终端字符 , 对应的栈中 , 将栈顶的终端字符删除 , 相当于使用 ε\varepsilon 替换终端字符 , 生成指令 " a,aεa , a \to \varepsilon " ;


一直读取 终端字符 , 并将栈顶的终端字符删除 , 一直循环该操作 , 直到 栈顶是一个变元 未为止 ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )


3 . 跳转到 qacceptq_{accept} 状态 : 当栈内的字符都出栈后 , 只剩下一个 SS 字符作为栈底标识 , 此时 SS 出栈 , 生成对应的 下推自动机指令 " ε,Sε\varepsilon , S \to \varepsilon " , 即使用空字符 ε\varepsilon 替换栈内的 SS 字符 ;

之后跳转到最后一个状态 , qacceptq_{accept} 可接受状态 ;

【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )

相关文章:

  • 2021-08-05
  • 2021-08-20
  • 2021-04-24
  • 2021-07-18
  • 2021-12-18
  • 2021-12-31
  • 2021-11-11
  • 2021-11-20
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-12
  • 2021-05-18
  • 2022-02-03
  • 2021-06-22
相关资源
相似解决方案