Ken*_*ins 11 regex language-agnostic algorithm intersection set
在计算两个任意正则表达式是否有任何重叠的解决方案(假设它是可能的).
例如,这两个正则表达式可以通过强力显示没有交叉点,因为这两个解决方案集是可计算的,因为它是有限的.
^1(11){0,1000}$ ? ^(11){0,1000}$ = {}
{1,111, ..., ..111} ? {11,1111, ..., ...11} = {}
{} = {}
Run Code Online (Sandbox Code Playgroud)
但用{0,1000}
通过*
删除一个蛮力解决方案的可能性,所以一个更聪明的算法必须创建.
^1(11)*$ ? ^(11)*$ = {}
{1,^1(11)*$} ? {^(11)*$} = {}
{1,^1(11)*$} ? {11,^11(11)*$} = {}
{1,111,^111(11)*$} ? {11,^(11)*$} = {}
.....
Run Code Online (Sandbox Code Playgroud)
在另一个类似的问题中,一个答案是计算交集正则表达式.这可能吗?如果是这样,怎么会写一个算法来做这样的事情?
我认为这个问题可能是暂停问题的结果.
编辑:
我已经使用已接受的解决方案为示例问题创建了DFA.可以很容易地看到如何在状态图上使用BFS或DFS M_3
来确定是否可以达到最终状态M_3
.
Pat*_*k87 17
它不在停止问题的范围内; 判断常规语言的交集是否为空可以解决如下:
这些事物中的每一个都可以通过算法完成和/或检查.此外,当然,一旦您有DFA识别您的语言的交集,您就可以构建一个与该语言匹配的正则表达式.如果你从正则表达式开始,你可以制作DFA.这绝对是可计算的.
编辑:
因此,要构建笛卡尔积分机,您需要两个DFA.设M1 =(E,q0,Q1,A1,f1),M2 =(E,q0',Q2,A2,f2).在两种情况下,E是输入字母,q0是开始状态,Q是所有状态的集合,A是接受状态的集合,f是转换函数.构建M3 ......
如果我没有犯任何错误,则L(M3)= L(M1)与L(M2)相交.整洁,对吧?