📜  为 L = {0n1m2(n+m) | 构造下推自动机m,n ≥ 0}(1)

📅  最后修改于: 2023-12-03 14:48:54.826000             🧑  作者: Mango

构造下推自动机介绍

什么是下推自动机?

下推自动机(Pushdown automaton,PDA)是在有限自动机(finite automaton)的基础上加上一个堆栈(stack)构成的自动机。与有限自动机相比,下推自动机有更高的识别能力,可以识别上下文无关文法(Context-free grammar)。下推自动机可以通过状态图或转移表的方式进行表示。

下推自动机的构造

下推自动机的构造主要有两种方法,一种是通过构建上下文无关文法(CFG)来构造,一种是直接构造下推自动机的状态图或转移表。

通过构建 CFG 构造 PDA
  1. 构建与文法对应的 PDA,分析使用栈的方式与上下文无关文法的演生规则相对应。
  2. 构造 CFG 的推导规则与状态图之间的对应关系,用状态来代替 CFG 规则的左部,用状态转移来代替 CFG 规则的右部,用栈来表示 CFG 规则的右部。
直接构造 PDA 的状态图或转移表
  1. PDA 的状态可以直接由 CFG 的非终结符号和终结符号构成。
  2. PDA 的转移函数可以根据 CFG 的产生式来进行构造。
L = {0^n1^m2^(n+m) | m,n ≥ 0}

考虑语言 L = {0^n1^m2^(n+m) | m,n ≥ 0},我们可以通过一些步骤来构造对应下推自动机。

  1. 确定状态集合 Q

在此语言中,字符串以 0 开头,因此可以把下推自动机的状态划分为三种,分别是:

  • 状态 q0,接受输入的 0 。
  • 状态 q1,接受输入的 1 ,并将其压入栈中。
  • 状态 q2,接受输入的 2 ,并将栈中的 1 和前面的 0 一起弹出。
  1. 确定初始状态 zk

初始状态为 q0 。

  1. 确定接受状态集合 F

状态 q0、q1、q2 均可以作为接受状态,但我们必须在状态 q2 中清空栈中的元素,以确保只有符合语言 L 的字符串能被接受。

  1. 确定输入符号集合 Σ

输入符号集合包括 0 ,1 和 2 。

  1. 确定栈符号集合 Γ

在此语言中,我们只需要一个栈符号 1 。

  1. 确定转移函数 δ

以下是转移函数的一部分:

| 当前状态 | (栈顶)| 输入符号 | 下一状态 | 改变栈 | | --- | --- | --- | --- | --- | | q0 | / | 0 | q1 | 将 1 压入栈中 | | q1 | 1 | 1 | q1 | 将 1 压入栈中 | | q1 | 1 | 2 | q2 | 将 1 弹出,弹出前所有的 0 将会和下一个 2 配对 | | q2 | / | / | q2 | 不进行任何操作 |

  1. 确定结束

转移函数添加完毕后,我们已经成功地构造了与此语言相对应的下推自动机。

代码示例
示例代码暂无提供,此处仅给出一个下推自动机的状态图示意图:

![image](https://i.loli.net/2021/11/12/SlCmpvV7EFcQ2zK.png)