automata - 我想做一个 CFG,其中字母 b 永远不会三倍
问题描述
需要有关上下文无关语法的帮助。我想要一个字母 b 永远不会增加三倍的 cfg。这意味着没有单词包含子字符串 bbb。语言只包含字母 {a,b}
解决方案
这是该语言的一个有用的递归定义:
- 空字符串是语言
- b 在语言中
- bb 在语言中
- 如果 x 是语言中的字符串,则 xa 是语言中的字符串
- 如果 x 是语言中的字符串,则 xab 是语言中的字符串
- 如果 x 是语言中的字符串,则 xabb 是语言中的字符串
- 除非符合上述规则,否则该语言中没有其他内容
首先,让我们确保这个定义是正确的。不难争辩说,这个定义定义了必须是我们的目标语言的字符串;没有子字符串 bbb 的字符串可以满足上述规则。定义是否涵盖所有情况,以便所有没有子字符串 bbb 的字符串都可以工作?事实上,它必须。考虑语言中的任何字符串。它要么长度小于 3(在这种情况下,我们可以检查所有可能的字符串都被正确处理,它们是);对于较长的字符串,它们必须以 a、ab 或 abb 结尾(它们不能以 bbb 结尾)。我们的规则意味着在没有这些后缀的语言中存在字符串 x,可以递归地检查其成员资格。这可以通过数学归纳得到一个令人信服的证明。
有了上面这样的递归定义,我们就可以写下相应的语法:
S -> e | b | bb | Sa | Sab | Sabb
这里真正的独创性在于获得定义。我是怎么做到的?我想到了语言中最短的字符串——独特的、不符合模式的字符串——然后我问如何用较短的字符串制作更长的字符串。也就是说,给定语言中的一个字符串,如何使一个更大?这就是上下文无关语法让我们做的关键。
推荐阅读
- windows - VcXsrv 基于主机的访问控制不起作用
- python - Keras 保存模型
- django - Django - 防止用户在输入 URL 时访问页面
- reactjs - 如何在 React Native 中导入自定义 svgs 图标
- java - 如何使用 lambda 表达式实现具有两个输入的递归函数?
- python - 简单的 if 语句不能准确地检查两个值是否相同
- python-3.x - Python Appium - ResourceWarning:启用tracemalloc以获取对象分配回溯
- django - 与 django 应用程序集成的最佳编码平台
- python - 运行 python 项目的 EC2 实例上的 HTTPS
- google-cloud-vision - 以特定格式逐行提取收据数据