考虑语言
(其中,#0(X )表示零的数目X)。
L×2={x⊥y⊥z∣x,y,z∈{0,1},#0(x)=#0(y) and |x|+|y|=z}
#0(x)x
使用HAL机器很容易确定-请注意,该机器需要跟踪两个属性:x vs y中的零个数和x ,y(vs z)的长度。它可以在x中看到的每个零将a推入堆中(然后在y中看到的任何零随后弹出);另外,它会推动x ,y中的任何位(然后弹出z的任何位)。由于所有s都被压入堆,因此它们不会干扰计数。该⊥L×2xyx,yz0
x0
y1
x,y1
z1
0
⊥ 用作分隔符,实际上可以忽略。
现在,让为反向语言。即,
大号= { ž ⊥ ý ⊥ X | X ,ÿ ,ž ∈ { 0 ,1 } ,#0(X )= #0(Ý ) 和 | x | + | y | = Z ^ }
我们将证明,没有HAL机器可以决定大号。L=LR×2
L={z⊥y⊥x∣x,y,z∈{0,1},#0(x)=#0(y) and |x|+|y|=z}
L
直觉如下。如上所述,机器必须同时跟踪的长度和x ,y中的零个数。但是,在这种情况下,需要同时跟踪它们。这不能通过堆来完成。更详细地讲,在读取z之后,堆包含有关|的长度的信息。x | + | y | 。在读取y时,机器还必须在堆中保留y中的零。但是,此信息不会干扰堆在x预期长度上已经具有的信息zx,yz|x|+|y|yyx是。非常直观地,关于零个数的信息将在“ x ”的长度信息“之下”x,然后我们在读取无法访问它,要么在该信息“之上”,从而使后者不可访问,或者两种信息将“混合”起来,变得毫无意义。x
更正式地说,我们将使用某种“泵送”参数。也就是说,我们将接受很长的输入,并表明机器的“状态”必须在处理该输入的过程中重复其自身,这将允许我们在机器重复其“状态”时“替换”输入。
对于形式证明,我们需要简化HAL机器的结构,即它不包含 transitions 1的“循环” 。通过这种假设,我们可以看到,对于机器处理的每个输入符号,堆的内容最多可以增加/减少c (对于足够大的常数c)。ε1cc
证明。
假设决定L,并考虑足够长的输入(例如,长度为4 n,则| x | = | y | = n,| z | = 2 n,在下文中忽略⊥s)。具体来说,固定z ,y并假定#0(y )= n / 2。观察有( nHL4n|x|=|y|=n|z|=2n⊥z,y#0(y)=n/2不同X的,使得ž⊥ý⊥X∈大号。(nn/2)xz⊥y⊥x∈L
考虑处理后堆的内容。根据我们的假设,它最多包含3个n c个符号(其中每个符号都来自固定的字母Γ)。不过,也有( ñz⊥y3ncΓ不同的X'小号应该被接受(这是实质上比为堆可能的不同内容物的量越大,因为这按指数规律增加,而不同数量的增加堆多项式,见下文)。取两个输入x1,x(nn/2)x′s应接受的 2,以便满足以下条件:x1,x2
- 长度为的x 1的前缀与0的前缀具有不同的零个数n/2x1相同的长度。x2
- 到机器读取x部分长度为的前缀时,x 1和x 2的堆看起来都相同,并且机器处于相同状态(这对于某些x 1必定发生,x 2,对于足够大的n,因为对于x 1,x 2和最多(3.5 c n )| Γ | | Q有2 个以上0.8 n个不同的选项2n/2xx1x2x1,x2n20.8n2x1,x2堆内容和状态的不同选项 3)。(3.5cn)|Γ||Q|3
很显然,该机器必须接受字,其中X p 1是的前缀X长度的ñ / 2和X 小号2是一个后缀X 2相同的长度。请注意,x p 1 x s 2中的零数目不同于x 1和x 2中的零数目(即,与#0(yz⊥y⊥xp1xs2xp1xn/2xs2x2xp1xs2x1x2#0(y)x1x2,因此我们陷入了矛盾。
1
2 x1n/2n/4log(nk)≈nH(k/n) where H() is the Binary entropy funciton. Since H(1/4)≈0.81 we have (nn/4)>20.8n for large enough n.
3 Assuming alphabet Γ, there are |Γ|n different strings of length n, so if this was a stack we were screwed. However, pushing "01" into a heap is equivalent to pushing "10" - the heap stores only the sorted version of the content. The number of different sorted strings of size n is (n+1|Γ|−1)≈n|Γ|, for a constant |Γ|.