📜  为所有长度的回文构造下推自动机

📅  最后修改于: 2021-09-28 10:56:41             🧑  作者: Mango

下推自动机 (PDA) 就像具有无限堆栈的 epsilon 非确定性有限自动机 (NFA)。 PDA 是一种实现上下文无关语言的方法。因此,学习如何绘制PDA很重要。

这里以奇长回文为例:
问题 1:为语言 L = {wcw’ | 构建 PDA w={0, 1}*} 其中 w’ 是 w 的倒数。

本 PDA 中使用的方法 –
无论堆栈顶部是什么,都继续压入 0 和 1,直到到达中间元素。当中间元素“c”被扫描时,在不改变堆栈的情况下处理它。现在,如果扫描符号为“1”且栈顶也包含“1”,则从栈顶弹出元素,或者如果扫描符号为“0”且栈顶也包含“0”,则从栈顶弹出元素.如果字符串变空或扫描符号为“$”且堆栈变空,则达到最终状态,否则进入死状态。

  • 第 1 步:在接收到 0 或 1 时,继续将其压入堆栈顶部而不进入下一个状态。
  • 第 2 步:在接收到一个元素 ‘c’ 时,移动到下一个状态而不对堆栈进行任何更改。
  • 第 3 步:在接收元素时,检查扫描的符号是否为“1”且栈顶也包含“1”,或者扫描的符号是否为“0”且栈顶也包含“0”,然后从栈顶弹出元素否则进入死亡状态。继续重复步骤 3,直到字符串变为空。
  • 第 4 步:检查扫描的符号是否为 ‘$’ 并且堆栈不包含任何元素,然后移动到最终状态,否则移动到死状态。

奇数回文

例子:

Input : 1 0 1 0 1 0 1 0 1
Output :ACCEPTED

Input : 1 0 1 0 1 1 1 1 0
Output :NOT ACCEPTED

现在,以偶数回文为例:
问题 2:为语言 L = {ww’ | 构建 PDA w={0, 1}*} 其中 w’ 是 w 的倒数。

本 PDA 中使用的方法 –
对于偶数长度回文的构造,用户必须使用非确定性下推自动机(NPDA)。 NPDA 基本上是一个 NFA,其中添加了一个堆栈。
除了 epsilon 转换之外,此语言的 NPDA 与前一个相同。然而,有一个显着的区别,这个 PDA 必须猜测什么时候停止推送符号,跳转到最终状态并开始匹配堆栈。因此,这台机器绝对是不确定的。
无论栈顶是什么,都继续压入 0 和 1,同时检查输入字符串,是否到达输入字符串的后半部分。如果到达输入字符串的前半部分的最后一个元素,然后处理输入字符串的前半部分的最后一个元素之后做出的埃普西隆移动和移动到下一个状态。现在,如果扫描符号为“1”且栈顶也包含“1”,则从栈顶弹出元素,或者如果扫描符号为“0”且栈顶也包含“0”,则从栈顶弹出元素.如果字符串变空或扫描符号为“$”且堆栈变空,则达到最终状态,否则进入死状态。

  • 步骤1:接收到0或1时,继续将其压入栈顶,同时继续检查是否到达输入字符串的后半部分。
  • 第 2 步:如果到达输入字符串前半部分的最后一个元素,则将该元素压入堆栈顶部,然后使 epsilon 移动到下一个状态。
  • 第 3 步:在接收元素时,检查扫描的符号是否为“1”且栈顶也包含“1”,或者如果扫描的符号为“0”且栈顶也包含“0”,然后从栈顶弹出元素否则进入死亡状态。继续重复步骤 3,直到字符串变为空。
  • 第 4 步:检查扫描的符号是否为 ‘$’ 并且堆栈不包含任何元素,然后移动到最终状态,否则移动到死状态。

等长回文

例子:

Input : 1 0 0 1 1 1 1 0 0 1
Output :ACCEPTED

Input : 1 0 0 1 1 1
Output :NOT ACCEPTED

现在,以全长回文为例,即可以接受奇数长度回文和偶数长度回文的 PDA:
问题 3:为语言 L = {ww’ | 构建 PDA wcw’, w={0, 1}*} 其中 w’ 是 w 的倒数。

本 PDA 中使用的方法 –
对于全长回文的构造,用户必须使用 NPDA。
该方法类似于上面的示例,除了现在与 epsilon 移动一起,现在用户必须显示符号“c”的另一个过渡移动,即如果字符串的长度为奇数并且如果到达中间元素“c”,则只需处理它并移动到下一个状态而不对堆栈进行任何更改。

  • 步骤1:接收到0或1时,继续将其压入栈顶,同时继续检查,如果输入字符串的长度为偶数,则是否到达输入字符串的后半部分,但是如果输入字符串是奇数长度然后继续检查是否到达中间元素。
  • 第 2 步:如果输入字符串的长度为偶数并且到达输入字符串前半部分的最后一个元素,则将该元素压入堆栈顶部,然后使 epsilon 移动到下一个状态,或者如果输入字符串的长度为奇数,则继续接收到一个元素“c”,在不改变堆栈的情况下移动到下一个状态。
  • 第 3 步:在接收元素时,检查扫描的符号是否为“1”且栈顶也包含“1”,或者扫描的符号是否为“0”且栈顶也包含“0”,然后从栈顶弹出元素否则进入死亡状态。继续重复步骤 3,直到字符串变为空。
  • 第 4 步:检查扫描的符号是否为 ‘$’ 并且堆栈不包含任何元素,然后移动到最终状态,否则移动到死状态。

全长回文

例子:

Input : 1 1 0 0 1 1 1 1 0 0 1 1
Output :ACCEPTED

Input : 1 0 1 0 1 0 1
Output :ACCEPTED