You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否构造识别二进制3倍数的DPDA?附CFG求专业指导

二进制3的倍数的DPDA构造与CFG验证

你的CFG问题分析

你给出的CFG存在三处关键问题,无法正确生成所有二进制3的倍数:

  1. 缺少终止产生式:所有产生式都仅生成非终结符,没有ε产生式或直接生成终结符的规则,导致无法得到仅由0/1组成的合法字符串(比如无法从S→1B→11S推导出11)。
  2. 产生式逻辑错误:B→1S不符合模3运算规则。假设非终结符对应字符串数值的模3结果:
    • S对应mod3=0,A对应mod3=1,B对应mod3=2
    • 当处于B(当前值≡2 mod3),追加1后新值为2*2+1=5≡2 mod3,应转移到B而非S。
  3. 冗余非终结符:C是不必要的,仅需3个非终结符即可对应模3的三种状态。

修正后的CFG

如果允许空串(代表数值0),正确的CFG为:

S → ε | 0S | 1A
A → 0B | 1S
B → 0A | 1B

若仅接受非空二进制串(含单独的0),调整为:

S → 0 | 0S | 1A
A → 0B | 1S
B → 0A | 1B

JFLAP中DPDA的构造方法

构造核心是用状态记录当前字符串数值的mod3结果,栈仅需保留初始标记(满足DPDA的栈要求),具体步骤:

状态定义

  • q_start:初始状态(非接受,避免空串被误接受)
  • q0:接受状态,对应当前值≡0 mod3
  • q1:非接受状态,对应当前值≡1 mod3
  • q2:非接受状态,对应当前值≡2 mod3
  • 栈初始符号:$

转移规则

  1. q_start → q0:读入0,栈操作$→$(接受单独的0)
  2. q_start → q1:读入1,栈操作$→$
  3. q0 → q0:读入0,栈操作$→$(0*2+0=0≡0 mod3)
  4. q0 → q1:读入1,栈操作$→$(0*2+1=1≡1 mod3)
  5. q1 → q2:读入0,栈操作$→$(1*2+0=2≡2 mod3)
  6. q1 → q0:读入1,栈操作$→$(1*2+1=3≡0 mod3)
  7. q2 → q1:读入0,栈操作$→$(2*2+0=4≡1 mod3)
  8. q2 → q2:读入1,栈操作$→$(2*2+1=5≡2 mod3)

接受逻辑

当输入字符串读完时,若处于q0状态则接受(当前值是3的倍数)。

如果允许带前导零的字符串(如0011),无需修改上述规则;若禁止前导零,移除q0→q1的转移即可(避免从0后追加1生成01这类串)。

内容的提问来源于stack exchange,提问作者Santiago Lemus Vallejo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:57:21