语言L的循环移位 (也称为旋转或共轭)定义为\ {yx \ mid xy \ in L \}。根据维基百科(和此处),无上下文语言在此操作下是封闭的,参考了Oshiba和Maslov的论文。有一个容易证明这一事实的证据吗?大号
对于常规语言,闭包以这种形式讨论为“ 证明在循环运算符下关闭了常规语言 ”。
语言L的循环移位 (也称为旋转或共轭)定义为\ {yx \ mid xy \ in L \}。根据维基百科(和此处),无上下文语言在此操作下是封闭的,参考了Oshiba和Maslov的论文。有一个容易证明这一事实的证据吗?大号
对于常规语言,闭包以这种形式讨论为“ 证明在循环运算符下关闭了常规语言 ”。
Answers:
您可以尝试使用下推自动机。给定原始语言的下推自动机,我们为循环移位构造一个。新的自动机分两个阶段运行,分别对应词的和部分(其中是原始语言)。在第一阶段,每当自动机想要弹出一个非终端,它就可以推送一个非终端。这个想法是,在第一阶段的最后,堆栈将包含相反的顺序,即原始自动机读取后在堆栈中找到的符号。在第二阶段(开关是不确定的),而不是按下非端子ÿ
编辑:这里有一些更多的细节。假设我们给了一个PDA,其字母为,状态集,接受状态,非终端,初始状态和一组允许的过渡。每个允许的过渡都具有,这意味着当处于状态,在读取(或,在这种情况下,它是自由过渡),如果堆栈顶部是(或,这意味着堆栈为空),则PDA可以(这是一个不确定性模型)移至状态,替换为Σ Q ˚F Γ q 0(q ,一,甲,q ',α )q 一个∈ 甲一个= ε 甲∈ Γ 甲= ε q '甲α ∈ Γ *
新的PDA每个具有新的非终端。对于每两个状态和,有两个状态。起始状态(实际起始状态是通过过渡非确定地选择的)是。对于每个过渡都有对应的过渡和。还有其他过渡。甲'甲∈ Γ q ,q ' ∈ Q 甲∈ Γ q “,1 ),一,甲,(q ',q ”,1 ),α )
对于每个过渡,都有过渡,其中和。对于每个最终状态,都有过渡,其中。(q ,一,甲,q ',α )((q ,q “,1 ),一个,乙',(q ',q ”,1 ),乙' 甲' α )乙∈ Γ ∪ { ε } ε ' = ε q ∈ ˚F ((q ,
对于每个过渡,都有过渡,其中。对于每个过渡,都有过渡,其中。对于每个过渡,都有“广义过渡” ; 这些被实现为通过中间新状态的两次转换的序列。过渡\ alpha) 和(q ,一个,ε ,q ',α )((q ,q “,2 ,甲),一个,乙',(q ',q ”,2 ,甲),乙' α )甲∈ Γ ∪ { ε } (q ,一个,ε ,q '
(我可能错过了一些转换,而我省略的一些细节有些混乱。)
回想一下,我们正在尝试接受单词,其中被原始PDA接受。状态表示我们处于阶段1,处于状态,而原始PDA 在读取之后处于状态。状态相似,其中对应于最后弹出的。在第一阶段,我们被允许推动,而不是弹出。我们对在处理产生的每个非终端执行此操作,但在处理时才弹出。在第二阶段,我们可以弹出ÿ X X Ý (q ,q ',1 )q q ' X (q ,q ',2 ,甲)甲甲' 甲'甲X ý 甲'甲甲ε 乙'
这是一个简单的例子。考虑自动机是推动对于每个,并弹出每个。新的自动机接受两种形式的单词:和。对于第一种形式的话,第1阶段由推倍阶段2包括弹出的倍,推次,和弹出次。对于第二种形式的单词,我们首先按次X Ñ ÿ Ñ甲X 甲ý ý ķ X Ñ ý ñ - ķ X ķ ý ñ X ñ - ķ ķ 甲' ķ 甲' ñ - ķ 甲ñ - ķ 甲ķ 甲ķ 甲ñ - ķ 甲' ñ - ķ A '
对于各种类型的括号(“()”,“ []”,“ <>”)来说,这是一个更复杂的示例,因此每种类型的括号的直接后代必须属于不同的类型。例如,“([] <>)”可以,但是“()”是错误的。对于每一个“(”我们推,如果顶级的堆栈是不是,每个“)”,我们弹出。类似地,,与“ []”和“ <>”相关联。这就是我们如何接受单词“>)([((]] <”。我们消耗“>)”,推动,然后过渡到阶段2。我们消耗“(”,弹出和记住顶级的堆栈中的。我们使用“ [()]”,推并弹出 ; 推时甲阿甲乙Ç Ç ' 甲' 甲'甲乙甲乙
考虑Greibach范式。要构造一种转换的语言,您只需要将更改即可将并添加一个新的非终端,其行为类似于以前的习惯,以防某些情况生产引用。小号→ α 阿1 ... 甲Ñ小号→ 阿1 ... 甲Ñ α 小号“小号小号
检验旧的霍普克罗夫特和乌尔曼经典著作《自动机理论导论》(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想到(已接受)解决方案。推送而不是弹出的非终端在堆栈上的顺序相反。非常类似于倒挂在树上。