使用C++构建用于语言L = {0(n+m)1m2n | m, n = 0}的下推自动机。
给定一种语言“L”,任务是为该语言构建一个下推自动机。该语言说明0的出现次数将等于1和2的出现次数之和,并且1和2的出现次数至少为1(也可以使字符串为空),并且该自动机应该接受该字符串。
什么是下推自动机?
下推自动机或PDA是一种实现上下文无关文法的方法,类似于我们为正则文法设计确定性有限自动机或DFA的方式。DFA可以处理有限数据,但PDA可以处理无限数据。我们可以将下推自动机理解为“有限状态机”和“栈”的组合。
下推自动机有三个组成部分:
输入带,
控制单元,以及
一个无限大小的栈。
PDA可以形式化地描述为一个7元组 (Q, Ʃ, S, δ, q0, I, F) :
Q 是有限数量的状态
Ʃ 是输入字母表
S 是栈符号
δ 是转移函数:Q × (Ʃ υ {ε}) × S × Q × S*
q0 是初始状态 (q0 ε Q)
I 是初始栈顶符号 (I ε S)
F 是一个接受状态集 (F ε Q)
**让我们为给定的语言构建一个下推自动机**:
该PDA可以接受的字符串形式为:
1. 0n2n:02、0022、000222等。0的个数等于2的个数。当m为0时,没有1。不断压入0,一旦遇到第一个2,则弹出0。如果到达字符串末尾并且没有剩余0,则接受该字符串。
0m1m:01、0011、000111等。0的个数等于1的个数。当n为0时,没有2。不断压入0,一旦遇到第一个1,则弹出0。如果到达字符串末尾并且没有剩余0,则接受该字符串。
0n+m1m2n:0012、000112、000122等。0的个数等于1和2的个数之和。不断压入0,一旦遇到第一个1,则弹出0直到没有1。然后再次压入0,一旦遇到第一个2,则弹出0直到没有2。该字符串将被接受。
空字符串也被接受。001020
让我们了解一下这个机器
状态q0的转移
(0, I/0I) - 如果栈顶为I且当前输入符号为0,则将0压入栈顶并保持在q0。栈变为0I…
(0, 0/00) - 如果栈顶为0且当前输入符号也为0,则将0压入栈顶并保持在q0。栈变为00… 不断压入0直到下一个1或2。
(1, 0/$) - 如果栈顶为0且当前输入符号为1,则弹出0并移动到q1。
(2, 0/$) - 如果栈顶为0且当前输入符号为2,则弹出0并移动到q2。
($, I/I) - 如果栈顶为I且没有输入,则不做任何操作并移动到qf。对于空字符串。
状态q1的转移:
(1, 0/$) - 如果栈顶为0且当前输入符号为1,则弹出0并保持在q1。
($, I/I) - 如果栈顶为I且没有输入,则不做任何操作并移动到qf。
(2, 0/$) - 如果栈顶为0且当前输入符号为2,则弹出0并移动到q2。
状态q2的转移:
(2, 0/$) - 如果栈顶为0且当前输入符号为2,则弹出0并保持在q2。
($, I/I) - 如果栈顶为I且没有输入,则不做任何操作并移动到qf。