λ Teoria del calcolo

Pumping lemma per linguaggi regolari: come usarlo davvero

Il pumping lemma per i linguaggi regolari spiegato con l'intuizione dei cicli, lo schema di dimostrazione per assurdo, esempi svolti ed errori tipici.

Dimostrare che un linguaggio è regolare è spesso facile: basta esibire un automa o un'espressione regolare. Dimostrare che non lo è richiede invece un argomento generale, che valga contro qualunque automa possibile. Il pumping lemma è lo strumento classico per farlo. È anche uno degli argomenti in cui gli studenti sbagliano di più, quasi sempre per un errore di logica sui quantificatori più che di matematica.

L'intuizione: un automa finito deve ripetere uno stato

Sia M un DFA con p stati. Se M legge una stringa di lunghezza almeno p, attraversa almeno p + 1 stati (contando quello iniziale). Per il principio dei cassetti, almeno uno stato compare due volte. Il tratto di input letto tra le due visite forma un ciclo: l'automa parte da uno stato e ci ritorna.

Ma un ciclo si può percorrere zero volte, una volta o cento volte, e l'automa finisce comunque nello stesso stato alla fine della stringa. Quindi se la stringa originale era accettata, lo sono anche tutte le versioni «pompate».

L'enunciato

Se L è regolare, esiste un intero p ≥ 1 (la lunghezza di pumping) tale che ogni stringa s ∈ L con |s| ≥ p si può scrivere come s = xyz con:

  1. |y| ≥ 1 (il ciclo non è vuoto);
  2. |xy| ≤ p (il ciclo compare entro i primi p simboli);
  3. xyⁱz ∈ L per ogni i ≥ 0.

La seconda condizione deriva dal fatto che la prima ripetizione di stato avviene necessariamente entro i primi p simboli letti. È la condizione più utile nelle dimostrazioni, perché vincola la posizione di y.

La struttura logica

L'enunciato ha la forma: esiste p, per ogni s, esiste una scomposizione, per ogni i. Per dimostrare che L non è regolare si nega tutto, e i quantificatori si scambiano:

per ogni p, esiste s ∈ L con |s| ≥ p tale che, per ogni scomposizione s = xyz che rispetti le condizioni 1 e 2, esiste un i con xyⁱz ∉ L.

Conviene pensarlo come un gioco a due:

  1. l'avversario sceglie p;
  2. tu scegli la stringa s, che può dipendere da p;
  3. l'avversario sceglie la scomposizione xyz, rispettando |y| ≥ 1 e |xy| ≤ p;
  4. tu scegli i e mostri che xyⁱz esce dal linguaggio.

Se hai una strategia vincente qualunque cosa faccia l'avversario, il linguaggio non è regolare.

Esempio 1: aⁿbⁿ

Sia L = {aⁿbⁿ : n ≥ 0}. Dato p, scegliamo s = aᵖbᵖ. Qualunque scomposizione con |xy| ≤ p ha x e y fatti solo di a, perché i primi p simboli sono tutte a. Quindi y = aᵏ con k ≥ 1. Pompando con i = 2 si ottiene aᵖ⁺ᵏbᵖ, che ha più a che b e non appartiene a L. Il linguaggio non è regolare.

Notate come la scelta di s abbia fatto tutto il lavoro: mettendo le a all'inizio e sfruttando la condizione 2, abbiamo eliminato ogni possibilità di scelta per l'avversario.

Esempio 2: stringhe di lunghezza quadrata

Sia L = {aⁿ : n è un quadrato perfetto}. Dato p, scegliamo s = a^(p²). L'avversario sceglie y = aᵏ con 1 ≤ k ≤ p. Con i = 2 si ottiene una stringa di lunghezza p² + k. Ma p² < p² + k ≤ p² + p < (p + 1)², quindi la lunghezza cade strettamente tra due quadrati consecutivi e non è un quadrato. La stringa esce da L.

Esempio 3: palindromi

Sia L l'insieme dei palindromi su {a, b}. Scegliamo s = aᵖbaᵖ. Di nuovo y è composto solo da a della prima metà. Con i = 0 si toglie qualche a a sinistra e la stringa diventa aᵖ⁻ᵏbaᵖ, che non è più palindroma.

Errori tipici

  • Scegliere un p specifico. Non si può dire «prendiamo p = 5»: p è scelto dall'avversario e va trattato come generico.
  • Scegliere la scomposizione. Non si decide dove sta y: bisogna considerare tutte le scomposizioni ammesse.
  • Stringa troppo corta o fuori dal linguaggio. s deve appartenere a L e avere lunghezza almeno p.
  • Usare il lemma per dimostrare la regolarità. Il lemma è solo una condizione necessaria. Esistono linguaggi non regolari che soddisfano comunque le condizioni di pumping; per quelli serve uno strumento più forte, come il teorema di Myhill-Nerode.

Alternative e scorciatoie

Spesso conviene sfruttare le proprietà di chiusura. Se L fosse regolare e R è regolare, anche L ∩ R sarebbe regolare. Per esempio, il linguaggio delle stringhe con lo stesso numero di a e di b, intersecato con a*b*, dà esattamente aⁿbⁿ; poiché quest'ultimo non è regolare, non lo è nemmeno il linguaggio di partenza. Una riga invece di una dimostrazione intera.

In sintesi

  • Un automa con p stati, leggendo almeno p simboli, ripete uno stato e forma un ciclo che si può pompare.
  • Il lemma garantisce una scomposizione xyz con |y| ≥ 1, |xy| ≤ p e xyⁱz nel linguaggio per ogni i.
  • Per dimostrare la non regolarità si gioca contro un avversario che sceglie p e la scomposizione.
  • La scelta furba della stringa, sfruttando |xy| ≤ p, è quasi sempre la chiave.
  • Il lemma è solo necessario: per alcuni casi servono Myhill-Nerode o le proprietà di chiusura.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche