Considérons le langage
(où # 0 ( x ) indique le nombre de zéros dans x ).
L×2={x⊥y⊥z∣x,y,z∈{0,1},#0(x)=#0(y) and |x|+|y|=z}
#0(x)x
Il est facile de décider utilisant une machine HAL - observez que la machine doit garder une trace de deux propriétés: le nombre de zéros dans x vs y et la longueur de x , y (vs z ). Il peut pousser un dans le tas pour chaque zéro qu'il voit dans x (puis pop plus tard pour tout zéro vu dans y ); en outre, il pousse pour tout bit en x , y (et plus tard apparaît pour tout bit de z ). Puisque tous les s sont poussés vers le bas du tas, ils n'interfèrent pas avec le comptage. Le ⊥L×2xyx,yz0
x0
y1
x,y1
z1
0
⊥ sert de délimiteur et peut être pratiquement ignoré.
Soit maintenant , la langue inverse. Autrement dit,
L = { z ⊥ y ⊥ x ∣ x , y , z ∈ { 0 , 1 } , # 0 ( x ) = # 0 ( y ) et | x | + | y | = z }
Nous montrerons qu'aucune machine HAL ne peut décider LL=LR×2
L={z⊥y⊥x∣x,y,z∈{0,1},#0(x)=#0(y) and |x|+|y|=z}
L .
L'intuition est la suivante. Comme ci-dessus, la machine doit suivre à la fois la longueur de et le nombre de zéros en x , y . Cependant, dans ce cas, il doit les suivre simultanément . Cela ne peut pas être fait via un tas. Plus en détail, après avoir lu z , le tas contient des informations sur la longueur de | x | + | y | . lors de la lecture de y, la machine doit également conserver dans le tas le nombre de zéros de y . Cependant, ces informations ne peuvent pas interférer avec les informations que le tas possède déjà sur la longueur que nous attendons xzx,yz|x|+|y|yyxêtre. Très intuitivement, soit les informations sur le nombre de zéros seront "en dessous" des informations sur la longueur de , puis nous ne pouvons pas y accéder en lisant xxx , soit elles sont "au-dessus" de ces informations, rendant ces dernières inaccessibles, ou deux informations seront "mélangées" et deviendront vides de sens.
Plus formellement, nous allons utiliser une sorte d'argument de "pompage". Autrement dit, nous prendrons une entrée très longue et montrerons que "l'état" de la machine doit se répéter pendant le traitement de cette entrée, ce qui nous permettra de "remplacer" l'entrée une fois que la machine répète son "état".
Pour la preuve formelle, nous demandons une simplification de la structure de la machine HAL, à savoir qu'elle ne contient pas de "boucle" de -transitions 1 . Avec cette hypothèse, nous pouvons voir que pour chaque symbole d'entrée que la machine traite, le contenu du tas peut augmenter / diminuer d'au plusε1 (pour une constante c assez grande).cc
Preuve.
Supposons que décide de L et considérons une entrée suffisamment longue (disons de longueur 4 n , donc | x | = | y | = n , | z | = 2 n , en ignorant les ⊥ s ci-après). Pour être concret, fixons z , y et supposons que # 0 ( y ) = n / 2 . Observez qu'il y a ( nHL4n|x|=|y|=n|z|=2n⊥z,y#0(y)=n/2différentsxtels quez⊥y⊥x∈L(nn/2)xz⊥y⊥x∈L .
Considérez le contenu du tas immédiatement après le traitement de . Il contient au plus 3 n c symboles (où chaque symbole provient d'un alphabet fixe Γ ), selon notre hypothèse. Cependant, il existe ( nz⊥y3ncΓ(nn/2)x′sx1,x2
- n/2x1x2
- n/2xx1x2x1,x2n20.8n2x1,x2(3.5cn)|Γ||Q| différentes options pour le contenu et l'état du tas3).
It is clear that the machine must accept the word z⊥y⊥xp1xs2, where xp1 is a prefix of x of length n/2 and xs2 is a suffix of x2 of the same length. Note that the number of zeros in xp1xs2 differs from the number of zeros in x1 and x2 (that is, from #0(y)), due to the way we chose x1 and x2, thus we reached a contradiction.
1 Does this assumption damages generality? I don't think so, but this indeed requires a proof. If someone sees how to get around this extra assumption, I'd love to know.
2 Let's fix x1 so that it's prefix (of length n/2 has exactly n/4 zeros). Recall that using Stirling's approximation we know that log(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 |Γ|.