Regex 如何将语句可视化';正则语言在x,y下是封闭的';?

Regex 如何将语句可视化';正则语言在x,y下是封闭的';?,regex,regular-language,Regex,Regular Language,我正在学习DFA/正则表达式,我不断遇到这种说法 正则语言在并、交、补等项下是封闭的 我理解闭包的定义,这意味着当我们对集合中的某个元素应用某些操作时,结果元素也应该在集合中 然而,我提到的资源中没有任何具体的例子?用等式证明它,有人能帮我用正则表达式的例子形象化上面的陈述吗?让我们使用字母表{0,1} 设L1是包含长度为3、{000、001、010、011、100、101、110、111}的所有字符串的正则语言;我们可以使用正则表达式“(0+1)(0+1)(0+1)” 设L2为正则语言,包含以

我正在学习DFA/正则表达式,我不断遇到这种说法

正则语言在并、交、补等项下是封闭的

我理解闭包的定义,这意味着当我们对集合中的某个元素应用某些操作时,结果元素也应该在集合中


然而,我提到的资源中没有任何具体的例子?用等式证明它,有人能帮我用正则表达式的例子形象化上面的陈述吗?

让我们使用字母表{0,1}

设L1是包含长度为3、{000、001、010、011、100、101、110、111}的所有字符串的正则语言;我们可以使用正则表达式“(0+1)(0+1)(0+1)”

设L2为正则语言,包含以0,{0,00,01,000,001,010,011,…}开头的所有字符串;我们可以使用正则表达式“0(0+1)*”

这些语言的并集包含所有长度为3的字符串,以及所有以0开头的字符串。+运算符正是这样做的,所以我们可以只写“(0+1)(0+1)(0+1)+0(0+1)*')。(我们可以稍微简化这个表达式,但不需要。)

这些语言的交集包含以0开头的所有长度为3的字符串:“0(0+1)(0+1)”

L1的补码包含长度为0、1、2或1的所有字符串≥4.我们可以写‘ε+(0+1)+(0+1)(0+1)+(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)*’

L2的补码包含空字符串,加上所有以1开头的字符串;我们可以写‘ε+1(0+1)*’


编辑后添加:也就是说,正如上面一些评论所提到的,使用有限状态机可能更容易描述这一点。特别是,DFA(确定性有限自动机)可能是一条出路

以下是表示L1和L2的DFA:


我们可以通过添加附加的非接受状态来完成/扩展这些DFA,而无需更改它们定义的语言,只要没有其他状态转换,我们就可以转换到这些非接受状态。(这样,每个字符串都会以某种状态结束。)这将给出:


他们的联盟是两个DFA中各州的叉积;例如,它有一个“AD”状态,意思是“如果我遵循L1的DFA,我将处于状态A,如果我遵循L2的DFA,我将处于状态d。”接受状态是与任一DFA中的接受状态相对应的状态:

它们的交集类似,只是其接受状态是两个DFA中接受状态对应的状态:

当然,我们可以通过删除所有永远不会导致接受状态的状态来大大简化它:

最后,补码与DFA完全相同,但所有接受状态都更改为非接受状态,反之亦然:



您没有尝试使用正则表达式对其进行可视化,而是尝试使用DFA对其进行可视化了吗?@hvd它们不都是等价的吗?使用正则表达式不是更容易吗?这就是我建议的具体原因:你可以用DFA和正则表达式表达完全相同的语言,因此它们是等价的,但取决于你想做什么,NFA或DFA比正则表达式更容易理解,在这种情况下,DFA肯定是。我想指出,为了找到两个正则表达式的交集,实际上有必要先将它们转换为自动机。因此,证明正则表达式在交集下是闭合的在某种程度上必须涉及自动机。您需要DFAs来获取补码,而不是NFAs,因为对于NFAs,给定的字符串可能会导致多个可能的状态,如果这些状态中的任何一个是接受状态,那么它就是匹配的。简单地将每个接受状态转换为非接受状态,反之亦然,不足以否定这一点。