构造识别语言{a^i b^j c^k | i≠j且j=k}的上下文无关文法求助
解决你的上下文无关文法构造问题
看起来你想要构造一个上下文无关文法(CFG)来生成满足以下条件的字符串:
- 字符串由a、b、c组成(若你实际需要包含
#、=、≠标记,我也提供了对应版本) - a的数量
i ≠ b的数量 j - b的数量
j = c的数量 k
你的原始文法问题在于,C 是独立生成任意数量的c,没有和Y中生成的b的数量绑定,所以无法保证j=k。我们只需要调整产生式,让b和c的生成同步起来,同时保留i≠j的约束即可。
修正后的CFG(纯字符场景)
S -> Y Y -> aYbc | bBc | aA A -> aA | ε B -> bBc | ε
文法解释
aYbc:每生成一个a,就同步生成一个b和一个c。这条产生式可以推导出a^n (bc)^n(n≥1),如果后续继续推导bBc或aA,就能得到a^n b^{n+m} c^{n+m}(m≥1,此时i=n≠j=n+m)或a^{n+m} b^n c^n(m≥1,此时i=n+m≠j=n)。bBc:生成b^m c^m(m≥1),此时a的数量i=0,自然满足i≠j(j=m≥1)。aA:生成a^m(m≥1),此时b和c的数量j=k=0,自然满足i≠j(i=m≥1)。
如果你的目标字符串需要包含#、=、≠这些标记(比如形如#a^i = #b^j #c^j或#a^i ≠ #b^j #c^j),可以用下面的CFG:
带标记的CFG
S -> EqualExpr | NotEqualExpr # 生成 #a^i = #b^j #c^j,i≠j EqualExpr -> AMoreEqual | BMoreEqual | AOnlyEqual | BOnlyEqual AMoreEqual -> #a a A = #b b BC c BMoreEqual -> #a a AB = #b b BC c AOnlyEqual -> #a a A = #b #c BOnlyEqual -> #a = #b b BC c # 生成 #a^i ≠ #b^j #c^j,i≠j NotEqualExpr -> ANotEqualB | BNotEqualA | AOnlyNotEqual | BOnlyNotEqual ANotEqualB -> #a a A ≠ #b b BC c BNotEqualA -> #a a AB ≠ #b b BC c AOnlyNotEqual -> #a a A ≠ #b #c BOnlyNotEqual -> #a ≠ #b b BC c # 辅助产生式 A -> a A | ε AB -> a AB | ε BC -> b BC c | ε
带标记文法的核心逻辑
BC产生式:通过b BC c同步生成b和c,严格保证j=k。- 拆分四种i≠j的场景:
AMoreEqual/ANotEqualB:a的数量多于b/c的数量BMoreEqual/BNotEqualA:b/c的数量多于a的数量AOnlyEqual/AOnlyNotEqual:b/c数量为0,a数量≥1BOnlyEqual/BOnlyNotEqual:a数量为0,b/c数量≥1
这样就能完全满足你要求的i≠j且j=k的约束啦!
内容的提问来源于stack exchange,提问作者I_Love_Islam
相关产品推荐
相关产品推荐

