我想测试两种语言是否有共同的字符串。这两种语言都来自下面描述的常规语言的子集,我只需要知道两种语言中是否存在字符串,而不是产生示例字符串。
语言由类似glob的字符串指定,如
/foo/**/bar/*.baz
其中**
匹配0个或更多字符,而*
匹配零个或多个不是/
的字符,而所有其他字符都是字面值。
有什么想法吗?
感谢, 麦克
编辑:
我实现了似乎表现良好的东西,但还没有尝试正确性证明。您可以看到source和unit tests
答案 0 :(得分:9)
为两种语言构建FA A
和B
,并构建“交叉点FA”AnB
。如果AnB
至少有一个接受状态可以从开始状态访问,那么就会出现两种语言的单词。
构建AnB
可能很棘手,但我确信有FA教科书可以覆盖它。我将采取的方法是:
AnB
的状态分别是A
和B
状态的笛卡尔积。 AnB
中的状态为(a, b)
,其中a
是A
中的状态,b
是B
中的状态。(a, b) ->r (c, d)
是(a, b)
中的转换,则存在转换(c, d)
(意味着,符号r
上的a ->r c
转换为A
) 1}},b ->r d
是B
中的转换。(a, b)
是AnB
中的起始状态iff a
和b
分别是A
和B
中的起始状态。(a, b)
是AnB
中的接受状态,如果每个都是其各自FA中的接受状态。这一切都是我的头脑,因此完全未经证实!
答案 1 :(得分:2)
我刚做了一个快速搜索,这个问题是可判定的(也可以做),但我不知道有什么好的算法可以做到。一个解决方案是:
我知道这可能有点难以理解,但这只是我知道的方式。