Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> Programmazione >> Computer Programming Languages >> .

Come si può usare il lemma di pompaggio per dimostrare che una lingua non è senza contesto?

Il lemma di pompaggio per i linguaggi senza contesto (CFLS) è uno strumento potente per dimostrare che una determinata lingua non è * senza contesto. È una prova con tecnica di contraddizione. Ecco il processo generale e le idee chiave:

1. Indica il lemma di pompaggio (con cura!)

Prima di iniziare, è essenziale capire la dichiarazione di Pumping Lemma *esattamente *. Ecco una formulazione comune:

Pumping Lemma per CFLS:

Se l è un linguaggio senza contesto, esiste un intero *p *(la "lunghezza di pompaggio") tale che per qualsiasi stringa *s *in l con lunghezza maggiore o uguale a *p *(| s | ≥ *p *), *s *può essere diviso in cinque substrings:*s =uvxyz *, soddisfacendo le seguenti condizioni:

* | VXY | ≤ * p * (la porzione centrale da pompare non è troppo lunga)

* | Vy | ≥ 1 (la sezione pompata non è vuota)

* Per tutto * i * ≥ 0, * Uv i xy i Z* è anche in l (pomping 'V' e 'y' eventuali volte mantiene la stringa nella lingua)

2. Supponiamo che la lingua * sia * senza contesto

Inizia assumendo, per motivi di contraddizione, che la lingua *l *che vuoi dimostrare è *non *senza contesto *è *, in effetti, senza contesto. Questo è il presupposto iniziale che alla fine smentirai.

3. Lascia * P * la lunghezza di pompaggio

Dato che hai ipotizzato che * l * sia privo di contesto, il lemma di pompaggio * deve * applicare. Ciò significa che esiste una lunghezza di pompaggio * P * (di cui non conosci il valore esatto). È fondamentale ricordare che l'avversario (chissà che la lingua non è *senza contesto e sta cercando di ingannarti) riesce a scegliere *P *. Il tuo obiettivo è trovare una stringa che * non importa quale valore di P * sia scelto, le condizioni del lemma di pompaggio portano a una contraddizione.

4. Scegli una stringa*s*∈*l*tale che |*s*| ≥ *p *

Questo è un passo critico. È necessario selezionare attentamente una stringa *s *che appartiene alla lingua *l *e ha una lunghezza maggiore o uguale a *p *. La scelta di * s * è fondamentale per far funzionare la prova. Pensa alla struttura delle stringhe nella tua lingua e al modo in cui il pompaggio potrebbe influenzare quella struttura. L'obiettivo è quello di scegliere una corda le cui proprietà verranno violate quando "V" e "Y" vengono pompate in un modo dettato dal lemma pompare. Questa scelta *spesso *prevede l'impostazione di alcune parti della stringa in base al valore *P *.

*Pensa alle proprietà che fanno apparire le stringhe nella lingua. Quindi scegli una stringa in modo tale che quando viene pompato una sotto-corda, almeno uno dei vincoli per l'appartenenza alla lingua viene violato.*

5. Prendi in considerazione tutte le possibili decomposizioni * s =uvxyz * soddisfacente | VXY | ≤ * p * e | vy | ≥ 1

Il lemma di pompaggio afferma che*qualsiasi*stringa*s*con |*s*| ≥ * p * può essere diviso in questo modo. Quindi, * il tuo avversario * può scegliere come * s * è diviso in * uvxyz * (soggetto ai vincoli | vxy | ≤ * p * e | vy | ≥ 1). Tuttavia, puoi considerare tutte le possibili divisioni. Devi dimostrare che *non importa come *l'avversario sceglie *u *, *v *, *x *, *y *e *z *, puoi pompare la stringa per ottenere una contraddizione.

Spesso ciò comporta la considerazione di diversi *casi *in base a dove *v *e *y *potrebbero potenzialmente cadere all'interno della stringa *s *. Per ogni caso, analizzerai cosa succede quando pompa *V *e *Y *.

6. Mostralo per alcuni *i *≥ 0, la stringa *uv i xy i z * non * non * in * l *

Questo è il nucleo della contraddizione. Per ogni caso considerato nel passaggio 5, devi mostrare che esiste un po 'di *i *(di solito *i *=0 o *i *=2, ma a volte sono necessari altri valori) in modo tale che la stringa risultante *uv i xy i z*non*NON*nella lingua*l*. Ciò significa che viola le regole che definiscono stringhe appartenenti alla lingua.

* Come mostrare * Uv i xy i Z * non è in * l *:Questo dipenderà dalla lingua specifica. Dovrai dimostrare che la stringa pompata viola le proprietà di definizione di *L *. Le strategie comuni includono:

* che mostra che la stringa ora ha un numero ineguale di simboli che erano precedentemente uguali. Ad esempio, se * L * richiede lo stesso numero di "A e" B, mostri che il pompaggio fa sì che il conteggio sia disuguale.

* Mostrando che l'ordine dei simboli è ora errato. Ad esempio, se * l * richiede che tutte le "A vengano prima di tutte le B, mostri che il pompaggio può mettere una" b "prima di una" A ".

* Mostrando che una relazione matematica tra i conteggi non vale più. Ad esempio, se * L * richiede che il numero di "A sia il doppio del numero di" B, mostri che il pompaggio viola questa relazione.

7. Concludere che * l * non è * non * senza contesto

Dal momento che hai dimostrato che il presupposto che * l * sia privo di contesto porta a una contraddizione (il lemma di pompaggio deve contenere, ma hai mostrato un caso in cui non lo fa), puoi concludere che la tua ipotesi iniziale era falsa. Pertanto, * L * non è un linguaggio senza contesto.

Esempio:il linguaggio l ={a n B n C n | n ≥ 0}

Dimostriamo che * l * ={a n B n C n | n ≥ 0} non è privo di contesto usando il lemma di pompaggio.

1. Supponiamo * l * sia privo di contesto.

2. Let * p * sia la lunghezza di pompaggio Garantito dal lemma di pompaggio.

3. Scegli una stringa *s *: Let*s*=a *p* B *p* C *p* . Chiaramente,*s*∈*l*e |*s*| =3*P*≥*P*.

4. Considera tutte le possibili divisioni * s =uvxyz * tale che | vxy | ≤ * p * e | vy | ≥ 1: Dobbiamo considerare dove i substrings *v *e *y *possono essere posizionati all'interno di *s *. Il vincolo cruciale è quello | VXY | ≤ *p *. Ciò limita in modo significativo le possibilità:

* Caso 1:* Vxy * consiste solo di 'A. Quindi * v * =a j e * y * =a k Per alcuni*j*,*k*≥ 0 e*j + k*≥ 1. Se pompiamo giù (*i*=0), otteniamo la stringa a *p-j-k* B *p* C *p* . Poiché * j + k * ≥ 1, questa stringa ha meno di * p * 'a's, ma ha ancora * p *' b's e * p * 'c's. Pertanto, non è in *l *.

* Caso 2:* Vxy * consiste solo di 'B's. Quindi * v * =b j e * y * =b k Per alcuni*j*,*k*≥ 0 e*j + k*≥ 1. Se pompiamo giù (*i*=0), otteniamo un *p* B *p-j-k* C *p* . Ancora una volta, il numero di 'B è inferiore a *P *, mentre i numeri di' A e 'C rimangono *P *, quindi non è in *l *.

* Caso 3:* VXY * consiste solo di 'C. Quindi * v * =c j e * y * =c k Per alcuni*j*,*k*≥ 0 e*j + k*≥ 1. Se pompiamo giù (*i*=0), otteniamo un *p* B *p* C *p-j-k* . Il numero di "C" è inferiore a *P *, mentre i numeri di "A e" b's rimangono *P *, quindi non è in *l *.

* Caso 4:* VXY * è costituito da 'A e' B. Dal momento che | VXY | ≤ *P *, non può includere alcun "C perché tutte le *B *P *'A e *P *' B devono precedere qualsiasi C. Dal momento che | Vy | ≥ 1, almeno uno di * v * o * y * deve contenere un carattere. Pertanto * v * =a j B k e * y * =a l B m Per alcuni *j *, *k *, *l *, *m *≥ 0 e *j + k + l + m *≥ 1, con almeno uno di 'a' o 'b' in *v *o *y *.

Se pompiamo (*i*=2), otteniamo la stringa a *p+j+l* B *p+k+m* C *p* . Se * k + m * è zero (quindi * v * e * y * contengono solo 'a) il numero di' aumenta di a ma il numero di 'B rimane lo stesso. Il risultato è un *p+j+l* B *p* C *p* che non è più nella lingua. Se * j + l * è zero (quindi * v * e * y * contengono solo 'b), il numero di' B aumenta ma il numero di 'A rimane lo stesso. Il risultato è un *p* B *p+k+m* C *p* che non è più nella lingua. Se entrambi *k+m *e *j+l *sono maggiori di zero, allora *uv 2 XY 2 Z* ha più 'A e' B di 'C, il che significa che non può essere della forma A n B n C n .

* Caso 5:* Vxy * è costituito da 'B's e' C's. Questo è simmetrico per il caso 4. Ancora una volta, il pompare si tradurrà in una stringa che non si trova nella lingua.

5. Contradicanza: In ogni caso possibile, abbiamo dimostrato che esiste un *i *tale che *uv i xy i Z*non è in*l*. Questo contraddice il lemma di pompaggio.

6. Conclusione: Pertanto, il nostro presupposto iniziale che * l * sia privo di contesto deve essere falso. Quindi, * l * ={a n B n C n | n ≥ 0} non è privo di contesto.

Suggerimenti chiave per l'uso del lemma di pompaggio:

* Comprendi precisamente il lemma: Conoscere la dichiarazione e le condizioni esatte.

* Scelta di stringa strategica: La scelta di * s * è cruciale. Scegli una stringa che evidenzia la proprietà che si desidera rompere il pompaggio. Spesso è utile impostare parti della stringa in base a * p *.

* Analisi accurata dei casi: Considera tutte le posizioni possibili per *v *e *y *all'interno di *s *, dati i vincoli | vxy | ≤ * p * e | vy | ≥ 1.

* Scegli il diritto * i *:Sperimenta *i *=0, *i *=2, o altri valori per trovare quello che dimostra chiaramente la violazione di *l *. A volte * i * =0 farà scomparire qualcosa e * i * =2 farà duplicare qualcosa.

* Sii chiaro e rigoroso: Spiega esattamente perché la stringa pompata non è più in *l *. Fare riferimento alle proprietà di definizione della lingua.

Il lemma di pompaggio può essere difficile da padroneggiare. Esercitati con lingue diverse per acquisire esperienza nella scelta delle stringhe appropriate e nella gestione dell'analisi del caso. Ricorda, l'obiettivo è trovare una stringa in cui * qualsiasi * possibile applicazione del lemma di pompaggio porta a una contraddizione. Buona fortuna!

 

Programmazione © www.354353.com