regex - 正则语言闭包取消连接

标签 regex concatenation regular-language set-theory set-union

我正在尝试找到一种可以采用常规语言并将其与另一种语言“取消连接”的操作。例如:

a*L - a* = L | where L is a regular language

我知道差(减)不是我想要的运算。但我相信我已经表达了我的观点。

另一种看待它的方法是,如果有一个逻辑上等于 (A ∪ B) 的集合 L,但我们无法访问 A。因此,如果我们只能使用 L、B 及其导数,我们能以某种方式导出 A 吗?基本上:

L - B = A | L = (A ∪ B)

我对这个问题进行了很多思考,使用了许多不同的补语、交集和常规语言的其他闭包属性,但我就是无法弄清楚。

我能想到的最好的办法是:

A = ((L - B) ∪ (A ∩ B) | L = (A ∪ B)

但是这需要 A 在右侧。

最佳答案

If L = A U B, define an operator - such that L - B = A.

问题是运算符 - 没有明确定义:给定 L 和 B,可能有几种语言满足 L = A U B。特别是,如果 A 是 L 的子集,并且任何(可能不正确) ) L\B 的超集,则 A 是一个解;也就是说,如果 A = (L\B) U C,其中 C 是 B 的子集(可能不正确),则 L - B 也可能等于该集合。

现在,您可以定义 - 来表示所有此类 A 的集合,在这种情况下,您可以使用集合差、并集和幂集运算符使其可行。那么,L - B = Q 其中 Q = {(L\B) U {}, (L\B) U {B[0]}, ..., (L\B) U B = L}。

如果您指定,则可以明确定义 - 始终返回 Q 的“最小”元素(对于有限集,是元素最少的元素;对于无限集,是所有其他集的子集)在这种情况下,您只需恢复 L\B。

If L = B.A, define an operator - such that L - B = A.

这里也存在类似的问题:可能有几种语言,当附加到 B 后,给出 L。例如,考虑 B = a*,A 的两个选择:a* 和 {e},该语言只包含空集。您可以毫不费力地证明 a* a* = a* e,因此 L 是相同的,B 是相同的,并且 L - B 现在必须产生两个不同的值:a* 或 {e}。

关于regex - 正则语言闭包取消连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42825393/

相关文章:

java - 复杂的正则表达式 - 这可能吗?

python - 通过正则表达式分割字符串并将分隔符保留为Python中项目的一部分

regex - 狂欢 : regular expressions within backticks

regex - 在Apache NiFi中使用Grok进行模式匹配

python - 正则表达式删除Python中字符串中的下划线后跟数字?

c - 高效串联

javascript - 我如何优化 es6 中的 .concat 方法

PHP 字符串连接 - "$a $b"与 $a 。 ""。 $b - 性能

java - 查找 System.out.print 的正则表达式

regular-language - 将常规语言插入其他常规语言