Come dimostrare che una lingua non è regolare?


76

Abbiamo imparato a conoscere la classe di lingue regolari . È caratterizzato da un concetto qualsiasi tra espressioni regolari, automi finiti e grammatiche lineari a sinistra, quindi è facile dimostrare che una determinata lingua è regolare.REG

Come faccio a mostrare il contrario, però? Il mio TA è stato fermamente convinto che per farlo, dovremmo dimostrare per tutte le espressioni regolari (o per tutti gli automi finiti, o per tutte le grammatiche lineari a sinistra) che non possono descrivere la lingua a portata di mano. Sembra un grosso compito!

Ho letto di un lemma del pompaggio ma sembra davvero complicato.

Questa dovrebbe essere una domanda di riferimento che raccoglie i normali metodi di prova ed esempi di applicazione. Vedi qui per la stessa domanda sui linguaggi senza contesto.

Risposte:


60

La prova per contraddizione viene spesso usata per dimostrare che una lingua non è regolare: lascia che P una proprietà vera per tutte le lingue normali, se la tua lingua specifica non verifica P , allora non è regolare. È possibile utilizzare le seguenti proprietà:

  1. Il lemma del pompaggio, come esemplificato nella risposta di Dave ;
  2. Proprietà di chiusura di linguaggi regolari (operazioni set, concatenazione, stella di Kleene, specchio, omomorfismi);
  3. Una lingua normale ha un numero finito di classe di equivalenza del prefisso, il teorema di Myhill – Nerode .

Per dimostrare che una lingua L non è regolare utilizzando le proprietà di chiusura, la tecnica consiste nel combinare L con le lingue regolari mediante operazioni che preservano la regolarità al fine di ottenere una lingua nota per non essere regolare, ad esempio la lingua archetipica I={anbnnN} . Ad esempio, lascia L={apbqpq} . Si supponga L è regolare, come linguaggi regolari sono chiusi sotto complementazione così è L 's complemento Lc . Ora prendiamo l'intersezione diLc eab che è regolare, otteniamoI che non è regolare.

Il teorema di Myhill – Nerode può essere usato per dimostrare che I sono regolare. Per p0 , I/ap={arbrbprN}=I.{bp} . Tutte le classi sono diverse e esiste un'infinità numerabile di tali classi. Poiché una lingua normale deve avere un numero finito di classi, I sono regolare.


3
Non sapevo del teorema di Myhill-Nerode, bello!
Daniil

Wikipedia ha anche una sezione sul numero di parole in una lingua normale: se puoi provare che la tua lingua non corrisponde alla caratterizzazione, allora la tua lingua non è regolare: en.wikipedia.org/wiki/…
Alex ten Brink

@Daniil, le espressioni regolari non possono contare mi sembra una formulazione informale popolare del teorema di Myhill-Nerode.
AProgrammer

@AlextenBrink: è pulito. Immagino che le costanti nell'affermazione siano gli autovalori del Laplaciano dell'automa? Questo farebbe una bella aggiunta alle risposte qui.
Louis

@ Louis: in realtà, non abbiamo trovato alcun riferimento a quel teorema, quindi se ne sai di più ... Vedi anche: cs.stackexchange.com/questions/1045/…
Alex ten Brink

37

Basato sulla risposta di Dave, ecco un "manuale" passo-passo per usare il lemma del pompaggio.

Ricorda il lemma del pompaggio (tratto dalla risposta di Dave, preso da Wikipedia):

Sia L un linguaggio regolare. Quindi esiste un numero intero n1 (dipendente solo da L ) in modo tale che ogni stringa w in L di lunghezza almeno n ( n è chiamata "lunghezza di pompaggio") può essere scritta come w=xyz (cioè, w può essere diviso in tre sottostringhe), soddisfacendo le seguenti condizioni:

  1. |y|1
  2. |xy|n e
  3. un "pompato" w è ancora in L : per tutti i0 , xyizL .

Supponiamo che ti venga data una lingua L e vuoi dimostrare che non è regolare tramite il lemma di pompaggio. La prova si presenta così:

  1. Supponiamo che L sia regolare.
  2. Se è regolare, il lemma di pompaggio dice che esiste un numero n che è la lunghezza di pompaggio.
  3. Scegli una parola specifica wL di lunghezza maggiore di n . La parte difficile è sapere quale parola prendere.
  4. Considera TUTTI i modi per partizionare w in 3 parti, w=xyz , con |xy|n ed y non vuoto. Per ognuno di questi modi, dimostrano che non può essere pompato: esiste sempre qualche i0 tale che xyizL .
  5. Concludere: la parola w non può essere "pompata" (non importa come la dividiamo in xyz ) in contraddizione con il lemma di pompaggio, cioè la nostra ipotesi (fase 1) è errata: L non è regolare.

Prima di fare un esempio, lasciatemi ripetere i passaggi 3 e 4 (è qui che la maggior parte delle persone sbaglia). Nel passaggio 3 è necessario scegliere una parola specifica in L . scrivilo esplicitamente, come "00001111" o " anbn ". Esempi di cose che non sono una parola specifica: " w " o "una parola che ha 000 come prefisso".

D'altra parte, nel passaggio 4 è necessario considerare più di un caso. Ad esempio, se w=000111 non è sufficiente dire x=00,y=01,z=00 e quindi raggiungere una contraddizione. È inoltre necessario selezionare x=0,y=0,z=0111 e x=ϵ,y=000,z=111 e tutte le altre opzioni possibili.


Ora seguiamo i passaggi e dimostriamo che L={0k12kk>0} non è regolare.

  1. Supponiamo che L sia regolare.
  2. Sia n la lunghezza di pompaggio data dal lemma di pompaggio.
  3. Sia w=0n12n .
    (controllo di integrità: |w|>n se necessario. Perché questa parola? anche altre parole possono funzionare .. ci vuole un po 'di esperienza per trovare la giusta w ). Ancora una volta, nota che w è una parola specifica: 0000n times11112n times .
  4. Ora cominciamo a considerare i vari casi per dividere w in xyz con |xy|n e |y|>0 . Dal |xy|<n non importa come abbiamo diviso w , x sarà composto solo da 0 e anche y . Supponiamo |x|=s e |y|=k . Dobbiamo considerare TUTTE le opzioni, ovvero tutte le possibili s,k tale ches0,k1 es+kn . PER QUESTOL la prova per tutti questi casi è la stessa, ma in generale potrebbe essere diversa.
    prendii=0 e consideraxyiz=xz . questa parola NON è inL poiché ha la forma0nk12n (non importa cosas ekerano), e poiché k1 , questa parola non è in L e si raggiunge una contraddizione.
  5. Pertanto, la nostra ipotesi non è corretta e L non è regolare.

Una clip di YouTube che spiega come utilizzare il lemma di pompaggio lungo le stesse linee può essere trovata qui


1
È n che è la lunghezza di pompaggio in questa definizione!
Saadtaame,

La base di ciò è che qualsiasi stringa sufficientemente lunga deve aver attraversato un ciclo nella macchina a stati e, se lo attraversi una volta, puoi attraversarla un numero qualsiasi di volte.
gnasher729

28

Da Wikipedia, la lingua di pompaggio per le lingue normali è la seguente:

Sia un linguaggio regolare. Quindi esiste un numero intero p 1 (dipendente solo da L ) in modo tale che ogni stringa w in L di lunghezza almeno p ( p è chiamata "lunghezza di pompaggio") può essere scritta come w = x y z (cioè, w può essere diviso in tre sottostringhe), soddisfacendo le seguenti condizioni:Lp1LwLppw=xyzw

  1. |y|1
  2. e |xy|p
  3. per tutti , x y i z L . y è la sottostringa che può essere pompata (rimossa o ripetuta un numero qualsiasi di volte e la stringa risultante è sempre in L ). i0xyizL
    yL

(1) significa che il circuito y da pompare deve essere lungo almeno uno; (2) significa che il loop deve avvenire entro i primi caratteri p. Non ci sono restrizioni su xe z.

In parole semplici, per qualsiasi lingua regolare L, qualsiasi parola sufficientemente lunga può essere divisa in 3 parti. cioè w = x y z , in modo tale che tutte le stringhe x y k z per k 0 sono anche in L .wLw=xyzxykzk0L

Ora consideriamo un esempio . Sia .L={(01)n2nn0}

Per dimostrare che ciò non è regolare, è necessario considerare l' aspetto di tutte le decomposizioni , quindi quali sono tutte le possibili cose x, y e z che si può dare che x y z = ( 01 ) p 2 p (scegliamo di guardare questa parola particolare, di lunghezza 3 p , dove p è la lunghezza di pompaggio). Dobbiamo considerare dove si trova la parte y della stringa. Potrebbe sovrapporsi alla prima parte e sarà quindi uguale a ( 01 ) k + 1 , ( 10 )w=xyzxyz=(01)p2p3ppy(01)k+1 ,1(01 ) k o0(10 ) k , per alcunik0(non dimenticare che | y |1). Potrebbe sovrapporsi alla seconda parte, nel senso chey= 2 k , per alcunik>0. Oppure potrebbe sovrapporsi tra le due parti della parola e avrà la forma(01 ) k + 1 2 l ,(10 ) k(10)k+11(01)k0(10)kk0|y|1y=2kk>0(01)k+12l ,1(01 ) k 2 l o0(10 ) k 2 l , perk0el1.(10)k+12l1(01)k2l0(10)k2lk0l1

Ora pompate ognuno per ottenere una contraddizione, che sarà una parola non nella vostra lingua. Ad esempio, se prendiamo , il lemma di pompaggio dice, ad esempio, che x y 2 z = x 0 ( 10 ) k 2 l 0 ( 10 ) k 2 l z deve essere nel lingua, per una scelta appropriata di x e z . Ma questa parola non può essere nella lingua come appare un 2 prima di un 1 .y=0(10)k2lxy2z=x0(10)k2l0(10)k2lzxz21

In altri casi il numero di sarà maggiore del numero di 2 o viceversa, oppure si tradurranno in parole che non avranno la struttura ( 01 ) n 2 n , ad esempio, avendo due 0 di fila.(01)2(01)n2n0

Non dimenticarlo . Qui, è utile abbreviare la dimostrazione: molte delle decomposizioni sopra sono impossibili perché renderebbero la parte z troppo lunga.|xy|pz

Ciascuno dei casi di cui sopra deve portare a tale contraddizione, che sarebbe quindi una contraddizione del lemma di pompaggio. Ecco! La lingua non sarebbe normale.


Un esempio in cui l'ipotesi è necessario sarebbe bello. |xy|p
Gilles 'SO- smetti di essere malvagio'

@Gilles: Non sono nemmeno sicuro di cosa significhi la frase che hai aggiunto.
Dave Clarke,

@Gilles: penso che tutte le decomposizioni siano possibili, solo che sarà limitato. Non sono sicuro di cosa abbia a che fare con la lunghezza di z . kz
Dave Clarke,

Duh! Ora lo vedo. Grazie. Tuttavia, non esclude nessuna delle forme di decomposizione menzionate nella risposta; limita solo i valori di e l che posso prendere. kl
Dave Clarke,

1
La quantità di editing che è stata fatta per rispondere a una domanda così semplice mi fa chiedere perché tutti insegnino il lemma del pompaggio come "il" modo per dimostrare la non regolarità. Per curiosità, perché non prendere semplicemente la tua stringa come qualcosa del tipo ? Il lemma di pompaggio si dice che y non ci sono 2 s in essa, da cui una contraddizione è più semplice. (01)2p22py2
Louis,

14

Per una data lingua , letLΣ

SL(z)=n0|LΣn|zn

la funzione (ordinaria) di generazione di , ovvero la sua sequenza di conteggi di parole per lunghezza.L

La seguente dichiarazione contiene [ FlSe09 , p52 ]:

LREGSL rational

Cioè, conpolinomiP,Q.SL(z)=P(z)Q(z)P,Q

Quindi qualsiasi linguaggio la cui funzione generatrice non è razionale non è regolare. Sfortunatamente, tutti i linguaggi lineari hanno anche funzioni di generazione razionale¹, quindi questo metodo non funzionerà per i linguaggi non regolari più semplici. Un altro svantaggio è che ottenere (e dimostrare che non è razionale) può essere difficile.SL

Esempio: considerare la lingua delle parole tra parentesi nidificate correttamente, ovvero la lingua Dyck . È generato dalla grammatica non ambigua

S[S]Sε

che può essere tradotto nell'equazione

S(z)=z2S2(z)+1

una soluzione (quella con tutti i coefficienti positivi) di cui è

.S(z)=114z22z2

Poiché [ Kuic70 ] e S non sono razionali, il linguaggio Dyck non è regolare.SL=SS


  1. La prova per l'affermazione per le lingue regolari funziona immediatamente tramite grammatiche e trasferisce a grammatiche lineari (commutatività della moltiplicazione).

  [FlSe09] Combinatoria analitica di P. Flajolet e R. Sedgewick (2009) [Kuic70] Sull'entropia delle lingue senza contesto di W. Kuich (1970)
  


13

Questa è una versione estesa della mia risposta da qui L' uso del pompaggio di Lemma per dimostrare che la lingua non è regolareL={(01)m2mm0} poiché si suppone che questa sia una domanda di riferimento.

Quindi, pensi che il lemma del pompaggio sembri complicato? Non ti preoccupare. Ecco un approccio leggermente diverso, che è nascosto anche nella risposta di @ Romuald. (Quiz: dove?)

Cominciamo ricordando che ogni linguaggio regolare è accettato da un automa a stati finiti deterministico (DFA). Un DFA è un grafico diretto finito in cui ogni vertice ha esattamente un margine esterno per ogni lettera dell'alfabeto. Le stringhe forniscono una camminata nel grafico basata su un vertice etichettato "start" e il DFA accetta se questa camminata termina con un vertice etichettato "accetta". (I vertici sono chiamati "stati" perché a diverse aree della matematica piace inventare la propria terminologia per la stessa cosa.)

Con questo modo di pensare è facile vedere che: Se le stringhe di e b guidare il DFAE allo stesso stato, quindi per qualsiasi altra stringa c , un c e b c guidare il DFA nello stesso stato. abcacbcPerché? Perché il punto di riferimento di una passeggiata e la stringa che la definisce determinano la fine completamente.

Mettere leggermente diverso: Se è regolare e stringhe un e b guidare un automa riconoscendo allo stesso stato, poi per tutte le stringhe c , sia un c e b c sono entrambi a L o nessuno dei due è.LabcacbcL

Possiamo usare questo per mostrare le lingue non sono regolari immaginando che è e poi venire con e b guida di una DFA allo stesso stato, e c in modo che un c è nella lingua e b c non è. Prendi la lingua di esempio dalla risposta di @ Dave. Immagina che sia regolare, quindi ha qualche riconoscimento DFA con m stati. Il principio Pigeon Hole afferma che almeno due di { ( 01 ) i : 0 i m + 1 } inviano il DFA allo stesso stato, ad esempio a = ( 01abcacbcm{(01)i:0im+1} e b = ( 01 ) q . Poiché p q , vediamo che un 2 p è nella lingua e b 2 p non lo è, quindi questa lingua non può essere regolare.a=(01)pb=(01)qpqa2pb2p

La cosa bella è che l'esempio è davvero un modello per dimostrare che le lingue non sono regolari:

  • Trovare una famiglia di stringhe con la proprietà che ciascuno di loro ha una "coda" t i in modo che un i t i è nella lingua e un i t j , per i j non è.{ai:iN}tiaitiaitjij
  • Applica l'argomento sopra alla lettera. (Questo è permesso, poiché ci sono sempre abbastanza per permetterti di invocare il Principio di Pigeon Hole.)ai

Ci sono altri trucchi, ma questo funzionerà facilmente sulla maggior parte dei tuoi problemi a casa.

Modifica: una versione precedente aveva alcune discussioni su come questa idea si rapporta al Lemma Pompante.


Non penso che riprodurre la prova di Pumping Lemma sia utile in generale, ma YMMV. Comprendere la prova è comunque buona; è immediatamente connesso con una serie di chiusure e altre interessanti proprietà di automi finiti e linguaggi regolari. Tuttavia, non sono assolutamente d'accordo con l'ultima frase: la teoria degli automi non è affatto noiosa e certamente non è la parte più noiosa delle lezioni di teoria.
Raffaello

@Louis Nella tua risposta come ti è venuta questa affermazione we see that a2p is in the language and b2p is not, so this language can't be regular.negli ultimi. Per favore, puoi fare un esempio
Himanshu,

@Himanshu e b entrambi vi portano allo stesso stato q 1 . Quindi, qualunque cosa tu legga dopo ( 2 p qui), ti porterà allo stesso stato q 2 , qualunque cosa tu abbia iniziato - a o b . abq12pq2ab
Al.G.

7

Seguendo la risposta qui , descriverò un metodo per dimostrare la non regolarità basato sulla complessità di Kolmogorv.

Questo approccio è discusso in "Un nuovo approccio alla teoria del linguaggio formale di Kolmogorov Complexity" , di Ming Li e Paul MB Vitanyi (vedere la sezione 3.1).

Sia denota la complessità di Kolmogorov di una stringa x , ovvero la lunghezza della codifica più breve di una macchina di Turing M , tale che M ( ϵ ) = x (qualsiasi delle solite definizioni lo farà). Si può quindi usare il seguente lemma per dimostrare la non regolarità:K(x)xMM(ϵ)=x

KC-Regolarità : Sia un linguaggio regolare, quindi esiste una costante c che dipende solo da L , tale che per tutte le x Σ , Se y è la stringa n t h (relativa all'ordinamento lessicografico ) in L x = { y Σ | x y L } , quindi K ( y ) O ( log n )LΣcLxΣynthLx={yΣ|xyL} .K(y)O(logn)+c

Si può capire (e provare) il lemma sopra come segue, per ogni , per descrivere la stringa n t h in L x si deve specificare:xΣnthLx

  • L'automa che accetta L
  • Lo stato nell'automa dopo l'elaborazione del prefisso x
  • L'indice n

Dal momento che abbiamo solo bisogno di ricordare lo stato dopo l'elaborazione , e non x sé, possiamo nascondere questo fattore nella costante a seconda L . L'indice n richiede log n bit per descrivere e otteniamo il risultato sopra (per completezza, è necessario aggiungere le istruzioni specifiche richieste per generare y , ma questo aggiunge solo un fattore costante alla descrizione finale).xxLnlogny

Questo lemma mostra come legare la complessità di Kolmogorov di tutte le stringhe che sono membri di per un linguaggio regolare L e x Σ . Per dimostrare la non regolarità, si può supporre che L sia regolare e dimostrare che i limiti sono troppo restrittivi (ad esempio, la complessità di Kolmogrov limitata per un insieme infinito di stringhe).LxLxΣL

La risposta collegata sopra contiene un esempio di come usare questo lemma per mostrare non è regolare, molti altri esempi sono riportati nel documento. Per completezza, mostriamo qui come dimostrare L = { 0 n 1 n | n 0 } non è regolare.L={1p|p is prime}L={0n1n|n0}

Dato un , indichiamo con y x i il i ' t h parola in L x . Si noti che y 0 i 1 = 1 i . Usando il suddetto lemma, concentrandosi su prefissi x della forma x = 0 i e fissaggio n = 1 , otteniamo i 0 : K ( y 0 i 1x{0,1}yixithLxy10i=1ixx=0in=1 . Poiché y 0 i 1 = 1 i , ciò significa che possiamo vincolare la complessità di Kolmogorov di tutte le stringhe della forma 1 i con una costante, che è ovviamente falsa. Vale la pena ricordare che avremmo potuto esaminare una singola x , ad esempio x = 0 n per n abbastanza grandeche soddisfa K ( 0 n ) log n (iniziamo con un prefisso di elevata complessità). Poiché y x 1 = 1 n , otteniamoi0:K(y10i)cy10i=1i1ixx=0nnK(0n)logny1x=1n , contraddizione (supponiamo n > 2 c ).K(1n)<cn>2c


7

Nel caso di lingue unarie (lingue sopra un alfabeto di dimensione 1), esiste un semplice criterio. Risolviamo un alfabeto e, per A N , definiamo L ( A ) = { σ n : n A } .{σ}AN

L(A)={σn:nA}.

Teorema. Lasciate . Sono equivalenti:AN

  1. è regolare.L(A)

  2. è privo di contesto.L(A)

  3. Esistono tale che per ogni n n 0 , si sostiene che n A se e solo se n + m A . (Diciamo che alla fine A è periodico .)n0,m1nn0nAn+mAA

  4. Lasciate . Quindi 0. a 0 a 1 a 2 è razionale.ai=1iA0.a0a1a2

  5. La funzione generatrice è una funzione razionale.iAxi

Il teorema può essere dimostrato in molti modi, ad esempio usando il lemma di pompaggio, la teoria di Myhill-Nerode, il teorema di Parikh, la struttura dei DFA su linguaggi unari (sembrano un " ", come nell'algoritmo ρ di Pollard ), e così via . Ecco un utile corollario.ρρ

Corollario. Sia e supponiamo che L ( A ) sia regolare.ANL(A)

  1. Il limite esiste. (Questa è ladensità asintoticadiA.)ρ=limn|A{1,,n}|nA

  2. Se allora A è finito.ρ=0A

  3. Se allora A è cofinita (cioè ¯ A è finita).ρ=1AA¯

Ad esempio, la lingua non è regolare, poiché l'insieme ha una densità asintotica evanescente, ma è infinita.L({2n:n0})


4

La classe delle lingue regolari è chiusa sotto varie operazioni di chiusura, come l'unione, l'intersezione, il complemento, l'omomorfismo, la sostituzione regolare, l'omomorfismo inverso e altro. Questo può essere usato per dimostrare che una determinata lingua non è regolare riducendo a una lingua che è già nota per essere non regolare.

A titolo di esempio molto semplice, supponiamo di sapere che la lingua {anbn:n0} non è regolare. Poi possiamo dimostrare che la lingua {w{a,b}:#a(w)=#b(w)} (il linguaggio di tutte le parole con altrettanto molti a s e b s) non è regolare come segue:

Supponiamo che L={w{a,b}:#a(w)=#b(w)} siano regolari. Quindi anche Lab sarebbe regolare. Ma Lab={anbn:n0} , che è noto per non essere regolare.

Ecco un esempio più complicato. Mostriamo che la lingua L={(0+1)n2(0+1)n:n0} non è regolare.

Sia h la mappatura dell'omomorfismo data da h(0)=0 , h(1)=1 , h(2)=ϵ . Se L fosse regolare, allora lo sarebbe anche la seguente lingua: h(L021)={0n1n:n0} . Tuttavia, sappiamo che quest'ultimo non è regolare.

Infine, ecco un esempio usando l'omomorfismo inverso. Mostriamo che la lingua L={0n10n:n0} non è regolare.

Sia k l'omomorfismo dato da k(0)=0 , k(1)=0 , k(2)=1 . Se L fosse regolare allora lo sarebbe anche k1(L) , ma questa è solo la lingua L dell'esempio precedente.


3

Usa la teoria di Myhill – Nerode.

Lascia che L sia una lingua. Diciamo che due parole x,y sono inequivalenti modulo L (o: rispetto a L ) se esiste una parola z tale che esattamente uno di xz,yz è in L . In qualsiasi DFA per L , δ(q0,x)δ(q0,y) (esercizio). Ciò implica il seguente criterio:

Lascia che L sia una lingua. Supponiamo che esista un insieme infinito di parole non equivalenti a coppie (ovvero un insieme infinito S tale che due x,yS non uguali , y S siano inequivocabili modulo L ). Quindi L non è regolare.

Ecco un semplice esempio di applicazione di questo criterio:

La lingua L={anbn:n0} non è regolare.

Prova. Sia S={an:n0} . Si rivendica che ogni due parole differenti in S sono inequivalenti modulo L . Effettivamente, lascia ai,ajS , dove ij . Poi aibiL , ma aibjL .

Una caratteristica importante di questo metodo è che è garantito il successo: se L non è regolare, allora esiste un insieme infinito di parole non equivalenti a coppie. Questa è una conseguenza del teorema di Myhill – Nerode . In breve, l'equivalenza modulo L (la negazione dell'ineguaglianza modulo L definito sopra) è una relazione di equivalenza, e una lingua L è regolare se il numero della classe di equivalenza di equivalenza modulo L è finito. Se L non è regolare, togliere una parola da ciascuna classe di equivalenza costituirebbe un insieme infinito di parole non equivalenti.


1

LxyxyL

Tutto quello che devi fare è mostrare che il numero di tali set non è finito.

L=anbn:n0x=anbn1yxyLy=bn1nL

xx{y:xyL}


Non è solo Myhill-Nerode?
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.