Computer science 关于正则表达式的问题

Computer science 关于正则表达式的问题,computer-science,regular-language,Computer Science,Regular Language,我有几个关于正则表达式的问题。据我所知,你只能用*表示字母数,但如果我想写L={a^n b^n | n>=0},我如何在正则表达式中表示字母数相等 一般来说,我该如何显示正则表达式中字母数量之间的关系?你在形式语言理论中找到了一个非常重要的概念-纯/理论正则表达式无法与语言a^n b^n匹配!这是一个重要的结果。Myhill-Nerode定理是理解为什么会出现这种情况的一个很好的方法,但基本上,它可以归结为:如果你能证明没有有限自动机可以接受这种语言,那么它不是正则的,也没有正则表达式 特别是对

我有几个关于正则表达式的问题。据我所知,你只能用*表示字母数,但如果我想写L={a^n b^n | n>=0},我如何在正则表达式中表示字母数相等


一般来说,我该如何显示正则表达式中字母数量之间的关系?

你在形式语言理论中找到了一个非常重要的概念-纯/理论正则表达式无法与语言a^n b^n匹配!这是一个重要的结果。Myhill-Nerode定理是理解为什么会出现这种情况的一个很好的方法,但基本上,它可以归结为:如果你能证明没有有限自动机可以接受这种语言,那么它不是正则的,也没有正则表达式

特别是对于您的语言,假设它是正则的,并且有一个正则表达式。然后我们知道有一个接受这种语言的确定性有限自动机。我们可以进一步推断,存在一个状态尽可能少的确定性有限自动机——最小DFA。让此DFA中的状态数为p。现在,考虑我们语言中的字符串a^ p b^ p。由于状态数为p,且字符串长度大于p-1,因此DFA在处理该长度为2p的字符串时必须在某个点循环。设x是遍历此循环时处理的a^p b^p的子字符串。然后,由于我们的DFA接受a^p b^p,它还必须接受通过多次遍历循环或根本不遍历循环而获得的任何字符串。也就是说,我们可以去掉子字符串x,或者将其更改为x^2或x^k,并且该字符串也应该使用我们的语言。x有适合我们的选择吗?事实证明,没有-无论我们选择a^p b^p的哪个子字符串,改变出现次数会给我们一个不是我们语言中的字符串(要么只改变a的数量,要么只改变b的数量,要么改变a和b在中间的顺序)。因此,我们的DFA不存在,因此没有正则表达式。这基本上是另一个工具,正则语言的泵引理的冗长证明

能够描述语言a^nb^n的能力最低的(规范的)计算系统是一类上下文无关语言。上下文无关语法可以用来描述这些语言是如何生成的。您的语言的CFG是:

S -> aSb
S -> epsilon
使用它的方法是从S(非终端开始符号)开始,然后使用productions(映射规则)派生中间表达式,直到只剩下一个终端符号字符串(我们的终端符号是a和b)。我们可以像S->aSb->aaSbb->aaaSbbb->aaabbb那样生成aaabbb


现在,如果您询问有关使用“regex”库进行应用程序编程的问题,这些库通常提供更多的功能,允许捕获非正则语言。他们可能已经将那些不虔诚的怪物与图灵等效,检查GitHub,了解仅基于“regex”构建的Quake的实现。

您在形式语言理论中找到了一个非常重要的想法-纯/理论正则表达式无法与语言a^n b^n匹配!这是一个重要的结果。Myhill-Nerode定理是理解为什么会出现这种情况的一个很好的方法,但基本上,它可以归结为:如果你能证明没有有限自动机可以接受这种语言,那么它不是正则的,也没有正则表达式

特别是对于您的语言,假设它是正则的,并且有一个正则表达式。然后我们知道有一个接受这种语言的确定性有限自动机。我们可以进一步推断,存在一个状态尽可能少的确定性有限自动机——最小DFA。让此DFA中的状态数为p。现在,考虑我们语言中的字符串a^ p b^ p。由于状态数为p,且字符串长度大于p-1,因此DFA在处理该长度为2p的字符串时必须在某个点循环。设x是遍历此循环时处理的a^p b^p的子字符串。然后,由于我们的DFA接受a^p b^p,它还必须接受通过多次遍历循环或根本不遍历循环而获得的任何字符串。也就是说,我们可以去掉子字符串x,或者将其更改为x^2或x^k,并且该字符串也应该使用我们的语言。x有适合我们的选择吗?事实证明,没有-无论我们选择a^p b^p的哪个子字符串,改变出现次数会给我们一个不是我们语言中的字符串(要么只改变a的数量,要么只改变b的数量,要么改变a和b在中间的顺序)。因此,我们的DFA不存在,因此没有正则表达式。这基本上是另一个工具,正则语言的泵引理的冗长证明

能够描述语言a^nb^n的能力最低的(规范的)计算系统是一类上下文无关语言。上下文无关语法可以用来描述这些语言是如何生成的。您的语言的CFG是:

S -> aSb
S -> epsilon
使用它的方法是从S(非终端开始符号)开始,然后使用productions(映射规则)派生中间表达式,直到只剩下一个终端符号字符串(我们的终端符号是a和b)。我们可以像S->aSb->aaSbb->aaaSbbb->aaabbb那样生成aaabbb


现在,如果您询问有关使用“regex”库进行应用程序编程的问题,这些库通常提供更多的功能,允许捕获非正则语言。他们可能已经把那些不虔诚的怪物与图灵等同起来了,检查GitHub,查看仅在“regex”上构建的Quake的实现。

你不能。您描述的语言
L
不是正则的,用泵引理很容易说明这一点:正则表达式能够检查奇偶校验(想想模算术),但不能检查任意的子字符串长度。谢谢您的回答。那么语言L1={0^N1^k | n mod 3=k mod 3}会是正则的吗?我想找一个合适的人选