能否构造识别二进制3倍数的DPDA?附CFG求专业指导
二进制3的倍数的DPDA构造与CFG验证
你的CFG问题分析
你给出的CFG存在三处关键问题,无法正确生成所有二进制3的倍数:
- 缺少终止产生式:所有产生式都仅生成非终结符,没有
ε产生式或直接生成终结符的规则,导致无法得到仅由0/1组成的合法字符串(比如无法从S→1B→11S推导出11)。 - 产生式逻辑错误:
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。
- 冗余非终结符:
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 mod3q1:非接受状态,对应当前值≡1 mod3q2:非接受状态,对应当前值≡2 mod3- 栈初始符号:
$
转移规则
q_start→q0:读入0,栈操作$→$(接受单独的0)q_start→q1:读入1,栈操作$→$q0→q0:读入0,栈操作$→$(0*2+0=0≡0 mod3)q0→q1:读入1,栈操作$→$(0*2+1=1≡1 mod3)q1→q2:读入0,栈操作$→$(1*2+0=2≡2 mod3)q1→q0:读入1,栈操作$→$(1*2+1=3≡0 mod3)q2→q1:读入0,栈操作$→$(2*2+0=4≡1 mod3)q2→q2:读入1,栈操作$→$(2*2+1=5≡2 mod3)
接受逻辑
当输入字符串读完时,若处于q0状态则接受(当前值是3的倍数)。
如果允许带前导零的字符串(如0011),无需修改上述规则;若禁止前导零,移除q0→q1的转移即可(避免从0后追加1生成01这类串)。
内容的提问来源于stack exchange,提问作者Santiago Lemus Vallejo
相关产品推荐
相关产品推荐

