【问题标题】:Testing intersection of two regular languages测试两种常规语言的交集
【发布时间】:2010-02-26 00:33:59
【问题描述】:

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

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

/foo/**/bar/*.baz

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

有什么想法吗?

谢谢, 迈克

编辑:

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

【问题讨论】:

  • 您将使用什么语言来执行检查?您可能需要为此编写一个测试平台。如果您可以发布一个相当完整的测试平台,那将会有所帮助。
  • 这需要在 JS 中运行。我当然要写一个测试平台。我找到了一个有用的子集,我可以通过一些技巧有效地计算交集。有用的子集是 * 和 ** 只能出现在开头或直接出现在 / 之后,并且 / 不能与另一个 / 相邻。这意味着我永远不需要担心 foo 是否可以匹配 boo*baz ——我必须进行回溯,但不是荒谬的数量,因为我总是可以将 * 或 ** 后面的文本变成后缀检查。

标签: parsing finite-automata automata


【解决方案1】:

为两种语言构建 FA AB,并构建“交集 FA”AnB。如果AnB 至少有一个从开始状态可访问的接受状态,那么就有一个词同时使用两种语言。

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

  • AnB 的状态分别是AB 状态的笛卡尔积。 AnB 中的状态写成 (a, b),其中 aA 中的状态,bB 中的状态。
  • 如果a ->r cA 中的一个转换,并且b ->r db ->r d B
  • (a, b)AnB 中的开始状态,而ab 分别是AB 中的开始状态。
  • (a, b)AnB 中的接受状态,如果每个都是其各自 FA 中的接受状态。

这完全是我的想法,因此完全未经证实!

【讨论】:

  • 嗯,这是一个有据可查的结构,称为笛卡尔积机器,很多人都打败了你,这是一种有据可查且正确的方法来获得识别语言交集的 FA由其他 FA。只是说。
【解决方案2】:

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

  1. 将两个正则表达式都转换为 NFA A 和 B
  2. 创建一个 NFA C,它表示 A 和 B 的交集。
  3. 现在尝试从 0 到 C 中状态数的每个字符串,看看 C 是否接受它(因为如果字符串更长,它必须在某一点重复状态)。

我知道这可能有点难以理解,但这是我知道的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2013-10-08
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2016-08-03
    相关资源
    最近更新 更多