λ Teoria del calcolo

Pumping lemma libero dal contesto e proprietà di chiusura

Come dimostrare che un linguaggio non è libero dal contesto: il pumping lemma con due parti da pompare, esempi svolti e le proprietà di chiusura utili.

I linguaggi liberi dal contesto sono molto più espressivi dei regolari, ma hanno anch'essi dei limiti. Per dimostrare che un linguaggio non è libero dal contesto esiste una versione del pumping lemma adattata alle grammatiche. L'idea è simile a quella per gli automi finiti, ma la ripetizione riguarda una variabile in un albero sintattico, e le parti da pompare diventano due, che crescono insieme.

L'intuizione: una variabile si ripete lungo un cammino

Prendiamo una grammatica in forma normale di Chomsky, in cui ogni regola è A → BC oppure A → a. Gli alberi sintattici sono binari. Un albero binario di altezza h ha al massimo 2ʰ foglie, quindi una stringa molto lunga richiede un albero alto.

Se la grammatica ha k variabili e la stringa è abbastanza lunga, esiste un cammino dalla radice a una foglia con più di k variabili. Per il principio dei cassetti, una variabile R compare due volte su quel cammino. Il sottoalbero radicato nella R più in alto contiene quello radicato nella R più in basso.

Questa situazione permette due operazioni:

  • sostituire il sottoalbero inferiore con una copia di quello superiore, ottenendo una stringa più lunga;
  • sostituire il sottoalbero superiore con quello inferiore, ottenendo una stringa più corta.

Ciò che si aggiunge o si toglie sono due pezzi, uno a sinistra e uno a destra della parte centrale.

L'enunciato

Se L è libero dal contesto, esiste p ≥ 1 tale che ogni stringa s ∈ L con |s| ≥ p si può scrivere come s = uvxyz con:

  1. |vy| ≥ 1 (almeno uno dei due pezzi pompati non è vuoto);
  2. |vxy| ≤ p (la finestra pompata è corta);
  3. uvⁱxyⁱz ∈ L per ogni i ≥ 0.

Come nel caso regolare, per dimostrare la non appartenenza si gioca contro un avversario: lui sceglie p e la scomposizione, noi scegliamo la stringa e l'esponente i.

Esempio 1: aⁿbⁿcⁿ

Sia L = {aⁿbⁿcⁿ : n ≥ 0}. Dato p, scegliamo s = aᵖbᵖcᵖ.

La condizione |vxy| ≤ p è decisiva: una finestra di lunghezza al massimo p non può toccare sia le a sia le c, perché fra di esse ci sono p lettere b. Quindi v e y contengono al massimo due tipi di lettere fra i tre.

Pompando con i = 2, aumenta il numero di almeno un tipo di lettera, ma non di tutti e tre. I tre conteggi non sono più uguali, e la stringa esce da L. Inoltre, se v o y contengono lettere miste, come «ab», pompando si ottengono lettere fuori ordine. In ogni caso L non è libero dal contesto.

Esempio 2: la stringa ripetuta

Sia L = {ww : w ∈ {a, b}*}. È un caso istruttivo, perché il linguaggio molto simile {wwᴿ} dei palindromi pari è libero dal contesto.

Scegliamo s = aᵖbᵖaᵖbᵖ. Analizziamo dove può stare la finestra vxy, lunga al massimo p:

  • se sta tutta nella prima metà, pompando con i = 0 si accorcia solo la prima metà; la stringa risultante non si può più dividere in due copie identiche;
  • se sta tutta nella seconda metà, il ragionamento è simmetrico;
  • se è a cavallo del centro, contiene solo b della prima metà e a della seconda; con i = 0 si ottiene una stringa della forma aᵖbʲaᵏbᵖ con j o k minori di p, che non è del tipo ww.

In tutti i casi si esce da L.

Le proprietà di chiusura

Spesso è più rapido usare le proprietà di chiusura. I linguaggi liberi dal contesto sono chiusi per:

  • unione: S → S₁ | S₂;
  • concatenazione: S → S₁S₂;
  • stella: S → SS₁ | ε;
  • intersezione con un linguaggio regolare: si simulano in parallelo un automa a pila e un automa finito, che non usa la pila.

Non sono invece chiusi per intersezione e complemento. Il controesempio classico: {aⁿbⁿcᵐ} e {aᵐbⁿcⁿ} sono entrambi liberi dal contesto, ma la loro intersezione è aⁿbⁿcⁿ, che non lo è. Poiché l'intersezione si esprime con unione e complemento, se ci fosse chiusura per complemento ci sarebbe anche per intersezione.

Una dimostrazione per chiusura

Sia L il linguaggio delle stringhe su {a, b, c} con lo stesso numero di a, b e c, in qualsiasi ordine. Se L fosse libero dal contesto, anche L ∩ a*b*c* lo sarebbe, perché a*b*c* è regolare. Ma quell'intersezione è esattamente aⁿbⁿcⁿ. Quindi L non è libero dal contesto. Nessuna scomposizione da analizzare.

Errori frequenti

  • Dimenticare che v e y possono stare in zone diverse della stringa: vanno considerati tutti i posizionamenti della finestra.
  • Non sfruttare |vxy| ≤ p, che è quasi sempre la condizione che rende la dimostrazione possibile.
  • Pensare che superare il pumping lemma dimostri che il linguaggio è libero dal contesto: è una condizione necessaria, non sufficiente. Per casi difficili esistono strumenti più forti, come il lemma di Ogden.

In sintesi

  • In un albero sintattico alto una variabile si ripete, e questo consente di pompare due parti insieme.
  • Il lemma garantisce s = uvxyz con |vy| ≥ 1, |vxy| ≤ p e uvⁱxyⁱz nel linguaggio per ogni i.
  • aⁿbⁿcⁿ e {ww} non sono liberi dal contesto.
  • I linguaggi liberi dal contesto sono chiusi per unione, concatenazione, stella e intersezione con regolari.
  • Non sono chiusi per intersezione e complemento, e questo fornisce dimostrazioni rapide.
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