我想制作一个CFG,其中的字母b从不绊倒

时间:2019-06-15 11:47:19

标签: automata cg

需要有关上下文无关语法的帮助。我想要一个字母b永远不会增加三倍的cfg。这意味着没有单词包含子字符串bbb。语言仅包含字母{a,b}

1 个答案:

答案 0 :(得分:1)

以下是该语言的有用的递归定义:

  • 空字符串使用的语言是
  • b使用的语言
  • bb是使用语言
  • 如果x是该语言中的字符串,则xa是该语言中
  • 如果x是该语言中的字符串,则xab使用该语言
  • 如果x是该语言的字符串,则xabb是该语言的
  • 除非上述规则,否则语言中没有其他内容

首先,让我们确保此定义正确。毫不夸张地说,该定义定义了必须使用目标语言的字符串。子字符串为bbb的字符串不能满足上述规则。该定义是否涵盖所有情况,以便所有不带子字符串bbb的字符串都能工作?实际上,它必须。考虑语言中的任何字符串。它的长度小于三(在这种情况下,我们可以检查所有可能的字符串是否正确处理)。对于更长的字符串,它们必须以a,ab或abb结尾(它们不能以bbb结尾)。我们的规则暗示在语言中存在不带这些后缀的字符串x,可以以递归方式检查其成员资格。通过数学归纳可以将其反过来得出令人信服的证明。

有了上面的递归定义,我们可以写下相应的语法:

S -> e | b | bb | Sa | Sab | Sabb

这里真正的聪明才智得到了定义。我是怎么做到的?我想到了该语言中最短的字符串-唯一的字符串,这些字符串不适合某个模式-然后我问如何从较短的字符串中提取较长的字符串。也就是说,给定一个语言字符串,您如何将其变大?这是无上下文语法允许我们执行的关键。