Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何确定一个正则表达式是否是另一个正则表达式的子集?_Regex_Computation Theory_Fsm - Fatal编程技术网

Regex 如何确定一个正则表达式是否是另一个正则表达式的子集?

Regex 如何确定一个正则表达式是否是另一个正则表达式的子集?,regex,computation-theory,fsm,Regex,Computation Theory,Fsm,给出两个正则表达式,A=0*1*u1*0*和B=(01u10)*,如何确定其中一个是另一个的子集。我想一种方法是列出一些例子,看看它们是否有共同之处。在本例中,我看到字符串01和10在两个集合中共享。所以它们不是彼此的子集??我怎么知道一个正则表达式是另一个正则表达式的子集?一般来说,你是如何着手解决这样的问题的 显然有很多方法可以做到这一点——任何逻辑论证都可以构成有效的证据。然而,回答这个问题的一个有指导意义的方法是使用算法来计算一般问题的答案 如果两种语言都包含另一种语言,则两种语言是相等

给出两个正则表达式,A=0*1*u1*0*和B=(01u10)*,如何确定其中一个是另一个的子集。我想一种方法是列出一些例子,看看它们是否有共同之处。在本例中,我看到字符串01和10在两个集合中共享。所以它们不是彼此的子集??我怎么知道一个正则表达式是另一个正则表达式的子集?一般来说,你是如何着手解决这样的问题的

显然有很多方法可以做到这一点——任何逻辑论证都可以构成有效的证据。然而,回答这个问题的一个有指导意义的方法是使用算法来计算一般问题的答案

如果两种语言都包含另一种语言,则两种语言是相等的。如果一种语言包含另一种语言,则包含的语言与包含的语言之间的差异就是空集。因此,如果两种语言A和B相等,那么A\B和B\A都是空的;如果A\B和B\A都是空的,那么A和B必须相等

给定一个正则表达式,至少有一个已知的正确算法可以将其转换为具有lambda/epsilon变换的等效NFA。这样的结构被用于正则表达式和有限自动机等价性的规范证明

给定具有lambda/epsilon变换的NFA,至少有一种已知的正确算法将其转换为等效DFA。子集构造就是这样一种算法

给定两个DFA,至少有一个已知的正确算法来生成接受这两个DFA所接受的语言差异的DFA。笛卡尔积机器构造就是这样一种算法

给定一个DFA,有一个算法来确定它是否接受空语言。DFA最小化后检查任何接受状态就是这样一种算法

因此,要通过算法确定两个正则表达式r1和r2是否相等:

  • 为r1生成NFAλN1
  • 为r2生成NFA lambda N2
  • 为N1生成DFA D1
  • 为N2生成DFA D2
  • 为L(D1)\L(D2)生成DFA D12
  • 为L(D2)\L(D1)生成DFA D21
  • 通过最小化D12生成DFA M12
  • 通过最小化D21生成DFA M21
  • L(r1)=L(r2)当且仅当M12和M21都接受空语言

当它有疑问时,解决它

我不认为这是一个微不足道的问题!这与编程有关吗?如果是,请添加适当的标记。@code我相信您的意思是生成唯一的最小确定性有限自动机。AST是解析的结果,它没有封装生成它的语言。这似乎更多的是关于数学正则表达式,而不是编程。或者是更好的询问地点。但我怀疑你会知道这至少是NP完全问题,甚至可能等同于停顿问题。