测试两种常规语言的交集

时间:2010-02-26 00:33:59

标签: parsing finite-automata automata

我想测试两种语言是否有共同的字符串。这两种语言都来自下面描述的常规语言的子集,我只需要知道两种语言中是否存在字符串,而不是产生示例字符串。

语言由类似glob的字符串指定,如

  

/foo/**/bar/*.baz

其中**匹配0个或更多字符,而*匹配零个或多个不是/的字符,而所有其他字符都是字面值。

有什么想法吗?

感谢, 麦克

编辑:

我实现了似乎表现良好的东西,但还没有尝试正确性证明。您可以看到sourceunit tests

2 个答案:

答案 0 :(得分:9)

为两种语言构建FA AB,并构建“交叉点FA”AnB。如果AnB至少有一个接受状态可以从开始状态访问,那么就会出现两种语言的单词。

构建AnB可能很棘手,但我确信有FA教科书可以覆盖它。我将采取的方法是:

  • AnB的状态分别是AB状态的笛卡尔积。 AnB中的状态为(a, b),其中aA中的状态,bB中的状态。
  • 如果(a, b) ->r (c, d)(a, b)中的转换,则存在转换(c, d)(意味着,符号r上的a ->r c转换为A) 1}},b ->r dB中的转换。
  • (a, b)AnB中的起始状态iff ab分别是AB中的起始状态。
  • (a, b)AnB中的接受状态,如果每个都是其各自FA中的接受状态。

这一切都是我的头脑,因此完全未经证实!

答案 1 :(得分:2)

我刚做了一个快速搜索,这个问题是可判定的(也可以做),但我不知道有什么好的算法可以做到。一个解决方案是:

  1. 将正则表达式转换为NFA A和B
  2. 创建一个NFA,C,代表A和B的交集。
  3. 现在尝试从0到C中状态数的每个字符串,看看C是否接受它(因为如果字符串更长,它必须在一个点重复状态)。
  4. 我知道这可能有点难以理解,但这只是我知道的方式。