【问题标题】:How to construct a PDA for n(a) is less than or equal to 2n(b)如何构造n(a)小于等于2n(b)的PDA
【发布时间】:2018-09-18 16:37:21
【问题描述】:

所以这就是我卡住的地方,我必须构建一个 PDA 来接受来自 {a,b}* 的单词,条件是 n(a) 小于或等于 2n(b)

【问题讨论】:

  • 欢迎来到 Stack Overflow!请参观并通读帮助中心,特别是如何提问。你最好的选择是做你的研究,搜索关于 SO 的相关主题,然后试一试。在进行更多研究和搜索后,发布一个最小、完整和可验证的尝试示例,并具体说明您遇到的问题,这可以帮助您获得更好的答案!

标签: automata computation-theory


【解决方案1】:

让自己进入下推自动机的思维框架。您所知道的就是读取输入和堆栈,然后根据您看到的内容推送/弹出和更改状态。如果你开始阅读一个字符串并且需要判断它是否是语言,你能做什么?

在我看来,我们一开始能做的最好的事情就是记住我们正在阅读多少个as。在我们看到bs 之前,没有理由做任何其他事情。也就是说,只需读取as 并将它们压入堆栈。以下规则就足够了:

Q    i    s    Q'    s'
--   --   --   --    --
q0   a    Z    q0    aZ
q0   a    a    q0    aa

现在,当我们看到b 时会发生什么?如果我们想要至少两倍于as 的bs,我们不能只为每个b 交叉as,因为这样会产生至少与@987654331 一样多的bs @s 但至少不是两倍。

如果我们为每个b 划掉两个a 会怎样?好吧,这给了我们至少一半的bs 是as,这是错误的方向。这建议每两个bs 划掉一个a,事实证明这是正确的。规则:

Q    i    s    Q'    s'
--   --   --   --    --
q0   b    a    q1    a
q1   b    a    q2    -
q2   b    a    q1    a

请注意,我们创建了一个新状态 q2,它有一个与 q0 相同的规则,但不是用于读取 as 的规则。事实上,一旦我们开始阅读bs,我们就不想再让as 被阅读。遗漏规则将使自动机崩溃并拒绝字符串。

如果我们的bs 正好是as 的两倍,我们将最终进入状态q2,没有更多的输入和一个空堆栈。如果我们有额外的bs,我们需要一个规则来允许它们。在状态 q2 上添加一个自循环就足够了:

Q    i    s    Q'    s'
--   --   --   --    --
q2   b    Z    q2    Z

综合起来,这些状态和转换应该非常接近于您的语言的工作 PDA。其他选择是先编写 CFG,然后应用算法将 CFG 转换为 PDA,例如自上而下或自下而上的解析器。

【讨论】:

  • 谢谢你,我在考虑每个 a 弹出两个 bs,但我不知道如何写 ID。
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 2017-09-04
  • 2022-01-02
  • 2019-03-15
  • 2010-12-08
  • 1970-01-01
  • 2016-04-15
  • 2022-06-27
相关资源
最近更新 更多