常规语言闭包解串

Regular Language Closure Unconcatenation

我正在尝试寻找一种可以采用常规语言并 "unconcatenate" 使用另一种语言的操作。例如:

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}.

如果指定 - 总是 returns Q 的 "smallest" 元素(对于有限集,元素最少的元素;对于无限集,元素最少的元素是所有其他集合的子集)在这种情况下,您只需恢复 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}。