📜  为 L = {a(2*m)c(4*n)dnbm | 构造下推自动机m,n ≥ 0}

📅  最后修改于: 2021-09-27 14:39:51             🧑  作者: Mango

先决条件——下推自动机,下推自动机被最终状态接受
PDA在编译器设计任务中起着非常重要的作用。这就是为什么需要在 PDA 上进行良好实践的原因。我们的目标是为 L = {a (2*m) c (4*n) d n b m | 构建一个 PDA m,n ≥ 0}

例子 –

Input: aaccccdb
Output: Accepted

Input: aaaaccccccccddbb
Output: Accepted

Input: acccddb
Output: Not Accepted 

本 PDA 中使用的方法 –
处理给定的输入字符串时可能有四种情况。

情况 1:m=0 –在这种情况下,输入字符串的格式为 {c (4*n) d n }。在这种情况下,继续将 c 压入堆栈,直到遇到 ‘d’。在接收到 ‘d’ 时检查栈顶是否为 ‘c’,然后从栈中弹出 ‘cccc’。继续弹出 cccc,直到处理完字符串的所有 d。如果我们到达输入字符串的末尾并且堆栈变空,则到达最终状态,即接受输入字符串else 移动到死状态。

情况 2:n=0 –在这种情况下,输入字符串的格式为 {a (2*m) b m }。在这种情况下,继续将 a 压入堆栈,直到遇到 ‘b’。在接收 b 检查堆栈顶部是否为“a”,然后从堆栈中弹出“aa”。继续弹出 aa,直到处理完字符串的所有 b。如果我们到达输入字符串的末尾并且堆栈变空,则到达最终状态,即,接受输入字符串否则移动到死状态。

Case-3: m, n>0 –在这种情况下,输入字符串的形式为 {(a (2*m) c (4*n) d n b m }。在这种情况下,继续推 a 和c 在堆栈中,直到我们遇到 ‘d’。在接收 d 时检查栈顶是否为 ‘c’,然后从堆栈中弹出 ‘cccc’。继续弹出 cccc,直到处理完输入字符串的所有 d。然后在接收 b 时检查堆栈顶部是否为 ‘a’,然后从堆栈中弹出 ‘aa’。继续弹出 aa,直到处理完输入字符串的所有 b。如果我们到达输入字符串的末尾并且堆栈变空,然后到达最终状态,即,接受输入字符串,否则移动到死状态。

Case-4: m, n=0 –在这种情况下,输入字符串将为空。因此直接跳转到最终状态。

笔记 –

  1. 我们使用 (b, a/€, aa) 弹出 2 个 a,即遇到 b 时 aa。
  2. 我们使用(d, c/€, cccc) 弹出4 个c,即遇到d 时的cccc。