轻松证明无上下文语言在循环移位下被关闭


11

语言L的循环移位 (也称为旋转或共轭)定义为\ {yx \ mid xy \ in L \}。根据维基百科(和此处),无上下文语言在此操作下是封闭的,参考了Oshiba和Maslov的论文。有一个容易证明这一事实的证据吗?大号L{ ÿ X | X ý ∈ 大号}{yx∣xy∈L}

对于常规语言,闭包以这种形式讨论为“ 证明在循环运算符下关闭了常规语言 ”。

Answers:


5

您可以尝试使用下推自动机。给定原始语言的下推自动机,我们为循环移位构造一个。新的自动机分两个阶段运行,分别对应词的和部分(其中是原始语言)。在第一阶段,每当自动机想要弹出一个非终端,它就可以推送一个非终端。这个想法是,在第一阶段的最后,堆栈将包含相反的顺序,即原始自动机读取后在堆栈中找到的符号。在第二阶段(开关是不确定的),而不是按下非端子ÿ yX xÿ X yxX ý xy甲A甲'A′ X x甲A,我们可以弹出非终端。如果原始自动机确实可以在读取时生成堆栈,那么新的自动机将能够准确弹出整个堆栈。一个“A′ Xx

编辑:这里有一些更多的细节。假设我们给了一个PDA,其字母为,状态集,接受状态,非终端,初始状态和一组允许的过渡。每个允许的过渡都具有,这意味着当处于状态,在读取(或,在这种情况下,它是自由过渡),如果堆栈顶部是(或,这意味着堆栈为空),则PDA可以(这是一个不确定性模型)移至状态,替换为Σ Q ˚F Γ q 0(q ,一,甲,q ',α )q 一个∈ 甲一个= ε 甲∈ Γ 甲= ε q '甲α ∈ Γ *ΣQFΓq0(q,a,A,q′,α)qa∈Aa=ϵA∈ΓA=ϵq′A与。α∈Γ∗

新的PDA每个具有新的非终端。对于每两个状态和,有两个状态。起始状态(实际起始状态是通过过渡非确定地选择的)是。对于每个过渡都有对应的过渡和。还有其他过渡。甲'甲∈ Γ q ,q ' ∈ Q 甲∈ Γ q “,1 ),一,甲,(q ',q ”,1 ),α )A′A∈Γq,q′∈Q ∪ { ε } (q ,q ',1 ),(q ,q ',2 ,甲)ε (q ,q ,1 )(q ,一个,A ,q ',α )((q ,A∈Γ∪{ϵ}(q,q′,1),(q,q′,2,A)ϵ(q,q,1)(q,a,A,q′,α)((q,q′′,1),a,A,(q′,q′′,1),α)((q ,q “,2 ,乙),一,甲,(q ',q ”,2 ,乙),α )((q,q′′,2,B),a,A,(q′,q′′,2,B),α)

对于每个过渡,都有过渡,其中和。对于每个最终状态,都有过渡,其中。(q ,一,甲,q ',α )((q ,q “,1 ),一个,乙',(q ',q ”,1 ),乙' 甲' α )乙∈ Γ ∪ { ε } ε ' = ε q ∈ ˚F ((q ,(q,a,A,q′,α)((q,q′′,1),a,B′,(q′,q′′,1),B′A′α)B∈Γ∪{ϵ}ϵ′=ϵq∈Fq “,1 ),ε ,甲,(q 0,q ”,2 ,ε ),甲)甲∈ Γ ∪ { ε }((q,q′′,1),ϵ,A,(q0,q′′,2,ϵ),A)A∈Γ∪{ϵ}

对于每个过渡,都有过渡,其中。对于每个过渡,都有过渡,其中。对于每个过渡,都有“广义过渡” ; 这些被实现为通过中间新状态的两次转换的序列。过渡\ alpha) 和(q ,一个,ε ,q ',α )((q ,q “,2 ,甲),一个,乙',(q ',q ”,2 ,甲),乙' α )甲∈ Γ ∪ { ε } (q ,一个,ε ,q '(q,a,ϵ,q′,α)((q,q′′,2,A),a,B′,(q′,q′′,2,A),B′α)A∈Γ∪{ϵ},甲)((q ,q “,2 ,乙),一,甲',(q ',q ”,2 ,甲),ε )乙∈ Γ ∪ { ε } (q ,一,甲,q ',B )((q ,q '',2(q,a,ϵ,q′,A)((q,q′′,2,B),a,A′,(q′,q′′,2,A),ϵ)B∈Γ∪{ϵ}(q,a,A,q′,B),Ç ),一,乙'甲,(q ,q “,2 ,Ç ),ε )(q ,一个,ε ,q ',α )| α | ≥ 2 (q ,一,甲,q ',甲)((q ,q “,2 ,((q,q′′,2,C),a,B′A,(q,q′′,2,C),ϵ)(q,a,ϵ,q′,α)|α|≥2被类似地处理。对于每个过渡,都有过渡,其中。过渡的处理方式类似。最后,有一个唯一的最终状态,以及过渡。(q,a,A,q′,A)甲),一个,乙,(q ',q “,2 ,甲),乙)乙∈ Γ ' ∪ { ε } (q ,一,甲,q ',甲α )˚F ((q ,q ,2 ,A ),ϵ ,ϵ ,f ,ϵ((q,q′′,2,A),a,B,(q′,q′′,2,A),B)B∈Γ′∪{ϵ}(q,a,A,q′,Aα)f)((q,q,2,A),ϵ,ϵ,f,ϵ)

(我可能错过了一些转换,而我省略的一些细节有些混乱。)

回想一下,我们正在尝试接受单词,其中被原始PDA接受。状态表示我们处于阶段1,处于状态,而原始PDA 在读取之后处于状态。状态相似,其中对应于最后弹出的。在第一阶段,我们被允许推动,而不是弹出。我们对在处理产生的每个非终端执行此操作,但在处理时才弹出。在第二阶段,我们可以弹出ÿ X X Ý (q ,q ',1 )q q ' X (q ,q ',2 ,甲)甲甲' 甲'甲X ý 甲'甲甲ε 乙'yxxy(q,q′,1)qq′x(q,q′,2,A)AA′A′AxyA′而不是推。如果这样做,那么我们必须记住,库存最高的实际上是;这仅在堆栈上没有“临时”内容时才适用,在模拟的PDA中,“临时”内容与或形式为的堆栈顶部相同。AAϵB′

这是一个简单的例子。考虑自动机是推动对于每个,并弹出每个。新的自动机接受两种形式的单词:和。对于第一种形式的话,第1阶段由推倍阶段2包括弹出的倍,推次,和弹出次。对于第二种形式的单词,我们首先按次X Ñ ÿ Ñ甲X 甲ý ý ķ X Ñ ý ñ - ķ X ķ ý ñ X ñ - ķ ķ 甲' ķ 甲' ñ - ķ 甲ñ - ķ 甲ķ 甲ķ 甲ñ - ķ 甲' ñ - ķ A 'xnynAxAyykxnyn−kxkynxn−kkA′kA′n−kAn−kAkA,然后弹出次,按次,过渡到阶段2,然后弹出次。kAn−kA′n−kA′

对于各种类型的括号(“()”,“ []”,“ <>”)来说,这是一个更复杂的示例,因此每种类型的括号的直接后代必须属于不同的类型。例如,“([] <>)”可以,但是“()”是错误的。对于每一个“(”我们推,如果顶级的堆栈是不是,每个“)”,我们弹出。类似地,,与“ []”和“ <>”相关联。这就是我们如何接受单词“>)([((]] <”。我们消耗“>)”,推动,然后过渡到阶段2。我们消耗“(”,弹出和记住顶级的堆栈中的。我们使用“ [()]”,推并弹出 ; 推时甲阿甲乙Ç Ç ' 甲' 甲'甲乙甲乙A ,我们知道“真正的”栈顶是,因此允许使用方括号(我们不会被“>)(()<”所迷惑);按下,由于堆栈的顶部是(不是或的形式),那么我们知道也是“真实的”堆栈顶部,因此可以使用圆括号(即使阴影栈顶是)。最后,我们使用“ <”并弹出。AABϵX′BAC′


抱歉,我无法理解-您能进一步解释吗?自动机从哪里开始,它的过渡是什么?并且每个堆栈符号都会发生切换吗?谢谢!A→A′
— usul 2013年

非常有趣的建议。谢谢。我将对此进行一点咀嚼,以使其沉入
— 。– Hendrik

@usul,您必须自己填写详细信息。开关(在第一阶段)应该在自动机“想要”弹出但不能弹出时发生,而是按下。您可以将其视为不确定的举动。一→ 一个'一个一个'
— Yuval Filmus

@Yuval:对不起,但我无法做到这一点。据我了解您的想法,新的自动机首先模拟部分,更改弹出按钮和推动按钮。然后在堆栈上生成,当读取时,原始自动机以开头。最初是从推动开始的吗?然后,nwe自动机需要从空堆栈中弹出。我仍然认为您的直觉是值得的,但是似乎需要额外的照顾。ÿ α α ÿ
— Hendrik 2013年1

@Hendrik,对不起,但我不能效法您的反例。您认为什么时候新的自动机需要从空堆栈中弹出?
— Yuval Filmus 2013年

4

考虑Greibach范式。要构造一种转换的语言,您只需要将更改即可将并添加一个新的非终端,其行为类似于以前的习惯,以防某些情况生产引用。小号→ α 阿1 ... 甲Ñ小号→ 阿1 ... 甲Ñ α 小号“小号小号


谢谢,但是这只差一个字母。我对通用旋转感兴趣,可以使用任意数量的字母。
— Hendrik

3
@HendrikJan,好吧,如果是上下文无关的,那么也肯定没有上下文。您可以通过应用我建议的方法次来为其构建语法,也可以通过“拼合”给定的语法直接构建语法例如,如果,并且语法具有和,则可以将生产并旋转它。您的语法可能会非常迅速地增长移位1(大号)移Ñ(大号)= 移1(移1(... (大号)... )ñ 移Ñ(大号)ñ = 2 小号→交通α 甲乙甲→交通β Ç 小号→交通α β Ç 乙
— KarolisJuodelė2013年

1
对于固定您是正确的。但是这里是固定的也不是有界的。例如,如果则我们获得。Ñ Ñ 大号= { 一个Ñ b Ñ | Ñ ≥ 0 } { 一个ķ b Ñ 一个ℓ | ķ + ℓ = Ñ } ∪ { b ķ 一个Ñ b ℓ | ķ + ℓ = Ñ }
— Hendrik 2013年1

@HendrikJan,我知道了。我错误地认为问题在于有限的转变。我会重新考虑我的答案……
— KarolisJuodelė2013年

4

检验旧的霍普克罗夫特和乌尔曼经典著作《自动机理论导论》(1979年),是一个好主意。循环中的关闭为练习6.4c,并标记为S **。双星意味着这是最困难的问题之一(在书中)。幸运的是,S表示这是选择的解决方案之一。

解决方法如下。以Chomsky正常形式获取CFG。考虑任何派生树,并将其基本倒置。考虑 原始树中的路径。树的左侧是贡献到右侧 ,这意味着派生的字符串等于。(实际上,当路径继续向左移动时,语法是CNF,贡献将在右边,而相应的为空,等等。)S = X 1,X 2,… ,X n x 1,x 2,… ,x n y 1,y 2,… ,y n x 1 x 2 … x n y n … y 2 y 1 x i

倒置的树的路径为,左侧为,右侧为 ,因此结果为是的派生词。按要求。S′,ˆXn,…ˆX2,ˆX1yn,…,y2y1xn,…,x2x1yn…y2y1x1x2…xn

书中给出了结构的完整细节。

请注意,这如何使Yuval想到(已接受)解决方案。推送而不是弹出的非终端在堆栈上的顺序相反。非常类似于倒挂在树上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.