无限制语法:{sss | s存在于{a,b} *}

时间:2016-05-03 23:04:33

标签: grammar turing

为sss构建无限制语法的方法是什么?我知道为了构造ss,你需要构造ss ^ r然后重新反转第二个字符串,但是如何为sss做呢?

1 个答案:

答案 0 :(得分:0)

这可能有一些错误,但这个想法应该让你走上正轨。

// section 1
S := LTR
T := ATWX | BTYZ | N

// section 2
WW' := W'W
WY' := Y'W
YW' := W'Y
YY' := Y'Y

// section 3
WX' := W'X'
WZ' := W'Z'
YX' := Y'X'
YZ' := Y'Z'

// section 4
XW' := W'X
XX' := X'X
XY' := Y'X
XZ' := Z'X
ZW' := W'Z
ZX' := X'Z
ZY' := Y'Z
ZZ' := Z'Z

// section 5
XR  := X'R
ZR  := Z'R

// section 6
NW' := W'N
NX' := X'N
NY' := Y'N
NZ' := Z'N
NR  := Q

// section 7
AQ  := Qa
W'Q := Qa
X'Q := Qa
BQ  := Qb
Y'Q := Qb
Z'Q := Qb
LQ  := e

第1节列出了基本方案。我们将用L和R来标记我们工作空间的开始和结束是完全明确的。 T是我们的工作空间,L和R是左右标记。我们的工作空间可以添加三个a s(这些是A,W和X将在以后变为)或添加三个b s(这些是B,Y和Z将在以后变为)或它可以通过生成特殊的非终结N来退出.N将会将我们的非终结字符串变成一串终端,我们稍后会看到。

因此xxx中的x需要(a+b)*。由于我们设置制作的方式,AB被添加到第一个x的末尾。第2部分的工作是确保将WY添加到第二个x的末尾。不幸的是,我们的作品将WY置于第二个x的开头,因此,如果不进行更正,我们最终会得到xx^R。第2节通过"浮动"纠正了这个问题。只要WY已经找到了正确的位置,就可以向右WYWY s不能相互传递,因此一旦音乐停止,这可以保证它们以正确的顺序结束。

第3节显示第二次出现x中的符号如何找到正确的位置。基本上,他们向右移动(基于第2部分),直到找到第三个x的符号在他们适当的位置。由于第二个x的符号在第三个x的符号之前有适当的位置,因此在第三个xX或{的任一个符号之前的最后一个可能位置{1}})是第二个Z的每个符号的正确位置。所以我们一直向右移动到第二个x的末尾。

我们在第4部分重复第3个x的过程,但我们必须让这些符号(xX)浮过第二个或第三个符号Z {1}}已经找到了合适的位置。这些符号不能通过自己,所以通过我们在第2节中看到的相同逻辑,我们将以正确的顺序得到符号。

第5节说明何时停止构成右边第三个x的浮动符号。还记得工作空间标记x的结束吗?第三个R的最后一个符号一直出现在x之前的右侧。所以,当我们知道我们找到了符号的适当位置时。

第6节开始完成推导的过程。我们有一串可爱的非终结者,我们想把它们变成终端。我们要做的第一件事就是将R向右移过第二个和第三个N的放置符号,一直到字符串标记x的末尾。我们不需要R任何内容,因此我们将R转换为N。正如我们将在下一节中看到的那样Q是神奇发生的原因。

第7节概述了Q如何在整个非终结点字符串中向左移动,这些非终结符号一直找到Q,将非终结符号改为正确的终端。一旦找到L,它就会消除两个非终结符号,只留下一串终结符号。推导完成。

为了说明这个过程,我们生成L

aabaabaab