正如对该问题的评论中所建议的那样,我将尝试给出该问题的(不幸的是部分的)答案,至少是在我本人已理解该问题的程度上(这意味着您很可能会发现错误,如果发现了)一种更简短或清楚地解释以下要点之一的方法,请随时相应地编辑答案):
首先,应该注意的是,如果我们要计算语言的因式分解,则实际上不必计算语言的通用自动机。
从在我的评论中提到的纸 ¹,有一个正规的语言,那就是左,右因素之间的一一对应关系,考虑到语言的左因素,相应的权系数是唯一确定的,反之亦然。更准确地说,我们有以下内容:
令为的因式分解。那么
也就是说,任何左因子都是右商的交集,并且任何右因子是左商的交集。相反地,左商数任何交集是的右侧因子,以及右商数任何交集是的左因子。大号Ŷ = ⋂ X ∈ X X - 1大号,X = ⋂ ý ∈ ý大号ÿ - 1,大号大号大号大号(X,Y)L
Y=⋂x∈Xx−1L,X=⋂y∈YLy−1,
LLLL
请注意,对于常规语言,只有有限的左右商集,因此问题可以减少到计算语言的左右商,然后计算它们的 -stable闭包,即在交点下闭合的商的最小超集。这些恰好是右因子和左因子,因此通常很容易看出哪些对是子集。大号∩L
例
为了说明以上几点,请考虑问题中的第一个示例(在本文中我也认为这是不正确的):
令。现在,左商是集合为,即,这些词在可与前缀,即。什么时候对于不同的?当且仅当和可以增加到单词时才是这种情况L=Σ∗abΣ∗Lx−1Lx∈Σ∗uΣ∗xxu∈Ly−1L=x−1Lx,yxyL具有完全相同的后缀。这意味着,用更熟悉的术语来说,它们与Nerode等效,并且在Nerode类中附加到单词所需的后缀恰好是各自的左商。
对于,我们看到我们的Nerode等价类是L
- N1,不包含作为因子并且以结尾的组单词, aba
- N2,以结尾但不包含作为因子的一组单词,以及 bab
- N3,包含作为因子的一组单词,即abN3=L
可以使用以下集合扩充它们(即,这些是相应类中单词的左商):
- S1=x−1L为在包括所有词语的(任何字可以与含有字来扩充作为因子,从而成为在一个字)和,即是xN1LabLbΣ∗S1=L∪bΣ∗
- S2=x−1L为在是语言本身,即,和xN2S2=L
- S3=x−1L为在显然。也就是说,我们找到了三个正确因素。作为,它们的闭包是,因此恰好是正确的因素。xN3Σ∗LS2⊂S1⊂S3∩S1,S2,S3
因此,我们的分解集的形式为。FL(P1,S1),(P2,S2),(P3,S3)
现在,对于左因子,我们使用该答案开头的方程式:Pi
Pi=⋂x∈SiLx−1
。
对于,这个收益率,为我们得到和,我们得到。您可以通过检查(懒得陈述正式证明的最流行借口)或显式计算右商(这与计算左商相当,尽管不完全相似)来看到这一点。因此,我们的分解为,其中P1L∪Σ∗aP2Σ∗P3LFL=u,v,w
- u=(P1,S1)=(Σ∗abΣ∗∪Σ∗a,Σ∗abΣ∗∪bΣ∗)
- v=(P2,S2)=(Σ∗,Σ∗abΣ∗)和
- w=(P3,S3)=(Σ∗abΣ∗,Σ∗)
摘要
总结一下(当您要求一个简单的过程时):
- 用于计算语言的因式分解,首先计算的左侧商。LL
- 可以这样做,在纸张的语言,通过构建一个最小DFA用于,然后对于每个状态在(对应,作为Nerode-等价类,到左商)计算的将来在,从而获得每种状态的语言的一个左商。ALqAqA
- 以这种方式获得的左商的集合通常产生右因子的子集。SR
- 然后计算的闭包,实际上可以通过形成的任何子集的并将以这种方式获得的任何子集添加到来。∩SRSRSR
- 集合与上一步的所有交点一起就是的右因子集合。SRL
- 为了获得左因子,我们可以计算的右商。L
- 这些都是集的形式的,用于。现在,这些又仅是有限的,对于,当且仅当对于所有,,我们有,也就是说,可以在语言中以完全相同的一组字符串为单词加上前缀。 Ÿ ∈ Σ * X ≠ ý 大号Ŷ - 1 = 大号X - 1 ü ∈ Σ * Ü X ∈ 大号⇔ Ü ÿ ∈ 大号Ly−1y∈Σ∗x≠yLy−1=Lx−1u∈Σ∗ux∈L⇔uy∈L
- 要计算,请考虑那些状态,使包含在的未来中。这些国家的过去的结合构成了一个右商。查找所有这些商。 q A x qLx−1qAxq
- 您会发现找到左因素和右因素一样多时,就完成了。
- 寻找那些对左,右因素的,使得。这是。X ⋅ Ÿ ⊆ 大号˚F大号X,YX⋅Y⊆LFL
- 伦巴第(Lombardy)和萨卡罗维奇(Sakarovitch)的《通用自动机》(《逻辑与游戏》,第2卷:逻辑与自动机:历史与观点,2007年)