构造识别特定{0,1}*语言的上下文无关文法(CFG)求助
构造识别语言A的上下文无关文法
语言A定义为:A = { w | w 长度为奇数且首、中、末符号相同 } ∪ {ε},其中w∈{0,1}*。
正确的CFG构造方案
通过分层定义非终结符来精准匹配语言规则:
S → ε | C0 | C1 // C0生成首、中、末均为0的非空串 C0 → 0 | 0 B0 0 // C1生成首、中、末均为1的非空串 C1 → 1 | 1 B1 1 // B0生成所有长度为奇数且中间符号为0的字符串 B0 → 0 | 0 B0 0 | 0 B0 1 | 1 B0 0 | 1 B0 1 // B1生成所有长度为奇数且中间符号为1的字符串 B1 → 1 | 0 B1 0 | 0 B1 1 | 1 B1 0 | 1 B1 1
规则说明
- 起始符号S:直接生成空串
ε,或调用C0/C1生成符合条件的非空串。 - C0/C1:
- 基础规则:生成单个0/1(长度为1,首、中、末为同一符号,天然符合条件)。
- 递归规则:在一个中间符号为0/1的奇数长度串(由B0/B1生成)首尾各添加0/1,确保新串首、末为0/1,中间符号继承自B0/B1的中间符号(仍为0/1),总长度保持奇数。
- B0/B1:
- 基础规则:生成单个0/1(长度为1,中间符号为自身)。
- 递归规则:在已有的中间符号为0/1的奇数长度串首尾任意添加0或1,每次添加后串长增加2(仍为奇数),且中间符号保持不变,以此覆盖所有中间符号为0/1的奇数长度串。
验证示例
- 生成
10101:C1 → 1 B1 1,B1 → 0 B1 0,B1 →1,最终得到1 0 1 0 1,首、中、末均为1,符合条件。 - 生成
011101010:C0 →0 B0 0,B0通过多次首尾添加字符生成1110101(中间符号为0),最终得到0 1110101 0,首、中、末均为0,符合条件。 - 生成
1:直接通过C1→1得到,符合条件。
内容的提问来源于stack exchange,提问作者avukalov
相关产品推荐
相关产品推荐

