Dopo 2 tentativi falliti, che sono stati confutati da @Hendrik Jan (grazie), eccone un altro, che non ha più successo. @Vor ha trovato un esempio di un linguaggio CF deterministico in cui si applica la stessa costruzione, se corretta. Ciò ha permesso di identificare un errore nell'ancoraggio della stringa nell'applicazione del lemma. Il lemma stesso non sembra essere in colpa. Questa è chiaramente una costruzione troppo semplicistica. Vedi maggiori dettagli nei commenti.y
La lingua non è privo di contesto.L={uxvy∣u,v,x,y∈{0,1}∗{ϵ} , ∣u∣=∣v∣ , u≠v , ∣x∣=∣y∣ , x≠y }
È utile tenere presente la caratterizzazione dove d è la distanza di Hamming, proposta da @sdcvvc. Ciò a cui bisogna pensare sono 2 posizioni selezionate in ciascuna mezza stringa in modo tale che i simboli corrispondenti differiscano.L={uv:|u|=|v|,d(u,v)≥2}
Quindi consideri una stringa tale che i < j e i + j siano pari. È chiaramente nella lingua L, tagliando u e x ovunque tra i due 1. Vogliamo pompare quella stringa nella prima parte tra le 1, in modo che diventi 10 j 10 j che non dovrebbe essere nella lingua.10i10ji<ji+jux10j10j
Per prima cosa proviamo a usare il lemma di Ogden , che è come il lemma di pompaggio, ma si applica a o più simboli distinti che sono segnati sulla stringa, p essendo la lunghezza di pompaggio per i simboli contrassegnati (ma il lemma può pompare di più perché può anche pompare simboli non contrassegnati). La lunghezza marcata di pompaggio p dipende solo dalla lingua. Questo tentativo fallirà, ma il fallimento sarà un suggerimento.ppp
Possiamo quindi scegliere e contrassegnare i simboli sulla prima sequenza di i 0. Sappiamo che nessuno dei due 1 sarà nella pompa, perché può pompare una volta (esponente 0) invece di pompare. E pompare i 1 ci farebbe uscire dalla lingua.i=pi
Tuttavia, potremmo pompare su entrambi i lati del secondo 1 più velocemente o addirittura più velocemente sul lato destro, in modo che il secondo 1 non attraversi mai la metà della stringa. Anche il lemma di Ogden non fissa un limite superiore alla dimensione di ciò che viene pompato, quindi non è possibile organizzare il pompaggio per ottenere l'1 più a destra esattamente attraverso il centro della stringa.
Usiamo una versione modificata del lemma, qui chiamata Lemma di Nash, che può gestire queste difficoltà.
Abbiamo prima bisogno di una definizione (probabilmente ha un altro nome in letteratura, ma non so quale - l'aiuto è il benvenuto). Si dice che una stringa sia una cancellazione di una stringa v se viene ottenuta da v cancellando i simboli in v . Noteremo u ≺ v .uvvvu≺v
Lemma di Nash:
se è un linguaggio privo di contesto, allora esistono due numeri p > 0 e q > 0 tali che per qualsiasi stringa w di lunghezza almeno p in L , e ogni modo di "segnare" p o più del le posizioni in w , w possono essere scritte come w = u x y z v con stringa u , x , y , z , v , tale cheLp>0q>0wpLpwww=uxyzvuxyzv
- ha almeno una posizione contrassegnata,xz
- xyz has at most p marked positions, and
- there are 3 strings x^, y^, z^ such that
- x^≺x, y^≺y, z^≺z,
- 1≤∣x^z^∣≤q, 1≤∣y^∣≤q, and
- uxjx^iy^z^izjv is in L for every i≥0 and for every j≥0.
Proof: Similar to the proof of Ogden's lemma, but the subtrees corresponding to the strings y and xz are pruned so that they do not contain any path with twice the same non-terminal (except for the roots of these two subtrees). This necessarily limits the size of the generated strings x^z^ and y^ by a constant q.
The strings xj and zj, for j≥0, corresponding to an unpruned version of the tree, are used mainly with j=1 to simplify the accounting when the lemma is applied.
We modify the above proof attempt by marking the p leftmost symbols
0, but they are followed by 2q symbols 0 to make sure that we pump
in the left part of the string, between the two 1's. That make a total of i=p+2q 0's between the 1's (actually i=p+q would be sufficient, since the rightmost 1 cannot be in z^, which would allow to simply remove it).
What is left is to have chosen j so that we can pump exactly the right number of 0's so that the two sequences are equal. But so far, the only constraint on j is to be greater than i. And we also know that the number of 0's that are pumped at each pumping is between 1 and q. So let h be product of the first q integers. We choose j=i+h.
Hence, since the pumping increment d - whatever it is - is in [1,q], it divides h. Let k be the quotient. If we pump exactly k times, we get a string 10j10j which is not in the language. Hence L is not context-free.
.
I think that I shall never see
A string lovely as a tree.
For if it does not have a parse,
The string is naught but a farce