【发布时间】:2019-02-04 22:28:18
【问题描述】:
语言如下。
∑={a,b,c}
L = ω 的倒数第二个和倒数第三个字符相同, ω 的长度大于 5,ω 包含 ccc。
我试过这样做,但我不确定它是否正确。得到以下信息:
((ccc)(aUbUc)*(a)(a)(aUbUC)) U ((ccc)(aUbUc)*(b)(b) (aUbUC)) U ((ccc)(aUbUc)*(c)(c)(aUbUC))
这对吗?
【问题讨论】:
标签: regular-language
语言如下。
∑={a,b,c}
L = ω 的倒数第二个和倒数第三个字符相同, ω 的长度大于 5,ω 包含 ccc。
我试过这样做,但我不确定它是否正确。得到以下信息:
((ccc)(aUbUc)*(a)(a)(aUbUC)) U ((ccc)(aUbUc)*(b)(b) (aUbUC)) U ((ccc)(aUbUc)*(c)(c)(aUbUC))
这对吗?
【问题讨论】:
标签: regular-language
不,这是不正确的。例如,您的表达式无法识别字符串 aaccc,因为您的所有子表达式都要求您的字符串以 ccc 开头,这与语言描述所指示的不同。
您的某些表达方式是正确的,例如需要拆分出aa、bb 和cc 部分。您有点过度使用括号,但这只是品味问题,而不是正确性问题。
你的基本单位是(aUbUc),代表∑。一个字符串必须在其中某处包含ccc,所以让我们从它开始:
(aUbUc)*ccc(aUbUc)*
这是所有包含ccc 的字符串。下一个要求很复杂:倒数第三个字符和倒数第二个字符必须相同。这可能与ccc 部分重叠。如果没有,这就足够了:
(aUbUc)*ccc(aUbUc)*(aaUbbUcc)(aUbUc)
但这不允许我们拥有像accca 或aaccc 这样的字符串。但是请注意,它确实要求所有字符串的长度至少为 6,因此它满足字符串长度大于 5 的要求。我将缩写并使用 ∑ 而不是 (aUbUc) 来做到这一点更小:
(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑)
注意额外的∑s,它需要填充其他子表达式以确保所有路径的字符串长度大于5。
直接提出正则表达式的另一种方法是构建一个匹配该语言的 DFA,然后 convert it to a regular expression。在构建 DFA 时,您会发现类似的问题,例如需要确保覆盖重叠情况,其中ccc 位于字符串末尾附近。为了使这更容易一些,您可以从 NFA 开始,然后将您的 NFA 转换为 DFA。
【讨论】: