Automi, Linguaggi e Calcolabilità - Hopcroft, Motwani, Ullman - 3 Ed. Pearson-Addison-Wesley
Automi, Linguaggi e Calcolabilità - Hopcroft, Motwani, Ullman - 3 Ed. Pearson-Addison-Wesley
Automi, Linguaggi e Calcolabilità - Hopcroft, Motwani, Ullman - 3 Ed. Pearson-Addison-Wesley
1
2
2
4
5
6
7
10
11
14
14
15
16
18
19
20
21
24
25
28
30
31
31
33
34
36
38
Sommario
Automi a stati finiti
39
2.1 Una descrizione informale degli automi a stati f i n it i ................................... ....40
2.1.1
Leregolefondamentali ................................................................... ....40
2.1.2
Ilp ro to c o llo ...........................................................................................41
2.1.3 Automi che possono ignorare a z io n i................................................ ....43
2.1.4 Lintero sistema come a u to m a ..............................................................44
2.1.5 Validazione del protocollo mediante lautoma p ro d o tto ................ ....47
2.2 Automi a stati finiti deterministici ................................................................ ....48
2.2.1 Definizione di automa a stati finiti determ inistico..............................48
2.2.2 Elaborazione di stringhe in un D F A ................................................ ....49
2.2.3 Notazioni pi semplici per i DHA ................................................... ... 50
2.2.4 Estensione della funzione di transizione alle s trin g h e ................... ... 52
2.2.5 II linguaggio di un DFA ................................................................... ... 55
2.2.6 E se rc iz i................................................................................................ ... 56
2.3 Automi a stati finiti non determ inistici............................................................. 58
2.3.1 Descrizione informale degli automi a stati finiti non deterministici 59
2.3.2 Definizione di automa a stati finiti non determ inistico................... ... 60
2.3.3 La funzione di transizione e ste sa .......................................................... 62
2.3.4 il linguaggio di un NFA ................................................................... ... 63
2.3.5 Equivalenza di automi a stati finiti deterministici c non determi
nistici
... 64
2.3.6 Un caso sfavorevole di costruzione per sottoinsiem i...................... ... 69
2.3.7 E se rc iz i...................................................... ......................................... ... 70
2.4 Unapplicazione: ricerche testuali ................................................................ ... 73
2.4.1 Ricerca di stringhe in un l e s t o .............................................................73
2.4.2 Automi a stati finiti non deterministici per ricerche testuali . . . . 74
2.4.3 Un DFA per riconoscere un insieme di parole c h i a v e ................... ... 75
2.4.4 E se rc iz i................................................................................................ ...77
2.5 Automi a stati finiti con epsilon-transizioni................................................... ...77
2.5.1 Uso delle e-tran sizio n i...................................................................... ...78
2.5.2 La notazione formale per gli f - N F A ................................................ ...79
2.5.3 E psilon-chiusure................................................................................ ...80
2.5.4 Transizioni estese e linguaggi per gli e-N FA ................................... ...81
2.5.5 Eliminazione di e-transizioni............................................................. ...83
2.5.6 E se rc iz i................................................................................................ ... 86
2.6 R ie p ilo g o ............................................................................................................. 86
2.7 B ibliografia....................................................................................................... 87
Sommario
vii
viii
Sommario
4.3
4.4
4.5
4.6
5
Sommario
ix
Automi a pila
233
6.1 D e fin iz io n e d ia u to m a a p ila ............................................................................ 233
6.1.1 Introduzione in fo rm a le .........................................................................234
6 .1.2
Definizione formale di automa a p ila ..................................................236
6.1.3 U n a n o ta z io n e g ra fic a p e riP D A ........................................................ 238
6 .1.4
Descrizioni istantanee di un PDA ..................................................... 239
6.1.5 E se rc iz i................................................................................................... 242
6.2 I linguaggi di un P D A ......................................................................................... 243
6.2.1
A cc e tta z io n e p e rsta to fin a le ............................................................... 244
6.2.2 Accettazione per stack v u o to ............................................................... 245
6.2.3 Da stack vuoto a stato f i n a l e ............................................................... 246
6.2.4 Da stato finale a stack v u o t o ............................................................... 249
6.2.5 E s e rc iz i................................................................................................... 251
6.3 Equivalenza di PDA e C F G ............................................................................... 253
6.3.1
D a llc g ra m m a tic h e a g lia u to m ia p ila .............................................. 253
6.3.2 Dai PDA alle gram m atiche.................................................................. 257
6.3.3 E s e rc iz i................................................................................................... 261
6.4 Automi a pila deterministici ............................................................................ 263
6.4.1 Definizione di PDA determ inistico..................................................... 263
6.4.2 Linguaggi regolari e PDA determ inistici........................................... 264
6.4.3 DPDA e linguaggi liberi dal contesto .............................................. 265
6.4.4 DPDA e grammatiche ambigue ........................................................ 266
6.4.5 E s e rc iz i................................................................................................... 267
6.5 R ie p ilo g o ............................................................................................................. 268
6.6 B ib lio g ra fia ..........................................................................................................269
Sommario
7.2
7.3
7.4
7.5
7.6
Som m ano
xi
Indccidibilit
389
9.1 U nlinguaggiononricorsivam enteenum erabilc...........................................390
9.1.1 E num erazionedellestringhcbinarie................................................. 391
9 .1.2 Codici per Ie macchine di T uring........................................................391
9.1.3 Illinguaggiodidiagonalizzazione.................................................... 393
9.1.4 Dimostrazione che
non ricorsivamente cn u m erab ile............. 393
9.1.5 E s e rc iz i.................................................................................................. 394
9.2 Un problema indecidibile ma ricorsivamente enum erabile.......................... 395
9.2.1 L in g u ag g irico rsiv i.............................................................................. 396
9.2.2 Complementi di linguaggi ricorsivi c RE ....................................... 396
9.2.3 II linguaggio universale........................................................................400
9.2.4 Indecidibilita del linguaggio u n iv e r s a le .......................................... 402
9.2.5 E s e rc iz i.................................................................................................. 403
9.3 Problemi indecidibili relativi alle macchine di T u r i n g .................................405
9.3.1
R id u z io n i...............................................................................................406
9.3.2 Macchine di Turing che accettano il linguaggio v u o to ....................407
9.3.3 II teorema di Rice e le propriet dei linguaggi R E .......................... 411
9.3.4 P roblem isu llesp ecifichedim acchincdiT uring............................. 413
xii
Sommario
9.3.5 E s e rc iz i..................................................................................................414
9.4 Tl problema di corrispondenza di Post ...........................................................415
9.4 .1 Definizione del problema di corrispondenza di P o s t .......................416
9.4.2 11 PCP m odificato................................................................................. 419
9.4.3 Dimostrazione di indecidibilit di PCP: fin a le .................................421
9.4.4 E s e rc iz i..................................................................................................427
9.5 Altri problemi indecidibili .............................................................................. 428
9.5.1 Problemi relativi a p ro g ra m m i...........................................................428
9.5.2 Indecidibilit dellambiguit delle C F G .......................................... 428
9.5.3 II complemento di un linguaggio associalo a una li s ta ....................431
9.5.4 E s e rc iz i.................... . .......................................................................... 433
9.6 R ie p ilo g o ............................................................................................................434
9.7 B ib lio g rafia........................................................................................................ 435
10 Problem i intrattabili
437
10.1 Le classi V ed J \ f V ........................................................................................... 438
10.1.1 Problemi risolvibili in tempo p o lin o m ia le ....................................... 438
10 . 1.2 Un esempio: lalgoritmo di K ru s k a l................ ................................439
10.1.3 Tempopolinomialenondeterministico .......................................... 443
10.1.4 Un esemplare di N V : il problema del commesso viaggiatore . . . 444
10.1.5 Riduzioni polinomiali ........................................................................445
10.1.6 Problemi N P -c o m p le ti........................................................................446
10.1.7 E s e rc iz i..................................................................................................448
10.2 Un problema N P -co m p lcto .............................................................................. 451
10.2.1 11 problema della soddisfacibilit....................................................... 451
10.2.2 R ap p re sen tazio n cd iistan zed iS A T ................................................. 452
10.2.3 NP-completezza del problema S A T .................................................453
10.2.4 E s e rc iz i..................................................................................................460
10.3 Un problema di soddisfacibilit v in c o la to .................................................... 461
10.3.1 Form enorm alidiespressionibooleane .......................................... 461
10.3.2 Conversione in CNF di espressioni booleane ................................ 462
10.3.3 NP-complctczza di CSAT ................................................................. 465
10.3.4 NP-completezza di 3 S A T .................................................................... 470
10.3.5 E se rc iz i..................................................................................................472
10.4 Altri problemi N P-com pleti.............................................................................. 472
10.4.1 Descrivere problemi N P -c o m p le ti.................................................... 473
10.4.2 Ilproblem adegliinsiem iindipendcnli..............................................474
10.4.3 Ilp ro b le m a d e lla c o p e rtu ra p e rn o d i.................................................477
10.4.4 Ilp ro b lem ad elcircuitoham iltonianoorientato............................. 479
10.4.5 Circuiti hamiltoniani non orientati c TSP ....................................... 484
Sommario
xiii
541
Prefazione
Nella prefazione alledizione del 1979 di questo libro, Hopcroft e Ullman si mostravano
sorpresi di fronte al fiorire degli studi sugli automi rispetto alla situazione del 1969, anno
in cui veniva pubblicato il loro primo volume. In effetti il libro del 1979 trattava numerosi
argomenti nuovi ed era lungo circa il doppio. Paragonata a quella del 1979, si scopre che
la presente edizione, come le automobili degli anni '70. pi grande fuori e pi piccola
dentro . Pu sembrare uninvoluzione, ma questa nuova veste ci soddisfa per diverse
ragioni.
Innanzitutto nel 1979 la teoria degli automi e dei linguaggi era ancora unarea vitale
di ricerca, e quel libro aveva anche lo scopo di incoraggiare gli studenti tagliati per la
matematica a dare un contributo attivo. Rispetto alle applicazioni, la ricerca pura nella
teoria degli automi attualmente limitata; non c' pi motivo, quindi, di conservare lo
stile conciso e pi matematico del libro del 1979.
In secondo luogo il ruolo della teoria degli automi e dei linguaggi negli ultimi ven
ta n n i cambiato. Nel 1979 lo studio degli automi era riservato perlopi a studenti degli
ultimi anni di un corso di laurea che avevano intrapreso un indirizzo specifico; essi forma
vano perci il pubblico di riferimento, soprattutto per gli ultimi capitoli. Oggi questo tipo
di studi parte integrante del curriculum di base di un corso di laurea. Di conseguenza
la scelta dei contenuti deve presupporre che lo studente abbia un bagaglio di conoscenze
inferiore, e fornire pi nozioni fondamentali e maggiori dettagli nelle dimostrazioni.
Un terzo cambiamento riguarda il contesto: negli ultimi ventanni linformatica ha
raggiunto un livello quasi inimmaginabile. Nel 1979 era spesso difficile trovare argomenti
in grado di superare la successiva ondata di progresso tecnologico e sufficienti a riempire
un piano di studi; oggi lo spazio limitato del piano di studi di un corso di laurea c conteso
da un numero elevato di discipline.
Un quarto motivo che la scelta di studiare informatica appare sempre pi legata a
obiettivi concreti e fra gli studenti si diffuso un rigido pragmatismo. Siamo ancora con
vinti che certi aspetti della teoria degli automi siano strumenti essenziali per diverse nuove
discipline e che gli esercizi di natura teorica e creativa che fanno parte di un tipico corso
sugli automi restino utili, per quanto gli studenti preferiscano apprendere solo Ie tecni-
Xvi
Prefazione
Prerequisiti
Per sfruttare al meglio il libro lo studente dovrebbe aver seguito un corso di matematica
discreta e aver acquisito nozioni sui grafi, gli alberi, la logica formale e le tecniche di
dimostrazione. Assumiamo inoltre che abbia seguito un corso di programmazione e che
conosca le strutture dati pi comuni, la ricorsione, e il ruolo dei componenti pi importanti
di un sistema di elaborazione, tra cui i compilatori. Di solito queste nozioni di base si
acquisiscono nei primi due anni di un corso universitario di informatica.
Esercizi
Il libro contiene numerosi esercizi, distribuiti in quasi tutti i paragrafi. Gli esercizi, o parti
di esercizi, pi difficili sono indicati da un punto esclamativo o, per i pi ardui, da un
doppio punto esclamativo.
Altri esercizi sono segnalati da un asterisco: le loro soluzioni sono disponibili nella
pagina Web del libro e possono servire per valutare il proprio livello di preparazione. In
alcuni casi un esercizio B chiede di modificare o adattare la soluzione di un altro esercizio
.4. Se alcune parti di A ammettono soluzione, ci si pu aspettare che lo stesso valga anche
per le corrispondenti parti di t.
Prefazione
xvii
Supporto in rete
La home page del libro
http://www-db.Stanford.edu/~ullman/ialc.html
Vi si trovano le soluzioni degli esercizi segnalati da un asterisco, gli errala corrige c
altro materiale utile. A mano a mano chc le lezioni procedono intendiamo pubblicare le
dispense del nostro corso, inclusi esercizi e testi desame.
Ringraziamenti
La stesura di parte del primo capitolo stata influenzata da una dispensa di Craig Silverstein su come scrivere le dimostrazioni. Commenti c segnalazioni di errori sulle bozze
del libro sono giunti da Zoe Abrams. George Candca. Haowen Chen, Byong-Gun Chun.
Jeffrey Shallit, BretTayIor, Jason Townsend ed Erik Uzureau. Riconosciamo volentieri il
loro contributo. Gli errori chc restano sono, ovviamente, da imputare a noi.
J. E. H.
R. M.
J. D. U.
Ithaca N Y e Stanford CA
Settembre 2000
Capitolo I
Capitolo I
1.1
Ci sono svariate ragioni per cui lo studio degli automi e della complessit parte essen
ziale dellinformatica. Questo paragrafo presenta al lettore la motivazione principale e
delinea gli argomenti pi rilevanti trattati in questo libro.
1.1.1
Gli automi a stati finiti sono un utile modello di molte categorie importanti di hardware
c software. A partire dal Capitolo 2 esemplificheremo l'impiego dei concetti. Per ora ci
limitiamo a elencare alcuni dei casi pi significativi.
1. Software per progettare circuiti digitali e verificarne il comportamento.
2. Lanalizzatore lessicale di un compilatore, ossia il componente che scompone lin
put (i dati in ingresso) in unit logiche, come gli identificatori, le parole chiave e la
punteggiatura.
3. Software per esaminare vaste collezioni di testi, ad esempio pagine Web, per trovare
occorrenze di parole o di frasi.
4. Software per verificare sistemi di qualsiasi tipo, che abbiano un numero finito di
stati discreti, come i protocolli di comunicazione oppure i protocolli per lo scambio
sicuro di informazioni.
Forniremo una definizione precisa di automi di vario tipo tra breve. Intanto cominciamo
questa introduzione informale descrivendo che cos' e chc cosa fa un automa a stati finiti.
Ci sono molti sistemi o componenti, come quelli elencati sopra, di cui si pu dire che in
ogni istante si trovano in uno stato preso da un insieme finito. Uno stato ha lo scopo
di ricordare una parte pertinente della storia del sistema. Dal momento che c solo un
numero finito di stati generalmente non si pu ricordare lintera storia, perci il sistema
devessere progettato attentamente affinch ricordi ci che importante e dimentichi ci
che non lo . Tl vantaggio di avere solo un numero finito di stati chc il sistema pu
essere implementato con un insieme fissato di risorse. Per esempio c possibile implemen
tarlo come un circuito, oppure come un semplice programma che pu prendere decisioni
esaminando solo un numero limitato di dati o usando la posizione nel codice stesso per
prendere la decisione.
Esem pio 1.1 Un interruttore c Torse il pi semplice automa a stati finiti non banale. Un
dispositivo di questo tipo ricorda se nello stato on (acceso) oppure nello stato off (spen
to) e permette allutente di premere (push ) un pulsante il cui effetto diverso a seconda
del suo stato: se linterruttore nello stato spento, allora premere il pulsante lo fa pas
sare nello stato acceso; viceversa, se linterruttore nello stato acceso, allora premere
il medesimo pulsante lo porta nello stato spento.
Push
Start
Capitolo I
considerare lo stato ori, nella Figura 1.1, come lo stato accettante, in quanto il dispositivo
controllato dallinterruttore in quello stato attivo. Per convenzione gli stati accettanti
vengono rappresentati da un doppio cerchio, sebbene nella Figura I. I questa convenzione
non sia stala rispettata.
Esem pio 1.2 Talvolta ci che uno stato ricorda pi complesso di una semplice scelta
acceso/spento. La Figura 1.2 mostra un altro automa a stati finiti chc potrebbe far parte
di un analizzatore lessicale. Il compito di questo automa riconoscere la parola-chiave
t h e n . Lautoma ha quindi bisogno di cinque stati, ognuno dei quali rappresenta una
diversa posizione raggiunta nella parola t h e n . Le posizioni corrispondono ai prefissi
della parola, a partire dalla stringa vuota (vale a dire: finora nessuna parte della parola
stata vista) sino alla parola completa.
1.1.2
Rappresentazioni strutturali
Ci sono due notazioni importanti, diverse dagli automi, ma che hanno un ruolo di primo
piano nello studio di questi e delle loro applicazioni.
I. Le grammatiche sono modelli utili quando si progetta software che elabora dati
con una struttura ricorsiva. Lesempio pi noto il parser, un componente del
compilatore che tratta gli elementi ricorsivi di un tipico linguaggio di programma
zione, come le espressioni aritmetiche, condizionali, ecc. Per esempio una regola
grammaticale come E => E 4 - E dichiara che unespressione pu essere forma
ta prendendo due espressioni qualunque c connettendole con un segno pi: questa
1.1.3
Automi e complessit
Gli automi sono essenziali per lo studio dei limiti della computazione. Come accennato
nell'introduzione al capitolo, ci sono due punti importanti.
1. Che cosa pu fare un computer in assoluto? Tale studio detto decidibilit'\ e i
problemi risolvibili da un computer sono detti decidibili. Il tema affrontato nel
Capitolo 9.
2. Che cosa pu fare un computer in maniera efficiente? Tale studio detto intratta
bilit", e i problemi risolvibili da un computer in un tempo limitato da una funzione
lentamente crescente della dimensione dell'input sono detti trattabili. Spesso si
considerano le funzioni polinomiali come lentamente crescenti, mentre si ritie
ne che le funzioni che crescono pi rapidamente delle polinomiali crescano troppo
velocemente. Largomento viene affrontato nel Capitolo 10.
Capitolo I
1.2
Se avete studiato geometria piana alle superiori prima degli anni 90, molto probabilmen
te avete dovuto fare accurate dimostrazioni deduttive, in cui si dimostra la verit di un
enunciato per mezzo di una dettagliata sequenza di passi e di ragionamenti. Mentre la
geometria ha un suo lato pratico (per esempio, se si deve comprare la giusta quantit di
moquette per una stanza, bisogna conoscere la formula per calcolare l'area del rettan
golo), lo studio dei metodi di dimostrazione formale era un motivo almeno altrettanto
importante per trattare questo ramo della matematica nelle scuole superiori.
Negli anni 90 diventato prassi negli USA insegnare la dimostrazione come se si
trattasse di una questione di sensazioni personali circa un enunciato. Sebbene sia giusto
percepire la verit di un enunciato da usare, nelle scuole superiori non si padroneggiano
pi importanti tecniche di dimostrazione. Eppure la dimostrazione un elemento che
ogni informatico deve comprendere. Alcuni studiosi di infomatica arrivano a dire che una
dimostrazione formale della correttezza di un programma e la scrittura del programma
stesso dovrebbero andare di pari passo. Dubitiamo che tale procedimento sia produttivo.
D 'altro canto c chi non lascia alcuno spazio alle dimostrazioni nella disciplina della
programmazione, affidandosi spesso allo slogan se non sei sicuro che il tuo programma
sia corretto, eseguilo c vedi.
Noi ci collochiamo tra i due estremi. Sicuramente provare un programma essenzia
le. Tuttavia il controllo limitato, in quanto non p o s s ib ile provare un programma su
ogni input. Inoltre, e questo ancora pi importante, quando il programma comples
so, come nel caso di una ricorsione o di uniterazione complicala, se non si capisce che
cosa succede in prossimit di un ciclo o di una chiamata ricorsiva, difficilmente si potr
scrivere codice corretto. Quando una prova rivela che il programma non corretto, sar
comunque necessario sistemarlo.
Per scrivere un'iterazione o una ricorsione corretta bisogna fondarsi su unipotesi induttiva. E utile valutare, formalmente o informalmente, che lipotesi sia coerente con
literazione o la ricorsione. Questo processo di comprensione dei meccanismi di un pro
gramma corretto coincide in sostanza con il processo di dimostrazione di teoremi per
induzione. Perci, oltre a fornire modelli utili per determinati tipi di software, in un corso
di teoria degli automi si affermato luso di trattare metodi di dimostrazione formale.
Forse pi di altri temi centrali dell'informatica la teoria degli automi si presta a dimo
strazioni naturali c interessanti, sia di tipo deduttivo (una sequenza di passi giustificati)
sia di tipo induttivo (dimostrazioni ricorsive di un enunciato parametrizzato, che usano
lenunciato stesso con valori del parametro "pi piccoli).
V
1.2.1
Dimostrazioni deduttive
Come accennato sopra, una dimostrazione deduttiva consiste in una sequenza di enunciati
la cui verit conduce da un enunciato iniziale, Yipotesi o enunciato dato, a un enunciato
conclusivo. Ogni passo della dimostrazione deve seguire, in virt di qualche principio
logico accettato, dai fatti dati, oppure da uno dei precedenti enunciati nella dimostrazione
deduttiva, oppure da una combinazione di questi.
Le ipotesi possono essere vere o false, di solito a seconda dei valori dei loro parametri.
Spesso le ipotesi consistono di svariati enunciati indipendenti connessi da un AND logico.
In questi casi ogni enunciato viene considerato come unipotesi.
Il teorema chc viene dimostrato quando si va da unipotesi H a una conclusione C
lenunciato sc H allora C . Diciamo che C dedotto da H . Un teorema esemplificativo
della forma se H allora C illustrer questi punti.
Teorem a 1.3 Se x > 4. allora 2:r > x 2.
Non difficile convincersi informalmente che il Teorema 1.3 vero, sebbene una
dimostrazione formale richieda l'induzione (si veda pi avanti lEsempio 1.17). In primo
luogo si noti che l'ipotesi H x > 4. Questipotesi ha un parametro, x, e dunque non
n vera n falsa. La sua verit dipende piuttosto dal valore del parametro x: per esempio
H vera per = 6 e falsa per x = 2.
Analogamente la conclusione C 2X > a 2. Anche questenunciato usa il parametro
X ed vero per certi valori di x e non per altri. Per esempio C falsa per x = 3, dato
che 23 = 8 , che non tanto grande quanto 32 = 9. D 'altra parte C vera per x 4,
in quanto 2 1 = 4 2 = 16. Per x 5 lenunciato altrettanto vero, poich 2 5 = 32
maggiore o uguale a 5 2 = 25.
probabilmente palese largomentazione intuitiva per cui la conclusione 2X > x 2 sar
vera ogni volta che x > 4. Abbiamo gi visto chc vero per x = 4. Quando x diventa
maggiore di 4, il membro sinistro 2X raddoppia ogni volta chc x cresce di 1. Tuttavia il
membro destro, x 2, cresce secondo il rapporto
Capitolo I
Il Teorema 1.3 pu essere utilizzato come ausilio per dedurre altri teoremi. Nel prossi
mo esempio si passa a considerare una dimostrazione deduttiva completa di un semplice
teorema che impiega il Teorema 1.3.
Teorem a 1.4 Se x la somma dei quadrati di quattro interi positivi, allora 2:r > x 2.
DIMOSTRAZIONE Lidea intuitiva della dimostrazione che se l'ipotesi vera per x, cio
X la somma dei quadrati di quattro numeri interi positivi, allora x devessere almeno
uguale a 4. Perci lipotesi del Teorema 1.3 valida e, poich siamo certi della validit
di tale teorema, possiamo affermare che la sua conclusione vera anche per x. Si pu
esprimere il ragionamento come una sequenza di passi. Ogni passo lipotesi del teorema
da dimostrare, una parte di quellipotesi, oppure un enunciato che consegue da uno o pi
enunciati precedenti.
Con consegue si intende che, se l'ipotesi di un determinato teorema un enunciato
precedente, la conclusione di quel teorema vera e pu essere scritta come un enunciato
della nuova dimostrazione. Questa regola logica detta spesso modusponens. Vale a dire,
se sappiamo che TI vera e sappiamo che se TI allora C" vera, possiamo concludere
che C vera. Inoltre ammettiamo che altri passi logici vengano usati nel formare un
enunciato che segue da uno o pi enunciati precedenti. Per esempio se .4 e D sono due
enunciati precedenti, allora possiamo dedurre e scrivere lenunciato ttA e B."
La Figura 1.3 mostra la sequenza degli enunciati di cui abbiamo bisogno per dimo
strare il Teorema 1.4. Sebbene generalmente non dimostreremo teoremi in forma cos
schematizzata, utile pensare le dimostrazioni come esplicite liste di enunciati, ciascuno
con una precisa giustificazione. Nel passo (1) abbiamo ripetuto uno degli enunciali daii
del teorema: che x la somma dei quadrati di quattro interi. Nelle dimostrazioni spesso
comodo dare un nome a quantit che compaiono senza nome nellipotesi. In questo caso
facciamo cos, e diamo ai quattro numeri interi i nomi a, 6, c e d.
X o2 + b2 + c2 + d2
a > I :b > I; c > I; d > 1
a~ > 1 ; Ir > 1 ; c2 > 1 ; d2 > 1
x > 4
ipotesi
ipotesi
( 2 ) c propriet dellaritmetica
(1), (3), c propriet dellaritmetica
(4) c Teorema 1.3
IV
N/
3.
4.
5.
Giustificazione
bO
1.
2.
Enunciato
IO Capitolo I
Al passo finale (5) usiamo lenunciato (4), che lipotesi del Teorema 1.3. Il teorema
stesso la giustificazione per poter scrivere la sua conclusione, dato chc la sua ipotesi
un enunciato precedente. Poich' lenunciato (5), chc la conclusione del Teorema 1.3,
anche la conclusione del Teorema 1.4, questultimo risulta dimostrato. Ossia siamo partiti
dallipotesi di un teorema e siamo riusciti a dedurne la conclusione.
1.2.2
Riduzione a definizioni
Nei due teoremi precedenti le ipotesi usano termini che supponiamo familiari, per esem
pio interi, addizione e moltiplicazione. In altri teoremi, compresi molti che sono tratti
dalla teoria degli automi, i termini usati nellenunciato possono avere implicazioni meno
evidenti. Un modo di procedere utile in molte dimostrazioni si pu esprimere come segue.
Se non siete sicuri di come iniziare una dimostrazione, convertite tutti i termini
dellipotesi nelle rispettive definizioni.
Vediamo un esempio di teorema semplice da dimostrare, una volta che i suoi enunciati
siano stati espressi in termini elementari. Esso fa uso delle due definizioni seguenti.
1. Un insieme S finito se esiste un intero n tale che S abbia esattamente n elementi.
Scriviamo ||S|| = n, dove ||S || denota il numero di elementi in un insieme S . Se
linsieme S non finito, diciamo chc infinito. Intuitivamente un insieme infinito
un insieme il cui numero di elementi maggiore di qualsiasi numero intero.
2. Se S c T sono ambedue sottoinsiemi di un determinato insieme U, allora T il
complemento di S (rispetto a U) se .S' U T = U e S D T = 0 . Cio ogni ele
mento di U esattamente in uno dei due insiemi S e T. In altre parole T consta
esattamente degli elementi di U che non sono in S.
Teorem a 1.5 Sia S un sottoinsieme finito di un insieme infinito U . Sia T il complemento
di S in U. Allora T infinito.
DIMOSTRAZIONE Intuitivamente questo teorema dice che se si ha una quantit infinita di
qualcosa (U), e se ne porta via una quantit finita (5 ), allora resta comunque una quantit
infinita. Cominciamo riformulando i fatti del teorema, come si vede nella Figura 1.4.
Siamo ancora bloccati, quindi dobbiamo usare una tecnica di dimostrazione comune,
detta dimostrazione per assurdo. In questo metodo di dimostrazione, che verr discusso
ulteriormente nel Paragrafo 1.3.3, supponiamo che la conclusione sia falsa. Ricorriamo
a questa supposizione, insieme a parti dellipotesi, per provare il contrario di uno degli
enunciati dati dellipotesi. Abbiamo cos mostrato che impossibile che tutte le parti
dellipotesi siano vere e che la conclusione sia falsa allo stesso tempo. Lunica possibilit
chc rimane che la conclusione sia vera quando lipotesi vera. In altre parole il teorema
vero.
Nuovo enunciato
S finito
Esiste un intero n
tale che ||S || = n
Per nessun intero p
vale HLrII = p
S liT = U e S n T = 0
U infinito
T il complemento di S
11
Nel caso del Teorema 1.5, la negazione della conclusione T finito'. Supponiamo che
T sia finito, insieme allenunciato dellipotesi chc pone S come finito: cio || 6'|| = n per
un intero n. Analogamente possiamo riformulare lassunto che T finito come ||T| = ni
per un intero m.
Uno degli enunciati dati ci dice ora chc S U T = U e S n T = 0, cio che gli
elementi di U sono esattamente gli elementi di S e T . Dunque ci devono essere n + m
elementi in U. Dato che n 4- m un intero c abbiamo dimostrato che \\U\\ = n 4 - m , ne
consegue chc U finito. Pi precisamente abbiamo mostrato che il numero di elementi in
U un intero, chc la definizione di "finito . Ma lenunciato che U finito contraddice
lipotesi chc U sia infinito. Abbiamo dunque usato la negazione della nostra conclusione
per dimostrare la negazione di uno degli enunciati dati dellipotesi, e in virt del principio
della dimostrazione per assurdo possiamo concludere che il teorema vero.
Non necessario che le dimostrazioni siano cos prolisse. Dopo aver esaminato le idee
su cui poggia la dimostrazione, dimostriamo unaltra volta il Teorema 1.5 limitandoci a
poche righe.
DIMOSTRAZIONE Sappiamo che S U T = U e che S e T sono disgiunti, per cui || || +
|| || = Il6 ' Il. Poich S finito, abbiamo che ||>|| = n per un intero n . e poich U
infinito, non esiste nessun intero p tale chc HLrH = p. Supponiamo che T sia finito, cio
||T || = ni per un intero m . Allora ||i/|| |6T|! + ||T || = n + m , il che contraddice
l'ipotesi che non esiste alcun intero p uguale a ||f/||.
1.2.3
Il teorema nella forma se-allora il pi comune in molte aree della matematica. Tut
tavia ci sono anche altri tipi di enunciati dimostrati come teoremi. In questo paragra
fo esamineremo le pi comuni forme di enunciato e che cosa bisogna fare di solito per
dimostrarle.
12
Capitolo I
Nella logica formale si trova spesso loperatore anzich se-allora. In alcuni testi di
matematica lenunciato sc H allora C compare quindi come H >C. Qui non se ne
far uso.
Enunciati nella forma se-e-solo-se
A volte si trovano enunciati nella fonila iiA se e solo se Ti. Altre forme di questenun
ciato sono sse (iff) B " [, 'iA equivalente a 7?, oppure .4 esattamente quando B".
Questenunciato consta effettivamente di due enunciati se-allora: se .4 allora B " c se B
allora ,4. Si dimostra iiA se e solo se B " dimostrando questi due enunciati.
1. La parte se: se B allora A".
1ssc, abbreviazione di "se e solo se, una sigla che viene usata in alcuni testi di matematica per brevit (in
inglese iff. abbreviazione di if and only if").
13
14
Capitolo I
1. [x j, la parte intera (floor) di un numero reale x, il pi grande intero uguale o
minore di x.
2 . fx], il tetto (ceiling) di un numero reale x, il pi piccolo intero uguale o maggiore
di x.
Teorem a 1.7 Sia x un numero reale. Allora fxj = |V | se e solo se x un intero.
DIMOSTRAZIONE (Parte solo-se) In questa parte supponiamo chc _xj = |x ] e proviamo
a dimostrare chc x un intero. Usando le definizioni di parte intera e di tetto notiamo
che [_xj < X e fx] > x. Tuttavia si detto per ipotesi che |_xj far]. Perci possiamo
sostituire la parte intera con il tetto nella prima disuguaglianza per concludere che fx] <
x. Poich sia fx] < x sia fx] > x sono valide, possiamo concludere, per le propriet
delle disuguaglianze aritmetiche, chc fx] = x. Dato che fx] sempre un intero, in questo
caso anche x devessere un intero.
(Parte se) Supponiamo ora che x sia un intero c cerchiamo di dimostrare |_xj = fx].
Questa parte facile. Per definizione, quando x c un intero, sia [xj sia fx] sono uguali a
x, e dunque uguali fra loro.
1.2.4
Talvolta si incontra un teorema chc sembra non avere unipotesi. Un esempio la ben
nota formula trigonometrica:
Teorem a 1.8 sin 2 + cos 2 0 = 1.
In realt quest'enunciato ha unipotesi, che consiste di tutti gli enunciati di cui si ha
bisogno per interpretarlo. In particolare lipotesi nascosta che un angolo, e dunque le
funzioni seno e coseno hanno il loro significato geometrico consueto. Partendo dalla de
finizione di questi termini e dal teorema di Pitagora (in un triangolo rettangolo il quadrato
dell'ipotenusa uguale alla somma dei quadrati degli altri due lati) possiamo dimostrare
il teorema. Essenzialmente la forma se-allora del teorema : se un angolo, allora
sin 2 + cos 2 0 = 1.
1.3
1.3.1
15
Nella teoria degli automi si deve spesso dimostrare un teorema per il quale due insiemi
costruiti in modo diverso sono uguali. Frequentemente si tratta di insiemi di stringhe di
caratteri, detti linguaggi, ma in questo paragrafo la loro natura non importante. Se E
ed F sono due espressioni chc rappresentano insiemi, lenunciato E = F significa che
i due in siem i rappresentati sono uguali. Pi precisamente, ogni elemento dellinsieme
rappresentato da E si trova neHinsieme rappresentato da F e ogni elemento dellinsieme
rappresentato da F si trova nellinsieme rappresentato da E.
Esem pio 1.9 L-d propriet commutativa dellunione afferma che possiamo formare lu
nione di due insiemi R ed S in entrambi gli ordini; in altre parole R U S = S U R.
In questo caso E lespressione R U 5 ed F c lespressione S U R . La propriet
commutativa dellunione dice che E = F.
Possiamo scrivere luguaglianza di insiemi E = F come un enunciato della forma
se-e-solo-se: un elemento x in E se e solo se x in F. Da questo possiamo ricavare lo
schema di una dimostrazione di qualunque enunciato che asserisca luguaglianza dei due
insiemi E = F secondo la forma di una dimostrazione se-e-solo-se:
1 . dimostrare chc se x in E , allora x in F
Dimostreremo a turno le due parti del teorema. Nella parte se poniamo che lelemento x
sia in E e mostriamo che in F . Questa parte, riassunta nella Figura 1.5, usa le definizioni
di unione e intersezione, che si presumono note.
Dobbiamo poi dimostrare la parte solo-se del teorema. Qui poniamo che x sia in F e
mostriamo che in E. Le fasi sono riassunte nella Figura 1.6. Dato che abbiamo dimo
strato entrambe le parti dellenunciato se-e-solo-se, abbiamo anche provato Ia propriet
distributiva dellunione rispetto allintersezione.
16
Capitolo I
1.
2.
3.
4.
5.
6.
Enunciato
Giustificazione
X in
X in
a; in
in S
X in
X in
X in
ipotesi
( 1) e definizione di unione
(2 ) e detenizine di intersezione
R U (S T )
R o X in S T
/? o x sia
sia in T
R US
R UT
(R U 5') (R U T)
3.
4.
5.
6.
X in
X in
X in
X in
in S
X c in
X c in
(/? U S ) (R U T)
l U S
R UT
R o X sia
sia in T
R o X in S T
R U ( S n T)
Giustificazione
ipotesi
( 1 ) e definizione di intersezione
( 1 ) e definizione di intersezione
(2), (3), e ragionamento
sulle unioni
(4) e definizione di intersezione
(5) e definizione di unione
1.3.2
Ilcontronominale
Ogni enunciato se-allora ha una forma equivalente che in alcune circostanze e pi sem
plice da dimostrare. Il conlronominale dellenunciato se H allora C" sc non C allora
non H ". Un enunciato e il suo contronominale sono entrambi veri oppure entrambi falsi.
Dunque possiamo dimostrarne uno per dimostrare anche P altro.
Per vedere perch se H allora C n e sc non C allora non H sono logicamente
equivalenti, osserviamo in primo luogo che ci sono quattro casi da considerare:
1. H e C entrambe vere
2. I I vera e C falsa
3. C vera e H falsa
4 . H e C entrambe false.
17
(.R U S) n ( R U T)
U naltra tipica espressione di equivalenza fra insiemi si serve della locuzione
tutti-c-soli . Per esempio il Teorema 1.10 si pu esprimere cos: gli elementi
di R LJ ( 5 T ) sono tutti e soli gli elementi di (K U 5 ) f l (l U T ).
C solo un modo per rendere falso un enunciato se-allora: lipotesi devessere vera e la
conclusione falsa, come nel caso (2). Per gli altri tre casi, incluso il caso (4) in cui la
conclusione falsa, lenunciato se-allora in s vero.
Consideriamo ora per quali casi il contronominale "se non C allora non H falso.
Affinch questenunciato sia falso, la sua ipotesi (che non C ) devessere vera e la sua
conclusione (che non H ) deve essere falsa. Ma non C vera esattamente quando
C falsa e non t " falsa esattamente quando TI vera. Queste due condizioni sono
nuovamente il caso ( 2 ), il che mostra che in ognuno dei quattro casi l'enunciato originale
e il suo contronominale sono ambedue veri oppure ambedue falsi. In altre parole sono
logicamente equivalenti.
Esem pio 1.11 Torniamo al Teorema 1.3, il cui enunciato : se x > 4, allora 2X > .r2.
Il contronominale di questenunciato : se non 2X > x 2, allora non x > 4. In termini
pi colloquiali, tenendo conto che non a > b" lo stesso di a < b, il contronominalc c
se 2X < X 2 allora x < 4.
Quando si deve dimostrare un teorema se-e-solo-se, l'uso del contronominalc in una
delle parti permette numerose opzioni. Supponiamo per esempio di dover dimostrare
lequivalenza di insiemi E = F. Invece di dimostrare se x in E allora x in E e se x
in F allora x in E' \ possiamo esprimere una direzione in forma contronominale. Una
forma di dimostrazione equivalente :
se X in E allora x in F c se x non in E allora x non in F.
N ellenunciato sopra si possono anche scambiare E ed F.
18
Capitolo I
Linverso
Non si confondano i termini contronominalc e inverso. L'inverso di un enun
ciato se-allora c laltra direzione: ossia linverso di se H allora C n se C
allora H . A differenza del contronominale, che logicamente equivalente allo
riginale, linverso non equivalente allenunciato originale. In effetti le due parti
della dimostrazione se-e-solo-se sono sempre un enunciato e il suo inverso.
1.3.3
Per capire come mai le dimostrazioni per assurdo sono logicamente corrette si ricordi
il Paragrafo 1.3.2, in cui ci sono quattro combinazioni di valori di verit per TT e C. Solo
il secondo caso, t vera e C falsa, rende falso lenunciato se TT allora C . Mostrando
che t e non C porta al falso stiamo dimostrando che il caso 2 non pu aver luogo. Perci
le sole combinazioni possibili di valori di verit per TT e C sono le tre combinazioni che
rendono vera se H allora C".
1.3.4
19
Controesempi
Nella vita quotidiana non si devono dimostrare teoremi. Piuttosto ci si trova di fronte a
cose che sembrano vere - una strategia per implementare un program m a per esempio - e
si deve decidere se il teorema vero o no. Per risolvere la questione possiamo cercare
di dimostrare il teorema o, se non ci riusciamo, cercare di dimostrare chc il suo enunciato
falso.
Generalmente i teoremi sono enunciati per un numero infinito di casi, per esempio tutti
i valori dei rispettivi parametri. In realt una rigida convenzione matematica nobilita un
enunciato del titolo di teorema solo se ha un numero infinito di casi. Gli enunciati che non
hanno parametri, o che si applicano solo a un numero finito di valori dei parametri, sono
detti osservazioni. Basta dimostrare chc un teorema presunto falso in uno qualunque dei
casi per dimostrare che non si tratta di un teorema. La situazione analoga ai programmi,
poich generalmente si considera che un programma contiene un errore se non riesce a
operare correttamente anche per un solo input su cui dovrebbe funzionare.
Spesso pi facile dimostrare che un enunciato non un teorema anzich dimostrare
che lo . Come detto sopra, se S un qualunque enunciato, allora uS non un teorema
a sua volta un enunciato senza parametri, e perci pu essere considerato unosservazione
invece di un teorema. Esponiamo due esempi, il primo riguardante un evidente non
teorema, il secondo un enunciato che solo per poco non un teorema c che richiede
qualche ragionamento per stabilire se lo sia o no.
Teorem a presunto 1.13 Tutti i numeri primi sono dispari (in termini pi formali si po
trebbe dire: se lintero x un numero primo, allora x dispari).
CONFUTAZIONE L'intero 2 un numero primo, ma 2 pari.
Quando ci si trova a operare con coppie di oggetti come a e ft, spesso possibile
sfrattare qualche simmetria per semplificare le loro relazioni reciproche. Qui ci si pu
concentrare sul caso in cui a < ft, dato che se b < a si possono scambiare a e ft, e ottenere
la stessa equazione del presunto Teorema 1. 14. Tuttavia bisogna prestare attenzione a non
20
Capitolo I
dimenticare il terzo caso: a = 6 . Questo caso risulter decisivo per i nostri tentativi di
dimostrazione.
Supponiamo chc a < 6 . Allora a mod b = a, poich nella definizione di a mod b
abbiamo q = 0 c r = a. In altre parole, quando a < b abbiamo S = D x H a. Ma
b mod a < a, poich qualsiasi numero mod a sta tra 0 e a - 1. Dunque, quando a < b.
b mod a < a mod b. e a mod b = b mod a impossibile. Ricorrendo aHargomcnto della
simmetria di cui sopra, sappiamo anche che a mod b b mod a quando b < a.
Consideriamo tuttavia il terzo caso: a = b. Poich x mod x = 0 per qualunque intero
x . abbiamo effettivamente a mod b = b mod a se a = b. Perci abbiamo confutato il
presunto Teorema 1.14.
CONFUTAZIONE Sia a = b = 2. Allora
a mod b = b mod a = 0
Nel corso della ricerca del controesempio abbiamo in effetti scoperto le condizioni
esatte sotto cui il teorema presunto valido. Ecco la versione corretta del teorema c la sua
dimostrazione.
Teorem a 1.15 a mod b = b mod a se e solo se a = b.
DIMOSTRAZIONE (Parte se) Sia a - b. Allora, come osservato precedentemente, x mod
1.4
Dimostrazioni induttive
Dimostrazioni induttive
21
varia natura, per esempio le espressioni regolari cui si accennato nel Paragrafo 1.1.2. In
questo paragrafo si introdurr il concetto di dimostrazione induttiva a partire da semplici
induzioni su interi. In seguito si mostrer come operare induzioni strutturali su qualunque
concetto definito ricorsivamente.
1.4.1
s(j).
Abbiamo ipotizzato la negazione di quanto volevamo dimostrare; abbiamo cio sup
posto che S ( j ) fosse falso per un qualche j > i. In ognuno dei casi abbiamo ricavato una
contraddizione, cos abbiamo ottenuto una dimostrazione per assurdo che S (n ) vero per
ogni ri > .
Purtroppo c un sottile difetto logico in questo ragionamento. Il nostro assunto, che
si possa scegliere il minimo j > i per il quale S ( j) falso, gi dipende dalla nostra fiducia
nel principio di induzione. In altre parole lunico modo di dimostrare che si pu trovare
questo j dimostrarlo per mezzo di un metodo che essenzialmente una dimostrazione
induttiva. Tuttavia la dimostrazione discussa sopra intuitivamente ragionevole e si
accorda con la comune comprensione del mondo reale. Generalmente si prende dunque
come parte integrante del nostro modo di ragionare il seguente principio.
Principio di induzione: se dimostriamo S (i) e dimostriamo che, per ogni a > i,
S ( n ) implica S (ri + 1), allora possiamo concludere S (n ) per ogni u > i.
22
Capitolo I
I due esempi seguenti illustrano luso del principio di induzione per dimostrare teoremi
sugli interi.
Teorem a 1.16 Per ogni n > 0:
n
(L I)
i-1
Questa dimostrazione consta di due parti che saranno dimostrate a
turno: la base e il passo induttivo.
d im o s t r a z io n e
BASF, Per la base scegliamo n = 0. Pu sembrare sorprendente che il teorema sia valido
anche per n = 0, dato che il membro sinistro dellEquazione (1.1)
^ i 2 quando
n = 0. Tuttavia c un principio generale per cui, se il limite superiore di una somma (in
questo caso 0 ) minore del limite inferiore (qui 1 ), la somma non ha termini e quindi 0 .
In altre parole
i2 = 0.
Anche il membro destro dell'Equazione ( I . I ) 0, dato che U x ( 0 + l ) x ( 2 x 0 + l ) / 6 =
0. Perci FEquazione (1.1) vera quando n = .
Supponiamo ora chc n > 0. Dobbiamo dimostrare il passo induttivo, cio che
!Equazione (1.1) implica la stessa formula con n + 1 al posto di n. La seconda formula
in d u z io n e
( 1. 2 )
(1.4)
;=1
Dobbiamo dimostrale (1.4) facendo uso di (1.3) perch nel principio di induzione questi
sono rispettivamente gli enunciati S (n -I- 1 ) e S{n). Il trucco di scomporre la somma
tino a n + 1 a sinistra di (1.4) in una somma fino a n pi il termine (n + l)-esim o. In
questo modo possiamo rimpiazzare la somma fino a n con il membro destro di (1.3) c
mostrare che (1.4) vera. I passi si configurano cos:
Dimostrazioni induttive
( 2 t73 + 3n 2 + n ) /6 + (n 2 H- 2 ri + 1) = (2 n 3 + 9 n 2 + 13n + 6 ) / 6
23
(1.6 )
La verifica finale, che (1.6) vera, richiede solo semplici nozioni di algebra dei polinomi
applicate al membro sinistro per dimostrare che identico alla parte destra.
Esem pio 1.17 Nel prossimo esempio dimostriamo il Teorema 1.3 del Paragrafo 1.2.1.
Ricordiamo che questo teorema dice che se x > 4 allora 2X > x 2. Ne abbiamo dato
una dimostrazione informale, basata sullidea che il rapporto x 2/ 2 X si riduce quando x
cresce oltre 4. Si pu precisare l'idea dimostrando lenunciato 2:r > x 2 per induzione su
x, partendo da una base di x = 4. Si noti che l'enunciato effettivamente falso per x < 4.
b a s e Se X = 4, allora 2T e x 2 sono entrambi 16. Perci 2 4 > 4 2 valido.
2x2 > (x + I ) 2
(1.7)
(1.8)
X > 2 + X
(1.9)
Dato che x > 4, sappiamo che / x < 1/4. Perci il membro sinistro di (1.9) almeno
4 e il membro destro al massimo 2.25. In questo modo abbiamo dimostrato che (1.9)
vera. Perci le Equazioni (1.8 ) e (1.7) sono altrettanto vere. LEquazione (1.7) d a sua
volta il risultato 2xr > {x + I ) 2 per x > 4 e dimostra lenunciato S ( x + 1) che, come
rico rd ia m o ,e ra 2X+1 > (x + I)2.
24
Capitolo I
1.4.2
n un intero, lo anche n 4 1.
A volte possibile fare una dimostrazione induttiva solo ricorrendo a uno schema pi
generale rispetto a quello proposto nel Paragrafo 1.4.1, in cui abbiamo dimostrato lenun
ciato S per un valore di base e poi abbiamo dimostrato chc se S (n ) allora S ( n 4 - 1).
Esistono due importanti generalizzazioni di questo schema.
1. Possiamo usare diversi casi di base. In altre parole dimostriamo, per un j > i, gli
enunciati S (i), S (i 4- 1 ) . . . . . S( j ) .
2. Nella dimostrazione di S ( n 4 1) possiamo usare la validit di tutti gli enunciati
S ( * ) ,S ( 4 l) ,...,5 ( n )
piuttosto che usare scmpliccmentc S(n). Inoltre, se abbiamo dimostrato i casi di
base fino a S( j ) , possiamo supporre chc n > j , anzich solo n > i.
La conclusione che si pu ricavare da questa base e dal passo induttivo che S ( n ) vero
per tutti i valori n > ?..
Esempio 1.18 II seguente esempio illustrer il potenziale di entrambi i principi. Lenun
ciato S (ri) che vogliamo dimostrare che se n > 8 , allora n pu essere scritto come la
somma di multipli di 3 e di 5. Si noti, per inciso, che 7 non pu essere scritto cos.
I casi di base sono -.9(8), S(O) e S(IO). Le dimostrazioni sono rispettivamente
8 = 3 4 5, 9 = 3 + 3 4 3 e 10 = 5 4 5.
b a se
Dimosirazioni induttive
25
1.4.3
Induzioni strutturali
Nella teoria degli automi esistono diverse strutture definite ricorsivamente su cui si devono
dimostrare enunciati. Importanti esempi sono le nozioni familiari di alberi e di espressio
ni. Similmente alle induzioni, tutte le definizioni ricorsive hanno un caso di base, in cui
si definiscono una o pi strutture elementari, e un passo induttivo, in cui si definiscono
strutture pi complesse nei termini di strutture definite in precedenza.
Esempio 1.19 Unadefinizionericorsivadi albero.
BASF. Un singolo nodo un albero, e tale nodo la radice dell'albero.
INDUZIONE Se T ,. T2____ \ sono alberi, allora si pu formare un nuovo albero in questo
modo:
3. si aggiungono lati dal nodo N alle radici di ogni albero T1, T2, . . . , Tfc.
La Figura 1.7 mostra la costruzione induttiva di un albero con radice N a partire da k
alberi pi piccoli.
Esempio 1.2U Consideriamo unaltra definizione ricorsiva. Questa volta definiamo espres
sioni con gli operatori matematici + e *, aventi come operandi sia numeri sia variabili.
BASE Qualunque numero o lettera (ossia una variabile) unespressione.
INDUZIONE Se
Per esempio sia 2 sia x sono espressioni (caso di base). Il passo induttivo dice che x + 2,
(;r + 2) e 2 * (x + 2) sono espressioni. Si noti come ognuna di queste espressioni dipende
dal fatto che le precedenti sono a loro volta espressioni. C
Data una definizione ricorsiva, si possono dimostrare teoremi su di essa con la se
guente forma di dimostrazione, detta induzione strutturale. Sia S(vY) un enunciato sulle
strutture X definite in modo ricorsivo.
26
Capitolo I
n = I e e = 0. dunque la
INDUZIONE Sia T un albero costituito, secondo il passo induttivo della definizione, dal
nodo radice Ar e da k alberi pi piccoli T i, T2, . . . , T v.. Possiamo supporre che gli enun
k + e \. + e2 -\-----+ ('-k
(LlO)
(1.11)
Dimostrazioni induttive
27
(1.12)
Questespressione vale esattamente 1 pi dellespressione (1.10) che era stata data per il
numero di lati di T. Perci T ha un nodo in pi del numero dei suoi lati.
Teorema 1.22 Ogni espressione ha un numero uguale di parentesi aperte e chiuse.
S( G) su qualunque espres
sione G che sia definita dalla ricorsione deHescmpio 1.20: il numero delle parentesi
aperte e chiuse in G lo stesso.
DIMOSTRAZIONE In termini formali dimostriamo !enunciato
BASE Se G c definita dalla base, allora G un numero o una variabile. Queste espressioni
hanno zero parentesi aperte e zero parentesi chiuse, dunque il numero uguale.
INDUZIONE Esistono tre regole per costruire G secondo il passo induttivo nella definizio
ne.
1. G = E + F.
2 . G = E * F.
3. Cr = (E).
28
Capitolo I
1.4.4
Induzione mutua
Talvolta non possibile dimostrare un singolo enunciato per induzione, ma si deve dimo
strare congiuntamente un gruppo di enunciati S\ (n). S 2(Ti).. . . . Sfc(Ti) per induzione su
n. La teoria degli automi fornisce molte situazioni di questo genere. NcirEsem pio 1.23
illustriamo un tipico caso in cui si deve spiegare che cosa fa un automa dimostrando un
gruppo di enunciati, uno per ogni stalo. Tali enunciati indicano per quali sequenze di
input lautoma passa in ognuno degli stati.
A rigor di termini, dimostrare un gruppo di enunciati non differisce dal dimostrare
la congiunzione (AND logico) di tutti gli enunciati. Per esempio il gruppo di enunciati
S\ (n), S 2(n ) , . . . . Sk(Ti) pu essere sostituito dal singolo enunciato
Si(n) AND S 2(n) AND AND S k (n)
Tuttavia, quando bisogna dimostrare molti enunciati effettivamente indipendenti, di solito
conviene tenere separati gli enunciati e dimostrare per ciascuno la rispettiva base e il passo
induttivo. Questo tipo di dimostrazione detto induzione mutua. Un esempio illustrer i
passi necessari.
Esempio 1.23 Consideriamo Pintcrruttore on/off, presentato come automa nell'Esempio L I. L'automa stesso riprodotto nella Figura 1.8. Dato chc la pressione del pulsante
cambia lo stato tra on e off, e l'interruttore parte dallo stato off, ci si aspetta che i seguenti
enunciati descrivano insieme il funzionamento dellinterruttore.
Dimostrazioni induttive
29
Si(n): lautoma si trova nello stato off dopo n pressioni se e solo se n pari.
S 2 (n): lautoma si trova nello stato on dopo n pressioni se e solo se ri dispari.
Push
1 . [S i; se] Dato che 0 pari, dobbiamo dimostrare che dopo 0 pressioni lautoma
della Figura 1.8 si trova nello stato off. Poich questo lo stato iniziale, lautoma
si trova effettivamente nello stato off dopo 0 pressioni.
2. [Si; solo-sei Lautoma si trova nello stato off dopo 0 pressioni, perci dobbiamo
mostrare che 0 pari. Ma 0 pari per la definizione di "pari, dunque non resta
altro da dimostrare.
3. [S2; se] Lipotesi della pane se di S 2 che sia dispari. Essendo quest'ipotesi H
falsa, qualsiasi enunciato della forma se H allora C c vero, come stato discusso
nel Paragrafo 1.3.2. Di conseguenza valida anche questa parte della base.
4. IS2; solo-se] Anche lipotesi che lautoma sia nello stato on dopo 0 pressioni
falsa, in quanto l'unico modo di pervenire allo stato on seguire un arco etichettato
30
Capitolo I
Push, il che richiede almeno una pressione sul pulsante. Poich lipotesi falsa,
possiamo concludere nuovamente che lenunciato se-allora vero.
INDUZIONE Ora supponiamo chc S] (n) e S 2 () siano vere, e proviamo a dimostrare
S i (n + I) e S2(n + 1 ). Anche questa dimostrazione si suddivide in quattro parti.
1. [Si (n + 1); sej Lipotesi per questa parte che n + 1 sia pari. Di conseguenza n
dispari. La parte se dell'enunciato S 2 (n) dice che dopo n pressioni lautoma si
trova nello stato on. Larco da on a ( g recante l'etichetta Push dice che la (ri + 1)esima pressione far passare lautoma nello stato off. Ci completa la dimostrazione
della parte se di Si (n + 1 ).
2. [Si (n + 1); solo-se] Lipotesi che lautoma si trovi nello stato off dopo n + 1
pressioni. Lesame d d lautoma indica chc lunico modo di pervenire allo stato off
di trovarsi nello stato on e di ricevere un input Push. Perci, se ci si trova nello
stato off dopo n 4- 1 pressioni, lautoma deve essersi trovato nello stato on dopo n
pressioni. Allora possiamo ricorrere alla parte solo-se dellenunciato S 2 (ft) per
concludere che n dispari. Dunque n + 1 pari, come si voleva dimostrare per la
parte solo-sc di S i (n 4-1).
3. [S2(n + I); se] Questa parte essenzialmente uguale alla parte (1), con i ruoli di
Si ed S 2 e con i ruoli di dispari e pari scambiati. Il lettore dovrebbe essere in
grado di costruire agevolmente questa parte della dimostrazione.
4. [S2(ft + 1); solo-sci Questa parte essenzialmente uguale alla parte (2 ), con i ruoli
di Si ed S 2 e con i ruoli di dispari c pari scambiati.
1.5
In questo paragrafo verranno introdotte le definizioni dei termini pi importanti chc per
meano la teoria degli automi. Questi concetti sono alfabeto (un insieme di simboli),
stringa (una lista di simboli di un alfabeto) e linguaggio (un insieme di stringhe dallo
stesso alfabeto).
1.5.1
31
Alfabeti
Un alfabeto un insieme finito e non vuoto di simboli. Per indicare un alfabeto si usa
convenzionalmente il simbolo . Fra gli alfabeti pi comuni citiamo:
1. = {0,1}, lalfabeto binario
2. = {a, b, . . . , z ), l'insiem e di tutte le lettere minuscole
3. l'insiem e di tutti i caratteri ASCII o linsieme di tutti i caratteri ASCII stampabili.
1.5.2
Stringhe
Una stringa (o parola) una sequenza finita di simboli scelti da un alfabeto. Per esempio
01101 una stringa sullalfabeto binario = {0,1}. La stringa 111 unaltra stringa
sullo stesso alfabeto.
La stringa vuota
La stringa vuota la stringa composta da zero simboli. Questa stringa, indicata con e,
una stringa che pu essere scelta da un qualunque alfabeto.
Lunghezza di una stringa
Spesso utile classificare le stringhe a seconda della loro lunghezza, vale a dire il numero
di posizioni per i simboli della stringa. Per esempio 01101 ha lunghezza 5. Comunemen
te si dice che la lunghezza di una stringa il numero di simboli nella stringa stessa;
questenunciato un'espressione accettabile colloquialmente, ma formalmente non cor
retta. Infatti ci sono solo due simboli, 0 e 1, nella stringa 01101, ma ci sono 5 posizioni ,
e la lunghezza della stringa 5. Tuttavia ci si pu aspettare di vedere usato di solito il
numero di simboli quando invece sintende il numero di posizioni .
La notazione standard per la lunghezza di una stringa w |ty|. Peresem pio |0111 = 3
e \e.\ = 0 .
Potenze di un alfabeto
Se un alfabeto possiamo esprimere linsieme di tutte le stringhe di una certa lunghezza
su tale alfabeto usando una notazione esponenziale. Definiamo ' come linsieme di
stringhe di lunghezza k, con simboli tratti da .
Esempio 1.24 Si noti che () = {e} per qualsiasi alfabeto . In altre parole e la sola
stringa di lunghezza 0 .
S c E = { 0 , 1 }. allora 1 = { 0 ,1 } , 2 = {00,01,10,11},
32
Capitolo I
E 3 = {0 0 0 , 0 0 1 , 0 1 0 . 0 1 1 , 100 , 1 0 1 . 1 1 0 , 1 1 1 }
e cos via. Si osservi che si crea una certa confusione tra e 1. Il primo un alfabeto: i
suoi membri. 0 e 1 , sono simboli. 11 secondo un insieme di stringhe; i suoi membri sono
le stringhe 0 c 1, ognuna delle quali di lunghezza I. Qui non cercheremo di usare due
notazioni distinte per i due insiemi, ma ci affideremo piuttosto al contesto per chiarire se
{(), 1 } o insiemi simili sono alfabeti o insiemi di stringhe.
L'insieme di tutte le stringhe su un alfabeto viene indicato convenzionalmente con
*. Peresem pio {0,1}* {,0,1,0(),01, 1 0 ,1 1 ,0 0 0 ,...} . Formulato altrimenti
* = 0 U 1 U 2 U
Talvolta si desidera escludere la stringa vuota da un insieme di stringhe. L'insieme
di stringhe non vuote sull'alfabeto indicato con + . Di conseguenza valgono le due
equivalenze seguenti.
+ = 1 U 2 U 3 U
* = + U {e.}
Concatenazione di stringhe
Siano X e y stringhe. Allora x y denota la concatenazione di x e y, vale a dire la stringa
formata facendo una copia di x e facendola seguire da una copia di y. Pi precisamente, se
X la stringa composta da i simboli x = a i ao a, e y la stringa composta da j simboli
y bib bj, allora x y c la stringa di lunghezza i 4- j: x y = a \ 6162 bj.
1.5.3
33
Linguaggi
{c, 01,10.0011,0101.1001,...}
3. L'insiem e dei numeri binari il cui valore un numero primo:
{1 0 , 1 1 , 1 0 1 . I l i , 1 0 1 1 , . . . }
4. * un linguaggio per qualunque alfabeto .
5. 0, il linguaggio vuoto, un linguaggio rispetto a qualunque alfabeto.
6 . Anche {e}, il linguaggio che consta della sola stringa vuota, un linguaggio rispetto
34
Capitolo I
1.5.4
Problemi
Nella teoria degli automi un problema la questione se una data stringa sia o no membro
di un particolare linguaggio. Come si vedr, tutto ci che definiamo correntemente un
'problema pu essere espresso in termini di appartenenza a un linguaggio. In termini
pi precisi, se un alfabeto c L t un linguaggio su , allora il problema L :
data una stringa ir in *, decidere se w appartiene a L.
Esempio 1.26 II problema di verificare se un numero primo si pu esprimere con il
linguaggio L p, chc consiste di tutte le stringhe binarie il cui valore come numero binario
un numero primo. In altre parole, data una stringa di 0 e di 1, diremo s se la stringa
35
Linguaggio o problem a
Linguaggi e problemi sono in realt la stessa cosa. Scegliere luno o laltro ter
mine dipende dal punto di vista. Sc ci si occupa di stringhe prese come tali, per
esempio quelle dellinsieme (On I n | n > 1}, allora si portati a pensare allinsie
me di stringhe come a un linguaggio. Negli ultimi capitoli del libro tenderemo ad
assegnare una semantica alle stringhe, per esempio pensandole come codifiche
di grafi, espressioni logiche persino numeri interi. Nei casi in cui ci occupiamo
di quanto viene rappresentato dalla stringa anzich della stringa stessa, tenderemo
a considerare un insieme di stringhe come un problema.
36
Capitolo I
allora evidente chc non sar pi facile tradurre in codice oggetto i programmi in lin
guaggio A: se fosse facile generare il codice, allora si potrebbe eseguire il traduttore e
concludere che linput c un membro valido di L x nel momento in cui il traduttore riu
scisse a produrre il codice oggetto. Dato che il passo finale nel determinare se il codice
oggetto stato prodotto non pu essere difficile, si pu usare lalgoritmo rapido di ge
nerazione del codice oggetto per decidere efficientemente dellappartenenza a L \ . Cos
si giunge a contraddire l'assunto che provare lappartenenza a L x difficile. Abbiamo
una dimostrazione per assurdo dellenunciato se provare l'appartenenza a L x difficile,
allora compilare programmi nel linguaggio di programmazione X difficile .
Questa tecnica, cio mostrare quanto sia complesso un problema usando un suo al
goritmo. che si presume efficiente, per risolvere efficientemente un altro problema di cui
si conosce gi la difficolt, detta riduzione del secondo problema al primo. Si tratta
di uno strumento essenziale nello studio della complessit dei problemi e il suo utiliz
zo molto agevolato dalla nozione che i problemi sono questioni di appartenenza a un
linguaggio anzich questioni di tipo pi generale.
1.6
Riepilogo
Automi a stati finiti, gli automi a stati finiti sono composti di stati e transizioni tra
gli stati come reazioni agli input. Sono utili per la costruzione di diversi tipi di
software, tra cui il componente per lanalisi lessicale di un compilatore e sistemi
per la verifica della correttezza di circuiti o protocolli.
Espressioni regolari: si tratta di una notazione strutturale per la descrizione di pat
tern che possono essere rappresentati da automi a stati finiti. Vengono usati in molti
tipi comuni di software, tra cui strumenti per la ricerca di pattern in testi o in nomi
di file.
Grammatiche libere dal contesto', si tratta di unimportante notazione per descrivere
la struttura di linguaggi di programmazione e insiemi di stringhe correlati; sono
usate per costruire il parser di un compilatore.
Macchine di Turing: sono automi che forniscono un modello della capacit dei
computer reali. Tali macchine permettono di studiare la decidibilit, cio che cosa
un computer pu fare e che cosa non pu fare. Grazie alle macchine di Turing
inoltre possibile distinguere tra problemi trattabili, ossia quelli che possono essere
risolti in tempo polinomiale, e problemi intrattabili, quelli che invece non possono
essere risolti in tempo polinomiale.
Riepilogo
37
38
Capitolo I
Linguaggi e problemi: un linguaggio un insieme (eventualmente infinito) di strin
ghe, forniate da simboli tratti dallo stesso alfabeto. Quando le stringhe di un lin
guaggio devono essere interpretale in qualche modo, la questione se una stringa
appartenga al linguaggio viene indicata lalora con il termine problema.
1.7
Bibliografa
Per una trattazione approfondita del materiale presentato in questo capitolo, inclusi i
concetti matematici che stanno alla base dell'informatica, si consiglia [ I J.
I. A. V. Aho, J. D. Ullman, Foundations o f Computer Science , Computer Scien
ce Press, New York 1994: in it. Fondamenti di informatica , Zanichelli Editore,
Bologna, 1994.
Capitolo 2
40
Capitolo 2
regolare perch sappiamo che uno o pi altri linguaggi sono regolari, e le propriet di
decisione. Queste ultime sono algoritmi per rispondere a domande sugli automi oppure
sulle espressioni regolari, per esempio se due automi o due espressioni rappresentino lo
stesso linguaggio.
2.1
In questo paragrafo affronteremo un esempio di problema reale, nella cui soluzione gli
automi a stati finiti svolgono un ruolo importante. Ci occupiamo di protocolli a supporto
del denaro elettronico, cio file che possono essere usati da un cliente per pagare merci
tramite Internet e che un venditore pu accettare con la certezza chc il denaro e reale.
Il venditore deve essere sicuro che il file inviatogli non stato n falsificato n copiato,
mentre il cliente ne conserva una copia da riutilizzare.
La non falsificabilit del file deve essere assicurata da una banca e da un meccanismo
crittografico: in altre parole, un terzo attore, la banca, deve emettere e cifrare i file che
rappresentano il denaro in modo da evitare problemi. La banca ha un secondo compito
importante: deve tenere un database di tutto il denaro valido emesso, in modo da poter
verificare c dare conferma a un un negozio che il file ricevuto rappresenta denaro reale e
pu dunque essere accreditato sul conto dello stesso. Non ci occupiamo qui degli aspetti
crittografici della questione, n di come la banca possa conservare ed estrarre quelli che
potrebbero essere miliardi di banconote elettroniche. Questi problemi non dovrebbero
costituire ostacoli a lungo termine per la diffusione del denaro elettronico; sebbene su
scala limitata, abbiamo esempi del suo impiego sin dai tardi anni '90.
Nondimeno, al fine di poter usare denaro elettronico, si devono ideare protocolli in
modo tale che il denaro possa essere manipolato come l'utente desidera. Dato che i sistemi
monetari allettano sempre la frode, necessario verificare i criteri da adottare riguardo
all'impiego del denaro. Occorre cio dimostrare che le sole cose che possono accadere
sono quelle che noi vogliamo che accadano, ossia quelle che non consentono a un utente
privo di scrupoli di sottrarre il denaro altrui o addirittura di fabbricarlo.
Nel corso del paragrafo illustreremo un esempio molto semplice di protocollo (inadat
to) per il denaro elettronico, lo modelleremo con automi a stati finiti e dimostreremo come
applicare le costruzioni sugli automi per verificare protocolli (oppure, in questo caso, per
scoprire che il protocollo contiene un errore).
2.1.1
Le regole fondamentali
Ci sono tre partecipanti: il cliente, il negozio e la banca. Per semplicit si suppone che
esista un solo file che rappresenta il denaro. 11 cliente pu decidere di trasferire questo file
di denaro virtuale al negozio, che lo riscatter dalla banca (ossia far s che la banca emani
un nuovo file per il negozio anzich per il cliente) e spedir la merce al cliente. Inoltre I
41
cliente ha Topzione di poter cancellare il file, cio pu chiedere alla banca di ricollocare
il denaro nel suo conto, rendendolo non spendibile. Linterazione fra i tre partecipanti
dunque limitata a cinque eventi.
1. 11 cliente pu decidere di pagare, cio di inviare il denaro al negozio.
2.1.2
II protocollo
I tre partecipanti devono decidere attentamente come comportarsi per evitare situazioni
non desiderate. Nellesempio facciamo una supposizione ragionevole: non si pu dare
per scontato che il cliente agisca onestamente. In particolare il cliente potrebbe tentare di
copiare il file di denaro virtuale, usarlo per pagare pi volle, oppure pagare e poi annullare
il denaro, ottenendo cos la mcrcc gratis.
La banca, per sua natura, deve agire responsabilmente. In particolare deve assicurarsi
che due negozi non possano riscattare lo stesso file di denaro virtuale e non deve permette
re che il denaro venga contemporaneamente annullato e riscattato. Anche il negozio deve
cautelarsi. Soprattutto non deve inoltrare la merce finch non sicuro di aver ricevuto in
cambio denaro valido.
Si possono rappresentare protocolli di questo tipo come automi a stati finiti. Ogni
stato rappresenta una situazione in cui uno dei partecipanti pu trovarsi. In altre parole lo
stato ricorda che certi eventi importanti hanno avuto luogo e che altri non sono ancora
avvenuti. Le transizioni tra gli stati avvengono quando si verifica uno dei cinque eventi
descritti sopra. Penseremo questi eventi come esterni agli automi che rappresentano i
tre partecipanti, sebbene ogni partecipante sia responsabile dellavvio di uno o pi eventi.
Nellambito del problema importante la sequenza degli eventi che possono accadere,
non chi pu avviarli.
La Figura 2.1 rappresenta i tre partecipanti per mezzo di automi. Nel diagramma
illustriamo solo gli eventi che influenzano ciascun partecipante. Per esempio lazione
pay (pagare) riguarda soltanto il cliente e il negozio. La banca non sa che il denaro
stato mandato dal cliente al negozio; lo scopre quando il negozio compie lazione redeem
(riscattare).
42
Capitolo 2
Start
Cl
pay
redeem
------ - C b ) -------- - C d
ship
transfer
ship
ship
(a) Negozio
c
.S
redeem
cancel
pay\
transfer
cancel
Cl )
i
Start
(b) Cliente
ti
redeem
transfer
Start
(c) Banca
Figura 2.1 Automi a stati finiti che rappresentano un cliente, un negozio e una banca.
Esaminiamo per primo lautoma (c), chc rappresenta Ia banca. Lo stato iniziale lo stato
1 , che corrisponde alla situazione in cui la banca ha emesso il file di denaro virtuale in
questione, ma non ha ricevuto la richiesta di riscattarlo oppure di annullarlo. Se il cliente
invia alla banca la richiesta cancel (annullare), allora la banca ricolloca il denaro nel conto
del cliente ed entra nello stato 2. Questo stato denota la situazione in cui il denaro stato
annullato. Per la responsabilit che le compete, dal momento che non pu permettere che
il cliente annulli di nuovo oppure spenda lo stesso denaro, dopo esservi entrata la banca
non lascer lo stato 2 .1
Quando la banca si trova nello stato 1 pu ricevere anche una richiesta redeem dal
1Si badi che l'intera discussione rutila intorno a un unico tile di denaro virtuale. In effetti la banca far
funzionare lo stesso protocollo con un gran numero di monete elettroniche. Poich il meccanismo lo stesso
per ognuna, si pu discutere il problema come se ne esistesse un solo esemplare.
43
negozio. In questo caso la banca passa allo stato 3 e, dopo un certo tempo, manda al
negozio un messaggio transfer (trasferimento) con un nuovo file di denaro virtuale, che
ora appartiene al negozio. Dopo aver spedito il messaggio di trasferimento, la banca passa
allo stato 4. in cui non accetter richieste cancel o redeem n svolger alcunaltra azione
che riguardi il file di denaro virtuale in questione.
Consideriamo ora la Figura 2.1(a), lautoma che rappresenta le azioni del negozio.
Mentre la banca fa sempre la cosa giusta, il sistema del negozio ha qualche difetto. Si
immagini che la spedizione e le operazioni finanziarie siano svolte da processi distinti,
cosicch c la possibilit che lazione ship venga compiuta prima, dopo, oppure durante il
riscatto del denaro elettronico. Questo tipo di meccanismo permette al negozio di trovarsi
nella situazione di aver gi inoltrato la merce e di scoprire solo in seguito che il denaro
era falso.
Il
negozio parte dallo stato a. Quando il cliente ordina la merce compiendo Fazione
pay, il negozio entra nello stato b. In questo stato il negozio avvia sia il processo di spedi
zione sia quello di riscatto. Se la merce viene spedita prima, allora il negozio entra nello
stato e, in cui deve ancora riscattare il denaro dalla banca e da questa ricevere il trasfe
rimento di un file di denaro virtuale equivalente. In alternativa il negozio pu mandare
subito il messaggio redeem , entrando dunque nello stato d. Dallo stato d il negozio pu
effettuare la spedizione, entrando nello stato e, oppure ricevere il trasferimento di denaro
dalla banca, entrando nello stato / . Dallo stato / ci si aspetta che il negozio spedisca
infine la merce e passi allo stato
dove la transazione completata e non succede pi
niente. Nello stato e il negozio attende il trasferimento dalla banca. Disgraziatamente la
merce gi stata spedita, e se il trasferimento non ha luogo il negozio subisce una perdita.
Da ultimo osserviamo lautoma che modella il cliente, Figura 2.1(b). Per indicare
il fatto che il cliente "pu fare qualunque cosa, questo automa ha solo uno stato. Il
cliente pu svolgere le azioni pay e cancel tutte le volte che vuole, in qualunque ordine,
rimanendo nellunico stato dopo ogni azione.
2.1.3
I tre automi nella Figura 2.1 rispecchiano il comportamento indipendente dei tre parteci
panti. ma mancano alcune transizioni. Per esempio il negozio non viene influenzato da un
messaggio cancel, cos se il cliente esegue azione cancel il negozio dovrebbe rimanere
nello stato in cui si trova. .Nella definizione formale di automa a stati finiti, chc vedremo
nel Paragrafo 2.2, ogni volta che riceve un input X un automa deve seguire un arco eti
chettato X dallo stato in cui si trova a un nuovo stato. Perci lautoma per il negozio ha
bisogno di un ulteriore arco, da ogni stato a se stesso, etichettato cancel. In questo modo,
quando si esegue lazione cancel, lautoma del negozio pu compiere una "transizione
su tale input, rimanendo nello stesso stato in cui si trovava. Senza questi archi supple-
44
Capitolo 2
2.1.4
Per ora abbiamo i modelli di comportamento dei tre partecipanti, ma non della loro inte
razione. Come detto sopra, dato che il cliente non ha vincoli sul comportamento, il suo
automa ha un solo stato, c qualsiasi sequenza di eventi lo lascia in tale stato; in altre pa
role, non possibile chc il sistema nel suo insieme muoia perch lautoma del cliente
non reagisce a un'azione. D 'altra parte, sia il negozio sia la banca si comportano in modo
payxancel
Start lP )
pay.cancel
45
pay,cancel
b )-- - ( d )-.
pay
redeem
transfer
ship
ship
(a) Negozio
ship
re d c c n y Ntransfer
c
pay,cancel pay,cancel
pay,cancel
p a y ,sh ip
Start
(b) Cliente
cancel
pay,redeem ,
pay,redeem ,
cancel, ship
cancel, ship
Aj
3 )-------- - ( 4
pay.
ship
redeem
transfer
Start
(c) Banca
46
Capitolo 2
Al
2.1.5
La Figura 2.3 mostra alcune cose interessanti. Per esempio solo dieci dei 28 stati possono
essere raggiunti a partire dallo stato iniziale, che ( 1 , a), cio la combinazione degli stati
iniziali degli automi della banca e del negozio. Si noti che stati come (2, e) e (4 , d ) non
sono accessibili, ossia non c un cammino che li raggiunga dallo stato iniziale. Non
necessario includere gli stati inaccessibili nellautoma; questi sono presenti nellesempio
solo per completezza.
Il
vero scopo dellanalisi di un protocollo come questo per mezzo di automi porre
domande del tipo: pu verificarsi il seguente errore?, e dare una risposta. Nellesempio
possiamo chiederci se possibile che il negozio inoltri la merce e non venga pagato. In
altre parole: pu lautoma prodotto entrare in uno stato in cui il negozio ha spedito la
merce (ossia lo stato nella colonna c, e o g), sebbene non sia stata fatta n mai si far
una transizione sullinput T l
Per esempio nello stato (3, e) la merce stata spedita, ma prima o poi ci sar una
transizione sullinput T verso lo stato (4,#). Per quanto riguarda la banca, una volta
raggiunto lo stato 3, essa ha ricevuto ed elaborato la richiesta redeem. Ci significa chc
deve essersi trovata nello stato 1 prima di ricevere redeem , e perci il messaggio cancel
non era stato ricevuto e verr ignorato se dovesse presentarsi in futuro. In questo modo la
banca eseguir il trasferimento di denaro al negozio.
Lo stato (2 ,c), invece, costituisce un problema. Lo stato accessibile, ma lunico
48
Capitolo 2
arco uscente riconduce allo stesso stato. Tale stato corrisponde alla situazione in cui la
banca ha ricevuto un messaggio cancel prima del messaggio redeem. Ciononostante il
negozio ha ricevuto un messaggio pay, cio il cliente ha fatto il doppio gioco e ha speso e
annullalo lo stesso denaro. Incautamente il negozio ha spedito la merce prima di tentare
di riscattare il denaro, e quando eseguir lazione redeem la banca non riconoscer il
messaggio. Infatii essa si trova nello stato 2 in cui ha annullalo il denaro e non disposta
a elaborare una richiesta redeem.
2.2
2.2.1
49
A = (Q, . 6. (ft; F )
dove ,4 il nome del DFA, Q linsieme degli stati. i suoi simboli di input, S la sua
funzione di transizione, qo il suo stato iniziale ed F il suo insieme di stati accettanti.
2.2.2
La prima cosa che bisogna capire di un DFA come decide se accettare o no una
sequenza di simboli di input. Il linguaggio del DFA l'insiem e di tutte le stringhe
che il DFA accetta. Supponiamo che a \a -2 - ^ a n sia una sequenza di simboli di input.
Si parte dal DFA nel suo stato iniziale, qo. Consultando la funzione di transizione .
per esempio (qoai ) = qi, troviamo lo stato in cui il DFA entra dopo aver letto il primo
simbolo di input, a i. Il successivo simbolo di input. a, viene trattato valutando (<>2 ).
Supponiamo che questo stato sia <72. Continuiamo cos, trovando gli stati <73, 7 4 , ---- Qn
tali che d'(7_i, a) =
per ogni i. Se qn un elemento di F , allora l'input O1 2 1an
viene accettato, altrimenti viene rifiutato.
Esempio 2.1 Specifichiamo formalmente un DFA che accetta tutte c sole le stringhe di 0
e di 1 in cui compare la sequenza 01. Possiamo scrivere il linguaggio L cos:
{?/; I w della forma .TOly per stringhe
X e /7 che consistono solamente di 0 e di 1}
Una descrizione equivalente, che usa i parametri x e y a sinistra della barra verticale, :
{a:0 1 ? / 1 X e y sono stringhe qualsiasi di 0 e di 1 }
Esempi di stringhe appartenenti al linguaggio includono 01, I 1010 e 100011. Esempi di
stringhe non appartenenti al linguaggio includono 0 , e 1 1 10 0 0 .
Che cosa sappiamo di un automa che accetta questo linguaggio U i In primo luogo il
suo alfabeto di input = {0,1}; ha un certo insieme di stali, Q, di cui uno, poniamo
(7o, lo stato iniziale. Questautoma deve ricordare i fatti importanti relativi agli input gi
visti. Per decidere se 01 una sottostringa dell'input, ,4 deve ricordare quanto segue.
I. Ha gi visto 01? In caso affermativo accetta ogni sequenza di ulteriori input, cio
da questo momento in poi si trover solo in stati accettanti.
50
Capitolo 2
2. Pur non avendo ancora visto 01, linput pi recente stato 0, cosicch se ora vede
un 1 avr visto 01. D a questo m om ento pu accettare qualunque seguito?
3. N on ha ancora visto 01, m a l'in p u t pi recente nullo (siam o ancora allinizio)
oppure com e ultim o dato ha visto un 1? In tal caso A non accetta finch non vede
uno 0 e subito dopo un 1.
O gnuna di queste tre condizioni pu essere rappresentata da uno stato. La condizione (3)
rappresentata dallo stato iniziale q0. A ll'inizio bisogna vedere uno 0 e poi un I. M a se
nello staio qo si vede per prim o un L allora non abbiam o fatto alcun passo verso 01, e
dunque dobbiam o perm anere nello stato <70a ' lr' term ini 5(qo, 1) = qo.
D altra parte, se ci troviam o nello stato qo e vediam o uno 0, siamo nella condizio
ne (2). Vale a dire: non abbiam o ancora visto 01, m a ora abbiam o lo 0. D unque usiam o
q-2 per rappresentare la condizione (2). La transizione da qo su ll'in p u t 0 S(qo. 0) = <72
O ra consideriam o le transizioni dallo stato q2. Se vediam o uno 0, non siam o in una
situazione m igliore di prim a, m a neanche peggiore. Non abbiam o visto 01, m a 0 stato
l ultim o sim bolo incontrato: stiam o ancora aspettando un I. Lo stato q2 descrive questa
situazione perfettam ente, e dunque poniam o (q2,0) = <72- Sc ci troviam o nello stato q2
e vediam o un input 1, sappiam o che c uno 0 seguito da un 1. Possiam o passare a uno
stato accettante, che si chiam er qi e corrisponder alla sum m enzionata condizione (1).
O ssia (q-2 ~1) = q\Infine dobbiam o determ inare le transizioni per lo stato q\. In questo stato abbia
m o gi incontrato una sequenza 01, quindi, qualsiasi cosa accada, sarem o ancora in una
situazione in cui abbiam o visto 0 1 . In altri termini <5(</i, 0) = 6 ( q i,l) = QiD a quanto detto risulta allora Q = {qo,qi, </2} C om e afferm ato in precedenza, qo
lo stato iniziale e lunico stato accettante q\ . Q uindi F = {(/1}. La definizione com pleta
d ellautom a ,4 che accetta il linguaggio L delle stringhe che hanno una sottostringa 01
A = ({/0,91; }. { 0 ,1 } ,<5,9o, {Q })
dove la funzione di transizione descritta sopra.
2.2.3
Specificare un DFA attraverso una quintupla c una descrizione dettagliata della funzione
di transizione allo stesso tem po noioso e di difficile lettura. I sistem i preferibili per la
descrizione degli autom i sono due:
1. un diagramma di transizione, cio un grafo com e quelli presentati nel Paragrafo 2.1
2. una tabella di transizione, cio la specificazione tabellare della funzione , da cui
si deducono linsiem e degli stati e lalfabeto di input.
51
Diagrammi di transizione
Un diagramma di transizione per un DFA A = (Q. , <5, q0, F ) un grafo definito com e
segue.
a) Per ogni stato in Q esiste un nodo.
b) Per ogni stato q in Q e ogni sim bolo di input a in . sia S(q, a) = p. A llora
il diagram m a ha un arco dal nodo q al nodo p etichettato a. Se esistono diversi
sim boli di input che causano transizioni da q a p, il diagram m a pu avere un arco
etichettato dalla lista di tali sim boli.
c) U na freccia etichettata Start entra nello stato iniziale qo. Tale freccia non proviene
da alcun nodo.
d) 1 nodi corrispondenti a stati accettanti (quelli in F) sono indicati da un doppio
circolo. G li stati non in F hanno un solo circolo.
Esempio 2.2 La Figura 2.4 m ostra il diagram m a di transizione per il DFA costruito nell'E sem p io 2.1. N el diagram m a vediam o i tre nodi che corrispondono ai tre stati. C una
freccia Start che entra nello stato iniziale qo, e lunico stato accettante, q\_, rappresentato
da un doppio circolo. D a ogni stato escono un arco etichettato 0 e un arco etichettato 1
(sebbene i due archi siano com binati in un unico arco con una doppia etichetta nel caso di
1 ). Ogni arco corrisponde a uno dei fatti relativi a . stabiliti n ell'E sem pio 2 .1 .
F ig u ra 2.4 II diagram m a di transizione per il DFA che accetta tutte le stringhe con una
sottostringa 01.
Tabelle di transizione
Una tabella di transizione una com une rappresentazione tabellare di una funzione com e
, che ha due argom enti e restituisce un valore. Lc righe della tabella corrispondono agli
stati, le colonne agli input. L a voce a llincrocio della riga corrispondente allo stalo q e
della colonna corrispondente a llinput a lo stato 6(q, a,).
52
Capitolo 2
E sem p io 2.3 La tabella di transizione relativa alla funzione d d ell'E scm p io 2.1 rap
presentata dalla Figura 2.5, corredata di due inform azioni specifiche: lo stato iniziale c
indicato da una freccia, gli stati accettanti da un asterisco. D ato che possiam o dedurre gli
insiem i degli stati e dei sim boli di input dalle intestazioni delle righe e delle colonne, dalla
tabella di transizione si ricavano tutte le inform azioni necessarie per specificare lautom a
a stati finiti in m aniera univoca.
1
Qo
*Qi
<72
<7i
Qi
Q2
Qi
Qx
- Qo
2.2.4
A bbiam o spiegato in m odo inform ale che un DFA definisce un linguaggio: linsiem e di
tutte le stringhe che producono una sequenza di transizioni di stati dallo stato iniziale a
uno stato accettante. R ispetto al diagram m a di transizione, il linguaggio di un DFA lin
siem e delle etichette lungo i cam m ini che conducono dallo stato iniziale a un qualunque
stato accettante.
necessario ora precisare la nozione di linguaggio di un DFA. A questo scopo defi
niam o una funzione di transizione estesa, che descrive che cosa succede quando partiam o
da uno stato e seguiam o una sequenza di input. Sc (5 la funzione di transizione, allora
la funzione di transizione estesa costruita da si chiam er . La funzione di transizione
estesa una funzione che prende uno stato q e una stringa w e restituisce uno stato p\ lo
stato che lautom a raggiunge quando parte nello stato q ed elabora la sequenza di input
w. D efiniam o S per induzione sulla lunghezza della stringa di input com e segue.
A
BASE (q : e) = q. In altre parole, se ci troviam o nello stato q c non leggiam o alcun input,
allora rim aniam o nello stato q.
INDUZIONE S upponiam o che w sia una stringa della form a , ossia a lultim o sim bolo
di w t x Iastrin g a ch e consiste di tutti i sim boli eccetto lultim o.3 Per esem pio w = 1101
si scom pone in x = 110 e a = 1. A llora
^Ricordiamo la convenzione chc abbiamo fissalo, secondo la quale le lettere all'inizio dellalfabeto sono
simboli, mentre quelle verso la tine dell'alfabeto sono stringhe. Tale convenzione necessaria affinch la
proposizione della forma xa " abbia un senso.
S(q,w) = S(5(g,x),a)
53
(2.1)
/V
L a (2.1) pu sem brare contorta, m a il concetto sem plice. P er com putare 5(q, w), calco
liam o prim a S(q. x), lo stato in cui si trova lautom a dopo aver elaborato tutti i sim boli di
w eccetto lultim o. Supponiam o chc questo stato sia p, ossia (q,x) = p. A llora S(q, w)
quanto si ottiene com piendo una transizione dallo stato p su llinput a. lultim o sim bolo
di w. In altri term ini 5(q,w) = (.).
qo: sia il num ero degli 0 sia il num ero degli 1 visti finora sono pari
</i : il num ero degli 0 visti finora pari, m a il num ero degli 1 dispari
q-2: il num ero degli 1 visti finora pari, m a il num ero degli 0 dispari
q%: sia il num ero degli 0 sia I num ero degli 1 visti finora sono dispari.
Lo stato qo nello stesso tem po lo stato iniziale e lunico stato accettante. lo stato
iniziale perch prim a di leggere qualunque input il num ero degli 0 e degli 1 visti sono
entram bi zero, e zero pari. E lunico stato accettante perch descrive esattam ente la
condizione per la quale una sequenza di 0 e di 1 appartiene al linguaggio L.
Siam o ora in grado di specificare un DFA per il linguaggio L:
A=
54
Capitolo 2
* > <7o
1
<72
<73
<72
<73
<7o
<7i
<7i
<7o
<73
<72
S{qo,e) = ft)
(<7o, 1) =
1) = S{q0 , 1) = <?i
55
5 (^ 0 ,1 1 ) = <$(<$(<7o, 1), 1) = % i , l ) = q 0
% 0 , 110) = 5 ( % 0 , 11), 0 ) = ^ 0 , 0 ) =
<5(<7o, 1101) = S(S(q0, H O ), l ) = 5(q2, 1) = 93
qi
2.2.5
II linguaggio di un DFA
L(A) = {w I 6(q0, w) in F }
In altre parole il linguaggio di A l'in siem e delle stringhe w che portano dallo stato
iniziale qo a uno degli stati accettanti. Se L uguale a L(A) per un DFA A , allora
diciam o che L un linguaggio regolare.
56
Capitolo 2
Esempio 2.5 C om e detto in precedenza, se A il DFA d e llE sem pio 2.1, allora L (A )
l insiem e di tutte le stringhe di 0 e di 1 che contengono la sottostringa 01. Se invece A il
DFA d ell'E sem p io 2.4, allora L(A) l'in siem e di tutte le stringhe di 0 e di 1 i cui num eri
di 0 e di I sono entram bi pari.
2.2.6
Esercizi
E se rc iz io 2.2.1 La Figura 2.8 rappresenta una pista per biglie. U n a biglia viene lanciata
a partire da A o da B. Le leve , x 2 e
fanno cadere la biglia a sinistra oppure a destra.
O gni volta che una biglia si im batte in una leva, dopo che la biglia passata la leva si
ribalta, cosicch la biglia successiva prende laltra diram azione.
57
*! Esercizio 2.2.2 A bbiam o definito S scom ponendo la stringa di input in una stringa seguita
da un singolo sim bolo (nella parte induttiva. E quazione 2.1). Inform alm ente possiam o
pensare invece che descriva ci che capita lungo un cam m ino con una certa stringa di
etichette; in tal caso non dovrebbe essere rilevante in che m odo scom poniam o la stringa di
input nella definizione di \ M ostrate che in effetti (q, xy) = (S(q, x), y) per qualunque
stato q e qualunque coppia di stringhe x e y. Suggerimento: svolgete un'induzione su |y |.
/>
~ / /
! Esercizio 2.2.3 D im ostrate che, per qualunque stato q, stringa x e sim bolo di input a,
6(q,ax) = S(S(q,a),x). Suggerimento: usate !'E sercizio 2.2.2.
Esercizio 2.2.4 Definite tre DFA chc accettino i seguenti linguaggi sull'alfabeto {0,1}:
* a) linsiem e di tutte le stringhe che finiscono per 00
b) linsiem e di tutte le stringhe con tre 0 consecutivi (non necessariam ente alla fine)
c) l'insiem e delle stringhe con 011 com e sottostringa.
! Esercizio 2.2.5 Definite quattro DFA che accettino i seguenti linguaggi sullalfabeto
{ 0 .1 } :
a) linsiem e di tutte le stringhe tali che ogni blocco di cinque sim boli consecutivi
contenga alm eno due 0
b) linsiem e di tutte le stringhe il cui decim o sim bolo a partire da destra sia 1
c) l'insiem e delle stringhe che com inciano o finiscono (o entram be le cose) per 01
d) l'insiem e delle stringhe tali che il numero di 0 sia divisibile per cinque e il num ero
di 1 sia divisibile per 3.
!! Esercizio 2.2.6 Definite due DFA che accettino i seguenti linguaggi sullalfabeto {0. 1}:
* a) linsiem e di tutte le stringhe che com inciano con un I e che, interpretate com e
interi binari, siano m ultipli di 5 (per esem pio le stringhe 101. 1010 e 1111 sono nel
linguaggio; 0. 100 c 11 1 invece no)
b) linsiem e di tutte le stringhe che lette al contrario com e un intero binario siano
divisibili p e r5 (esempi di stringhe nel linguaggio sono 0, 10011, 1001 IO O eO lO l).
Esercizio 2.2.7 Sia .4 un DI7A e q uno stato di .4 tale che 6(q. a) = q per tutti i simboli
di input a. D im ostrate per induzione sulla lunghezza d ellinput che, per tutte le stringhe
di input w, 6(q, w) = q.
58
Capitolo 2
E sercizio 2.2.8 Sia A un DFA e a un sim bolo di input di A tale che, per tutti gli stati q di
A, valga S(q, a) = q.
A
A
*B
A
B
1
B
A
Descrivete in termini inform ali il linguaggio accettato da questo DFA e dimostrate per in
duzione sulla lunghezza della stringa di input che la descrizione corretta. Suggerimento:
nel porre l'ipotesi induttiva consigliabile formulare un enunciato su quali input portano
a ciascuno stato, e non solo su quali input portano allo stato accettante.
> *A
*B
C
2.3
0
B
C
C
1
A
A
C
Un autom a a stati finiti non determ inistico (NFA, Nondeterminiatic Finite Automaton) pu
trovarsi contem poraneam ente in diversi stati. Questa caratteristica viene sovente espressa
com e capacit di scom m ettere su certe propriet dellinput. Per esempio, quando un
autom a viene usato per cercare determ inate sequenze di caratteri (come: parole chiave) in
una lunga porzione di testo, utile scom m ettere che ci si trova allinizio di una di tali
59
sequenze e usare una sequenza di stati per verificare, carattere per carattere, che com paia
la stringa cercata. Vedremo un esem pio di questo tipo di ap p lica/io n e nel Paragrafo 2.4.
Prim a di esam inare le applicazioni, necessario definire gli autom i a stati finiti non
determ inistici e m ostrare chc accettano gli stessi linguaggi accettati dai DFA. C om e i
DFA, gli NFA accettano proprio i linguaggi regolari. Tuttavia ci sono buone ragioni per
occuparsi degli NFA. Spesso sono pi succinti e pi facili da definire rispetto ai DFA;
inoltre, anche se sem pre possibile convertire un NFA in un DFA. q u estultim o pu avere
esponenzialm ente pi stati di un NFA. Per fortuna casi di questo tipo sono rari.
2.3.1
C om e un DFA, un NFA ha un insiem e finito di stati, un insiem e finito di sim boli di input,
uno stato iniziale e un insiem e di stati accettanti. Ha anche una funzione di transizione
che chiam erem o <5. La differenza tra DFA ed NFA sta nel tipo di 6. Per gli NFA, <j una
funzione che ha com e argom enti uno stato e un sim bolo di input (com e quella dei DFA),
ma restituisce un insiem e di zero o pi stati (invece di un solo stato, com e nel caso dei
DFA). C om incerem o da un esem pio di NFA e poi passerem o a precisare le definizioni.
E sem p io 2.6 La Figura 2.9 m ostra un autom a a stati finiti non determ inistico con il com
pito di accettare tutte e sole le stringhe di 0 e di 1 che finiscono per 01. Lo stato c/o
lo stato iniziale e possiam o pensare che l autom a si trovi nello stato qo (eventualm ente
insiem e ad altri stati) quando non ha ancora scom m esso che il finale 01 com inciato. E
sem pre possibile chc il sim bolo successivo non sia il prim o del suffisso 01 , anche se quel
sim bolo proprio 0. D unque lo stato qo pu operare una transizione verso se stesso sia su
0 sia su 1 .
V
0, I
S tart
Figura 2.9 Un NFA che accetta tutte le stringhe che finiscono per 0 1 .
Se per il sim bolo successivo 0, lNFA scom m ette anche che iniziato il suffisso 0 1 . Un
altro arco etichettato 0 conduce dunque da qo allo stato c/i. Si noti che ci sono due archi
etichettati 0 in uscita da (70. L'N FA ha l'o p zio n e di andare verso qo oppure verso q\, ed
effettivam ente fa entram be le cose, com e si vedr quando si preciseranno le definizioni.
N ello stato qi lNFA verifica che il sim bolo successivo sia 1, e se cos, passa allo stato
<72 c accetta.
60
Capitolo 2
Si osservi che non ci sono archi uscenti da q\ etichettati 0 e non ci sono affatto archi
uscenti da q>. In tali situazioni il processo attivo dclPN FA corrispondente a quegli stati
sem plicem ente m uore, sebbene altri processi possano continuare a esistere. M entre un
DKA ha soltanto un unico arco uscente da ogni stato per ogni sim bolo di input, un NFA
non ha questi vincoli; nella Figura 2.9. per esem pio, abbiam o visto casi in cui il num ero
di archi zero, uno e due.
t/\
<7|
(b lo c c a to )
V1
\
ch
(bloccato)
0
Figura 2,10 G li stati in cui si trova un NFA m entre viene elaborata la sequenza di input
00101.
La Figura 2.10 illustra com e un NFA elabora gli input. A bbiam o m ostrato che cosa suc
cede quando lautom a della Figura 2.9 riceve la sequenza di input 00101. Esso parte dal
solo stato iniziale, q0. Q uando viene letto il primo 0, l'N FA pu passare allo stato qo e
allo stato q\. In questo m odo fa entram be le cose. I due processi sono raffigurati nella
seconda colonna della Figura 2.10.
A questo punto viene letto il secondo 0. Lo stato qo pu nuovam ente andare sia verso
qo sia verso q\. Lo stato q\, invece, non ha transizioni su 0, perci m uore . Q uando
si presenta il terzo input, un 1, bisogna considerare le transizioni sia da q0 sia da q\.
Troviam o chc qo va solam ente verso qo su 1, mentre q\ va solam ente verso r/2. D unque,
dopo aver letto 001, l'N FA si trova negli stali q0 e q-2 - Poich q uno staio accettante,
lNFA accetta 001.
M a linput non finito. Il quarto sim bolo, uno 0, fa m orire il processo associato a qo,
m entre qo va sia in <70 sia in q \ . Lultim o input, un 1. m anda qo in q0 e q\ in q. Dato che
ci troviam o di nuovo in uno stato accettante, 00101 viene accettato.
2.3.2
Presentiam o ora le nozioni form ali relative agli autom i a stati finiti non determ inisti
ci. Verranno sottolineate le differenze tra i DFA e gli NFA. Un NFA si rappresenta
61
Esempio 2.7 L'NFA della F igura 2.9 pu essere specificato form alm ente com e
({90,51,92}, { 0, 1},M<.>: {92})
dove la funzione di transizione data dalla tabella di transizione della Figura 2 .11. U
I o
-> 90
9i
*92
{ 90, 91}
0
0
1
{90}
{92}
Figura 2.11 Tabella di transizione di un NFA che accetta tutte le stringhe che finiscono
per 01.
Si osservi che la tabella di transizione pu specificare la funzione di transizione tanto per
un NFA quanto per un DFA. L 'unica differenza che ogni voce nella tabella di un NFA
un insiem e, anche se l'in siem e un singoletto, ossia ha un solo m em bro. Inoltre, se
non c alcuna transizione da uno stato su un dato sim bolo di input, la voce adeguata 0,
linsiem e vuoto.
62
Capitolo 2
2.3.3
Com e per i DFA, bisogna estendere la funzione di transizione di un NFA a una funzione
<5 chc prende uno stato q c una stringa di simboli di input ?/;, e restituisce linsiem e degli
stati in cui si trova lNFA quando parte dallo stato q ed elabora la stringa w. Lidea
suggerita nella Figura 2.10; in sostanza, se q lunico stato nella prim a colonna, (q, w)
la colonna di stati successivi alla lettura di w. Per esem pio la Figura 2.10 indica che
(<7o,001) = {qo q-2 } hi term ini formali definiamo <5 per la funzione di transizione S di
un NFA com e segue.
A
BASE
5(q, e) = {<?}. Sc nessun sim bolo di input stato letto, ci troviam o nel solo stato da
A llora (q. w) { n , T2, . . . . r m }. In termini meno form ali com putiam o S(q, w) cal
colando inizialm ente 6(q,x), e poi seguendo le transizioni etichettate a da tutti questi
stati.
A
E sem pio 2.8 U siam o per descrivere com e l NFA della Figura 2.9 elabora linput 00101.
Un com pendio dei passi :
1. S{q0,e) = {qo}
2.
6(qo, 0)
S{qf, 0)
= {<7o,
qi}
2.3.4
63
II linguaggio di un NFA
C om e abbiam o suggerito, un NFA accetta una stringa w se, m entre si leggono i caratteri
di w, possibile fare una sequenza di scelte dello stato successivo che porta dallo stato
iniziale a uno stato accettante. Il fatto che altre scelte per i sim boli di input di u.; con
ducano a uno stato non accettante, oppure non conducano ad alcuno stato (cio che una
sequenza di stati m uoia), non im pedisce a w d iv en ire accettato dalFN FA nel suo insiem e.
Form alm ente, se A = (Q, , ', qo, F) un NFA, allora
L (A ) = {w I (qo, w) n F 0}
_
In altre parole L(A) linsiem e delle stringhe w in * tali che 6(qo,w) contenga alm eno
uno stato accettante.
E sem p io 2.9 Per esem plificare, proviam o in termini form ali che l'N F A della Figura 2.9
accetta il linguaggio L = {u- | w term ina per 0 1 }. La dim ostrazione u n induzione
m utua dei seguenti tre enunciati, chc caratterizzano i tre stati:
A
D ato che il linguaggio di q u estautom a linsiem e delle stringhe w tali che (i/o, w)
contiene <72 (perch 2 lunico stato accettante), Ia dim ostrazione dei tre enunciati, in
particolare di (3), garantisce chc il linguaggio d ellNFA linsiem e delle stringhe chc
finiscono per 01. La dim ostrazione del teorem a un induzione su |it>|, la lunghezza di w,
a partire dalla lunghezza 0 .
BASE Se |tt| --- 0, allora w = c. Lenunciato (1) dice che (qo, ) contiene
ci segue
dalla base della definizione di S. C irca lenunciato (2) sappiam o che e non finisce per 0 e
sappiam o inoltre che S(qo, c) non contiene <71, ancora una volta per la base della definizio
ne di <5. D unque le ipotesi di entram be le direzioni d ellenunciato se-e-solo-se sono false,
e di conseguenza entram be le direzioni d ellenunciato sono vere. La dim ostrazione d e lle
nunciato (3) per w = e. essenzialm ente la stessa della dim ostrazione dellenunciato (2)
presentata sopra.
64
Capitolo 2
INDUZIONE A ssum iam o che w = xa, dove a un sim bolo, 0 oppure 1. Possiam o supporre
che gli enunciati dall( 1) al (3) siano validi per x e dobbiam o dim ostrarli per w. Vale a
dire, assum iam o |u | = + 1, dunque |x | = n. A ssum iam o lipotesi induttiva per ri e
dim ostriam ola per n + 1.
1. Sappiam o che 6(qi),x) contiene qo- Poich esistono transizioni sia su 0 sia su 1 da
qo verso se stesso, ne consegue che anche 6(qo, u;) contiene 0; dunque d enuncia
to (1 ) dim ostrato per w.
A
2. (Se) A ssuim am o che w finisca per , ossia a = 0. P er l'en u n ciato (1) applicato a
x, sappiam o che (qo,x) contiene qo. Poich esiste una transizione da qo a q\ su
input 0, concludiam o che
w) contiene qy.
(Solo-se) Supponiam o che 6(qo,w) contenga qy. Dal diagram m a della Figura 2.9
si ricava che c un solo m odo di raggiungere lo stato q\\ che la sequenza di input
?/; sia della form a rrU. C i sufficiente per dim ostrare la parte solo-se d ellenunciato (2).
3. (Sc) A ssum iam o che w finisca per 01. A llora, se w = xa, sappiam o che a = l e
X finisce per 0. Per lenunciato (2) applicato a x, sappiam o che '((/0,.) contiene
q\. Poich esiste una transizione da q\ a q-2 su input 1. concludiam o che f(qo.w)
contiene qo(Solo-se) Supponiam o che S(qa,w) contenga q-2. Dal diagram m a della Figura 2.9
si deduce che c un solo m odo di giungere nello stato q2 ' che w sia della form a
x l , dove d(<?o,#) contiene q\. Per lenunciato (2) applicato a x, sappiam o che x
finisce per 0. D unque w finisce per 01, e abbiam o dim ostrato lenunciato (3).
A
2.3.5
Ci sono molti linguaggi per i quali pi facile costruire un NFA anzich un DFA, com e il
linguaggio (Esem pio 2.6) delle stringhe che finiscono per 01 ; eppure, per quanto sorpren
dente. ogni linguaggio che pu essere descritto da un NFA pu essere descritto anche da
un DFA. fnoltre il DFA ha in pratica circa tanti stati quanti lNFA, sebbene abbia spesso
pi transizioni. Nel peggiore dei casi, tuttavia, il pi piccolo DFA pu avere 2n stati,
m entre il pi piccolo NFA per lo stesso linguaggio ha solo n stati.
La dim ostrazione che i DFA possono fare le stesse cose degli NFA si serve di u n im
portante costruzione, detta costruzione per sottoinsiem i, in quanto com porta la costru
zione di tutti i sottoinsiem i d ellinsicm e di stati d ellNFA. In generale molte dim ostrazioni
65
o (S ,a )=
|J
SN (p,a)
p in S
Cio, per com putare So(S, a) consideriam o tutti gli stati p in S, rileviam o in quali
insiem i di stati lautom a N va a finire partendo da p e leggendo a, e prendiam o
infine lunione di tutti questi insiem i.
-{ < 7 o }
{<7i}
*{*}
{<7o.<7i}
0
0
{<7o}
{>72}
0
{fiochi
{yo, <71 }
{ M i}
0
{ Qo, <12}
{</0 }
{2 }
{0,tfl}
{9o,<72}
*{<7o. <72 }
*{<7i><72}
*{tfo.<7i.<72}
Figura 2.12 La costruzione com pleta per sottoinsiem i dalla Figura 2.9.
66
Capitolo 2
E sem p io 2.10 Sia N lautom a della Figura 2.9, che accetta tutte le stringhe che finiscono
per 01. Dato che linsiem e di stati di JV
</2}. Ia costruzione per sottoinsicm i
produce un DFA con 2 3 8 stati, corrispondenti a tutti i sottoinsiem i dei tre stati. La F i
gura 2.12 m ostra la tabella di transizione per questi otto stati; vedrem o tra breve i dettagli
su com e le singole voci vengano com putate.
N otiam o che la tabella di transizione appartiene a un autom a a stati finiti determ ini
stico. Anche se le voci nella tabella sono insiemi, gli stati del DFA cos costruito sono
insiem i. Per chiarire questo punto, possiam o inventare nomi nuovi per questi stati, per
esem pio A per 0, B per {</o}i e cos via. La tabella di transizione della Figura 2.13 defini
sce esattam ente lo stesso autom a della Figura 2.12, m a chiarisce che le voci della tabella
sono singoli stati del DFA.
A
- B
C
*D
E
*F
*G
*H
0
A
E
A
A
E
E
A
E
1
A
B
D
A
F
B
D
F
67
Uno dei due insiem i com putati vecchio ; {<70} gi stato considerato. {</0 , 71 },
invece, nuovo e le sue transizioni devono essere calcolate. Troviam o 5o{{qo, q- } ,0 ) =
{</o-<7i} e >({<jo. q-[}, I) = {qo- q-2 } A tito lo d ic s c m p io e sp lic itia m o il secondo calcolo;
sappiam o che
68
Capitolo 2
M f a o h w ) = S\'(q0,w )
Sia |;| 0, ossia w = c. Per le definizioni della base di per i DFA e gli NFA, sia
(2.2)
2= 1
La costruzione per sottoinsiem i, d 'a ltra parte, dice che
k
^D({pi,P2.-.,Pfc}a) I J SN (pt,a)
=1
(2.3)
Serviam oci ora della (2.3) c del fatto che ^d({< 7o } ,.t) =
induttiva della definizione di S per i DFA:
D unque le E quazioni (2.2) e (2.4) dim ostrano che <5d({<7o h w ) = Sn (c/n w). O sservando
/S
che sia D sia N accettano w se e solo se, rispettivam ente, <$>({<7}^) e S;\(qo,w ) con
tengono uno stato in F .v, abbiam o portato a com pim ento la dim ostrazione che L(D ) =
L(N).
69
Sx(qo, w) = {/>}
L asciam o che sia il lettore a farlo. Di conseguenza la stringa w viene accettata da D se e
solo se viene accettata da N ; cio L(D ) - L (N ).
2.3.6
NeNE scm pio 2.10 abbiam o visto chc il DFA non aveva pi stati di quanti ne avesse
lNFA equivalente. C om e gi detto, nella pratica norm ale che il DFA abbia approssim a
tivam ente lo stesso num ero di stati d ell'N F A a partire dal quale stato costruito. Tuttavia
possibile una crescila esponenziale del num ero degli stati; lutti i 2" stati del DFA che si
possono costruire da un NFA di n stati potrebbero risultare accessibili. Il seguente esem
pio non raggiunge il lim ite, m a illustra un caso in cui il pi piccolo DFA equivalente a un
NFA di n + 1 stati ha T 1 stati.
70
Capitolo 2
0, I
0, I
0 ,1
Figura 2.15 Questo NFA non ha alcun DFA equivalente con meno di 2n stati.
Passiam o ora al funzionamento dell'N FA N della Figura 2.15. Esiste uno stato <70 in cui
l NFA si trova sempre, a prescindere dagli input letti. Se linput successivo I, N pu
anche scommettere che questo 1 sar -esimo sim bolo dalla fine, quindi passa allo
stato <7i cos come a qo- Dallo stato <71 qualunque input porta N in q2, linput successivo
lo porta in <73, e cos via, finch, n 1 input dopo, si trova nello stato accettante qn.
Esprim iam o ora lenunciato formale relativo alla condotta degli stati di N.
1. N si trova nello stato qo dopo aver letto una qualunque sequenza di input w.
2. N si trova nello stato </, per i = 1 , 2 , . . . , n, dopo aver letto la sequenza di input
w se e solo se -esimo simbolo dalla fine di tu 1 ; in altre parole w della forma
.\ a-z - a_ i, dove ogni aj un simbolo di input.
Non dim ostrerem o questi enunciati formalmente; la dim ostrazione una facile induzione
su |w |, del tipo illustrato nellEsem pio 2.9. Per com pletare la dimostrazione che lautom a
accetta esattamente le stringhe con un 1 nell-esim a posizione dalla fine, consideriam o
l enunciato (2) con i n , secondo il quale N si trova nello stato qn se e solo se ln esimo sim bolo dalla fine 1. Essendo per qn lunico stato accettante, tale condizione
caratterizza precisamente linsieme delle stringhe accettate da N.
2.3.7
Esercizi
{p^}
Q
r
*.s
{*}
71
^P
*q
T
*<>
{y, }
M
{</}
{CM }
M
0
Esercizio 2.3.3 Convertite il seguente NFA in un DFA e descrivete inform alm ente il
linguaggio che accetta.
-*p
Q
r
*s
*t.
{p? <?}
M
M
m
0
0
{r,s}
{/M I
0
0
Esercizio 2.3.4 Definite automi a stati finiti non determ inistici che accettino i seguenti
linguaggi. Cercate di sfruttare il pi possibile il non determ inism o.
72
Capitolo 2
* a) Linsiem e delle stringhe sullalfabeto { 0 ,1 ,. . . . 9} tali chc la cifra finale sia com
parsa in precedenza.
b) Linsiem e delle stringhe sullalfabeto { 0 ,1 ,. . . . 9} tali che la cifra finale non sia
com parsa in precedenza.
c) Linsiem e delle stringhe di 0 e di 1 tali che esistano due 0 separati da un num ero di
posizioni m ultiplo di 4. Si noti che 0 un m ultiplo di 4.
Esercizio 2.3.5 N ella parte solo-se del Teorema 2.12 abbiam o om esso la dim ostrazione per induzione su |w;| che se <h)(qo, w) = p allora x(qo.w) = {;>}. Fornite tale
W
dim ostrazione.
Esercizio 2.3.6 Nel riquadro su Stati trappola e DFA cui m ancano alcune transizioni
sosteniam o chc, se N un NFA che ha al m assim o una scelta di stato per ogni stato e
sim bolo di input (ossia (q. a) non ha mai pi di un elem ento), allora il DFA D costruito
73
da A con la costruzione per sottoinsiem i ha esattam ente gli stati e le transizioni di JV, pi
le transizioni verso un nuovo stato trappola ogni volta chc a N m anca una transizione per
uno stato c un sim bolo di input dati. D im ostrate questa afferm azione.
Esercizio 2.3.7 N ellE sem pio 2.13 abbiam o afferm ato che lNFA Ar si trova nello stalo
q, per i = 1 , 2 , . . . , n, dopo aver letto la sequenza di input w, se e solo se li-csim o
sim bolo dalla fine di w 1. D im ostrate q u estasserzione.
2.4
In questo paragrafo vedrem o che la trattazione teorica presentata nel paragrafo prece
dente, in cui abbiam o considerato il problem a di decidere se una sequenza di bit finisce
per 01 . in effetti un m odello appropriato per molti problem i reali che si presentano in
applicazioni com e le ricerche nel W eb e il prelievo di inform azioni da un testo.
2.4.1
U n problem a com une n ellera del W eb e di altre raccolte di testi on-line c il seguente:
dato un insiem e di parole, trovare tutti i docum enti che ne contengono una (o tutte). Un
m otore di ricerca un tipico esem pio di tale procedura. Un m otore di ricerca usa una
tecnica particolare, detta indici invertiti, in cui per ogni parola che com pare nel W eb (ci
sono 100.000.000 di parole diverse) viene m em orizzata una lista di tutti i luoghi in cui
questa si incontra. U na m acchina con una m em oria centrale m olto grande pu tenere a
disposizione le liste pi frequenti, consentendo ricerche sim ultanee da parte di pi utenti.
Lc tecniche a indici invertiti non utilizzano gli autom i a stati finiti, m a richiedono
m olto tem po per la copia delle pagine e la preparazione degli indici. E sistono svariate
applicazioni affini per le quali gli indici invertiti non sono adatti, m entre le tecniche fon
date sugli autom i risultano appropriate. Le caratteristiche chc rendono u n applicazione
adeguata alle ricerche che im piegano gli autom i sono due.
1. 11 deposito sul quale viene condotta la ricerca cam bia rapidam ente. Per esem pio:
(a) gli analisti della com unicazione esplorano quotidianam ente le notizie on-linc
del giorno in cerca di argom enti specifici: per esem pio un analista finanziario
potrebbe cercare le sigle di particolari azioni o nom i di aziende
(b) un robot della spesa potrebbe cercare i prezzi correnti degli articoli richiesti
dai suoi clienti; il robot pu recuperare dal Web pagine di catalogo e cercarvi
le parole che indicano il prezzo di un particolare articolo.
2. I docum enti da esam inare non possono essere catalogati. Per esem pio su A m a
zon.com un crawler difficilm ente trover tutte le pagine relative a ogni libro in
74
Capitolo 2
vendita. Tali pagine sono generate dinam icam ente in risposta a u n interrogazio
ne. Si potrebbero allora cercare i libri su un certo argom ento, per esem pio autom i
a stati finiti, e poi nelle pagine trovate cercare determ inate parole, per esem pio
eccellente, nelle recensioni.
2.4.2
S upponiam o che ci venga dato un insiem e di parole, che chiam erem o parole chiave ; vo
gliam o trovare le occorrenze di una qualunque di queste parole. In applicazioni com e
queste utile ideare un autom a a stati finiti non determ inistico che segnali, entrando in
uno stato accettante, di aver Ietto una delle parole chiave. Il lesto di un docum ento vie
ne passato, un carattere alla volta, a llNFA, che vi riconosce le occorrenze delle parole
chiave. D escriviam o una form a sem plice di NFA che riconosce un insiem e di parole
chiave.
1. C uno stato iniziale con una transizione verso se stesso su ogni sim bolo di input,
per esem pio ogni carattere A SC II stam pabile se si sta esam inando un testo. In
tuitivam ente lo stato iniziale rappresenta la "congettura che non abbiam o ancora
com inciato a vedere una delle parole chiave, anche se abbiam o visto alcune lettere
di una di queste parole.
2. Per ogni parola chiave a \a 2 ajt, ci sono k stati, <71, <72, ___ Qk- U na transizione
porta dallo stato iniziale verso <71 sul sim bolo a\, una transizione da <71 verso q2 sul
sim bolo <22, e cos via. Lo stato qi- uno stato accettante e indica chc stata trovata
la parola chiave
(.
Esempio 2.14 Facciam o l'ipotesi di voler ideare un NFA chc riconosca le occorrenze
delle parole w e b e e b a y . Il diagram m a di transizione per lNFA costruito secondo le
regole di cui sopra illustrato nella Figura 2.16. Lo stato 1 lo stato iniziale, c usiam o
per indicare linsiem e di tutti i caratteri A SC II stam pabili. Gli stati dal 2 al 4 hanno il
com pito di riconoscere w e b , m entre gli stati dal 5 a ll 8 riconoscono e b a y .
O vviam ente un NFA non un program m a. Per im plem entare un NFA ci sono in
sostanza due possibilit.
1. Scrivere un program m a che sim uli lNFA com putando linsiem e degli stati in cui
si trova dopo aver letto ogni sim bolo di input. L a sim ulazione illustrata nella
F igura 2.10.
2. Convertire lNFA in un DFA equivalente usando la costruzione per sottoinsiem i,
quindi sim ulare direttam ente il DFA.
S ta rt
75
Alcuni program m i che elaborano testi, com e le form e avanzate del com ando U NIX g r e p
( e g r e p e f g r e p ) , in realt uniscono le due soluzioni. Per i nostri scopi la conversione
in un DFA facile e siam o sicuri che il num ero di stati non cresce.
2.4.3
b) Supponiam o che p sia uno degli stati dellNFA e che venga raggiunto dallo stato
iniziale lungo un cam m ino i cui sim boli sono Qia2 am. Allora uno degli stati
del DFA l insiem e degli stati d ellNFA form ato da:
1. %
2.
76
Capitolo 2
Si noti che in generale nel DFA ci sar uno stato per ogni stato p d ellNFA. Tuttavia
nel passo (b) due stati possono dare com e risultato lo stesso insiem e di stati, e dunque
diventare un solo stato del DFA. Per esem pio, se due delle p arole chiave iniziano con la
stessa lettera, poniam o a , allora i due stati d e llN FA raggiunti da q( con un arco etichettato
a daranno Io stesso insiem e di stati e quindi verranno l'usi nel DFA.
77
stati del DFA, include lo stato iniziale 1; include inoltre lo stato 5, perch a questo stato si
perviene dallo stato 1 attraverso un suffisso, e , della stringa w e, che raggiunge lo stato 3
nella F igura 2.16.
Le transizioni per ognuno degli stati del DFA si possono calcolare conform em ente
alla costruzione per sottoinsiem i. La regola com unque sem plice. Da qualunque insiem e
di stati che includa lo stato iniziale qo e altri stati { p \,p 2 , ,P), si determ ina dove si
sposta lNFA dai p per ogni sim bolo x, e si fa com piere al DFA una transizione etichettata
X verso lo stato che consiste di qo e di tutti gli stali raggiunti dai p sul sim bolo x. Per
ogni sim bolo x tale chc non esistano transizioni uscenti da nessun p, si fa com piere a
questo stato del DFA una transizione su x verso lo stato che consiste di qo e di tutti gli
stati chc vengono raggiunti da i/o n ellNFA seguendo un arco etichettato x.
C onsideriam o per esem pio lo stato 135 della Figura 2.17. LNFA della Figura 2 .16 ha
transizioni sul sim bolo b dagli stati 3 e 5 rispettivam ente verso gli stati 4 e 6 . Perci, sul
sim bolo 6, 135 va verso 146. Sul sim bolo e non esistono transizioni dellNFA in uscita
da 3 o 5, m a c una transizione da 1 a 5. Q uindi, nel DFA, 135 va verso 15 su input e.
A nalogam ente, su input w, 135 va verso 12.
Su ogni altro sim bolo x non ci sono transizioni uscenti da 3 o 5 e lo stato 1 va sola
m ente verso se stesso. D unque esistono transizioni da 135 a 1 su ogni sim bolo in che
non sia b, c o w. A pplichiam o la notazione - b - c w per rappresentare q u est'insiem e
e usiam o rappresentazioni sim ili per gli altri insiemi ottenuti rim uovendo sim boli da .
2.4.4
Esercizi
E sercizio 2.4.1 Ideate gli NFA che riconoscono i seguenti insiem i di stringhe.
* a) a b e , a b d e a a c d . A ssum ete chc lalfabeto sia {a, b, c, d}.
b) 0 1 0 1 , 1 0 1 c O l i .
c) a b , b c e c a . A ssum ete che lalfabeto sia {a. b. c}.
2.5
Presentiam o ora unaltra estensione degli autom i a stati finiti. La novit consiste nellam m ettere transizioni sulla stringa vuota c. E com e se lNFA potesse com piere una
transizione spontaneam ente, senza aver ricevuto un sim bolo di input. Com e il non deter
m inism o. introdotto nel Paragrafo 2.3, anche questa nuova possibilit non am plia la classe
dei linguaggi accettati dagli autom i a stali finiti, m a offre una certa com odit notazionale.
V
78
Capitolo 2
Nel Paragrafo 3.1 vedrem o che gli NFA con r-transizioni, che chiam erem o e-NFA, sono
strettam ente legati alle espressioni regolari e sono utili nel dim ostrare lequivalenza fra la
classe dei linguaggi accettati dagli autom i a stati finiti e quella dei linguaggi specificati da
espressioni regolari.
2.5.1
C om incerem o da una trattazione inform ale degli e-NFA, servendoci di diagram m i di tran
sizione con etichette e. N egli esem pi che seguono, gli autom i accettano le sequenze di
etichette lungo cam m ini dallo stato iniziale a uno stato accettante, considerando com e
invisibili le occorrenze di e, che quindi non contribuiscono a form are le stringhe associate
ai cam m ini.
0 ,1 ,...,9
0 ,1 ,...,9
Esempio 2.16 La Figura 2 . 18 m ostra un e-NFA che accetta num eri decim ali (in notazione
anglosassone) formati da:
1. un segno + o - , facoltativo
2. una sequenza di cifre
3. un punto decim ale
4. una seconda sequenza di cifre.
U na delle due sequenze di cifre (punti (2) e (4)), m a non entram be, pu essere vuota. Di
particolare interesse la transizione da qo a q\ su c, + o . Lo stato q-\ rappresenta quindi
la situazione in cui sono stati letti il segno, se presente, ed eventualm ente delle cifre, m a
non il punto decim ale. Lo stato q2 rappresenta la situazione in cui stato letto il punto
decim ale, preceduto o no da cifre gi lette. In q4 abbiam o letto alm eno una cifra, m a non
79
ancora il punto decim ale. Lo stato q3 si interpreta cos: sono stati letti il punto decim ale
e alm eno una cifra, prim a o dopo di quello. Lautom a pu restare in q:i e leggere nuove
cifre, oppure pu scom m ettere che le cifre sono term inate e spostarsi autonom am ente
nello stato accettante (7.5.
Esempio 2.17 L a strategia delineata n ellEscm pio 2.14 per costruire un NFA che ricono
sca un insiem e di parole si pu sem plificare se si am m ettono le e-transizioni. Per esem pio
l NFA che riconosce le parole w e b e e b a y , illustrato nella Figura 2.16, si pu anche
realizzare m ediante -transizioni, com e nella Figura 2.19. In generale si costruisce una
sequenza com pleta di stati per ogni parola com e se questa fosse lunica da riconoscere, e
si aggiunge un nuovo stato iniziale (lo stalo 9 nella F igura 2.19) da cui si raggiungono,
con e-transizioni, gli stati iniziali degli autom i per le singole parole.
2.5.2
Possiam o rappresentare un e-NFA esattam ente com e un NFA. salvo che per un aspetto:
la funzione di transizione deve incorporare inform azioni sulle transizioni etichettate da e.
Form alm ente denotiam o un c-NFA con A = (Q<E,S,qo,F), dove tutti i com ponenti si
interpretano com e per gli NFA. m entre <5 una funzione che richiede com e argom enti:
1. uno stato in Q
2. un elem ento di U {f }, cio un sim bolo di input o il sim bolo t. Per non fare confu
sione, si richiede che il sim bolo di siringa vuota r non sia un elem ento d ell'alfabeto
.
80
Capitolo 2
Esempio 2.18 L 'e-NFA della F igura 2 .18 specificato form alm ente da
F
( {0) Qi ?
Qo
+ .-
0 ,1 .........9
{ 1 }
{2}
{ 91- 74 }
{93}
{3 }
Q2
0
0
3
<11
<5
0
0
9i
0
0
0
0
0
0
0
{93}
0
0
2.5.3
Epsilon-chiusure
Procediam o nelle definizioni form ali di una funzione di transizione estesa per gli e-NFA.
cos da stabilire le stringhe e i linguaggi accettati da tali autom i, per poi spiegare in che
m odo un e-NFA pu essere sim ulato da un DFA. Prim a, per, dobbiam o introdurre una
nozione calciale: la cosiddetta c-chiusura di uno stato. Inform alm ente, per e-chiudere uno
stato q si seguono tutte le e-transizioni uscenti da q , ripetendo poi l'operazione da tutti gli
stati raggiunti via via, fino a trovare tulli gli siati raggiungibili da q attraverso cam m ini
etichettati solo da e-transizioni. D efiniam o form alm ente F r-ch iu su ra, ECLOSF(e/), in m odo
ricorsivo, com e segue.
BASF Lo stato q appartiene a FCLOSE(g).
INDUZIONE Sc lo stato p appartiene a ECLOSH(y) cd esiste una transizione, etichettata e, da
p a r, allora r appartiene a ECLOSF.(g). Pi precisam ente, sia <5 la funzione di transizione
di un e-NFA; se p appartiene a ECl.OSE(<7 ), allora FCLOSE(r7) contiene anche tutti gli stati
in (, e).
Esempio 2 . 19 N ellautom a della Figura 2 . 18 ogni slato coincide con la propria e-chiusura,
con due eccezioni: ECLOSE((70) = {qo-qi} e FCLOSE(^3) = {q3.qr)}. 11 m otivo che ci
sono soltanto due e-transizioni, la prim a chc aggiunge qi a E C I.O S E ^) e la seconda che
aggiunge <75 a ECLOSE(^3) .
81
L a Figura 2.21 illustra un esem pio pi com plesso. Per questa fam iglia di stati, chc
potrebbe far p an e di un e-NFA. possiam o concludere che
eclo se(I)
= { 1 ,2 ,3 .4 ,6 }
O gnuno di questi stati si pu raggiungere dallo stato 1 lungo un cam m ino etichettato solo
da e. Lo stato 6, per esem pio, si raggiunge con il cam m ino 1 2 3 * 6 . Lo stato 7
non appartiene a ECLOSE(l), p ur essendo raggiungibile da 1, perch il cam m ino deve
passare per larco 4 5, chc non c etichettato c. Il fatto che lo stato 6 sia raggiungibile
anche lungo il cam m ino 1 > 4 5 6, che com prende transizioni con etichette diverse
da e, non rilevante: l'esisten za di un cam m ino fatto di sole e-transizioni sufficiente a
porre lo stato 6 in E C L O S E (l).
2.5.4
T ram ite lc-chiusura facile spiegare il com portam ento di un e-NFA a fronte di una se
quenza di input diversi da e; quindi possiam o definire che cosa significa accettare un
input per un e-NFA.
S upponiam o che E ( Q , , g(), F) sia un r-N FA . D efiniam o anzitutto , la funzio
ne di transizione estesa, che descrive levoluzione per una sequenza di valori d ingresso.
Vogliamo che ( , w) sia linsiem e degli stati raggiungibili attraverso percorsi le cui eti
chette, concatenate, form ano la stringa w. C om e sem pre, le e lungo un cam m ino non
contribuiscono a w. E cco u n adeguata definizione ricorsiva di <5:
/S
BASE 6(q. e) = ECEOSE( 7 ). Se letichetta del cam m ino c c, si possono seguire solo archi
etichettati e uscenti da <7 ; questo proprio il m odo in cui ECLOSE viene definito.
82
Capitolo 2
INDUZIONE Supponiam o che w abbia la form a xa, dove a l'u ltim o sim bolo. Si noti che
a appartiene a , c quindi non pu essere e, che non appartiene a . C alcoliam o (q, w )
com e segue.
A
E sem p io 2.20 C alcoliam o S(q0, 5 . 6 ) per IV-NFA della Figura 2.18. R icapitoliam o i
passi necessari.
<%o, ) = ECLOSE(tfo) = {(7o,9i}
Il valore di
1. Si determ inano per prim a cosa le transizioni su input 5 dagli stati q0 e qi, o tte
nuti in precedenza nel calcolo di (qo, c); in altre parole si calcola (qo, 5 ) U
% i 5 ) = {gi>tf<i}
2. Si applica quindi la e-chiusura ai m em bri d ell'in siem e calcolato al passo (I).
Si ottiene cos ECLOSE(qi) U ECLOSE(^4 ) = ( ^ 1} U { 4 } = {1,(/ 4}. Q uesto
insiem e S(qu, 5). Per i due sim boli successivi si ripetono gli stessi due passi.
Si calcola
5 . ) com e segue.
83
2.5.5
Eliminazione di e-transizioni
D = (Qv- ,
qi). Fo)
UJli L c lo s e (T j ).
84
Capitolo 2
E sem p io 2.21 Vogliamo elim inare le e-transizioni d a lle-NFA della Figura 2.18, che in
seguito chiam erem o E . D a E costruiam o un DFA D. illustrato nella Figura 2.22. Per
chiarezza abbiam o om esso dalla figura lo stato trappola 0 e le transizioni verso di esso. Il
lettore deve im m aginare che per ogni stato rappresentato ci siano transizioni supplem en
tari verso 0 su ogni sim bolo di input per il quale non c c una transizione esplicita. Inoltre
dallo stato 0 parte una transizione verso lo stesso stato per ogni sim bolo di input.
85
A bbiam o cos giustificato gli archi uscenti da {70, q1 } della Figura 2.22. Le altre tran
sizioni si determ inano in m odo sim ile; i dettagli sono lasciati al lettore. Poich 5 l'unico
stato accettante di E, gli stati accettanti di D sono gli stati accessibili che contengono qr>,
cio {3 , 5} e {52,^ 3 <75} indicati da doppi circoli nella Figura 2.22.
T eorem a 2.22 Un linguaggio L c accettato da un c NFA se e solo se L accettato da un
DFA.
DIMOSTRAZIONE (Se) L a prova in questa direzione c facile. Supponiam o che esista un
DFA D tale che L = L(D). Trasform iam o D in un e-NFA E aggiungendo la transi
zione S(q.e) = 0 per ogni stato q di D. Tecnicamente dobbiam o anche trasform are le
transizioni di D sui sim boli di input in NFA-transizioni; per esem pio So(q.a) = p d i
venta Sfr.(q, a ) = {p}. Perci le transizioni di E c quelle di D sono le stesse, m a in E si
stabilisce esplicitam ente che non ci sono e-transizioni.
(Solo se) Sia E = (Q e . , Se . qo. F r ) un e-NFA. A pplichiam o la costruzione per
sottoinsiem i, modificata com e sopra, per generare il DFA
/V
sizione estese di E e D coincidono. Form alm ente, dim ostriam o (</0, w) = (<1, tv)
per induzione sulla lunghezza di tv.
A
e) = So(qo, ()
INDUZIONE Supponiam o w xa, dove a lultimo sim bolo di in, e assum iam o che
l'enunciato valga per x, cio che R(qo, x) = D(qo-x) Siano questi due insiemi di stati
uguali a { p i,p 2 , ,/>*}
Per la definizione di negli o N F A , 6e (qo. w ) Si calcola nel m odo seguente.
A
_
_
_
_
_
_
o(qD*tv), che o({Pi,p 2 , ,Pk},a), coincide con S e Oio, -) Abbiam o cos provato
che <5/3((/0, tv) = o(qo, tv) e com pletato la parte induttiva.
A
86
Capitolo 2
2.5.6
Esercizi
e
0
V
</
{/>}
*r j {<!}
Cl
M
M
W
{</}
M
0
M
0
<1
*r
{ * r}
0
0
M
M
0
{r}
{p\
0
{p,<i}
0
E sercizio 2.5.3 Definite gli e-NFA per i seguenti linguaggi, sfruttando le e-transizioni per
sem plificarli.
a) L 'insiem e delle stringhe com poste da zero o pi a, seguite da zero o pi b, seguite
da zero o pi c.
! b) Linsiem e delle stringhe form ate da 01 ripetuto una o pi volte, o da 010 ripetuto
una o pi volte.
! c) L 'insiem e delle stringhe di 0 e di 1 tali che alm eno uno degli ultimi dieci simboli
sia 1.
2.6
Riepilogo
Bibliografa
87
Diagrammi di transizione, utile rappresentare gli autom i tram ite grafi i cui nodi
corrispondono agli stati e i cui archi, chc denotano le transizioni, sono etichettati
da sim boli di input. L o stato iniziale indicato da una freccia, gli stati accettanti da
doppi circoli.
Linguaggio di un automa: un autom a accetta stringhe. U na strnga accettata se, a
partire dallo stato iniziale, le transizioni corrispondenti a llelaborazione in sequenza
dei sim boli della stringa portano a uno stato accettante. R ispetto a un diagram m a di
transizione, una stringa accettata se letichetta di un cam m ino dallo stato iniziale
a uno stato accettante.
Automi a stati finiti non deterministici (NFA): gli NFA si distinguono dai DFA per
ch possono avere un num ero arbitrario, anche zero, di transizioni con la stessa
etichetta uscenti dallo stesso stato.
Costruzione per sottoinsiemi: trattando gli insiem i di stati di un NFA com e stati di
un DFA, si pu trasform are un NFA in un DFA che accetta lo stesso linguaggio.
e-transizioni: si pu estendere la nozione di NFA am m ettendo transizioni su input
vuoto, cio senza alcun sim bolo di input. Un NFA esteso in questo m odo si pu
trasform are in un DFA chc accetta lo stesso linguaggio.
Applicazioni alla ricerca in testi: gli autom i a stati finiti non determ inistici sono
utili per rappresentare m acchine (pattem-matcher ) che ricercano una o pi parolechiave in una collezione di testi. Questi autom i si possono sim ulare direttam ente
in un program m a, oppure si possono prim a convertire in un DFA, che viene poi
sim ulato.
2.7
Bibliografa
Di solito si ritiene che lo studio form ale dei sistemi a stati finiti prenda le m osse da \2}.
In realt questo lavoro si fondava su un m odello di com putazione a reti neuronali an
zich sugli autom i a stati finiti com e li intendiam o oggi. I DFA usuali furono proposti
indipendentem ente, in diverse varianti, da [1], [3| e 14], Gli autom i non determ inistici e
la costruzione per sottoinsiem i provengono da [5].
I. D. A. Huffm an, T he synthesis o f sequential sw itching circuits, J. Franklin Inst.
257:3-4 (1954), pp. 161-190 e 2 7 5 -3 0 3 .
2. W. S. M cCuIloch, W. Pitts, A logical calculus o f the ideas im m anent in nervious
activity, Bull. Math. Biophysics 5 (1943), pp. I 15-133.
88
Capitolo 2
3. G. H. M ealy, A m ethod for synthesizing sequential circuits, Bell System Technical
Journal 34:5 ( 1955), pp. 1045-1079.
4. E. F. M oore, G edanken experim ents on sequential m achines, in [6J, pp. 129-153.
5. M . O. Rabin, D. Scott, Finite autom ata and their decision problem s, IBM J.
Research and Development 3:2 ( 1959), pp. 115-125.
6. C. E. Shannon, J. M cCarthy, Automata Studies, Princeton Univ. Press, 1956.
Capitolo 3
3.1
Espressioni regolari
Da una descrizione dei linguaggi fondata su un tipo di m acchina, gli automi a stati finiti
determ inistici e no. volgiam o ora l attenzione a una descrizione algebrica: le espressioni
regolari . Scoprirem o che le espressioni regolari definiscono esattam ente gli stessi lin
guaggi descritti dalle varie form e di autom a: i linguaggi regolari. Le espressioni regolari
offrono com unque qualcosa in pi rispetto agli autom i: un m odo dichiarativo di esprim ere
le stringhe da accettare. Perci le espressioni regolari servono da linguaggio di input per
molti sistem i che trattano stringhe. Vediamo alcuni esem pi.
I. I com andi di ricerca, com e g r e p nei sistemi U N IX , o i com andi equivalenti per
la ricerca di stringhe in un brow ser o in program m i per la com posizione di testi.
In tutti questi casi si im piega una notazione sim ile alle espressioni regolari per
90
Capitolo 3
descrivere i pattern che lutente vuole cercare in un file. Un sistem a di ricerca
converte l espressione regolare in un DFA o in un NFA e sim ula lautom a sul file
da esam inare.
2. 1 generatori di analizzatori lessicali, com e Lex c Flex. Un analizzatore lessicale
quel com ponente di un com pilatore chc spezza un program m a sorgente in unit
logiche dette token, com poste da uno o pi caratteri e aventi un significato preciso.
Esem pi di token sono le parole chiave o keyword (ad es., w h i l e ) , gli identifica
tori (ad es., una lettera seguita da zero o pi lettere o cifre) e certi sim boli, com e + o
<=. Un generatore di analizzatori lessicali accetta descrizioni della forma dei token,
in sostanza espressioni regolari, c produce un DFA che riconosce la sequenza dei
token nell'input.
3.1.1
Le espressioni regolari denotano linguaggi. Lespressione regolare 01* + 10* denota per
esem pio il linguaggio form ato da tutte le stringhe com poste da uno 0 seguito da qualsiasi
num ero di 1, oppure da un I seguito da qualsiasi num ero di 0. Poich non abbiam o ancora
spiegato com e interpretare le espressioni regolari, per il m om ento lafferm azione relativa
al linguaggio di tale espressione deve essere accettata sulla parola. Tra breve definirem o
tutti i sim boli usati nellespressione, in m odo da chiarire perch l'interpretazione proposta
quella corretta. Prim a di descrivere la notazione delle espressioni regolari, dobbiam o
conoscere le tre operazioni sui linguaggi rappresentate dagli operatori delle espressioni
regolari. Tali operazioni sono le seguenti.
1. L'unione di due linguaggi L ed M , indicata con L U M , linsiem e delle stringhe
che sono in L oppure in M , oppure in entram bi. Per esem pio se L = { 0 0 1 ,1 0 ,1 1 1 }
e M = {, 001}, allora L U M = {e, 10,001, 111}.
2. La concatenazione dei linguaggi L ed M l'in siem e delle stringhe che si posso
no form are prendendo una qualunque stringa in L e concatenandola con qualsiasi
stringa in M. A bbiam o definito la concatenazione di una coppia di stringhe nel
Paragrafo 1.5.2; una stringa seguita d all'altra per form are il risultato della conca
tenazione. Indichiam o la concatenazione di linguaggi con un punto oppure senza
alcun operatore; loperatore di concatenazione spesso chiam ato punto (dot). Per
esem pio, se L = { 0 0 1 ,1 0 ,1 1 1 } e M = {e, 001}, allora L , o sem plicem ente
L M , {00 1 ,1 0 , 111. 0 0 1 0 0 1 ,1 0 0 0 1 ,1 1 1 0 0 1 } . Le prim e tre stringhe in L M sono
le stringhe in L concatenate con e. D ato che e lidentit per la concatenazione,
le stringhe risultanti sono quelle in L. Le ultim e tre stringhe in L M sono invece
form ate prendendo ogni stringa in L e concatenandola con la seconda stringa in M ,
che 0 0 1 . Per esem pio 10 da L concatenato con 001 da M d 10001 per L M .
Espressioni regolari
91
l La locuzione chiusura di Klccnc fa riferimento a S. C. Kleene. che ide la notazione delle espressioni
regolari c questoperatore.
92
Capitolo 3
3.1.2
Q ualsiasi algebra si form a a partire da alcune espressioni elem entari, di solito costanti
c variabili. Le algebre perm ettono poi di costruire ulteriori espressioni applicando un
determ inato insiem e di operatori alle espressioni elem entari e alle espressioni costruite in
precedenza. A bitualm ente necessario anche un m etodo per raggruppare gli operatori con
i loro operandi, ad esem pio attraverso le parentesi. Per esem plificare, lalgebra aritm etica
com unem ente nota parte da costanti com e gli interi e i num eri reali, pi le variabili, e
costruisce espressioni pi com plesse con operatori aritm etici com e + e x .
Lalgebra delle espressioni regolari segue questo schem a, usando costanti e variabili
che indicano linguaggi c operatori per le tre operazioni del Paragrafo 3.1.1: unione, punto
e star. Possiam o descrivere le espressioni regolari in m aniera ricorsiva, com e segue. In
questa definizione, non solo descriviam o che cosa sono le espressioni regolari lecite, m a
per ogni espressione regolare E descriviam o il linguaggio chc rappresenta, indicandolo
con L(E).
BASE La base consiste di tre parti.
1. Le costanti e e 0 sono espressioni regolari, indicanti rispettivam ente i linguaggi {e}
c 0. In altre parole L(t) {e}, e ( 0 ) 0.
2. Sc a un sim bolo qualsiasi, allora a unespressione regolare. Tale espressione
denota il linguaggio {a}. Cio L ( a ) = {a}. Si noti che si usa il grassetto per indi
care unespressione corrispondente a un sim bolo. La corrispondenza, per esem pio
che a si riferisce ad a, dovrebbe essere evidente.
3. U na variabile, generalm ente una lettera m aiuscola e in corsivo, com e L , rappresen
tante un linguaggio arbitrario.
Espressioni regolari
93
INDUZIONE II passo induttivo consta di quattro parti, una per ognuno dei tre operatori e
una per lintroduzione delle parentesi.
1. Se E ed F sono espressioni regolari, allora E + F u n espressione regolare che
indica lunione di L(E ) e L(F). In altri termini L ( E + F) = L(E) U L(F).
L(E ).
E sem p io 3.2 Scriviam o u n espressione regolare per linsiem e delle stringhe che consi
stono di 0 e 1 alternati. D apprim a sviluppiam o u n espressione regolare per il linguaggio
che consta di una singola stringa 0 1 . Possiam o poi usare l'o p erato re asterisco per ottenere
unespressione per tutte le stringhe della forma 0101 0 1 .
La regola di base per le espressioni regolari ci dice che D e l sono espressioni che indi
cano rispettivam ente i linguaggi {0} e {1}. Se concateniam o le due espressioni, ottenia
m o u n espressione regolare per il linguaggio {01}; questa espressione 01. C om e regola
generale, se vogliam o u n espressione regolare per il linguaggio chc consiste solam ente
della stringa w, usiam o w stesso com e espressione regolare. Si noti chc nellespressione
regolare i sim boli di w saranno scritti di norm a in grassetto, m a il cam biam ento di caratte
re serve solo a distinguere le espressioni dalle stringhe e non dovrebbe essere considerato
significativo.
P er ottenere tutte le stringhe di zero o pi occorrenze di 01, usiamo ora lespressione
regolare (01)*. Si osservi chc m ettiam o prim a tra parentesi Cl per evitare di confonderci
con l'espressione 01*, il cui linguaggio form ato da tutte le stringhe consistenti di uno
0 e di un qualunque num ero di 1. L a ragione di questa interpretazione verr chiarita nel
Paragrafo 3.1.3, m a si pu anticipare brevem ente che lo star ha la precedenza sul punto e
perci largom ento dello star viene selezionato prim a di com piere concatenazioni.
In realt le espressioni regolari in UNIX impiegano il punto per uno scopo completamente diverso, ossia
per rappresentare qualunque carattere ASCII.
94
Capitolo 3
Tuttavia L ((O l)+) non esattam ente il linguaggio che vogliam o, in quanto include solo
le stringhe di 0 e 1 alternati che com inciano per 0 e finiscono per 1, mentre dobbiam o
anche considerare la possibilit che ci sia un 1 a llinizio e uno 0 alla fine. Un m odo pu
essere quello di costruire altre tre espressioni regolari che trattino le altre tre possibilit.
In altre parole (10)* rappresenta le stringhe alternate che com inciano per 1 e finiscono
per 0, 0(10)* pu essere usato per stringhe chc com inciano e finiscono per 0, e 1 (01)* si
im piega per stringhe chc com inciano e finiscono per 1. Lespressione regolare com pleta
(01)* + (10)* + 0 (1 0 )* + 1(01)*
Si faccia attenzione alluso d elloperatore + per effettuare lunione dei quattro linguaggi,
chc nel com plesso danno tutte le stringhe con alternanze di 0 e 1.
Esiste per un altro modo, che produce unespressione regolare diversa e pi conci
sa. R icom inciam o d allespressione (01)*. Se facciam o una concatenazione a sinistra con
l'espressione e + 1, possiam o aggiungere un 1 facoltativo allinizio. A nalogam ente ag
giungiam o uno 0 facoltativo alla fine con lespressione e + 0. Per esempio, ricorrendo alla
definizione delloperatore + :
3.1.3
C om e altre algebre, gli operatori delle espressioni regolari hanno un ordine di precedenza,
il che significa chc gli operatori sono associati ai loro operandi in un ordine particolare. La
Espressioni regolari
95
nozione di precedenza ci fam iliare dalle espressioni aritm etiche ordinarie. Per esem pio
sappiam o che x y + z raggruppa il prodotto x y prim a della som m a, dunque equivalente
allespressione tra parentesi (xy) + z e non allespressione x(y + z ). In aritm etica rag
gruppiam o sim ilm ente da sinistra due operatori uguali, cos x y z equivalente a
(x y) z e non a x (y z). Per le espressioni regolari lordine di precedenza degli
operatori il seguente.
1. Loperatore star ha il livello pi alto di priorit. Vale a dire, si applica solam ente
alla sequenza pi breve di sim boli alla sua sinistra che sia u n espressione regolare
ben form ata.
2. Il successivo, n ellordine di precedenza, la concatenazione o operatore punto .
D opo aver raggruppato tutti gli star con i loro operandi, passiam o agli operatori
di concatenazione con i loro operandi. In altre parole vengono raggruppate in
siem e tutte le espressioni che sono giustapposte (adiacenti, senza alcun operatore
interposto). Dato chc la concatenazione un operatore associativo, non ha im por
tanza in quale ordine raggruppiam o le concatenazioni consecutive, sebbene, do
vendo scegliere, sia consigliabile farlo a partire da sinistra. Per esem pio 012 viene
raggruppato cos: (01)2.
3. Per ultim e vengono raggruppate le unioni (gli operatori + ) con i loro operandi.
D ato chc anche lunione associativa, non im portante in quale ordine vengo
no raggruppate unioni consecutive, anche se si assum er che il raggruppam ento
avvenga a partire da sinistra.
O vviam ente a volte non si desidera che in u n espressione regolare il raggruppam ento se
gua lordine di precedenza degli operatori. In tal caso siam o liberi di usare le parentesi
per raggruppare gli operandi com e ci pare pi opportuno. O ltre a ci non scorret
to neppure m ettere fra parentesi gli operatori che si vogliono raggruppare, anche se il
raggruppam ento desiderato conform e alle regole di precedenza.
E sem p io 3.3 Lespressione 01* + 1 corrisponde a (0 (1 * ))+ 1 . P erp rim o viene raggruppa
to l'operatore star. Poich il sim bolo 1 im m ediatam ente alla sua sinistra c u n espressione
regolare lecita, esso da solo loperando dello star. R aggruppiam o poi la concatenazione
tra 0 e (1*), che produce !espressione (0 (1 * )). Infine loperatore unione connette questa
espressione e quella alla sua destra, che 1.
Si noti che il linguaggio d e llespressione data, raggruppata secondo le regole di pre
cedenza, la stringa 1 pi tutte le stringhe form ate da uno 0 seguito da un qualunque
num ero di 1 (incluso nessuno). Se avessim o scelto di raggruppare il punto prim a dello
star, avrem m o potuto usare le parentesi cos: (01)* + I. Il linguaggio di questespressio
ne la stringa 1 e tutte le stringhe che ripetono 01, zero oppure pi volte. Se volessim o
raggruppare prim a lunione, potrem m o m etterla tra parentesi per produrre lespressione
96
Capitolo 3
3.1.4
Esercizi
3.2
97
Figura 3.1 Piano per la dim ostrazione d ellequivalenza di quattro diverse notazioni per i
linguaggi regolari.
3.2.1
98
Capitolo 3
del DFA, considerando per solo cam m ini chc attraversano un sottoinsiem e lim itato degli
stati. In una definizione induttiva di queste espressioni si com incia da quelle pi sem plici,
che descrivono i cam m ini che non possono passare attraverso nessuno stato (vale a dire,
nodi singoli oppure archi singoli), c per via induttiva si costruiscono le espressioni chc
fanno passare i cam m ini attraverso insiem i di stati via via pi grandi. Alla fine i cam m ini
possono passare attraverso qualunque stato, in m odo che le espressioni generate rappre
sentino tutti i cam m ini possibili. Q uesti concetti sono presenti nella dim ostrazione del
teorem a seguente.
Teorema 3.4 Se L = L(A) per un DFA A, allora esiste u n espressione regolare R tale
che L = L(R).
DIMOSTRAZIONE Supponiam o che gli stati di A siano { 1 , 2 , . . . , n} per un intero n. C o
m unque siano definiti gli stati di A, ce ne saranno n per un n finito, e rinom inandoli ci si
pu riferire agli stati in questo m odo, com e se fossero i primi n interi positivi. Il nostro
prim o e pi difficile com pito consiste nel costruire una collezione di espressioni regolari
che descrivano insiemi via via pi ampi di cam m ini nel diagram m a di transizione di A.
U siam o R i' ^ com e nom e d e llespressione regolare il cui linguaggio linsiem e di
stringhe w tale che w sia l'etich e tta di un cam m ino dallo stato i allo stato j in .4, c il
cam m ino non abbia alcun nodo interm edio il cui num ero sia m aggiore di k. Si noti che i
punti di partenza e di arrivo del cam m ino non sono interm edi; dunque non si richiede che
i e j siano inferiori o uguali a k.
Figura 3.2 Un cam m ino la cui etichetta nel linguaggio d ellespressione regolare R)k].
La F igura 3.2 suggerisce il requisito sui cam m ini rappresentati da
L a dim ensione
verticale rappresenta lo stato, da 1 in basso fino a n in alto; la dim ensione orizzontale
rappresenta il percorso lungo il cam m ino. Si noti che nel diagram m a sia i sia j sono pi
grandi di k, anche se uno di loro o entram bi potrebbero essere uguali a k oppure m inori.
99
Si osservi anche che il cam m ino passa due volte attraverso il nodo k, ma non attraversa
mai uno stato pi alto di k, eccetto chc agli estrem i.
(k)
= a i + a 2 H--------f a*.
Se invece i = j , allora i cam m ini leciti sono il cam m ino di lunghezza 0 c tutti i cicli da
i a se stesso. Poich non ha sim boli lungo il suo percorso, il cam m ino di lunghezza 0
rappresentato d allespressione regolare e. A ggiungiam o perci e alle varie espressioni
stabilite dal punto (a) fino al punto (c). Cos nel caso (a) [nessun sim bolo a] lespressione
diventa e., nel caso (b) fun sim bolo a] lespressione diventa e 4- a, e nel caso (c) [simboli
m ultiplil l'espressione diventa e: + a i + a 2 H----- + a*..
INDUZIONE Supponiam o che esista un cam m ino dallo stato i allo stato j chc non attraversa
nessuno stato superiore a k. B isogna prendere in considerazione due casi.
1. Il cam m ino non passa per lo stato k. In questo caso l etichetta del cam m ino appar
tiene al linguaggio di R ^ ~ l \
2. Il cam m ino passa per lo stato k alm eno una volta. A llora possiam o scom porlo in
segm enti, com e suggerito dalla Figura 3.3. Il prim o segm ento va dallo stato i allo
stato k, senza passare p er k, V ultim o va da k a j senza passare per Ar, e tutti i segm enti
nel m ezzo vanno da k a se stesso senza passare per k. Si osservi che se il cam m ino
passa attraverso k solo una volta, allora non esistono segm enti m ediani, m a solo
un cam m ino da i a k c uno da A: a j . L 'insiem e di etichette per tutti i cam m ini di
IOO Capilolo 3
questo tipo c rappresentato dall'espressione regolare Rk~] >(R^liT 1})* R ^i 1' Tn
altre parole la prim a espressione rappresenta la parte del cam m ino che giunge allo
stato k la prim a volta, la seconda rappresenta la p o r/io n e che va da k a se stesso per
zero, una o pi volte, e la terza espressione rappresenta la parte del cam m ino che
lascia k per lultim a volta c va nello stato j.
Figura 3.3 Un cam m ino da i a j pu essere scom posto in segm enti determ inati dai
passaggi per lo stato k.
Q uando com biniam o le espressioni per i cam m ini dei due tipi descritti sopra, otteniam o
lespressione
Esempio 3.5 Convertiam o il DFA della Figura 3.4 in un espressione regolare. Q uesto
DFA accetta tutte le stringhe chc contengono almeno uno 0. Per capirne la ragione, si noti
che l'autom a va dallo stato iniziale 1 allo stato accettante 2 non appena vede linput 0.
L 'autom a rim ane allora nello stalo 2 su tutte le sequenze di input.
Fxco le espressioni di base per la costruzione del Teorem a 3.4.
itIl
R
Jt12
dx2
W
Z
1
e+ 1
0
( + 0 + 1)
101
S tart
Figura 3.4 Un DFA che accetta tutte Ic stringhe con alm eno uno 0.
Per esem pio
ha il term ine c perche gli stati iniziale c finale sono gli stessi: lo stat 1.
Ha il term ine 1 perche esiste un arco dallo stato 1 allo stato 1 su input 1. Com e ulteriore
esem pio,
0 perche esiste un arco etichettato 0 dallo stalo 1 allo stato 2. Non ci sono
termini e in quanto gli siati iniziale e finale sono diversi. C om e terzo esem pio, abbiam o
che /? 2j ' = 0 perch non esiste nessun arco dallo stato 2 allo stato 1.
O ra dobbiam o passare alla parte induttiva, ossia dobbiam o costruire espressioni pi
com plesse chc prim a prendono in considerazione cam m ini chc passano attraverso lo stato
1 e poi cam m ini che passano attraverso gli stati 1 c 2, cio cam m ini arbitrari. La regola per
il calcolo delle espressioni R ^ i un caso della regola generale data nella parte induttiva
del Teorem a 3.4:
R-IJ
^i = -~i]
R iI0J + $ }( j O * R i{j
(3.1)
Il prospetto della Figura 3.5 riporta le espressioni com putate per sostituzione diretta nella
form ula sopra, seguite da espressioni sem plificate di cui possiam o dim ostrare, attraver
so un ragionam ento ad hoc , che rappresentano lo stesso linguaggio d ellespressione pi
com plessa.
d (1)
Xtn
oU)
p0>
i\2\
p )
K22
Sem plificata
e + l + (e + l ) ( e + l ) * ( 6 + l )
1*
0 + (e + 1)(6 + 1 )-0
0 + 0(e + l)* (e + 1)
e + 0 + 1 + 0(e + 1)*0
e+ 0 + 1
Figura 3.5 Espressioni regolari per i cam m ini che passano solo attraverso lo stato 1.
Per esem pio consideriam o R^2 . La sua espressione Ry2 + R^]1( R t^11)"R\]. che si
ottiene dalla (3.1) sostituendo i = l e j = 2.
Per com prendere la sem plificazione, si osservi il principio generale che se R una
qualunque espressione regolare, allora (e + /?.)* = R*. La giustificazione che am bedue
i m em bri dellequazione descrivono il linguaggio costituito da qualsiasi concatenazione
102
Capitolo 3
di zero o pi stringhe di L(R). Nel nostro caso abbiam o (e 4- I)* = 1*; am bedue le
espressioni denotano un num ero arbitrario di 1. Inoltre (e + 1)1* = 1". A ncora una
volta si pu osservare che entram be le espressioni denotano qualunque num ero di 1
D unque lespressione originale R i1lJ equivalente a 0 4-1*0. Tale espressione denota il
linguaggio che contiene la stringa 0 e tutte le stringhe form ate da uno 0 preceduto da un
num ero arbitrario di 1. Q uesto linguaggio indicato anche d allespressione pi sem plice
1* 0 .
La sem plificazione di R ^ sim ile alla sem plificazione di
appena considerata.
Se sostituiam o nella (3.2) le espressioni semplificate della Figura 3.5, otteniam o le espres
sioni della Figura 3.6. Tale figura m ostra anche le sem plificazioni che seguono gli stessi
principi descritti p e rla Figura 3.5.
'2 )
12
n( 2)
21
o(2)
J t 22
Semplificata
I* -F r 0 ( f 4- 0 4 - 1)*0
l*0 + l*0(e + 0 + l)*(e + 0 + l )
0 + (e + O + l)(e + O+ l)*0
e + 0 + 1 + (e + 0 + l)( + 0 + l)*(e + 0 + 1)
1*
1*0(0+1)*
0
(0 + 1)*
Figura 3.6 Espressioni regolari per i cam m ini chc possono passare attraverso qualunque
stato.
103
Lespressione regolare finale equivalente a llautom a della Figura 3.4 costruita prenden
do lunione di tutte le espressioni in cui il prim o stato lo stato iniziale e il secondo
stato quello accettante. In questo esem pio, con 1 com e stato iniziale e 2 com e unico
stato accettante, abbiam o bisogno solam ente d ellespressione R $ Tale espressione
0 ( 0 -f 1)*, ed di facile interpretazione. Il suo linguaggio consiste di tutte le stringhe
che com inciano con zero o pi 1, poi presentano uno 0, e poi qualunque stringa di 0 e 1.
In altri term ini, il linguaggio tutte le stringhe di 0 e 1 con alm eno uno 0 .
3.2.2
Il m etodo per convertire un DFA in u n espressione regolare, che abbiam o visto nel Pa
ragrafo 3.2.1, funziona sem pre. Q im c il lettore avr notato, esso non dipende dal fatto
che il DFA determ inistico, e si pu applicare anche a un NHA o a un eN F A . Tuttavia la
costruzione deH 'espressione regolare dispendiosa. N on solo dobbiam o costruire circa
n 3 espressioni per un autom a di ri stati, m a, se le espressioni non vengono sem plificate,
Ia lunghezza d e llespressione pu crescere in m edia di un fattore 4 in ognuno degli n
passi induttivi. Le espressioni stesse possono perci raggiungere un num ero di sim boli
d ellordine di 4n .
E siste una soluzione sim ile che evita di svolgere un doppio lavoro in determ inati punti.
Per esem pio tutte le espressioni con apice ( & + 1) nella costruzione del Teorem a 3.4 usano
la stessa sottoespressione ( R ^ Y ' , la scrittura di tale espressione viene dunque ripetuta
ri2 volte.
La costruzione che m ostrerem o ora com porta lelim inazione di stati. Q uando elim i
niam o uno stato s, tutti i cam m ini che passano per s non esistono pi nellautom a. Per
non cam biare il linguaggio d ellautom a dobbiam o includere, su un arco che va direttam ente da a p, le etichette di cam m ini che vanno da q a p attraverso s. Poich lctichctta
di un tale arco pu ora recare stringhe anzich sim boli, e pu esserci arch e un num ero
infinito di tali stringhe, per specificare l etichetta non possiam o sem plicem cntc elencar
le. Fortunatam ente abbiam o a disposizione un m odo facile c finito di rappresentare tutte
queste stringhe: usare u n espressione regolare.
Siam o dunque portati a considerare autom i che hanno com e etichette espressioni re
golari. Il linguaggio d e llautom a l unione, su tutti i cam m ini dallo stato iniziale a uno
stato accettante, dei linguaggi form ati concatenando i linguaggi delle espressioni regolari
lungo un cam m ino. Si noti che questa regola coerente con la definizione di linguaggio
associato a un qualunque tipo di autom a trattato fin qui. O gni sim bolo a, oppure c se
consentito, pu essere pensato com e u n espressione regolare il cui linguaggio una strin
ga singola, {} oppure {c}. Si pu considerare q u estosservazione com e la base della
procedura di elim inazione di stati che passerem o ora a descrivere.
La Figura 3.7 illustra uno stato s generico che sta per essere elim inato. Supponiam o
104
Capitolo 3
che nel lautom a di cui s uno stato, gli stati 1, , . ,Qk siano predecessori di .s e gli
stati p i , p a , . . . . p m siano successori di s. possibile che alcuni dei q siano anche fra i p,
m a supponiam o che .s non si trovi tra i q o i p, anche se esiste un ciclo da s a se stesso,
com e suggerito nella Figura 3.7. M ostriam o anche un espressione regolare su ciascun
arco da uno dei q a .s; lespressione Q 1 etichetta larco uscente da q. In m odo analogo
m ostriam o l espressione regolare P che etichetta l'arco da .s a pt , per ogni i. M ostriam o
un ciclo su s con etichetta S. Infine esiste una espressione regolare Rij su ll'arc o da
a p 7, per tutti i valori i e j . Si osservi che alcuni di questi archi possono non esistere
nellautom a. In questo caso possiam o pensare che lespressione su tali archi sia 0.
La Figura 3.8 illustra che cosa succede quando si elim ina lo stato .s: tutti gli archi che
lo toccano sono cancellati. Per com pensare, introduciam o per ogni predecessore qt e ogni
successore pj di s u n espressione regolare, che rappresenta tutti i cam m ini che partono
105
da Qi, vanno a .s, eventualm ente com piono un ciclo attorno a s zero o pi volte, c infine
vanno a pj. Lespressione per questi cam m ini Q iS*Pj. Tale espressione viene aggiunta
(con loperatore di unione) all'arco da ql a pj. Se non esiste alcun arco </ > pj, ne
introduciam o prim a uno con lespressione regolare 0.
D escriviam o la strategia per costruire u n espressione regolare a partire da un autom a
a stati finiti.
1. Per ogni stato accettante q applichiam o il processo di riduzione m enzionato so
pra per produrre un autom a equivalente con le etichette sugli archi costituite da
espressioni regolari. Elim iniam o tutti gli stati eccetto q e lo stato iniziale qo.
2. Sc q ft, allora il risultato un autom a a due stati sim ile a quello della Figu
ra 3.9. Lespressione regolare per le stringhe accettale si pu descrivere in vari
m odi, uno dei quali (R + SU * T )* S U *, che possiam o spiegare cos: possiam o
andare dallo stato iniziale verso se stesso per un num ero arbitrario di volte seguendo
una sequenza di cam m ini le cui etichette sono in L (R ) oppure in L(SU*T). Le
spressione SU *T rappresenta i cammini che vanno nello stato accettante lungo un
cam m ino in L ( S ) . eventualm ente ritornano pi volte allo stato accettante attraverso
una sequenza di cam m ini con etichette in L(U ), e poi tornano allo stato iniziale con
un cam m ino la cui etichetta in L(T). A questo punto dobbiam o passare allo stato
106
Capitolo 3
accettante senza pi tornare allo stato iniziale, seguendo un cam m ino con u n eti
chetta in L(S). U na volta nello stato accettante, possiam o ritornarci tutte le volte
che vogliam o seguendo un cam m ino la cui etichetta in L(U).
Esempio 3.6 C onsideriam o lNFA della Figura 3.11, che accetta tutte le stringhe di 0 e 1
che hanno 1 in penultim a o terzultim a posizione. Il prim o passo consiste nel convertirlo
in un autom a con espressioni regolari com e etichette. D ato che non stato elim inato
alcuno stato, dobbiam o soltanto sostituire le etichette 0,1" con lespressione regolare
equivalente O-F 1. 11 risultato illustrato nella Figura 3.12.
Per prim a cosa elim iniam o lo stato t. Poich tale stato non lo stato accettante n lo
stato iniziale, non si trover in nessuno degli autom i ridotti. Elim inandolo subito, prim a
di sviluppare i due autom i ridotti che corrispondono agli stati accettanti, possiam o perci
risparm iarci del lavoro.
107
0,1
Figura 3.11 Un NFA che accetta stringhe che hanno un 1 in penultim a o terzultim a
posizione.
0 + 1
Figura 3.12 Lautom a della F ig u ra 3.11 con espressioni regolari com e etichette.
0+1
108
Capitolo 3
A questo punto dobbiam o prendere due strade distinte, elim inando gli stati C e D in
riduzioni separate. 1 m eccanism i per elim inare lo stato C sono sim ili a quelli impiegati
sopra per elim inare lo stato B c lautom a che ne deriva illustrato nella Figura 3.14.
0 + 1
(0 + 1 )* 1 (0 + 1) + ( 0 + 1 ) - 1 ( 0 + 1 )(0 + 1).
109
0 + 1
3.2.3
C om pleterem o ora il piano della Figura 3.1 m ostrando che ogni linguaggio L che sia
uguale a L( R) per un espressione regolare R anche uguale a L (E ) per un e-NFA E. L a
dim ostrazione u n induzione strutturale su llespressione R. C om inciam o costruendo gli
autom i per le espressioni di base: singoli sim boli, e e 0. M ostriam o poi com e com binare
questi autom i in autom i pi grandi chc acccttano lunione, la concatenazione o la chiusura
dei linguaggi accettati da autom i pi piccoli.
Tutti gli autom i chc costruiam o sono r-N FA con un unico stato accettante.
HO
Capitolo 3
Zr
**-
.....
'
(a)
(b)
\
f
Cl
V__
J
(C)
INDUZIONE L c tre parti d e llinduzione sono rappresentate nella Figura 3.17. Supponiam o
che lenunciato del teorem a sia vero per le sottoespressioni im m ediate di una data espres
sione regolare; vale a dire, i linguaggi di tali sottoespressioni sono anche i linguaggi di
c-NFA con un solo stato accettante. Ci sono quattro casi.
S......
-O
\ S'
8
-O
1
V
111
.
5
(b)
112
Capitolo 3
primo automa diventa I nuovo stato iniziale, e lo stato accettante del secondo auto
ma diventa lo stalo accettante dellautoma complessivo. L'idea che un cammino
dallo stato iniziale a quello accettante deve attraversare prima lautoma per R se
guendo un cammino etichettato da una stringa in L(R), e poi quello per S seguendo
un cammino etichettato da una stringa in L(S). Quindi i cammini nellautoma della
Figura 3.17(b) sono tulli e soli quelli etichettati dalle stringhe in L(R)L(S).
Cd)
(b)
Start
(c)
^
113
114
Capitolo 3
rappresentato nella Figura 3.18(c). Osserviamo che questo r-NFA, una volia rimosse Ic
e-transizioni, somiglia all'automa molto pi semplice della Figura 3.15, che accetta anche
le stringhe con un 1 in penultima posizione.
3.2.4
Esercizi
Ql
<12
<12
<13
Ql
*<?3
(13
Q-2
- Qi
Q2
*<?3
(12
Qi
<12
Qs
<.13
Ql
Le soluzioni alle parti (a), (b) ed (e) non sono disponibili per questesercizio.
Esercizio 3.2.3 Convertite il seguente DFA in un'espressione regolare usando la tecnica
di eliminazione di stati del Paragrafo 3.2.2.
0
* *p
P
$
115
116
Capitolo 3
! Esercizio 3.2.8 Scrivete un algoritmo che prenda un DFA A c computi il numero delle
stringhe di lunghezza n (per un dato n, non correlato con il numero di stati di .4) accettate
da .4. L'algoritmo dovrebbe essere polinomiale sia in n sia nel numero degli stati di A.
Suggerimento: usate la tecnica seguita nella costruzione del Teorema 3.4.
3.3
3.3.1
(lk
117
Possiamo inserire un intervallo della forma x-y tra le parentesi quadre per indica
re tutti i caratteri da x a y nella sequenza ASCII. Poich i codici delle cifre sono
progressivi, come quelli delle lettere maiuscole e minuscole, possibile esprimere
molte classi rilevanti di caratteri in poche battute. Per esempio le cifre si possono
esprimere con [0-9], le lettere maiuscole con [A-Z], e linsieme di tutte le lette
re e cifre con [A-Za-zO-9 ]. Se vogliamo includere un segno meno nellelenco
dei caratteri possiamo collocarlo al primo o allultimo posto, in modo da non con
fonderne luso per la formazione di una serie di caratteri. Per esempio linsieme
delle cifre, pi il punto, il pi e il meno, utilizzati per formare numeri decimali con
segno, si rappresenta con [-+ . 0-9 ]. Le parentesi quadre o altri caratteri che han
no signilicati speciali nelle espressioni regolari di UNIX si possono rappresentare
come caratteri facendoli precedere da una barra obliqua rovesciata (\).
Esistono notazioni speciali per molte delle pi comuni classi di caratteri.
esempio:
Per
Capitolo 3
118
3.3.2
Analisi lessicale
Una delle prime applicazioni delle espressioni regolari riguarda la specifica del compo
nente di un compilatore denominato analizzatore lessicale. Questa componente scone
il programma sorgente e riconosce tutti i token, ossia quelle sottostringhe di caratteri con
secutivi che formano una unit logica. Le parole-chiave e gli identificatori sono esempi
tipici di token, ma ne esistono molti altri.
11 comando Ie x di UNIX e f le x . Ia sua versione GNU, accettano come input una
lista di espressioni regolari nello stile di UNIX, ciascuna seguita da una sezione di codice
tra parentesi che indica che cosa deve fare lanalizzatore lessicale quando trova un token di
quel tipo. Tale strumento detto generatore di analizzatori lessicali, perch prende come
input la descrizione ad alto livello di un analizzatore lessicale e ne trae una funzione che
un analizzatore lessicale funzionante.
Comandi come le x e f l e x si sono rivelati utilissimi: la notazione delle espressioni
regolari infatti proprio quella adeguala a descrivere i token. Per generare una funzione
efficiente che scompone il codice sorgente in token, questi comandi sfruttano il proces
so di conversione da espressione regolare a DFA. In questo modo limplementazione di
un analizzatore lessicale si riduce al lavoro di un pomeriggio. Prima dello sviluppo di
strumenti basati sulle espressioni regolari ci volevano mesi per generarlo manualmente.
Inoltre, se per una ragione qualsiasi si rende necessario modificare un analizzatore lessi
cale, spesso basta cambiare una o due espressioni regolari anzich doversi addentrare nei
meandri del codice per correggere un errore.
Esempio 3.9 Nella Figura 3.19 illustrato un esempio di input parziale al comando lex,
con la descrizione di alcuni token presenti nel linguaggio C. La prima riga tratta la parolachiave else: lazione consiste nel restituire una costante simbolica (ELSE in questo
caso) al parser per lulteriore elaborazione. La seconda riga contiene unespressione
regolare che descrive gli identificatori: una lettera seguita da zero o pi lettere o cifre.
Lazione consiste innanzitutto ncllinserire lidentificatore nella tabella dei simboli, se non
119
gi presente; Ie x isola il token trovato in un buffer, in modo tale che questo segmento
di codice sappia esattamente quale identificatore stato trovato. Infine lanalizzatore
lessicale restituisce la costante simbolica ID, scelta in questesempio per rappresentare
gli identificatori.
else
( r e t u r n ( E L S E ) ;}
[A-Za - z] [ A - Z a - z O - 9 ]*
{codice p e r inserire
l ' i d e n t i f i c a t o r e trovato
n ella t a b e l l a dei simboli;
return (I D ) ;
}
>=
{r e t u r n ( G E ) ;}
( r e t u r n (EQ)
120
Capitolo 3
priorit alla prima espressione nella lista. Dunque, se vogliamo che parole-chiave come
e ls e siano riservate (ossia non fruibili come identificatori), sufficiente elencarle prima
del lespressione per gli identificatori.
3.3.3
Nel Paragrafo 2.4.1 abbiamo spiegato come gli automi possano essere usati per cercare
efficientemente un insieme di parole in un grande archivio come il Web. Anche se gli
strumenti e le tecniche impiegate a questo fine non hanno raggiunto un grado di sviluppo
paragonabile a quello degli analizzatori lessicali, la notazione delle espressioni regolari
un mezzo efficace per descrivere la ricerca di pattern interessanti. Come per gli ana
lizzatori lessicali, la possibilit di passare dalla notazione, naturale e descrittiva, delle
espressioni regolari a un'implementazione efficiente, basata sugli automi, consente un
significativo salto concettuale.
Le espressioni regolari si sono rivelate utili alla soluzione del problema generale di
descrivere una classe di pattern testuali definita in modo approssimativo. Lindetermina
tezza della descrizione in pratica garantisce che allinizio il pattern non sar descritto in
termini corretti, e forse non lo sar mai. Grazie alle espressioni regolari diventa facile de
scrivere i pattern ad alto livello con poca fatica, e modificare rapidamente la descrizione
quando le cose vanno male. Per trasformare le espressioni in codice eseguibile, utile
disporre di un compilatore di espressioni regolari.
Vediamo ora un dettagliato esempio del tipo di problema che si presenta in molte
applicazioni Web. Supponiamo di voler scorrere un numero elevato di pagine Web per
individuare indirizzi. Potremmo voler creare una mailing list oppure classificare esercizi
commerciali secondo la loro posizione, in modo da poter soddisfare richieste come trova
un ristorante a non pi di dieci minuti di auto dal punto in cui mi trovo ora.
Ci concentriamo in particolare sul riconoscimento di indirizzi. Che cos un indirizzo?
Dobbiamo dare una risposta, c se mettendo alla prova il software scopriamo chc manca
no alcuni casi, dobbiamo modificare lespressione per recuperarli.4 Per cominciare, un
indirizzo finir probabilmente con Street o con la sua abbreviazione, St. Tuttavia esi
stono anche Avenues e Roads, c anche questi potrebbero venire abbreviati. Possiamo
dunque usare come pane finale della nostra espressione regolare:
S t r e e t | S t \ . |A v e n u e |A v e \ . |R o a d | R d \ .
Qui abbiamo usalo la notazione in stile UNIX, con la barra verticale anzich + come
operatore di unione. Notiamo che i punti sono preceduti dalla barra rovesciata, poich
nelle espressioni di UNIX il punto ha il significalo speciale di qualunque carattere, e in
questo caso vogliamo il punto vero e proprio per chiudere le tre abbreviazioni; la barra
annulla il significato speciale del simbolo che la segue.
4Mantcniamo l esempio originale, che fa riferimento a indirizzi nordamericani.
121
Un'indicazione come Street devessere preceduta dal nome della via. Di solito il
nome c una lettera maiuscola seguita da alcune lettere minuscole. Possiamo descrivere
questo schema con lespressione di UNIX [A-Z] [a-z] *. Alcune vie. per, hanno un
nome composto da pi parole, come Rhode Island Avenue a Washington. Dopo esserci
resi conto clic mancano gli indirizzi cos congegnati, possiamo rivedere la descrizione e
trasformarla in
' [ A- Z ] [ a - z ] *{ [ A- Z ][a-z]*)*'
Questa espressione comincia con un gruppo formato da una lettera maiuscola e zero
o pi lettere minuscole. Seguono quindi zero o pi gruppi formati da uno spazio, unaltra
lettera maiuscola e zero o pi lettere minuscole. Lo spazio un carattere normale nelle
espressioni di UNIX, ma per evitare che lespressione possa apparire come due espres
sioni separate da uno spazio in una riga di comando dobbiamo collocare gli apici prima e
dopo. Kssi non fanno parte dellespressione. Ora dobbiamo includere il numero civico co
me parte dellindirizzo. La maggior parte dei numeri civici sono formati da una sequenza
di cifre. Alcuni per sono seguiti da una lettera, come in 123A Main St.". Dunque lespressione per i numeri ha una lettera maiuscola opzionale che segue: [0-9 ] + [A-Z] ?.
Si noti che ricorriamo alloperatore di UNIX + per una o pi cifre c alloperatore ? per
zero o una lettera maiuscola. Lintera espressione per gli indirizzi :
' [ 0 - 9 ] + [ A- Z ] ?
[A-Z][a-z]*(
[A-Z][a-z]*)*
122
3.3.4
Capitolo 3
Esercizi
3.4
Per mantenere sotto controllo la dimensione delle espressioni regolari, abbiamo visto nellEsempio 3.5 che necessario semplificarle. Abbiamo quindi fornito alcune argomenta
zioni ad hoc per spiegare per quali ragioni unespressione pu essere sostituita da unaltra.
In tutti i casi il punto fondamentale in discussione riguardava il fatto che le due espres
sioni erano equivalenti, nel senso che definivano gli stessi linguaggi. In questo paragrafo
forniremo una raccolta di propriet algebriche che spostano Ia questione dellequivalenza
di due espressioni regolari a un livello pi alto. Invece di esaminare espressioni regola
ri specifiche, prenderemo in considerazione coppie di espressioni regolari con variabili
come argomenti. Due espressioni con variabili sono equivalenti se generano lo stesso
linguaggio per qualsiasi sostituzione delle variabili con linguaggi.
Consideriamo un esempio di questo processo nell'algebra dellaritmetica. Un conto
dire che 1 + 2 = 2 + 1: in questo caso siamo di fronte alla propriet commutativa
dell'addizione. che si pu verificare facilmente applicando l'operatore di addizione a en
trambi i membri, ottenendo 3 = 3. Ma la propriet commutativa dell'addizione dice di
pi: afferma infatti che x + y = y + x, dove x e y sono variabili che possono essere
sostituite da due numeri qualsiasi. In altre parole Ia somma di due numeri qualsiasi d lo
stesso risultato a prescindere dal loro ordine.
Come per le espressioni aritmetiche, esistono propriet per le espressioni regolari.
Molte di esse sono simili a quelle aritmetiche, se si considera lunione come somma e
la concatenazione come prodotto. Tuttavia in alcuni punti lanalogia non regge, ed esi
stono anche propriet valide per le espressioni regolari chc non hanno corrispondenza in
123
3.4.1
Associativit e commutativit
3.4.2
Identit e annichilatori
Un 'identit per un operatore c un valore tale che, quando loperatore viene applicato al
l'identit e a un altro valore, il risultato laltro valore. Per esempio 0 lidentit per
Ciipitolo 3
124
3.4.3
Propriet distributive
Una propriet distributiva coinvolge due operatori e afferma che un operatore pu essere
applicato a ogni argomento dellaltro operatore individualmente. Lesempio pi comu
ne nel laritmetica la propriet distributiva della moltiplicazione rispetto alladdizione:
X X (y -I- z) = x x y + x x z. Dato che la moltiplicazione commutativa, non ha im
portanza se la moltiplicazione c a sinistra o a destra della somma. Esiste una propriet
analoga per Ie espressioni regolari, che dobbiamo per enunciare in due forme, vislo che
la concatenazione non commutativa.
U M 4- N) = LM + LN. Questa la propriet distributiva sinistra della conca
tenazione sull 'unione.
(M F Ar) L = M L + NL. Questa la propriet distributiva destra della concate
nazione sull unione.
Dimostriamo la propriet distributiva destra: per Faltra si procede in modo analogo. La
dimostrazione riguarder esclusivamente linguaggi e non dipender dalla presenza di
espressioni regolari nei linguaggi.
125
L (M U N ) = L M U L N
DIMOSTRAZIONE La dimostrazione simile a quella di unaltra propriet distributiva che
abbiamo visto nel Teorema 1.10. Dobbiamo dimostrare che una stringa vie in L (M U N)
se e solo se in L M U LN.
(Solo se) Se w in L (M U Ar), allora w = xy, dove x in Le ye in M oppure in Ar. Se
y in M , allora xy in L M , c dunque in L M U LN . Analogamente, se y in A\ allora
xy c in LN , e dunque in L M U LN .
(Se) Supponiamo che w sia in L M U LN . Allora w in L M oppure in LN. In primo
luogo supponiamo che w sia in L M . Allora w = xy, dove x in L t y e in M . Dato che
y in M , anche in M U N. Dunque xy in L (M U N). Se w non in L M , allora
sicuramente in LN, c unargomentazione analoga dimostra che in L (M U Ar).
Esempio 3.12 Consideriamo l'espressione regolare 0 + 01*. Possiamo raccogliere 0 dal
l'unione, ma prima dobbiamo riconoscere che l'espressione 0 stessa effettivamente la
concatenazione di 0 con altro, vale a dire e. In altre parole, usiamo la propriet dcllidcntit per la concatenazione per sostituire 0 con 0f. ottenendo lespressione Oc-fOl*. A questo
punto, applicando la propriet distributiva sinistra otteniamo Tcspressione 0(e + 1*). Se
inoltre riconosciamo che e in /1(1*), allora osserviamo che e. + I* = 1*. e possiamo
semplificarla in 01*.
3.4.4
La propriet di idempotenza
Un operatore si dice idempotente se il risultato della sua applicazione a due valori uguali
lo slesso valore. 1 comuni operatori aritmetici non sono idempotenti; generalmente
x+x x, cos come xxx x (sebbene esistano alcuni valori di x per cui l'uguaglianza
valida, come 0+0 = 0). Lunione e lintersezione sono invece esempi comuni di operatori
idempotenti. Per le espressioni regolari possiamo perci enunciare la seguente propriet.
L + L = L. La propriet dell'idempotenza per l unione afferma che lunione di
due espressioni identiche equivale a una singola copia dellespressione.
3.4.5
Alcune propriet riguardano gli operatori di chiusura e le loro varianti in siile UNIX, + e
?. Ne presentiamo un elenco e spieghiamo per quali motivi sono valide.
( L* )* = L*. Questa propriet afferma che chiudere unespressione che gi chiusa
non cambia il linguaggio. Il linguaggio di (L*)* composto da tutte le stringhe
126
Capilolo 3
create concatenando stringhe nel linguaggio di L*. Ma tali stringhe sono a loro
volta composte da stringhe tratte da L. Perci anche una stringa in (L*)* una
concatenazione di stringhe da L, ed quindi nel linguaggio di L*.
LL * = L e + LL + LLL 4- LLLL +
3.4.6
Ognuna delle propriet menzionate sopra stata dimostrata, in termini formali o infor
mali. D'altra parte si potrebbero congetturare infinite altre propriet. Esiste un metodo
generale chc facilita la dimostrazione delle propriet valide? Scopriamo che in effetti la
validit di una propriet si riduce a una questione di uguaglianza di due linguaggi specifci. E interessante che la tecnica sia strettamente connessa agli operatori delle espressioni
regolari e non si possa estendere a espressioni con altri operatori, come l'intersezione.
Per entrare nel vivo di questo metodo, consideriamo una presunta propriet, come
V
127
128
Capitolo 3
poniamo Lji, e la siringa Qj l Gj3 ajk nel linguaggio L(C). In termini meno formali,
possiamo costruire L(E) cominciando da una stringa in L(C), poniamo 7, 72 Cijh, e
sostituendo a ognuno degli ah una stringa del linguaggio Lji corrispondente.
DIMOSTRAZIONE La dimostrazione un'induzione strutturale sullespressione
E.
base
3.4.7
Possiamo ora enunciare e dimostrare il metodo per verificare la validit di una propriet
relativa alle espressioni regolari. Per verificare se E = F vero, dove E ed F sono due
espressioni regolari con lo stesso insieme di variabili, si procede in questo modo.
1. Si convertono E ed F nelle espressioni regolari concrete C e D, sostituendo ogni
variabile con un simbolo concreto.
2. Si verifica se L(C) = L(D). Se cos, allora E = F c una propriet valida; se in
vece non cos, allora la propriet falsa. Si tenga conto che fino al Paragrafo 4.4
non tratteremo la procedura per verificare se due espressioni regolari denotano lo
stesso linguaggio. Tuttavia, per stabilire luguaglianza di due particolari linguaggi
possibile usare strumenti ad hoc. Ricordiamo che se i linguaggi non sono identici
sufficiente fornire un controcsempio: una stringa che sia in un linguaggio ma non
nellaltro.
129
Teorema 3.14 11 metodo descritto sopra individua correttamente le propriet valide per le
espressioni regolari.
DIMOSTRAZIONE Mostreremo che L(E) = L(F) per ogni sostituzione di linguaggi alle
3.4.8
Esercizi
S = S 4 R.
b) (R 4- S) + T = R + (S 4- T).
c)
(RS)T = R(ST).
d) R(S 4- T) = RS 4- RT.
Capitolo 3
130
e) (R + S)T = RT + ST.
* f) (R*)* = R*.
g) ( + )* = R*.
h) (RxS*)* = ( R + S )*.
Esercizio 3.4.2 Dimostrate o confutate i seguenti enunciati su espressioni regolari.
*a)
{R + S)* = R* + S*.
(RS
+ /?)*
RS = (RR*S)*.
d) (R + S)*S = (R*Sy.
e) S(RS + S)*R = RR*S(RR*S)*.
Esercizio 3.4.3 NellEsempio 3.6 abbiamo sviluppato lespressione regolare
Riepilogo
131
Esercizio 3.4.4 A llinizio del Paragrafo 3.4.6 abbiamo svolto parte di una dimostrazione
che (LxM x)* = (L 4- M )*. Completate la dimostrazione mostrando che le stringhe in
(LxM x)* sono anche in (L 4- M)*.
Esercizio 3.4.5 Completate la dimostrazione del Teorema 3.13 trattando i casi in cui
l'espressione regolare E della forma F G oppure della forma F*.
3.5
Riepilogo
Espressioni regolari: notazione algebrica che descrive esattamente gli stessi lin
guaggi definiti dagli automi a stali finiti: i linguaggi regolari. Gli operatori delle
espressioni regolari sono unione, concatenazione (o punto) e chiusura (o star).
Le espressioni regolari nella pratica: molti comandi di sistemi come UNIX usa
no un linguaggio delle espressioni regolari esteso dotato di scorciatoie per molte
espressioni comuni. Le classi di caratteri permettono di esprimere agevolmente in
siemi di simboli, mentre gli operatori come uno-o-pi e al-massimo-uno accrescono
gli usuali operatori delle espressioni regolari.
Equivalenza di espressioni regolari e automi a siati finiti: possiamo convertire un
DFA in un'espressione regolare per mezzo di una costruzione induttiva in cui si
creano espressioni per Ic etichette di cammini che possono passare attraverso in
siemi di stati sempre pi grandi. In alternativa possiamo usare una procedura di
eliminazione di stati per costruire l'espressione regolare per un DFA. Nell'altra di
rezione possiamo costruire ricorsivamente un e-NFA da un'espressione regolare e
poi eventualmente convertirlo in un DFA.
Lalgebra delle espressioni regolari: sebbene esistano differenze, le espressioni
regolari obbediscono a molte delle leggi algebriche dell'aritmetica. Unione e con
catenazione sono associative, ma solo lunione commutativa. La concatenazione
distributiva rispetto allunione. L'unione idempotente.
Verificare identit algebriche: possiamo stabilire se unequivalenza di espressioni
regolari con variabili come argomenti vera rimpiazzando le variabili con costanti
distinte e verificando se i linguaggi che ne risultano sono gli stessi.
3.6
Bibliografia
132
Capitolo 3
che abbiamo presentato qui si deve invece a McNaughton e a Yamada ([4]). Il metodo per
verificare identit relative alle espressioni regolari trattando le variabili come costanti
stato pubblicato da J. Gischer f2J. In questo lavoro si dimostra anche una propriet ritenuta
patrimonio comune: che laggiunta di altre operazioni, come lintersezione o lo shujfle
(vedi Esercizio 7.3.4), invalida il metodo, anche se la classe dei linguaggi rappresentabili
non si allarga.
Ancora prima di sviluppare UNIX. Ken Thompson aveva studiato l'impiego delle
espressioni regolari in comandi come g re p ; il suo algoritmo per il trattamento di questi
comandi compare in [5J. Gi dalle prime fasi di sviluppo di UNIX, diversi altri comandi,
come le x , idealo da M. Lesk. sfruttavano la notazione delle espressioni regolari estese.
Una descrizione di le x e di altre tecniche fondate sulle espressioni regolari si trova in
[ 11.
1. A. V. Aho, R. Sethi, J. D. Ullman. Compilers: Principles, Techniques, and Tools,
Addison-Wesley, Reading MA, 1986.
2. J. L. G iseller, STAN-CS-TR-84-1033 (1984).
3. S. C. Kleene, Representation of events in nerve nets and finite automata, in C. E.
Shannon, J. McCarthy, Automata Studies, Princeton Univ. Press. 1956, pp. 3-42.
4. R. McNaughton, H. Yamada, Regular expressions and state graphs for automata,
IEEE Trans. Electronic Computers 9:1 (Jan., 1960). pp. 39-47.
5. K. Thompson, Regular expression search algorithm, Comm. ACM 11:6 (Giugno,
1968), pp. 419-422.
Capitolo 4
Propriet dei linguaggi regolari
Questo capitolo prende in esame le propriet dei linguaggi regolari. Il primo strumento
di indagine una tecnica per dimostrare che certi linguaggi non sono regolari espressa in
forma di teorema, il pumping lemma. introdotto nel Paragrafo 4.1.
Nei linguaggi regolari ha grande rilevanza una classe di propriet dette di chiusu
ra". Queste propriet permettono di costruire riconoscitori di linguaggi fonnati a partire
da altri linguaggi con opportune operazioni. Per esempio lintersezione di due linguag
gi regolari regolare; dati gli automi che riconoscono due linguaggi regolari, possiamo
costruire meccanicamente un automa che riconosce la loro intersezione. Poich lautoma
per lintersezione pu avere molti pi stati dei due automi dati, la propriet di chiusura
si rivela uno strumento utile per costruire automi complessi. Nel Paragrafo 2.1 questa
costruzione stata sfruttata in modo determinante.
Unaltra importante classe di fatti relativi ai linguaggi regolari comprende le pro
priet di decisione. Il loro studio fornisce algoritmi per risolvere questioni rilevanti. Un
esempio basilare concerne un algoritmo per decidere se due automi definiscono lo stesso
linguaggio. Sfruttando la capacit di risolvere tale questione, siamo in grado di minimiz
zare un automa, cio di trovare un automa equivalente con il minor numero possibile di
stati. Dato che l'area di un chip occupata da un circuito (cio il suo costo) tende a dimi
nuire quando diminuisce il numero di stati dellautoma realizzato da quello, da decenni
questo problema riveste particolare importanza nella progettazione di circuiti digitali.
4.1
Abbiamo stabilito che la classe dei linguaggi detti regolari ammette almeno quattro de
scrizioni diverse: i linguaggi accettati dai DFA, dagli NFA e dagli e-NFA, e inoltre i
linguaggi definiti dalle espressioni regolari.
134
Capitolo 4
Non tutti i linguaggi sono per regolari. Per dimostrare che certi linguaggi non lo
sono, introduciamo in questo paragrafo una tecnica efficace, nota come pumping lemma.
Forniremo poi alcuni esempi di linguaggi non regolari. Nel Paragrafo 4.2 vedremo co
me usare il pumping lemma insieme alle propriet di chiusura dei linguaggi regolari per
dimostrare che altri linguaggi non lo sono.
4.1.1
Consideriamo il linguaggio Loi = {0n ln |n > 1}. Esso contiene le stringhe 01, 0011.
000111, e cos via, cio le stringhe formate da uno o pi 0 seguiti dallo stesso numero
di 1. Affermiamo che Loi non regolare. 11 ragionamento intuitivo che se Loi fosse
regolare sarebbe il linguaggio di un DFA /1. Questo automa avrebbe un certo numero di
stati, poniamo k. Immaginiamo che lautoma riceva k 0 in input. Dopo aver letto i k -f 1
prefissi di tale stringa: e, 0,00,. . . , 0fc, l'automa si trova in un certo stato. Poich ci sono
solo k stati, per il principio della piccionaia ci devono essere due prefissi, poniamo 0' e
-', letti i quali A si trova nello stesso stato, diciamo q.
Supponiamo ora che dopo aver letto i o j simboli 0 lautoma cominci a ricevere degli
1 in input. Dopo aver ricevuto i 1, lautoma deve accettare la stringa se ha ricevuto in
precedenza / 0, ma non se ne ha ricevuti j. Trovandosi in q allinizio degli 1, l'automa
non pu ricordare quale dei due casi si verifica; possiamo perci ingannare .4 e in
durlo a prendere la decisione sbagliata: accettare anche se non dovrebbe oppure, nel caso
opposto, rifiutare.
Questo ragionamento informale pu essere precisato. La stessa conclusione, che il
linguaggio Lyi non regolare, si pu comunque raggiungere per mezzo del seguente
risultato generale.
Teorema 4.1 (Il pumping lemma per i linguaggi regolari) Sia L un linguaggio regolare.
Esiste allora una costante n (dipendente da L) tale che. per ogni stringa w in L per la
quale |u/| > n, possiamo scomporre w in tre stringhe w = xyz in modo che:
1. y e
2. \
xy\< n
3. per ogni k > 0 anche la stringa xykz in L.
In altre parole possiamo sempre trovare un stringa non vuota y, non troppo distante dal
linizio di w, da replicare", cio da ripetere quante volte vogliamo o anche cancellare (
il caso di k = 0) senza uscire dal linguaggio L.
135
Figura 4.1 Ogni stringa di lunghezza supcriore al numero di stati obbliga a ripetere uno
stato.
Consideriamo ora che cosa accade se lautoma A riceve linput xykz per un k > . Se
k = 0, lautoma passa dallo stato iniziale q0 (che anche po) a Pi sull'input x. Poich
Pi coincide con p j , A deve passare da p allo stalo accettante della Figura 4.1 a fronte
dellinput 2. Perci A accetta xz.
Se k > 0, .4 va da qo a p su input x, cicla su p per k volte a fronte dellinput yk. e
passa allo stato accettante a fronte di 2. Perci, per ogni k > 0, anche xykz accettato
da .4; quindi xykz appartiene a L.
4.1.2
Vediamo alcuni esempi relativi alluso del pumping lemma. In ciascun caso proponiamo
un linguaggio e per mezzo del lemma dimostriamo che non regolare.
136
Capitolo 4
Esempio 4.2 Dimostriamo che il linguaggio Leq formato da tutte le stringhe con lo stesso
numero di 0 e di I (senza vincoli suH'ordine) non regolare. Rispetto al gioco descritto
nel riquadro Il pumping lemma come gioco a due, faremo la parte del giocatore 1:
dobbiamo rispondere a ogni mossa del giocatore 2. Sia n la costante citata nel pumping
lemma, nel caso che Leq fosse regolare. 11 giocatore 2 sceglie n. Noi scegliamo allora
w = On l n, cio n simboli 0 seguiti da n simboli 1, una stringa che appartiene senzaltro
a Lgq.
Ora il giocatore 2 scompone w in xyz. Noi sappiamo solo chc y ^ r e |xy, < ri.
Ma questa informazione utile e ci basta per vincere. Poich \
xy\ < n e xy si trova
allinizio di ?/;, sappiamo chc x c y sono formate da soli 0. Il pumping lemma dice chc,
sc L m fosse regolare, anche xz gli apparterrebbe. E il caso k = 0 del lemma. D altra
parte xz ha n 1 perch tutti gli 1 di w sono in 2. Ma xz ha anche meno di perch
N
1Si noti che avremmo vinto anche scegliendo fc = 2 o, in generale, qualsiasi valore diverso da 1.
137
4.1.3
Esercizi
138
Capitolo 4
I 7?.
4.2
139
4.2.1
140
Capitolo 4
141
Si noti chc importante per la dimostrazione svolta che 6(qo- w) sia sempre definito;
vale a dire che non ci siano transizioni mancanti in A. Se ce ne fossero, allora alcune
142
Capitolo 4
(0 | 1 )* 0 1 .
I
Esempio 4.7 In questo esempio applicheremo il Teorema 4.5 per dimostrare che un certo
linguaggio non regolare. Nell'Esempio 4.2 abbiamo mostrato che il linguaggio Lt,,,,
costituito dalle stringhe con un numero uguale di 0 e 1, non regolare. La dimostra
zione consisteva in una semplice applicazione del pumping lemma. Ora consideriamo il
linguaggio M formato dalle stringhe di 0 e 1 che hanno un numero disuguale di 0 e 1.
Sarebbe difficile usare il pumping lemma per mostrare che M non c regolare. Intuiti
vamente, se partiamo da una stringa w in M , la scomponiamo in v; = xyz c replichiamo
y, potremmo trovare che y stessa una stringa come 01, con un numero uguale di O e l .
Se cos, non esister un k tale che xykz abbia un numero uguale di 0 e 1, dato che xyz
ha un numero disuguale di 0 e 1, e i numeri di 0 e 1 cambiano uniformemente mentre
replichiamo y. Non possiamo perci usare il lemma per contraddire lassunto che Al e
regolare.
Eppure M non regolare, e la ragione che M = L. Poich il complemento del
complemento linsieme da cui siamo partiti, ne consegue anche che L = M . Se M
143
fosse regolare, per il Teorema 4.5 anche L sarebbe regolare. Sappiamo per che L non lo
; abbiamo dunque una dimostrazione per assurdo che M non c regolare.
Chiusura rispetto allintersezione
Consideriamo ora lintersezione di due linguaggi regolari. Data Tinterdipendenza del
le tre operazioni booleane. non dobbiamo faticare molto. Avendo modo di svolgere la
complementazione e l'unione, possiamo conseguire lintersezione dei linguaggi L ed Al
attraverso lidentit
L D Al = L U Al
(4.1)
In generale lintersezione di due insiemi linsieme degli elementi che non sono nel com
plemento di uno dei due insiemi. Losservazione espressa dallEquazione (4.1) una del
le leggi di DeMorgan. Laltra legge uguale, a patto di scambiare unione e intersezione,
ossia: L U M = L H M .
Possiamo daltra parte compiere una costruzione diretta di un DFA per lintersezione
di due linguaggi regolari. La costruzione, che in sostanza esegue due DFA parallelamente,
c utile di per s. Per esempio stata usata per costruire lautoma della Fig. 2.3, che
rappresentava il prodotto delle azioni dei due partecipanti, la banca e il negozio. Il
prossimo teorema formalizzer la costruzione per prodotto.
Teorema 4.8 Se L ed Al sono linguaggi regolari, allora anche L Al regolare.
DIMOSTRAZIONE Siano L ed M i linguaggi degli automi A l =
144
Capitolo 4
Input a
Accetta
Figura 4.3 Un automa che simula altri due automi e che accetta se e solo se entrambi gli
automi accettano.
stato accettante di A l e q sia uno stato accettante di A m . In termini formali definiamo:
A = (Q l X Q m ,
^ (<7/,> Qm ) , P l x F m )
w) = (l ( q l , w ), Sm ( q m ; ) ) .
145
(c)
Figura 4.4 La costruzione per prodotto.
0. mentre lo stato ps rappresenta la condizione in cui sono stati visti solo I. Lo sialo
accettante qs raffigura la condizione in cui sono stati visti sia 0 sia 1.
146
Capitolo 4
At regolare.
4.2.2
Inversione
E. La dimo
strazione uninduzione strutturale sulla dimensione di E. Dimostriamo che esiste un'al
tra espressione regolare E n tale che L (E h ) = (L(E)) ; vale a dire che il linguaggio di
E r 1' inversione del linguaggio di E.
E.
147
1. E = E i +2 Allora E n = E n + E 2 . Laformulasi spiega cos: l'inversione delTunione di due linguaggi si ottiene calcolando linversione di ciascuno e facendone
l'unione.
2. E = E\E2. Allora E n = E E[r. Si noti che invertiamo lordine dei due lin
guaggi. oltre ai linguaggi stessi. Per esempio, se L(E\) = {01,111} e L(E2) =
{00.10}, allora L (E 1E 2) = {0100,0110,11100,11110}. L'inversione di que
st'ultimo linguaggio
Esempio 4.12 Sia L definito dall'espressione regolare (0 -I- 1)0*. Allora, per la regola
della concatenazione, L h il linguaggio di (0^)^(0-1-1)77. Se applichiamo la regola della
chiusura e deHunione alle due parli, e poi applichiamo la regola di base secondo la quale
le inversioni di 0 e 1 rimangono immutate, abbiamo che L n ha l'espressione regolare
0*(0 + 1).
4.2.3
Omomorfismi
Un omomorfismo di stringhe una funzione che sostituisce a ogni simbolo una particolare
stringa.
Esempio 4.13 La funzione h definita da /<(0) = ab e h( 1) e. un omomorfismo. Data
una qualunque stringa di 0 e I, la funzione sostituisce tutti gli 0 con la stringa ab e tutti
gli 1 con la stringa vuota. Per esempio h applicato alla stringa 0011 nbab.
148
CapiloIo 4
(4.2)
149
(4.3)
poich h viene applicato a ogni singola stringa del linguaggio. Ora possiamo invocare
lipotesi induttiva per asserire che L(h(F)) = h(L (F )) e L[h(G)) = h(L(G )). In
questo modo le espressioni finali in (4.2) e (4.3) sono equivalenti, e dunque lo sono anche
i loro rispettivi primi termini. Quindi L(i(E)) = h(L (E )).
Non dimostreremo i casi in cui l'espressione E una concatenazione o una chiusura,
in quanto le idee da applicare sono analoghe a quanto visto sopra. La conclusione che
L(h(R )) coincide con h(L (R )); cio lapplicazione dellomomorfismo h allespressione
regolare per il linguaggio L risulta in unespressione regolare che definisce il linguaggio
h(L).
4.2.4
Omomorfismi inversi
Gli omomorfismi si possono applicare anche in senso inverso, e anche cos preservano i
linguaggi regolari. In altre parole supponiamo che h sia un omomorfismo da un alfabeto
verso stringhe di un altro (eventualmente lo stesso) alfabeto T? Sia L un linguaggio
sull'alfabeto T. Allora h l (L), detta la controimntagine di L rispetto ad li, linsieme
delle stringhe w in * tali che h(w) sia in L. La Figura 4.5 mostra l'effetto di un omo
morfismo su un linguaggio L nella parte (a) e leffetto di un omomorfismo inverso nella
parte (b).
Esempio 4.15 Sia L il linguaggio dell'espressione regolare (00 4 I)*; L consiste di tutte
le stringhe di 0 e 1 tali che tulli gli 0 occorrono in coppie adiacenti. Dunque 0010011 e
10000111 sono in L, ma non 000 e 10100.
Sia h l'omomorfismo definito da h(a) = 01 e h(b) = 10. Sosteniamo che h~](L) il
linguaggio dellespressione regolare (ba)*, ossia le stringhe formate da ripetizioni di ha.
Dimostreremo che h(w) in L se e solo se w della forma baba -ba.
(Se) Supponiamo che w sia formato da n ripetizioni di ba per n > 0. Notiamo che
h(ba) = 1001, cos h(w) formato da n ripetizioni di 1001. Dato che 1001 composto
da due I e da una coppia di 0, sappiamo che 1001 in L. Qualunque ripetizione di 1001
perci formata da segmenti 1 e 00. e si trova in L. Di conseguenza h(w) in L.
(Solo-se) Dobbiamo ora assumere che h(w) sia in L e mostrare che w della forma
baba ba. Esistono quattro condizioni per le quali una stringa non di tale forma, e
mostreremo che se una di esse valida allora h( w) non in L. In altre parole dimostriamo
il contronominale dell'enunciato che ci proponevamo di dimostrare.
-T va Ieita come la maiuscola del tau greco, la lettera successiva a sigma.
150
Capitolo 4
2. Se w finisce per fr, allora h(w) finisce per 10, e ancora una volta c uno 0 isolato
in h(w).
3. Se w ha due a consecutivi, allora h(w) ha una sottostringa 0101. Anche in questo
caso troviamo uno 0 isolato in w.
4. Analogamente, se w ha due b consecutivi, allora h(w) ha una sottostringa 1010 e
quindi uno 0 isolato.
Perci, quando risulta valido uno dei casi enunciati sopra, h(w) non in L. Sc escludiamo
i casi in cui almeno uno dei punti da (1) a (4) valido, ne consegue chc w della forma
151
bab ba. Per capirne la ragione assumiamo che nessuno dei punti da (1) a (4) sia
valido. Allora (1) indica che w deve iniziare per b e (2) indica chc w finisce per a. Gli
enunciati (3) e (4) indicano che a e b devono alternarsi in w. Quindi l'OR logico dei
punti da (1) a (4) equivale allenunciato w non della forma baba ba". Abbiamo
dimostrato chc l'OR dei punti da (1 ) a (4) implica che h(ir) non in L, e questo proprio
il contronominale dellenunciato che volevamo: se h(w) in L, allora w della forma
baba ba".
Ora dimostreremo che anche Pomomoriismo inverso di un linguaggio regolare re
golare; successivamente dimostreremo come usare tale teorema.
Teorema 4.16 Se h un omomorfismo dallalfabeto verso lalfabeto Tt cd L un
linguaggio regolare su T, allora anche I r i (L) un linguaggio regolare.
A per L. Da A e h costruiamo un
DFA per I r i (L) usando lo schema suggerito dalla Fig. 4.6. Il DFA usa gli stati di .4,
ma traduce i simboli di input in conformit ad h prima di prendere decisioni sullo stato
successivo.
Input a
Figura 4.6 II DFA per h 1(L) applica h al suo input e poi simula il DFA per L.
In termini formali poniamo chc L sia L(A) per un DFA A = (Q , 2\fi, ^
un DFA
B = (Q, ,7, q0, F)
F) Definiamo
152
Capiloto 4
che A compie sulla stringa di simboli h(a). Ricordiamo che h(a ) pu essere e, un solo
simbolo oppure molti, ma definita in modo da trattare correttamente tutti questi casi.
Con una semplice induzione su \
w\mostriamo che 7 (//0 , ') = S(<70, //,(;)). Poich
gli stati accettanti di A e B sono uguali, B accetta w se e solo se A accetta fi(w). Detto
in altro modo, B accetta esattamente le stringhe w che si trovano in li~](L).
1. p c q sono stati in Q
2. a un simbolo in
3. (.) = q .
In altre parole possiamo considerare i simboli in T come rappresentazioni delle transi
zioni dellautoma A. Sottolineiamo che la notazione [paq] non la concatenazione di tre
simboli, ma il nostro modo di esprimerne uno solo. Avremmo potuto attribuirgli come
nome una lettera singola, ma sarebbe stato difficile descrivere la sua relazione con p, q e
a.
Definiamo a questo punto lomomorfismo h([paq\) = a per ogni p, a e q. In altre
parole h rimuove i componenti di stato da ognuno dei simboli di T lasciando soltanto il
simbolo di . Il primo passo per mostrare che L regolare la costruzione del linguaggio
L i - ~(Al). Dato che Al regolare, lo anche Li per il Teorema 4.16. Le stringhe
di Li sono proprio le stringhe di Al, in cui a ogni simbolo associata una coppia di stati
che rappresenta una transizione.
A titolo esemplificativo consideriamo ora lautoma a due stali della Figura 4.4(a).
L'alfabeto {0,1} e lalfabeto T consiste dei quattro simboli [pOg], [t/Og], [plp] e
[ylf/]. Il simbolo [pOq], per esempio, si spiega con la transizione dallo stato p allo stato q
153
lo stato iniziale di .4
2. ogni transizione deve riprendere dal punto in cui termina la precedente, ossia il
primo stato in un simbolo deve coincidere con il secondo stato del simbolo che lo
precede
3. il secondo stato dellultimo simbolo deve essere in F\ poich sappiamo che ogni
stringa in L i proviene da una stringa accettata da .4, questa condizione sar garan
tita una volta che avremo applicato i punti ( 1) e (2).
Lo schema della costruzione di L illustralo nella Figura 4.7.
Pergaraniire lacondizione (1) facciamo l'intersezione di L\con linsieme delle strin
ghe che cominciano con un simbolo della forma [qoaq] per un simbolo a e uno staio q.
Sia dunque Ei l'espressione [<7oi^i] + [<7o'Q-i] + , dove le coppie CilCjl percorrono
tutte le coppie in x Q tali che S(qo. a) = r/. Sia poi L2 = Li L(EiT*). Dato che
E iT x unespressione regolare che denota tutte le stringhe in T* che cominciano con lo
stato iniziale (possiamo considerare T nellespressione regolare come la somma dei suoi
simboli), L2 linsieme delle stringhe formate applicando h ~1 al linguaggio Al e che
hanno lo stalo iniziale come primo componente del suo primo simbolo. Esse soddisfano
quindi Iacondizione (I).
Per quanto riguarda il punto (2) la via pi facile sottrarre da L2 (usando loperazione
di differenza di insiemi) tutte le stringhe che la violano. Sia E2 l'espressione regolare
consistente della somma (unione) della concatenazione di tutte le coppie di simboli che
non riescono a combinarsi, ossia le coppie della forma \paq][rbs] dove q r. Allora
TvE 2T* un'espressione regolare che denota tutte le stringhe che non soddisfano la
condizione (2).
Possiamo ora definire L3 = L2 L(T*E 2T*). Le stringhe di L soddisfano la condi
zione (1) perch le stringhe in L2 devono cominciare con il simbolo iniziale. Soddisfano
inoltre la condizione (2), in quanto la sottrazione di L(T*E2T*) rimuove qualunque strin
ga che la violi. Soddisfano infine la condizione (3), ossia che lultimo staio sia accettante.
Siamo infatti partiti solo con le stringhe in M, che conducono tutte allaccettazione da
parte di A. Leffetto che Li consiste di tutte Ic stringhe in Al in cui gli stati di una
154
Capitolo 4
M
Linguaggio dell'automa A
Omomoifismo inverso
L 1
/ 4
'
Figura 4.7 La costruzione del linguaggio L dal linguaggio M applicando operazioni che
preservano la regolarit dei linguaggi.
computazione accettante sono incorporati come parte dei simboli. Notiamo che L
regolare perch ottenuto a partire dal linguaggio regolare M con l'applicazione di ope
razioni - omomorfismo inverso, intersezione e differenza di insiemi - che applicate a
insiemi regolari danno come risultato insiemi regolari.
Ricordiamo che il nostro obiettivo era accettare solo le stringhe in M che visitano
ogni stato nella computazione accettante. Possiamo imporre tale condizione per mezzo di
ulteriori applicazioni dellopei atore di differenza di insiemi. In altre parole, per ogni staio
q. sia E q lespressione regolare che somma tutti i simboli in T tali che q non compaia
n nella prima n nellultima posizione. Se sottraiamo tutti i linguaggi L(FZq) da La,
otteniamo le stringhe che sono una computazione accettante di A e che visitano lo stato
q almeno una volta. Se sottraiamo da L^ tutti i linguaggi L(Eq) per q in Q, otteniamo
le computazioni accettanti di A che visitano tulli gli stati. Per il Teorema 4.10 questo
linguaggio, che chiameremo L\, regolare.
NelFultimo passo costruiamo L da L4 sbarazzandoci dei componenti di stato. In altre
155
4.2.5
Esercizi
Esercizio 4.2.1 Supponiamo che h sia lomomorfismo dall'alfabeto {(), 1,2} verso lal
fabeto {a. b} definito da: Ii(O) = a, Ii(I) = ab, e /(2) = ba.
* a) Che cos /(0120)?
b) Che cos />(21120)?
* c) Se L il linguaggio (01*2), che cos' h(L)l
%
156
Cnpilolo 4
Esercizio 4.2.5 Loperazione dellEsercizio 4.2.3 sintende a volte come una derivata,
c a\L c scritta
. Tali derivate si applicano alle espressioni regolari in modo simile a
quello in cui le normali derivate si applicano alle espressioni aritmetiche. Perci, se R
unespressione regolare, useremo ^ con lo stesso significato di
se L = L(R).
a) Mostrate che
= Sr + Sf-
d) Usate le regole dei punti (a)-(c) per trovare le derivate de Ilespressi one regolare
(0 + 1)*011 rispetto a 0 e 1.
* e) Caratterizzate i linguaggi L per cui ^
= 0.
157
! Esercizio 4.2.9 Possiamo estendere l'Esercizio 4.2.8 ad alcune funzioni che stabiliscono
quanta parte della stringa prendiamo. Se / una funzione su interi, definite il linguaggio
f(L ) {w I per un x con |x| = /(|to|), abbiamo wx in L }. Per esempio l'operazione
/?a//corrisponde alla funzione identit f(n ) = n, dato che half(L) definito da |x| = |u.'|.
Mostrate che se L un linguaggio regolare allora lo anche f{L), se f una delle
seguenti funzioni:
a) f(n ) = 2n (il primo terzo di ogni stringa)
b) / ( ) = ri2 (cio la parte presa di lunghezza uguale alla radice quadrata di quanto
si omette)
c) f(n ) = 2n (cio quanto si prende di lunghezza uguale al logaritmo di quanto si
omette).
! Esercizio 4.2.10 Supponiamo che L sia un qualunque linguaggio, non necessariamente
regolare, il cui alfabeto {0}; ossia le stringhe di L consistono solo di 0. Dimostrate che
Lx regolare. Suggerimento, a prima vista il teorema sembra assurdo, eppure un esempio
aiuter a capirlo. Consideriamo il linguaggio L = {()' j i primo}, che sappiamo non
essere regolare dallEsempio 4.3. Poich sia 2 sia 3 sono numeri primi, le stringhe 00
e 000 sono in L. Di conseguenza, se j > 2 possiamo mostrare che Oj in L*. Se j
pari, usate j/ 2 copie di 00; se j dispari, usate una copia di 000 e (j - 3)/2 copie di 00.
Dunque L* = 000*.
! Esercizio 4.2.11 Mostrate che i linguaggi regolari sono chiusi rispetto alla seguente ope
razione: cycle(L) {w \possiamo scrivere w come w = xy tale che yx in L}. Per
esempio, se L = {01, O li}, allora cycle(L) {01,10,011.110.101}. Suggerimento:
partite da un DFA per L e costruite un e-NFA per cycle(L).
! Esercizio 4.2.12 Sia W| = aooi e
= w - \ per ogni i > I. Peresempio
u
3 = j -^i a < a o o i Lespressione regolare pi breve per il lin
guaggio Ln = {W11}, vale a dire il linguaggio consistente dell'unica stringa wn, la
stringa wn stessa, c la lunghezza di questespressione 2n+i 1. Se per ammettia
mo loperatore di intersezione possiamo scrivere un'espressione per Ln la cui lunghez
za 0 (n 2). Trovate lespressione. Suggerimento: trovate n linguaggi, ciascuno con
espressioni regolari di lunghezza G(n). Ia cui intersezione sia Ln.
! Esercizio 4.2.13 Possiamo usare le propriet di chiusura come ausilio per dimostrare che
certi linguaggi non sono regolari. Partite dalla constatazione che il linguaggio
Lomn =
{0" l rt I n
>
0}
non un insieme regolare. Dimostrate che i seguenti linguaggi non sono regolari trasfor
mandoli, per mezzo di operazioni che sappiamo mantenere la regolarit, in L(ini :
158
Capitolo 4
* a) {0P I i j}
b) (0n l m2n_wl I n > rn > 0}.
Esercizio 4.2.14 Nel Teorema 4.8 abbiamo descritto la costruzione per prodotto: da
due DFA si costruisce un unico DFA il cui linguaggio lintersezione dei linguaggi dei
primi due.
a) Mostrate come compiere la costruzione per prodotto sugli NFA (senza e-transizioni).
! b) Mostrale come compiere la costruzione per prodotto sugli f-NFA.
* c) Mostrate come modificare la costruzione per prodotto cos che il DFA risultante
accetti la differenza dei linguaggi dei due DFA dati.
d) Mostrate come modificare la costruzione per prodotto cos che il DFA risultante
accetti unione dei linguaggi dei due DFA dati.
Esercizio 4.2.15 Nella dimostrazione del Teorema 4.8 abbiamo affermato che poteva
essere dimostrato per induzione sulla lunghezza di w che
S(Ql ,Qm ) , w ) = (SrJ{qr,..w)JAI{qM.w))
Scrivete tale dimostrazione.
Esercizio 4.2.16 Completate la dimostrazione del Teorema 4.14 considerando i casi in cui
lespressione E una concatenazione delle due sottoesprcssioni e in cui E la chiusura
di unespressione.
Esercizio 4.2.17 Nel Teorema 4.16 abbiamo omesso una dimostrazione per induzione
sulla lunghezza di w che (qo,w) =
h(w)). Dimostrate lenunciato.
4.3
159
pi generali. D altra parte, per molte delle questioni che porremo, disponiamo di algoritmi
solo per la classe dei linguaggi regolari. Se formulate rispetto a notazioni pi espressive
di quelle introdotte per i linguaggi regolari, cio notazioni atte a esprimere classi pi este
se di linguaggi, le stesse questioni diventano indccidibili (non esistono algoritmi per
risolverle).
Lo studio degli algoritmi per questioni sui linguaggi regolari prende le mosse da un
riepilogo dei modi per tradurre una rappresentazione in unaltra dello stesso linguag
gio. In particolare ci interessa la complessit in tempo degli algoritmi di conversione.
Tratteremo poi alcune questioni fondamentali relative ai linguaggi.
1. Il linguaggio descritto vuoto?
2. Una certa stringa w appartiene al linguaggio descritto?
3. Due descrizioni date specificano lo stesso linguaggio? Questo problema cono
sciuto come il problema dell'equivalenza di linguaggi.
4.3.1
Conversioni
Sappiamo gi che possibile convertire ognuna delle quattro rappresentazioni dei lin
guaggi regolari in una delle altre. Nella Figura 3.1 sono illustrati i passaggi da una rappre
sentazione all'altra. Per ogni conversione esistono algoritmi; a volte per siamo interes
sati non solo alla possibilit di convertire, ma anche alla quantit di tempo necessaria. In
particolare importante distinguere gli algoritmi che richiedono tempo esponenziale (in
funzione delle dimensioni del problema), e che quindi si possono eseguire solo su istanze
relativamente piccole, da quelli che richiedono tempo lineare, quadratico o polinomiale
con grado piccolo rispetto alla dimensione. Questi ultimi algoritmi sono praticabili, nel
senso che ci si pu aspettare di eseguirli anche su istanze di dimensione grande di un
problema. Esamineremo la complessit in tempo di tutte le conversioni discusse.
Conversione da NFA a DFA
Quando convertiamo un NFA o un e-NFA in un DFA, il tempo pu essere esponenziale
nel numero di stati dellNFA. Per cominciare, il calcolo dell'e-chiusura di n stati richiede
un tempo 0 (n :i). Da ognuno degli n stati dobbiamo esaminare tutti gli archi etichettati e.
Sc ci sono n stati, non ci possono essere pi di n2 archi. Una strategia attenta e strutture
dati appropriate consentono di esaminare ogni stato in tempo 0 (n 2). Si pu usare un
algoritmo per la chiusura transitiva, come quello di WarshalI. per calcolare in una volta
sola lintera e-chiusura.
3Pcr una trattazione degli algoritmi per la chiusura transitiva, cfr. A. V. Aho, J. E. Hopcroft, J. D. Ullman,
160
Cupitolo 4
161
4.3.2
A prima vista la risposta alla domanda il linguaggio regolare L vuoto? sembra ovvia:
0 vuoto, ogni altro linguaggio regolare no. Ma come si detto allinizio del Paragra
fo 4.3, il problema non viene enunciato con l'elenco esplicito delle stringhe in L; abbiamo
invece una rappresentazione di L e dobbiamo decidere se essa denota il linguaggio 0.
Se la rappresentazione un automa finito, il problema equivale a stabilire se esiste
un cammino dallo stato iniziale a uno stato accettante. In questo caso il linguaggio non
vuoto, mentre se gli stati accettanti sono separati dallo stato iniziale, il linguaggio
vuoto. Decidere se si pu raggiungere uno stato accettante a partire dallo stato iniziale
un caso semplice del problema di raggiungibilit nei grafi, simile in sostanza al calcolo
della e-chiusura trattato nel Paragrafo 2.5.3. L'algoritmo si pu riassumere nella seguente
procedura ricorsiva.
4I metodi di parsing in grado di svolgere l'operazione in tempo O ( n ) sono imitati in A. V. Aho, R. Sethi. J.
D. Ullman, Compiler Design: Principles, Tools, and Techniques. Addi son-Wesley, 1986.
162
Capitolo 4
INDUZIONE Sia
4.3.3
163
4.3.4
Esercizi
Esercizio 4.3.4 Ideate un algoritmo che decida se due linguaggi regolari L\ ed L2 hanno
almeno una stringa in comune.
Esercizio 4.3.5 Ideate un algoritmo che decida se, dati due linguaggi regolari L\ od L2
sullo stesso alfabeto , esiste una stringa di * che non appartiene ne' a L\ ne a L 2.
Capilolo 4
164
4.4
differenza dei problemi trattati in precedenza (se un linguaggio sia vuoto e se una
stringa appartenga a un linguaggio), i cui algoritmi sono relativamente semplici, la que
stione se due descrizioni di linguaggi regolari denotino lo stesso linguaggio comporla
un considerevole sforzo intellettuale. In questo paragrafo esaminiamo come stabilire se
due descrittori di linguaggi regolari sono equivalenti, nel senso che definiscono lo stesso
linguaggio. Un risultato importante di questa ricerca lesistenza di un modo per mi
nimizzare un DFA, cio per trovare un DFA equivalente con il numero minimo di stati.
Questo DFA si rivela essere in sostanza unico: dati due DFA minimi equivalenti, possiamo
sempre rinominare gli stati in modo che i due DFA coincidano.
4.4.1
Cominciamo da una questione relativa agli stati di un DFA. Lo scopo capire quando due
stati distinti, p e q, possono essere sostituiti da un solo stato che si comporta come p c q.
Diciamo che due stati pe q sono equivalenti se:
A
per ogni stringa di input tv, ( , w) uno stato accettante se e solo se S(q, tv) uno
stato accettante.
N
Esempio 4.18 Consideriamo il DFA della Figura 4.8, la cui funzione di transizione sar
indicata da . Alcune coppie di stati sono evidentemente non equivalenti. Per esempio C
e G non sono equivalenti perch uno accettante e laltro no. Dunque la stringa vuota li
distingue perch 5(C. c) accettante e {G. e.) no.
Consideriamo gli stati A e G. La stringa c non li distingue perch sono entrambi
non accettanti. La stringa 0 non li distingue perch porta rispettivamente in B e in G,
entrambi non accettanti. Similmente la stringa 1 non distingue ,4 da G perche porta
rispettivamente a F e a , entrambi non accettanti. D altra parte 01 distingue A da G
perch (/t, 01 ) = C, 5(G, 01) = E e C accettante, al contrario di E. Qualsiasi stringa
porti da A c da G in stati di cui uno solo accettante basta per dimostrare che A e G non
sono equivalenti.
165
Se vogliamo scoprire gli stati equivalenti, dobbiamo fare del nostro meglio per trovare
coppie di stati distinguibili. Pu sorprendere, ma seguendo lalgoritmo descritto pi avanti
due stati risultano equivalenti se non siamo riusciti a distinguerli. Lalgoritmo, che chia
meremo algoritmo riempi-tabella, scopre ricorsivamente le coppie di stati distinguibili di
un DFA A = (Q , , S, q0, F).
BASE Se p uno stato accettante e q non accettante, la coppia {p. g} distinguibile.
INDUZIONE Siano p e q due stati tali che, per un simbolo di input a, r = (,) e s =
S(q, a) sono stati che sappiamo essere distinguibili. Allora {p.q} c una coppia di stati
distinguibili. La regola vale perch devesserci una stringa w che distingue r da .s; in altre
parole uno solo tra (r, w) e <5(.s, w) accettante. Ma allora la stringa aw distingue p da
*
q perch <5(p, aw) e 5(q, aw) coincidono rispettivamente con 5(r, w) e ($, w).
166
Capitolo 4
Esempio 4.19 Eseguiamo algoritmo riempi-tabella sul DFA della Figura 4.8. I-a tabella
finale riportata nella Figura 4.9, in cui un x indica due stati distinguibili e un quadralo
vuoto indica le coppie di cui non si ancora provata lequivalenza. Allinizio non c
nessun x.
Per la base, poich C lunico stato accettante, scriviamo x in ogni casella relativa a C.
Ora conosciamo qualche coppia distinguibile e possiamo scoprirne altre. Per esempio,
poich {C, H] distinguibile c gli stati E ed E vanno rispettivamente in TI e C su input
0. deduciamo che anche {E. E } una coppia distinguibile. Tutti gli x nella Figura 4.9, a
eccezione della coppia {.4. G}, si scoprono semplicemente esaminando le transizioni da
una coppia di stati su 0 o su 1 e osservando che, per uno dei due simboli, uno stato va in C
mentre l'altro no. Possiamo dimostrare che {/t,G} distinguibile nella fase successiva:
su input 1 i due stati vanno, rispettivamente, in F ed E , e abbiamo gi dimostrato che la
coppia {E ,F } distinguibile.
A questo punto non possiamo pi scoprire altre coppie distinguibili. Le tre coppie
rimanenti, chc sono quindi equivalenti, sono {/I, E }, {13, H} e {D, F}. Esaminiamo ad
esempio per quale ragione non possiamo desumere che { A E] c una coppia distingui
bile. Su input 0, ,4 ed E vanno rispettivamente in B e I I , e {B. H} non stata ancora
dichiarata distinguibile. Su input 1 sia .4 sia E vanno in F: per questa via non c modo
di distinguerli. Le altre due coppie, { B, H } e {D, F}. non saranno mai distinte perch
hanno transizioni identiche sia su 0 sia su 1. L'algoritmo riempi-tabella si ferma quindi
alla tabella illustrala nella Figura 4.9, che determina correttamente gli stati equivalenti e
quelli distinguibili.
167
Teorema 4.20 Se due stati non sono distinti dallalgoritmo riempi-tabella, allora sono
equivalenti.
DIMOSTRAZIONE Fissiamo di nuovo un DFA A =
Supponiamo che
lenunciato sia falso, cio che esista almeno una coppia di stati [p. q) tale che
1. gli stati p e q sono distinguibili, nel senso che esiste una stringa w tale che uno solo
tra <5(p, w) e S(q. ;) accettante, ma
2. lalgoritmo riempi-tabella non distingue p da q.
4.4.2
168
Capitolo 4
O
t + (0 + 1)*0. Possiamo immaginare che la figura rappresenti un solo DFA con cinque
stati, da A a E. Applicando lalgoritmo riempi-tabella a questo automa si ottiene la tabella
della Figura 4 .11.
Per vedere come si riempie la tabella, cominciamo ponendo degli x nelle coppie di
stati di cui uno solo accettante. Scopriamo che non c altro da fare. Lc quattro coppie
residue {A.C}, {A,D}, [Ci D ) e {B. E} sono equivalenti. Il lettore pu verificare
che nella parte induttiva dellalgoritmo non si scoprono altre coppie distinguibili. Per
esempio, con la tabella della Figura 4.11 non possiamo distinguere la coppia {A, D}
perch A e D su 0 tornano in se stessi c su 1 vanno nella coppia {B .E}, che non
ancora stata distinta. Dal momento che lalgoritmo stabilisce l'equivalenza di .,4 e C, che
sono gli stati iniziali dei due automi originari, concludiamo che questi accettano lo stesso
linguaggio.
Il
tempo per riempire la tabella, e quindi per decidere se due stati sono equivalenti,
polinomiale nel numero di stati. Se ci sono n stati, le coppie di stati sono ("), cio
n(n l)/2. In una iterazione si considerano tutte le coppie di stati per verificare se una
delle coppie di successori stata dichiarata distinguibile; una iterazione richiede perci
un tempo non superiore a 0 (n 2). Se poi in una iterazione non si aggiungono nuovi x,
169
4.4.3
Minimizzazione di DFA
170
Capitolo 4
Esempio 4.22 Consideriamo la tabella della Figura 4.9, che stabilisce equivalenze c distinguibilit per gli stati della Figura 4.8. La partizione degli stati in blocchi di equivalenza
data da ({.4, E}, {Z?, IT}. {<7}, {D ,F }, {6}). Si osservi chc le tre coppie di stali
equivalenti si trovano ciascuna in un blocco, mentre gli stati distinguibili da ogni altro
stato se ne stanno da soli, ciascuno in un blocco.
Per lautoma della Figura 4.10 la partizione e ({, C, D}. {B ,E }). Questo esempio
mostra che un blocco pu contenere pi di due stati. Pu sembrare casuale che .4, C t D
siano nello stesso blocco perch sono equivalenti a coppie e nessuno di loro equivalente
a un altro stato, ma, come vedremo nel prossimo teorema, ci garantito dalla definizione
di equivalenza fra stati.
Teorema 4.23 L equivalenza di stati transitiva. In altre parole, se due stati p e q di
un DFA A = (Q. ,,,) sono equivalenti, e scopriamo che anche q ed r lo sono,
saranno equivalenti anche p ed r.
DIMOSTRAZIONE Notiamo chc la transitivit una propriet insita in ogni relazione di
equivalenza, ma non basta dire che qualcosa unequivalenza per renderla transitiva,
bisogna dimostrare che quella denominazione giustificata.
Supponiamo che le coppie {p,q} c {q.r} siano equivalenti, ma che {/>, r} sia distinguibilc. Allora esiste una stringa di input tv tale che uno solo fra {p, w) e S(r,w) uno
stato accettante. Per simmetria supponiamo che si tratti di (p, w).
Ci chiediamo se 8(q, 7/.') sia o no accettante. Se lo fosse, {q, r} sarebbe distinguibile perch (r,w) non accettante. Sc S(q,w) non fosse accettante, {p.q} sarebbe
distinguibile per una ragione analoga. Abbiamo dimostrato per assurdo che {p, r} non
distinguibile, quindi una coppia equivalente.
171
Esempio 4.25 Minimizziamo il DFA della Figura 4.8. Abbiamo calcolato i blocchi del
la partizione degli stati nellEscmpio 4.22. La Figura 4.12 mostra lautoma minimo. 1
suoi cinque stati corrispondono ai cinque blocchi di stati equivalenti per l'automa della
Figura 4.8.
Poich A lo stalo iniziale della Figura 4.8, lo stato iniziale {4, E). Lunico stato
accettante {C} perch C c lunico stato accettante nella Figura 4.8. Si osservi che le
5Precisiamo che lo stesso blocco pu essere costruito pi volte, a partire da stati diversi. La partizione fatta
da blocchi distinti, cosicch ogni blocco vi compare una volta sola.
172
Capitolo 4
transizioni della Figura 4.12 riflettono correttamente quelle della Figura 4.8. Per esem
pio nella Figura 4.12 c' una transizione da {A, E} a { B ,t} su input 0 perch nella
Figura 4.8, su input 0, ,4 va in B ed E va in H. Analogamente, su input I {A. E} va in
{D. F}. Esaminando la Figura 4.8 vediamo che sia .4 sia E vanno in F su input 1; quindi
anche la scelta del successore di {.4. E} su input 1 corretta. Notiamo che n .4 n E
vanno in D su input I, ma ci irrilevante. Il lettore pu verificare la correttezza delle
altre transizioni.
4.4.4
173
supporre che i nomi degli stati di M siano distinti da quelli di N\ in questo modo la
funzione di transizione dellautoma composto l'unione delle due funzioni, senza inter
ferenze. Uno stato accettante nel DFA composto se c solo se accettante nel suo DFA
di provenienza.
Gli stati iniziali di M ed N sono indistinguibili perch L(M ) = L(N). Inoltre, se p
c q sono indistinguibili, lo sono anche i loro successori su ogni simbolo di input; infatti,
se potessimo distinguere i successori, sapremmo distinguere anche p da q.
N M n N hanno stati inaccessibili. In caso contrario potremmo eliminarli e ottenere
un DFA pi piccolo per lo stesso linguaggio. Perci ogni stato di M indistinguibile da
almeno uno stato di N . Per convincersene, siap uno stato di M . Deve esistere una stringa
2 (ih che porta dallo stato iniziale di M a p. La stessa stringa porta anche dallo
stato iniziale di Ar a uno stato q. Sappiamo che gli stati iniziali sono indistinguibili, quindi
anche i loro successori rispetto ad sono indistinguibili. Lo stesso vale per i successori
di questi stati rispetto ad o-, e cos via, fino a concludere che p c q sono indistinguibili.
Poich Ar ha meno stati di M , ci sono due stati di M indistinguibili dallo stesso stato
di N, c quindi indistinguibili fra loro. Ma M stato costruito in modo tale che tutti i suoi
stali siano distinguibili a due a due. Abbiamo una contraddizione, da cui segue che Ar
non pu esislere ed M ha un numero di stati non superiore a quello di un qualsiasi DFA
equivalente ad A. In termini formali abbiamo dimostrato quanto segue.
Teorema 4.26 Sia A un DFA ed M il DFA costruito a partire da A dall'algoritmo de-
174
Capitolo 4
0,1
Figura 4.13 Un NFA che non si pu minimizzare per equivalenza sugli stati.
scritto nellenunciato del Teorema 4.24. Allora il numero di stati di Al non superiore a
quello di un qualsiasi DhA equivalente ad .4.
Possiamo in realt affermare qualcosa di pi del Teorema 4.26: esiste una corrispon
denza uno-a-uno fra gli stati di qualsiasi altro N minimale e quelli di Al. Abbiamo infatti
dimostrato che ogni stato di Al devessere equivalente a uno stato di N , e nessuno stato
di M pu essere equivalente a due stati di N . In modo simile possiamo provare che nes
suno stato di N pu essere equivalente a due stati di Al, e che ogni stato di N devessere
equivalente a uno stato di Ai. In conclusione, il DFA minimo equivalente ad A unico, a
meno di rinominare gli stati.
- A
D
C
*D
E
F
G
H
B
A
D
D
D
G
F
G
.4
C
B
A
F
E
G
D
Riepilogo
4.4.5
175
Esercizi
4.5
Riepilogo
176
Capitolo 4
4.6
Bibliografia
Bibliografa
177
Capitolo 5
Grammatiche e linguaggi liberi
dal contesto
Volgiamo ora attenzione a una classe pi ampia di linguaggi rispetto a quelli regolari: i
linguaggi liberi dal contesto. Si tratta di linguaggi che hanno una notazione naturale ri
corsiva, chiamata grammatiche libere dal contesto. Le grammatiche libere dal contesto
sono state cruciali nei compilatori sin dagli anni 60: grazie a loro la realizzazione di un
parser (una funzione che estrae la struttura di un programma) passata da unattivit di
implementazione ad hoc che richiedeva molto tempo a un lavoro di routine che pu esse
re svolto in un solo pomeriggio. Di recente le grammatiche libere dal contesto sono state
usale per descrivere formati di documenti attraverso le cosiddette DTD (Document Type
Definition, definizione di tipo di documento), utilizzate dagli utenti di XML (extensible
Markup Language) per lo scambio di informazioni nel Web.
In questo capitolo introduciamo la notazione delle grammatiche libere dal contesto e
mostriamo come definiscono i linguaggi. Presentiamo inoltre lalbcro sintattico (parse
tree), una rappresentazione grafica della struttura che una grammatica impone alle strin
ghe del suo linguaggio. L'albero sintattico prodotto dal parser di un linguaggio di
programmazione e costituisce il modo tipico di rappresentare la struttura dei programmi.
I
linguaggi liberi dal contesto sono descritti compiutamente anche da una notazione in
forma di automa, lautoma a pila (pushdown automaton). Lautoma a pila sar materia
del Capitolo 6. Sebbene meno importanti degli automi a stati finiti, gli automi a pila,
soprattutto perche sono equivalenti alle grammatiche libere dal contesto come modo di
definire linguaggi, si rivelano molto utili nellesplorazione delle propriet di chiusura c di
decisione dei linguaggi liberi dal contesto (vedi Capitolo 7).
Capitolo 5
180
5.1
Cominciamo col presentare informalmente la notazione delle grammatiche libere dal conlesio. Passeremo alle definizioni formali dopo averne esaminato alcune importanti caratte
ristiche. Mostreremo come si definisce una grammatica in termini formali c presenteremo
il processo di derivazione, che determina quali stringhe appartengono al linguaggio di
una grammatica.
5.1.1
Un esempio informale
palindroma, salvo che non risulti dalla base e dalla regola di induzione appena esposte.
Una grammatica libera dal contesto una notazione formale per esprimere simili de
finizioni ricorsive di linguaggi. Una grammatica consiste di una o pi variabili che rap
presentano classi di stringhe, ossia linguaggi. Nellesempio ci occorre una sola variabile.
P, che rappresenta l'insieme delle palindrome, cio la classe delle stringhe che forma
no il linguaggio Ljw/. Opportune regole stabiliscono come costruire le stringhe in ogni
classe. La costruzione pu impiegare simboli dellalfabeto, stringhe di cui si conosce gi
l'appartenenza a una delle classi, oppure entrambi gli elementi.
181
Esempio 5.1 Le regole che definiscono le palindrome, espresse nella notazione delle
grammatiche libere dal contesto, sono riportate nella Figura 5.1. Il loro significato verr
chiarito nel Paragrafo 5.1.2.
1.
2.
3.
4.
5.
P
P
P
P
-
-*
-f
->
0
1
OPO
IP l
Figura 5.1 Una grammatica libera dal contesto per le stringhe palindrome.
La prime tre regole costituiscono la base e indicano che la classe delle palindrome include
le siringhe e, 0 c 1. Nessuno dei membri destri delle regole (le porzioni che seguono le
frecce) contiene una variabile; questo il motivo per cui formano la base della definizione.
Le ultime due regole costituiscono la parte induttiva. Per esempio la regola 4 dice che,
se si prende una qualunque stringa w dalla classe P, anche OwU si trova nella classe P.
Analogamente la regola 5 indica che anche Iw l in P.
5.1.2
182
Capitolo 5
(b) 11 simbolo di produzione *.
(c) Una stringa di zero o pi terminali e variabili, detta il corpo della produzione,
che rappresenta un modo di formare stringhe nel linguaggio della variabile di
testa. Le stringhe si formano lasciando immutati i terminali e sostituendo ogni
variabile del corpo con una stringa appartenente al linguaggio della variabile
stessa.
Esempi di produzioni sono illustrati nella Figura 5.1.
I quattro componenti appena descritti formano una grammatica libera dal contesto. o sem
plicemente grammatica, o CFG, ( Context-Free Grammar). Rappresenteremo una CFG
per mezzo dei suoi quattro componenti, ossia G = (V, T, P, S ). dove V l insieme delle
variabili, T i terminali, P linsieme delle produzioni ed S il simbolo iniziale.
Esempio 5.2 La grammatica G pai per le palindrome rappresentata da
(a +b)(a + b -f 0 + 1)*
Eviteremo di usare direttamente le espressioni regolari nelle grammatiche, preferendo
piuttosto un insieme di produzioni che abbiano lo stesso significato dellespressione in
esame.
La grammatica per le espressioni definita formalmente da G = ({E. /}, T. P. E),
dove T linsieme di simboli {+. *, (, ),a.b. 0,1} c P l'insieme di produzioni nella
Figura 5.2. Linterpretazione delle produzioni la seguente.
La regola (1) la regola di base per le espressioni, e afferma che unespressione pu
essere un singolo identificatore. Le regole dalla (2) alla (4) descrivono il caso induttivo
E
E
E
E
5.
J
I
/
6.
7.
.
9.
10.
>
>
-
183
T
E +E
E *E
(E)
a
-*
b
/a
T - *
Ib
/
- /0
/
> / I
Figura 5.2 Una grammatica libera dal contesto per espressioni semplici.
per le espressioni. La regola (2) afferma che unespressione pu essere formata da due
espressioni connesse dal segno +; la regola (3) dice la stessa cosa per il segno di mol
tiplicazione. La regola (4) dichiara che, se si prende una qualunque espressione e la si
racchiude fra parentesi, il risultato ancora unespressione.
Le regole dalla (5) alla (10) descrivono gli identificatori. La base data dalle regole
(5) e (6), secondo le quali a e b sono identificatori. Le rimanenti quattro regole sono il
caso induttivo, e affermano che se abbiamo un identificatore possiamo farlo seguire da a,
b, 0 oppure 1, e il risultato comunque un altro identificatore.
5.1.3
Le produzioni di una CFG si applicano per dedurre che determinate stringhe appartengo
no al linguaggio di una certa variabile. La deduzione pu seguire due strade. Quella pi
convenzionale si serve delle regole utilizzando il corpo per passare alla testa. In altre pa
role prendiamo stringhe di cui conosciamo l'appartenenza al linguaggio di ognuna delle
variabili del corpo, le concateniamo nell'ordine adeguato, con i terminali che compaio
no nel corpo, e deduciamo che la stringa risultante nel linguaggio della variabile che
compare in testa. Chiameremo questa procedura inferenza ricorsiva.
Il secondo modo per definire il linguaggio di una grammatica applica le produzioni
dalla testa al coipo. Espandiamo il simbolo iniziale usando una delle sue produzioni (cio
usando una produzione la cui testa sia il simbolo iniziale). Espandiamo ulteriormente la
stringa risultante sostituendo una delle variabili con il corpo di una delle sue produzioni,
e cos via, fino a derivarne una stringa fatta interamente di terminali. 11 linguaggio della
grammatica linsieme di tutte le stringhe di terminali ottenute con questa procedura.
Questa tecnica detta derivazione.
184
Capitolo 5
W
()
(iii)
(iv)
(v)
(vi)
(vii)
(viti)
(ix)
Stringa
ricavata
Per il lin
guaggio di
Produzione
impiegata
Stringhe
impiegate
a
b
60
600
a
600
a + 600
(a + 600)
a * (a + 600)
/
T
T
T
E
E
E
E
E
5
6
9
9
1
1
2
4
3
-------
(U)
(rii)
00
M
(v), (vi)
(vii)
(v), (viti)
185
nelle righe (/) e (ft ), sono nel linguaggio della variabile E. La riga (vii) usa la produ
zione 2 per inferire che la somma di questi identiIicatori unespressione; la riga ( viii)
usa la produzione 4 per inferire che la stessa stringa, posta tra parentesi, unespressione,
c la riga (;) usa la produzione 3 per moltiplicare l'identificatore a per lespressione che
abbiamo trovato nella riga (vili).
Tl processo di derivazione di stringhe per applicazione di produzioni dalla testa al
corpo richiede la definizione di un nuovo simbolo di relazione. =. Supponiamo che
G = (VtTt PtS) sia una CFG. Sia una stringa di terminali e variabili, dove .4
una variabile. In altre parole a e 3 sono stringhe in (V U T)", e A in V. Sia .4 +7
una produzione di G. Allora scriviamo => . Se G risulta chiara dal contesto,
scriviamo semplicemente => . Si noti che un passo di derivazione sostituisce
una variabile in un punto qualsiasi della stringa con il corpo di una delle sue produzioni.
Possiamo estendere la relazione => fino a farle rappresentare zero, uno o pi passi di
derivazione, analogamente a come la funzione di transizione di un automa a stati finiti si
estende a . Per le derivazioni usiamo il simbolo * per denotare zero o pi passi", come
segue.
BASE Per qualsiasi stringa
Cr
1. et = 7i
2. = In
3. per i = 1 ,2 ,. . . . n 1. abbiamo 7 => 7 +i .
Se
a * (a + 00)
186
Capitolo 5
Al primo passo E viene sostituita dal coipo della produzione 3 (dalla Figura 5.2). Al
secondo passo si usa la produzione I per rimpiazzare la prima E con I, e cos via. Si
noti che abbiamo sistematicamente sostituito la variabile pi a sinistra nella stringa. A
ogni passo comunque possibile scegliere quale variabile sostituire, e al posto di questa
usare qualunque produzione. Per esempio al secondo passo avremmo potuto sostituire la
seconda E con (E) servendoci della produzione 4. In tal caso avremmo avuto E * E =PE * (E). Potevamo anche scegliere una sostituzione incapace di condurre alla stessa
stringa di terminali, per esempio la produzione 2 al primo passo: E => E + E. Infatti
nessuna sostituzione delle due E pu trasformare E + E in a * (a -I- 600).
Possiamo usare la relazione => per abbreviare la derivazione. Dalla base sappiamo
che E
E. Luso reiterato della parte induttiva fornisce E => E * E, E => I * E ,c
cos via, finch si ottiene E => a * (a -f 600).
I
due punti di vista, inferenza ricorsiva e derivazione, sono equivalenti. In altre parole
si deduce che una stringa di terminali si trova nel linguaggio di una certa variabile .4 se
e solo sc A => w. La dimostrazione per laboriosa, e la rimandiamo al Paragrafo 5.2.
jfc
5.1.4
Per ridurre il numero di scelte possibili nella derivazione di una stringa, spesso comodo
imporre che a ogni passo si sostituisca la variabile allestrema sinistra con il corpo di
una delle sue produzioni. Tale derivazione viene detta deriva-ione a sinistra (leftmost
derivation), e si indica tramite le relazioni => e => , rispettivamente per uno o molti
Irn-
Im
passi. Se la grammatica G in esame non chiara dal contesto, possiamo porre il nome G
sotto la freccia.
Analogamente possibile imporre che a ogni passo venga sostituita la variabile pi a
destra con uno dei suoi corpi. In tal caso chiamiamo la derivazione a destra (rightmost),
e usiamo i simboli => e => per indicare rispettivamente uno o pi passi di derivazione
Tm
rm
a destra. Qualora non fosse evidente, il nome della grammatica pu comparire anche in
questo caso sotto i simboli.
Esempio 5.6 La derivazione dellEsempio 5.5 una derivazione a sinistra. Possiamo
dunque descriverla come segue.
E => E * E => I * E
Im
Irn
Im
a * E =>
Irn
Im
a * (a + I) => a * (a
Im
-t- IO)
Im
Im
Im
187
Esiste una derivazione a destra che applica le stesse sostituzioni per ogni variabile,
sebbene in ordine diverso. Eccola.
rrn.
rrn
rrn
rrn
rrn
rrn
rrn
rrn
a * (a + 0U).
rrn
188
Capitolo 5
Paragrafo 5.2.
5.1.5
rm
Se G = (V, l\P, S ) una CFG. il linguaggio di G, denotato con L(G ) , linsieme delle
stringhe terminali che hanno una derivazione dal simbolo iniziale. In altri termini
L(G) = {w in I S 4
w}
(Solo se) Ora assumiamo che w sia in L (G pni); cio P =- w. Dobbiamo concludere che
u> palindroma. La dimostrazione uninduzione sul numero dei passi in una derivazione
di w da P.
189
BASE Sc la derivazione un solo passo, allora dobbiamo usare una delle tre produzioni
P ^ OPO 4
OrrO = w
oppure P => I P l => Ix l = w, dato che n + 1 passi significa almeno due passi e le
produzioni P > OPO e P I P l sono le uniche che permettono passi aggiuntivi. Si
osservi che in entrambi i casi P => x in n passi.
Per l'ipotesi induttiva sappiamo che x palindromo, cio x = x n . Ma se cos, allora
anche 0x0 e Lrl sono palindromi. Peresempio (OxO) ^ = Oxa O = OaO. Concludiamo
chc w palindromo e completiamo cos la dimostrazione.
5.1.6
Forme sentenziali
Le derivazioni dal simbolo iniziale producono stringhe che hanno un ruolo speciale e che
chiameremo forme sentenziali. Ossia, se G = (Vr. T. P. S) una CFG, allora qualunque
stringa a in (V U T)* tale che S => a una forma sentenziale. Sc S =>- a, allora a
Un
una forma sentenziale sinistra, sc S => a , allora a una forma sentenziale destra. Si
Sc
rrn
noti chc il linguaggio L(G) formato dalle forme sentenziali che sono in T*, cio chc
consistono unicamente di terminali.
Esempio 5.8 Consideriamo la grammatica per le espressioni della Figura 5.2. La stringa
F * (I + E) un esempio di forma sentenziale perch esiste una derivazione
E * (1 + E)
Dato che all'ultimo passo viene sostituita la E centrale, questa derivazione non n a
sinistra n a destra.
Come esempio di forma sentenziale sinistra consideriamo a, * E , con la derivazione a
sinistra
E => E * E =$> I * E
hn
Im
a*E
Im
La derivazione
E *E
rrn
E * (E) => E * (E + E)
rm
rrn
Capitolo 5
190
5.1.7
Esercizi
Esercizio 5.1.1 Ideate una grammatica libera dal contesto per ognuno dei seguenti lin
guaggi.
* a) Linsieme (OnI rt |n > 1 } , ossia linsieme di tutte le stringhe di uno o pi 0 seguiti
da un uguale numero di 1.
*! b) L'insieme [a7V c k |i j o j k), ossia linsieme delle stringhe di a seguite da
un certo numero di b seguite da un certo numero di c, tali che il numero di a sia
diverso dal numero di b o il numero di b sia diverso dal numero di c, o entrambi.
! c) L'insieme di tutte le stringhe di a e b che non sono della forma ww, cio non sono
uguali a una stringa ripetuta.
!! d) Linsieme di tutte le stringhe con un numero di 0 doppio rispetto al numero di 1.
191
S
A
B
-
->
-
0.4 I
07? I 17? I c
192
Capitolo 5
a) a
^C
|(
S >aS I Sb I a I b
a) Dimostrate per induzione sulla lunghezza della stringa chc nessuna stringa in L(G)
ha ba come sottostringa.
b) Descrivete L(G) in termini informali e giustificate la vostra risposta servendovi
della parte (a).
Esercizio 5.1.8 Considerale la CFG G definita dalle produzioni
5.2
Alberi sintattici
Alberi sintattici
193
5.2.1
X u X i ,..., X k
allora A * X\X-2 Xk una produzione in P. Si noti che un X pu essere e
solo nel caso in cui letichetta di un figlio unico, e quindi A * e una produzione
di G.
194
Capitolo 5
Esempio 5.9 La Figura 5.4 presenta un albero sintattico per la grammatica delle espres
sioni della Figura 5.2. La radice etichettata dalla variabile E. La produzione applicata
alla radice E E + E: i tre figli della radice hanno, a partire da sinistra, le etichette E,
+, od E. Per il figlio pi a sinistra della radice si applica la produzione E *1: il nodo
ha un solo figlio, etichettato 1.
Esempio 5.10 La Figura 5.5 presenta un albero sintattico per la grammatica delle palin
drome della Figura 5.1. Alla radice si applica la produzione P > OPU e al figlio di
mezzo della radice P > I P l . Al livello pi basso stata applicata la produzione P >e.
Questo caso, in cui il nodo etichettato dalla testa di una produzione ha un unico figlio,
etichettato , il solo in cui un nodo etichettato c pu fare la sua comparsa in un albero
sintattico.
A Iberi sintattici
5.2.2
195
I
a
L
L
)
+
Figura 5.6 Un albero sintattico che illustra come a * (a + 600) sia nel linguaggio della
grammatica delle espressioni.
Esempio 5.11 La Figura 5.6 un esempio di albero con una stringa terminale come pro
dotto e un simbolo iniziale alla radice; esso basato sulla grammatica delle espressioni
196
Capitolo 5
5.2.3
Ognuna delle nozioni presentate finora per descrivere il funzionamento di una grammatica
d essenzialmente gli stessi risultati sulle stringhe. In altre parole, data una grammatica
G (V, 1\P, S), dimostriamo che i seguenti enunciati si equivalgono:
1. Ia procedura di inferenza ricorsiva stabilisce che la stringa terminale w nel lin
guaggio della variabile A
2. A U w
3. A U w
Im
4. A U w
rm
derivazione
derivazione^------ a destra
_ albero
sintattico
inferenza
ricorsiva
Alberi sintattici
197
Due degli archi sono molto semplici e se ne tralascer dunque la dimostrazione forma
le. Se w ha una derivazione a sinistra da .4, allora ha di certo una derivazione da A . dato
che una derivazione a sinistra una derivazione. Analogamente, se w ha una derivazione
a destra, ha di certo una derivazione. Passiamo ora alla dimostrazione dei passi pi ardui
dellequivalenza.
5.2.4
Figura 5.8 Albero costruito nel caso di base del Teorema 5.12.
I. Se Xi un terminale, allora
terminale.
198
Capitolo 5
Figura 5.9 Lalbero usato nella parte induttiva della dimostrazione del Teorema 5.12.
Costruiamo poi un albero con radico A e prodotto w, come suggerito nella Figura 5.9. C'
una radice etichettata A, i cui figli sono X i , X 2, . . . . Xk- Si tratta di una scelta valida,
dato chc A * \ Xu una produzione di G.
Il nodo di ciascuna X i diventa la radice di un sottoalbero con prodotto
Nel ca
so (1). in cui X i un terminale, questo sottoalbero un albero banale, con un solo nodo,
etichettato X i. Il sottoalbero consiste quindi in un solo nodo, tglio della radice. Poi
ch nel caso (I) W i -- X i , la condizione che il prodotto del sottoalbcro sia W i viene
soddisfatta.
Nel caso (2) X i c una variabile. Invochiamo allora lipotesi induttiva per sostenere chc
esiste un albero con radice X i e prodotto W i . Nella Figura 5.9 questalbero agganciato
al nodo di X i.
L'albero costruito in questo modo ha radice .4 e prodotto formato dai prodotti dei
sottoalberi, concatenati da sinistra a destra. La stringa w\w2 Wk, ovvero w.
5.2.5
Vediamo ora come si costruisce una derivazione a sinistra a partire da un albero sintattico.
Il metodo per costruire una derivazione a destra si avvale degli stessi princpi e quindi non
lo tratteremo. Percapire come si costruiscono le derivazioni, consideriamo in primo luogo
Alberi sintattici
199
I => Ib =$ab
E + ( E ) = * E + ( I ) = * E + (Tb) ^ E + (ab)
l In effetti la locuzione libero dal contesto deriva appunto dalla possibilit di sostituire stringhe con varia
bili senza tener conto del contesto. Una classe pi generale di grammatiche, dette dipendenti dal contesto",
ammette sostituzioni solo se determinate stringhe sono presenti sia a sinistra sia a destra. Nella pratica odierna
le grammatiche dipendenti dal contesto non sono molto rilevanti.
200
Capitolo 5
in d u z io n e Un albero di altezza n, con n > 1, simile a quello della Figura 5.9. Esso ha
una radice etichettata A, con tgli etichettati X i . X 2, ... ,Xk a partire da sinistra. Lc X
sono terminali oppure variabili.
1. Se X i un terminale, definiamo Wj. come la stringa formata solamente da X.
2. Se Xi una variabile, allora devessere la radice di un sottoalbero con prodotto
fatto di terminali, chc chiameremo w;. Si noti che in questo caso il sottoalbero di
altezza inferiore a n, dunque possiamo
applicare lipotesi induttiva. In altre parole
5
esiste una derivazione a sinistra X , => w%.
|C
hn
Si osservi che w = w\W2 -WkCostruiamo una derivazione a sinistra di w, partendo dal passo A => X i X 2 XkAllora, per ogni = 1 ,2 ...., k, mostriamo in questordine che
Im
A => Wi W2 -WlX u i X u2 Xk
Im
Im
Im
procediamo con
Wi W2 W i- iX iX i+i X k =>
hn
Wi W2 ---W i- i iX i+ i X k =>
hn
Wi W2 Wi-IOL2XtYi Xk =>
Im
W2 * * *WiXi+lXi+2 * *Xk
Alberisiniaitici 201
11 risultato una derivazione A => w\w - UkXi+i XkIm
Quando i =
Esempio 5.15 Costruiamo la derivazione a sinistra per lalbero della Figura 5.6. Ci limi
tiamo al passo finale, in cui costruiamo la derivazione per lintero albero dalle derivazioni
die corrispondono ai sottoalberi della radice. In altri termini assumiamo che, applicando
ricorsivamcnte il metodo del Teorema 5.14. abbiamo dedotto che il sottoalbero radica
to nel primo figlio della radice ha la derivazione a sinistra E => I => a, mentre il
Im
Im
Im
(a + I) => (a
Im
hn
hn
Im
Im
hn
Per costruire una derivazione a sinistra per lintero albero, cominciamo con il passo
alla radice: E => E * E. Sostituiamo poi la prima E secondo la sua derivazione, facenIrn
Irn
Im
Dato che il simbolo * nella produzione usata alla radice non richiede alcuna deri
vazione. abbiamo gi trattato i primi due figli della radice. Completiamo la derivazione
applicando la derivazione E => (a+ 600) in un contesto in cui preceduta da a* e seguita
Im
Im
Im
Im
Im
Im
hn
hn
Im
espandiamo prima Xi,, usando una derivazione a destra, poi espandiamo Xie 1, e cos via,
fino a . Possiamo quindi enunciare il teorema senza dame la dimostrazione.
202
Capitolo 5
Teorema 5.16 Sia G = (V, T. P, S) una CFG, e supponiamo chc esista un albero sintat
tico con radice etichettata da una variabile A e con prodotto w, dove w in T*. Allora
esiste una derivazione a destra A => w nella grammatica G.
rrn.
5.2.6
Completiamo ora il ciclo suggerito dalla Figura 5.7 mostrando che, se esiste una derivazione A = w per una CFG, tramite la procedura di inferenza ricorsiva si pu stabilire
che w nel linguaggio di A . Prima di passare al teorema e alla dimostrazione, facciamo
qualche importante considerazione sulle derivazioni.
Sia data una derivazione A => X i X 2 - Xk => w. Allora possibile scomporre w
in segmenti, w = W\W2 Wfc, tali che X i => W i . Si noti che se X i un terminale,
allora W i = X i e la derivazione consta di zero passi. Dimostrare questa osservazione
non difficile. Si dimostra per induzione sul numero di passi della derivazione che se
X\X2 Xk
o, allora tutte le posizioni di o provenienti dallespansione di X i si
trovano a sinistra di tutte le posizioni che provengono dallespansione di X j . se i < j.
Se Xi una variabile, possiamo ottenere la derivazione X 1 => Wi partendo dalla
3
derivazione A => w ed eliminando:
9
jc
a) tutte le posizioni delle forme sentenziali che si trovano a sinistra o a destra delle
posizioni derivate da X i
b) tutti i passi chc non sono rilevanti per la derivazione di Wi da X i.
Illustriamo la procedura con un esempio.
Esempio 5.17 Consideriamo la seguente derivazione per Ia grammatica delle espressioni
della Figura 5.2:
w.
BASE Se la derivazione formata da un unico passo, allora A > w dev'essere una pro
duzione. Dato che w consiste solo di terminali, si conclude chc w nel linguaggio di A
nella base della procedura di inferenza ricorsiva.
INDUZIONE Supponiamo che la derivazione compia n + 1 passi c che lenunciato sia
valido per ogni derivazione di , o meno, passi. Scriviamo la derivazione come A =>
X 1 X 2 Xk => w. Allora possiamo scomporre w in w = u'i'Wo Wk, come abbiamo
visto prima del teorema, soddisfacendo le seguenti clausole.
a) Se X 1 un terminale, allora Wi = X 1.
'
b) Se X, una variabile, allora X i => W1. Dato che sicuramente il primo passo della
derivazione A => w non parte della derivazione X i => Wi, sappiamo che questa
derivazione ha al massimo n passi. Perci vi si pu applicare lipotesi induttiva, e
concludere che
nel linguaggio di
Abbiamo ora una produzione A > X 1 X 2 -Xh, dove Wi uguale a X, oppure se ne
conosce lappartenenza al linguaggio di X i. Nella successiva iterazione della procedu
ra di inferenza ricorsiva scopriremo che w_ii'2 nel linguaggio di A. Dato che
W1 W2 Wk = w, abbiamo mostrato che si dedotta lappartenenza di w al linguaggio
di A.
5.2.7
Esercizi
Esercizio 5.2.1 Scrivete gli alberi sintattici per la grammatica e ognuna delle stringhe
nell'Esercizio 5.1.2.
Esercizio 5.2.2 Sia G una CFG priva di produzioni con e come membro destro. Dimo
strate chc se w c in L(G), la sua lunghezza n, e ha una derivazione di m passi, allora w
ha un albero sintattico con n + rn nodi.
204
Capitolo 5
Esercizio 5.2.3 Supponiamo che tutto sia come nellEsercizio 5.2.2, ma che G possa
avere alcune produzioni con e come membro destro. Dimostrate che un albero sintattico
per una stringa w diversa da t pu avere fino a n + 2rn 1 nodi, ma non di pi.
Esercizio 5.2.4 Nel Paragrafo 5.2.6 abbiamo detto che se ]> Xk
allora
tutte le posizioni di a che derivano dallespansione di X r si trovano a sinistra di tutte le
posizioni che derivano dallespansione di X j , se i < j. Dimostratelo. Suggerimento:
svolgete uninduzione sul numero dei passi nella derivazione.
5.3
5.3.1
Parser
B -> B B I (B) I e
genera tutte e sole le stringhe di parentesi bilanciate. La prima produzione, B > B B ,
afferma che la concatenazione di due stringhe di parentesi bilanciate bilanciata; ci
ha senso perch possiamo abbinare le parentesi separatamente in ciascuna stringa. La
seconda produzione, B > (B), afferma che, se poniamo una coppia di parentesi ai due
capi di una stringa bilanciata, il risultato bilanciato. Anche questa regola sensata
perch, se abbiniamo le parentesi nella stringa interna e le eliminiamo, rimangono solo la
prima e lultima, adiacenti. La terza produzione. B > e, serve da fondamento, e afferma
che la stringa vuota bilanciata.
Questo ragionamento informale dovrebbe convincerci che Gbai genera solo stringhe di
parentesi bilanciate. Ci serve una dimostrazione dell'inverso: che ogni stringa di parentesi
bilanciate generata da questa grammatica. Non difficile ideare una dimostrazione per
induzione sulla lunghezza della stringa bilanciata; lasciamo al lettore lesercizio.
Abbiamo gi detto che linsieme delle stringhe di parentesi bilanciate non un lin
guaggio regolare. Ora lo dimostreremo. Se L(Gbai) fosse regolare, esisterebbe una co
stante n associata al linguaggio dal pumping lemma. Consideriamo la stringa bilanciata
u.' = (")n, formata da n parentesi aperte seguite da n parentesi chiuse corrispondenti. Se
scomponiamo w = xyz secondo il pumping lemma, y formata da sole parentesi aperte,
e quindi xz ha pi parentesi chiuse che aperte. Questa stringa non dunque bilanciata,
contraddicendo lipotesi che il linguaggio delle parentesi bilanciate sia regolare.
Naturalmente un linguaggio di programmazione non fatto di sole parentesi, ma esse
sono una parte fondamentale delle espressioni aritmetiche e condizionali. La grammatica
della Figura 5.2 pi rappresentativa della struttura delle espressioni aritmetiche, anche
se si limita a due operatori, + e *, e se comprende la struttura di dettaglio degli identifi
catori, che di solito trattata dall'analizzatore lessicale di un compilatore, come abbiamo
spiegato nel Paragrafo 3.3.2. Il linguaggio descritto nella Figura 5.2 non per regolare.
Per esempio, secondo questa grammatica, (no.)n unespressione accettabile. Possiamo
ricorrere al pumping lemma per provare che se il linguaggio fosse regolare anche una
stringa da cui abbiamo eliminato alcune parentesi aperte, lasciando a c tutte le parentesi
chiuse, sarebbe accettabile, mentre non lo .
206
Capilolo 5
S -> e I S S I iS I iSeS
Per esempio ieie, rie e tei sono sequenze lecite di if e else, e ciascuna generata dalla
grammatica. Esempi di sequenze illecite, non generate dalla grammatica, sono et e ieeii.
Un modo semplice (lasciamo la verifica della sua correttezza come esercizio) per sta
bilire se una sequenza di i c di e generata dalla grammatica consiste nel considerare gli
e a partire da sinistra. Si cerca il primo i a sinistra del primo a. Se non c, la stringa
non supera la prova e non appartiene al linguaggio. Se c, lo cancelliamo insieme alle
in esame. Se non ci sono altri e, la stringa passa la prova e appartiene al linguaggio. Se
ce ne sono altri, si prende in esame il prossimo.
Esempio 5.20 Consideriamo la stringa ice. Il primo c abbinato all'i alla sua sinistra.
Cancellandoli si ottiene la stringa e. Poich ci sono altri e, consideriamo il successivo.
Alla sua sinistra non ci sono i: la verifica fallita, e ice non appartiene al linguaggio. La
conclusione corretta perche' in un programma C non ci possono essere pi else di if.
Come altro esempio consideriamo iieie. Dopo aver abbinato il primo e con Vi alla
sua sinistra, resta He. Dopo aver abbinato le rimanente con Vi alla sua sinistra, resta
i. Non ci sono altri e, quindi la verifica riuscita. Anche questa conclusione corretta
perch la sequenza iieie corrisponde a un programma C con una struttura simile a quella
della Figura 5.10. Lalgoritmo di accoppiamento rivela inoltre quale if corrisponde a un
dato else e passa linformazione al compilatore. Questa informazione essenziale per
generare la logica del controllo del flusso voluta dal programmatore.
5.3.2
if (Condizione)
207
if (Condizione) Istruzione;
else Istruzione;
if (Condizione) Istruzione;
else Istruzione;
Figura 5.10 Una struttura if-else; i due else sono abbinati agli if precedenti; il primo il'e
isolalo.
quella impiegata qui soltanto per alcuni dettagli. A ogni produzione associata unazione,
cio un frammento di codice C, eseguita quando si crea un nodo deNalbero sintattico
che, insieme ai suoi figli, corrisponde alla produzione. Di solito lazione consiste nel
codice per costruire il nodo, ma in alcune applicazioni di YACC lalbero non viene di
fatto costruito e lazione e di altro tipo, come emettere un frammento di codice oggetto.
Esempio 5.21 La Figura 5.11 illustra un esempio di CFG nella notazione di YACC.
La grammatica quella della Figura 5.2. Abbiamo omesso le azioni, lasciando solo le
parentesi graffe (obbligatorie) e la loro posizione nellinput di YACC.
Exp : Id
Exp '+ ' Exp
Exp '* ' Exp
' (' Exp ') '
{, ..}
{ ...}
{ ...}
{ .-}
: 'a '
'b'
Id 'a'
Id 'b'
Id '0'
Id '1'
{. . . }
Id
{ ...}
{..-}
{...}
{..-}
{...}
Capitolo 5
208
Lc stringhe di lettere e cifre non incluse fra apici sono nomi di variabili. Ci siamo
serviti di questa possibilit per dare alle due variabili nomi descrittivi, Exp e Id ,
ma avremmo potuto chiamarle E t L
a
5.3.3
Linguaggi di markup
209
210
Capilolo 5
La Figura 5.13 illustra una CFG che descrive la struttura della parte di HTML trattata fin
qui. Alla riga (1) si suggerisce che un carattere pu essere a o A, oppure un altro
carattere compreso nel corredo di HTML. Lc due produzioni alla riga (2) dicono che
Text pu essere la stringa vuota o un carattere lecito seguito da un testo. In altri termini
Text consta di zero o pi caratteri. Notiamo che < e > non sono caratteri leciti, ma sono
rappresentati dalle sequenze & l t ; e & g t;. In questo modo non possiamo inserire per
errore un tag in Text.
1.
Char
a\A\
2.
Text
>
e. \
Char Text
3.
Doc
>
e I Element Doc
4.
Element
* Text |
<EM> Doc </EM>
<P> Doc I
<OL> List, </OL>
5.
ListItern
6.
List
e I Listltern List
La riga (3) dice che un documento una sequenza di zero o pi elementi. Secondo la
riga (4) un elemento un testo, un documento posto in risalto, unapertura di paragrafo
seguita da un documento, o un elenco. I punti di sospensione indicano altre produzioni
per ElemenL corrispondenti agli altri tag di HTML. Alla riga (5) scopriamo che una
voce di elenco fatta dal tag < L I> seguito da un documento; infine la riga (6) dice che
un elenco una sequenza di zero o pi voci.
Per alcuni aspetti di HTML non occorrono le grammatiche libere dal contesto: sono
sufficienti le espressioni regolari. Per esempio le righe (1) e (2) della Figura 5.13 dicono
che Text rappresenta lo stesso linguaggio dellespressione regolare (a + A + )*. Per
altri aspetti, invece, le CFG sono necessarie. Per esempio le coppie formate da un tag di
apertura e il corrispondente tag di chiusura, come <EM> e </E M >, si comportano come
parentesi bilanciate, che sappiamo non regolari.
5.3.4
XM L e DTD
Il fatto chc !HTML sia descritto da una grammatica non in se notevole. Dato che
praticamente tutti i linguaggi di programmazione si possono descrivere per mezzo di una
CFG, sarebbe sorprendente se ci non valesse per THTML. Se invece ci occupiamo di un
altro importante linguaggio di markup, XML, scopriamo che le CFG svolgono una parte
cruciale nel suo impiego pratico.
Lo scopo di XML non quello di descrivere l'apparenza di un documento; questo
compilo di HTML. XML, invece, descrive la semantica di un testo. Per esempio un
testo come 12 Maple St. sembra un indirizzo. Ma lo veramente? In XML una frase
che rappresenta un indirizzo racchiusa fra tag appropriati. Per esempio:
<!DOCTYPE nome-della-DTD [
elenco di definizioni di elementi
]>
La definizione di un elemento ha invece questa forma.
212
Capitolo 5
2. Il termine speciale # PCDATA, che denota qualsiasi testo non contenga tag di XML.
Questo termine ha lo stesso compito della variabile Text nellEsempio 5.22.
Gli operatori ammessi sono i seguenti.
1. Il simbolo |, che denota lunione, come nella notazione di UNIX delle espressioni
regolali trattata nel Paragrafo 3.3.1.
<!DOCTYPE PcSpecs [
< ELEMENT PCS (PC*)>
< ELEMENT PC (MODEL, PRICE, PROCESSOR, RAM, DISK+)>
< ELEMENT MODEL (#PCDATA)>
< ELEMENT PRICE (#PCDATA)>
< ELEMENT PROCESSOR (MANF, MODEL, SPEED)>
< ELEMENT MANF (#PCDATA)>
< ELEMENT MODEL (#PCDATA)>
< ELEMENT SPEED (#PCDATA)>
< ELEMENT RAM (#PCDATA)>
< ELEMENT DISK (HARDDISK
CD I DVD)>
< ELEMENT HARDDISK (MANF, MODEL, SIZE)
< ELEMENT SIZE (#PCDATA)>
< ELEMENT CD (SPEED)>
< ELEMENT DVD (SPEED)>
]>
Figura 5.14 Una DTD per personal computer.
(MANF, MODEL,
S P E E D )>
(H A RDD ISK
I CD
I D V D )>
214
Capitolo 5
<PCS>
<PC>
<MODEL>4 56 O</MODEL>
<PRICE>$2295</PRICE>
<PROCESSOR>
<MANF>Intel</MANF>
<MODEL>Pentiuiri< /MODEL>
<SPEED>800MHz</SPEED>
</PROCESSOR>
<RAM>256</RAM>
<DISK> <HARDDISK>
<MANF>Maxtor</MANF>
<MODEL>Diamond</MODEL>
<SIZE>30.5Gb</SIZE>
</HARDDISK></DISK>
<DISK><CD>
<SPEED>32x</SPEED>
</CD></DISK>
</PC>
<PC>
</PC>
</PCS>
Figura 5.15 Porzione di un documento conforme alla struttura della DTD nella
Figura 5.14.
definisce DISK in modo difforme dal corpo di una produzione. In questo caso la soluzio
ne semplice: interpretiamo la regola come tre produzioni; la barra verticale svolge lo
stesso compito affidatole nella notazione abbreviata di produzioni con testa comune, che
abbiamo definito in precedenza. La regola quindi equivalente a tre produzioni:
215
1. La produzione ha forma A > E\. E2, dove E\ ed E2 sono espressioni ammesse nel
linguaggio delle DTD. Questo il caso della concatenazione. Si introducono due
nuove variabili, B c C, chc non compaiono altrove nella grammatica. Si sostituisce
A E i, E 2 con le produzioni
,4 - B C
n-> E 1
C -> E2
La prima, A *B C , lecita nelle CFG. Le altre due possono non esserlo, ma i
loro corpi sono pi corti del corpo della produzione originaria; possiamo quindi
convertirli induttivamente nella forma delle CFG.
2. La produzione della forma A E\ |E 2. Per loperatore di unione si sostituisce
la produzione con altre due:
A - E 1
A - E2
Anche qui le due nuove produzioni possono non essere lecite, ma i loro corpi sono
pi brevi dell'originale. Possiamo quindi applicare ricorsivamente le regole fino a
trasformarle in produzioni nella forma richiesta dalle CFG.
3. La produzione della forma .4 (E i )*. Introduciamo una nuova variabile. D,
che non compare altrove, e sostituiamo la produzione con
2 16
Capitolo 5
.4 -> BA
A -> f
B >E i
A -> BA
A-* B
B - E 1
5. La produzione della forma A > (E i )?. La sostituiamo con
A ^e
A -* E]
Esempio 5.24 Consideriamo il problema di convertire la regola per DTD
Pc
AB
A M odel Price Processor Rmri
B * D isk+
Solo lultima non in forma accettabile. Introduciamo unaltra variabile, C, e le
produzioni
B -> CB I C
C -> Disk
In questo caso particolare, poich lespressione derivata da A una semplice concate
nazione di variabili e Disk una variabile, A e C non sono in realt necessarie. Possiamo
invece definire le seguenti produzioni:
5.3.5
Esercizi
Esercizio 5.3.1 Dimostrate che una stringa di parentesi bilanciate, nel senso dellEsempio 5.19, generata dalla grammatica B * BB \(B) |e. Suggerimento: procedete per
induzione sulla lunghezza della stringa.
Esercizio 5.3.2 Consideriamo linsieme di tutte le stringhe di parentesi bilanciate di due
tipi, tonde e quadre. Possiamo trovare stringhe di questo tipo prendendo Ic espressioni
del C (in cui le parentesi tonde si adoperano per delimitare gruppi e per gli argomenti
delle chiamate di funzioni, mentre le parentesi quadre segnalano gli indici degli array) e
cancellando tutti i simboli tranne le parentesi. Per esempio
f ( a [ i ] * ( b [ i ] [j ] , c [ g ( x ) ] ) , d [ i ] )
diventa la stringa di parentesi bilanciate ( [ ] ( [ ] [ ] [ ( ) ] ) [ ] ) . Ideate una grammatica
per !insieme di tutte e sole le stringhe di parentesi, tonde e quadre, bilanciate.
Esercizio 5.3.3 Nel Paragrafo 5.3.1 abbiamo esaminato la grammatica
S - 6 I SS iS I iSeS
e affermato chc possiamo verificare l'appartenenza al suo linguaggio L ripetendo le ope
razioni elencate qui sotto, a partire da una stringa w, che cambia a ogni ripetizione.
1. Se la stringa in esame comincia per c, w non appartiene a L.
2. Se la stringa non contiene e (pu contenere degli i), w appartiene a L.
3. Altrimenti cancella il primo e e Yi alla sua immediata sinistra. Ripeti la procedura
con la nuova stringa.
Dimostrate che la procedura stabilisce correttamente quali stringhe appartengono a L.
Esercizio 5.3.4 Aggiungete le forme seguenti alla grammatica per HTML della Figu
ra 5.13.
* a) Una voce di elenco devessere terminata dal tag di chiusura < / L l > .
2 18
Ccipilolo 5
< I DOCTYPE CourseSpecs
<! ELEMENT
<!ELEMENT
<! ELEMENT
<! ELEMENT
<!ELEMENT
<!ELEMENT
[
COURSES (COURSE+)>
COURSE (CNAME, PROF, STUDENT*, TA?)>
CNAME (#PCDATA)>
PROF (#PCDATA)>
STUDENT (#PCDATA)>
TA (#PCDATA)>
]>
5.4
Come abbiamo visto, spesso le applicazioni delle CFG si lbndano sulla capacit di una
grammatica di associare una struttura a un file. Nel Paragrafo 5.3, per esempio, abbiamo
studialo come usare le grammatiche per imporre una struttura a programmi e documen
ti. Implicitamente abbiamo ipotizzato che una grammatica associ in modo univoco una
struttura a ogni stringa del suo linguaggio. Vedremo per che non tutte le grammatiche
generano strutture univoche.
Se una grammatica non genera strutture univoche, talvolta possiamo modificarla per
raggiungere lo scopo. Purtroppo in certi casi loperazione non possibile. Ci sono infatti
dei CFL inerentemente ambigui; ogni grammatica di un tale linguaggio associa pi di
una struttura ad alcune stringhe del linguaggio.
5.4.1
Grammatiche ambigue
Torniamo alTesempio corrente; la grammatica delle espressioni nella Figura 5.2. Questa
grammatica genera espressioni con qualsiasi sequenza degli operatori * e +; le produzioni
E >E + E\ E * E permettono di generarle in qualsiasi ordine.
Esempio 5.25 Consideriamo per esempio la forma sentenziale E + E * E. che ha due
derivazioni da E:
1. E = > + E = ^ E + E * E
2. = * = E + E * E
Notiamo che nella derivazione (1 ) la seconda E sostituita da E * E . mentre nella deriva
zione (2) la prima E sostituita da E + E. La Figura 5.17 presenta i due alberi sintattici,
diversi tra loro.
219
(a)
+
(b)
2. E ^ E + E ^ E - \ - I = > T - \ - I ^ I - \ - b ^ a + b
Per quanto diverse. Ie due derivazioni non danno luogo a strutture realmente differenti;
ciascuna dice che a e b sono identificatori e che se ne devono sommare i valori. Di fatto,
ciuando si applica la costruzione dei Teoremi 5.18 e 5.12, entrambe producono lo stesso
albero.
220
Capitolo 5
I
due esempi precedenti suggeriscono che lambiguit non risulta da derivazioni mul
tiple, ma dall'esistenza di due o pi alberi sintattici. Perci diciamo che una CFG G =
( V, T, P. S ) ambigua se esiste almeno una stringa w in Tmper la quale possiamo trovare
due alberi sintattici distinti, ciascuno con la radice etichettata S e con prodotto w. Se ogni
stringa ha al massimo un albero sintattico, la grammatica non ambigua.
Nciriisempio 5.25 abbiamo avvialo una dimostrazione dellambiguit della gramma
tica della Figura 5.2. Resta solo da provare che gli alberi nella Figura 5.17 possono essere
completati fino a prodotti costituiti da soli terminali. La Figura 5.18 un esempio del
completamento.
a
(a)
a
(b)
Figura 5.18 Alberi con prodotto a -I-a * a, che dimostrano lambiguit della grammatica
delle espressioni.
5.4.2
In un mondo ideale sapremmo definire un algoritmo per eliminare le ambiguit dalle CriG
come abbiamo definito, nel Paragrafo 4.4, un algoritmo per eliminare gli stati inutili di
un automa finito. Sorprendentemente, come mostreremo nel Paragrafo 9.5.2, non esiste
neppure un algoritmo che dica se una CFG ambigua. Non solo: vedremo nel Paragra
fo 5.4.4 che ci sono linguaggi liberi dal contesto che hanno solo CHG ambigue; per questi
linguaggi eliminare lambiguit impossibile.
Per fortuna la situazione non nella pratica cos critica. Per Ie strutture sintattiche
tipiche dei linguaggi di programmazione usuali, esistono tecniche ben note per eliminare
221
222
Capitolo 5
Esempio 5.27 La Figura 5.19 presenta una grammatica non ambigua che genera lo stesso
linguaggio di quella della Figura 5.2. I linguaggi delle variabili F, T ed E sono i fattori,
i termini e le espressioni, come definiti pi sopra. Questa grammatica ammette un solo
albero sintattico per la stringa a + a * a; lo vediamo nella Figura 5.20.
1
F
> a I &I Io I Ib I 70 | / I
- \()
->
F\T*F
T IE +T
Per come sono fatte le produzioni di T, l'unico albero sintattico di una sequenza
di fattori quello che spezza / 1 * /2 * * fn , con ri > 1, nel termine / 1 *
/2 * * I n - 1 c nel fattore fn . Infatti F non pu generare espressioni come
f n - 1 * fn senza introdurre parentesi che le racchiudano. Non possibile perci
che applicando la produzione T * T * F. da F derivi unespressione che non sia
l'ultimo fattore. In altre parole lalbero sintattico di un termine pu avere solo la
forma della Figura 5.21.
Allo stesso modo un'espressione una sequenza di termini legati da +. Quando
applichiamo la produzione E * E + T per derivare t\+ 2 H---+ tn, da T deve
derivare soltanto Ln, mentre dalla E nej corpo deriva t\+ 2 --- H n-I-Il motivo
di nuovo che da T non pu derivare la somma di due o pi termini senza parentesi
che li racchiudano.
5.4.3
224
Capitolo 5
hn
a + a * T => a + a. * a
Im
Im
Im
Im
Im
Im
E * E = T + E1* E
Im
Im
a + E * E => a + I * E =>
Im
Im
hn
Notiamo che le due derivazioni sono diverse. Questo esempio non dimostra il teorema,
ma chiarisce come le differenze negli alberi impongano di seguire passi diversi in una
derivazione a sinistra.
Teorema 5.29 Per ogni grammatica G = (V,T, P, S ) e per ogni stringa w in T*, w ha
due alberi sintattici distinti se e solo se ha due distinte derivazioni a sinistra da S.
DIMOSTRAZIONE (Solo se) Esaminando la costruzione di una derivazione a sinistra a
partire da un albero sintattico nella dimostrazione del Teorema 5.14, osserviamo che, in
corrispondenza del primo nodo in cui gli alberi applicano produzioni diverse, anche le
due derivazioni a sinistra applicano produzioni diverse, e sono perci distinte.
(Se) Non abbiamo ancora trattato la costruzione diretta di un albero sintattico da una
derivazione a sinistra, ma lo schema non difficile. Si comincia da un albero con la sola
radice etichettata S. Si esamina la derivazione un passo per volta. A ogni passo si deve
sostituire una variabile, corrispondente al nodo pi a sinistra nellalbero in costruzione,
privo di figli, ma etichettato da una variabile. Dalla produzione usata in questo passo della
derivazione si stabilisce quali sono i figli del nodo. Se ci sono due derivazioni distinte, al
primo passo in cui si differenziano, i nodi da costruire avranno sequenze diverse di figli;
questa differenza garantisce che gli alberi sintattici sono distinti.
5.4.4
Ambiguit inerente
Un linguaggio L libero dal contesto si dice inerentemente ambiguo se tutte le sue gram
matiche sono ambigue. Se anche una sola grammatica per L non ambigua, L non
ambiguo. Abbiamo osservato, per esempio, che il linguaggio delle espressioni genera
to dalla grammatica della Figura 5.2 in realt non ambiguo. Infatti, anche se quella
grammatica ambigua, ce n unaltra non ambigua per lo stesso linguaggio: quella della
Figura 5.19.
225
%left '+'
%left
226
Capitolo 5
S
A
B
C
D
-
>
-
->
AB I C
aA b I ab
cBd cd
aCd I uDd
bDc i bc
2. S => C
Im
Im
Im
aCd
Im
Im
Im
Im
Cl
b
(a)
c
(b)
In ogni caso non possiamo fare a meno di un meccanismo per generare gli a in modo che
corrispondano al numero di b.
Analogamente possiamo sostenere che devesserci una variabile come t, che genera
lo stesso numero di c e di d. La grammatica deve inoltre comprendere variabili chc svol
gano il compito di C (generare lo stesso numero di a e di d) c quello di D (generare lo
stesso numero di b e di c). Una volta formalizzato, questo ragionamento dimostra che,
comunque si modifichi la grammatica, essa deve generare almeno alcune delle stringhe
della forma anbncnd" nei due modi della grammatica della Figura 5.22.
5.4.5
Esercizi
S - aS I aSbS \
c
Questa grammatica ambigua. Mostrate che, in particolare, la stringa aab ha due:
a) alberi sintattici
228
Capitolo 5
b) derivazioni a sinistra
c) derivazioni a destra.
! Esercizio 5.4.2 Dimostrate che la grammatica dellEsercizio 5.4.1 genera tutte e sole le
stringhe di e b tali che ogni prefisso contiene almeno tanti a quanti b.
*! Esercizio 5.4.3 Trovate una grammatica non ambigua per il linguaggio dellEsercizio 5.4.1
!! Esercizio 5.4.4 Nella grammatica dcllEscrcizio 5.4.1 alcune stringhe di a. e 6 hanno un
solo albero sintattico. Ideate un modo efficiente per stabilire se una data stringa possiede
questa propriet. Il metodo prova tutti gli alberi sintattici per vedere quali hanno come
prodotto la stringa assegnata non abbastanza efficiente.
! Esercizio 5.4.5 Questo problema riguarda la grammatica dell'Esercizio 5.1.2, che ripor
tiamo qui.
5
A
D
-
-+
A ID
OA I e
U S I \D I e
E -> + EE I * E E I -EE\x\y
a) Trovate una derivazione a sinistra e una a destra, e un albero di derivazione, per la
stringa +*-xyxy.
! b) Dimostrate che la grammatica non ambigua.
Riepilogo
5.5
229
Riepilogo
230
Capitolo 5
possibile trovare una grammatica non ambigua chc genera lo stesso linguaggio.
Purtroppo la grammatica non ambigua spesso pi complessa della pi semplice
grammatica ambigua per il linguaggio. Esistono anche alcuni linguaggi liberi dal
contesto, di solito piuttosto artificiali, chc sono inerentemente ambigui, vale a dire
che ammettono solo grammatiche ambigue.
5.6
Bibliografia
11 primo a proporre le grammatiche libere dal contesto come metodo descrittivo per i
linguaggi naturali fu Chomsky [41. Poco dopo unidea simile venne usata per descrivere
linguaggi di programmazione: il Fortran da Backus [21 e !'Algol da Naur [71. A volte
perci la forma di una CFG detta "di Backus-Naur.
Lambiguit nelle grammatiche fu individuata come problema quasi contemporanea
mente da Cantor [3] e Floyd [5]. Il primo a trattare lambiguit inerente fu Gross [6J.
Per le applicazioni delle CFG nei compilatori si veda [IJ. Le DTD sono definite nei
documenti standard per XML [81.
1. A. V. Aho, R. Sethi, J. D. Ullman, Compilers: Principles, Techniques, and Tools,
Addison-Wesley. Reading MA, 1986.
2. J. W. Backus, The syntax and semantics of the proposed international algebraic
language of the Zurich ACM-GAMM conference, Proc. Intl. Confi on Information
Processing (1959), UNESCO, pp. 125-132.
3. D. C. Cantor, "On the ambiguity problem of Backus systems, .I. ACM 9:4 (1962),
pp. 477-479.
4. N. Chomsky, Three models for the description of language, IRE Trans, on Infor
mation Theory 2:3 (1956), pp. 113-124.
Bibliografia
231
Capitolo 6
Automi a pila
1 linguaggi liberi dal contesto sono definiti da automi del tipo detto a pila (p u s h d o w n
a u t o m a to n ), unestensione degli automi a stati finiti non deterministici con c-transizioni.
che uno dei modi di definire i linguaggi regolari. Un automa a pila essenzialmente
un f-NFA con laggiunta di una pila (S ta c k i ). Le operazioni possibili sullo stack: lettu
ra, inserimento ed eliminazione, avvengono solo alla sommit, come nella struttura dati
omonima.
In questo capitolo definiamo due versioni diverse di automa a pila: la prima accetta
entrando in uno stato accettante, come fanno gli automi a stati finiti; la seconda accetta
vuotando lo stack, a prescindere dallo stato in cui si trova. Mostreremo chc queste due
varianti accettano proprio i linguaggi liberi dal contesto; in altre parole le grammatiche
possono essere convertite in automi a pila equivalenti, e viceversa. Inoltre considereremo
brevemente la sottoclasse degli automi a pila deterministici, che accettano tutti i linguaggi
regolari, ma solo un sottoinsieme proprio dei CFL. Poich gli automi a pila deterministici
operano in modo simile ai parser nei compilatori, importante osservare quali costrutti
linguistici sono in grado di riconoscere c quali no.
6.1
In questo paragrafo presentiamo gli automi a pila, dapprima in termini informali, poi
formalmente.
1Poich entrato nelluso comune, abbiamo preferito impiegare in questo contesto il termine stack" anzich
pila'.
234
6.1.1
Capitolo 6
Introduzione informale
Un automa a pila in sostanza un automa a siati finiti non deterministico con -transizioni
e una capacit aggiuntiva: uno stack in cui pu memorizzare una stringa di simboli.
A differenza dellautoma a stati finiti, grazie allo stack lautoma a pila pu ricordare
una quantit illimitata di informazioni. Tuttavia, diversamente da un computer generico,
che a sua volta pu ricordare quantit di informazioni arbitrariamente grandi, l'automa
a pila pu accedere alle informazioni nello stack solo in modo "last-in-first-out (ultimo
arrivato, primo servito).
Ne risulta che esistono linguaggi chc potrebbero essere riconosciuti da un programma,
ma non lo sono da nessun automa a pila. In effetti gli automi a pila riconoscono tutti
e soli i linguaggi liberi dal contesto. Molti linguaggi sono liberi dal contesto, inclusi
alcuni linguaggi che non sono regolari, come abbiamo visto, ma esistono anche linguaggi
di facile descrizione che non sono liberi dal contesto, come vedremo nel Paragrafo 7.2.
Un esempio di linguaggio non libero dal contesto {0'T2rt | n > I }, linsieme delle
stringhe che contengono gruppi uguali di 0, 1 e 2.
Input
Accetta/rifiuta
Figura 6.1 Un automa a pila in sostanza un automa a stati finiti con una struttura dati a
stack.
Possiamo immaginare informalmente un automa a pila come il dispositivo illustrato nella
Figura 6.1. Un controllo a stali finiti legge linput, un simbolo per volta. Lautoma a pila
pu osservare il simbolo alla sommit dello stack c pu basare la transizione sullo stato
corrente, sul simbolo di input e sul simbolo alla sommit dello stack. In alternativa pu
fare una transizione spontanea, usando e come input in luogo di un simbolo effettivo.
In una transizione lautoma compie tre operazioni.
1. Consuma dallinput il simbolo che usa nella transizione. Nel caso speciale di e non
si consuma alcun simbolo di input.
2. Passa a un nuovo stalo, che pu essere o no uguale al precedente.
235
3. Sostituisce il simbolo in cima allo stack con una stringa. La stringa pu essere e,
chc corrisponde a togliere dallo stack. Pu anche essere lo stesso simbolo che c era
prima alla sommit dello stack; in questo caso lo stack non subisce nessun cambia
mento effettivo. Oppure pu essere un altro simbolo, con l'effetto di trasformare la
sommit dello stack senza inserire o togliere. Infine il simbolo in cima allo stack
pu essere sostituito da due o pi simboli, con leffetto di cambiare (eventualmente)
il simbolo alla sommit, e di inserire poi uno o pi simboli nuovi.
la fine di w. A questo punto w si trover nello stack, con il suo estremo destro
alla sommit e il suo estremo sinistro in fondo. Indichiamo questa scelta portan
doci spontaneamente nello stato <71 . Dato che si tratta di un automa non determi
nistico, facciamo in effetti due congetture: supponiamo di aver visto la fine di w,
ma rimaniamo anche nello stato <70 e continuiamo a leggere i simboli di input e a
memorizzarli nello stack.
3. Una volta che ci troviamo nello stato q-\, confrontiamo il successivo simbolo di
input con il simbolo alla sommit dello stack. Se corrispondono, consumiamo I
simbolo di input, eliminiamo lelemento in cima allo stack e procediamo. Se invece
non corrispondono, abbiamo formulalo una congettura erronea, dato che w non
seguita da
come avevamo ipotizzato. Questo ramo quindi muore, sebbene
altri rami dellautoma non deterministico possano sopravvivere e alla line condurre
allaccettazione.
4. Se alla fine lo stack vuoto, abbiamo effettivamente letto w seguito da w R. Accet
tiamo dunque linput letto fino a questo punto.
2Potrcmmo definire un automa a pila anche per L pa/, chc c il linguaggio di cui abbiamo visto la grammatica
nella Figura 5.1. Daltronde L wwr. essendo un po' pi semplice, ci permette di focalizzare meglio i concetti di
fondo che riguardano gli automi a pila.
236
6.1.2
Capitolo 6
La notazione formale per un automa a pila IPDA, Pushdown Automaton) include sette
componenti:
P = ( Q ^ , T , S , q o , Z (uF)
Spieghiamo il loro significato.
fi: la funzione di transizione. Come per un automa a stati finiti, 6 governa il com
portamento dellautoma. In termini formali prende come argomento una tripla
(q, a, X ) in cui:
1. q uno stato in Q
Esempio 6.2 Definiamo un PDA P che accetti il linguaggio Lwwr dellEscmpio 6.1.
Dobbiamo chiarire anzitutto alcuni particolari che non sono presenti nellesempio, ma
risultano utili nella gestione dello stack. Useremo il simbolo di stack Zo per indicare il
fondo dello stack. Questo simbolo fa s che, dopo aver eliminato w dallo stack c dedotto
237
Vietato mescolare
In determinate situazioni un PDA pu scegliere tra diverse coppie. Per esempio
supponiamo che (q, . X ) {(p, Y Z ) , (r , e)}. Nel compiere la mossa dobbia
mo scegliere una coppia nella sua integrit: non possiamo prendere uno stato da
una coppia e una stringa da un'altra. Di conseguenza nello stato q , con X alla
sommit dello stack, leggendo a possiamo andare nello stato/; e sostituire X con
Y Z , oppure possiamo passare allo stato r ed eliminare A'. Non possiamo andare
nello stato p ed eliminare X , c non possiamo passare allo stato r e sostituire X
con y Z .
di aver letto w w n . ci sia ancora qualcosa nello stack che permette una transizione verso
lo stato accettante q?. Conseguentemente il nostro PDA per L wwr pu essere descritto da
2. 6(q0, 0,0) = {(qQ, 00)}, % o,0 .1 ) = {(0, 0 1 )}, '(g0, LO) = {(r;0,1 0 ) } e
<5(qr0, 1. I) = {(q0, 11)}- Queste quattro regole simili permettono di rimanere nello
stato qo e di leggere i simboli in input, inserendo ognuno di questi alla sommit
dello stack e lasciando il simbolo precedente.
3. 6(q0, e , Z 0) = {(q\,Zo)}, ^ 0, c.0) = {(<?i,0)} e 6(q0, e, 1) = {(qi, 1)}. Queste
tre regole permettono a P di andare spontaneamente dallo stato q0 allo stato q\ (su
input e) lasciando intatto qualunque simbolo si trovi alla sommit dello stack.
4. d(<7i , 0 , 0 ) = { (qi , e )} e 5(<7i , I. 1) =
)}- Nello stato q\ possiamo ora abbi
nare i simboli di input con i simboli alla sommit dello stack ed eliminarli quando
sono uguali.
5. 6(qi,t, Zo) = {(2 , Zo)}. Infine, se il segnale di fondo si trova in cima allo stack
e siamo nello stato qi, abbiamo trovato un input della forma Itnrii. Lautoma passa
in q-2 e accetta.
238
6.1.3
Capitolo 6
0 , 0 /0 0
0 , l/o i
1 , 0/10
0, 0/
I , 1/
1,1/11
, I / I
Esempio 6.3 II PDA dellEsempio 6.2 rappresentato dal diagramma della Figura 6.2.
6.1.4
239
Finora abbiamo solo una nozione informale di come un PDA computa. Intuitivamente
il PDA passa da una configurazione allaltra reagendo ai simboli di input (o a c), ma,
diversamente dagli automi a stati finiti, dove lo stato e lunico elemento significativo, la
configurazione di un PDA comprende sia lo stato sia il contenuto dello stack. Essendo
di grandezza arbitraria, lo stack spesso la parte pi importante della configurazione di
un PDA. E utile inoltre rappresentare come parte della configurazione la porzione residua
dellinput.
Di conseguenza rappresentiamo una configurazione come una tripla (<7, w, 7 ), dove
1.
q lo stato
2.
w l'input residuo
Questa mossa riflette lidea che, consumando a (che pu essere r) dallinput e sostituendo
X alla sommit dello stack con a , si pu andare dallo stato q allo stato p. Notiamo che
quanto rimane in input, tu, e quanto sta sotto la sommit dello stack, , non influenza
l'azione del PDA. ma viene semplicemente conservato e ha la possibilit di influenzare
11 seguilo.
Definiamo inoltre il simbolo F , o F quando il PDA P sottinteso, per rappresentare
zero o pi mosse del PDA.
fl
Vale a dire I f
J se esiste una sequenza di ID K, K 2 , , K u tale che I = K \ ,
J K n, c per ogni i = 1 , 2 , . . . , ri 1 abbiamo K i h +\.
240
Capitolo 6
Esem pio 6.4 Consideriamo lazione del PDA dellEsempio 6.2 su input 1111. Poich
lo stato iniziale e Z0 il simbolo iniziale, la ID iniziale (qo, 1111, Z 0). Su questo input
il PDA ha la possibilit di fare diverse congetture sbagliate. Lintera sequenza di ID che
il PDA pu raggiungere dalla ID iniziale (qo, 1111, Z 0) rappresentata nella Figura 6.3.
Le frecce indicano la relazione K
, I l l l 1Z 0 ) - ^ ( ,
Illl-Z0 )
( Cfi ,11 , Z 0 )
( 7|
e MMZ0 )
,
( ch . IL M Z 0 )
( <?2 .H.
( q , L IM Z 0 )
(q
11Z 0 )
,
q ^
z O
1,1 Z () )
Z0 )
I
( </2 , Z 0 )
241
c anzich 1111, la stessa sequenza di mosse avrebbe condotto alla ID (2 , c, Zq), da cui
sarebbe risultato chiaro che e accettata.
Il
PDA pu anche ipotizzare di aver visto la prima met dopo aver letto un solo 1, cio
quando si trova nella ID ( q0, 111, lZo) Dal momento che non si pu consumare tutto lin
put, anche questa scelta porta al fallimento. La scelta corretta, cio aver raggiunto la prima
met dopo aver letto due I, fornisce la sequenza di ID [q0. 1 1 1 1 . Zo) H iqo, 111. lZo) F
( f l o , n , U Z o ) h (</!,11,11 Z0) h (9 , 1 , 1 ) - ( , ( . ) h (q2,e,Zo).
Nello studio dei PDA hanno particolare importanza tre principi relativi alle ID e alle
transizioni.
1. Se una sequenza di ID (una computazione) lecita per un PDA P, allora lecita
anche la computazione formata accodando una stringa (sempre la stessa) all'input
(secondo componente) in ogni ID.
2. Se una computazione lecita per un PDA P, allora lecita anche la computazione
formata aggiungendo gli stessi simboli sotto quelli nello stack in ogni ID.
242
Capitolo 6
3. Se una com putazione lecita per un PDA P, e resta una coda di input non con su m a
ta. possiam o rimuovere il residuo dall'in pu t in ogni ID e ottenere una com putazione
lecita.
In termini intuitivi i dati che P non esam ina non possono influenzare la sua com putazione.
Form alizziam o i punti (1) e (2) in un teorema.
Si noti che se 7 = e abbiam o un enunciato formale del principio (1) descritto sopra, e se
w = e abbiam o il secondo principio.
DIMOSTRAZIONE La dim ostrazione u n induzione m olto sem plice sul num ero di passi
nella sequenza di ID che portano (q, Xtv, 7 ) in (p, ywjh). Ogni m ossa nella sequenza
( q , x w . a ) F (p. y u \ 3)
P
6.1.5
(p, y, fi).
Esercizi
L S ( q ,0 ,Z 0) = { ( q , X Z o)}
2 . % , O .X ) = { ( g , J O : ) }
I linguaggi di un PDA
243
3.
6(q,l,X) = {(q,X)}
4.
S(q,e.,X) = {(p,e)}
x del comportamento
5. 6 ( p , t , X ) = {(p,e)}
6. (p,l,X) = { ( p , M ) }
7. 5 ( p ,l ,Z 0) = {(p,f)}.
A partire dalla ID iniziale ( q, w. Z 0), m ostrate tutte le ID raggiungibili quando linput
:
* a) 01
b) 0011
c) 010.
6.2
I linguaggi di un PDA
Abbiam o stabilito che un PDA accetta una stringa consumandola ed entrando in uno stato
accettante. Chiamiamo questa soluzione accettazione per stato finale. Esiste una secon
da via per definire il linguaggio di un PDA. che ha importanti applicazioni. Per un PDA
possiamo definire il linguaggio accettato per stack vuoto, cio linsieme delle stringhe
che portano il PDA a vuotare lo stack, a partire dalla ID iniziale.
I
due metodi sono equivalenti: un linguaggio L ha un PDA che lo accetta per stato
finale se e solo se L ha un PDA che lo accetta per stack vuoto. Tuttavia, per un dato PDA
P , di solito i linguaggi chc P accetta per stalo finale e per stack vuoto sono diversi. In
244
Capitolo 6
questo paragrafo vedremo come convertire un PDA che accetta L per stato finale in un
altro che accetta L per stack vuoto, e viceversa.
6.2.1
Accettazioneperstatofinale
e dunque lenunciato vero. Si noti chc non dobbiamo provare chc lipotesi (q0, e, a)
(q i , 6, o ) vera.
INDUZIONE Supponiamo x - a\_a2 a.n per n > 0. Dalla ID (qo,x, a ), P pu fare due
mosse.
I linguaggi di un PDA
245
1. (qo, x, o:) l (</i, X, o:). Quando si trova nello stato <71, P pu solo togliere simboli
dallo stack. A ogni lettura di un simbolo in input lo stack si accorcia: poich |,| >
0 , se (1 , X, ci) I- (iji , e, ), allora pi breve di a e non pu essere uguale ad a.
2.
(,,,a-2 - U n - U 1 ft) F
( q i , f-,1 ft)
6.2.2
246
6.2.3
Capitolo 6
Dimostriamo che laclasse dei linguaggi che sono L ( P) per un PDA P c uguale alla classe
dei linguaggi che sono Ar(P ) per un PDA P. Si tratta proprio della classe dei linguaggi
liberi dal contesto, come vedremo nel Paragrafo 6.3. La prima costruzione spiega come
costruire un PDA Py che accetta un linguaggio L per stato finale a partire da un PDA Pm
che accetta L per stack vuoto.
Teorema 6.9 Se L = N ( P n ) per un PDA P y = (Q. , , .\, </o, Z 0), allora esiste un
PDA Py tale chc L = L(Py).
DIMOSTRAZIONE L'idea su cui poggia la dimostrazione illustrata nella Figura 6.4. Ci
serviamo di un nuovo simbolo X 0, che non deve appartenere a ; X 0 sia il simbolo
, X ()/
I linguaggi di un PDA
247
La specifica di Pp :
P f (Q Li {po-.pf}, , U {Xo}) ,, - , {/>/})
dove ' definita come segue.
1. j.'(po,e, X 0) = {{qo, Z oX o)} Nel suo stato iniziale Pp compie una transizione
spontanea allo stato iniziale di P v , inserendone il simbolo iniziale Z 0 sullo stack.
2. Per tutti gli stati q in Q, gli input a in o a = e, e i simboli di stack Y in ,
(5/.-((/, a, Y ) contiene tutte le coppie in .\(q, , Y).
3. Oltre alla regola (2), 6p(q, e. Xq) contiene ( p j , e) per ogni stato q in Q.
Dobbiamo dimostrare che w in L(Pp) se e solo se w in N ( P :).
w, Z^) F ( q , e, e) per uno stato q . Per il Teorema 6.5 possiamo
Py
in fondo allo stack e ricavare (<ft^ W- ZoXu)
(q , e. Xq)- ^er regola (2 ),
Pn
P> contiene tutte le mosse di P y ; possiamo quindi concludere che (qo, w, ZqXo) F
Pf
( q , t , X o). Combinando questa sequenza di mosse con le mosse iniziale e finale delle
regole ( I ) e (3) otteniamo:
(Po, w, Xo) F (9 0 , w. Z o X 0) I" (<7 , , Xo) L (p/, c, fi)
Py
Py
(6.1 )
Py
(Solo-se) Per linverso dobbiamo solo osservare chc le transizioni aggiunte nelle regole
(1) e (3) limitano a pochi casi laccettazione di w per stato finale. Dobbiamo usare la
regola (3) nellultimo passo, a condiziono per chc lo stack di Pp contenga solo X 0- H
simbolo Xo pu comparire nello stack soltanto in fondo. Inoltre la regola (1) pu e deve
essere usata solamente al primo passo.
Di conseguenza una computazione di Pp che accetti w deve somigliare alla sequenza
(6.1). Inoltre la parte interna della computazione, cio tutti i passi tranne il primo e
lultimo, devessere una computazione di P v con Xo in fondo allo stack. Ci si deve
al fatto che, tranne il primo e lultimo passo. Pp non pu compiere nessuna transizione
che non sia anche una transizione di , e X q non pu trovarsi in cima, altrimenti la
computazione finirebbe al passo successivo. Concludiamo che (qo.w. Z0) F (q,e,e),
P .\
ossia che w in N ( P 1 ).
Esem pio 6.10 Definiamo un PDA che elabori sequenze di i f ed e l s e in un programma
C, dove i sta per i f ed e sta per e l s e . Dal Paragrafo 5.3.1 sappiamo che c un pro
blema ogni volta che il numero di e l s e in un prefisso eccede il numero di i f , perch
248
Capitolo 6
in quel caso non possiamo abbinare ogni e l s e alli f che lo precede. Useremo perci
un simbolo di stack Z per contare la differenza tra il numero di i e il numero di e letti.
Questo semplice PDA. di un solo stato, rappresentato dal diagramma di transizione della
Figura 6.5.
e, TJ z
i, 7/ZZ
Figura 6.5 Un PDA che accetta, per stack vuoto, sequenze scorrette di if ed else.
Inseriamo una Z quando leggiamo una i e la eliminiamo quando leggiamo una e. Poich
partiamo con una Z nello stack, in effetti seguiamo la regola per cui se lo stack contiene
Z n, allora il numero di i letti supera quello degli e di 1. In particolare lo stack vuoto
se abbiamo letto una e in pi rispetto alle i, e linput letto fino a questo punto diventalo
illecito per la prima volta. Queste sono le stringhe che il PDA accetta per stack vuoto. La
specifica formale di P:\ :
Pn
{.{q)Ai^e) z }^N,q,Z)
2. ,(q, e, Z ) = {(q , t)}. Questa regola elimina una Z quando leggiamo una e.
e, V z
i, Z/ZZ
Figura 6.6 Costruzione di un PDA che accetta per stato finale dal PDA della Figura 6.5.
I linguaggi di un PDA
249
Costruiamo ora, a partire da P n . un PDA Pp che accetta lo stesso linguaggio, ma per stato
finale; il diagramma di transizione per Pp illustrato dalla Figura 6 .6.4 Introduciamo un
nuovo stato iniziale p e uno stato accettante r. Useremo Xo come segnale di fondo dello
stack. Pp c definito in termini formali da
6.2.4
Procediamo ora nella direzione opposta: prendiamo un PDA Pp che accetta un linguag
gio L per stato finale e ne costruiamo un altro, P y , chc accetta L per stack vuoto. La
costruzione semplice ed illustrata nella Figura 6.7. Si aggiunge una e-transizione a un
nuovo stato p da ogni stato accettante di Pp. Quando si trova nello stato p. P v svuota lo
stack senza consumare input. Di conseguenza, se Pp entra in uno stato accettante dopo
aver consumato l'input , P v svuota lo stack dopo aver consumato w.
Per evitare il caso in cui Pp svuota lo stack per una stringa che non va accettata,
dotiamo P \ di un indicatore di fondo dello stack, Xq. Lindicatore fa da simbolo iniziale
per PN ; come nella costruzione del Teorema 6.9, P n deve partire in un nuovo stato po,
che ha la sola funzione di inserire il simbolo iniziale di Pp sullo stack e passare allo stato
iniziale di Pp. La costruzione illustrata nella Figura 6.7 e definita formalmente nel
teorema che segue.
Teorem a 6.11 Sia L = L (P p) per un PDA Pp = (Q, . , . qo, Zo, P). Allora esiste
un PDA P v tale che L = N ( P n ).
4Mentrc la costnizione nel Teorema 6.9 utilizza po e jif, qui si fa uso dei nuovi stati p ed r . Tl lettore non se
nc preoccupi: i nomi degli stati sono ovviamente arbitrari.
250
Capitolo 6
F igura 6.7 P y simula Pp e vuota lo stack quando, e solo quando, Pp entra in uno stalo
accettante (qs = qualsiasi).
DIMOSTRAZIONE La costruzione quella suggerita nella Figura 6.7. Sia
a. Avvalendoci del fatto che ogni transizione di Pp una mossa di P,y, e invocando il
Teorema 6.5 per tenere Xo sotto i simboli di nello stack, sappiamo che (i/o, w , Z 0Xo) F
pN
(q, f.a X o ). Allora in P y valgono le relazioni
(PQiWi X 0) h (qosW, Z 0X 0 ) H (q..f ,cxX0) \- (p.,c)
Pn
p .\
Pn
I linguaggi di un PDA
251
La prima mossa deriva dalla regola (1) della costruzione di , mentre lultima sequenza
di mosse deriva dalle regole (3) e (4). Di conseguenza w accettata da per stack
vuoto.
(Solo se) pu vuotare il proprio stack solo entrando nello stato p . perch in fondo allo
stack c Xo e Pjr non ha mosse per X (). pu entrare nello stato p solo se Pp- entra in
uno stato accettante. L.a prima mossa di senzaltro quella derivata dalla regola (1).
Ecco dunque come si configura ogni computazione accettante di :
)|C
P jV
P 1V
e quindi w in L(Pp-).
6.2.5
Esercizi
Esercizio 6.2.1 Definite un PDA per ognuno dei seguenti linguaggi. A seconda della
convenienza si pu accettare per stato finale o per stack vuoto.
* a) {0T'l ri I n > 1 }.
b) L'insieme di tutte le stringhe di 0 c di 1 tali che nessun prefisso abbia pi 1 che 0.
c) Linsieme di tutte le stringhe di 0 e di 1 con lo stesso numero di 0 e di 1.
Esercizio 6.2.2 Definite un PDA per ognuno dei seguenti linguaggi.
* a) {a'tic 1* I i = j oppure j = k}. Si noti che questo linguaggio diverso da quello
delPEscrcizio 5.1.1(b).
b) L'insieme di tutte le stringhe con un numero doppio di 0 rispetto agli 1.
Esercizio 6.2.3 Definite un PDA per ognuno dei seguenti linguaggi.
a) {a1Wck I i j oppure j k}.
b) Linsieme di tutte le stringhe di a e b che non sono della forma ww, cio non sono
formate da una stringa ripetuta.
5Anche se a pu essere e. nel qual caso P f vuota lo stack nel momento stesso in cui accetta.
252
Cupitolo 6
*! Esercizio 6.2.4 Sia P un PDA con il linguaggio per stack vuoto L N (P ), e supponia
mo che e non sia in L. Descrivete come modificare P in modo tale chc accetti L U {e}
per stack vuoto.
Esercizio 6.2.5 Sia P - ({qo,q\.q2,q-, /} ,{ :
in cui < definita come segue.
6.3
253
Dimostriamo ora che i linguaggi definiti dai PDA sono proprio i linguaggi liberi dal con
testo. La via da seguire indicata nella Figura 6 .8 . Lo scopo quello di provare che le tre
classi di linguaggi che seguono coincidono.
1. 1 linguaggi liberi dal contesto, cio quelli definiti dalle CFG.
2. I linguaggi accettati per stato finale da un PDA.
3. 1 linguaggi accettati per stack vuoto da un PDA.
Abbiamo gi dimostrato chc (2) e (3) coincidono. pi semplice procedere dimostrando
che ( l ) c (3) coincidono, da cui si deduce lequivalenza delle tre classi.
Figura 6.8 Strutmra di una prova dellequivalenza di tre modi di definire i CFL.
6.3.1
Data una CFG G, costruiamo un PDA che ne simula le derivazioni a sinistra. Ogni forma
sentenziale sinistra chc non sia una stringa terminale si pu scrivere nella forma x A a ,
dove A la variabile pi a sinistra, x la stringa di terminali alla sua sinistra, e a la
stringa di terminali e variabili alla destra di .4. Diremo che A a Ia coda di questa forma.
La coda di una forma sentenziale sinistra fatta di soli terminali e.
La costruzione di un PDA da una grammatica poggia sullidea di far simulare al PDA
la serie di forme sentenziali sinistre usate dalla grammatica per generare una stringa ter
minale data w. La coda di ogni forma x A a compare sullo stack con in cima. In quel
momento x rappresentata dallaver consumato x in input, lasciando ci chc in w segue
x. Quindi, se w xy, in input rimane y.
Supponiamo che il PDA si trovi nella ID (q ,y ,A a ), chc rappresenta Ia forma sen
tenziale sinistra .r/lo:. Lautoma sceglie arbitrariamente una produzione per espandere
.4, poniamo A > . La sua mossa consiste nel sostituire A con 3 in cima allo stack,
entrando nella ID (q , ij,3a). Notiamo che il PDA ha un solo stato, q.
La ID (q, y, ) potrebbe non rappresentare la successiva forma sentenziale sinistra,
perch 3 pu avere un prefisso formato da terminali. Di fatto pu darsi che 3 non contenga
254
Capitolo 6
affatto variabili e che a abbia un prefisso composto di terminali. Per esporre in cima allo
stack la prossima variabile, dobbiamo eliminare gli eventuali terminali allinizio di .
Questi terminali vanno confrontati con i successivi simboli di input per verificare che le
scelte per la derivazione a sinistra della stringa di input w siano corrette; in caso contrario
la diramazione del PDA muore.
Se in questo modo si determina una derivazione a sinistra di w, alla fine si raggiunge
la forma sentenziale sinistra w. A quel punto ogni simbolo sullo stack o stato espanso
(caso delle variabili) o abbinato a un simbolo di input (caso dei terminali). Lo stack
vuoto e lautoma accetta.
Possiamo definire la costruzione pi precisamente. Sia G = ( V , T , Q , S ) una CFG.
Costruiamo il PDA P che accetta L(G) per stack vuoto:
P = ( { q } , T , V U T , 8 ,q , S )
La funzione di transizione S definita come segue.
1. Per ogni variabile A,
I
E
a I b I Ia I Ib I/o I
I \ E * E \E + E
L'insieme dei terminali del PDA c {a, b, 0, 1, (, ), + , *}. Questi otto simboli, con I ed E,
formano lalfabeto di stack. Definiamo la funzione di transizione.
a) % , , / ) = {( ,a), (q,b), ( q.Ta), ( q j b ), (qJQ), (7 , ) } .
b) S(q,e,E) = { ( q j ) , ( q ,E + E), ( q , E * E ) , ( q . ( E ))}.
c) 6 ( q , a , a ) =
% , ) , ) ) = {(<L<:)};
^(<7, + , + ) = {(^,<0};
Notiamo che (a) e (b) derivano dalla regola (1), le otto transizioni di (c) dalla regola (2).
Inoltre linsieme vuoto, tranne nei casi da la) a (c).
Teorem a 6.13 Se P il PDA costruito dalla CFG G nel modo descritto sopra, allora
N ( P ) = L(G).
255
S = 7 i => 72 => =* 7n = w
Im
Irn
Im
Per induzione su i proviamo che (q, w, S) F (q, y,;, ), dove y, e a sona una rappresen
tazione della forma sentenziale sinistra 7 . Cio, sia a , la coda di 7 e 7 = x,a. Allora
t/ la stringa per cui
= ?<;, ossia quello che resta dopo aver tolto x dall'input.
BASE Per i = 1, 7 i = 5 . Quindi X[ = f e yi w . Poich (, u>, S') I- (q, w . S) in 0
Cj
usata in una regola di tipo (1) dal PDA P. In tal caso x = e, e sappiamo che A => e.
Supponiamo che P faccia n mosse, con n > 1. La prima mossa devessere
di tipo (1), con A sostituito dal corpo di una delle sue produzioni alla sommit dello
stack. Infatti si pu applicare una regola di tipo (2) solo quando in cima allo stack c
un terminale. Supponiamo chc la produzione sia A > Y\Y Yk, in cui ogni Fj un
terminale o una variabile.
in d u z io n e
256
Capilolo 6
x.
XiY2 ---Yk 4
X1X2 ---Xk
257
6.3.2
Completiamo ora le dimostrazioni di equivalenza provando che per ogni PDA F possiamo
definire una CFG G il cui linguaggio coincide con quello accettato da P per stack vuoto.
La dimostrazione si basa sul prendere atto che levento cruciale nel processo di elabora
zione di un input da parte di un PDA leliminazione netta di un simbolo dallo stack,
conseguente alla lettura di una parte di input. Nellcliminare un simbolo dallo stack, un
PDA pu cambiare stato; dobbiamo quindi tenere traccia dello stato in cui entra quando
scende di un livello nello stack.
F igura 6.10 Sequenza di mosse di un PDA con leffetto di eliminare un simbolo dallo
La Figura 6.10 illustra come eliminare una serie di simboli Y i i Y2, .. .Yk dallo stack.
Leliminazione di Yi coincide con la lettura di X\ dallinput. Sottolineiamo che lelimi
nazione l'effetto finale di una o pi mosse. Per esempio la prima mossa pu sostituire
Y1 con un altro simbolo Z. La successiva pu sostituire Z con UV; altre mosse possono
258
Capitolo 6
259
(Se) Supponiamo ( q , w , X ) F (p,e,e). Proviamo che [qXp] => ir per induzione sul
numero di mosse fatte dal PDA.
b ase Un passo. In questo caso (p, e) devessere in S(q, w , X ) , e w un simbolo singolo
oppure e. Per come fatta G, [qXp] > w una produzione, quindi [qXp] => w.
INDUZIONE Supponiamo che la sequenza
260
Capitolo 6
dove r k = p.
(Solo se) Per induzione sul numero di passi nella derivazione.
Un passo. In questo caso [qXp] * w devessere una produzione. Questa produzio
ne esiste solo se c una transizione di P in cui X viene eliminato e dallo stato q si passa in
p. Perci (p , e) dev'essere in S(q, a, X ) e a - w. Ci comporta che (q , w, X ) I- (p, , e).
base
con rk = p. Questa produzione deriva dal fatto che (ro, Ki F2 Ffc) in 6(q, a, X ).
Possiamo scompone w in w = awyw2 ;*, in modo tale che [r_i Fr] = Wi per
i - 1 , 2 , . . . ,k. Dall'ipotesi di induzione sappiamo chc per ogni %
j|j
w.F) F (ri,e,e)
Se applichiamo il Teorema 6.5 per collocare le stringhe opportune dopo
sotto F nello stack, abbiamo anche
sullinput e
(q, Clw1W2 -Wk - X ) h (r(, Wi W2 wk , F1F2 - - F fc) I{ru W2Ws wk, F2F j Ffc) F (r2, w:i Wk , F3 Yk ) F (rk , e. e)
Poich rfc = p abbiamo dimostrato che (g, w, X ) F (p, c., e).
Completiamo ora la dimostrazione. Per come sono formate le regole relative al simbolo
iniziale S, S => w se e solo se [qoZop] => u- per qualche p. Abbiamo cos dimostrato
che [qoZi)p] => w se e solo se ( q w, Zo) r (p, c. e), cio se e solo se P accetta x per
stack vuoto. Quindi L(G) = Ar(P ).
Esem pio 6.15 Convertiamo in una grammaticail PDA P v ({q} K e}, {Z}, \. q. Z)
dell'Esempio 6.10. Lautoma P v accetta tutte le stringhe che violano per la prima volta la
regola secondo cui ogni c, (else) deve corrispondere a un i (if) precedente. Poich P v ha
un solo stato e un solo simbolo di stack, la costruzione molto semplice. La grammatica
G comprende due sole variabili:
a) S, il simbolo iniziale, che si trova in ogni grammatica formata secondo il metodo
del Teorema 6.14
261
b) [qZq], lunica tripla che si pu costruire con gli stati e i simboli di stack di Pn Le produzioni della grammatica G sono le seguenti.
1. L'unica produzione per S b S - * [qZq], Se il PDA avesse n stati, ci sarebbero
n produzioni di questo tipo perch lo stato finale potrebbe essere uno qualsiasi
di quelli. Il primo stato sarebbe lo stato iniziale e il simbolo di stack il simbolo
iniziale, come nella produzione indicata.
2. Poich SiM(, i, Z) contiene (q , Z Z ), abbiamo la produzione [qZq\ i[qZq][qZq).
In un esempio cos semplice c di nuovo una sola produzione. Se ci fossero n
stati, questa sola regola darebbe luogo a ri2 produzioni, perch i due stati centrali
del corpo possono essere qualsiasi, come anche gli ultimi della testa c del corpo. In
altre parole, se p ed r fossero due stati del PDA avremmo la produzione [qZp] >
i[qZr\[rZp).
3. Dal fatto che 6_\'(q, e, Z) contiene (q, t) ricaviamo la produzione
[qZq\ -> e
Si noti che in questo caso lelenco dei simboli di stack che sostituiscono Z vuoto;
lunico simbolo nel corpo quello, di input, che ha provocato la mossa.
Per comodit possiamo sostituire la tripla [qZq] con un simbolo semplice, per esempio A.
In questo modo lintera grammatica comprende le seguenti produzioni:
S >A
A > iA A I e
Osservando che da A ed S derivano esattamente le stesse stringhe, possiamo identificarle
e scrivere lintera grammatica cos:
6.3.3
Esercizi
-
->
OSI I A
IAO I S I
262
Capitolo 6
S
A
>
aA A
a S I bS I a
1. 6(qA,Zo) = {(q,XZo)}
2. S(q,l,X) = {(q,XX)}
3. % , 0 . X ) = { ( / , , * ) }
4. d{q,e,X) - {(^,e)}
5. <5(M,X) = {(p,e)}
6. 6(p,Q,Z0) = {(7 ,Z 0)}.
Esercizio 6.3.4 Convertite in una grammatica libera dal contesto il PDA dellEscrcizio 6 .1. 1.
Esercizio 6.3.5 Per ognuno dei seguenti linguaggi liberi dal contesto definite un PDA che
10 accetti per stack vuoto. Potete definire prima una grammatica per il linguaggio e poi
convertirla in PDA.
a) ( a n6mc2^n+m) I n > 0. m > }.
b) {(I1Wcfe I i = 2j oppure j = 2k).
! Esercizio 6.3.7 Considerate un PDA con ,s stati e t, simboli di stack in cui le stringhe che
sostituiscono le regole di transizione hanno lunghezza minore o uguale a u. Determinate
un limite superiore stretto sul numero di variabili della CFG associata airautom a secondo
11 metodo del Paragrafo 6.3.2.
6.4
263
Per definizione i PDA possono essere non deterministici; il sottocaso di automa determi
nistico per importante. In particolare parser si comportano generalmente come PDA
deterministici; la classe dei linguaggi accettati da questi automi quindi interessante per
ch ci aiuta a capire quali costrutti sono adatti ai linguaggi di programmazione. In questo
paragrafo definiamo i PDA deterministici e studiamo le loro capacit.
6.4.1
In modo intuitivo possiamo dire chc un PDA deterministico se in ogni situazione non
c scelta fra mosse alternative. Lc scelte sono di due tipi. Se (q, , ) contiene pi
di una coppia, allora il PDA sicuramente non deterministico perch si pu scegliere
tra queste coppie nel decidere la mossa successiva. Daltro canto, anche se S(q, o. X )
sempre un singoletto, potremmo comunque avere la scelta tra luso di un vero simbolo di
input oppure una mossa su e. Definiamo quindi un PDA P = ( Q . , , ', qo, Z q. F ) co
me deterministico ( DPDA, Deterministic PDA) se e solo vengono soddisfatte le seguenti
condizioni.
1. rt(r/, a, X ) ha al massimo un elemento per ogni q in Q, a in (o a = e), e X in .
2. Sc S(q, a, X ) non vuoto per un a in . allora (q, f . X ) devessere vuoto.
Esem pio 6.16 Si pu dimostrare che il linguaggio L wwr dclIEsempio 6.2 un CFL
per il quale non esiste alcun DPDA. Tuttavia, collocando un segnale di mezzo c, il
linguaggio diventa riconoscibile da un DPDA. In altre parole il linguaggio L wcwr =
{wcu;R I w in (0 + -1)*} pu essere riconosciuto da un PDA deterministico.
La strategia del DPDA consiste nel memorizzare gli 0 e gli 1 nello stack finch vede
il segnale di mezzo c. A questo punto passa in un altro stato, in cui confronta i simboli
di input con i simboli di stack, eliminandoli dallo stack se corrispondono. Se due simboli
non corrispondono, il DPDA muore : l'input non pu essere della forma w n v R. Se
riesce a svuotare lo stack fino al simbolo iniziale, che nc contrassegna il fondo, allora
accetta linput.
Lidea molto simile a quella del PDA nella Figura 6.2, che per non deterministico
perch nello stato (/(J ha sempre la possibilit di inserire il simbolo di input nello stack
oppure di compiere una transizione su e verso lo stato q t. Deve cio scommettere quando
ha raggiunto la prima met. Il DPDA per L wcwr rappresentato come diagramma di
transizione nella Figura 6 .11.
Si tratta chiaramente di un PDA deterministico, che non ha mai la scelta fra mosse
diverse nello stesso stato, con lo stesso input e lo stesso simbolo di stack. Per quanto
riguarda la scelta fra un simbolo di input reale ed e, lunica c-transizione che compie
264
Capitolo 6
quella da q\ a
con Z 0 alla sommit dello stack, ma in <71 non ci sono altre mosse
possibili quando Z() alla sommit dello stack.
0 , Z 0 /OZ0
1 , Z 0 /I Z 0
0 , 0/0 0
0 , 1 /0 1
1 , 0 / 1 0
0,
1, 1/11
1,1 /
0/
c t 1/1
6.4.2
I DPDA accettano una classe di linguaggi che si pone tra i linguaggi regolari e i CFL.
Dimostriamo anzitutto che i linguaggi dei DPDA includono tutti i linguaggi regolari.
Teorema 6.17 Sc L un linguaggio regolare, allora L = L(P) per un DPDA P.
In sostanza un DPDA pu simulare un automa a stati finiti determini
stico. Poich deve avere uno stack, il PDA vi mantiene un simbolo Z0, ma in effetti lo
ignora, limitandosi a tener conto dello stato. In termini formali sia ,4 = ( Q , , 5a,Qo, F)
un DFA. Costruiamo il DPDA
d im o s t r a z io n e
P = ( Q . X . { Z 0} J P,q0. Z 0.,F)
definendo Sp(q , a, Z0) = {(/>, Z0)) per tutti gli stati p e q in Q, tali che 6 ((1, a.) = p.
Affermiamo che (q0,w, Z 0) F (p, e, Z q) se e solo se A(q0,w) = p. In altre parole P
simula A servendosi degli stati. Le dimostrazioni in entrambi i sensi sono facili induzioni
su | u>|, e le lasciamo al lettore. Poich sia A sia P accettano entrando in uno degli stati di
F, concludiamo che i loro linguaggi coincidono.
265
Quando consideriamo laccettazione per stack vuoto, scopriamo chc la capacit di rico
noscere linguaggi in questo modo limitata. Diciamo che un linguaggio JL ha la propriet
di prefisso se in esso non esistono due stringhe x e y diverse, tali che x un prefisso di y.
Esem pio 6.18 11 linguaggio L wcwr dellEsempio 6.16 ha la propriet di prefisso. Infatti
non possono esserci due stringhe wcwH e x c x R, una delle quali il prefisso dellaltra,
salvo che non si tratti della stessa stringa. Per capirne la ragione supponiamo che w cw n
sia un prefisso di x c x R e che w x. Allora w devessere pi breve di x. Perci la c in
u;cwR giunge in una posizione in cui x c x R ha uno 0 oppure un I. E una posizione nella
prima X. Ci contraddice l'assunto che wcwR sia un prefisso di x c x R.
D altra parte esistono linguaggi molto semplici che non hanno la propriet di prefis
so. Consideriamo {0}*, ossia linsieme di tutte le stringhe di 0. Chiaramente in questo
linguaggio esistono coppie di stringhe delle quali una prefisso dellaltra, e dunque il
linguaggio non gode della propriet di prefisso. In effetti, prese due stringhe qualsiasi,
una c prefisso dellaltra, condizione questa pi forte di quella necessaria a stabilire che la
propriet di prefisso non vale.
Notiamo che il linguaggio {0}* un linguaggio regolare. Perci non vero che
ogni linguaggio regolare Ar(P ) per un DPDA P. La relazione che segue pu essere
dimostrata per esercizio.
Teorem a 6.19 Un linguaggio L N ( P ) per un DPDA P se e solo se L gode della
propriet di prefisso ed L L ( P t) per un DPDA P'.
6.4.3
Come abbiamo visto, un DPDA pu accettare linguaggi non regolari, come L wcwr. Per
provare che questo linguaggio non c regolale supponiamo che lo sia e ricorriamo al pum
ping lemma. Se n la costante del lemma, consideriamo la stringa w = 0rtc0n , che
in L wcwr. Se ora replichiamo questa stringa, la lunghezza del primo gruppo di 0 deve
cambiare, producendo stringhe in cui il segnale di mezzo non si trova al centro. Dato
che tali stringhe non sono in L wrwr, abbiamo una contraddizione, c la conclusione chc
L-wcwT non c regolare.
Daltra parte esistono CFL, come Lwwr, che non possono essere L(P) per nessun
DPDA P . La dimostrazione formale complessa, ma lintuizione evidente. Sc P un
DPDA che accetta L wwr, allora, data una sequenza di 0, deve memorizzarli nello stack
oppure compiere unazione equivalente per conteggiare un numero arbitrario di 0. Per
esempio potrebbe memorizzare un X ogni due 0 visti e usare lo stato per ricordare se il
numero pari o dispari.
Supponiamo che P abbia visto n volte 0 e poi veda 110". Deve verificare che ci sono
266
Capitolo 6
O dopo 11, e a questo scopo deve togliere simboli dallo stack.6 Ora P ha visto On I IO".
Se vede una stringa identica nel seguito, deve accettare perch l'input sarebbe della forma
w w R, con w = On IlO ". Se invece vede OmIlO m, p e rm n, P non deve accettare. Ma,
essendo lo stack vuoto, non pu avere memoria dell'intero n e non riesce a riconoscere
correttamente L wwr. La nostra conclusione che
i linguaggi accettati dai DPDA per stato finale includono propriamente i linguaggi
regolari, ma sono inclusi propriamente nei CFL.
6.4.4
Possiamo definire pi precisamente la portata dei DPDA osservando che tutti i linguag
gi accettati da questi automi hanno grammatiche non ambigue. Purtroppo i linguag
gi dei DPDA non coincidono esattamente con il sottoinsieme dei CFL che non sono
inerentemente ambigui. Per esempio L wwr ha una grammatica non ambigua
S -* OSO I IS rI I e
sebbene non sia il linguaggio di un DPDA. I teoremi che seguono precisano lenunciato
che chiude il paragrafo precedente.
Teorema 6.20 Se L = N ( P ) per un DPDA P , allora L ha una grammatica libera dal
contesto non ambigua.
DIMOSTRAZIONE Affermiamo che la costruzione del Teorema 6 . 14 d come prodotto una
CFG non ambigua G quando il PDA cui applicata deterministico. In primo luogo
ricordiamo dal Teorema 5.29 chc per dimostrare chc G non ambigua basta provare che
ha derivazioni a sinistra uniche.
Supponiamo che P accetti la stringa w per stack vuoto. Poich deterministico, lo
fa tramite una sequenza di mosse unica, e non pu fare altre mosse dopo aver vuotato Io
stack. Da questa sequenza di mosse possiamo determinare lunica scelta di produzione in
una derivazione a sinistra mediante la quale G deriva w. La regola di P che determina la
produzione sempre fissata univocamente. Per una regola di P. poniamo S(q,a, X ) {(r, Yi >2 Ya:)}, potrebbe dar luogo a molte produzioni di G, con stati diversi nelle
posizioni che riflettono gli stati di P dopo aver eliminato ognuno degli Yi .Y2, ___Yfc-1 Dal momento che P deterministico, solo una delle sequenze di scelte sar coerente con
le operazioni di P, e dunque solo una di queste produzioni condurr alla derivazione di
w.
6Questo enuncialo la parte intuitiva che richiede una dimostrazione forniate (difficile, per inciso). C un
altro modo in cui P pu confrontare blocchi uguali di 0?
267
Possiamo dimostrare qualcosa di pi: anche i linguaggi che i DPDA accettano per
stato finale hanno grammatiche non ambigue. Poich sappiamo costruire direttamente
grammatiche solo a partire dai PDA che accettano per stack vuoto, occorre cambiare
il linguaggio in questione in modo da avere la propriet di prefisso, e poi modificare
la grammatica che ne risulta in modo da generare il linguaggio originale. Tutto ci
possibile ricorrendo a un simbolo di segnale di fine.
Teorema 6.21 Se L = L(P) per un DPDA P, allora L ha una CFG non ambigua.
Sia S un simbolo (segnale di fine) chc non compare nelle stringhe di
L, e sia L' L%. In altri termini le stringhe di L' sono le stringhe di L, ciascuna seguita
dal simbolo $. Allora L' ha sicuramente la propriet di prefisso, e per il Teorema 6.19
TJ = N ( P t) per un DPDA P 1.1 Per il Teorema 6.20 esiste una grammatica non ambigua
Gt che genera il linguaggio Ar( P 7)1che L 1.
A questo punto costruiamo da G1 una grammatica G tale che L(G) = L. Dobbiamo
solo togliere dalle stringhe il segnale di fine $. Quindi trattiamo $ come una variabile di
G e introduciamo la produzione $ e: per il resto le produzioni di G1 e G coincidono.
Poich L(G t) = L \ ne consegue che L(G) = L.
Affermiamo che G non ambigua. Nella dimostrazione le derivazioni a sinistra in G
sono uguali alle derivazioni a sinistra in Gt , salvo il fatto che le derivazioni in G hanno
un passo finale in cui la variabile $ sostituita da e. Dunque, se una stringa di terminali w
avesse due derivazioni a sinistra in G, anche la stringa w$ ne avrebbe due in Gt. Poich
sappiamo chc G1 non ambigua, anche G lo .
d im o s t r a z io n e
6.4.5
Esercizi
268
Capitolo 6
6.5
Riepilogo
Automi a pila : un PDA c un automa a stati finiti non deterministico dotalo di uno
stack che pu essere usato per memorizzare una stringa di lunghezza arbitraria. Lo
stack pu essere letto e modificato solo alla sommit.
Mosse di un automa a pila: un PDA sceglie la sua mossa successiva basandosi sullo
stato corrente, sul simbolo di input a seguire e sul simbolo alla sommit dello stack.
Inoltre pu scegliere di fare una mossa a prescindere dal simbolo di input e senza
consumarlo. Essendo non deterministico, il PDA pu avere un numero finito di
scelte per ogni mossa: ogni scelta comprende il nuovo stato e la stringa che deve
sostituire il simbolo in cima allo stack.
Bibliografia
269
6.6
Bibliografia
La nozione di automa a pila viene attribuita a studi indipendenti di Oettinger [4] e Schutzenberger |5J. Anche l'equivalenza tra gli automi a pila e i linguaggi liberi dal contesto
il risultato di scoperte autonome. Compare infatti in un rapporto tecnico del MIT scritto
da N. Chomsky nel 1961, ma la sua prima pubblicazione si deve a Evey LIJ.
1
PDA deterministici sono stati introdotti per la prima volta da Fischer [2] e Schutzenberger [5j, e sono diventati poi importanti come modello per i parser. In particolare [3J
introduce le grammatiche LR(), una sottoclasse delle CFG che generano esattamente
i linguaggi dei DPDA. Le grammatiche LR(A:) sono a loro volta I fondamento di YACC,
il generatore di parser trattato nel Paragrafo 5.3.2.
I . J. Evey, Application of pushdown store machines, Proc. Fall Joint Computer
Conference (1963), AFIPS Press, Montvale, NJ. pp. 215-227.
270
Capitolo 6
Capitolo 7
7.1
In questo paragrafo intendiamo mostrare che ogni CFL (senza e) generato da una CFG
le cui produzioni sono tutte della forma A > B C o 4 - > a, dove A, B c C sono variabili
e a un terminale. Questa forma nota come forma normale di Chomsky. Per arrivarci
dobbiamo compiere alcune semplificazioni preliminari, utili di per s in diverse situazioni.
1. Dobbiamo eliminare i simboli inutili: variabili o terminali che non compaiono in
nessuna derivazione di una stringa di terminali dal simbolo iniziale.
272
Capitolo 7
7.1.1
>
S >A B j a
A >b
Tutti i simboli, tranne B, sono generatori; a e generano se stessi; S genera a e .4 genera
b. Se eliminiamo B, dobbiamo eliminare anche la produzione S At\ ne risulta la
grammatica:
S
CL
A *b
273
S A B I a
A ^b
sono raggiungibili. Se ora eliminiamo il simbolo B, che non un generatore, otteniamo
una grammatica con simboli inutili, in particolare A cb.
Teorem a 7.2 Sia Cl = ( V .'T ,J \S ) una CFG, e poniamo L(G) / 0. cio G genera
almeno una stringa. Sia Gi = (V i,T i, P \ , S ) la grammatica costruita come segue.
1. Per prima cosa eliminiamo i simboli chc non sono generatori e le produzioni in cui
figurano. Sia G = ( . 7, P 2 , S) la grammatica risultante. Notiamo che S un
generatore, per l'ipotesi che L(G) contiene almeno una stringa; dunque S non
stato eliminato.
2. In un secondo tempo eliminiamo i simboli non raggiungibili nella grammatica (7-2Allora G 1 non contiene simboli inutili e L(G\ ) = L(G).
Sia X un simbolo superstite, cio contenuto in Vi U 2"i. Sappiamo che
X => w per una stringa w in T*. Inoltre ogni simbolo utilizzato nella derivazione di w
d im o s t r a z io n e
Cr
Poich X non stato eliminato al secondo passo, sappiamo anche che esistono 0
e tali che S => n-X. Per di pi, ogni simbolo che compare nella derivazione
G2
Sappiamo chc ogni simbolo in c raggiungibile e chc tutti questi simboli appar
tengono a V2 U T-2 , dunque sono dei generatori in G. Nella derivazione di una stringa
terminale, poniamo =$ x w y , compaiono solo simboli raggiungibili da S perch
G'2
sono raggiunti da simboli in . Perci questa anche una derivazione di Gy :
S => OtX U x w y
CVj
Gl
L (G i) C L(G): dato che per ottenere Gi abbiamo soltanto eliminato simboli e produ
zioni da G, abbiamo L (G ) C L(G).
L(G) C L (G i): dobbiamo dimostrare che se w in L(G), allora w in L (G i). Se
w in L (G ), allora S => w. In questa derivazione ciascun simbolo evidentemente
G
sia raggiungibile sia generatore. Dunque si tratta anche di una derivazione di G . Ossia
S => w, e pertanto w in L (G | ).
G1
274
Capitolo 7
7.1.2
Restano da chiarire due punti: come si computa l'insieme dei simboli generatori in una
grammatica e come si computa linsieme dei simboli raggiungibili di una grammatica.
Per ambedue i problemi lalgoritmo che utilizziamo fa del suo meglio per scoprire i
simboli dei due tipi. Mostreremo che un simbolo non n generatore n raggiungibile se
le costruzioni induttive di questi insiemi non riescono a stabilire che lo sia.
Sia G = (Vr, T, P. S ) una grammatica. Per calcolare i simboli generatori di G svol
giamo la seguente induzione.
BASE Ogni simbolo di T palesemente generatore in quanto genera se stesso.
INDUZIONE Supponiamo che esista una produzione A >et e che si sappia gi che ogni
Per laltra direzione supponiamo che X sia un simbolo generatore, per esempio X =>
Cr
ti). Dimostriamo per induzione sulla lunghezza di questa derivazione che X viene ricono
sciuto come generatore.
BASE Zero passi. Allora X un terminale ed rilevato nella base.
INDUZIONE Se la derivazione consiste in n passi, per n > 0, allora X una variabile.
Poniamo che la derivazione sia X => a => w, ovvero la prima produzione usata sia
X > a. Da ogni simbolo di a deriva una stringa terminale chc parte di w, c tale
derivazione avviene in meno di n passi. Per lipotesi induttiva ogni simbolo di a risulta
quindi generatore. La parte induttiva dcHalgoritmo permette di usare la produzione X
per dedurre che X generatore.
Consideriamo ora lalgoritmo induttivo grazie al quale troviamo linsieme dei simboli
raggiungibili della grammatica G = (V. T. P, S). Possiamo di nuovo mostrare che un
simbolo non raggiungibile se non viene aggiunto allinsieme purch la procedura "faccia
del suo meglio per trovare i simboli raggiungibili.
275
ra, per ogni produzione con A in testa, tutti i simboli nel corpo sono raggiungibili.
Esem pio 7.5 Partiamo ancora dalla grammatica dcllEscmpio 7 .1. Per la base. S rag
giungibile. Poich S ha produzioni con corpo A B e a, concludiamo che .4, B e a sono
raggiungibili. B non ha produzioni, ma A ha A > b. Concludiamo perci chc b
raggiungibile. Nessun altro simbolo pu entrare nellinsieme dei simboli raggiungibili
{S ,A ,B ,a ,b }.
Teorema 7.6 Lalgoritmo enunciato sopra trova tutti e soli i simboli raggiungibili di G.
DIMOSTRAZIONE La dimostrazione consta di due semplici induzioni, simili al Teore
7.1.3
Eliminazione di e-produzioni
Mostriamo ora che le e-produzioni, sebbene spesso comode per definire grammatiche, non
sono essenziali. Senza una produzione che abbia t come corpo, ovviamente impossibile
generare la stringa vuota come membro di un linguaggio. Perci dimostriamo in realt
che se un linguaggio L ha una CFG, allora L - {e} ha una CFG senza e-produzioni. Sc f
non in L, allora L stesso L { r}. quindi L ha una CFG senza e-produzioni.
La strategia che seguiamo parte dallindividuazione delle variabili annullabili. Una
variabile A c annullabile se A => c. Se A annullabile, allora ogni volta che A compare
nel corpo di una produzione, come B * C A D , da A pu derivare c. Scriviamo quindi
due versioni della produzione. Ia prima senza A nel corpo (B CD), che corrisponde
al caso in cui A stata usata per generare e, e la seconda con A presente (B > C AD).
Se per usiamo la versione con A , non possiamo permettere che da .4 derivi e. La cosa
non difficile perch possiamo semplicemente eliminare tutte le produzioni che hanno e
come corpo, impedendo cos chc qualsiasi variabile generi e.
Sia G = (V, T, P, S) una CFG. Possiamo trovare tutti i simboli annullabili di G
tramite il seguente algoritmo iterativo. In seguito dimostreremo che non ci sono simboli
annullabili, a eccezione di quelli trovati dall'algoritmo.
BASE Se ,4 *c una produzione di G, allora A annullabile.
INDUZIONE Se esiste una produzione B
C 1 C 2 Gk in cui ogni C i annullabile, allo
276
Capitolo 7
jl
in d u z io n e
S AB
A
a A A I e
B - b B B ' t
Anzitutto troviamo tutti i simboli annullabili. A c B lo sono immediatamente in quanto
hanno produzioni il cui corpo dato da f. Poi, dal momento che il corpo della produzione
S - A B consiste di soli simboli annullabili, ricaviamo chc S annullabile. Tutte e tre le
variabili sono dunque annullabili.
Costruiamo ora le produzioni della grammatica G 1. Consideriamo dapprima S A B .
Tutti i simboli del corpo sono annullabili, perci ci sono quattro combinazioni di presenza
e assenza per .4 e B. Non essendo per consentito cancellare tutti i simboli, ci sono solo
tre produzioni:
S - A B \ A \ B
Passiamo poi a considerare la produzione ,4 aA A . In seconda e terza posizio
ne ci sono simboli annullabili, per cui anche qui esistono quattro combinazioni presen
te/assente. In questo caso sono permesse tutte e quattro le scelte, dato che il simbolo non
277
A >aAA I a4. j a A \ a
Notiamo che le due opzioni mediane danno la stessa produzione perch non rilevante
quale A eliminiamo, se decidiamo di eliminarne una. Di conseguenza la grammatica
finale Gi avr solo tre produzioni per A.
Analogamente la produzione per D d in G 1:
B bDB I bB I b
Le due e-produzioni di G non danno nulla in G\. Dunque G i costituita dalle seguenti
produzioni:
S -> A B \ A \ B
A * a A A I aA \ a
B
bBB I b B \b
L (G i ) = L(G) - {(}
Teorema 7.9 Se la grammatica G\ costruita da G secondo lo schema illustrato per
eliminare le e-produzioni, allora L (G i) = L(G) {e}.
DIMOSTRAZIONE Dobbiamo dimostrare che se w e, allora w in L ( G i ) se e solo se c
Cr
produzioni. Dobbiamo mostrare per induzione sulla lunghezza della derivazione che
4 =* w.
c
278
Capitolo I
Gt
produzione A >"1Y2 -- Yrn, dove Ic Y sono le X , nello stesso ordine, con laggiunta di
zero o pi variabili annullabili intercalate. Possiamo inoltre scomporre w in w\ W2 wk,
dove X; => Wi per = 1 ,2 ........k. Se X i un terminale, allora w = X it e se X i
jJ;
G1
Tl primo passo unapplicazione della produzione A > Y i Y2 -- Yk, che sappiamo esi
stere in G. 11 successivo gruppo di passi rappresenta la derivazione di c da ognuna delle
Y, chc non sia una delle X i . 11 gruppo finale di passi rappresenta le derivazioni delle Wi
dalle X i, che sappiamo esistere per lipotesi induttiva.
(Se) Supponiamo chc A => w e w e. Mostriamo per induzione sulla lunghezza n della
G
derivazione che
A => w.
Gi
G
Y1 -4 w, per = 1 . 2 , . . . , rn. Siano X jl- X 2,.. ., X k le Y j, nellordine, tali chc wj e.
|
Cr
Dal momento che w e, deve valere k > I. Di conseguenza A > X\X% ***X k una
produzione di G\.
Affermiamo chc X i X 2 - Xk => w, perch le sole Y3 che non sono presenti tra le X
Ct
>
sono state usate per generare e, e dunque non contribuiscono alla derivazione di w. Poich
ogni derivazione Yj => wj compie meno di n passi, possiamo applicare lipotesi induttiva
G
Cl
Cri
279
pf(
7.1.4
Una produzione unitaria c una produzione della forma A + B, dove sia A sia B sono
variabili. Queste produzioni possono essere utili. NellEsempio 5.27 abbiamo visto come,
grazie alle produzioni unitarie E +T e T F, sia possibile creare una grammatica non
ambigua per espressioni aritmetiche semplici:
a I 6 I l a \ Ib \ IO \ TA
1 1 (E)
F IT * F
T \E +T
D altra parte le produzioni unitarie possono complicare certe dimostrazioni e intro
durre nelle derivazioni dei passi aggiuntivi di cui tecnicamente non ci sarebbe bisogno.
Per esempio possiamo espandere la T nella produzione F * T in ambedue i modi pos
sibili, sostituendola con le due produzioni E * F T * F. Questo cambiamento non
elimina comunque le produzioni unitarie, perche' abbiamo introdotto la produzione uni
taria F > F che prima non faceva parte della grammatica. Espandendo ulteriormente
E > F con le due produzioni per F si ottiene E * I \ (E) \ T * F. Abbiamo ancora
una produzione unitaria, ossia E > I. Ma se espandiamo ancora questa 1 nei sei modi
possibili, ne ricaviamo
E - * a \ b \ I a \ I b \ T O \ I l | (E) \ T * F
La produzione unitaria per E scomparsa. Notiamo che E a non una produzione
unitaria perch lunico simbolo nel corpo un terminale, e non gi una variabile, come
richiesto per le produzioni unitarie.
La tecnica suggerita, ossia lespansione delle produzioni unitarie fino alla loro scom
parsa, funziona spesso, ma pu fallire se esiste un ciclo di produzioni unitarie, come
A > B s B G e G A. Una tecnica di sicura riuscita consiste nel trovare prima tutte
le coppie di variabili A e B tali che A U B con una sequenza di sole produzioni unitarie.
Osserviamo che possibile avere A => B anche se non entra in gioco alcuna produzione
unitaria. Per esempio potremmo avere le produzioni A >B G c C + t.
Una volta determinate tutte queste coppie, possiamo sostituire qualunque sequenza
di passi di derivazione in cui A => B\
B2
=> B n => a per mezzo di una
produzione che usa la produzione non unitaria B n >a direttamente da A: in altre parole
A a. Per cominciare, ecco la costruzione induttiva delle coppie (A. B) tali che A =>
B impiegando solo produzioni unitarie. Chiameremo una tale coppia coppia unitaria.
280
Capitolo I
BASE (A, A) una coppia unitaria per ogni variabile .4. Infatti A => A in zero passi.
INDUZIONE Supponiamo di aver determinato che (A. B) una coppia unitaria e B C
vengono scoperte le coppie: se (A, B) risulta una coppia unitaria, allora la derivazione
A => B usa solo produzioni unitarie. Lasciamo al lettore questa parte della dimostrazioC
ne.
Nellaltra direzione supponiamo che A => B faccia uso soltanto di produzioni unij
3j(
tarie. Possiamo provare che troveremo la coppia (A, B ) per induzione sulla lunghezza
della derivazione.
BASE Zero passi. In questo caso A = B e si aggiunge la coppia (.4, B) nella base.
281
INDUZIONE Supponiamo che .4 => P operi in n passi, per n > 0, dove a ogni passo si
A 4
C=>B
)|C
Produzioni
( E t E)
( E t T)
E-F
( E t I)
( Tt T)
(T t P )
E -> E + T
E * T * F
E -> (E)
E * a \ b \ I a \ l b \ 1 0 \ 11
T -> T * F
T - , (E)
T -+
b Ta \ T b \ T 0 \ T l
F^(E)
F
a b Ta ! Tb \ TO \ T 1
T _ a I b Ta Tb \ TO \ Tl
(TJ)
( F, F)
(F, I)
(IJ)
aI I
- I I
I I
F igura 7.1 Grammatica costruita nel passo (2) dellalgoritmo di eliminazione delle
produzioni unitarie.
Il passo finale consiste nell'eliminare le produzioni unitarie dalla grammatica della Figu
ra 7.1. La grammatica risultante:
282
Capilolo I
E -> E + T I T * F I (E) I a \ b \ Ia \ Ib | IO | / I
T - + T * F \ ( E ) \ a \ b \ l a \ Ib \ IO \ 11
F -> (E) \ a \ b \ I a \ I b / 0 Ii
I
- a I 6 I Ta | Ib \ IO 1 1 1
non ha produzioni unitarie, eppure genera lo stesso insieme di espressioni della gramma
tica della Figura 5.19.
Teorem a 7.13 Se la grammatica G i costruita dalla grammatica G tramite lalgoritmo
per eliminare le produzioni unitarie, allora L ( G i ) = L(G).
DIMOSTRAZIONE Dimostriamo che w in L(G) se e solo se in L(Gi).
(Se) Supponiamo che S => w. Poich ogni produzione di G i equivale a una sequenza di
Gi
zero o pi produzioni unitarie di G seguite da una produzione non unitaria di G, sappiamo
che o => ,3 implica a. => fi. In altre parole ogni passo di una derivazione in G 1 pu
Cj [
produzione unitaria in una derivazione a sinistra, la variabile del corpo diventa la variabi
le pi a sinistra, e dunque viene immediatamente sostituita. Di conseguenza la derivazione
a sinistra nella grammatica G pu essere scomposta in una sequenza di passi in cui zero
o pi produzioni unitarie sono seguite da una produzione non unitaria. Osserviamo che
ogni produzione non unitaria che non preceduta da una produzione unitaria un pas
so di per s. Ognuno di questi passi pu essere compiuto da ununica produzione di Gi
perch la costruzione di G i ha creato esattamente le produzioni che riflettono zero o pi
produzioni unitarie seguite da una produzione non unitaria. Perci S => w.
Riassumiamo le semplificazioni descritte tino a questo punto. Vogliamo convertire
una CKG arbitraria G in una CFG equivalente che non abbia simboli inutili, e-produzioni
o produzioni unitarie. Nel farlo bisogna prestare attenzione all'ordine di applicazione
delle costruzioni. Un ordine sicuro :
1. eliminare le eproduzioni
2. eliminare le produzioni unitarie
3. eliminare i simboli inutili.
283
Come nel Paragrafo 7.1.1 bisognava ordinare opportunamente i due passi per evitare che il
risultato avesse simboli inutili, anche qui occorre ordinare i tre passi secondo le indicazio
ni date, altrimenti il risultato potrebbe conservare alcune caratteristiche che intendevamo
eliminare.
Teorema 7.14 Se G una CFG che genera un linguaggio contenente almeno una stringa
diversa da r, allora esiste un'altra CFG Gy tale che L(Gy ) = L(G) {e}, e G i non ha
-produzioni, produzioni unitarie o simboli inutili.
Cominciamo eliminando le (-produzioni con il metodo illustrato nel Pa
ragrafo 7.1.3. Se poi eliminiamo le produzioni unitarie con il metodo del Paragrafo 7.1.4,
non introduciamo alcuna e-produzione, perch i corpi delle nuove produzioni sono iden
tici a quelli delle produzioni originarie. Infine eliminiamo i simboli inutili con il metodo
del Paragrafo 7.1.1. Dato che questa trasformazione elimina solo produzioni e simbo
li, e non introduce mai nuove produzioni, la grammatica risultante sar ancora priva di
c-produzioni e produzioni unitarie.
d im o s t r a z io n e
7.1.5
Completiamo lesame delle semplificazioni grammaticali dimostrando che ogni CFL non
vuoto, privo di e, ha una grammatica G le cui produzioni sono di due semplici forme:
1. A * B C , dove A, B e C sono variabili
2. A * a, dove A una variabile e a un terminale.
Inoltre G non ha simboli inutili. Una tale grammatica si dice in CNF ( Chomsky; Norma!
Form, forma normale di Chomsky).1
Per porre una grammatica in CNF si parte da una grammatica chc soddisfa i vincoli
del Teorema 7.14, cio priva di e-produzioni, produzioni unitarie c simboli inutili. Ogni
produzione quindi della forma A > a, una forma ammessa nella CNF, oppure ha un
corpo di lunghezza 2 o pi. Il nostro compito duplice:
a) far s che i corpi di lunghezza 2 o pi consistano soltanto di variabili
b) scomporre i corpi di lunghezza 3 o pi in una cascata di produzioni, ciascuna con
un corpo fatto di due variabili.
l Noani Chomsky il linguista chc per primo propose le grammatiche libere dal contesto per descrivere il
linguaggio naturale, c che dimostr che ogni CFG pu essere posta in questa forma. interessante notare che,
mentre la CNF non sembra avere impieghi interessanti in linguistica, ne vedremo Ie applica/ioni in molti altri
ambiti, per esempio come modo efficiente per stabilire se una stringa appartiene a un CFL (Paragrafo 7.4.4).
284
Capitolo I
A -
B iC l , Ci -
B 2C2, . . . , C k- 3 -
B k - 2C k- 2, Ck--> -
B k xB k
Esem pio 7.15 Convertiamo in CNF la grammatica dcllEsempio 7.12. Per il punto (a)
notiamo che ci sono otto terminali, a, b, 0, 1. + , *, ( e ), ognuno dei quali compare
in un corpo insieme ad altri simboli. Dobbiamo perci introdurre otto nuove variabili
corrispondenti a questi terminali, c otto produzioni in cui le nuove variabili sono sostituite
dai rispettivi terminali:
A > a
P-*+
B -*b
M > *
Z 0
L >(
O -* l
! ?- >)
Inserendo queste produzioni, e sostituendo ogni terminale nei corpi diversi da un sin
golo terminale con la variabile corrispondente, otteniamo la grammatica riprodotta nella
Figura 7.2.
E
-
T
-
F
-
I
-
A
+
B
*
Z - *
O
P
M
-
L
-
R
-
E P T I T M F I L E R \ a \ b \ I A \ I B \ TZ | I O
T M F I LER Ia I 6 I I A \ 1 B \ I Z \ IO
LEP \ a \ b \ T A \ T B \ l Z \ IO
a I b \ I A I TB \ TZ \ TO
a
b
U
1
+
H
=
(
)
Figura 7.2 Ogni corpo diventa un solo terminale o una sequenza di variabili.
Tutte le produzioni sono ora nella forma normale di Chomsky, tranne quelle con corpo
di lunghezza 3: E PT, T M F e LER.. Alcuni di questi corpi compaiono in pi di una
285
produzione, ma possiamo trattarli una sola volta, definendo una nuova variabile per cia
scuno. Per E P T definiamo la nuova variabile C 1 e sostituiamo lunica produzione in cui
compare, E * E PT, con E * ECy e C 1 P T .
Per T M F definiamo la nuova variabile C2. Le due produzioni per questo corpo.
E T M F e T > T M F , sono sostituite da E -> T C 2, T -> T C 2 e C2 M F .
Per L E R definiamo Cj e sostituiamo le sue tre produzioni, E * L E R , T * L E R e
F - L E/?, con L - L C i, - L C 3, F - LC 3 e C3 - F jK. La grammatica finale,
che in CNF, riprodotta nella Figura 7.3.
E
T
F
I
A
B
Z
O
P
M
L
R
Cy
G2
C3
E C 1 I T C 2 I LC3 1a \b \ I A \ I B \ I Z \ I O
T C 2 I LC3 \ a \ b \ I A \ I B \ I Z \ I O
LC 3 I a I b I JA I I B \ I Z \ IO
a \ b I M | LB | LZ | / 0
a
b
0
1
+
*
(
)
PT
MF
ER
Teorema 7.16 Se G una CFG il cui linguaggio contiene almeno una stringa diversa da e,
esiste una grammatica C i in forma normale di Chomsky tale che L (C i) = L(G) {r}.
DIMOSTRAZIONE Per il Teorema 7.14 possiamo trovare una CFG G 2 priva di simboli inu
tili, e-produzioni e produzioni unitarie, talc chc L (G 2) = L(G ) {e}. La trasformazione
di G 2 in una grammatica CNF G 1 modifica le produzioni in modo che ogni produzione
di G 2 sia simulala da una o pi produzioni di G . Inoltre le nuove variabili di Gy hanno
ciascuna una sola produzione, cos che possono essere usate unicamente come previsto.
Dimostriamo formalmente che w in L(G2) se e solo se in L (G i ).
(Solo se) Se w ha una derivazione in G 2 facile sostituire ogni produzione impiegata,
poniamo A > X y X 2 - Xic, con una sequenza di produzioni di G . Un passo nella
286
Capitolo I
7.1.6
Esercizi
S
A
B
C
A B ICA
a
B C IAB
- aB \ b
287
(b)
288
Capitolo 7
-
-
OAO I I i i l I B B
C
S IA
S
A
B
->
289
A A A IB
aA I B
(
S
A
B
C
D
-*
->
-
-
-
. I bBb \ e
C| a
C| 6
CDE !f
A I B I a
Esercizio 7.1.6 Definite una grammatica CNF per Finsicme delle stringhe di parentesi
bilanciate. Non necessario partire da una grammatica non CNF.
Esercizio 7.1.7 Sia C una CFG con p produzioni e nessun corpo di produzione pi lungo
di n. Dimostrate che sc A = e, esiste una derivazione di e da .4 in non pi di (np
G
290
Capitolo I
Esercizio 7.1.11 In questo esercizio dimostriamo che per ogni linguaggio L libero dal
contesto che contenga almeno una stringa diversa da e, c una CFG in forma normale di
Greibach che genera L {e}. Ricordiamo che in una grammatica in forma normale di
Grcibach (GNF) il corpo di ogni produzione comincia con un terminale. La procedura si
fonda su una serie di lemmi c costruzioni.
a) Supponiamo chc una CFG G abbia una produzione A *exB p c che tutte le pro
duzioni per B siano B *
| 72 | | ^ n- Sostituendo A > cxBp con tut
te le produzioni ottenute sostituendo a B il corpo di una produzione di B, cio
A > OTfiP I <*72 $ I I OtJnPi otteniamo una grammatica che genera lo stesso
linguaggio di G.
D ora in poi assumiamo che la grammatica G di L sia in forma normale di Chomsky, con
variabili A \ , A^. . . . . A k .
*! b) Dimostrate che, applicando ripetutamente la trasformazione della parte (a), possia
mo convertire G in una grammatica equivalente, in cui ogni corpo di produzione
per A i comincia o con un terminale o con A j, per un j > i. In ambedue i casi tutti
i simboli dopo il primo in ogni corpo sono variabili.
! c) Sia G\ la grammatica ottenuta compiendo il passo (b) su G. Sia una variabile
e Ai A iCtl I ; Ai(xni tutte le sue produzioni i cui corpi cominciano con A i.
Siano
4/
Pi I I Pp
A 1 -> P i B i I . . . I Pv B i
Bi > B i I Q:i I I Oim B i I Oim
Provate che la grammatica risultante genera lo stesso linguaggio di G e di G i .
*! d) Sia G la grammatica ottenuta al passo (c). Notiamo che i corpi di tutte le produ
zioni di Aj cominciano con un terminale o con Aj, per j > i. Anche i corpi di
tutte le produzioni di B i cominciano con un terminale o con Aj. Dimostrate che
G -2 ha una grammatica equivalente in GNF. Suggerimento: sistemate anzitutto le
produzioni per A k, poi per A k- \ , e cos via, fino ad A i , applicando il punto (a).
Quindi, ancora applicando (a), sistemate le produzioni per B, in qualsiasi ordine.
Esercizio 7.1.12 Applicate la costruzione delFEsercizio 7.1.11 per convertire in GNF la
grammatica:
7.2
->
->
291
A A IO
SS I 1
Sviluppiamo ora uno strumento per dimostrare che certi linguaggi non sono liberi dal
contesto. Il teorema, detto pumping lemma per i linguaggi liberi dal contesto, afferma
che in ogni stringa sufficientemente lunga di un CFL si possono trovare due sottostringhe,
brevi e vicine, che possibile iterare in tandem. Possiamo cio ripetere per i volte le due
stringhe, per ogni intero i, e generare stringhe che appartengono al linguaggio.
Confrontiamo questo teorema con l'analogo lemma per i linguaggi regolari (Teore
ma 4.1), secondo il quale c 'c sempre una stringa breve da iterare. La differenza si chia
risce esaminando un linguaggio come L = {0"T" | n > 1}. Possiamo provare che non
regolare fissando n e ripetendo una sottostringa di 0 fino a ottenere una stringa con pi
0 chc I . Il lemma per i CFL dice invece che ci sono due sottostringhe: potremmo allora
dover scegliere una stringa di 0 e una di 1, generando cos solo stringhe in L quando le
replichiamo. una circostanza fortunata perch L c un CFL, e non saremmo quindi in
grado di usare il pumping lemma dei CFL per costruire stringhe al di fuori di L.
7.2.1
Il primo passo verso un pumping lemma per CFL lesame della forma e dimensione
degli alberi sintattici. La CNF si usa, tra l'altro, per trasformare alberi sintattici in alberi
binari. Questi alberi hanno alcune propriet utili; ne sfrutteremo subito una.
Teorem a 7.17 Consideriamo un albero sintattico di una grammatica in forma normale di
Chomsky G = (V, T, P, S ); sia w, una stringa terminale, il suo prodotto. Se la lunghezza
del cammino pi lungo n, abbiamo w\ < 2n_1.
DIMOSTRAZIONE Per induzione su n.
BASE
radice dellalbero usa una produzione, che deve avere la forma .4 > B C perch n >
1; non possiamo cio svolgere lalbero da una produzione con un terminale. Nessun
cammino nei sottoalberi radicati in B e C pu essere lungo pi di n - 1 perch questi
cammini escludono gli archi dalla radice ai figli etichettati B e C. Quindi, per l'ipotesi
292
Capitolo 7
7.2.2
Il pumping lemma per i CFL molto simile a quello per i linguaggi regolari, anche se
ogni stringa z di un CFL I, viene scomposta in cinque parti c si replicano la seconda e la
quarta in tandem.
Teorema 7.18 (Il pumping lemma per linguaggi liberi dal contesto) Sia L un CFL. Esiste
una costante n tale chc, se 2 una stringa in L tale che \z\ almeno ri, possiamo scrivere
^ uvwxy, con le seguenti condizioni.
1. |m kc| < n. La parte mediana ha lunghezza limitata.
2. vx e. Poich v e x sono i pezzi da replicare, questa condizione afferma chc
almeno una di queste stringhe devessere non vuota.
3. Per ogni i > 0, uvlw x 'y in L. Le due stringhe v e x possono essere replicate per
un numero arbitrario, anche zero, di volte, e le stringhe ottenute sono ancora in L.
DIMOSTRAZIONE Per prima cosa troviamo una grammatica G per L chc sia in forma
293
F ig u ra 7.5 Una stringa sufficientemente lunga in L deve avere un cammino lungo nel
suo albero sintattico.
294
Capitolo 7
S
7.2.3
Come abbiamo fatto per i linguaggi regolari, ci serviamo del pumping lemma per i CFL
come di un gioco a due.
1. Scegliamo un linguaggio L che vogliamo dimostrare non essere un CFL.
2. Lavversario sceglie n senza comunicarcelo: dovremo agire por ogni possibile n.
3. Scegliamo z; per farlo possiamo usare n come parametro.
4. Lavversario scompone 2 in uvwxy, con il solo vincolo che
5. Vinciamo la partita se possiamo scegliere i in modo che
U v tW x ty
< n e v x e.
non sia in L.
Vediamo ora alcuni esempi di linguaggi che dimostriamo non liberi dal contesto per mez
zo del pumping lemma. Tl primo esempio mostra che i linguaggi liberi dal contesto, pur
potendo confrontare due gruppi di simboli secondo criteri di uguaglianza, non possono
farlo per tre gruppi.
Esem pio 7.19 Sia L il linguaggio {0n l n 2n j n > 1}. L consiste di tutte le stringhe
in O+ I + 2+ con lo stesso numero di occorrenze di ciascun simbolo, per esempio 012,
0 0 1122, e cos via. Supponiamo che L sia libero dal contesto. Il pumping lemma fornisce
allora un intero n ? Scegliamo z = 0 l ra2n .
^Precisiamo chc n c la costante fornita dal lemma e non ha nulla a chc vedere con la variabile n che compare
nella definizione di L.
295
Supponiamo che lavversario spezzi z in z = uvwxy, dove \vwx\ < ri, e v e x non
sono entrambe e. Sappiamo che v w x non pu contenere sia 0 sia 2 perch l'ultim o 0 e
il primo 2 sono separati da ri + 1 posizioni. Dimostreremo che L contiene stringhe al di
fuori di L , contraddicendo lassunto che L sia un CFL. Ci sono due casi.
1. v w x non contiene 2. In questo caso vx consiste solo di 0 c 1, e conta almeno un
simbolo. Quindi uwy, chc dovrebbe essere in L per il pumping lemma, ha n 2,
ma ha meno di n 0 o meno di n 1, o entrambi. Non appartiene dunque a L. Ne
deduciamo che in questo caso L non un Ch'L.
2. v w x non contiene 0. Analogamente al primo caso, uwy ha ri U e meno di n 1 o
meno di n 2. Quindi non in L.
296
Capitolo I
In ambedue i casi concludiamo che L dovrebbe contenere una stringa che sappiamo non
appartenergli. Dalla contraddizione ricaviamo che lassunto era scorretto: L non un
CFL.
Unaltra cosa chc i CFL non possono fare abbinare coppie con lo stesso numero
di simboli, se le coppie sono intrecciate fra loro. Lidea viene precisata neHcsempio
seguente, in cui Si prova mediante il pumping lemma che un linguaggio non un CFL.
Esempio 7.20 Sia L il linguaggio {0*P2l3^ |i > 1 e j > 1}. Se L libero dal contesto,
sia n la costante per L; scegliamo 2 - 0 l n2n3n . Possiamo scrivere 2 = uvwxy con i
vincoli abituali: \vwx\ < n e vx e. Di conseguenza vwx contenuta nella sottostringa
di un solo simbolo 0 sta a cavallo di due simboli adiacenti.
Se vwx consiste di un solo simbolo ripetuto, uwy ha n occorrenze di ognuno dei tre
simboli distinti e meno di a del quarto simbolo. Perci non pu essere in L. Se vwx
a cavallo di due simboli, per esempio 1 e 2 , a uwy mancano degli 1 o dei 2 , o entrambi.
Supponiamo che manchino degli 1. Poich ci sono n 3 la stringa non pu essere in L.
Analogamente, se mancano dei 2, essendoci n 0, uwy non pu essere in L. Abbiamo
allora una contraddizione con lipotesi che L sia un CFL, da cui deduciamo che non lo .
Come ultimo esempio dimostriamo che i CFL non possono abbinare due stringhe di
lunghezza arbitraria, se le stringhe sono scelte da un alfabeto di pi di un simbolo. Per
inciso, questa osservazione significa chc Ic grammatiche non sono adatte a imporre in un
linguaggio di programmazione certi vincoli semantici, come il consueto vincolo che un
identificatore devessere dichiarato prima delluso. Per registrare gli identificatori dichia
rati si impiega nella pratica un altro meccanismo, per esempio una tabella dei simboli,
non cercheremo quindi di ideare un parser che di per s verifichi laderenza alla regola
citata.
2. Supponiamo che vwx sia a cavallo del primo blocco di 0 c il primo di 1. Pu darsi
che vx consista solo di 0, se x = e. Allora il ragionamento secondo cui uwy non
della forma li lo stesso del caso ( 1). Sc vx ha almeno un 1, notiamo che /, la cui
lunghezza almeno 3/2, deve terminare per I n perch cos termina uwy. In ogni
caso non ci sono altri blocchi di n 1 oltre al blocco finale, quindi t non pu ripetersi
in uwy.
3. Se vwx contenuta nel primo blocco di I , la prova che uwy non in L b la stessa
della seconda parte del caso (2 ).
4. Supponiamo che vwx sia a cavallo del primo blocco di I e del secondo di 0. Se vx
non contiene 0 , si ragiona come nel caso in cui vwx c contenuta nel primo blocco
di 1. Se vx ha almeno uno 0, uwy comincia con un blocco di ri 0, come t, se
uwy = ti. In ogni caso non ci sono altri blocchi di n 0 in uwy per la seconda copia
di t. Ancora una volta concludiamo che uwy non c in L.
5. Negli altri casi, in cui vwx nella seconda met di z, il ragionamento simmetrico
ai casi in cui si trova nella prima met.
Perci in nessun caso uwy in L; concludiamo che L non libero dal contesto.
7.2.4
Esercizi
Esercizio 7.2.1 Applicando il pumping lemma per i CFL dimostrate che i seguenti lin
guaggi non sono liberi dal contesto.
* a) [OiVck \i < j < k}.
b) {a"bncl I i < n}.
c) {Op I p un numero primo}. Suggerimento: adattate Ic idee impiegate nellEsempio 4.3, dove si dimostra che questo linguaggio non c regolare.
*! d) [Oi V I j = i 2}.
! c) {anb7lc I n <
i < 2 n}.
298
Capitolo 7
! Esercizio 7.2.2 Quando si cerca di applicare il pumping lemma a un CFL, vince lavver
sario e non si riesce a completare la prova. Spiegate dove la dimostrazione fallisce per i
seguenti linguaggi.
a) {0 0 , 1 1 }.
* b) {0 n l n | n > 1 }.
* c) Linsieme delle palindrome sullalfabeto {0, 1}.
! Esercizio 7.2.3 Una versione pi forte del pumping lemma per i Ci 7L, nota come lemma
di Ogden, differisce dal primo perch si concentra su n posizioni privilegiate di una
stringa 2 c garantisce chc le stringhe da replicare hanno tra I ed ri posizioni privilegiate. 11
vantaggio che un linguaggio pu avere stringhe fatte di due parti, di cui una pu essere
replicata senza generare stringhe estranee al linguaggio, mentre l altra, se replicala, ne
genera. Se non possiamo imporre che la replicazione avvenga nella seconda parte, non
siamo in grado di portare a termine una dimostrazione di non libert dal contesto. Ecco
lenunciato formale del lemma di Ogden: sia L un CFL; esiste una costante n tale che se
2 una stringa in L, di lunghezza non inferiore a n, in cui scegliamo almeno n posizioni
privilegiate, possiamo scrivere 2 uvwxy con le seguenti condizioni:
1 . vwx ha al massimo n posizioni privilegiate
2 . vx ha almeno una posizione privilegiata
7.3
Consideriamo ora alcune operazioni sui linguaggi liberi dal contesto che producono nuovi
CFL. Molte di queste propriet di chiusura sono analoghe ai teoremi sui linguaggi regolari
del Paragrafo 4.2, con alcune differenze.
Presentiamo per prima un'operazione in cui sostituiamo ogni simbolo nelle stringhe
di un linguaggio con un intero linguaggio. Questa operazione, che generalizza lomo
morfismo studiato nel Paragrafo 4.2.3, utile per dimostrare altre propriet di chiusura
dei CFL, tra cui quelle relative alle operazioni su espressioni regolari: unione, concatena
zione e chiusura. Dimostriamo che i CFL sono chiusi per omomorfismo e omomorfismo
inverso. Diversamente dai linguaggi regolari, i CFL non sono chiusi per intersezione e
differenza, ma lintersezione e la differenza di un CFL e di un linguaggio regolare sono
sempre CFL.
7.3.1
Sostituzioni
Sia un alfabeto; per ogni simbolo a in scegliamo un linguaggio L a. Gli alfabeti per
questi linguaggi sono arbitrari, ovvero possono essere diversi tra di loro cos come distinti
da . La scelta definisce una funzione s (una sostituzione) su ; per ogni simbolo a
denoteremo La con .s(a).
Se
?/; =
<22 o,n una stringa in *, .s(w) il linguaggio di tutte le stringhe
\2 tali che la stringa Xi appartiene al linguaggio s(a), per i = 1 , 2 , . . . , n .
In altri termini s(w) la concatenazione dei linguaggi $ (a i)s(a 2 ) -s(an). Possiamo
estendere ai linguaggi la definizione di s: s(L) l'unione degli s(w) per tutte le stringhe
w in L.
Esempio 7.22 Siano .s(0) = {anbn \n > 1} c .s(l) = {aa,bb}. Quindi s una sosti
tuzione sullalfabeto = {0,1}. Il linguaggio .s(0) l'insieme delle stringhe con uno o
pi a seguiti da un uguale numero di b, mentre s (l) il linguaggio, finito, formato dalle
due stringhe aa e bb.
Sia w = 01. Allora s(w) la concatenazione dei linguaggi s(0)s(l). Per la precisione
s(w) consiste nelle stringhe della forma anb"au e a"bn+'2, con n > L
Poniamo ora L = L(Ox), cio linsieme di tutte le stringhe di 0. Allora s(L) =
(.s(0))*. Questo linguaggio l insieme di tutte le stringhe della forma
11 linguaggio
300
Capitolo I
DIMOSTRAZIONE Lidea di fondo questa: prendiamo una CFG per L e sostituiamo ogni
terminale a con il simbolo iniziale di una CFG per il linguaggio (). Otteniamo una
CFG che genera s(L). Dobbiamo ora precisare alcuni dettagli.
In termini formali partiamo da una grammatica per ognuno dei linguaggi in questione:
poniamo quindi G (V, . P, S) per L e G a = ( V11.. Ta. Pa, Sn) per ogni a in . Poichd
la scelta dei nomi delle variabili libera, facciamo in modo che i vari insiemi di variabili
siano disgiunti, cio che nessun A compaia in pi di uno degli insiemi V e Va. Questa
scelta ha lo scopo di garantire che, unendo le produzioni delle diverse grammatiche in
un insieme, non vengano accidentalmente mescolate produzioni da grammatiche distinte,
con l'effetto di generare derivazioni che non appartengono a nessuna delle grammatiche
assegnate.
Costruiamo ora una nuova grammatica G' = (V ',T ', P ', S) per s(L).
In questo modo gli alberi sintattici di G' si sviluppano come quelli di G, ma anzich
avere un prodotto in * hanno una frontiera i cui nodi sono etichettati da Sa per un a in
. Da ognuno di questi nodi pende un albero sintattico di Ga, il cui prodotto una stringa
terminale nel linguaggio (a). Un tipico albero sintattico illustrato nella Figura 7.8.
Dobbiamo ora dimostrare formalmente che la costruzione corretta, cio che G'
genera il linguaggio s(L).
Una stringa w in L(Gr) se e solo se w in s(L).
(Se) Sia w in s(L). Allora esistono una stringa x = -an in L e stringhe Xi in
s(ili), per i = 1 , 2 ,...,? ? , tali che w = 2 Quindi la porzione di G' proveniente
dalle produzioni di G, con Sa al posto di ogni a, genera una stringa pari a x con Sa al
posto di ogni a. Questa stringa Sa, Snj - Sr,. Questa parte della derivazione di n;
corrisponde al triangolo superiore nella Figura 7.8.
Poich le produzioni di ogni Ga sono anche produzioni di G ', la derivazione di X i da
Sai anche una derivazione in G '. Gli alberi sintattici di queste derivazioni corrispon
dono ai triangoli inferiori della figura. Dato che il prodotto dell'albero sintattico di G1
X]X2 Xn = w>concludiamo che w in L(Gf).
(Solo se) Sia ora w in L(G r). Affermiamo che l'albero sintattico di w deve avere la forma
dellalbero della Figura 7.8. Il motivo che le variabili delle grammatiche G e G a, per a
Figura 7.8 Un albero sintattico di G' si sviluppa come uno di G, ma termina in pi alberi,
ciascuno appartenente a una delle grammatiche Ga.
1. w = .T1X2
7.3.2
Grazie al Teorema 7.23 possiamo dimostrare anche per i CFL numerose propriet di
chiusura note che abbiamo studiato nel caso dei linguaggi regolari.
Teorema 7.24 I linguaggi liberi dal contesto sono chiusi rispetto alle seguenti operazioni:
1. unione
2 . concatenazione
302
Capitolo 7
4. omomorfismo.
DIM OSTRAZIONE Ciascuna richiede solo di definire unopportuna sostituzione. Le dimo
strazioni che seguono comportano loperazione di sostituzione di linguaggi liberi dal con
testo applicata ad altri linguaggi liberi dal contesto; per il Teorema 7.23 esse producono
CFL.
1. Unione: siano Ly ed L2 due CFL. Allora L i U L2 il linguaggio s(L ), dove L il
linguaggio {1 . 2 } ed $ la sostituzione definita da * ( 1 ) = Li e s(2 ) = L2.
7.3.3
Inversione
I CFL sono chiusi anche rispetto alloperazione di inversione. Non possiamo servirci del
teorema di sostituzione, ma c una semplice costruzione basata su grammatiche.
7.3.4
S-AB
A -> 0.41 I 01
D -> 2B I 2
In questa grammatica, A genera tutte le stringhe della forma 0"T\ B tutte le stringhe di
2. Una grammatica per L 2 data da:
S AB
A Oyl I 0
12
Il meccanismo simile, ma A genera tutte le stringhe di 0, mentre B le stringhe della
forma l 2 n .
Si nota immediatamente che L = L i D L2. Infatti Li impone che ci sia lo stesso
numero di 0 e di I ed L 2 che ci sia lo stesso numero di 1 e di 2. Una stringa in ambedue i
linguaggi deve avere lo stesso numero di ripetizioni dei tre simboli, e quindi appartenere
a l.
Se i CFL fossero chiusi rispetto all'intersezione, potremmo dimostrare lenunciato,
falso, che L libero dal contesto. Abbiamo cos dimostrato per assurdo che i CFL non
sono chiusi rispetto allintersezione.
Per quanto riguarda l intersezione, possiamo affermare una propriet pi debole: i lin
guaggi liberi dal contesto sono chiusi rispetto al l intersezione con un linguaggio regolare.
L'enunciato formale e la dimostrazione costituiscono il seguente teorema.
dei linguaggi regolari mediante automi a stati finiti. La dimostrazione generalizza quella
del Teorema 4.8, dove si eseguono in parallelo due automi per avere lintersezione dei
loro linguaggi. Qui si esegue un automa a stati finiti in parallelo con un PDA: il risultato
un nuovo PDA. come illustrato nella Figura 7.9.
304
Capitolo 7
Input
AccetUi/
rifiuta
Stack
Formalmente sia
P = (? ; , , ,., Fp )
un PDA che accetta L per stalo finale, e sia
1 .s = Sa (P>a)
Esempio 7.28 Tl PDA F rappresentato nella Figura 6 .6 accetta per stato finale linsieme
delle stringhe di i ed e che corrispondono a violazioni minimali della regola sullordine
di if ed else nei programmi C. Chiamiamo L questo linguaggio. Il PDA F definito da
Pf =
2 . SF(q,i,Z ) = {(q,ZZ)}
3. Sf (g ,e ,Z ) = {(/,)}
4. SF(q,e.,X0) = {(r,e.e)}.
Definiamo ora un automa a stati finiti
A = ({s,i},{.e},<5^..s, { M } )
che accetta le stringhe del linguaggio i*e*, cio tutte le stringhe fatte di i seguiti da e, in
numero arbitrario. Chiamiamo R questo linguaggio. La funzione di transizione Sa cos
definita:
a) Sa (s , ) = a
b)
c)
e) = /
(,)
t.
A rigor di termini, A non un DFA. come richiesto dal Teorema 7.27, perch gli manca
uno stato trappola di destinazione per linput /' nello stato t. La stessa costruzione funziona
per anche per un NFA perch il PDA da costruire pu essere non deterministico. In
questo caso il PDA costruito di fatto deterministico, anche se muore su certe sequenze
di input.
Definiamo un PDA
P = ({p,<7,r} X
306
Capitolo 7
Le transizioni di sono elencate sotto, contrassegnate dalla regola del PDA F (un numero
da 1 a 4) e dalla regola del DFA A (una lettera, a, b o a) da cui derivano. Le otransizioni
del PDA F non derivano da regole di .4. Notiamo che le regole sono formate secondo
necessit a partire dallo stato di P composto dagli stati iniziali di F e A, e costruendo le
regole per gli altri stati solo quando si scopre che P li pu raggiungere.
Li L2 = L i U L2
e i CFL sono chiusi rispetto allunione, ne seguirebbe che sono chiusi anche rispetto
allintersezione. Dall'Ksempio 7.26 sappiamo per chc non vero.
Infine dimostriamo (3). Sappiamo che '* un CHL per ogni alfabeto : facile
definire una grammatica o un PDA per questo linguaggio regolare. Perci se Ly L 2
fosse un CFL quando lo sono L 1 ed L2. ne seguirebbe che * L un CFL se lo L.
Ma, per un'opportuna scelta dellalfabeto ,
L L. Ci sarebbe in contraddizione
con (2 ): abbiamo quindi dimostrato per assurdo che L i L2 non necessariamente un
CFL.
7.3.5
Omomorfismo inverso
Capitolo I
308
Input
Accetta/
rifiuta
Figura 7.10 Costruzione di un PDA che accetta Fomomorfismo inverso del linguaggio di
un PDA assegnato.
(7.1 )
dove
1. Q' linsieme delle coppie (q, x) tali che:
(a) q uno stato in Q
(b) X un suffisso (non necessariamente proprio) di una stringa h(a) per un
simbolo di input a in .
Il primo componente dello stato di P' quindi lo stato di P; il secondo il buffer.
Ipotizziamo che il buffer sia periodicamente riempito con una stringa h(n), c poi
perda clementi dalla fronte a mano a mano che i suoi simboli vengono passati al
PDA simulato P. Poich finito e h(a) finito per ogni a, P 1 ha un numero
finito di stati.
2 . S1 definita dalle seguenti regole.
(a)
d'((q,bx),c. X )
contiene ((p,x), 7 ). Quindi P' pu sempre simulare una mossa di P usando
il primo simbolo nel buffer. Se b un simbolo in T , il buffer non devessere
vuoto; se b = e, il buffer pu essere vuoto.
3. Per la definizione (7.1), lo stato iniziale di P' (qo-e); quindi P 1parte dallo stato
iniziale di P con il buffer vuoto.
4. Similmente, secondo la (7.1 ), gli stati accettanti di P ' sono le coppie (q. c), dove q
uno stato accettante di P.
Lenunciato che segue caratterizza la relazione fra P 1e P:
(<7o, h{w), Z0) (p, e, 7 ) se e solo se ((%, e), w, Z0) ((p, e), ,7 ).
Per dimostrarlo si procede, nelle due direzioni, per induzione sul numero di mosse fatte
dai due automi. Nella parte "se si deve osservare che, quando il buffer non vuoto, P 1
non pu leggere altri simboli di input e deve simulare P fino a svuotare il buffer (ma pu
continuare a simulare P anche con il buffer vuoto). Lasciamo i dettagli per esercizio.
Se accettiamo questa relazione fra P 1 e P, ne deduciamo che P accetta h(w) se e
solo se P ' accetta w per come sono definiti gli stati accettanti di P'. Perci L i P') =
h - '(L (P )).
7.3.6
Esercizi
Esercizio 7.3.1 Mostrate che i CFL sono chiusi rispetto alle seguenti operazioni.
* a) init, definita nellEsercizio 4.2.6(c). Suggerimento: partite da una grammatica CNF
per il linguaggio L.
*! b) Loperazione L /a , definita nellEsercizio 4.2.2. Suggerimento: anche in questo
caso partite da una grammatica CNF per L.
!! c) cycle, definita nellEsercizio 4.2.11. Suggerimento: tentate una costruzione basata
sui PDA.
310
Capitolo 7
shuffle(Li, L2)
3 11
Esercizio 7.3.5 Una stringa y si dice una permutazione della stringa x se possiamo ot
tenere X riordinando i simboli di y. Per esempio le permutazioni della stringa x = 011
sono 110,101 e O li. Dato un linguaggio L.perm(L) l'insieme delle permutazioni delle
stringhe in L. Per esempio, se L = {0n l n |n > 0}, perm(L) l'insieme delle stringhe
con lo stesso numero di 0 e di 1.
a) Fornite un esempio di linguaggio regolare L sullalfabeto {0.1} tale che perm(L)
non sia regolare. Giustificate la risposta. Suggerimento: cercate un linguaggio
regolare le cui permutazioni siano tutte le stringhe con lo stesso numero di 0 e di 1 .
b) Fornite un esempio di linguaggio regolare L sullalfabeto {0.1,2} tale cheperm(L)
non sia libero dal contesto.
c) Dimostrate che, per ogni linguaggio regolare L su un alfabeto di due simboli,
penn(L) libero dal contesto.
Esercizio 7.3.6 Dimostrate formalmente che i CFL sono chiusi rispetto allinversione
(Teorema 7.25).
Esercizio 7.3.7 Completate la dimostrazione del Teorema 7.27 provando chc
7.4
7 ) e P = S(pA,w).
Esaminiamo ora quali questioni inerenti ai linguaggi liberi dal contesto siamo in grado
di risolvere. Come nel Paragrafo 4.3 sulle propriet di decisione dei linguaggi regolari,
partiremo sempre da una rappresentazione di un CFL: o una grammatica o un PDA. Dal
Paragrafo 6.3 sappiamo di poter trasformare una grammatica in un PDA, e viceversa;
possiamo quindi scegliere la rappresentazione pi comoda a seconda dei casi.
Per i CFL scopriremo che ben poco decidibile: le verifiche pi importanti che pos
siamo fare sono volte a stabilire se un linguaggio sia vuoto 0 no e se una data stringa
3 12
Capitolo 7
gli appartenga. Il paragrafo termina con una breve discussione su certi problemi che
nel Capitolo 9 dimostreremo essere !!decidibili, cio privi di algoritmi per risolverli.
Cominciamo il paragrafo con alcune note sulla complessit della conversione fra gram
matiche e PDA. Queste valutazioni riguardano lefficienza con cui possiamo decidere una
propriet dei CFL per una particolare rappresentazione.
7.4.1
Prima di trattare gli algoritmi di decisione peri CFL, esaminiamo la complessit di con
versione da una rappresentazione all'altra. Se un linguaggio specificato in una forma
diversa da quella richiesta daH'algoritmo, il tempo necessario per la conversione fa parte
del costo di un algoritmo di decisione.
Di qui in avanti denoteremo con n la lunghezza dell intera rappresentazione di un
PDA o di una CFG. Questo modo di rappresentare la dimensione di una grammatica o di
un automa approssimativo perch il tempo di esecuzione di alcuni algoritmi si descrive
pi esattamente rispetto a parametri pi specifici, come il numero delle variabili di una
grammatica o la somma delle lunghezze delle stringhe di stack presenti nella funzione di
transizione di un PDA.
La lunghezza totale comunque sufficiente a distinguere i tratti pi significativi: se
lalgoritmo sia lineare nella lunghezza (cio impieghi un tempo poco superiore a quello
necessario per leggere linput), se sia esponenziale nella lunghezza (e quindi consenta
la conversione solo per esempi piccoli), oppure se sia polinomiale ma non lineare (cio
possa essere eseguito anche per esempi grandi, ma in tempo chc pu essere rilevante).
Alcune conversioni presentate fin qui sono lineari nella dimensione dell input. Poi
ch impiegano tempo lineare, la rappresentazione che producono non solo generata
rapidamente, ma anche di dimensione simile a quella dell input. Elenchiamole.
1. Conversione di una CFG in PDA tramite lalgoritmo del Teorema 6.13.
2. Conversione di un PDA che accetta per stato finale in PDA che accetta per stack
vuoto, tramite la costruzione del Teorema 6.11.
3. Conversione di un PDA chc accetta per stack vuoto in PDA che accetta per stato
finale, tramite la costruzione del Teorema 6.9.
Valutare il tempo di esecuzione della conversione da PDA a grammatica (Teorema 6.14)
mollo pi complesso. Notiamo anzitutto che n, la lunghezza totale dellinput, un li
mite superiore al numero di stati e di simboli di stack; quindi non possiamo avere nella
grammatica pi di Ui variabili della forma [p.Xq]. Il tempo di esecuzione della conversio
ne pu essere invece esponenziale, se qualche transizione del PDA inserisce un numero
elevato di simboli nello stack. Una regola pu collocare sullo stack fino a n simboli.
313
7.4.2
Poich un algoritmo di decisione pu richiedere che una CFG sia in forma normale di
Chomsky, dobbiamo esaminare il tempo di esecuzione degli algoritmi definiti per conver
tire una grammatica qualsiasi in grammatica CNF. I passi preservano in genere, a meno
di un fattore costante, la lunghezza della descrizione: partendo da una grammatica di lun
ghezza n ne producono una di lunghezza O (n ). Le osservazioni che seguono precisano
questa affermazione.
1. Con un algoritmo opportuno (vedi Paragrafo 7.4.3) si possono rilevare i simboli
raggiungibili e generatori di una grammatica in tempo O (n ). Leliminazione dei
simboli inutili richiede tempo Q(n) e non aumenta la dimensione della grammatica.
3 14
Capitolo 7
0 (2).
Per evitare questa crescila esponenziale basta limitare la lunghezza dei corpi delle pro
duzioni. L'espediente del Paragrafo 7 . 1.5 si pu applicare a qualsiasi corpo, non soltanto
a quelli privi di terminali. Suggeriamo perci, come passo preliminare al !eliminazione
delle e-produzioni. di spezzare i corpi pi lunghi in sequenze di produzioni con corpi di
lunghezza 2. Questo passo richiede tempo O (n) e allunga la grammatica di un fattore solo
lineare. La costruzione del Paragrafo 7.1.3 per eliminare le -produzioni opera allora su
corpi di lunghezza al pi 2 . con un tempo di esecuzione O (ri), e genera una grammatica
di lunghezza 0(n).
Modificando cos la costruzione CNF. l'unico passo non lineare leliminazione delle
produzioni unitarie. Poich questo passo 0 ( n 2), otteniamo il seguente teorema.
Teorema 7.32 Data una grammatica G di lunghezza n, possiamo costruire in tempo
0 ( n 2) una grammatica equivalente in forma normale di Chomsky di lunghezza 0 (n 2).
7.4.3
Abbiamo gi studiato lalgoritmo per verificare se un CFL L vuoto. Data una gram
matica G per L. si applica l'algoritmo del Paragrafo 7.1.2 per stabilire se S, il simbolo
iniziale di G, generatore, cio se da S derivi almeno una stringa. L vuoto se e solo se
S non generatore.
Data la sua importanza, tratteremo in dettaglio il tempo che questo metodo richiede
per trovare tutti i simboli generatori di una grammatica G . Supponiamo che la lunghezza
di G sia ri. Il numero di variabili allora dellordine di n , e ogni passo della ricerca
induttiva di variabili generatrici pu richiedere tempo ()(n) per esaminare tutte le pro
duzioni di G. Se a ogni passo si scopre solo una nuova variabile generatrice, possono
315
A
B
?
s
_/.
/
/ /
C -**
'_c.
B
Figura 7.11 Struttura dati per la verifica in tempo lineare di linguaggio vuoto.
Si elaborano le produzioni allestendo liste di diverso tipo. Innanzitutto a ogni variabile
si associa una lista delle posizioni in cui compare. Per esempio la lista per la variabile
B indicata dagli archi a tratto continuo. Per ogni produzione si conserva il conto delle
posizioni occupate da variabili di cui non si ancora stabilito se generano stringhe termi
nali. Gli archi tratteggiati collcgano ogni produzione al rispettivo contatore. I contatori
nella Figura 7.11 indicano che non abbiamo ancora esaminato alcuna variabile, anche se
abbiamo appena stabilito chc B generatrice.
Supponiamo di avere scoperto che B generatrice. Scorriamo lelenco delle posi
zioni dei corpi che contengono B. Per ogni posizione diminuiamo di 1 il contatore della
produzione; per stabilire se la variabile di testa generatrice dobbiamo ora esaminare una
posizione in meno.
Quando un contatore raggiunge lo 0 sappiamo che la variabile di testa c generatrice.
Il puntatore indicato da una linea punteggiata conduce alla variabile, chc possiamo ora
inserire nella fila delle variabili generatrici di cui dobbiamo esaminare le conseguenze
(come abbiamo fatto per B). La fila non illustrata.
Capitolo 7
3 16
Dobbiamo dimostrare che lalgoritmo richiede tempo 0(n). Ci sono tre punti cruciali.
Poich una grammatica di dimensione n ha al massimo n variabili, la creazione e
la preparazione deHarray richiedono tempo O(n).
Poich ci sono al massimo n produzioni, e la loro lunghezza totale al massimo n,
la preparazione dei puntatori e dei contatori illustrata nella Figura 7.11 si compie
in tempo 0(n).
Il lavoro fatto quando si scopre che il contatore per una produzione 0 (tutti i
simboli nel suo corpo sono generatori) si divide in due categorie.
1. Lavoro svolto per la produzione: rilevare che il contatore 0; stabilire quale
variabile, poniamo .4, in testa; verificare se gi stata dichiarata generatri
ce e se necessario metterla in fila. Tutti questi passi costano O ( I) per ogni
produzione. Il costo totale in questa categoria O (n).
2. Lavoro svolto nellesaminare Ie posizioni nei corpi delle produzioni aventi A
in testa. Questo lavoro proporzionale al numero di posizioni per A. Il lavoro
complessivo per trattare tutti i simboli generatori quindi proporzionale alla
somma delle lunghezze dei corpi, che 0(n).
Concludiamo che il lavoro totale svolto dallalgoritmo O(n).
7.4.4
Appartenenza a un CFL
317
grammatica CNF equivalente. Poich gli alberi sintattici di una grammatica CNF sono
binari, se w lunga n, nellalbero ci sono esattamente I n 1 nodi etichettati da variabili
(la dimostrazione, induttiva, semplice e la lasciamo al lettore). Il numero di alberi ed
etichettature possibili quindi solo esponenziale in n; in linea di principio possiamo
scriverli tutti e osservare se uno di essi ha per prodotto tv.
Una tecnica molto pi efficiente si fonda sulla programmazione dinamica. Lalgo
ritmo, noto come algoritmo CYKi , parte da una grammatica CNF G = (K T, P, S ) per
un linguaggio L. Linput dellalgoritmo una stringa w = a ia 2 an in T*. In tempo
0 ( n 3) l algoritmo costruisce una tabella che dice se w in L. Si noti che, nel calcolare il
tempo d esecuzione, si considera fissata la grammatica; la sua dimensione influisce solo
per un fattore costante sul tempo, misurato rispetto alla lunghezza della stringa w di cui
si verifica lappartenenza a L.
Nell'algoritmo CYK si costruisce una tabella triangolare, come illustrato nella Fi
gura 7.12. Lasse orizzontale corrisponde alle posizioni della stringa w = a i 2 a rt,
che supponiamo lunga 5. La voce X ij della tabella l insieme delle variabili A tali chc
x I5
*25
X 13 X 24 * 3 5
X 12
*23
*34
*45
x U
X 22
*33
*44
*2
fl3
aI
3 18
Capitolo 7
1, la seconda dal basso per quelle di lunghezza 2 , e cos via, fino alla riga in alto, che
INDUZIONE Vogliamo calcolare X iJ, che si trova sulla riga j + 1, dopo aver calcolato
tutti gli X nelle righe sottostanti. Supponiamo cio di conoscere la situazione relativa a
tutte le stringhe pi corte di ^,;+1 ,, e in particolare tutti i suoi prefissi e suffissi
propri. Possiamo assumere j i > 0 perch il caso i = j forma la base; quindi sappiamo
che ogni derivazione A = oa+ 1 a deve cominciare da un passo A = TiC. Quindi
|
2. B in X ik
3. C' in X k+i,j
4. A > B C una produzione di G.
Per trovare queste variabili dobbiamo confrontare al massimo ri coppie di insiemi gi
calcolati:
X+2 ,j), e cos via, fino a (X iJ - I i X jj). Lo schema,
cio salire lungo la colonna sotto X ij e contemporaneamente scendere lungo la diagonale,
illustrato nella Figura 7.13.
Teorema 7.33 Lalgoritmo descritto calcola correttamente X ij per ogni i e j ; perci w
in L(G) se e solo se S in X i n-Il tempo desecuzione dellalgoritmo 0 ( n 3).
DIMOSTRAZIONE La ragione per cui lalgoritmo trova gli insiemi corretti di variabili
stata spiegata nella discussione sulla base e sul passo induttivo dellalgoritmo. Quanto al
tempo desecuzione, notiamo che si devono calcolare 0 (n 2) elementi, ognuno dei quali
comporta confronti e operazioni su n coppie di elementi. Va ricordato che, anche se
ogni insieme X ij pu contenere molte variabili, la grammatica G fissa e il numero
delle sue variabili non dipende da n, lunghezza della stringa ir di cui dobbiamo stabilire
319
S
A
B
C
AB I B C
BA I a
-# C C I b
-+ AB I a
-.
320
Capitolo 7
7.4.5
Nei prossimi capitoli svilupperemo una notevole teoria chc dimostra rigorosamente lesi
stenza di problemi irrisolvibili da qualsiasi algoritmo eseguito da un calcolatore. Ce ne
serviremo per presentare diverse questioni di semplice enunciazione, riguardanti gram
matiche e CFL, per le quali non disponiamo di algoritmi: li chiameremo problemi inde
cidibili. Per ora accontentiamoci di un elenco dei pi significativi problemi indecidibili
attinenti a grammatiche e linguaggi liberi dal contesto.
1. Una CFG G assegnata ambigua?
2. Un dato linguaggio CFL inerentemente ambiguo?
3. Lintersezione di due CFL dati vuota?
4. Due CFL dati sono uguali?
7.4.6
Esercizi
Esercizio 7.4.2 Con l'ausilio della tecnica descritta nel Paragrafo 7.4.3 sviluppate algo
ritmi in tempo lineare per i seguenti problemi sulle CFG.
a) Quali simboli compaiono in almeno una forma sentenziale?
b) Quali simboli sono annullabili (generano e)?
Esercizio 7.4.3 Applicate l'algoritmo CYK per stabilire quali delle stringhe che seguono
sono in L(G), dove G la grammatica dellEsempio 7.34.
* a) ababa.
b) baaab.
c) aabab.
Esercizio 7.4.4 Dimostrate che in ogni grammatica CNF tutti gli alberi sintattici di strin
ghe lunghe n hanno 2 n - 1 nodi interni (nodi etichettati da variabili).
Esercizio 7.4.5 Modificate lalgoritmo CYK in modo che calcoli il numero di alberi sin
tattici distinti per la stringa di input anzich limitarsi a stabilire se appartiene al linguag-
322
7.5
Capitolo 7
Riepilogo
Bibliograiiii
7.6
323
Bibliografia
Capitolo 8
8.1
326
Capitolo 8
8.1.1
La Figura 8.1 riproduce il primo programma in C in cui si imbatte il lettore del classico testo di Kernighan e Ritchie. E facile scoprire che il programma stampa C ia o ,
mondo e termina. Data la sua immediatezza, oggi si soliti introdurre un linguaggio di
programmazione mostrando come scrivere un programma che stampa C i a o , mondo.
m a i n ()
{
p r i n t f ( " C ia o ,
m ondo\ n") ;
327
a n * /
{
i n t a n s , j ,ans = 1 ;
f o r <j = 1 ; j< = n ;
re tu rn (a n s );
j++)
ans
*= i ;
}
m a in
()
{
i n t n, t o t a l , x, y , z;
s c a n f ( " % d", &n) ;
to ta l = 3;
w h ile ( 1 ) {
f o r ( x = l ; x < = t o t a l - 2 ; x++)
f o r ( y = l ; y < = t o t a l - x - l ; y++) {
z = to ta l - x - y ;
i f ( e x p ( x ,n ) + e x p ( y , n ) == e x p ( z , n ) )
p r i n t f ( " C ia o , m ondo\ n");
}
to ta l+ + ;
}
}
328
Capitolo 8
8.1.2
Verificatore
ciao-mondo
H
yf
X
s
no
330
Capitolo 8
C ia o , mondo comc primo output per linput I. Non appena H stampa n, sappiamo che seguir la lettera o.~ Di conseguenza possiamo modificare qualunque istruzione
p r i n t f in H che stampa n in modo che stampi invece C i a o , mondo. Un'altra istru
zione p r i n t f che stampi una o, ma non la n", viene omessa. Ne risulta che il nuovo
programma, che chiameremo H i, si comporta come Tl, tranne per il fatto chc stampa
C ia o , mondo ogni volta che H stamperebbe no. TTi rappresentato nella Figura 8.4.
s
C ia o ,
m on d o
T.
Le modifiche che dobbiamo apportare ad H] per produrre il programma Jd2 suggerito
nella Figura 8.5 sono le seguenti.
1. Per prima cosa to legge lintero input P e lo salva in un array A, allocato a tale
scopo (ad esempio tramite la funzione m a llo c ) .?
2. Poi TT2 simula TTi . ma quando ti\ legge input da P o da T. TT2 legge dalla copia
salvata in A. Per tenere traccia di quanto H x ha letto di P e di 7. TT1 pu servirsi di
due cursori che segnano le posizioni in A.
- molto probabile che il programma metta n o in ununica p r i n t f . ma potrebbe anche collocare la n in
una p r i n t f e la o in un'altra.
-*La funzione di sistema di UNIX m a lI o c alloca un blocco di memoria di dimensione specificata nella
chiamala. Si tratta di una funzione usata quando la quantit di memoria necessaria non pu essere determinata
tinche non si esegue il programma, come nel caso di lettura di un input di lunghezza arbitraria. Di norma
m a l I o c viene chiamata pi volte, a mano a mano che si legge Tinput e quindi si crea un progressivo bisogno
di spazio.
Si
Ciao,
m ondo
Figura 8.5 H 2 si comporla come H ,, ma usa il suo input P sia per P sia per T.
A questo punto possiamo dimostrare che H 2 non pu esistere. Di conseguenza non
esiste, cos come non esiste II. Il nocciolo del ragionamento consiste nellimmaginare chc
cosa fa II2 quando gli si d se stesso come input, situazione illustrata nella Figura 8 .6 .
Ricordiamo chc H 2, dato un qualunque programma P come input, produce l'output s
se P stampa C ia o , mondo quando gli viene dato se stesso come input. Inoltre I I 2
stampa C ia o , mondo se P, dato se stesso corno input, non stampa C ia o , mondo
come primo output.
SI
H
Ciao,
m o ndo
332
8.1.3
Capitolo 8
Abbiamo ora un problema - un dato programma con un dato input stampa per prima co
sa C ia o , mondo? - che sappiamo essere irrisolvibile da un computer. Un problema
che non pu essere risolto da un computer detto indecidibile. Daremo la definizione
formale del termine indecidibile nel Paragrafo 9.3; per ora ne facciamo un uso infor
male. Supponiamo di voler determinare se un qualche altro problema sia o no risolvibile
da un computer. Possiamo cercare di scrivere un programma per risolverlo, ma se non ci
riusciamo, potremmo tentare di dimostrare chc un simile programma non esiste.
Potremmo dimostrare l indecidibilit di questo nuovo problema con una tecnica si
mile a quella usata per il problema ciao-mondo: assumiamo che esista un programma in
grado di risolverlo e sviluppiamo un programma paradossale che deve fare due cose con
traddittorie. come il programma I l 2. In realt, disponendo di un problema chc sappiamo
essere indecidibile, non abbiamo pi bisogno di dimostrare lesistenza di una situazione
paradossale. Basta mostrare che se potessimo risolvere il nuovo problema, allora potrem
mo usare tale soluzione per risolvere il problema che gi sappiamo essere indecidibile.
La strategia illustrata nella Figura 8.7; la tecnica detta riduzione di P\a Po.
'1
istanza
Si
Figura 8.7 Se siamo in grado di risolvere il problema 1\, possiamo usare la soluzione per
risolvere il problema P 1.
Supponiamo di sapere che il problema P\ indecidibile, e sia P2 un nuovo problema di cui
vogliamo dimostrare lindecidibilit. Ipotizziamo che esista un programma, rappresentato
nella Figura 8.7 da un rombo etichettato decisione. U programma stampa s o n o a
seconda che listanza del problema P 2 che gli fa da input si trovi o no nel linguaggio del
problema stesso.4
Per dimostrare lindecidibilit del problema P 2 dobbiamo ideare una costruzione, rap
presentata dal quadrato nella Figura 8.7. chc converta le istanze di 1\ in istanze di P2 che
4Ricordiamo che un problema in realt un linguaggio. Quando abbiamo affrontato la questione di decidere
se un dato programma e un dato input danno comc prim o output C i a o , m o n d o , in effetti stavamo parlando
di stringhe consistenti in un programma sorgente in C seguito da un file (o pi file) di input che il programma
legge. Questo insieme di stringhe e un linguaggio sull'alfabeto di caratteri ASCII.
333
diano la stessa risposta. In altre parole qualunque stringa nel linguaggio 1\viene conver
tita in una stringa nel linguaggio P 2, e qualunque stringa sullalfabeto di I\ che non sia
nel linguaggio 1\ viene convertita in una stringa che non nel linguaggio 7. Con questa
costruzione possiamo risolvere I\ nel modo seguente.
1. Data unistanza di P 1, cio data una stringa w che pu essere o no nel linguaggio
P i, applichiamo lalgoritmo di costruzione che produce una stringa x.
2. Verifichiamo se x si trova in P 2 e diamo la stessa risposta su w e Pi.
Se w in P i, allora x in P2. Dunque lalgoritmo dice s . Se w non in P i , allora x
non in P2, e lalgoritmo dice no. Nell'uno o nellaltro caso dice comunque la verit su
w. Dato che abbiamo ipotizzato che non esista alcun algoritmo che decide lappartenenza
di una stringa a Pi, abbiamo una dimostrazione per assurdo che lalgoritmo di decisione
ipotizzato per P2 non esiste; ossia P 2 indecidibile.
Capitolo 8
334
Esempio 8.1 Applichiamo questo metodo per mostrare chc la questione il programma
Q con input y chiama la funzione f o o? indecidibile. Notiamo che Q pu non avere
la funzione f oo, nel qual caso il problema semplice; i casi critici si hanno quando Q
ha una funzione f oo, ma con input y pu raggiungere o no una chiamata a f oo. Poich
conosciamo un solo problema indecidibilc, il ruolo di Pi nella Figura 8.7 sar affidato al
problema ciao-mondo. P2 sar il problema della chiamata appena descritto. Supponiamo
che esista un programma che risolve questo problema. Il nostro compilo consiste nel
definire un algoritmo che converta il problema ciao-mondo nel problema della chiamata.
In altre parole, dato un programma Q e il suo input y, dobbiamo costruire un pro
gramma R e un input 2 tali che R, con input 2 , chiami f 0 0 se e solo se Q con input y
stampa C i a o , mondo. La costruzione non c difficoltosa.
1. Se Q ha una funzione chiamata fo o , ne cambiamo il nome insieme con tutte le
chiamate a tale funzione. Ovviamente il nuovo programma Q i fa esattamente ci
che fa Q.
2. Aggiungiamo a Q i una funzione fo o . Tale funzione non fa niente e non viene mai
chiamata. Il programma che ne risulta Q 23. Modifichiamo Q 2 in modo tale che ricordi i primi 1 1 caratteri che stampa e li salvi
in un array globale A. Sia Q 3 il programma risultante.
4. Modifichiamo Q in modo che quando esegue unistruzione di output controlli !'ar
ray A per vedere se ha scritto 11 o pi caratteri e, in tal caso, se i primi 11 sono
proprio C ia o , m ondo. Se cos, il nuovo programma chiama la funzione ag
giunta al passo (2), denominata fo o . Il programma risultante R e l'input
uguale a y.
8.1.4
Esercizi
Esercizio 8.1.1 Definite riduzioni dal problema ciao-mondo a ognuno dei problemi elen
cali. Usate lo siile informale di questo paragrafo per descrivere trasformazioni di pro
gramma plausibili e non tenete conto dei limiti reali imposti dai computer concreti, come
la dimensione massima di un file oppure la capacit della memoria.
*! a) Dati un programma e un input, il programma termina (cio non entra in un ciclo
infinito)?
b) Dati un programma e un input, il programma produce un output?
! c) Dati due programmi e un input, i programmi producono lo stesso output per l'input
dato?
8.2
La macchina di Turing
336
Capitolo 8
ma non si pu adattare con facilit a problemi di altro genere. Per esempio sarebbe molto
difficile ridurre il problema ciao-mondo alla questione sullambiguit di una grammatica.
Ne segue che bisogna ricostruire la teoria dellindecidibilit fondandosi non su pro
grammi in C o in altri linguaggi, bens su un modello molto semplice di computer, chia
mato macchina di Turing. In sostanza si tratta di un automa a stati finiti con un nastro di
lunghezza infinita su cui pu leggere o scrivere dati. Rispetto ai programmi, la macchina
di Turing, come modello di ci che pu essere computato, ha il vantaggio della sempli
cit perch possibile rappresentarne precisamente la configurazione ricorrendo a una
notazione simile alle ID di un PDA. Anche un programma C ha uno stato, formato dalle
variabili relative alle funzioni chc sono state chiamate in sequenza, ma la notazione per
descriverlo di gran lunga troppo complessa per poterla usare in dimostrazioni formali.
Con la notazione delle macchine di Turing dimostreremo che certi problemi, apparen
temente distanti dalla programmazione tradizionale, sono indecidibili. Per esempio nel
Paragrafo 9.4 mostreremo che il Problema della Corrispondenza di Post, una semplice
questione che concerne due sequenze di stringhe, indecidibile; questo problema per
mette di dimostrare facilmente l indecidibilit di questioni riguardanti le grammatiche,
per esempio !ambiguit. In modo analogo, quando presenteremo i problemi intrattabili,
vedremo che alcune questioni apparentemente lontane dalla computazione (per esempio
la soddislacibilit di formule booleane) sono intrattabili.
8.2.1
Agli inizi del '900 il matematico D. Hilbert si chiese se fosse possibile trovare un algo
ritmo in grado di stabilire la verit o la falsit di qualsiasi proposizione matematica. In
particolare si domand se esistesse un modo per determinare la veridicit di una formu
la del calcolo dei predicati del primo ordine applicata agli interi. Poich il calcolo dei
predicati del primo ordine per gli interi sufficientemente potente da esprimere enunciati
come la tal grammatica ambigua oppure il tal programma stampa C i a o , m ondo,
se Hilbert avesse avuto successo questi problemi avrebbero gli algoritmi che ora sappiamo
non esistono.
Nel 1931 K. Godei pubblic il suo famoso teorema di incompletezza. Egli defin una
formula nel calcolo dei predicati applicata agli interi secondo la quale la formula stessa
non poteva essere n dimostrata nc confutata alPinterno del calcolo dei predicati. La tec
nica di Godei somiglia alla costruzione del programma autocontraddittorio JJ2 presentata
nel Paragrafo 8 .1.2, ma tratta funzioni sugli interi anzich programmi C.
Il
calcolo dei predicati non era lunica nozione a disposizione dei matematici come
modello di computazione universale. In effetti il calcolo dei predicati, essendo dichiara
tivo piuttosto che computazionale, doveva competere con una serie di notazioni, incluse
le funzioni ricorsive parziali (una notazione simile ai linguaggi di programmazione) e
con altre notazioni analoghe. Nel 1936 A.M. Turing propose la macchina di Turing come
8.2.2
X I.
X /I B
L'input, una stringa di lunghezza finita formata da simboli scelti dall'alfabeto di input,
viene inizialmente posto sul nastro. Tutte le altre celle, che si estendono senza limiti a
sinistra e a destra, contengono allinizio un simbolo speciale, detto blank. Il blank un
simbolo di nastro, ma non di input; oltre ai simboli di input e al blank, ci possono essere
anche altri simboli di nastro.
Una testina mobile collocata su una delle celle del nastro. Diremo chc la macchina
di Turing guarda quella cella. A llinizio la testina si trova sulla cella pi a sinistra rispetto
a quelle che contengono linput.
338
Capitolo 8
Una mossa della macchina di Turing una funzione dello stato del controllo e del
simbolo di nastro guardato dalla testina. In una mossa la macchina di Turing compie tre
azioni.
1. Cambia stato. Lo stato successivo pu coincidere con lo stato corrente.
2. Scrive un simbolo di nastro nella cella che guarda. Questo simbolo sostituisce
quello che si trovava in precedenza nella cella. Il nuovo simbolo pu essere lo
stesso chc si trova gi nella cella.
3. Muove la testina verso sinistra oppure verso destra. Nel nostro formalismo richie
diamo un movimento: la testina non pu rimanere ferma. Si tratta di una limitazio
ne che non incide sulla capacit computazionale della macchina, dato che qualsiasi
sequenza di mosse con testina fssa si pu riassumere, insieme con la mossa succes
siva della testina, in un cambio di stato, un nuovo simbolo di nastro c un movimento
a sinistra o a destra.
La notazione formale che useremo per una macchina di Turing (TM, luring Machine)
simile a quella usata per gli automi a stati finiti o PDA. Descriviamo una TM come la
settupla
M = (Q, , F.<).
7?, F)
i cui componenti hanno i seguenti significati.
8.2.3
Per descrivere formalmente che cosa fa una macchina di Turing dobbiamo sviluppare una
notazione per le configurazioni o descrizioni istantanee (ID. Instantaneous Descriptions),
come quella sviluppata per i PDA. Poich in linea di principio una TIVl ha un nastro
infinitamente lungo, potremmo pensare chc sia impossibile descrivere in termini concisi
le sue configurazioni. In realt, dopo un numero finito di mosse, la TM pu aver visitato
solo un numero finito di celle, anche se il numero di celle visitate pu crescere oltre
qualunque limite finito. Perci in ogni ID esistono un prefisso c un suffisso infiniti di celle
che non sono mai state visitate. Tutte queste celle devono contenere un blank oppure uno
dei simboli di input, chc sono in numero finito. In una ID mostriamo dunque solo le celle
tra il simbolo diverso dal blank pi a sinistra e quello pi a destra. In casi particolari,
quando la testina guarda uno dei blank in testa o in coda, anche un numero finito di blank,
a sinistra o a destra della porzione non bianca del nastro devessere incluso nella ID.
Oltre al nastro dobbiamo rappresentare anche il controllo e la posizione della testina.
A tal fine incorporiamo lo stato nel nastro e lo poniamo immediatamente a sinistra della
cella guardata. Per eliminare ogni ambiguit nella stringa composta da nastro e stato,
dobbiamo assicurarci di non usare come stalo un simbolo che sia anche un simbolo di
nastro. In ogni caso, dal momento che l'operazione della TM non dipende dai nomi degli
stati, facile cambiarli in modo chc non abbiano nulla in comune con i simboli di nastro.
Useremo dunque la stringa X i X 2 X.-iqXiX+\ X n per rappresentare una ID in
cui:
1. q lo stato della macchina di Turing
2 . la testina guarda !-esimo simbolo da sinistra
3. X 1Xo X n la porzione del nastro tra il simbolo diverso dal blank pi a sinistra
e quello pi a destra. Eccezionalmente, se la testina a sinistra del simbolo diverso
dal blank pi a sinistra o a destra di quello pi a destra, allora un prefisso o suffisso
di X i A 2 X n sar costituito da blank, c i sar rispettivamente 1 o n.
Descriviamo le mosse di una macchina di Turing M = (Q ^ ,T ,S .q o ,B ,F ) mediante
la notazione I- . gi usata per i PDA. Quando la TM M implicita usiamo solo I- per
A1
denotare le mosse. Come al solito F , o solo l- , indica zero, una, o pi mosse della TM
M.
Supponiamo che S(q. X i) = (p. Y. L). cio la prossima mossa c verso sinistra. Allora
A 1X 2 X i -IqXiX i^ X n h A 1A 2 X l^ p X , -}Y X i+1 A n
M
La notazione riflette il passaggio allo stato p e il fatto che ora la testina si trova sulla cella
i I. Ci sono due eccezioni importanti.
340
Capitolo 8
q X i ^ 2 Xn IM
X 2 Xn
XyX> X ri- i q X n
Supponiamo ora che
X 1 X 2 X n-2pXn - 1
X 1 X 2 X ^ 1gX.X i+i . X n h X 1X 2 X u i Y p X u i X fl
M
La notazione riflette il fatto che la testina si mossa verso la cella i + 1. Ancora una volta
ci sono due eccezioni importanti.
1. Se i = n, allora la cella i 4 -1-esima contiene un blank e non faceva parte della ID
precedente. Abbiamo perci
X 1 X 2 X n- IflX n H X 1X 2 X n-yYpB
|V
Esempio 8.2 Definiamo una macchina di Turing e vediamo come si comporta su un input
tipico. La TM che costruiamo accetta il linguaggio {0n l n |ri > 1}. Inizialmente alla
macchina viene data sul nastro una sequenza finita di 0 e 1, preceduta e seguita da blank.
La TM cambia in modo alternato uno 0 in X e un I in Y finch tutti gli 0 e gli 1 sono
abbinati.
Pi precisamente, partendo dall'estremit sinistra dell'input, cambia uno 0 in X e si
muove verso destra su tutti gli O e Y che vede finch arriva a un 1. Cambia I l in Y
e si muove verso sinistra, sulle Y e gli 0, finch trova una X . A questo punto cerca
uno 0 immediatamente a destra; se ne trova uno, lo cambia in X e ripete il processo,
trasformando un 1 corrispondente in Y .
Se linput costituito dai caratteri diversi dal blank non si trova in ( , la TM prima
o poi non ha una mossa successiva e termina senza accettare. Se invece conclude la
trasformazione di tutti gli 0 in X nello stesso giro in cui cambia lultimo I in Y , allora ha
stabilito che l input della forma On I n e accetta. La specifica formale della TM M
Stato
<7o
(<Z1, X . R)
(fI i , 0, R)
(q-2, 0, L)
Qi
<12
<13
4
(<h,Y,L)
-
Simbolo
A
(qc,X ,R )
(q^ y .R )
(q i,Y ,R )
(Q2,Y,L)
(q-^YR)
( 4 , D , R)
Figura 8.9 Una macchina di Turing che accetta (Or' I " |n > 1}.
342
Capitolo 8
QoOOll h X y 1O li h XOg1I l h Xq2OYl h q2X 0 Y l h
X g 0O n H X X f l 1F l l X X F y 1I I- X X q 2Y Y I- X q2X Y Y l
X X q 0Y Y l X X Y q z Y h X X Y Y q tB I- X X Y Y B q 4B
Come secondo esempio consideriamo che cosa fa M sull'input 0010, che non si trova
nel linguaggio accettato.
(,0010 h Xr7l 010 H XOrjTi 10 h X y 2OFO h A2XOFO l
X y 0OFO l X X y 1FO l X X F y 1O l X X F O y 1B
Il comportamento di M su 0010 simile a quello su 0011 finche' nella ID X X F y 1O M
guarda l ultimo 0 per la prima volta. M deve prima muoversi verso destra restando nello
stato yi, che la pona alla ID ArX F O y 1I?. Ma nello stato A1 M non ha mosse sul simbolo
di nastro B: di conseguenza M muore e non accetta linput.
8.2.4
Esempio 8.4 Menue oggi pi comodo pensare alle macchine di Turing come a dispo
sitivi per riconoscere linguaggi o, il che equivalente, per risolvere problemi, in origine
Turing considerava la sua macchina come un calcolatore di funzioni a valori interi. Nel
suo schema gli interi erano rappresentati in codice unario, come blocchi di un singolo ca
rattere, e la macchina computava cambiando le lunghezze dei blocchi o costruendo nuovi
blocchi altrove sul nastro. In questo semplice esempio mostreremo come una macchina
di Turing pu calcolare la funzione , detta rnonus o sottrazione propria c definita da
ni n = m a x (m n. 0). In altre parole rn n rn n se rn > ri e 0 se rn < n.
Y/ Y ^
Figura 8.10 Diagramma di transizione per una TM chc accetta stringhe della forma On 1n.
344
Capitolo 8
2. Cominciando il ciclo, M non riesce a trovare uno 0 da mutare in un blank, dato che
i primi m 0 sono gi stati trasformati in B. Allora n > m, e dunque m n = 0.
M sostituisce tutti gli I e 0 residui con B e finisce con un nastro completamente
vuoto.
La Figura 8 . 11 fornisce le regole della funzione di transizione , di cui abbiamo la rappre
sentazione grafica come diagramma di transizione nella Figura 8 .12. Ecco un compendio
del ruolo svolto da ognuno dei sette stati.
q-2 \M si muove verso destra saltando gli 1 finch non trova uno 0, che trasforma in
1, per poi volgersi a sinistra ed entrare nello stato q. anche possibile che non
ci siano 0 dopo il blocco di 1. In tal caso M trova un blank nello stato q2. Siamo
nel caso ( 1 ) descritto sopra: n simboli 0 nel secondo blocco sono stati usati per
cancellare n degli m simboli 0 nel primo blocco, c la sottrazione completa. M
entra nello stato 4 , il cui scopo convertire gli 1 sul nastro in blank.
q: M si muove verso sinistra saltando gli 0 e gli 1 finch trova un blank. Quando trova
B si muove verso destra e ritorna nello stato <70, dando nuovamente avvio al ciclo.
q4\qui la sottrazione completa, ma uno 0 non appaiato nel primo blocco stato
trasformato erroneamente in un B. M si muove dunque verso sinistra trasformando
gli I in B finch si imbatte in un B sul nastro. Ritrasforma il B in 0 ed entra nello
stato <76, dove si arresta.
q$: si entra nello stato 55 a partire da qo quando tutti gli 0 del primo blocco sono stati
trasformati in B. In questo caso, descritto in (2), il risultato della sottrazione 0.
M trasforma tutti gli 0 e gli 1 residui in B ed entra nello stato q
qcy: lunico scopo di questo stato permettere a M di arrestarsi quando ha finito il suo
lavoro. Se la sottrazione fosse stata una subroutine di una funzione pi complessa,
allora q$ avrebbe iniziato il passo successivo della computazione pi ampia.
La macchina di Turing
345
Simbolo
Stato
Qo
Qi
Q-2
<73
4
Qr,
Qc,
(q.B , l)
{q\, 0, R)
[q-,h L )
(/3:0, L)
(4,0, L)
[Q-B.R)
(q ^ B ,L )
(qr>,B,R)
(to, B ,Jl)
( f c ,l, )
( 0 2 , 1 , )
( i, l , )
(q4,B ,L )
(Qo- Ti, R)
(6,0,7?,)
Figura 8.11 Una macchina di Turing che calcola la funzione di sottrazione propria.
BI B
1/ 1
I / B
I / B
Capilolo 8
346
8.2.5
Abbiamo descritto in termini intuitivi il modo in cui una macchina di Turing accetta un
linguaggio. La stringa di input viene posta sul nastro e la testina parte dal simbolo di input
pi a sinistra. Se la TM entra in uno stato accettante, allora linput accettalo, altrimenti
no.
In termini formali, sia M = (Q, , . 6.
B ,F ) una macchina di Turing. Allora
I
8.2.6
8.2.7
Esercizi
Esercizio 8.2.1 Scrivete le ID della macchina di Turing della Figura 8.9 quando il nastro
di input contiene:
* a) 0 0
b) 0001 1 1
c) 00111.
! Eserczio 8.2.2 Definite una macchina di Turing per ognuno dei seguenti linguaggi.
* a) Linsieme delle stringhe con un numero uguale di 0 e di 1.
b) {<inbncn | n > 1 }.
c) {wwn I w una qualunque stringa di 0 e 1 }.
Esercizio 8.2.3 Definite una macchina di Turing che prenda come input un numero A7 e
vi aggiunga 1 in binario. Per la precisione il nastro contiene inizialmente un $ seguito da
N in binario. All'inizio la testina guarda il $ nello stalo qo. La TM dovrebbe arrestarsi
348
Capitolo 8
con N +1, in binario, sul nastro, guardando il simbolo pi a sinistra di N + I, nello stato
<7/. Se necessario potete cancellare il $ nel corso del calcolo. Per esempio e/oSlOOll r
$ (//1 0 1 0 0 e <7o$11 111 / 1 0 0 0 0 0 .
(qo,B,R), 5(flo,l) =
(/,?, Tl).
8.3
Vogliamo ora chiarire come si pu usare una macchina di Turing per calcolare in modo
simile a un calcolatore convenzionale. Lobiettivo e convincere il lettore che una TM
ha la stessa capacit di un tipico calcolatore. In particolare vedremo che la macchina di
Turing in grado di svolgere elaborazioni su altre macchine di Turing in modo analogo
al programma del Paragrafo 8.1.2, che esamina altri programmi. Proprio questa capacit
introspettiva delle macchine di Turing e dei programmi ci permette di dimostrare che
certi problemi sono indecidibili.
Per chiarire le possibilit di una TM, presenteremo esempi di interpretazioni del na
stro c del controllo finito. Questi espedienti non estendono il modello fondamentale, ma
rendono pi comoda la notazione. In seguito ce ne serviremo per simulare modelli estesi
di macchina di Turing con nuove caratteristiche - per esempio pi di un nastro - tramite
il modello fondamentale.
8.3.1
Il controllo pu servire non solo a rappresentare una posizione nel programma di una
macchina di Turing, ma anche a conservare una quantit finita di dati. Questa tecnica
illustrata, insieme con il concetto di tracce multiple, nella Figura 8.13. Il controllo non
consiste unicamente nello stato vero c proprio, , ma anche in tre dati: A, B e C . Non
sono richieste espansioni al modello; sufficiente considerare lo stato come una ennupla.
Nel caso della Figura 8.13 lo stato [q,A, B .C ]. Possiamo cos descrivere le transizioni
in modo pi sistematico, esplicitando chiaramente la strategia del programma.
Esempio 8 .6 Definiamo una TM
350
Capitolo 8
Figura 8.13 Una macchina di Turing con memoria nel controllo e tracce multiple.
regolare come questo non sfrutta a fondo le capacit delle macchine di Turing, ma serve
da esempio.
L insieme degli stati Q {qo, q i } x (0. L B). Ogni stato c composto di due parti.
a) Una parte di controllo, q0 o </i, che indica che cosa sta facendo la TM. Lo stato
di controllo q0 indica che M non ha ancora letto il primo simbolo; <71 indica che
l ha letto e sta verificando, spostandosi verso destra fino a una cella vuota, che quel
simbolo non ricompaia altrove.
b) Un dato che ricorda il primo simbolo letto, O o L Un simbolo B in questa compo
nente significa che non stato letto nessun simbolo.
Definiamo la funzione di transizione 6 per M .
1. ([(/eh B], a) = ([r/i. a], a, R ) pera = O o a = I . A llinizio q0 lo stato di controllo
e B il valore della porzione di dato. Il simbolo letto viene copiato nella seconda
componente dello stato, ed M si muove a destra entrando allo stesso tempo nello
stato <71.
2.
8.3.2
Tracce multiple
A volte utile considerare il nastro di una macchina di Turing come se avesse pi trac
ce. Ogni traccia pu ospitare un simbolo, e quindi l'alfabeto di nastro della TM consiste
in cnnuple, con una componente per ogni traccia. A titolo di esempio, la cella guardata
dalla testina nella Figura 8.13 contiene il simbolo [,.], Anche limpiego di trac
ce multiple, come la memoria nel controllo, non estende le capacit delle macchine di
Turing. Si tratta soltanto di un modo per strutturare i simboli di nastro.
Esempio 8.7 Un impiego comune delle tracce multiple di destinarne una ai dati e una
seconda a opportuni segnali. Possiamo spuntare i simboli a mano a mano che li usia
mo o marcare certe posizioni con un segnale. Negli Esempi 8.2 e 8.4 ci siamo valsi
di questa tecnica, pur senza considerare esplicitamente il nastro come diviso in tracce. In
questo esempio ci serviamo di una seconda traccia esplicita per riconoscere un linguaggio
non libero dal contesto:
Capitolo 8
la funzione di transizione definita dalle regole seguenti, in cui a e b possono
valere 0 1 .
1 . '([<3, ], [B, a]) = ([2 -], K a], R) Nello stato iniziale M legge il simbolo
a (che vale O o 1), lo depone nel controllo, va nello stato di controllo q-,
vistati.
7. ([(/4 , B\, [B, <;]) = ([qs,B\,[B,c],L). Quando incontra il simbolo c, M va
nello stato <75 e prosegue verso sinistra. Nello stato <75, M deve prendere una
decisione, a seconda chc il simbolo immediatamente a sinistra di c sia o no
vistato. Se vistato, M ha gi esaminato lintero primo blocco di O e 1, quello
a sinistra di c. Deve allora accertarsi che anche tutti gli O c gli 1 a destra di c
siano vistati e, in tal caso, accettare. Se il simbolo immediatamente a sinistra
di c non vistato, M trova il simbolo non vistato pi a sinistra, lo memorizza
e ricomincia il ciclo avviato in q\.
8 . ([</5 , ?], [,]) = ([<76, B\, [B, a], L). Questadiramazionecopreilcasoin
oltrepassan
14. ([q$, B\, [B , B]) = ([<79, B], [B . B], 11). Se raggiunge una cella vuota nello
stato q& senza incontrare alcuno 0 1 non vistato. Al accetta. Sc invece
incontra uno 0 o un 1 non vistato, i blocchi prima e dopo c non coincidono:
Al si arresta senza accettare.
8.3.3
Subroutine
Come per i programmi in genere, conviene pensare che una macchina di Turing sia un
insieme di parti, o subroutine, che interagiscono. Una subroutine di una macchina di
Turing un insieme di stati che eseguono una procedura. In questo insieme distinguiamo
uno stato iniziale e uno stato temporaneamente senza mosse, che serve da stato di "ri
torno per passare il controllo a un altro insieme, quello che ha chiamato la subroutine.
Parliamo di chiamata a una subroutine quando c una transizione al suo stato inizia
le. Poich la TM non ha modo di ricordare un indirizzo di ritorno, cio lo stato in cui
andare al termine di una subroutine, se vogliamo chiamare una subroutine da stali diversi
dobbiamo fame pi copie, con un nuovo insieme di stati per ciascuna. Le chiamate por
tano agli stati iniziali di copie diverse della subroutine; ogni copia ritorna a uno stato
diverso.
Esempio 8 .8 Definiamo una TM che realizzi la funzione moltiplicazione. La TM co
mincer con Om IOn I sul nastro e terminer con 0 . La strategia risolutiva si articola in
quattro punti.
1. Il nastro ospita, in generale, una stringa non vuota della forma Ot IOwIOfcn per un
certo k.
2. In un passo elementare cambiamo in B uno 0 del primo gruppo e aggiungiamo n
volte 0 allultimo gruppo, produccndo una stringa della forma 0 t _ 110 " 1 0 ^fc+1^n.
3. Lesito di copiare in coda il gruppo di n simboli 0 per m volte, una per ogni
trasformazione di 0 in B nel primo gruppo. Quando il primo gruppo di 0 c stato
interamente trasformato in blank, nellultimo gruppo ci sono mn simboli 0 .
354
Capitolo 8
8.3.4
Esercizi
l/l
0/0
0/0
356
8.4
Capitolo 8
8.4.1
Una TM multinastro si presenta come suggerito dalla Figura 8.16: ha un controllo finito
e un numero finito di nastri. Ogni nastro diviso in celle, e ogni cella pu contenere
un simbolo dellalfabeto, finito, di nastro. Comc per la TM mononastro, l insieme dei
simboli di nastro comprende un blank e ha un sottoinsieme, i simboli detti di input, che
non contiene il blank. L'insieme degli stati comprende uno stato iniziale e un insieme di
stati accettanti. Inizialmente valgono queste condizioni.
1. L'input, una sequenza finita di simboli di input, si trova sul primo nastro.
2. Tutte Ic altre celle di ogni nastro contengono un blank.
3. Il controllo si trova nello stato iniziale.
4. La testina del primo nastro allestremo sinistro dellinput.
5. Le altre testine si trovano su celle arbitrarie. Poich i nastri, eccetto il primo, so
no bianchi, la posizione iniziale delle loro testine irrilevante: tutte Ic celle sono
equivalenti.
Una mossa di una TM multinastro dipende dallo stato e dai simboli letti da ciascuna
testina. In una mossa la macchina compie tre operazioni.
1. Il controllo entra in un nuovo stato, che pu coincidere con quello corrente.
2. Su ogni cella guardata da una testina viene scritto un nuovo simbolo di nastro, che
pu essere quello gi contenuto nella cella.
3. Ogni testina si muove a sinistra o a destra, oppure sta ferma. 1 movimenti sono
indipendenti: testine diverse si possono muovere in direzioni diverse o star ferme.
Non daremo la definizione formale delle regole di transizione, che sono una generalizza
zione immediata di quelle per le TM mononastro, tranne che per la direzione, che qui
indicata dai simboli L (sinistra), R (destra) ed S (ferma). Nella macchina mononastro che
abbiamo definito la testina non pu stare ferma: manca quindi il simbolo S. Lasciamo al
lettore il compito di escogitare una notazione formale appropriata per le descrizioni istan
tanee della confgurazionc di una TM multinastro. Le macchine di Turing multinastro
accettano entrando in uno stato accettante come quelle mononastro.
8.4.2
L un linguaggio
accettato da una TM con k nastri, M . Simuliamo M con una TM mononastro Ar, il cui
358
Capitolo 8
nastro diviso in 2 k tracce. Met delle tracce replicano i nastri di M ; ognuna delle restanti
ospita un marcatore chc indica la posizione corrente della testina del corrispondente nastro
di Al. Nella Figura 8.17 ipotizziamo k = 2. La seconda e la quarta traccia replicano il
contenuto del primo c del secondo nastro di Al ; la traccia 1 reca la posizione della testina
del nastro 1; la traccia 3 la posizione della testina del secondo nastro.
F ig u ra 8.17 Simulazione di una macchina di Turing con due nastri per m ezzo di una
macchina di Turing mononastro.
Per simulare una mossa di M , la testina di N deve visitare i k marcatori. Per non smarrirsi,
iV deve tener conto di quanti marcatori stanno alla sua sinistra in ogni istante; il contatore
conservato com e componente del controllo di . Dopo aver visitato ogni marcatore e
memorizzato, in una componente del controllo, il simbolo nella cella corrispondente, N
sa quali simboli di nastro sono guardati dalle testine di Al. Inoltre N conosce lo stato di
Ai, memorizzato nel suo controllo. Perci Ar pu stabilire la mossa successiva di M .
Ora N rivisita ogni marcatore, modifica il simbolo sulla traccia che rappresenta il
nastro corrispondente di M e sposta, se richiesto, ciascun marcatore a destra o a sinistra.
Infine cambia lo stato di M registrato nel suo controllo. A questo punto N ha simulato
una mossa di Al.
Gli stali accettanti di N sono quelli in cui registrato uno stato accettante di Al. In
questo modo N accetta quando, e solo quando, Al accetta.
359
8.4.3
360
Capitolo 8
stimare solo a meno di un polinomio. Perci nel valutare il tempo necessario per
risolvere un problema non fondamentale distinguere fra una TM mononastro o
una multinastro.
Quindi il numero di mosse che N deve fare per simulare una delle prime n mosse non
supera An 4- 2 k. Poich k una costante, indipendente dal numero di mosse simulate,
questo numero 0 (n ). La simulazione di n mosse richiede non pi di n volte quella
quantit, cio 0 ( n 2).
8.4.4
dove A: c un intero linito. A ogni passo una NTM sceglie una delle triple come mossa.
Non pu per scegliere lo stato da una tripla, il simbolo di nastro da u n altra e la direzione
da una terza.
Il linguaggio accettato da una NTM M definito in m odo analogo ad altri modelli
non deterministici gi trattati, come gli NFA e i PDA: M accetta un input w se c una
sequenza di scelte che conduce dalla ID iniziale con w comc input a una ID con stato
accettante. Come per gli NFA e i PDA, lesistenza di scelte alternative che non portano a
uno stato accettante irrilevante.
Le NTM non accettano linguaggi che non siano accettati anche da TM determ inisti
che (o DTM. se intendiamo sottolinearne il carattere deterministico). La dimostrazione
consiste nel costruire, per ogni NTM M n , una DTM M o che esam ina le ID raggiungibili
da M n per tutte le scelte possibili. Se M d ne trova una con stato accettante, entra in uno
361
dei propri stati accettanti. M d deve procedere sistem aticam ente, collocando Ic nuove ID
in una coda anzich in uno stack, in modo da simulare in un tempo finito tutte le sequenze
di k mosse di M.\, per k = 1,2,
Teorema 8.11 Se M \< una macchina di Turing non determ inistica, esiste una m acchina
di Turing determ inistica M d tale che L ( M v ) = L ( M d ) .
DIMOSTRAZIONE Costruiam o M d com e TM multinastro, secondo lo schema della Figu
ra 8.18. Il primo nastro di M d contiene una sequenza di ID di M,\ chc com prendono lo
stato di Mm- Una ID di / contrassegnata come corrente, nel senso che le sue ID
successive sono in corso di elaborazione. Nella Figura 8 .18 la terza ID m arcata da un x
e dal separatore di ID, *. Tutte le ID a sinistra della ID corrente sono gi state elaborate e
si possono ignorare.
ausiliario
1. Esam ina lo stato e il sim bolo guardato della ID corrente. Nel controllo di M d sono
incorporate le scelte di mossa di Mjv per ogni stato e simbolo. Se lo stato nella ID
corrente accettante, M d accetta e smette di simulare /,.
2. Se lo stato non accettante, e la com binazione stato-sim bolo permette k mosse,
M d copia la ID sul secondo nastro e fa k copie della ID in coda alla sequenza di
ID sul nastro 1.
3. M d modifica ognuna delle k ID secondo una delle k scelte di mossa chc /. pu
fare dalla ID corrente.
362
Capitolo 8
lo sposta alla successiva ID a destra. Tl ciclo ricom incia dal passo (1).
La fedelt della simulazione dovrebbe essere evidente: M p accetta solo se scopre chc
M n pu raggiungere una ID accettante. Dobbiamo per essere certi che se M n entra
in una ID accettante dopo una sequenza di n mosse, quella ID diventa prima o poi la ID
corrente di M d , che quindi accetta.
Sia il massimo numero di scelte di M n nelle sue configurazioni. Allora in M n
ci sono una ID iniziale, non pi di rn ID raggiungibili in una mossa, non pi di rn2 ID
raggiungibili in due mosse, e cos via. Dopo ri mosse, M n pu aver raggiunto al massimo
I -I- rn + m 2 + ----- h m n ID. Questo numero non supera n m n.
M o esplora le ID di M n nell'ordine detto in ampiezza : prima tutte le ID raggiun
gibili in 0 mosse (la ID iniziale), poi quelle raggiungibili in una mossa, poi quelle in due
mosse, c cos via. In particolare M L) fa diventare corrente, esaminandone le successive,
ogni ID raggiungibile in non pi di n mosse prima di elaborarne una raggiungibile in pi
di n mosse.
Di conseguenza la ID accettante di M n viene considerata da M o fra le prime m n " .
A noi imporla solo che M o elabori questa ID dopo un tempo finito; il limite che abbiamo
stabilito garantisce che prima o poi quella ID sar elaborata. Perci se M n accetta, accetta
anche . Poich abbiamo gi notato che M o accetta solo sc M n accetta, concludiamo
che L ( M n ) = L ( M d ).
Si osservi che la TM deterministica cos costruita pu impiegare un tempo esponen
zialmente pi alto della TM non deterministica. Non sappiamo se questo rallentamento
esponenziale sia inevitabile. Il Capitolo 10 c dedicato proprio a questo problema c alle
conseguenze delleventuale scoperta di una simulazione pi efficiente.
8.4.5
Esercizi
Qo
Qi
<72
{(<?o,l, R)}
{(<7i,0, R), (</o,0. L)}
0
{ (9 i,0 , /?)}
{( 1, 1. R), (0, L I ) }
0
{(</2 <B,R)}
0
363
* a) Ol
b) Oli.
Esercizio 8.4.3 Per ognuno dei seguenti linguaggi definite, informalmente ma chiara
mente, una macchina di Turing non deterministica, eventualm ente multinastro, chc lo
riconosca. Cercate di utilizzare il non determ inism o per evitare le iterazioni e rispar
miare tempo (nel senso non determ inistico). In altre parole ideate una NTM con tante
diram azioni brevi.
* a) Il linguaggio di tutte le stringhe di 0 e 1 contenenti una stringa di lunghezza 100,
ripetuta, anche non consecutivam ente. Formalmente questo linguaggio l'insiem e
delle stringhe di 0 e I della forma w xyxz , con |z | = 100 e ?/;, y c z di lunghezza
arbitraria.
b) Il linguaggio di tutte le stringhe della forma W i
# 'n , per ogni n, tali che
ogni Wi una stringa di 0 e L e per qualche j, Wj l intero j in binario.
c) Il linguaggio di tutte le stringhe della stessa forma di (b), ma tali che, per alm eno
due valori di j, Wj uguale a j in binario.
Esercizio 8.4.4 Considerate la m acchina di Turing non determ inistica
Esercizio 8.4.5 Considerate una TM non determ inistica con nastro infinito in ambedue le
direzioni. In un dato istante il nastro com pletam ente bianco, tranne per una cella, che
contiene il simbolo $. La testina guarda una cella bianca e lo stato q.
a) Scrivete le transizioni che fanno entrare la NTM nello stato p mentre guarda il $.
! b) Supponete ora che la TM sia determ inistica. Come fare per farle trovate il $ ed
entrare in pi
Esercizio 8.4.6 Definite la m acchina di Turing a due nastri descritta sotto, che accetta il
linguaggio delle stringhe di 0 e I con lo stesso num ero dei due simboli. Il primo nastro
contiene l input cd percorso da sinistra a destra. Il secondo contiene gli 0 o gli 1 in
eccesso nella porzione di input gi letta. Specificate gli stati e le transizioni, e lo scopo di
ogni stato.
364
Capitolo 8
Esercizio 8.4.7 In questi esercizi realizziamo uno stack mediante una speciale TM a tre
nastri.
1. Il primo nastro serve solo a conservare c leggere l'input. Lalfabeto di input
formato dal simbolo
che interpretiamo comc togli dallo stack, e dai simboli a
e b. chc interpretiamo come metti a (o b) nello stack.
2. Il secondo nastro rappresenta lo stack.
3. Il terzo nastro il nastro di output. Ogni simbolo tolto dallo stack devessere scritto
sul nastro di output, in coda a quelli scritti in precedenza.
La macchina deve partire con lo stack vuoto c compiere la sequenza di operazioni togli
e "m etti specificata in input, leggendo da sinistra a destra. Se linput chiede di togliere
da uno stack vuoto, la TM deve arrestarsi in uno stato di errore qe. Se lintero input lascia
lo stack vuoto, la TM lo accetta entrando nello stato finale q. Descrivete, informalmente
ma chiaramente, la funzione di transizione della TM. Dichiarate lo scopo di ogni stato.
Esercizio 8.4.8 Nella Figura 8.17 abbiamo visto un esempio della simulazione generica
di una TM a k nastri da parte di una TM mononastro.
* a) Supponete di usare quella tecnica per simulare una TM a cinque nastri con alfabeto
di nastro di sette simboli. Quanti simboli di nastro ha la TM mononastro?
* b) Un modo alternativo di simulare k, nastri con uno solo prevede luso di una (k - f 1)esima traccia per memorizzare le posizioni delle k testine, mentre le prime k tracce
simulano i k nastri nel modo ovvio. Si noti che nella (k + l)-esim a traccia si deve
fare attenzione a distinguere Ie testine e a trattare il caso in cui due testine sono nella
stessa posizione. Questo metodo riduce il numero di simboli di nastro necessari per
la TM mononastro?
c) Un altro modo di simulare k nastri con uno solo evita di memorizzare le posizioni
delle testine. La (A-I-1)-esima traccia si usa per marcare una cella del nastro. A ogni
istante ciascun nastro simulato collocalo sulla traccia corrispondente in modo che
la testina si trovi sulla cella marcata. Se la TM a k nastri sposta la testina del nastro
i, la TM simulante fa scorrere lintera porzione non bianca dell-esima traccia di
una cella nella direzione opposta, cos che la cella marcata corrisponda sempre a
quella guardata dalPi-esim a testina della TM a k nastri. Questo metodo riduce il
numero di simboli di nastro della TM mononastro? Ha qualche difetto rispetto agli
altri metodi discussi?
! Esercizio 8.4.9 Una macchina di Turing a k testine dotata di k testine sullo stesso nastro.
Ogni sua mossa dipende dallo stato e dal simbolo chc ogni testina guarda. In una mossa la
365
TM cambia stato, scrive un nuovo simbolo su ogni cella guardata da una testina e sposta
ogni testina a sinistra o a destra, o la lascia ferma. Poich pi testine possono guardare la
stessa cella, assumiamo che le testine siano numerate da 1 a k c chc in una cella rimanga
scritto il simbolo della testina con il numero pi alto. Dimostrate che i linguaggi accettati
dalle macchine di Turing a k testine sono quelli accettati dalle TM ordinarie.
Esercizio 8.4.10 Una macchina di Turing bidimensionale ha il solito controllo a stati
finiti, ma il suo nastro una griglia bidimensionale di celle, infinita in tutte le direzioni.
Linput collocato su una riga, con la testina al suo estremo sinistro e il controllo nello
stato iniziale. La macchina accetta entrando in uno stato finale. Dimostrate che i linguaggi
accettati dalle macchine di Turing bidimensionali sono quelli accettati dalle TM ordinarie.
8.5
Abbiamo esaminato alcune generalizzazioni della macchina di Turing che non ne allar
gano la capacit di riconoscimento di linguaggi. Consideriamo ora esempi di TM appa
rentemente limitate, m a chc hanno esattamente la stessa capacit. La prima limitazione
secondaria, ma utile in alcune costruzioni che vedremo in seguito: sostituiamo il nastro il
limitato nelle due direzioni con un nastro illimitato solo a destra. Inoltre vietiamo alla TM
di stampare un blank al posto del simbolo di nastro. Queste limitazioni hanno un pregio:
le ID sono formate solo da simboli diversi dal blank e cominciano sempre dallestremo
sinistro dclFinput.
Esploriamo poi alcuni tipi di macchina di Turing multinastro chc sono automi a pila
generalizzati. Vincoliamo anzitutto i nastri a comportarsi come degli stack. Li trattiamo
poi solo come contatori: possono rappresentare solo un valore intero c la TM pu di
stinguere soltanto tra un valore 0 e un valore diverso da 0. Dalla discussione si deduce che
esistono diversi tipi, molto semplici, di automa con le stesse capacit di un calcolatore. I
problemi indecidibili concernenti le macchine di Turing, chc studieremo nel Capitolo 9,
si applicano anche a questi semplici dispositivi.
8.5.1
Finora abbiamo permesso alla testina di una macchina di Turing di muoversi a sinistra o
a destra della posizione iniziale; in realt sufficiente perm etterle di muoversi nellarea
a destra della posizione iniziale. Possiamo quindi supporre chc il nastro sia semi-infinito,
cio che non ci siano celle a sinistra della posizione iniziale. Nel prossimo teorema dim o
striamo che si pu sempre costruire una TM con nastro scmi-iniinito capace di simularne
una con nastro illimitato in entrambe le direzioni, come il modello originale.
La costruzione impiega due tracce sul nastro semi-infinito. La traccia superiore rap
presenta la cella su cui si trova allinizio la testina della TM originale e quelle alla sua
366
Capitolo 8
destra. La traccia inferiore rappresenta le celle a sinistra della posizione iniziale, in ordi
ne inverso. La disposizione illustrata nella Figura 8.19. La traccia superiore rappresenta
le celle X (), X y i. . ., dove Xo la posizione di partenza della testina c X 1, Xo, e cos via,
sono le celle alla sua destra. Le celle X - X o,e cos via, rappresentano le celle a sini
stra della posizione iniziale. 11 simbolo * nella cella pi a sinistra della traccia inferiore
segnala la fine della traccia e impedisce che la testina cada accidentalmente dal bordo
sinistro del nastro semi-infinito.
*0
*1
*2
...
*- 2
. ..
Figura 8.19 Un nastro semi-infinito pu simulare un nastro infinito nelle due direzioni.
Imponiamo un vincolo ulteriore alla m acchina di Turing: il divieto di scrivere un blank.
Questo semplice vincolo, insieme con il nastro semi-infinito, fa s che in ogni istante il
nastro sia formato da un prefisso senza blank seguito da una serie infinita di blank. Inoltre
la sequenza di simboli diversi dal blank parte sempre dalla posizione iniziale nel nastro.
Nei Teoremi 9.19 e 10.9 vedremo perch utile poter assumere che le ID abbiano questa
forma.
367
^1(Ig1L )JX ,* ])
368
Capitolo 8
Q ueslaregola spiega uno dei modi di trattare il marcatore *. Se M 2 si muove a
destra dalla posizione iniziale, a prescindere dal fatto chc provenga da sinistra
o da destra rispetto a quella posizione (in funzione del fatto che il secondo
componente dello stato di M i sia L o U ), M i deve muoversi a destra e puntare
alla traccia supcriore. Dunque M\ si trover nella posizione rappresentata da
X i nella Figura 8.19.
5. Se 2 (9 . X ) = (P
.Y, L), allora
*i([<7, L], [X, *]) = 1 ([,, U], [X, *]> = ([p, L\, [Y. *], R)
Questa regola somiglia alla precedente, ma tratta il caso in cui M 2 va a si
nistra della posizione iniziale. My deve muoversi a destra rispetto al marca
tore, ma puntando alla traccia inferiore, cio alla cella indicata da X-y nella
Figura 8.19.
F 1: gli stati accettanti h\ sono gli elementi di F2 x {U, L}, ossia gli stati di M i il cui
primo componente uno stato accettante di M 2. Nel momento in cui accetta, Ai1
pu puntare alla traccia superiore o a quella inferiore.
La dimostrazione del teorema praticamente completa. Possiamo osservare, per induzio
ne sul numero di mosse di M 2, che My simula sul proprio nastro la ID di M 2, a patto di
rovesciare la traccia inferiore e giustapporla alla superiore. Notiamo anche chc M 1 entra
in uno stato accettante esattamente quando lo fa M 2. Perci L(M\ ) = L ( M 2).
8.5.2
Macchine multistack
Input
369
A ccetta/rifiu ta
nastro o su uno stack come fa una TM. Una macchina multistack ha un controllo finito,
cio uno stalo preso da un insieme finito; ha un alfabeto di slack finito, lo stesso per tutti
gli stack; ogni sua mossa dipende da tre elementi.
1. Lo stato di controllo.
2. Il simbolo corrente di input, scelto in un alfabeto finito di input. In alternativa la
macchina multistack pu fare una mossa su input e, in qualsiasi stato, per, non
pu esserci una scelta fra una c-mossa e una mossa normale perche la macchina
c deterministica.
3. I simboli in cima a ciascuno stack.
In una mossa la macchina compie diverse operazioni.
a) Cambia stato.
b) Sostituisce i simboli in cima agli stack con stringhe di zero o pi simboli. Le
stringhe sostituenti possono essere (e di solito sono) diverse da uno stack allaltro.
La tipica regola di transizione per una macchina con k stack ha quindi questa forma:
(<7, a , X li X 2, . . . , Xk) = (p, 7 i , 72, , Ih)
La interpretiamo cos: nello stato q, con X i in cima alT -esimo stack (per i = 1 , 2 , . . . . k),
la macchina pu consumare a (un simbolo di input o e) dall'input, passare allo stato p,
370
Capitolo 8
1. S com incia con un indicatore di fondo stack su ogni stack. Questo indicatore pu
essere il simbolo iniziale degli stack e non pu com parire altrove. Nel seguito
diremo che uno stack vuoto quando contiene solo lindicatore di fondo.
2. Sia wS linput di S. S copia w nel primo stack fermandosi quando legge il segnale
di fine dellinput.
3. S toglie, uno per volta, i simboli dal primo stack c li inserisce nel secondo. Ora il
primo stack vuoto, mentre il secondo contiene w, con lestrem o sinistro in cima.
4. S entra nello stato iniziale (simulato) di M . 11 suo primo stack vuoto, a rappresen
tare il fatto che a sinistra della cella guardata dalla testina di M ci sono solo blank.
11 secondo stack di S contiene w, a rappresentare il fatto che w occupa le celle del
nastro di M , quella guardata dalla testina e quelle alla sua destra.
5. Descriviam o ora come S simula una mossa di M .
(a) S conosce lo stato di M perch lo simula nel proprio controllo.
(b) S conosce il simbolo X che la testina di M sta guardando: quello in cim a al
suo secondo stack. Si ha uneccezione quando il secondo stack contiene solo
l'indicatore di fondo; ci significa che M si spostato su un blank ed S pu
interpretare correttamente la situazione.
(c) Perci S conosce la mossa successiva di Ai.
371
8.5.3
Macchine a contatori
372
Capitolo 8
(c) Possiamo sostituire Z q solo con una stringa della form a X 1Z q per un i > 0.
(d) Possiamo sostituire X solo con X i per un i > 0. Il simbolo Z q pu quindi
trovarsi soltanto in fondo agli stack; ogni altro sim bolo nello stack X .
8.5.4
373
1. Per togliere un simbolo dallo stack dobbiamo sostituire i con ijr scartando l'even
tuale resto, che l i . Partendo con il valore 0 nel terzo contatore, sottraiamo ripe
tutamente T da i sommando 1 al terzo contatore. Ci fermiamo quando il contatore
che valeva i raggiunge lo 0. Ora sommiamo ripetutamente 1 al contatore originale
sottraendo 1 dal terzo finch il terzo ritorna a 0. A questo punto il contatore che
valeva i vale ijr.
2. Per scambiare X con Y in cima a uno stack rappresentato dai valore i, aumentiamo
o diminuiamo i di una quantit non pi grande di r (ricordiamo chc in cim a allo
stack c la cifra meno significativa n.d.r.). Sc Y > X sommiamo Y A' a /; se
invece Y < X sottraiamo A' Y da i.
3. Per immettere X in uno stack che vale i, dobbiamo sostituire i con ir + X . Mol
tiplichiamo prima per r. Per farlo, sottraiamo ripetutamente 1 da i sommando r al
terzo contatore (che parte sempre da 0). Quando il contatore originale diventa 0,
il terzo vale ir. Copiamo il terzo contatore in quello originale e riportiamo a 0 il
terzo, come nel punto (1). Infine sommiamo A" al contatore originale.
374
Capitolo 8
DIMOSTRAZIONE In virt del teorema precedente dobbiamo solo mostrare come si sim u
lino tre contatori per mezzo di due. A questo scopo rappresentiamo i tre contatori, i, j
e k, con un solo numero intero, e cio m = 2l3J 5fc. Un contatore memorizza questo
numero; altro serve a moltiplicare o dividere m per uno dei tre numeri primi: 2, 3 e 5.
Per simulare la macchina con tre contatori dobbiamo svolgere tre operazioni.
1. Sommare l a i, j o k. Per sommare I a i m oltiplichiamo rn per 2. N ella di
mostrazione del Teorema 8.14 abbiamo visto come moltiplicare un contatore per
una costante r usando un secondo contatore. In modo analogo incrementiamo j
moltiplicando rn per 3, e A: moltiplicando rn per 5.
2. Stabilire quali tra i, j e k valgono 0. Per stabilire se i = 0 dobbiamo determinare
se rn divisibile per 2. Copiamo rn nel secondo contatore e usiamo lo stato della
macchina a contatori per ricordare se abbiamo diminuito m per un numero di volte
pari o dispari. Quando ni diventa 0, se l'abbiam o dim inuito un numero dispari di
volte, allora i = 0. Ripristiniamo ora rn copiando il secondo contatore nel primo.
Con la stessa tecnica verifichiamo se j = stabilendo se rn c divisibile per 3, e
verifichiamo se k = 0 stabilendo se rn divisibile per 5.
3. Sottrarre 1 da i-, j o k. A questo scopo dividiamo rn per 2, 3 o 5. La dimostrazione
del Teorema 8.14 spiega come dividere per una costante servendosi di un contatore
ausiliario. La macchina a tre contatori non pu far scendere sotto lo 0 i suoi con
tatori; quindi un errore, e la macchina simulatrice si arresta senza accettare, se rn
non divisibile per la costante in esame.
8.5.5
Esercizi
375
*! c)
[(I1Vck I i = j o i = k}.
!! d) [(ItV c k I i = j o i = k, o j = k}.
E sercizio 8.5.2 Lo scopo di questo esercizio dim ostrare che una m acchina monostack
con segnale di fine input non pi capace di un PDA determ inistico. L $ c la conca
tenazione del linguaggio L con il linguaggio contenente la sola stringa $; quindi L$
l'insiem e delle stringhe w $ tali che w in L. Dim ostrate che, se L$ accettato da un
DPDA in cui S il segnale di fine input e non com pare nelle stringhe di L, allora anche
L accettato da un DPDA. Suggerimento: si tratta in realt di dimostrare che i linguaggi
dei DPDA sono chiusi rispetto alloperazione L /n definita ncllEsercizio 4.2.2. Dovete
modificare il DPDA P per L$ sostituendo ognuno dei suoi simboli di stack con tutte le
coppie (J. 5 ) , dove S un insieme di stati. A uno stack X i X 2 X n in P corrisponde,
nel DPDA per L, lo stack ( X i . S\ ){X2, S 2) ( X n , Sn), dove ogni Si l insieme degli
stati q tali che P accetta a partire dalla ID (q, a, X i X i+ \ X n)-
8.6
8.6.1
Com inciam o a esaminare com e un com puter pu simulare una macchina di Turing. Data
una particolare TM M , dobbiam o scrivere un program ma che agisce come M . Un aspetto
376
Capitolo 8
N a s tro a d estra
d e lla te stin a
di M il suo controllo finito. Poich esistono solo un numero finito di stati e un numero
finito di regole di transizione, il nostro programma pu codificare gli stati come stringhe
di caratteri c usare una tabella di transizione che viene consultata per stabilire ciascu
na mossa. Analogamente i simboli di nastro possono essere codificati come stringhe di
caratteri di lunghezza fissa, visto che ne esiste solo un numero finito.
Una domanda importante si pone quando consideriam o come il nostro programma
debba simulare il nastro della macchina di Turing. Si tratta di un nastro che pu diventare
infinitamente lungo, ma la memoria del computer, vale a dire la m em oria centrale, il disco
e altri dispositivi di memorizzazione, sono tutti finiti. E possibile simulare un nastro
infinito per mezzo di una quantit fissa di memoria?
Se non c ' nessuna opportunit di sostituire i dispositivi di memorizzazione, allora
effettivamente impossibile. In questo caso un com puter sarebbe un automa a stati finiti
e gli unici linguaggi che potrebbe accettare sarebbero linguaggi regolari. I computer
comuni hanno per dispositivi di memoria rimovibili, come per esempio le unit Zip".
In effetti il tipico disco fisso rimovibile e pu essere sostituito da un disco vuoto, ma per
il resto identico.
Dato che non esistono limiti evidenti al numero di dischi che possono essere usati,
assumiamo che siano disponibili tanti dischi quanti nc richiede il computer. Possiamo
perci predisporre che i dischi siano sistemati in due pile, come suggerito nella FiguV
377
ra 8.21. Una pila contiene i dati nelle celle del nastro della macchina di Turing che sono
poste a una certa distanza a sinistra della testina; Taltra pila contiene i dati a una certa
distanza a destra della testina. Pi in basso si scende nella pila, pi i dati si allontanano
dalla testina.
Se la testina della TM si muove verso sinistra fino a raggiungere celle che non sono
rappresentate nel disco montato nel computer, allora il program m a stampa il messaggio
cam bio sinistro . Il disco montato correntemente viene rimosso da un operatore e posto
in cim a alla pila destra. Il disco in cima alla pila sinistra viene montato nel computer e si
riprende la computazione.
Allo stesso modo, se la testina della TM raggiunge celle cos lontane a destra da
non essere rappresentate nel disco montato, allora viene stampato il messaggio cambio
destro. Loperatore sposta in cima alla pila sinistra il disco montato correntemente e
378
Capitolo 8
monta nel computer I disco in cima alla pila destra. Se il com puter richiede di montare
un disco di una certa pila, ma questa vuota, ci significa che la TM c entrata in una
regione totalmente bianca del nastro. In questo caso l'operatore deve andare in magazzino
e procurarsi un nuovo disco da montare.
8.6.2
379
380
Capitolo S
A u siliario
Figura 8.22 Una macchina di Turing che simula un com puter ordinario.
da svolgere (per esem pio copia, somma, salto) e quelli rimanenti codificano un
indirizzo o pi indirizzi coinvolti nelloperazione.
3. Se listruzione richiede il valore di un indirizzo, esso ne far parte. Copiam o tale
indirizzo sul terzo nastro e segnaliamo la posizione dellistruzione usando una se
conda traccia del primo nastro (che non rappresentata nella Figura 8.22), in modo
tale da poter tornare allistruzione qualora sia necessario. Cerchiamo ora lindiriz
zo di memoria sul primo nastro e copiamo il suo valore sul nastro 3, il nastro che
contiene lindirizzo di memoria.
4. Eseguiamo listruzione o la parte di istruzione che si riferisce a questo valore. Non
possiamo trattare tutte le possibili istruzioni macchina, m a possiamo m ostrare un
campione dei tipi di azioni che potremmo svolgere con il nuovo valore.
381
Ci sono molti altri dettagli relativi a questa simulazione. Dato che il computer deve leg
gere il suo input (la parola di cui sta verificando lappartenenza a un linguaggio) da un
file, nella Figura 8.22 abbiamo suggerito un quarto nastro che contiene linput simulato e
dal quale la TM pu leggerlo.
Si rappresenta inoltre un nastro ausiliario. La simulazione delle istruzioni di un com
puter potrebbe effettivamente impiegare uno o pi nastri ausiliari per svolgere operazioni
aritmetiche come la moltiplicazione.
Infine assumiamo che il com puter produca un output che indica se il suo input viene
accettato o no. Per tradurre questazione in termini eseguibili dalla macchina di Turing,
382
Capitolo 8
ipotizzeremo che esista unistruzione del computer chc chiamiamo accettare, eventual
mente legata a una chiamata di funzione da parte del com puter per scrivere s su un file
di output. Quando simula lesecuzione di questistruzione del computer, la TM entra in
un suo stato accettante e si arresta.
Se questa trattazione non la dimostrazione formale e com pleta che una TM pu
simulare un tipico computer, dovrebbe per fornire abbastanza dettagli per convincere il
lettore che una TM costituisce una valida rappresentazione delle capacit di un computer.
Di conseguenza in futuro useremo solo la macchina di Turing com e rappresentazione
formale di quanto pu essere computato da un qualunque tipo di dispositivo di calcolo.
8.6.3
383
Dobbiamo per imporre alle istruzioni un altro vincolo. Anche se unistruzione non
produce comc risultato una parola lunga, potrebbe impiegare molto tempo per calcolare il
risultato. Faremo quindi la supposizione aggiuntiva che una macchina di Turing multina
stro possa eseguire listruzione stessa, applicata a parole di lunghezza fino a k , in 0 ( k 2)
passi. Senzaltro le tipiche operazioni del computer, come laddizione, lo spostamento e
11 confronto di valori, possono essere svolte in O(k) passi della TM multinastro, e quindi
il vincolo imposto non troppo rigido.
384
Capitolo 8
ununit
2. ha solo istruzioni che una TM multinastro pu eseguire su parole di lunghezza k in
0 ( k 2) passi o meno
allora la macchina di Turing descritta nel Paragrafo 8.6.2 pu simulare n passi del com
puter in 0 (n 3) dei suoi passi.
Partiamo dallosservazione che il primo nastro (la memoria) della TM
nella Figura 8.22 contiene inizialmente solo il programma del computer. Tl programma
pu essere lungo, ma fisso e di lunghezza costante, indipendente da n, il numero dei
passi di istruzione eseguiti dal computer. Esiste perci una costante c, chc la parola pi
lunga o lindirizzo pi lungo tra quelli presenti nel programma. Inoltre esiste una costante
d, che il numero di parole occupate dal programma.
Di conseguenza, dopo aver eseguito n passi, il computer non pu aver creato alcuna
parola pi lunga di r + n, e perci non pu aver creato o usato alcun indirizzo chc a sua
volta sia pi lungo di c + n bit. Ciascuna istruzione crea al massimo un unico nuovo
indirizzo che prende un valore, per cui il numero totale di indirizzi dopo lesecuzione di n
istruzioni al massimo d + n. Dato che ciascuna combinazione indirizzo-parola richiede
al massimo 2(c + n) + 2 bit, inclusi lindirizzo, il contenuto c due simboli marcatori per
separarli, il numero totale di celle di nastro della TM occupate dopo che n istruzioni sono
state simulate al massimo 2 (d + n)(c + n + 1 ) . Poich c e d sono costanti, tale numero
di celle 0 (n 2).
Sappiamo ora che ognuna delle ricerche di indirizzi, in numero fisso, coinvolte in
ununica istruzione, pu essere eseguita in un tempo 0 ( n 2). Dato chc le parole sono
0 (n ) in lunghezza, il nostro secondo assunto indica che ognuna delle istruzioni stesse
pu essere svolta dalla TM in un lempo 0 ( n 2). L'unico costo residuo c significativo di
unistruzione riguarda il tempo impiegalo dalla TM per creare maggiore spazio sul suo
nastro allo scopo di contenere una parola nuova oppure una estesa. La tecnica impiegata
richiede di copiare al massimo 0 (n 2) dati dal nastro 1 al nastro ausiliario, e viceversa.
Perci anchessa richiede solo un tempo 0 ( n 2) per ogni istruzione del computer.
Il risultato che la TM simula un passo del computer in 0 ( n 2) dei suoi passi. Di
conseguenza, come abbiamo sostenuto nellenunciato del teorema, n passi del computer
possono essere simulati in 0 ( n 3) passi della macchina di Turing.
d im o s t r a z io n e
Come osservazione finale risulta chiaro che, a condizione di elevare al cubo il numero
di passi, una TM multinastro pu simulare un computer. Sappiamo anche dal Paragra
fo 8.4.3 che una TM a nastro unico pu simulare una TM multinastro elevando al quadrato
il numero dei passi. La conclusione riassunta nel prossimo teorema.
Riepilogo
385
Teorema 8.18 IJn computer del tipo descritto nel Teorema 8.17 pu essere simulato per
passi da una macchina di Turing a nastro unico impiegando O ^ ) passi della m acchina
di Turing.
8.7
Riepilogo
Tracce multiple: spesso utile considerare i simboli di nastro come vettori con un
386
Capitolo 8
Bibliografa
387
8.8
Bibliografa
in the theory of Turing machines, Annals of Mathematics 74:3 (1961), pp. 4 3 7 455.
7. E. Post, Finite combinatory processes-formulation, J. Symbolic Logic I (1936),
p p . 103-105.
388
Capitolo 8
8 . A. M. Turing, On computable numbers with an application to the Rntscheidungsproblem, P roc. London Math. Society 2:42 (1936), pp. 230-265. Vedi anche ibid.
Capitolo 9
Indecidibilit
Iniziam o questo capitolo ribadendo, nel contesto delle m acchine di Turing, il ragionam en
to svolto nel Paragrafo 8.1, in cui sostenevamo l esistenza di problem i chc non possono
essere risolti da un computer. La seconda dim ostrazione che abbiamo proposto com
porta una difficolt: siamo stati costretti a ignorare i limiti concreti di cui soffre ogni
im plem entazione del C (o di qualunque altro linguaggio di program m azione) in un vero
computer. Questi limiti, com e la dim ensione dello spazio di indirizzam ento, non sono
fondamentali. Al contrario, possiam o aspettarci che con il passare degli anni certe quanti
t, per esem pio la dimensione dello spazio di indirizzam ento e la capacit della m em oria
centrale, aum enteranno indefinitamente.
Concentrandoci sulla m acchina di Turing, che non conosce quelle restrizioni, pos
siamo cogliere meglio lessenza delle capacit di un dispositivo di calcolo, se non oggi,
alm eno per il futuro. In questo capitolo diamo una dim ostrazione formale dellesistenza
di un problem a, attinente alle macchine di Turing, chc nessuna m acchina di Turing pu
risolvere. Poich sappiamo dal Paragrafo 8 .6 chc le m acchine di Turing possono simulare
i com puter concreti, anche quelli non soggetti alle lim itazioni odierne, ragionerem o in
modo rigoroso sul fatto che il seguente problema:
una macchina di Turing data accetta (il codice di) se stessa come input?
non pu essere risolto da un computer, per quanto se ne allentino i limiti pratici.
Distinguiam o dunque i problem i che possono essere risolti da una macchina di Turing
in due classi: quelli per cui c un algoritmo (cio una m acchina di Turing che si arresta,
a prescindere dal fatto di accettare o no il suo input) e quelli chc vengono risolti solo da
m acchine di Turing chc possono girare per sempre su input non accettati. La seconda
forma di accettazione problem atica. Per quanto a lungo la TM giri, non infatti dato
sapere se linput accettato o no. Ci concentriam o dunque sulle tecniche per dimostrare
che un problem a indecidibile, ossia che non ha un algoritm o, indipendentem ente dal
390
Capitolo 9
fatto che sia accettato o no da una m acchina di Turing che non si arresta su un certo input.
Dim ostriam o indecidibilit del seguente problema:
una data macchina di Turing accetta un dato input?
Sfruttiam o allora il risultato di indecidibilit per presentare diversi altri problemi indecidi
bili. P erescm pio mostriamo che tutti i problemi non banali relativi al linguaggio accettato
da una m acchina di Turing sono indecidibili, cos com e una quantit di problemi chc non
hanno nulla a che vedere con m acchine di Turing, programmi o computer.
9.1
3. M accetta l input w.
Se questo problema, con input limitati allalfabeto binario, indecidibile, allora senzal
tro indecidibilc anche il problem a pi generale, in cui le TM possono avere qualsiasi
alfabeto.
Il prim o passo consiste nel porre la questione com e problem a di appartenenza a un
particolare linguaggio. Perci dobbiam o dare una codifica delle macchine di Turing che
usi solo 0 e 1, indipendentem ente dal numero di stati. Una volta ottenuta la codifica,
possiam o trattare qualunque stringa binaria come se fosse una m acchina di Turing. Se la
stringa non una rappresentazione ben formata di una TM . possiam o pensarla com e la
rappresentazione di una TM priva di mosse. Di conseguenza possiam o considerare ogni
stringa binaria come una TM.
Lobiettivo intermedio, che anche l'argom ento di questo paragrafo, tocca il linguag
gio Ld, il linguaggio di diagonalizzazione , che consiste di tutte le stringhe w tali che Ia
TM rappresentata da w non accetta linput w. Dim ostrerem o che non c alcuna TM chc
accetti Li. Ricordiamo che la non esistenza di una m acchina di Turing per un linguaggio
391
una propriet pi forte dellindecidibilit del linguaggio (cio della non esistenza di un
algoritmo o di una TM che si arresta sempre).
La funzione del linguaggio L,i analoga aquella dcllipotetico programma H 2 del Pa
ragrafo 8.1.2, che stampa C i a o , m o n d o ogni volta che il suo input non stampa C i a o ,
m o n d o quando riceve se stesso come input. In termini pi precisi, proprio come H 2 non
pu esistere perch quando riceve se stesso come input la sua reazione paradossale, Ld
non pu essere accettato da una macchina di Turing. Infatti, se lo fosse, la TM in questio
ne entrerebbe in disaccordo con se stessa nel momento in cui dovesse ricevere come input
il proprio codice.
9.1.1
Nel seguito dovremo assegnare numeri interi a tutte le stringhe binarie in modo che ciascu
na stringa corrisponda a un unico intero e ciascun intero corrisponda a ununica stringa.
Se w una stringa binaria, trattiamo 1?;; come un intero binario i. Chiameremo allora
w la -esima stringa. In altre parole e la prima stringa, 0 la seconda, 1 la terza, 0 0 la
quarta, 01 la quinta, e cos via. Con questo criterio le stringhe risultano ordinate per lun
ghezza, con le stringhe di lunghezza uguale ordinate lessicograficamente. D ora in avanti
ci riferiremo alla -esima stringa come u\.
9.1.2
11 prossimo obiettivo ideare un codice binario per le macchine di Turing cos che ogni
TM con alfabeto di input { 0 .1 } possa essere considerata come una stringa binaria. Poich
ora sappiamo enumerare le stringhe binarie, potremo identificare le macchine di Turing
con gli interi e parlare della -esima macchina di Turing /, . Per rappresentare una TM
M = (Q, { 0 , 1 } , , ,q y ,B ,F ) come una stringa binaria, necessario assegnare interi
agli stati, ai simboli di nastro e alle direzioni L cd 11.
Supponcm o che gli stati siano qi,q2, . . ., qr per un certo r. Lo stato iniziale sar
sempre <71, e q2 sar l'unico stato accettante. Avendo ipotizzato che la TM si ar
resti quando entra in uno stato accettante, non c mai bisogno di pi di uno stato
accettante.
Supporremo che i simboli di nastro siano X \. X 2. ... , X s per un certo s. X i sar
sempre il simbolo 0, X 2 sar 1 e X sar B, il blank. Gli altri simboli di nastro
possono essere assegnati arbitrariamente agli altri interi.
Ci riferiremo alla direzione L comc D i e alla direzione R comc D 2.
Dato che per ogni TM M possiamo assegnare interi ai suoi stati e ai simboli di nastro
in molti modi diversi, per una TM ci sar pi di una codifica. Si tratta comunque di
392
Capitolo 9
C 1IlC2Il-- Cn-XllCn
dove ognuna delle C il codice di una transizione di M .
<*(tt.l) = (<73,0,)
<% 3 , 0 ) = (71 , 1, R)
(<73,1) = (2,0, R)
S(Qz-B) = (q$,l,L)
0100100010100
0001010100100
00010010010100
0001000100010010
Per esempio la prima regola pu essere scritta come S(q\, X 2) = (qz, X 1, D 2) in quanto
I = X 2, O = X i t R = D 2. Di conseguenza il suo codice O1IO2IO3 IOi IO2, come
indicato sopra. Un codice per M :
01001000101001100010101001001100010010010100110001000100010010
Notiamo che esistono molti altri codici possibili di M . In particolare i codici per le quattro
transizioni possono essere elencati in 4! ordini diversi, producendo 24 codici per M .
Nel Paragrafo 9.2.3 dovremo codificare coppie costituite da una TM e da una stringa,
(M , w). Per tale coppia usiamo il codice di M seguito da 111, seguito a sua volta da w.
Poich nessun codice valido di una TM contiene tre I in fila, possiamo essere certi che
la prima occorrenza di 111 separa il codice di M da w. Per esempio, se M fosse la TM
dellEsempio 9.1 e w fosse 1011, allora il codice di ( M ,w ) sarebbe la stringa mostrata
alla fine dellEsempio 9.1, seguita da 1111011.
9.1.3
393
II linguaggio di diagonalizzazione
9.1.4
394
Capitolo 9
D iag o n ale
dato che questo elenco include tutte le TM con alfabeto di input { 0 .1 }. Di conseguenza
esiste almeno un codice per M , poniamo i; ossia M = M i.
Chiediamoci ora se W i in L d.
Se Wi in Ld, allora M i accetta W 1. Pertanto, per la definizione di La, Wi non in
L d. poich L d contiene solo le stringhe wj tali chc M 1 non accetta Wj.
Analogamente, se w non in L d, allora M* non accetta Wi. Di conseguenza, per
la definizione di L d, w in Ld.
Poich W i non pu essere n non essere in L d, abbiamo una contraddizione con lipotesi
che M esista. In altre parole Ld non un linguaggio ricorsivamente enumerabile.
9.1.5
Esercizi
395
b) W i 00.
Esercizio 9.1.2 Scrivete un codice possibile per la m acchina di Turing della Figura 8.9.
! Esercizio 9.1.3 Diamo due definizioni simili alla definizione di Ld- Impiegando un ra
gionamento analogo alla diagonalizzazione. mostrate in ambedue i casi che il linguaggio
non accettato da una macchina di Turing. Osserviamo chc non possibile sviluppare
un ragionamento basato sulla diagonale stessa, per cui bisogna trovare unaltra sequenza
infinita di punti nella matrice suggerita dalla Figura 9.1.
* a) Linsieme di tutte le io, tali che
non accettata da M i.
! Esercizio 9.1.4 Abbiamo considerato solo Ic macchine di Turing con alfabeto di input
{(). 1}. Supponiamo di voler assegnare un intero a tutte le m acchine di Turing, a prescin
dere dallalfabeto di input. A rigor di termini questo non possibile perch, mentre i nomi
degli stati e dei simboli di nastro che non sono simboli di input sono arbitrari, i simboli
di input sono significativi. Per esempio i linguaggi {0 1 | n > 1} e {"&" | n > 1},
per quanto in qualche modo simili, non sono lo stesso linguaggio e sono accettati da TM
diverse. Supponiamo tuttavia di avere un insieme infinito di simboli, J a 1, 2 . ...} da cui
sono selezionati lutti gli alfabeti. M ostrate come si potrebbe assegnare un intero a tutte le
TM dotate di un insieme finito di tali simboli come alfabeto di input.
9.2
396
9.2.1
Capitolo 9
Linguaggi ricorsivi
9.2.2
Un modo efficace per dimostrare che un linguaggio appartiene al secondo cerchio del
la Figura 9.2 (vale a dire che RE ma non ricorsivo) lo studio del suo complemento.
M ostreremo che i linguaggi ricorsivi sono chiusi rispetto alloperazione di com plem enta
zione. Perci se un linguaggio L RE, ma il suo com plem ento L non lo , L non pu
essere ricorsivo. Infatti se L fosse ricorsivo, anche L sarebbe ricorsivo e dunque RE.
Dimostriamo ora quest'im portante propriet di chiusura.
T eorem a 9.3 Se L un linguaggio ricorsivo, lo anche L.
397
D IM O STR A ZIO N E
398
Capitolo 9
Perch ricorsivo
Oggi le funzioni ricorsive sono familiari ai programmatori, eppure non sembrano
avere nulla a che vedere con le macchine di Turing che si arrestano sempre. Per
di pi il concetto opposto (non ricorsivo o indecidibile) si riferisce a linguaggi
chc non possono essere riconosciuti da nessun algoritmo, anche se siamo abituati
a pensare a non ricorsivo come riferito a computazioni cos semplici da non
richiedere chiamate di funzioni ricorsive.
Il
termine ricorsivo come sinonimo di decidibile risale alla matematica
precedente Pera dei computer. Allora era prassi servirsi di formalismi basati sulla
ricorsione (e non su iterazione o cicli) a sostegno del concetto di computazione.
Queste notazioni, di cui non ci occuperemo qui, sono affini ai linguaggi di pro
grammazione funzionali come LISP o ML. In quel senso, dire che un problema
ricorsivo ha la connotazione positiva di sufficientemente semplice da poterlo
risolvere con una funzione ricorsiva che termina sempre. Questo c proprio il
significato odierno del termine in relazione alle macchine di Turing.
Il
termine ricorsivamente enumerabile fa riferimento allo stesso campo
concettuale. Una funzione pu elencare tutti gli elementi di un linguaggio in
un certo ordine; in altre parole li pu "enumerare. I linguaggi i cui elementi
possono essere elencati in un certo ordine sono gli stessi chc sono accettati da
una TM, anche sc la TM pu girare per sempre su input che non accetta.
Possiamo riassumere i Teoremi 9.3 e 9.4 come segue. Delle nove possibilit di collo
care un linguaggio L e il suo complemento nel diagramma della Figura 9.2. solo quattro
sono consentite.
1. Sia L sia L sono ricorsivi, cio si trovano entrambi nel cerchio interno.
2. N L n L sono RE, cio sono entrambi nel cerchio esterno.
399
A ccetta
R ifiuta
3. L RE ma non ricorsivo, cd L non RE; uno si trova nel cerchio intermedio, l'altro
nel cerchio esterno.
4. L RE ma non ricorsivo, ed L non RE; il caso analogo al punto (3), ma L ed L
sono invertiti.
A dimostrazione di quanto detto, il Teorema 9.3 esclude la possibilit che un linguaggio
(L o L ) sia ricorsivo e laltro si trovi in una delle altre due classi. Il Teorema 9.4 esclude
la possibilit che entrambi siano RE ma non ricorsivi.
E sem pio 9.5 Consideriamo a titolo di esempio il linguaggio La, che non RE. Perci L,i
V
""
non pu essere ricorsivo. E per possibile che L sia non RE, o RE ma non ricorsivo. In
realt Ld RE ma non ricorsivo.
Ld linsieme delle stringhe W i tali che M i accetta W{. Si tratta di un linguaggio
simile al linguaggio universale L u formato da tutte le coppie (M , w) tali chc M accetta w.
400
Capitolo 9
Questo linguaggio, come mostreremo nel Paragrafo 9.2.3, RE. Lo stesso ragionamento
dimostra che Ld RE.
9.2.3
II linguaggio universale
Nel Paragrafo 8.6.2 abbiamo gi discusso in termini informali come utilizzare una m ac
china di Turing per simulare un computer caricato con un programma arbitrario. Una
singola TM pu quindi essere usata comc un computer a programma memorizzato , che
legge un programma e i dati relativi da uno o pi nastri su cui risiede linput. In questo
paragrafo riproponiamo lidea al pi alto grado di formalit consentito dal considerare
una macchina di Turing come rappresentazione di un programma memorizzato.
Definiamo L u, il linguaggio universale, comc linsieme delle stringhe binarie che
codificano, nella notazione del Paragrafo 9.1.2, una coppia ( M , w ), dove M c una TM
con alfabeto di input binario c w una stringa in (0 + 1)* tale che w sia in L(M). In
altre parole L u linsieme delle stringhe che rappresentano una TM e un input da essa
accettato. Mostreremo che esiste una TM U, detta macchina di Turing universale, tale
che Lu = L(U). Poich linput di U una stringa binaria, U in effetti una Mj chc
possiamo trovare nell'elenco delle macchine di Turing con input binario, sviluppato nel
Paragrafo 9.1.2.
Per semplicit descriviamo U come macchina di Turing multinastro, nello spirito della
Figura 8.22. Nel caso di U le transizioni di M sono memorizzate inizialmente sul primo
nastro insieme con la stringa w. Un secondo nastro sar usato per contenere il nastro
simulato di M, ricorrendo allo stesso formato utilizzato per il codice di M . In altre parole
il simbolo di nastro X. di M sar rappresentato da O1 e i simboli di nastro saranno separati
da singoli I . Il terzo nastro di U contiene lo stato di M , con lo stato qt rappresentato da i
0. U raffigurata nella Figura 9.5.
Descriviamo come opera U .
1. Esamina linput per assicurarsi che il codice di M sia un codice legittimo per una
TM. Sc non cos, U si arresta senza accettare. Poich si presuppone che i codici
non validi rappresentino la TM senza mosse, che non accetta alcun input, si tratta
di unazione corretta.
2. Prepara il secondo nastro con l'input w nella sua forma codificata. Sul secondo na
stro scrive 10 per ogni 0 e 100 per ogni 1 di w. I blank sul nastro simulato di M , che
sono rappresentati da 1000. non compariranno sul nastro; tutte le celle oltre quelle
usate per w conterranno il blank di U. U sa comunque che, se dovesse cercare un
simbolo simulato di M c trovare il proprio blank, deve sostituire questultimo con
la sequenza 1000 per simulare il blank di M.
3. Scrive 0, lo stato iniziale di M , sul terzo nastro e muove la testina del secondo
nastro verso la prima cella simulata.
401
Ausiliario
Per sim ulare una m ossa di M , U percorre il prim o nastro alla ricerca di una tran
sizione Oi IUj IO1IOi IOm tale che O7 sia Io stato sul nastro 3 e Oj sia il sim bolo di
nastro di M collocato sul nastro 2 a partire dalla posizione guardata da U. Questa
la transizione che M farebbe com e passo successivo. U deve fare tre cose.
(a) Trasform are il contenuto del nastro 3 in Ok, ossia sim ulare il cam biam ento di
stato di M . A tal fine U trasform a prim a in blank tutti gli 0 sul nastro 3, e poi
copia Ofc dal nastro 1 al nastro 3.
(b) Sostituire Oy sul nastro 2 con Oi, cio trasform are il sim bolo di nastro di M .
Se c bisogno di m aggiore o m inore spazio, cio i L U si serve del nastro
ausiliario e della tecnica illustrata nel Paragrafo 8.6.2.
(c) Muove la testina del nastro 2 verso la posizione del successivo 1 a sinistra o
a destra, a seconda delle due opzioni: in = 1 (m ossa verso sinistra) o in = 2
(m ossa verso destra). Di conseguenza U sim ula il m ovim ento di M verso
sinistra o destra.
402
Capitolo 9
9.2.4
403
1. Data una stringa w in input, Al' la trasforma in u;l 1 1w. Per esercizio si pu scri
vere il programma di una TM che compie questo passo su un singolo nastro. Il
ragionamento a sostegno della fallibilit del programma consiste nelluso di un se
condo nastro per copiare w e nella conversione della TM a due nastri in una a nastro
singolo.
2. Al' simula Al sul nuovo input. Se nella nostra numerazione w u?, allora Al'
determina se
accetta w. Poich Al accetta L u, accetter se e solo se Ali non
accetta Wi; quindi
in L,.
Di conseguenza Al' accetta w se e solo se w in L,;. Poich sappiamo che per il
Teorema 9.2 Al' non pu esistere, concludiamo che L u non ricorsivo.
9.2.5
Esercizi
Esercizio 9.2.1 Mostrate che il problema dellarrcsio, cio linsieme delle coppie (Al, w)
tali che Al si arresta (con o senza accettazione) quando riceve linput vk RE ma non
404
Capitolo 9
405
* Esercizio 9.2.4 Sia Li, L 2, . . . , L k una collezione di linguaggi sullalfabeto tali che:
1. per ogni i j, Li Lj = 0, ossia nessuna stringa appartiene a due linguaggi
2. Li U L 2 U ' U L k = *, cio ogni stringa si trova in uno dei linguaggi
3. ogni L i, p e r i = 1 ,2 ,... ,k, ricorsivamente enumerabile.
Dimostrate chc ognuno dei linguaggi devessere ricorsivo.
*! Esercizio 9.2.5 Sia L ricorsivamente enumerabile c sia L non RE. Considerate il linguag
gio
V = {0?/; I vo in L ) U {Iw \w non in L}
Potete dire con certezza se V o il suo complemento sono ricorsivi, RE, o non RE?
Giustificate la risposta.
! Esercizio 9.2.6 Non abbiamo discusso le propriet di chiusura dei linguaggi ricorsivi,
tranne che per la complementazione nel Paragrafo 9.2.2. Verificate se i linguaggi ricorsivi
e i linguaggi RE sono chiusi rispetto alle seguenti operazioni. Per dimostrare la chiusura
potete servirvi di costruzioni informali, purch chiare.
* a) Unione.
b) Intersezione.
c) Concatenazione.
d) Chiusura di Kleene (star).
* e) Omomorfismo.
0 Omomorfismo inverso.
9.3
Ci serviamo ora dei linguaggi L u ed L, di cui conosciamo lo status per quanto riguarda
la decidibilit e Tenumerabilita ricorsiva, per presentare altri linguaggi indccidibili o non
RE. In tutte le dimostrazioni applicheremo la tecnica della riduzione. 1 primi problemi in
decidibili di cui parliamo riguardano le macchine di Turing. La trattazione culmina nella
dimostrazione del teorema di Rice, secondo il quale qualsiasi propriet non banale delle
macchine di Turing che dipenda solo dal linguaggio accettato dalla TM devessere inde
cidibile. Nel Paragrafo 9.4 studieremo alcuni problemi indecidibili che non riguardano le
macchine di Turing e i loro linguaggi.
406
9.3.1
Capitolo 9
Riduzioni
Come indicalo nella Figura 9.7 una riduzione deve trasform are qualsiasi istanza di P i che
ha una risposta affermativa (s) in un'istanza di P- con una risposta affermativa (s),
c ogni istanza di P i con una risposta negativa (no) in unistanza di P^ con una risposta
negativa (no). Non essenziale che ogni istanza di P 2 sia Timmagine di una o pi
istanze di : di fatto normale che solo una piccola frazione di P sia limmagine della
riduzione.
In termini formali una riduzione da P i a p> una m acchina di Turing chc riceve u n 'i
stanza di scritta sul nastro e si arresta con unistanza di P> sul nastro. N ella pratica
descriveremo generalmente le riduzioni come se fossero programmi per com puter che
ricevono in input unistanza di Pi e producono com e output unistanza di /- Lequi
valenza delle macchine di Turing e dei programmi per com puter permette di descrivere
407
costruire un algoritmo chc decide P i. Lidea illustrata graficamente nella Figura 8.7.
Pi in dettaglio, supponiamo di avere unistanza tu di P i. Applichiamo a w lalgoritmo
che la converte in unistanza x di P2. Applichiamo poi a x l'algoritm o che decide /. Se
lalgoritmo dice s, allora x in P2. Poich abbiamo ridotto P i a P2, sappiamo che la
risposta a tu per P i s', ossia w in P 1. Analogamente, se x non in P2, allora tu
non in P1, e qualunque risposta sia data alla domanda iiX in P 2? c anche la risposta
corretta a tu in P iT'.
Abbiamo cos contraddetto lipotesi che Pi sia indecidibilc. Concludiamo che se P i
indecidibile, allora anche P 2 indecidibile.
Consideriamo ora la parte (b). Supponiamo che P| sia non RE e P 2 sia RE. Disponia
mo di un algoritmo che riduce P i a P 2, ma abbiamo solo una procedura per riconoscere
P2; in altre parole esiste una TM che dice s se il suo input in P 2, ma pu non arrestar
si se il suo input non in P2. Come per (a), tramite lalgoritmo di riduzione convertiamo
un istanza tu di P] in unistanza x di P 2. Applichiamo poi a x la TM per P2. Se x
accettato, accettiamo w.
Questa procedura descrive una TM (che pu anche non arrestarsi) il cui linguaggio
Pi. Se tu in P i , allora x in P2, per cui questa TM accetter tu. Se tu non in P 1 , allora
X non in P 2. La TM pu arrestarsi o no, ma di certo non accetter tu. Poich abbiamo
presupposto che non esista nessuna TM per P i. abbiamo dimostrato per assurdo che non
esiste nessuna TM neanche per P 2; in altre parole, se P 1 non RE. allora anche P 2 non
RE.
9.3.2
Come esempio di riduzioni che coinvolgono le macchine di Turing, studiamo due lin
guaggi, che chiameremo L e ed L nf,, composti da stringhe binarie. Sc tu una stringa
binaria, allora rappresenta una TM M i nellenumerazione del Paragrafo 9.1.2.
Sc L ( M i ) = 0, ossia M non accetta alcun input, allora tu in L fi. Quindi L e il
linguaggio formato da tutte le TM codificate il cui linguaggio vuoto. Daltro canto, se
L ( M i ) non il linguaggio vuoto, allora w in L ne. Dunque L nc il linguaggio di tutti i
codici delle macchine di Turing che accettano almeno una stringa di input.
408
Capitolo 9
Nel seguito sar opportuno considerare le stringhe come le macchine di Turing che
rappresentano. Possiamo cos definire i due linguaggi appena citati:
L c = { M I L ( M ) = 0}
. L ne = { M I L ( M ) 0}
Osserviamo che L f, ed L ne sono entrambi linguaggi sullalfabeto binario {0.1} e che sono
l'uno il complemento dellaltro. Vedremo che L ne il pi facile dei due linguaggi;
RE ma non ricorsivo. Da parte sua L c non RE.
Teorema 9.8 L nc ricorsivamente enumerabile.
DIMOSTRAZIONE Dobbiamo solo esibire una TM che accetta L ne. 11 modo pi semplice
consiste nel descrivere una TM non deterministica M , il cui schema rappresentato nella
Figura 9.8. Per il Teorema 8 .1 1 M pu essere convertita in una TM deterministica.
T entativo
w
Accet t a
A ccetta
M.
I
M per L
v
ne
409
Il
passo successivo consiste nel dimostrare che L ne non ricorsivo. A tal fine ridu
ciamo L u a L ne. In altre parole descriviam o un algoritm o che trasforma un input ( M , w )
in un output M t, il codice di unaltra macchina di Turing, tale che w si trova in L ( M ) se
e solo se L ( M ') non vuoto. Questo significa che M accetta w se c solo se M ' accetta
almeno una stringa. Il trucco far s che M ' ignori il suo input e simuli invece M su input
VJ. Se M accetta, allora M 1 accetta il proprio input; di conseguenza laccettazione di w
da parte di M equivale a L ( M t) non vuoto. Se L ne fosse ricorsivo, allora avremmo un
algoritmo che indica se M accetta o no w : costruiamo M t e verifichiamo se L ( M ') = 0.
Teorema 9.9 L ru: non ricorsivo.
DIMOSTRAZIONE Seguiremo lo schema della dimostrazione data. Dobbiamo definire un
algoritmo che converte un input formato da una coppia codificata in binario ( M , w) in
una TM M ' tale che L ( M t) 0 se c solo se M accetta linput w. La costruzione di M 1
delineata nella Figura 9.9. Come vedremo, se M non accetta uk allora M t non accetta
nessuno dei suoi input; cio L ( M t) 0. Se per M accetta w, allora M t accetta ogni
input, e di conseguenza L ( M t) sicuramente non 0.
X -------
Accet t a
A ccetta
M
AT
410
Capitolo 9
2. Quando Al' raggiunge un blank nello stato qn, usa unanaloga serie di stati per
ricollocare la testina allestremit sinistra del nastro.
3. Ricorrendo a stati aggiuntivi Al' simula una TM universale U sul suo nastro cor
rente.
4. Se U accetta, allora accetta anche Al'. Se U non accetta mai, allora neanche M '
accetta mai.
La descrizione di Al' dovrebbe convincere il lettore chc c possibile definire una macchina
di Turing capace di trasformare il codice di Al e la stringa w nel codice di Al'. In altre
parole esiste un algoritmo per effettuare la riduzione di L u a L ne. Vediamo inoltre chc
se M accetta w , allora AT' accetta qualsiasi input a; presente sul nastro allinizio. Il fatto
che X sia stato ignorato irrilevante; per la definizione di accettazione da parte di una
TM sappiamo che qualunque cosa sia collocata sul nastro prima di iniziare le operazioni
quanto la TM accetta. Di conseguenza, se Al accetta w, allora il codice di M 1 si trova
In
Ij TlC'
Viceversa, se M non accetta w , allora M ' non accetta mai. indipendentemente dalla
natura del suo input. Perci in questo caso il codice di Al' non si trova in L nc. Sia
mo riusciti a ridurre L u a L nc per mezzo dellalgoritmo che costruisce M 1 da M e w;
possiamo concludere che. poich L u non c ricorsivo, non lo neanche L ne. Lesistenza
della riduzione sufficiente a completare la dimostrazione. Per illustrare gli effetti della
riduzione portiamo avanti il ragionam ento di un altro passo. Se L ne fosse ricorsivo, allora
potremmo sviluppare un algoritmo per L u come segue.
1. Convertiamo (Al, w) nella TM AT' come abbiamo visto sopra.
2. Usiamo lalgoritmo ipotetico per L ne per segnalare se L(Al') = 0 o no. Nel primo
caso diciamo che AT non accetta w: sc L (A f ) 0 diciamo che Al accetta w.
Dal Teorema 9.6 sappiamo che non esiste un tale algoritmo per L u. Abbiamo quindi
contraddetto l'ipotesi chc L ne sia ricorsivo, e concludiamo che L nc non ricorsivo.
A questo punto possiamo conoscere lo stato di L e. Sc L e fosse RE. allora per il
Teorema 9.4 sia Lc sia L ne sarebbero ricorsivi. Dato chc per il Teorema 9.9 L ne non
ricorsivo, concludiamo che:
T eorem a 9.10 L e non RE.
411
9.3.3
Il fatto che linguaggi come L c ed L ne. siano indecidibili un caso speciale di un teorema
molto pi generale: tutte le propriet non banali dei linguaggi RE sono indecidibili, nel
senso che impossibile riconoscere per mezzo di una macchina di Turing le stringhe
binarie che rappresentano codici di una TM il cui linguaggio soddisfa la propriet. Un
esempio di propriet dei linguaggi RE il linguaggio libero dal contesto. Come
caso speciale del principio generale che tutte le propriet non banali dei linguaggi RE
sono indecidibili, il problema se una data TM accetti un linguaggio libero dal contesto
indecidibile.
Una propriet dei linguaggi RE semplicemente un insieme di linguaggi RE. Di
conseguenza la propriet di essere libero dal contesto in termini formali linsieme di
4 12
Capitolo 9
tutti i CFL. La propriet di essere vuoto Finsieme {0}, che consiste de! solo linguaggio
vuoto.
Una propriet banale se vuota (ossia non viene soddisfatta da nessun linguaggio)
o comprende tutti i linguaggi RE. Altrimenti non banale.
Osserviamo che la propriet vuota, 0, diversa dalla propriet di essere un linguag
gio vuoto {0 }.
Non possiamo riconoscere un insieme di linguaggi come i linguaggi stessi. La ragione
chc il tipico linguaggio, essendo infinito, non pu essere espresso come una stringa di
lunghezza finita chc possa essere linput di una TM. Dobbiamo piuttosto riconoscere le
macchine di Turing chc accettano quei linguaggi; il codice della TM finito anche se
il linguaggio che accetta c infinito. Di conseguenza, sc V una propriet dei linguaggi
RE, il linguaggio Lp linsieme dei codici di macchine di Turing M i tali che L ( M i) c
un linguaggio in V. Quando parliamo di decidibilit di una propriet V , intendiamo la
dccidibilit del linguaggio Lp.
T eorem a 9.11 (Teorema di Rice) Ogni propriet non banale dei linguaggi RE indecidi
bile.
DIMOSTRAZIONE Sia V una propriet non banale dei linguaggi RE. Per cominciare, sup
poniamo che 0 , il linguaggio vuoto, non sia in V\ ci occuperemo pi tardi del caso oppo
sto. Dato che V non banale, deve esistere un linguaggio non vuoto L che sia in V . Sia
Mt, una TM che accetta L.
Ridurremo L u a Lp, dimostrando in questo modo che L p indecidibile, dal momento
chc L u indccidibile. Lalgoritmo per la riduzione riceve in input una coppia (M , w) e
produce una TM M '. Lo schema di M 1 c illustrato nella Figura 9.10; L ( M ') 0 se M
non accetta w, c L ( M ') = L se M accetta vi.
413
9.3.4
Per il Teorema 9 .11 tutti i problemi sulle macchine di Turing che toccano solo i linguaggi
accettati sono indecidibili. Alcuni di questi problemi sono interessanti di per s. Per
esem pio sono indecidibili i seguenti problemi.
1. Il linguaggio accettato da una TM vuoto (come abbiam o appreso dai Teoremi 9.9
e 9.3)?
2. Il linguaggio accettato da una TM finito?
3. Il linguaggio accettato da una TM un linguaggio regolare?
4. 11 linguaggio accettato da una TM un linguaggio libero dal contesto?
414
Capitolo 9
11 Teorema di Rice non implica che tutto ci che riguarda le TM sia indecidibile. Questioni
concernenti gli stati di una TM. e non il linguaggio da essa accettato, potrebbero per
esempio essere decidibili.
Esem pio 9.12 La questione se una TM abbia cinque stati decidibile. L'algoritmo per
deciderla non fa altro che esaminare il codice della TM e contare il numero degli stati che
compaiono nelle transizioni.
Come ulteriore esempio, decidibile lesistenza di un input tale che una TM compia
almeno cinque mosse. Considerando chc, se una TM fa cinque mosse, le uniche celle
chc pu guardare sono le nove intorno alla posizione iniziale della testina, lalgoritmo
risulta evidente. Possiamo simulare la TM per cinque mosse su tutti i nastri (in numero
finito) formati da non pi di cinque simboli di input, preceduti e seguiti da blank. Sc una
qualsiasi di queste simulazioni non raggiunge una situazione di arresto, concludiamo che
la TM compie almeno cinque mosse su un input.
9.3.5
Esercizi
* Esercizio 9.3.1 Mostrate che linsieme dei codici di macchine di Turing chc accettano
tutti gli input palindromi (eventualmente insieme con altri input) indecidibile.
Esercizio 9.3.2 La Big Computer Corp. ha deciso di incrementare la sua fetta di mercato
in crisi fabbricando una versione high-tech della macchina di Turing, chiamata BWTM,
fornita di bells, campanelli, e whistles, fischietti. Fondamentalmente la BWTM una
comune macchina di Turing, salvo il fatto che ogni stato della macchina etichettato
come stato campanello o come stato fischietto. Ogni volta che la BWTM entra in un
nuovo stato suona il campanello o fischia, a seconda del tipo di stato. Dimostrate che
indccidibile se una data BWTM M fischia su un dato input w.
Esercizio 9.3.3 Mostrate che il linguaggio dei codici per le TM M che, partite con il
nastro bianco, prima o poi scrivono un 1 sul nastro indccidibile.
! Esercizio 9.3.4 Dal teorema di Rice sappiamo che nessuno dei problemi che seguono
decidibile. Sono per ricorsivamente enumerabili oppure non RE?
a) L ( M ) contiene almeno due stringhe?
b) L ( M ) infinito?
c) L ( M ) un linguaggio libero dal contesto?
* d) L ( M ) = ( L ( M ) ) r I
415
9.4
416
Capitolo 9
M PCP
un
un
alg o ritm o
PCP
alg o ritm o
9.4.1
U nistanza del problema di corrispondenza di Post (PCP) consiste in due liste di stringhe
sullo stesso alfabeto ; le due liste devono avere la stessa lunghezza. Generalmente
parleremo delle liste A e B, e scriveremo A -. . . , tu*, e B = X\.x-, ,Xk, per
un intero k. Per ogni i la coppia
x) si dice coppia corrispondente.
Diciamo che listanza di PCP ha soluzione se esiste una sequenza di uno o pi interi
I, 2 ,.. , i m che, interpretati come indici per le stringhe di A e B, producono la stessa
stringa. Formalmente Wil Wi2 Wim = XtlXi2 Xtm. In questo caso diciamo che la
sequenza i, 2,. . . A m una soluzione dellistanza di PCP. Il problema di corrispondenza
di Post definito cos:
data unistanza di PCP, dire se ha una soluzione.
Lista A
Lista B
Wi
Xi
1
2
1
10111
10
111
10
0
Esem pio 9.13 Sia = {0 , 1}, e siano A e B le liste definite come nella Figura 9 . 12.
In questo caso PCP ha una soluzione. Per esempio, siano m = 4 , ?o 2, 2 = 1,
h = I e 4 = 3 ; la soluzione allora la lista 2 , 1, 1, 3 . Verifichiamo che sia una
soluzione concatenando le stringhe corrispondenti delle due liste nellordine indicato:
W2W\W\ IU3 = X2X1X1X3 101111110. Osserviamo che la soluzione non unica: per
esem pio 2 , 1. 1 , 3 , 2 , 1, 1 , 3 unaltra soluzione.
417
Lista A
Lista B
Wi
Xi
1
2
10
011
101
101
11
011
A: 1 0
B: 101
Consideriamo che cosa devessere 2
418
Capitolo 9
Soluzioni parziali
N ellEsempio 9.14 abbiamo impiegato una tecnica molto comune per analizzare
istanze di PCP. Abbiamo considerato le possibili soluzioni parziali, cio sequenze
di indici i, i 2, . . . , i, tali che una fra WixWi2 wir e Xil Xi2 Xir sia prefisso
dell'altra, anche se le due stringhe non sono uguali. Notiamo che, se una sequen
za di interi una soluzione, ogni suo prefisso una soluzione parziale. Perci
ragionare sulle soluzioni parziali permette di dedurre propriet delle soluzioni
globali.
Notiamo d altra parte che, essendo PCP indecidibile, non esiste un algorit
mo che calcoli tutte le soluzioni parziali. Esse sono in numero infinito e, so
prattutto, non c un limite supcriore alla differenza in lunghezza delle strin
ghe Wil Wi2 - - W i r e XixXi2 - - -Xi r , anche se formano una soluzione parziale
estendibile a globale.
1. Non pu valere i 2 = 1 perch nessuna stringa che comincia per W\W\ = 1010 pu
coincidere con una che comincia per = 101101: esse discordano alla quarta
posizione.
2 . Non pu valere neppure i 2 = 2 perch nessuna stringa che comincia per w\w 2 =
10011 pu coincidere con una che comincia per x \ x 2 = 10111: esse differiscono
alla terza posizione.
3 . Solo i 2 = 3 possibile.
Se poniamo i 2 = 3, le stringhe corrispondenti, formate dalla lista di interi 1 , 3 , sono le
seguenti:
A: 10101
B: 101011 - - Nulla in queste stringhe indica chiaramente che la lista 1,3 non si possa estendere a una
soluzione. Eppure siamo in grado di provare che non possibile farlo perch siamo nella
stessa situazione di quando abbiamo scelto 1 = 1. La stringa presa dalla lista B la
stessa della lista A, ma con un 1 in pi alla fine. Siamo perci obbligati a scegliere
3 = 3, \ = 3, e cos via, per mantenere la corrispondenza. La stringa di A non pu mai
raggiungere quella di B, e quindi non possiamo raggiungere una soluzione.
9.4.2
II PCP modificato
facile ridurre L u a PCP se introduciamo prima una versione intermedia di PCP, che
chiamiamo problema di corrispondenza di Post modificato, o MPCP. In questa variante
imponiamo il vincolo aggiuntivo che la prima coppia delle liste A c B dev'essere la
prima anche nella soluzione. Unistanza di MPCP data formalmente da due liste, A =
UJi, u2 , ,Wk e B x\, X2 , . . . ; Xki mentre una soluzione una sequenza di 0 o pi
interi i, 2 , . , im tali che
W l W i l W h W im = X i X i l X i i X i m
Notiamo che la coppia (, ) deve trovarsi allinizio delle due stringhe, anche se
lindice 1 non menzionato in testa alla sequenza che forma la soluzione. Inoltre, a diffe
renza di PCP. in cui la soluzione deve contenere almeno un intero, la sequenza vuota pu
essere soluzione di MPCP se w\ = Xi (un caso del genere non per molto interessante,
e non ne incontreremo nel seguito).
Esempio 9.15 Possiamo interpretare le liste della Figura 9.12 come unistanza di MPCP,
che per non ha soluzioni. Per dimostrarlo osserviamo che ogni soluzione parziale deve
cominciare con lindice 1 e le due stringhe relative devono cominciare cos:
A: 1
B: 111
Lintero successivo non pu essere n 2 n 3 perch sia w- sia w cominciano per 10 e si
avrebbe una discordanza alla terza posizione. Lindice successivo deve quindi essere 1:
A: 11
B: 111111
Possiamo proseguire cos indefinitamente. Solo un altro 1 nella soluzione evita la discor
danza. Tuttavia se possiamo scegliere solo lindice I , la stringa di B sar sempre tre volte
pi lunga della stringa di A , ed esse non coincideranno mai.
Un passo importante nella prova che PCP risulta indecidibile la riduzione di MPCP
a PCP Dimostreremo poi che MPCP indecidibile riducendo Ln a MPCP. Avremo allora
la prova che anche PCP indecidibile; se fosse decidibile, Io sarebbe anche MPCP. e
quindi anche Lu.
Data unistanza di MPCP con alfabeto , costruiamo unistanza di PCP Introduciamo
un nuovo simbolo, *, che nellistanza di PCP si interpone fra i simboli delle stringhe
dellistanza di MPCP. Ma nelle stringhe di A gli * seguono i simboli di , mentre in quelle
di B li precedono. C uneccezione: una nuova coppia, formata a partire dalla prima
420
Capitolo 9
i
0
1
2
3
4
Lista C
Lista D
Vi
*1*
1*
1*0*1*1*1*
1* 0 *
$
Zi
* 1 * 1*1
*1*1* 1
*1*0
*0
*s
421
Poich yo = *?/i &zo = I possiamo rimediare alla mancanza del simbolo * iniziale
sostituendo il primo indice con 0. Abbiamo ora
V o V i 1 V i 2 V i m = ZoZit z i 2 z im *
9.4.3
Completiamo la catena di riduzioni della Figura 9.11 riducendo L u a MPCP. Data una
coppia (M i W) dobbiamo cio costruire unistanza (/1,13) di MPCP tale che la TM M
accetta linput w se e solo sc ( A B) ha una soluzione.
Fulcro del ragionamento il fatto che listanza (A, B) di MPCP simula, nelle soluzio
ni parziali, la computazione di M su input w. Le soluzioni parziali sono dunque formate
422
Capitolo 9
Lista B
#9o
Questa coppia, da cui deve partire ogni soluzione, secondo le regole di MPCP, avvia
la simulazione di M su input w. Allinizio B precede A di una ID.
2. Ad ambedue le liste possiamo accodare simboli di nastro e il separatore #. Le
coppie
Lista A
X
#
Lista B
X
#
per ogni X in
QX
ZqX
Lista B
Yp
pZY
q#
Zq#
Y p#
pZY#
Lista A
se S(q, X ) = (p, F, R)
se S(q. X ) = (p, Y, L ); Z un simbolo di nastro arbitrario
se (q, f) = (p, K i?)
se <J(g, B) (p, Y, L)\ Z un simbolo di nastro
Come quelle del punto (2), queste coppie permettono di estendere la stringa di B
con la ID successiva, e di estendere la stringa di .4 in accordo con quella di B. Lc
coppie si servono dello stato per stabilire come cambia la ID corrente e generare
la successiva. 1 cambiamenti - nuovo stato, simbolo di nastro e spostamento della
testina - si riflettono nella ID accodata alla stringa di B.
4. Se la ID in coda alla stringa di B ha uno stato accettante, dobbiamo completare la
soluzione parziale. A tale scopo la estendiamo con ID che non sono vere ID di
Al, ma rappresentano quanto accadrebbe se lo stato accettante potesse consumare
i simboli di nastro ai suoi due lati. Se q uno stato accettante, per ogni X c Y,
simboli di nastro, esistono coppie:
Lista
XqY
Xq
qY
.4
Lista B
q
q
q
5. Infine, dopo aver consumato tutti i simboli di nastro, lo stato accettante resta da
solo come ultima ID nella stringa di B. Il residuo delle due stringhe (il suffisso
della stringa di B chc si deve accodare alla stringa di A per uguagliarla) </#. Per
completare la soluzione usiamo Tultima coppia:
Lista .4
Lista B
<?##
Nel seguito scriveremo coppie della regola (1), della regola (2), e cos via, per riferirci
ai cinque tipi di coppie fin qui generate.
Esempio 9.18 Convertiamo in unistanza di MPCP la TM
Al =
dove <5 definita da:
424
Capitolo 9
Qi
<5(g,0)
g
Q-2
gs
i,B )
( 2 4 , R)
(3)0, L )
% , i)
(g2 , o ; L)
(1,0.7?.)
Q2, L L )
(g2 ,0 , R)
----
----
e la stringa di input w = 01. Per semplificare, osserviamo che M non scrive mai blank,
c quindi B non compare mai nelle ID. Possiamo perci tralasciare le coppie relative a B.
La lista completa delle coppie riportata nella Figura 9.15, corredata della spiegazione
dellorigine di ogni coppia.
Regola
( 1)
(2 )
(3)
(4)
(5)
Lista A
Lista B
#
0
1
#
QiO
Ogil
Ig il
0g, #
igi #
Og2O
Ig2O
g2i
g2#
Og3O
Og3I
Ig3O
# g .o i#
0
1
#
ig3i
Ogs
ig3
gjO
3^
g3# #
Ig2
g200
g2J0
g20 i#
g2n #
g300
g3l0
Og1
Og2#
ga
Qi
Qi
Qi
Qi
Qi
Qi
Qi
#
Origine
da<5(gi,0) = (g2,l,/?.)
da 6{qi, 1) = (g2.0 ,L )
da <5(gi,l) = (g2,0 ,L )
da 6(qi, B) = (g2,1 ,L )
da'(gi,B ) = (g2, 1, L)
da Sfa-, 0) = (g3,0 ,L )
d a % 2,0) = (g3,0, L)
da ~(g2, 1) = ( 1 , 0 , / 2)
daS(q2.B ) = (g2, 0, R)
425
e porta a una soluzione. Come per ogni soluzione di MPCP dobbiamo partire dalla prima
coppia:
A: #
B: #(/,01#
C un solo modo di estendere la soluzione parziale: la stringa presa da A devessere un
prefisso del residuo t/iOl#. Dobbiamo quindi scegliere la coppia (</i0,1q2), una delle
coppie che simulano una mossa prese dalla regola (3). Ecco la soluzione parziale:
A: #</i0
B-. # in 0 1 # l
Possiamo estendere ulteriormente la soluzione parziale mediante le coppie della regola (2)
fino ad avere lo stato nella seconda ID. La soluzione parziale diventa:
.4 : #<7i 01 # l
B: # gi0 1 # l(fcl# 1
A questo punto possiamo usare unaltra coppia della regola (3) per simulare una mossa;
la coppia appropriata ( ^ l . Oyi ). Se nc ricava la soluzione parziale:
A: #flf,0 1 # l f t l
: #ji 0 1 # l< ftl# 1 0 9l
Ora potremmo usare le coppie della regola (2) per copiare i tre simboli successivi: #. 1
e 0. Ma spingersi tanto in l sarebbe un errore perch la mossa successiva di M sposta la
testina a sinistra, e lo 0 che precede lo stato serve alla successiva coppia della regola (3).
Perci copiamo solo i due simboli successivi, ottenendo una nuova soluzione parziale:
A: # 9 l 0 1 # lg2 l # l
: # f t 0 1 # l l # 10 i? i# l
La coppia della regola (3) da usare qui (Oc/i # , ^ O 1# ), che d la soluzione parziale
A: # f t 0 1 # lf t l# 1 0 q i #
B-. # 9 l 0 1 # l ( / 2 l # 1 0 yi # l ( 7 , 0 1 #
Possiamo ora usare unaltra coppia della regola (3), (l</2 0 , <7;i1 0 ), che porta allaccettazionc:
A: # qi01#lq2\#10qi#lq20
: # q i0 l# lq 2l# W qi# q 20 l# q 3l0
426
Capitolo 9
A questo punto ci serviamo di coppic della regola (4) per eliminare dalla ID tutti i simboli
tranne 73 . Ci servono anche coppie della regola (2) per copiare simboli. La soluzione
parziale prosegue cos:
Con il solo 73 nella ID possiamo usare la coppia (73 # # , # ) dalla regola (5) per comple
tare la soluzione:
A: # 7 1 # 7 21 # 1 0 7 # 7 201#7301 # 7 3 0 1 # 7 3 # 7 3 # #
# 7 i l # l 7 2l # 1 0 7 i # l 7 2 l # 7 : {1 0 1 # 7 3 l # 7 3 l # 7 3 # #
riduzione di MPCP a PCP stala dimostrata nel Teorema 9.17. La costruzione di questo
paragrafo spiega come ridurre L 11a MPCP. Completiamo la prova di indecidibilit di PCP
dimostrando la correttezza della costruzione, espressa dal seguente enunciato.
M accetta w se e solo se listanza derivata di MPCP ha una soluzione.
(Solo se) LEsempio 9.18 presenta lidea fondamentale. Se w in L(M ) possiamo partire
dalla coppia della regola (1) e simulare la computazione di M su w. Ci serviamo di una
coppia della regola (3) per copiare lo stato da ogni ID e simulare una mossa di M , e, se
necessario, delle coppie della regola (2) per copiare simboli di nastro e il separatore #. Se
M raggiunge uno stato accettante, attraverso le coppie della regola (4) e infine attraverso
la coppia della regola (5), la stringa di A raggiunge quella di B e forma una soluzione.
(Se) Dobbiamo provare chc, se listanza di MPCP ha soluzione, allora M accetta w.
Poich lavoriamo su MPCP ogni soluzione deve cominciare dalla prima coppia; una
soluzione parziale comincia cos:
A: #
B: # 7 0 w #
Finch non ci sono stali accettanti nella soluzione parziale, le coppic prese dalle regole (4)
e (5) sono inutili. Possiamo trattare gli stati e uno o due simboli adiacenti in una ID solo
con le coppie della regola (3); tutti gli altri simboli di nastro e # sono trattati da coppie
della regola (2). Perci, finch M non raggiunge uno stato accettante, tutte le soluzioni
parziali sono della forma
9.4.4
Esercizi
Eserczio 9.4.1 Indicate quali, fra le seguenti istanze di PCP, hanno una soluzione. Cia
scuna presentata sotto forma delle due liste A e B ; le -esime stringhe di due liste si
corrispondono per i = 1 ,2 ....
*a) A = (01,001,10); B = (011,10,00).
b) A = (01,001,10); B = (011,01,00).
c) A = (ab, a, be, c); B = (bc, ab, cn, a).
! Esercizio 9.4.2 Abbiamo dimostrato che PCP indecidibile sotto lipotesi che lalfabeto
sia arbitrario. Dimostrate che PCP indecidibile anche limitando lalfabeto a =
{0,1}, riducendolo a questo caso particolare.
! Esercizio 9.4.3 Supponiamo di limitare il PCP a un alfabeto di un simbolo come =
{0}. Anche questo caso ristretto del PCP indecidibile?
! Esercizio 9.4.4 Un Post tag system formato da un insieme di coppie di stringhe su
un alfabeto finito e da una stringa iniziale. Se (u?, x) una coppia e y una stringa
qualsiasi su , scriviamo wy h yx. In altri termini, in una mossa eliminiamo un prefisso
w dalla stringa corrente wy e aggiungiamo un suffisso x abbinato
a w. Come per le
*
derivazioni nelle grammatiche libere dal contesto, definiamo F come zero o pi passi di
K Dimostrate che, dato un insieme di coppie P e una stringa iniziale z, indecidibile se
z F e. Suggerimento: per ogni TM Al e input w, sia 2 la ID iniziale di Al con input w,
seguita da un simbolo separatore # . Scegliete le coppie P tali che ogni ID di M diventi
prima o poi la ID che segue dopo una mossa di Al. Se Al entra in uno stato accettante,
fate in modo che la stringa corrente possa essere cancellata, cio ridotta a c.
428
9.5
Capitolo 9
9.5.1
9.5.2
429
>
I W2O2I I Wk Cik
w.
/2
a.
/2
vv.
Im
a l.
m
430
Capitolo 9
Consideriamo laltra parte dellistanza assegnata di PCP, la lista B = .T1, x2, . . . . a?*.
Per questa lista sviluppiamo unaltra grammatica, G d -
431
(Solo se) Abbiamo gi osservato che una stringa terminale non pu avere pi di una
derivazione, n in G a n in G b -C quindi un solo caso in cui una stringa terminale ha
due derivazioni a sinistra in G a b - una di esse comincia da S => .4 e continua con una
derivazione in G a -mentre laltra comincia da S => B e continua con una derivazione
della stessa stringa in G d .
La stringa con due derivazioni ha una coda di indici am cIh Ciil per un m > 1.
Questa coda una soluzione dellistanza di PCP perch ci chc precede la coda nella
stringa con due derivazioni sia Wji Wh Wim sia Xi1Xh Xim.
9.5.3
Grazie a linguaggi liberi dal contesto come La per una lista A possiamo dimostrare lin
decidibilit di alcuni problemi relativi ai CFL. Ulteriori prove di indecidibilit per CFL
si ricavano dallo studio del linguaggio complemento La- Osserviamo che La formato
da tutte le stringhe sul lalfabeto U {, 2 ,..., & } che non sono in La, dove
lalfabeto di unistanza di PCP e gli a-, sono simboli distinti che rappresentano gli indici
delle coppie nellistanza di PCP.
Gli elementi interessanti di L a sono le stringhe formate da un prefisso in * ottenu
to per concatenazione di stringhe della lista .4, seguito da un suffisso di simboli indice
chc non combaciano con le stringhe scelte da A. Ma in L a ci sono anche molte strin
ghe che sono semplicemente malformate, nel senso che non appartengono al linguaggio
dellespressione regolare *( + 2 -I-- + a*)*
Sosteniamo che L a un CFL. A differenza di La , non facile scrivere una gramma
tica per L a , na possiamo definire un PDA deterministico che lo accetta. La costruzione
spiegala nel prossimo teorema.
Teorema 9.21 Se L a il linguaggio per la lista A, L a un linguaggio libero dal contesto.
DIMOSTRAZIONE Sia lalfabeto delle stringhe nella lista ,4 = wi, w.'2; ,Wjc e sia I
linsieme dei simboli indice I I a 1, 02, , Ufc} Descriviamo le operazioni del DPDA
P destinato ad accettare L a 1. Finch legge simboli in , P li mette sullo stack. Poich tutte le stringhe in *
sono in L a , P resta in stati accettanti.
2. Quando legge un simbolo indice in I, per esempio a, P toglie dallo stack per
verificare se i simboli alla sommit formano wf-, cio la stringa corrispondente
rovesciata.
(a) Se la risposta negativa, l'input letto fin qui, e ogni sua continuazione, in
L a -P si sposta in uno stato accettante in cui consuma il resto dellinput senza
mutare lo stack.
432
Capitolo 9
(b) Se u 'f stato tolto dallo stack, ina lindicatore di fondo stack non visibile,
P accetta ricordando nello stato che ora si aspetta solo simboli di J e che
potrebbe ancora leggere una stringa in L a , che non deve accettare. P ripete il
passo (2) finch la questione se linput sia in L a non risolta.
(c) Sc w f stato tolto dallo stack e lindicatore di fondo stack visibile, P ha
letto un elemento di L a , che non accetta. Ma poich nessuna continuazione
dellinput pu essere in L a , P si sposta in uno stato in cui accetta ogni input
futuro senza modificare lo stack.
3. Se, dopo aver letto uno o pi simboli di I, P legge un altro simbolo di , linput
non di forma tale da poter essere in L a - Dunque P si sposta in uno stato in cui
accetta linput corrente c ogni input futuro senza modificare lo stack.
Per dimostrare propriet di indecidibilit relative ai linguaggi liberi dal contesto, pos
siamo servirci di L a , Lb e dei loro complementi in vario modo. Nel prossimo teorema
sono riassunte alcune di queste propriet.
Teorema 9.22 Siano G i e G 2 grammatiche libere dal contesto e sia R unespressione
regolare. I problemi seguenti sono indccidibili.
a) L ( G i) D L ( G 2) = G?
b) L(G 1) = L(G2)I
c) L (G 1) = L(R)?
d) L(G i) = T* per un alfabeto T l
e) L (G 1) C L (G 2)?
O L ( B ) C L ( G 1)?
DIM OSTRAZIONE Ogni dimostrazione una riduzione da PCP Mostriamo come trasfor
mare unistanza (A, B) di PCP in una questione relativa alle CFG e alle espressioni re
golari la cui risposta s se e solo se listanza di PCP ha una soluzione. In alcuni casi
riduciamo PCP alla questione cos come labbiamo enunciata nel teorema; in altri casi
al complemento. 1 due modi si equivalgono perch se il complemento di un problema
indecidibilc, il problema stesso non pu essere decidibile, dal momento che i linguaggi
ricorsivi sono chiusi rispetto al complemento (Teorema 9.3).
Denoteremo con lalfabeto delle stringhe di questa istanza e con T l'alfabeto dei
simboli indice. Le riduzioni dipendono dal fatto chc L a , L#, L a ed L ^ hanno ciascuno
433
una CFG. Costruiremo le CFG o direttamente, come nel Paragrafo 9.5.2, o tramite il PDA
per i linguaggi complemento descritto nel Teorema 9.21 e la successiva trasformazione
del PDA in CFG (Teorema 6.14).
a) Siano L(Gi) = L a e L(Gz) = L r . Allora L(G 1) L(Gz) linsieme delle
soluzioni di questa istanza di PCP Lintersezione vuota se e solo se non ci sono
soluzioni. Tecnicamente abbiamo ridotto 1}CP al linguaggio delle coppie di CFG
con intersezione vuota; abbiamo cio dimostrato che il problema lintersezione di
due CFG non vuota? indecidibile. Ma, come abbiamo detto introducendo la
dimostrazione, mostrare che il complemento di un problema indecidibile equivale
a dimostrare che il problema stesso indccidibile.
b) Dato che le CFG sono chiuse per unione possiamo costruire una CFG Gi per La U
L]j. Poich ( U /)* un insieme regolare, possiamo senz'altro costruire una CFG
G -2 che lo genera. Vale La U Lti = La Lb- Quindi a L(G 1) mancano solo
le stringhe che rappresentano soluzioni dellistanza di PCP. A L(Gz) non manca
nessuna stringa in ( U 1)*. Dunque i loro linguaggi sono uguali se e solo se
listanza di PCP non ha soluzioni.
c) Si ragiona come in (b), ma li lespressione regolare ( U I)*.
d) Si deduce da (c) perch U T l'unico alfabeto di cui La U Ln pu essere la
chiusura.
e) Sia G\ una CFG per ( U I)* e Gz una CFG per L a U L b - Allora L(Gi) C
L(Gz) se e solo se L a U L b = ( U /)*, cio se e solo se listanza di PCP non ha
soluzioni.
f) Si ragiona come in (e), ma R lespressione regolare ( U /)* e L(Gy) La U
Lb -
9.5.4
Esercizi
Esercizio 9.5.1 Sia L linsieme delle grammatiche libere dal contesto (codificate) G tali
che L(G) contiene almeno una palindroma. Dimostrate che L indecidibile. Sugge
rimento: riducete PCP a L costruendo per ogni istanza di PCP una grammatica il cui
linguaggio contiene una palindroma se e solo se listanza di PCP ha una soluzione.
Esercizio 9.5.2 Dimostrate che il linguaggio L a U L r regolare se c solo se linsieme
di tutte le siringhe sul suo alfabeto, cio se e solo se listanza (A, B) di PCP non ha
soluzioni. Provate cos che indecidibile stabilire se una CFG genera un linguaggio
434
Capitolo 9
regolare. Suggerimento: supponete che PCP abbia una soluzione e che la stringa wx
manchi da L a U L b - dove w una stringa sull'alfabeto di questa istanza di PCP e x
l'inverso della relativa stringa di simboli indice. Definite lomomorfismo /?(()) = w e
/(1) = x. Che cos 1i~1(La U
Per dimostrare che La U Ln non regolare,
sfruttate il fatto che gli insiemi regolari sono chiusi rispetto a omomorfismo inverso e
complementazione insieme al pumping lemma degli insiemi regolari.
X
4. w X n
5. y Zti
6. x R non ci che la stringa di indici y genera secondo la lista B
7. w non ci chc la stringa di indici z
9.6
Riepilogo
Bibliografa
435
9.7
Bibliografia
436
Capitolo 9
stata scoperta in studi indipendenti da Cantor [2], Floyd [4J, e Chomsky e Schutzenberger
[31.
1. Y. Bar-Hillel, M. Perles. E. Shamir, On formal properties of simple phrase-strueturc
grammars, Z. Phonetik. Sprachwiss. Kommunikationsforsch. 14(1961). pp. 143
172.
2. D. C. Cantor, On the ambiguity problem in Backus systems, J. ACM 9:4 (1962),
p p . 477-479.
3. N. Chomsky, M. P. Schutzenberger, The algebraic theory of context-free langua
ges, Computer Programming and Formal Systems (1963), North Holland. Amster
dam, pp. 118-161.
4. R. W. Floyd, On ambiguity in phrase structure languages Communications of the
ACM 5:10 (1962), pp. 526-534.
5. S. Ginsburg, G. F. Rose, Some recursively unsolvable problems in ALGOL-like
languages, J. ACM 10:1 (1963), pp. 29-47.
6. M. L. Minsky, Recursive unsolvability of Posts problem of tag' and other topics
in the theory of Turing machines Annals of Mathematics 74:3 (1961), pp. 437455.
7. E. Post, A variant of a recursively unsolvable problem, Bulletin of the AMS 52
(1946), pp. 264-268.
8. H. G. Rice, Classes of recursively enumerable sets and their decision problems,
Transactions of the AMS 89 ( 1953), pp. 25-59.
9. A. M. Turing, On computable numbers with an application to the Entschcidungsproblem, Proc. London Math. Society 2:42 (1936), pp. 230-265.
Capitolo 10
Problemi intrattabili
Dopo aver visto chc cosa calcolabile, focalizziamo l'attenzione su che cosa lo in
modo efficiente. Ci occupiamo di problemi decidibili e ci chiediamo quali possono essere
computati da macchine di Turing chc impiegano tempo polinomiale nella dimensione
dellinput. Riprendiamo due punti importanti gi introdotti nel Paragrafo 8.6.3.
I problemi risolvibili in tempo polinomiale su un tipico computer coincidono con
quelli risolvibili in tempo polinomiale su una macchina di Turing.
L'esperienza ha mostrato che la distinzione tra problemi risolvibili in tempo po
linomiale e problemi che richiedono un tempo esponenziale o maggiore fondamentale. I problemi concreti che richiedono tempo polinomiale sono quasi sempre
risolvibili in un tempo accettabile, mentre quelli che richiedono tempo esponenziale
non possono generalmente essere risolti, fatta eccezione per istanze piccole.
In questo capitolo presentiamo la teoria dellintrattabilit, ossia le tecniche per dimo
strare che un problema non risolvibile in tempo polinomiale. Parliamo da un problema
specifico: la questione se un'espressione boolcana possa essere soddisfatta, cio se ha va
lore vero per un certo assegnamento dei valori di verit TRUE (vero) e FALSE (falso) alle
sue variabili. Questo problema svolge per i problemi intrattabili la stessa funzione che Lu
o PCP svolgono per i problemi indecidibili. Partiremo dal teorema di Cook, secondo
il quale la soddisfacibilit delle formule booleane non pu essere decisa in tempo poli
nomiale. Spiegheremo poi come ridurre questo problema a molti altri, di cui si dimostra
cos intrattabilit.
Poich il tema se i problemi possono essere risolti in tempo polinomiale, bisogna
cambiare il concetto di riduzione. Non basta pi. infatti, un algoritmo che trasforma
le istanze di un problema in istanze di un altro. Lalgoritmo stesso deve impiegare al
massimo un tempo polinomiale, altrimenti la riduzione non permette di concludere che il
438
Capitolo 10
problema di destinazione intrattabile, per quanto il problema sorgente lo sia. Nel primo
paragrafo introdurremo perci la nozione di riduzione polinomiale.
C unaltra distinzione importante tra gli enunciati che abbiamo ricavato nella teoria
dellindecidibilit e quelli che ricaveremo con la teoria dellintrattabilit. Le dimostrazio
ni di indecidibilit illustrale nel Capitolo 9 sono incontrovertibili; dipendono unicamente
dalla definizione di macchina di Turing e dalla matematica usuale. Per contro, i risultati
sui problemi intrattabili chc daremo qui si fondano tutti su unipotesi non dimostrata, ma
fortemente creduta, la cosiddetta ipotesi 'P M V .
Essa afferma che la classe dei problemi risolvibili da TM non deterministiche che
operano in tempo polinomiale include almeno alcuni problemi che non possono esse
re risolti da TM deterministiche operanti in tempo polinomiale (per quanto si accettino
gradi elevati del polinomio). Esistono letteralmente migliaia di problemi che sembrano
appartenere a questa categoria, visto che possono essere risolti facilmente da una NTM
in tempo polinomiale, mentre non conosciamo nessuna DTM (o, in modo equivalente,
nessun programma tradizionale) che li risolva in tempo polinomiale. La teoria dellintrat
tabilit ha una conseguenza importante: o quei problemi hanno tutti soluzioni polinomiali
deterministiche, e la cosa ci c sfuggita per secoli, oppure nessuno ne ha, cio richiedono
veramente un tempo esponenziale.
10.1
Le classi V ed H V
10.1.1
Diremo che una macchina di Turing M ha complessit in tempo T(n ) (o che ha tempo di
esecuzione T(n)) se, a fronte di un input w di lunghezza n, M si arresta dopo aver fatto
al massimo T (n ) mosse, a prescindere dal fatto chc accetti o no. La definizione si applica
a qualunque funzione T(n), come T(n) = Orr o T(n) = 3n + 5n 4; ci occuperemo
prevalentemente del caso in cui T(r) un polinomio in ??,. Diremo che un linguaggio L
nella classe V se esiste un polinomio T(n) tale che L = L (M ) per una TM deterministica
M di complessit in tempo T(n).
Le classi V ed AfV
439
10.1.2
Il lettore conosce probabilmente diversi problemi che hanno soluzioni efficienti, magari
per averli studiati in un corso di algoritmi e strutture dati. Questi problemi sono general
mente in 'P. Ne esamineremo uno: trovare un albero di copertura di peso minimo (MWST,
Minimum-Weight Spanning Tree) in un grafo.
In termini informali consideriamo i grafi comc diagrammi del tipo rappresentato nella
Figura 10.1. Ci sono nodi, qui numerati da 1 a 4, c lati tra alcune coppie di nodi. Ogni
lato ha un peso, che un intero. Un albero di copertura un sottoinsieme di lati tali
da connettere tutti i nodi, ma senza formare cicli. Un esempio di albero di copertura
illustrato nella Figura 10.1; si tratta dei tre lati disegnati con un tratto pi spesso. Un
albero di copertura si dice di peso minimo se il peso totale dei suoi lati il pi piccolo fra
tutti gli alberi di copertura.
Un noto algoritmo greedy, detto algoritmo di Kruskal1, serve a trovare un MWST. Ne
riassumiamo le caratteristiche fondamentali.
1. Per ciascun nodo si conserva la componente connessa di cui fa parte rispetto ai lati
delTalbcro selezionati finora. Inizialmente nessun lato selezionato, per cui ogni
nodo forma da solo una componente connessa.
1J. B. Kruskal Jr., On the shortest
Pme. AMS 7:1 ( 1956). pp. 48-50.
spanning subtree
of
problem,
440
Capitolo 10
Figura 10.1 Un grafo; i tratti pi spessi indicano un albero di copertura di peso minimo.
2. Si considera uno dei lati di peso minimo non ancora esaminati, scegliendolo arbi
trariamente. Se questo lato unisce due nodi in componenti connesse diverse:
(a) si seleziona il lato, che far parte dellalbero di copertura
(b) si riuniscono le due componenti connesse coinvolte, associando a ogni loro
nodo lo stesso numero identificativo della componente connessa.
Se invece il lato selezionato unisce due nodi della stessa componente, esso non
appartiene allalbero di copertura perch darebbe vita a un ciclo.
3. Si continua a considerare nuovi lati finch si sono esaminati tutti, o fino a quando
il numero di lati selezionati c pari al numero di nodi meno uno. Nel secondo caso
tutti i nodi devono gi trovarsi in una componente connessa, e si pu evitare di
esaminare altri lati.
Esempio 10.1 Nel grafo della Figura 10.1 consideriamo in primo luogo il lato (1,3),
che ha il peso pi basso, 10. Poich 1 e 3 sono inizialmente in componenti diverse, lo
accettiamo e facciamo s che 1 c 3 abbiano lo stesso numero di componente, per esempio
componente 1. Il lato successivo nellordine di peso (2,3), con peso 12. Poich 2
e 3 sono in componenti diverse, lo accettiamo e uniamo il nodo 2 alla "componente 1.
Il terzo lato (1,2), con peso 15. 1 c 2 per si trovano ora nella stessa componente,
per cui lo rifiutiamo e procediamo con il quarto, (3,4). Dato che 4 non si trova nella
componente 1, lo accettiamo. A questo punto abbiamo tre lati nellalbero di copertura
di un grafo di 4 nodi e possiamo quindi fermarci.
E possibile implementare questalgoritmo (usando un computer, non una macchina
di Turing) e avere, per un grafo di m nodi ed e lati, un tempo di esecuzione 0 (m -I-
Le classi V ed M'P
441
442
Capitolo 10
Esempio 10.2 Esaminiamo una possibile codifica per i grafi e i limiti di peso che potrebbe
costituire linput per il problema MWST. La codifica usa cinque simboli: 0,1, le parentesi
sinistra e destra, c la virgola.
1. Attribuiamo ai nodi gli interi da 1 a m.
2. Iniziamo la codifica con il valore di m in binario e il limite di peso W in binario
separati dalla virgola.
3. Se esiste un lato tra i nodi i e j con peso w, collochiamo (i, j, w) nella codifica. Gli
interi i, j e w sono rappresentati in binario. Lordine di i e j entro un lato e l'ordine
dei lati allinterno della codifica sono irrilevanti.
Una possibile codifica per il grafo della Figura 10.1 e il limite W = 40
100, 101000( 1, 10, 1111) ( 1, 11, 1010) ( 10, 11, 1100) ( 10, 100. 10100) ( 11, 100. 10010)
Se rappresentiamo gli input del problema MWST come nellEsempio 10.2, un input di
lunghezza n pu rappresentare al massimo ()(n/ log n) lati. Se i lati sono pochi, il numero
di nodi m pu essere esponenziale in ri. Ma se il numero di lati e non almeno ni 1, il
grafo non pu essere connesso, e dunque non avr alcun MWST, indipendentemente dai
lati. Di conseguenza, se il numero di nodi non almeno una ccrta frazione di n f logn,
non c bisogno di eseguire lalgoritmo di Kruskal; diciamo semplicemente no, non
esiste alcun albero di copertura di questo peso.
Perci, se abbiamo un limite superiore, espresso come funzione di m ed a, al tempo
di esecuzione dellalgoritmo di Kruskal. per esempio il limite 0(e(m. + e)) sviluppato
in precedenza, possiamo sostituire per prudenza sia m sia a con n, e dire che il tempo
di esecuzione, come funzione della lunghezza di input n, 0 (n (n + r?)), cio 0 (n 2).
In effetti c unimplemcntazione migliore dcHalgoritmo di Kruskal che richiede tempo
0 (n log n), ma in questa sede non ce ne occupiamo.
Dobbiamo tener conto che usiamo una macchina di Turing come modello di compu
tazione, mentre lalgoritmo descritto destinato a essere realizzato in un linguaggio di
programmazione con strutture dati come gli array e i puntatori. Affermiamo per di poter
implementare quella versione deHalgoritmo di Kruskal su una TM multinastro in O (rr)
passi. Descriviamo l'impiego dei nastri supplementari.
I. Un nastro memorizza i nodi e i loro numeri di componente correnti. La lunghezza
della tabella 0(n).
Le classi V cd.V P
443
2. Mentre percorriamo i lati sul nastro di input un altro nastro contiene il peso del
lato che al momento c il pi piccolo tra i lati che non sono marcati come usati.
Possiamo impiegare una seconda traccia del nastro di input per indicare i lati se
lezionati come lati residui di minor peso nei passi precedenti del lalgoritmo. La
ricerca del lato residuo di peso minimo richiede tempo 0(n), perche ciascun lato
viene preso in considerazione una sola volta e i confronti di peso possono essere
fatti percorrendo, da destra a sinistra, i numeri binari.
3. Quando un lato viene selezionato in un passo, collochiamo i suoi due nodi su un
nastro e ne cerchiamo le componenti nella tabella dei nodi e componenti. L'opera
zione richiede tempo 0(n).
4. Un nastro contiene le due componenti, i e j, che devono essere riunite quando si
scopre chc un lato collega due componenti precedentemente non connesse. Percor
riamo la tabella di nodi e componenti, e a ogni nodo chc si trova nella componente i
associamo j come nuovo numero di componente. Anche questoperazione richiede
tempo 0(n).
Il lettore dovrebbe essere in grado di completare da solo il ragionamento per cui un passo
pu essere eseguito in tempo 0 (n ) su una TM multinastro. Poich il numero di passi
al massimo n , concludiamo chc un tempo 0(ri2) sufficiente per una TM multinastro.
Sfruttiamo ora il Teorema 8.10, secondo il quale tutto ci che una TM multinastro pu fare
in $ passi pu essere fatto da una TM a nastro singolo in 0 (s 2) passi. Di conseguenza,
se la TM multinastro fa 0(ri2) passi, possiamo costruire una TM a nastro singolo che fa
altrettanto in (( 2)2) = () passi. Concludiamo che la versione s/no del problema
MWST, ossia il grafo ha un MWST di peso totale non superiore a WT' , in V.
10.1.3
Nello studio dell'intrattabilit una classe fondamentale di problemi quella dei problemi
risolvibili da una TM non deterministica in tempo polinomiale. In termini formali diremo
che un linguaggio L nella classe M V (polinomiale non deterministica) se esiste una TM
non deterministica M c una complessit polinomiale in tempo T(n) tale che L = L(M )
e che, quando a M viene dato un input di lunghezza n, in M non ci sono sequenze di
mosse pi lunghe di T(n).
La prima osservazione che V C ArV, dato che ogni TM deterministica una TM
non deterministica senza possibilit di scelta fra mosse. Sembra per che j W conten
ga molti problemi non in V. Intuitivamente questo accade perch una NTM che opera
in tempo polinomiale ha la capacit di congetturare un numero esponenziale di solu
zioni possibili al problema e controllarne ciascuna in tempo polinomiale, in parallelo.
Osserviamo tuttavia:
444
Capitolo 10
10.1.4
Per avere unidea della portata di ArV, consideriamo un esempio di problema che sembra
essere in ArV ma non in V : il problema de! commesso viaggiatore (TSP. Traveling Side
sman Problem). L'input di TSP uguale a quello di MWST: un grafo con pesi interi sui
lati, come nella Figura 10.1, e un limite di peso W . La domanda se il grafo abbia un
circuito hamiltoniano di peso totale non supcriore a W . Un circuito hamiltoniano un
insieme di lati che connettono i nodi in un unico ciclo in cui ogni nodo figura una sola
volta. Osserviamo che il numero dei lati di un circuito hamiltoniano deve coincidere con
il numero di nodi del grafo.
Esempio 10.3 II grafo della Figura 10.1 ha un solo circuito hamiltoniano: il ciclo (1,2.4,
3 .1). Il suo peso totale c 15 + 20 + 18 + 10 = 63. Pertanto, se W 63 o pi, la risposta
s; se W < 63 la risposta no.
Lc classi V ed M V
445
Il TSP per grafi di quattro nodi ingannevolmente semplice, dato che non possono
mai esistere pi di due circuiti hamiltoniani diversi, salvo che per il nodo iniziale c per la
direzione in cui li percorriamo. In grafi di rn nodi il numero di cicli distinti cresce come
0(m l), il fattoriale di rn, che pi di 2<:,n per qualunque costante c.
Qualsiasi modo di risolvere il TSP comporta apparentemente lesame di tut i cicli
e il calcolo, per ognuno, del peso totale. In realt si possono tralasciare alcune scelte
palesemente sbagliate; in ogni caso, se siamo sfortunati nellordine in cui prendiamo
in esame i cicli, sembra necessario esaminarne un numero esponenziale prima di poter
concludere che nessun ciclo rispetta il limite di peso W o di trovarne uno.
D altra parte, se avessimo un computer non deterministico, potremmo scegliere una
permutazione dei nodi e computare il peso totale del ciclo corrispondente. Sc l'input
fosse di lunghezza n, nessuna diramazione richiederebbe pi di 0(r) passi. Su una NTM
multinastro possibile scegliere una permutazione in 0 (n 2) passi c calcolare il suo peso
totale in un tempo analogo. Di conseguenza una NTM a nastro singolo pu risolvere il
TSP in un tempo massimo 0 (n 4). La conclusione chc il TSP in M V .
10.1.5
Riduzioni polinomiali
La tecnica principale chc adottiamo per dimostrare che un problema P2 non pu essere
risolto in tempo polinomiale (cio chc P2 non in V) la riduzione di un problema P\,
che si sa non essere in V , a P2.2 Il metodo illustrato nella Figura 8.7, riprodotta come
Figura 10.2.
446
Capilolo IO
semplice esistenza dellalgoritmo etichettato Costruzione nella Figura 10.2 non basta
per a dimostrare lenunciato.
Supponiamo, per esempio, chc quando riceve in input unistanza di P1 di lunghezza
in, lalgoritmo produca una stringa di output di lunghezza 2m, che viene passata allal
goritmo ipotetico in tempo polinomiale per P2 . Se lalgoritmo di decisione impiega un
tempo 0 (n k), su un input di lunghezza 2m il suo tempo di esecuzione sarebbe 0(2km),
chc esponenziale in m. Di conseguenza, quando allalgoritmo di decisione per Pi viene
dato un input di lunghezza m, esso impiega un tempo esponenziale in rn. Si tratta di dati
perfettamente coerenti con la situazione in cui P 2 in P e P 1 non in V.
Anche se lalgoritmo che costruisce unistanza di P2 da unistanza di P produce
sempre un'istanza polinomiale nella dimensione dellinput, non detto che si giunga alla
conclusione desiderata. Per esempio supponiamo chc listanza di P> costruita sia della
stessa dimensione, rn, dellistanza Pi, ma che lalgoritmo di costruzione impieghi un
tempo esponenziale in rn, poniamo 0 (2 m). Un algoritmo di decisione per P2 che impiega
tempo polinomiale 0 ( n k ) su input di lunghezza n comporta lesistenza di un algoritmo
di decisione per P1 chc impiega tempo 0(2m + m k) su input di lunghezza m. Questo
limite sul tempo di esecuzione considera il fatto che bisogna compiere la traduzione a P2
oltre a risolvere l'istanza di P2. Anche qui possibile che P 2 sia in P e Pi no.
Il vincolo che dobbiamo porre alla traduzione da P1 a P2 che richieda un tempo
polinomiale nella lunghezza dell'input. Osserviamo che se la traduzione impiega tempo
0(mP) su input di lunghezza m, listanza di P2 non pu essere pi lunga del numero di
passi compiuti, cio al massimo cm? per una costante c. Possiamo ora dimostrare che se
P 2 in V, lo anche P\.
Per la dimostrazione supponiamo di poter decidere lappartenenza a Po di una stringa
di lunghezza n in tempo 0 (n k). Allora possiamo decidere lappartenenza a P i di una
stringa di lunghezza rn in tempo 0 ( m J + (cm,J )fc); il termine rnJ corrisponde al tempo
per la traduzione e il termine (cmP)k al tempo per decidere listanza risultante di P2.
Semplificando lespressione vediamo che P 1 pu essere risolto in tempo 0 (m J + cmik).
Poich c, j c k sono costanti, il tempo polinomiale in rn, c deduciamo che P 1 in V.
Per questi motivi, nella teoria del lintrattabilit useremo solo riduzioni polinomiali.
Una riduzione da P1 a P2 polinomiale se il tempo impiegato un polinomio nella
lunghezza dell'istanza di P i . Ne segue che la lunghezza dellistanza di P2 un polinomio
nella lunghezza dellistanza di P1.
10.1.6
Problemi NP-compIeti
Ci occupiamo ora di una famiglia di problemi composta dai pi noti candidati ad apparte
nere a M V ma non a V. Sia L un linguaggio (problema). Diciamo che L NP-completo
se i seguenti enunciati sono veri.
I. L in M V .
Le classi V ed M V
447
d im o s t r a z io n e
448
Capitolo 10
Problemi NP-hard
Alcuni problemi L sono cos "ardui (hard) che, sebbene sia possibile dimostrare
la condizione (2) della definizione di NP-completezza (ogni linguaggio in M V
si riduce a L in tempo polinomiale), non possiamo dimostrare la condizione (1):
che L in M P. In questo caso chiameremo L NP-hard. In precedenza abbiamo
usato il termine informale intrattabile in relazione a problemi che sembrano
richiedere tempo esponenziale. L'uso di intrattabile in luogo di NP-hard
generalmente accettabile, anche se in principio potrebbero esserci problemi che
richiedono tempo esponenziale pur non essendo NP-hard in senso formale.
Una dimostrazione che L NP-hard basta per indicare che L richiede molto
probabilmente un tempo esponenziale o superiore. Se per L non in JV'V, la sua
difficolt non utile a dimostrare chc tutti i problemi NP-completi sono difficili.
In altre parole pu valere V = A rV. anche se L richiede tempo esponenziale.
10.1.7
Esercizi
Esercizio 10.1.1 Determinate lMWST del grafo ottenuto modificando ipesi nella Figu
ra 10.1 come indicato qui sotto.
* a) Modificate da IOa 25 il peso del lato (1.3).
b) Modificate in 16 il peso del lato (2,4).
Esercizio 10.1.2 Qual il circuito hamiltoniano di peso minimo del grafo ottenuto ag
giungendo alla Figura 10.1 un lato di peso 19 tra i nodi 1 e 4?
Esercizio 10.1.3 Supponiamo che esista un problema NP-complcto con una soluzione
deterministica che impiega un tempo 0 (n log^,l). Osserviamo chc questa funzione si col
loca tra i polinomi c gli esponenziali, e non si trova in nessuna delle due classi di funzioni.
Che cosa potremmo dire del tempo di esecuzione di un problema arbitrario in M V l
Esercizio 10.1.4 Considerale i grafi i cui nodi sono i punti a coordinate intere di un cubo
a n dimensioni di lato ni, cio i vettori (i, 2 , . . . , i), dove ogni
compreso tra 1 ed
m. Due nodi sono uniti da un lato se e solo se differiscono di uno in esattamente una
dimensione. Per esempio il caso n = 2 e m = 2 un quadrato, n = 3 e m = 2 un cubo,
mentre n = 2 e m = 3 il grafo rappresentato nella Figura 10.3. Alcuni di questi grafi
hanno un circuito hamiltoniano e aliri no. Per esempio il quadrato ne ha evidentemente
uno, cos come il cubo, sebbene non tanto evidente. Un ciclo (0.0,0), (, 0.1), (0.1,1),
Le classi V ed A V
449
(0,1. 0), ( 1, 1,0), (1,1,1), (1 .0 ,1), (1, 0.0), e ritorno a (0,0,0). La Figura 10.3 non ha
alcun circuito hamiltoniano.
a) Dimostrate chc la Figura 10.3 non ha alcun circuito hamiltoniano. Suggerimento:
considerate che cosa succede quando un circuito hamiltoniano ipotetico passa at
traverso il nodo centrale. Da dove pu venire e verso dove pu andare senza tagliar
via una parte del grafo dal circuito hamiltoniano?
b) Per quali valori di j ed rn esiste un circuito hamiltoniano?
Esercizio 10.1.5 Supponete di avere una codifica delle grammatiche libere dal conteste
in un alfabeto finito fissato. Considerate i due linguaggi seguenti.
I. L i = {(7./1, D) I G una CFG (codificata), A e B sono variabili (codificate) d
G e gli insiemi di stringhe terminali derivate da .4 e B sono identici}.
2. L 2 = {(G , G 2) I G\ c G 2 sono CFG (codificate) c L (G i ) = L (G 2)).
450
Capitolo 10
Un problema NP-completo
10.2
451
Un problema NP-completo
Presentiamo ora il primo problema NP-completo: decidere se unespressione booleana soddisfacibile. Ne dimostriamo lNP-complctezza riducendo esplicitamente il lin
guaggio di qualunque TM non deterministica polinomiale in tempo al problema della
soddisfacibilit.
10.2.1
452
Capitolo IO
che T Yunico assegnamento di valori di verit chc soddisfa lespressione, perch le altre
sette combinazioni di valori per le tre variabili danno allespressione il valore falso (0).
Come ulteriore esempio consideriamo lespressione E = x A (-cc V y) A -<y.
Sosteniamo che E non soddisfacibile. Poich esistono solo due variabili, il numero di
assegnamenti di valori di verit 22 = 4; il lettore pu facilmente provarli tutti e verificare
che E ha sempre valore 0. Possiamo per anche ragionare in altro modo. E vera solo se
tutti e tre i termini composti per mezzo di sono veri. Ci significa che . dev'essere vera
(per il primo termine) e y devessere falsa (per lultimo termine). Ma rispetto a questo
assegnamento di valori di verit il termine mediano ->x V y falso. Di conseguenza E
non pu essere verificata ed quindi insoddisfacibile.
Abbiamo visto un esempio in cui un'espressione ha un solo assegnamento di valori
di verit soddisfacente e un esempio in cui non ne ha nessuno. Ci sono anche molti
esempi in cui un'espressione ha pi di un assegnamento soddisfacente. Per esemplificare
consideriamo F = x V ->y. 11 valore di F 1 per tre assegnamenti:
1. T 1 (X) = I t T l (V) = I
2. T2(X) = I, T2( V ) = O
3. T3(x) = 0. T3(y) = 0.
10.2.2
Un problema NP-completo
453
bassi. Per esempio non useremo x5 se nella stessa espressione non compaiono anche le
variabili da :ri a x.
Dal momento che in unespressione booleana pu esserci, in linea di principio, un nu
mero infinito di simboli, dobbiamo ideare un codice con un alfabeto finito per rappresen
tare espressioni con un numero arbitrariamente grande di variabili. Solo allora possiamo
parlare del SAT come di un problema, ossia come di un linguaggio su un alfabeto fisso
formato dalle codi fiche delle espressioni booleane soddisfacibili. Descriviamo il codice
di cui faremo uso.
1. I simboli , V,
x l A -(10 V x l l )
10.2.3
Dimostriamo ora il teorema di Cook, secondo il quale SAT NP-completo. Per dimo
strare che un problema NP-completo, dobbiamo in primo luogo provare che in M V .
Dobbiamo poi dimostrare chc ogni linguaggio in M V si riduce al problema in questione.
454
Capitolo 10
Per la seconda parte ci serviamo prima di una riduzione polinomiale da un altro problema
NP-completo. poi del Teorema 10.5. Ma per ora non conosciamo alcun problema NPcompleto da ridurre a SAT. Pertanto Tunica strategia disponibile consiste nel ridurre ogni
problema in AfV a SAT.
Teorema 10.9 (Teorema di Cook) SAT NP-completo.
d im o s t r a z io n e
facile.
1. Sfruttiamo il non determinismo delle NTM per tentare assegnamenti di valori di
verit per lespressione data E. Se la E codificata ha lunghezza n, allora il tem
po 0 (n ) sufficiente su una NTM multinastro. Osserviamo che la NTM ha di
verse scelte e alla fine del tentativo pu raggiungere fino a 2 ID distinte. Ogni
diramazione rappresenta il tentativo di un diverso assegnamento di valori di verit.
2. Valutiamo E per lassegnamento di valori di verit T. Se E(T) 1. accettia
mo. Osserviamo che questa parte deterministica. Il fatto che altre diramazioni
della NTM possano non condurre allaccettazione non ha effetto sul risultato: per
accettare basta un solo assegnamento soddisfacente di valori di verit.
La valutazione pu essere fatta facilmente in tempo 0 (n 2) su una NTM multinastro.
Di conseguenza lintero riconoscimento di SAT da parte della NTM multinastro richie
de tempo 0 ( n 2). La conversione in una NTM a nastro singolo pu elevare il tempo al
quadrato, per cui un tempo 0 (r [) sufficiente su una NTM a nastro singolo.
Dobbiamo ora dimostrare la parte difficile: se L un qualsiasi linguaggio in AfV,
esiste una riduzione polinomiale di L a SAT. Possiamo assumere chc esistano una NTM
a nastro singolo Al e un polinomio p(n ) tale chc M non impiega pi di p(n) passi su
un input di lunghezza n, lungo qualunque diramazione. Oltre a ci, le restrizioni del
Teorema 8.12, chc abbiamo dimostrato per le DTM, valgono anche per le NTM. Quindi
possiamo assumere che Al non scriva mai un simbolo blank e non muova mai la testina a
sinistra della sua posizione iniziale.
Perci, se Al accetta un input w e |?/;| = n , esiste una sequenza di mosse di Al tale
che:
1. ao la ID iniziale di Al con input w
Capitolo 10
456
tt 0
rti
Xoo
Xio
Xoi
X ll
...
+l
Xp(n).f)
p{n)
Xq.p(h)
x I,p(n)
X iJ- I
X i+1,.7-1
a-i
ctIiM
...
X iJ
X j+ 1 J
XiJ+ 1
X i+ lJ + 1
Xp(n), 1
Xp(n),p(n)
VoOq0
A V o . p ( n ) . B
Un problema NP-completo
457
458
Capitolo 10
a) lo stato di a non nella posizione j (cio X j non uno stato);
h) se lo stato di 0 non adiacente alla posizione j (cio X i j - 1 e X i j + 1 non
sono degli stati), allora X +i j = X ij Quando lo stato adiacente alla posizione j , la correttezza della posizione j
garantita da A ij- 1 o da A ij+ 1 .
B ij
Le prime due righe garantiscono che Bii vera quando lo stalo di a. adiacente alla
posizione j. Le prime tre righe insieme garantiscono chc, se lo stato di
alla posizione
j , allora B lj falsa, e quindi Ni vera solo se AiJ vera, cio se la mossa lecita.
Sc lo stato dista almeno due posizioni da jf, le due ultime righe indicano che il simbolo
non deve cambiare. Lultima riga afferma che X j = X +i j specificando che entrambi
devono essere Zj o Z, e cos via.
Esistono due importanti casi particolari: j = O e j = p(n). Nel primo caso non ci
sono variabili V ij-,, nellaltro non ci sono variabili yij+\,. Sappiamo per che la
testina non si muove inai a sinistra della sua posizione iniziale, e sappiamo che non ha il
tempo di raggiungere pi di p(n) celle a destra del punto da cui partita. Di conseguenza
possiamo eliminare certi termini da B i0 e
Lasciamo la semplificazione al lettore.
Consideriamo ora le espressioni Aijt chc rispecchiano le possibili relazioni tra gli
elementi del rettangolo 2 x 3 di simboli nellarray della Figura 10.4: X iJ - X j , X iJ+ 1,
X +i j e
. Diremo che un assegnamento di simboli a queste variabili
valido se:
1. X ij uno stato, ma X i j - 1 e X i j + 1 sono simboli di nastro
2. c una mossa di M per effetto della quale Xij-\XijXij+\ diventa
Sc invece S(q. A) contiene (p. (7, R) (la mossa la stessa, ma la testina si muove verso
destra), lassegnamento valido corrispondente formato da X i j X i j X i j +i = DqA e
X +ijX.i-ij+i = D C p. Il termine per questo assegnamento valido
V i , j - l , D A y*,j,q A Vi.j+l.A A y-i i l,j l, D A
l,j,C A Vi+l,j+l,p
Ajj lOR di tutti i termini validi. Nei casi speciali j = O e j = p(n) bisogna
apportare alcune modifiche per tener conto che le variabili yijz non esistono per j < Oo
j > p(n), comc abbiamo fatto per B jj . Infine
E m ,w = S A' A F
come una funzione sia di M sia di w, ma solo S (la parte avvio corretto) dipende da ?/;,
e solo in modo diretto (w sul nastro della ID iniziale). Le altre par ti, N ed F, dipendono
solo da M e da n, la lunghezza di ?/>.
Quindi per ogni NTM M che gira in un tempo polinomiale p(n) possiamo ideare un
algoritmo che prende un input w di lunghezza n e produce E m ,w II tempo di esecuzione
del lalgoritmo su una TM deterministica multinastro ( 2()), c possiamo convertire
IaTM in una TM a nastro singolo che impiega un tempo 0 ( p d(n )). L'output dell'algorit
mo unespressione booleana E m ,w soddisfacibile se e solo se M accetta tv entro p(n)
mosse.
460
Capitolo 10
Per sottolineare limportanza del Teorema di Cook 10.9, vediamo come applicargli
il Teorema 10.5. Supponiamo che esista una TM deterministica in grado di riconoscere
le istanze di SAT in tempo polinomiale, poniamo q(n). Allora ogni linguaggio accettato
da una NTM Af in tempo polinomiale p(n) sarebbe accettato in tempo polinomiale dalla
DTM schematizzata nella Figura 10.5. Linput w di Af viene convertito in unespressione
booleana E m ,w, che viene passata al verificatore di SAT. Il nuovo algoritmo d per w la
stessa risposta del verificatore su E m ,wConvertitore
in tempo
polinomiale
M.w
SI
per M
10.2.4
Esercizi
461
c) G contiene una clique di dimensione 3, ossia un insieme di tre nodi tale chc ogni
coppia di quei nodi c unita da un lato (cio un triangolo nel grafo).
d) G contiene almeno un nodo isolato, cio un nodo senza lati adiacenti.
10.3
10.3.1
462
Capitolo 10
10.3.2
Due espressioni booleane si dicono equivalenti se danno lo stesso risultato per ogni asse
gnamento di valori di verit alle variabili. Ovviamente, se due espressioni sono equivalen
ti, o sono entrambe soddisfacibili o nessuna delle due lo . Perci un metodo promettente
per ricavare una riduzione polinomiale da SAT a CSAT consiste nel convertire espressioni
arbitrarie in espressioni equivalenti in CNF. Questa riduzione dimostrerebbe che CSAT
NP-completo.
La questione non per semplicissima. vero che possiamo convertire in CNF
qualsiasi espressione, ma la riduzione pu richiedere un tempo pi che polinomiale.
In particolare pu far crescere esponenzialmente la lunghezza dellespressione, e quindi
richiedere tempo esponenziale per generare il risultato.
Per fortuna convertire unespressione booleana arbitraria in un'espressione in CNF
solo uno dei modi di ridurre SAT a CSAT, e cos provare che CSAT NP-completo. In
realt sufficiente convertire unistanza E di SAT in un'istanza F di CSAT in modo che
F sia soddisfacibile se e solo se E lo . Non necessario chc E ed F siano equivalenti.
Non neppure necessario chc E ed F abbiano le stesse variabili; in generale, anzi, le
variabili di E saranno un sottoinsieme di quelle di F.
463
La riduzione di SAT a CSAT si articola in due tempi. Dapprima tutti i ->vengono spinti
verso il basso dell'albero del lespressione finch le negazioni si applicano solo a singole
variabili. Lespressione booleana diventa un AND e OR di letterali. Questa trasforma
zione produce unespressione equivalente e richiede un tempo al pi quadratico nella
lunghezza dellespressione. Un programma concreto, con strutture dati ben congegnate,
impiega un tempo lineare.
In un secondo tempo scriviamo un'espressione composta di AND e OR di letterali
comc prodotto di clausole, cio in CNF. Riconcndo a nuove variabili possiamo compiere
la trasformazione in un tempo polinomiale nella lunghezza dell'espressione data. In ge
nerale la nuova espressione F non equivalente a quella originale E, ma soddisfacibile
se e solo se lo E. Pi esattamente, se T un assegnamento di valori di verit che rende
E vera, esiste un 'estensione S di T che rende F vera. Diciamo che S un'estensione di
T se assegna gli stessi valori di T alle variabili di T: S pu assegnare un valore anche a
variabili assenti da T.
11 primo passo consiste nello spingere i -> sotto gli e gli V. Ci servono tre regole.
1. ->(E A F) => ->(") V
Questa regola, una delle leggi di DeMorgcm,
permette di spostare i ->sotto gli , e ha leffetto di mutare un in V.
2. -( V F') => -'(E) A ~'(F). Laltra legge di DeMorgan sposta il ->sotto lV, con
leffetto di mutare lV in .
3. ->(->()) => E. La legge della doppia negazione cancella una coppia di ->applicati
alla stessa espressione.
Esempio 10.11 Consideriamo lespressione E = ->^(->(;r + y))(x + y)j. Abbiamo qui
mescolato le due notazioni, con loperatore -> esplicito quando lespressione da negare
464
Capitolo 10
Espressione
Regola
& + y + (-(*))
x + y + xy
(D
(3)
(2)
(3)
Figura 10.6 Spostamento dei -> verso i letterali in fondo all'albero di unespressione.
non una semplice variabile. La Figura 10.6 illustra i passi che spostano in basso i
dellespressione E fino ad applicarli direttamente ai letterali.
Lultima espressione, equivalente alloriginale, una combinazione di letterali con
AND e OR. Potremmo semplificarla ancora e ridurla a x + y, ma questo non incide sul
lipotesi che ogni espressione si pu riscrivere in modo chc i -> figurino solo nei letterali.
465
10.3.3
NP-completezza di CSAT
466
Capitolo IO
Descrivere algoritmi
Formalmente il tempo di esecuzione di una riduzione quello necessario a ese
guirla su una macchina di Turing mononastro, ma gli algoritmi di questo tipo
sono inutilmente complessi. Sappiamo che i problemi risolvibili in tempo poli
nomiale su computer ordinari, su TM multinastro, o su TM mononastro sono gli
stessi, anche se il grado dei polinomi pu variare. Perci, nel descrivere algoritmi
sofisticati per ridurre un problema NP-completo a un altro, stabiliamo di misurare
i tempi rispetto a implementazioni efficienti su un normale computer. In questo
modo possiamo tralasciare dettagli sul trattamento dei nastri per mettere in luce
le idee algoritmiche pi importanti.
DIMOSTRAZIONE Spieghiamo come rid u rre SAT a CSAT in tempo polinomiale. Appli
chiamo anzitutto il metodo del Teorema 10.12 per convertire unistanza di SAT in une
spressione E con tutti i - nei letterali. Spieghiamo poi come trasformare E in un'espres
sione F in CNF in tempo polinomiale e provare che F soddisfacibile se e solo se lo
E. F si costruisce per induzione sulla lunghezza di E e soddisfa una propriet pi forte
di quella che ci serse. Dimostriamo, per induzione sul numero di simboli presenti in E
(la sua lunghezza), lenunciato seguente.
Esiste una costante c tale che, se E unespressione booleana di lunghezza n in cui
i -> compaiono solo nei letterali, c unespressione F con le seguenti propriet.
a) F in CNF ed formata da non pi di n clausole.
b) F si pu costruire da E in tempo non supcriore a c\E\.
c) Un assegnamento di valori di verit T per E rende E vera se e solo se c
unestensione S di T che rende F vera.
BASL Se E consiste di uno o due simboli, un letterale. Ma un letterale una clausola,
dunque E gi in CNF.
INDUZIONE Assumiamo che ogni espressione pi breve di E si possa convertire in un
467
disgiunle, tranne che per le variabili chc figurano in E. Se dobbiamo introdurre nuove
variabili in F i o in F 2, le scegliamo diverse dalle altre.
tivamente T2) come T, ma limitato alle variabili di F 1 (risp. E2). Con S\ (risp. S2)
denotiamo S ristretto alle variabili di F 1 (risp. F2). Allora Si e unestensione di T1 ed S2
Caso 2: E = E i V E2. Come nel caso 1, ricorriamo all ipotesi di induzione per affermare
l esistenza di due espressioni CNF, F i ed F2, con le seguenti propriet.
1. Un assegnamento di valori di verit per F 1 (risp.
F2 sono in CNF.
^ i = g\A g2 A - A gp
ed F2 == h\ A
variabile y. Sia
E soddisfa E se e
468
Capitolo IO
(Solo se) Supponiamo che T soddisfi E. Come nel caso 1, sia T1 (risp. T2) come , ma
limitato alle variabili di E i (risp. E 2). Poich E = E 1 V E 2, T soddisfa E| o T soddisfa
E2. Supponiamo che soddisfi E 1. Allora T1, cio T ristretto alle variabili di E i , si pu
estendere a .Si, che soddisfa F i. Costmiamo St estensione di T, in modo che soddisfi
l'espressione E definita sopra.
1. Per ogni variabile x in E1, S(ar) = Sj (x).
2. S(y) = 0. Questa scelta rende vere tutte le clausole di E derivate da E2.
3. Per ogni variabile x presente in E2 ma non in E|, S(x) coincide con T(x) se questo
definito; altrimenti pu valere arbitrariamente O o 1.
Per la regola I, S rende vere tutte le clausole derivate dalle g. Per la regola 2, cio
rassegnamento per y, S rende vere tutte le clausole derivate dalle h. Quindi S soddisfa
E.
Se T non soddisfa E 1, ma soddisfa E 2, si procede allo stesso modo, ponendo S(y) =
1 nella regola 2. Inoltre S(x) deve coincidere con S2(.) dove questa definita, mentre
la scelta di S(x) per variabili presenti solo in Si arbitraria. Concludiamo che anche in
questo caso S soddisfa E.
(Se) Supponiamo di estendere lassegnamento di valori di verit T per E a un assegna
mento 5 per E, e che S soddisfi E. Secondo il valore di verit assegnato a y, ci sono due
casi. Poniamo anzitutto S(y) = 0. In questo caso tutte le clausole di E derivate dalle li
sono vere. Daltra parte y non daiuto per le clausole della forma (y + g), e quindi S
deve rendere vere tutte le y. In sostanza S rende vera E1.
Pi esattamente, sia S1 come S. ma ristretto alle variabili di E1. Allora Si soddisfa
E 1. Per lipotesi di induzione T1, cio T ristretto alle variabili di E 1, deve soddisfare E 1.
Infatti S 1 estende Ti, e T deve soddisfare E, cio E 1 V E 2, perch T1 soddisfa F\.
Dobbiamo trattare anche il caso S(y) 1, che per simmetrico a quello appena
svolto, ed quindi lasciato al lettore. Concludiamo che T soddisfa E quando S soddisfa
E.
Dobbiamo ora dimostrare che il tempo necessario per costruire E da E al massimo
quadratico in n, la lunghezza di E. In qualunque caso, sia la separazione di E in E 1 ed E2
sia la costruzione di E da E1 ed F2 richiedono un tempo lineare rispetto alla dimensione
di E. Sia dn un limite superiore al tempo richiesto per costruire E 1 ed E 2 da E sommato
al tempo per costruire E da Ei ed E2, nel caso 1 o nel caso 2. Il tempo T(n) richiesto
per costruire E da unespressione E di lunghezza n quindi dato da un'equazione di
ricorrenza:
T(I) = T(2) < e per una costante e
T(n) < dn + cmaxo<i<n-i (T(?) + T(n 1 ?)) per n > 3
Supponiamo vero lenunciato per lunghezze inferiori a n. Allora T(i) < et2
e T(n i 1) < c(n i I ) 2. Quindi
IN D U Z IO N E
(10.1)
470
Capitolo IO
(u
+ X
(y +> )(v +z )
(v )
(z )
espressioni xy e x(y + z ), le cui espressioni in CNF sono state calcolale come (x)(y) e
(x)(v + y)(v + z). Introduciamo la nuova variabile u, aggiunta senza negazione al primo
gruppo di clausole e negata al secondo. Il risultato
4. Sia e.i = (xi -I-X2 + + xm) per un m > 4. Introduciamo le nuove variabili
3/1 , 3/2 , . . . , IJrn-Z e sostituiamo e con il prodotto di clausole
(xi 4- X 2 4- 3/ i ) ( x 3 4- y \ + 2/ 2)(^4 4- 3/2 + 3/ 3)
( X m2 4" Vrn-A 4" U m - s ) (-Em-I 4- Xm 4 Jrn'.i)
MO 21
472
Capitolo 10
Abbiamo cos mostrato come ridurre ogni istanza E di CSAT a unistanza F di 3SAT
in modo che F sia soddisfacibile se e solo se E soddisfacibile. chiaro che il tempo
impiegato dalla costruzione lineare rispetto alla lunghezza di E, perch in nessuno dei
quattro casi svolti una clausola si espande di un fattore maggiore di 32/3 (il rapporto dei
numeri di simboli nel caso 1) ed facile determinare i simboli di F in tempo proporzionale
al loro numero. Poich CSAT NP-completo, ne segue che lo stesso vale per 3-SAT.
10.3.5 Esercizi
Esercizio 10.3.1 Trasformate in 3-CNF le seguenti espressioni booleane.
* a) xy + xz.
b) wxyz + u + v.
c) wxy 4- xuv.
Esercizio 10.3.2 Definiamo il problema 4TA-SAT: data unespressione booleana E, sta
bilire se E soddisfatta da almeno quattro assegnamenti di valori di verit. Dimostrate
che 4TA-SAT NP-completo.
Esercizio 10.3.3 In questo esercizio definiamo una famiglia di espressioni in 3-CNF. Le
spressione En ha n variabili: xi,x-,..., xn. Per ogni insieme di tre interi distinti fra 1 ed
7?,, En contiene le clausole (xi +X2 +x-.i) e (rrT+^-l-j^). Stabilite se En soddisfacibile
per:
*! a) Ti = 4
!! b) n = 5.
Esercizio 10.3.4 Ideate un algoritmo polinomiale in tempo che risolva il problema 2SAT,
cio la soddisfacibilit di espressioni booleane in CNF con due letterali per clausola.
Suggerimento: se uno dei due letterali di una clausola falso, laltro devessere vero.
Partite da unipotesi sul valore di verit di una variabile ed esplorate le conseguenze per
le altre.
10.4.1
CSAT.
474
Capitolo 10
10.4.2
INPUT: un grafo G e un lim ite inferiore k, com preso fra 1 e il num ero di nodi di G.
OUTPUT: s se c solo se G ha un insiem e indipendente di k nodi.
R ID U Z IO N E
da
3SAT.
d im o s t r a z io n e
+ 5 )(^ 3 + * 4 + X $ )
Le colonne rappresentano le clausole. Spiegheremo tra breve come sono stati scelti i lati.
La costruzione di G si fonda sullimpiego dei lati per imporre che ogni insieme in
dipendente di m nodi rappresenti un modo di soddisfare lespressione E. Questa idea si
articola in due punti fondamentali.
1. Vogliamo far s che si possa scegliere un solo nodo per ogni clausola. A tal fine
uniamo con un lato tulte le coppie di nodi nella stessa colonna. I lati di questo tipo
sono ([,I]. [,2]), ([*. 1], [i 3]) e ([-. 2] [ , 3]), per ogni come nella Figura 10.8.
2. Dobbiamo impedire che i nodi chc rappresentano letterali complementari possano
far parte di un insieme indipendente. Perci uniamo con un lato due nodi [i ,Ji] e
[hih] se uno di questi rappresenta la variabile x c l'altro la variabile x. In questo
modo non possiamo sceglierli per lo stesso insieme indipendente.
Il limite k per il grafo G costruito da queste due regole ni.
Non difficile vedere che il grafo G e il limite k si possono determinare dall'espres
sione E in tempo proporzionale al quadrato della lunghezza di E. La trasformazione da
E a G quindi una riduzione polinomiale. Dobbiamo dimostrare chc si tratta di una
riduzione corretta di 3SAT a IS, cio lenunciato seguente.
E soddisfacibile se e solo se G ha un insieme indipendente di dimensione m,
(Se) Osserviamo in primo luogo che un insieme indipendente non pu contenere due nodi
della stessa clausola, cio [i ji] e [i-.j^] per j\ / j 2 . Qucstodipende dalla presenza di lati
fra coppie di quei nodi, come si vede dalle colonne nella Figura 10.8. Se dunque esiste
476
Capitolo 10
478
Capitolo O
ogni lato. Diciamo che minimale se ogni altra copertura per nodi dello stesso grafo ha
un numero di nodi uguale o maggiore.
Le coperture per nodi sono strettamente legate agli insiemi indipendenti. Il comple
mento di un insieme indipendente una copertura per nodi, e viceversa. Perci, a patto
di formulare opportunamente la versione s/no del problema della copertura per nodi, la
riduzione da IS molto semplice.
PROBLEM A:
INPUT:
uno.
output
: s
r id u z io n e
DA:
insieme indipendente.
Osserviamo che HC un caso speciale del TSP, in cui i pesi dei lati sono tutti pari a 1.
Ridurre HC a TSP in tempo polinomiale quindi molto semplice: assegniamo il peso 1 a
ogni lato del grafo.
La dimostrazione di NP-completezza di HC molto difficile. Introdurremo una va
riante di HC in cui i lati hanno una direzione (sono cio orientati) e sono chiamati archi.
Un circuito hamiltoniano deve percorrere gli archi nella giusta direzione. Riduciamo
3SAT alla variante orientata di HC; ridurremo questa alla versione non orientata in un
secondo tempo.
PROBLEMA: problema del circuito hamiltoniano orientato (DHC, Directed Hamiltonian
Circuit).
480
Capitolo 10
in p u t :
un grafo orientato G.
OUTPUT: s se e solo se esiste in G un ciclo orientato chc passa per ogni nodo esatta
mente una volta.
RIDUZIONE DA:
3 S AT.
j '-Imi i
Se il ciclo comincia con G1, c]0, la scala viene percorsa in un ordine in cui, a ogni livello,
il nodo c precede il nodo b:
Gi } Ci0;6i0j^i 1,611
Dobbiamo fare unosservazione cruciale: possiamo interpretare il primo ordine di discesa,
dal c. al b sottostante, come lassegnazione del valore vero" alla variabile del blocco del
481
(c)
Figura 10.9 Elementi per la dimostrazione che il problema del circuito hamiltoniano
NP-completo.
482
Capitolo I O
483
e.j x-i, cio una variabile negata, cerchiamo un bip non ancora usato. Colleghiamo bip a
Tj e Uj a c-p+.
Per il secondo e il terzo letterale di e.j operiamo allo stesso modo, con uneccezione.
Per il secondo usiamo i nodi s e v, per il terzo i nodi tj e Wj. In questo modo ogni
Ij ha tre collegamenti ai blocchi H chc rappresentano le variabili della clausola e.j. Il
collegamento deriva da un nodo c e ritorna al nodo b sottostante se il letterale non
negato, proviene da un nodo b e ritorna al nodo c sottostante se negato. Affermiamo che
il grafo G costruito in questo modo ha un circuito hamiltoniano orientato se e solo
se lespressione E soddisfacibile.
(Se) Supponiamo che esista un assegnamento di valori di verit T che soddisfa E . Co
struiamo un circuito hamiltoniano orientato.
1. Cominciamo dal cammino che attraversa solo gli H , cio i grafi della Figura 10.9(b),
secondo lassegnamento T. 11 ciclo va dunque da a, a b,o se T (X i) = I, e da a, a
Qo se T (X i) = 0.
2. Se il ciclo costruito fin qui percorre un arco da b,p a Ci.p+i ed esiste un altro arco
da bij, a un Ij non ancora incluso nel ciclo, introduciamo una deviazione che
comprende i sei nodi di Ij e ritorna a c,:,p+i. Il nuovo ciclo non conterr pi larco
btp >Cj)P+1 , ma percorre ancora i suoi estremi.
3. In modo simile, se il ciclo contiene un arco da Cip a b, p+1, c un altro arco, non
incorporato nel ciclo, esce da cipper andare a un In modifichiamo il ciclo facendolo
deviare attraverso tutti i sei nodi di Ij.
Poich T soddisfa E , il cammino originale costruito al passo (1) deve includere almeno
un arco che, al passo (2) o (3), permette di inserire il blocco Ij per ogni clausola e.j. Tutti
gli Ij vengono cos inclusi nel ciclo, che diventa un circuito hamiltoniano orientato.
(Solo se) Supponiamo che il grafo G abbia un circuito hamiltoniano orientato. Dobbia
mo provare che E soddisfacibile. Ripetiamo due punti importanti ricavati dallanalisi
condotta fin qui.
1. Se un circuito hamiltoniano entra in Ij da r, Sj o tj, deve uscirne, rispettivamente,
da Uj, Vj o Wj.
2. Perci, se pensiamo che il circuito segua il ciclo dei blocchi H , secondo lo schema
della Figura 10.9(b), possiamo interpretare una deviazione verso Ij come se il ciclo
seguisse un arco in parallelo con bip *c,p+i o con cip >6*,p+ 1.
484
Capitolo IO
Esempio 10.22 Diamo un esempio molto semplice della costruzione del Teorema 10.21
a partire dallespressione in 3-CNF E = (x i + # 2 + # 3 )(^ 1 + 2^2 + ^ 3 )- H grafo risultante
illustrato nella Figura 10.10. Perchiarezza gli archi che collegano i blocchi di tipo TT a
quelli di tipo T sono punteggiati, ma non c differenza con quelli a tratto continuo.
Il blocco in alto a sinistra corrisponde a x-. Poich 1 compare una volta negata e
una volta no, la scala ha un solo dislivello, e ci sono quindi due righe di b e c. In
fondo a sinistra vediamo il blocco per 3 , che compare due volte, entrambe non negate.
Occorrono quindi due archi distinti c3 P * 63 ^ + 1 , di cui ci serviamo per unire i blocchi
11 e 1 -,2a rappresentare gli impieghi di x$ nelle due clausole. Per questo motivo il blocco
per Xz vuole tre righe di b e c.
Consideriamo il blocco / 2, chc corrisponde alla clausola (icY +
+ x-). Per il primo
letterale, xf, uniamo
a r-2 e u-> a ,. Per il secondo,
facciamo lo stesso con 620 ,
.s2, V2 e c.)\. Il terzo letterale, non essendo negato, si lega a un c e al b sottostante. Uniamo
cio 031 a t2 c IO2 a &32 Uno degli assegnamenti soddisfacenti
= I, X 2 0, x-3 = 0. Con questo
assegnamento la prima clausola soddisfatta dal suo primo letterale x\, la seconda dal
secondo letterale, cio X 2 . Possiamo individuare un circuito hamiltoniano che comprende
gli archi a\ 10, a 2 C20 e (3 030 -Il ciclo copre la prima clausola deviando da
H i al\. Usa cio larco Cio > ri, attraversa tutti i nodi di 11 e ritorna a &n. La seconda
clausola coperta dalla deviazione da H 2 a />, chc parte dall'arco 620 -1 ^2 <attraversa
12 e torna a C21 . Lintero ciclo hamiltoniano evidenziato dai tratti pi spessi (continui o
punteggiati) e dalle frecce pi grandi nella Figura 10.10.
10.4.5
Dimostrare che il problema del circuito hamiltoniano non orientato e il problema del
commesso viaggiatore sono NP-completi relativamente facile. Abbiamo gi visto nel
Paragrafo 10.1.4 chc TSP in MV . Poich HC un caso speciale di TSP, anchesso si
trova in MV . Effettuiamo quindi le riduzioni da D H C ad H C e da H C a TSP.
485
486
Capitolo 10
w ^ ).
Lo schema dei lati illustrato nella Figura 10.11, chc comprende il lato corrispondente
all'arco v w.
Figura 10.11 Gli archi in Gd sono sostituiti in G u da lati che uniscono un nodo di indice
2 a un nodo di indice 0 .
487
(Sc) Sia t'i, v-2 , , vn, t:j un circuito hamiltoniano orientato. Certamente
v[a) t/i1}? u 1 ?X,i0)
lJ2 5v[l)
*2 vi2)
c2 >v{0) * * ?
i t/W
n ; ?Vw
;1
HG.
10.4.6
La Figura 10.12 indica tutte le riduzioni compiute in questo capitolo. Sono indicate anche
le riduzioni da tutti i problemi, per esempio da TSP, a SAT. In realt nel Teorema 10.9
abbiamo ridotto a SAT il linguaggio di ogni macchina di Turing non deterministica c poli
nomiale in tempo. Anche se non l'abbiamo detto esplicitamente, queste T M ne compren
dono una che risolve TSP, una che risolve IS, c cos via. Di conseguenza tutti i problemi
NP-completi si possono ridurre luno allaltro in tempo polinomiale e rappresentano, di
fatto, aspetti diversi dello stesso problema.
488
Capitolo 10
10.4.7
Esercizi
* Esercizio 10.4.1 Una k-clique di un grafo G un insieme di k nodi di G tale che ogni
coppia di suoi nodi unita da un lato. Una 2-clique quindi una coppia di nodi collegati
da un lato, e una 3-clique un triangolo. Definiamo il problema CLIQUE: dato un grafo
G e una costante k, G ha una k-cliquel
a) Qual il pi grande valore di k per cui il grafo G nella Figura 10.1 soddisfa
CLIQUE?
b) Quanti lati ha una k-clique in funzione di kl
c) Dimostrate che C LIQ U E c NP-completo riducendo il problema della copertura per
nodi a CLIQUE.
489
k., possiamo assegnare a ogni nodo un colore scelto fra k in modo che nessun lato abbia
gli estremi dello stesso colore? Il grafo della Figura 10.1. per esempio, si pu colorare
con tre colori, assegnando I rosso ai nodi I e 4, I verde al 2 e il blu al 3. In generale, se un
grafo contiene una k-clique, non possiamo usare meno di k colori (ma possono servirne
pi di k).
Figura 10.13 Una parte della costruzione che dimostra PNP-completezza del problema
di colorazione.
In questo esercizio spieghiamo una parte della costruzione per dimostrare che il proble
ma della colorazione NP-completo. Portatela a termine. La riduzione parte da 3SAT.
Supponiamo di avere un'espressione in 3-CNF con n variabili. La riduzione trasforma
lespressione in un grafo, di cui una parte illustrata nella Figura 10.13. Come si vede a
sinistra, ci sono n + 1 nodi co,Ci, . . . , cn che formano una (n -f l)-clique. Tutti questi
nodi devono avere colori diversi. Chiameremo c3 il colore assegnato al nodo cj.
Per ogni variabile X 1 ci sono due nodi, corrispondenti a X 1 e x. Essi sono uniti da un
lato, e non possono quindi avere lo stesso colore. Ogni nodo x. inoltre collegato a Cj
per ogni j diverso da 0 e da i. Ne consegue che X 1 o
deve avere il colore Co, e Taltro il
colore
Si pu pensare che quello colorato Co sia vero e l'altro falso. In questo modo la
colorazione corrisponde a un assegnamento di valori di verit.
Per completare la costruzione dovete disegnare una parte di grafo per ogni clausola
490
Capitolo O
dellespressione. Devessere possibile colorare lintero grafo usando solo i colori da c(l a
Cn se e solo se ogni clausola vera rispetto allassegnamento corrispondente alla scelta dei
colori. Il grafo ricavato si pu quindi colorare con n + 1 colori se e solo se lespressione
data soddisfacibile.
491
492
Capitolo IO
Uh) Il problema della copertura esatta: dati un insieme S e una famiglia di sottoinsiemi
di S , Si, S 2 , . . . , Sn, esiste un'altra famiglia T C {Si, S .. . . , Sn } tale che ogni
elemento x di S si trovi esattamente in un membro di T?
U i) II problema dello zaino: data una lista di k interi 11 , 1 2 , , ik> possibile ripartirli
in due insiemi le cui somme coincidono? Nota: a prima vista pu sembrare che
questo problema sia in V , se si pensa che gli interi siano piccoli; in effetti, se i loro
valori sono limitati da un polinomio in k, esiste un algoritmo in tempo polinomiale.
In generale, per, in una lista di k interi rappresentati in codice binario, di lunghezza
totale pari a n, possono esserci valori quasi esponenziali in n.
10.5
Riepilogo
BibIiografiu
493
10.6
Bibliografia
Il concetto di NP-completezza come prova che un problema non pu essere risolto in tem
po polinomiale, cosi come la dimostrazione che SAT, CSAT e 3SAT sono NP-completi, si
deve a Cook [3J. In genere si attribuisce uguale importanza a un successivo studio di Karp
|6J, il quale dimostr che NP-completezza non solo un fenomeno circoscritto, ma
comune a molti tra i pi difficili problemi di combinatoria che erano stati studiati per anni
nel campo della ricerca operativa e in altre discipline. Ogni problema di cui si c dimo
strata -completezza nel Paragrafo 10.4 deriva da quel lavoro: insieme indipendente,
copertura per nodi, circuito hamiltoniano e TSP. Vi si trovano inoltre svariati problemi
citati negli esercizi: clique, feedback edge, zaino, colorazione c copertura esatta.
494
Capitolo 10
Il libro di Garey e Johnson [4] compendia una grande mole di materiale su quan
to sappiamo circa i problemi NP-completi e casi speciali polinomiali. In [5] sono rac
colti articoli su come approssimare la soluzione di un problema NP-completo in tempo
polinomiale.
Altri contributi alla teoria dellNP-completezza meritano un riconoscimento. Lo stu
dio delle classi di linguaggi definite dal tempo di esecuzione di macchine di Turing prese
le mosse da Hartmanis e Stearns [8J. Cobham [2] fu il primo a isolare il concetto di classe
V , in contrapposizione agli algoritmi con uno specifico tempo di esecuzione polinomiale,
come 0 ( n 2). Di Levin [7J segnaliamo la scoperta indipendente, per quanto successiva,
del lidea di NP-completezza.
LNP-completezza della programmazione lineare intera, citata nellEsercizio 10.4.4(c),
compare in [1], cos come in note inedite di J. Gathen e M. Sievcking. LNP-completezza
della pianificazione a tempi di esecuzione unitari (Esercizio 10.4.4(g)) discussa in [9].
1. I. Borosh. L. B. Treybig, Bounds on positive integral solutions oflincar Diophantine equations, Proceedings of the AM S 55 (1976), pp. 299-304.
2. A. Cobham, The intrinsic computational difficulty of functions, Proc. 1964 Con
gress for Logic, Mathematics, and the Philosophy of Science, North Holland, A m
sterdam, pp. 24-30.
3. S. C. Cook, The complexity of theorem-proving procedures. Third A C M Sympo
sium on Theory of Computing (1971), ACM , New York, pp. 151-158.
4. M . R. Garey, D. S. Johnson, Computers and Intractability: a Guide to the Theory
ofNP-Completeness, H. Freeman, New York, 1979.
5. D. S. Hochbaum (ed.), Approximation Algorithms for NP-Hard Problems, PWS
Publishing Co., 1996.
6. R. M. Karp, Reducibility among combinatorial problems, in Complexity of Com
puter Compulations (R. E. Miller, ed.), Plenum Press, New York, pp. 85-104.
1972.
7. L. A. Levin, Universal sorting problems Problemi Peredachi Infonriatsii 9:3
(1973), pp. 115-1 16.
8. J. Hartmanis, R. E. Stearns, On the computational complexity of algorithms,
Transactions of the AM S 117 (1965), pp. 285-306.
9. J. D. Ullman, NP-complete scheduling problems, J. Computer and System Scien
ces 10:3 (1975), pp. 384-393.
Capitolo 11
496
Capitolo 11
1. la capacit di scoprire velocemente grandi numeri primi (per permettere una comu
nicazione tra macchine non soggetta a intercettazione da parte di terzi)
2. lipotesi che ci voglia un tempo esponenziale per scomporre un numero intero in fat
tori primi, se il tempo viene misurato comc funzione della lunghezza ri dell'intero
scritto in binario.
Vedremo che la verifica di primalit appartiene sia a MV sia a co-MV1, ed perci
improbabile riuscire a dimostrare che un problema NP-completo. un peccato, perch
le dimostrazioni di NP-completezza sono la prova pi comune che un problema richiede
con ogni probabilit un tempo esponenziale. Vedremo inoltre che la verifica di primalit
nella classe 7ZV. Si tratta di una circostanza fortunata, perche nella pratica i sistemi
crittografici basati sui numeri primi usano effettivamente un algoritmo nella classe 7ZV
per trovarli. D altronde una circostanza negativa, perch d ulteriore peso allipotesi
che non saremo in grado di dimostrare la NP-complctezza della verifica di primalit.
11.1
La classe dei linguaggi in V chiusa rispetto alla complementazione (si veda IRsercizio 10.1.6). Per dimostrarlo, supponiamo che L sia in V c chc M sia una T M per L.
Modifichiamo M in modo che accetti L\ introduciamo un nuovo stato accettante e fac
ciamo andare in q la nuova T M quando M si arresta in uno stato non accettante; rendiamo
non accettanti gli stati accettanti di M . A questo punto la T M modificata accetta L im
piegando lo stesso tempo di T M , con la possibile aggiunta di una mossa. Di conseguenza
L in V se lo L.
Non noto stMV sia chiusa rispetto alla complementazione. Si ritiene che non lo sia,
e in particolare ci aspettiamo che, se un linguaggio L NP-completo, il suo complemento
non sia in M V.
lD i recente stata annunciata la scoperta chc la verifica di primalit appartiene a
11.1.1
497
498
Capitolo 11
sono vere per ogni assegnamento di valori di verit. Osserviamo che un'espressione E
una tautologia se e solo se ->E insoddisfacibile. Di conseguenza TAUT e UvSAT
sono collegate: se unespressione booleana E in TAUT, ->E in USAT, c viceversa.
Osserviamo che USAT contiene anche stringhe che non rappresentano espressioni valide,
mentre tutte le stringhe in TAUT sono espressioni valide.
11.1.2
Supponiamo che V N V . ancora possibile chc la situazione di co-NV non sia quella
illustrata dalla Figura 11.1 perch N V e CO-AiV potrebbero essere uguali, ma pi grandi
di V . In altre parole potremmo scoprire che i problemi come USAT e TAUT possono
essere risolti in tempo polinomiale non deterministico (cio sono in N V ), ma non in
tempo polinomiale deterministico. Il fatto che non siamo riusciti a trovare anche solo
un problema NP-completo il cui complemento sia in N V tuttavia un indizio forte che
N P zo-NV, come proveremo nel prossimo teorema.
11.1.3
499
Esercizi
/(*) < y
sarebbe in
11.2
(N P
co-ArV) V .
Esaminiamo ora una classe di problemi che include NP c che si ritiene sia pi ampia,
anche se non certo. Questa classe definita ammettendo che una macchina di Turing usi
uno spazio polinomiale nella dimensione dellinput, a prescindere dal tempo. Inizialmente
distingueremo tra i linguaggi accettati da T M deterministiche e quelli accettati da T M
non deterministiche con un limite polinomiale sullo spazio, ma vedremo presto che le due
classi di linguaggi in realt coincidono.
Esistono problemi P completi rispetto allo spazio polinomiale, nel senso che tutti i
problemi in questa classe sono riducibili a P in tempo polinomiale. Di conseguenza, se
P in V o in N V , tutti i linguaggi accettati da T M con limite polinomiale sullo spazio
sono rispettivamente in V o N'P. Daremo un esempio di questi problemi: le formule
booleane con quantificatori.
500
C u p ito Io ll
11.2.1
La Figura 11.2 illustra una macchina di Turing con limite polinomiale sullo spazio. Esiste
un polinomio p(n) tale che la 'PM. a fronte di un input w di lunghezza n, non visita mai
pi di p(n) celle del nastro. Per il Teorema 8.12 possiamo presumere che il nastro sia
semi-infinito e chc la T M non si sposti mai a sinistra della prima cella di input.
input w
n celle
^
celle visitate
--------------
p(n) celle
V S A rPS,
PS
rV S
11.2.2
501
c1+p( ) mosse. Se M ripete una ID e poi accetta, deve esistere una sequenza pi breve
di ID che conduce all"accettazione. In altre parole, se a F F 3 F , dove a la ID
Sc
iniziale, la ID ripetuta e 7 c la ID accettante, allora a F F una sequenza pi
breve di ID che conduce allacccttazione.
Il ragionamento per cui c deve esistere poggia sul fatto che, se lo spazio usato dalla
T M limitato, cc solo un numero limitato di ID. In particolare, sia t I numero di simboli
di nastro di Al e sia s il numero di stati di Al. Se si usano solo p(n) celle di nastro, il
numero di ID diverse di M al massimo sp(n)tp(n\ Possiamo infatti scegliere uno degli
s stati, collocare la testina su una qualunque delle p(n) posizioni di nastro, e riempire le
p(n) celle con una qualsiasi delle
sequenze di simboli di nastro.
Poniamo c = s + 1 e consideriamo lespansione binomiale di (t. +
tl+p(n) +
+ p ( n ) ) 5tP ( ) +
...
Osserviamo che il secondo termine almeno tanto grande quanto sp(n)tp(n\ il che di
mostra che
almeno uguale al numero di ID possibili di M . Concludiamo la
dimostrazione osservando che se Al accetta w di lunghezza ??., lo fa con una sequenza di
mosse che non ripete una ID. Perci Al accetta con una sequenza di mosse che non pi
lunga del numero di ID distinte, che C1
.
Possiamo ricorrere al Teorema 11.3 per convertire una T M con limite polinomiale sul
lo spazio in una equivalente che si arresta sempre dopo aver fatto al massimo un numero
esponenziale di mosse. Infatti, sapendo chc la T M accetta entro un numero esponenziale
502
Capitolo 11
di mosse, possiamo contare quante mosse sono state latte c arrestare la TM se ha fatto un
numero sufficiente di mosse senza accettare.
Teorema 11.4 Se L un linguaggio in V S (rispettivamente A rV S ). allora L accettalo
da una T M deterministica (rispettivamente non deterministica), con limite polinomiale
sullo spazio, chc si arresta dopo aver fatto al pi cq^ mosse, per un polinomio q(n) e
una costante c > 1 .
11.2.3
In effetti la regola generale desunta dal Teorema 8.10 non rafferma/ione pi forte che possiamo fare.
Dato che qualsiasi nastro usa solo 1 + p ( n ) celle, le testine simulate nella conversione da multinastro a m ono
nastro possono allontanarsi fra loro al massimo di 1 +
p{r)
celle. D i conseguenza
passi, che m eno di
mosse della T M
^c2p^n ^ , com e abbiamo
503
Trattiamo il nastro di D come uno stack in cui sono collocati gli argomenti delle
chiamale ricorsive di reach. Uno Stackframei D contiene [l.J.m ]. La Figura 11.3
presenta uno schema dellalgoritmo eseguito da reach.
BOOLEAN F U NC T IO N r e a c h {I , J ,m )
I D : I , J ; INT : m;
BEGIN
I F (m == I ) THEN / * b a s e * / B E G IN
v e r i f i c a s e I == J o
s e I pu d i v e n t a r e J i n u n a m o s s a ;
RETURN TRUE i n c a s o p o s i t i v o ,
FALSE a l t r i m e n t i ;
END;
E LSE / * p a s s o i n d u t t i v o * / B E G I N
FOR o g n i I D K DO
I F ( r e a c h ( , , m / 2 ) AND
r e a c h ( K , J , m / 2 )) THEN
RETURN TRUE;
RETURN FALSE;
END;
END;
stackframe intendiamo
504
Capitolo 11
/|
Ji m
I 2 J 2 m /2
U jA m/8
Figura 11.4 II nastro di una D T M che simula una N T M mediante chiamate ricorsive a
reach.
stack frame al pi Iog2 (\ che 0(p (n )). Disponiamo ora degli elementi essenziali
su cui basare la dimostrazione del seguente teorema.
Teorema 11.5 (Teorema di Savitch) V S = A rV S .
505
11.3
VS
11.3.1
PS-completezza
506
Capitolo 11
DIM OSTRAZIONE Dimostriamo (a). Sappiamo che per ogni L in P S esiste una riduzione
in tempo polinomiale di L a P . Sia q(n) il tempo impiegato dalla riduzione. Supponiamo
inoltre chc P sia in P , e quindi abbia un algoritmo che richiede un tempo polinomiale
Pin).
Data una stringa w, di cui vogliamo verificare lappartenenza a L, possiamo servirci
della riduzione per convertirla in una stringa x che in P se e solo se w in L. Poich la
riduzione impiega un tempo <7(|w|), la stringa x non pu essere pi lunga di q(|u|). Pos
siamo verificare lappartenenza di x a P in tempo p(|rr|), che p(g(M ))> un polinomio
in |w|. Concludiamo che esiste un algoritmo in tempo polinomiale per L.
Ciascun linguaggio L in P S quindi anche in V . Poich P contenuto in P S ,
deduciamo che se P in P . allora P = P S . La dimostrazione di (b), dove p c in A rP i
del tutto simile ed lasciata al lettore.
11.3.2
Presentiamo ora un problema P completo per P S . Prima per dobbiamo chiarire i termini
in cui si definisce questo problema, detto formule booleane con quantificatori (QBF,
Quantified Boolean Formulas).
Una formula booleana con quantificatori unespressione booleana con l'aggiunta
degli operatori V (per ogni) ed 3 (esiste"). Lespressione (Vx)(E) significa che E
vera quando tutte le occorrenze di x in E sono sostituite da 1 (vero), e che altrettanto
vera quando tutte le occorrenze di x sono sostituite da 0 (falso). L'espressione (Bx)(E)
significa che E vera quando tutte le occorrenze di x sono sostituite da I o quando tutte
le occorrenze di x sono sostituite da 0, oppure in entrambi i casi.
Per semplificare la descrizione assumiamo chc nessuna Q BF contenga due o pi quan
tificatori (V o 3) per la stessa variabile x. Questa restrizione non essenziale e corrispon
de approssimativamente a impedire che due diverse funzioni di un programma possano
usare la stessa variabile locale.5 Le fonnule booleane con quantificatori sono definite
formalmente come segue.
5N ei programmi c nelle formule booleane con quantificatori sempre possibile rinominare uno dei due usi
distinti dello stesso nome della variabile. Per i programmi non c alcuna ragione di evitare il reimpiego dello
stesso nome locale, m a nelle Q B F opportuno imporre che ci non accada.
507
con la sola coppia attorno a E , omettendo quelle relative a ogni quantificatore lungo
la catena, in questo modo: (Vx)(By)(Vz)(F).
Esempio 11.7 Ecco un esempio di QBF:
(\fx)((3y)(xy) + (Vz)(-rr + z))
( 11.1)
11.3.3
508
Capitolo 11
BASE
509
(11.2)
Il valore dellespressione dipende dai valori delle due espressioni legate dall'OR: (By) (Oy)
e (V^)(->0 + 2 ); Eo ha valore 1 se una delle due espressione vale 1. Per valutare (By)(Oy)
dobbiamo sostituire y = 0 e y = 1 nella sottoespressione 0y, e controllare che almeno
una delle sottoespressioni cos ottenute abbia il valore 1. Sia 0 0 sia O A l hanno valore
0, per cui (By)(Oy) ha valore O.6
Fortunatamente (Vz)(-O + z) ha valore 1. come si vede sostituendo prima 2 = 0
e poi z = 1. Poich 0 = 1, le due espressioni che dobbiamo valutare sono I V O e
I V I . Avendo entrambe valore 1, sappiamo che (V^)(-O + z) ha valore 1. Possiamo ora
concludere chc Eo, cio !Equazione (11.2), ha valore 1.
Dobbiamo inoltre verificare che anche E], ottenuta sostituendo x = 1 nellEquazionc (11.1), valga 1:
(By)(Iy) + (V^)(->1 + z)
(11.3)
11.3.4
Possiamo ora definire il problema delle formule booleane con quantificatori: data una
Q B F E priva di variabili libere, E vale 1? Denoteremo questo problema con QBF, e
continueremo a impiegare lo stesso acronimo anche per indicare formula booleana con
quantificatori . Il contesto dovrebbe eliminare ogni ambiguit.
Dimostreremo che il problema Q B F completo per P S . La dimostrazione combina
idee tratte dai teoremi 10.9 e 11.5. Dal Teorema 10.9 prendiamo lidea di rappresentare
la computazione di una T M tramite variabili logiche, ognuna delle quali indica se una
certa cella ha un certo valore in un dato momento. Nel caso di tempo polinomiale, per,
come nel Teorema 10.9, il numero di variabili rilevanti polinomiale. Siamo stati dunque
6A bb iam o latto uso della notazione alternativa per A N D e O R perch non possiamo utilizzare la giustapposizione e + per le espressioni chc coinvolgono 0 e 1 senza rendere le espressioni simili a numeri di pi cifre o a
una som m a aritmetica. Confidiamo chc il lettore accetti entrambe le notazioni com e rappresentanti degli stessi
operatori logici.
510
C a p ito la li
5 11
512
Capitolo 11
Avvio corretto
Termina/ione corretta
Per essere una ID accettante, If deve avere uno stato accettante. Scriviamo perci F come
lO R logico delle variabili yjA, scelte tra le variabili proposizionali di If per le quali A
uno stato accettante. La posizione j arbitraria.
513
Mossa lecita
1. { P , Q ) ( I , K ) e ( P , Q ) ( K , J )
5 14
Capitolo 11
2. N i( R Q ) vera.
In altri termini Ar(/. ') e N { (K , J) sono vere e non ci interessa sapere se Ar(P, Q)
vera per altri motivi. Ecco una QBF per N 2 i(I, J):
N 2 i( L J )
(3IO(VP)(VQ) (Wi(P1Q) V
(-.(/ = R A K = Q ) A ->(K = P A J = Q )))
Osserviamo chc possibile scrivere Ar2,: nello stesso tempo che occorre per scrivere N 1,
pi un tempo aggiuntivo 0 (p(n)).
Per completare la costruzione di N , dobbiamo definire N m per il pi piccolo rn che
sia una potenza di 2 e che sia maggiore o uguale a c1+p<n\ il numero pi elevato possibile
di mosse che la TM M pu fare prima di accettare un input w di lunghezza n. Dobbiamo
applicare il passo induttivo descritto sopra per un numero di volte pari a log2(c1+p^n^), o
0(p (n )). Poich ciascun uso del passo induttivo impiega tempo 0(p (n )), concludiamo
che N pu essere costruita in tempo ( 2 ()).
Conclusione della dimostrazione del Teorema 11.11
11.3.5
Esercizi
casi:
a) F = FyF 2
b) F = (Vx)(E)
c) F = -(F)
d) F = (E).
515
nodi terminali * e t, tra due giocatori, che chiameremo SHORT e CUT. Ogni giocatore,
a partire da SHORT, si alterna nella selezione di un vertice di G, diverso da s e t, che
rimane in suo possesso (ino alla fine della partita. SHORT vince se seleziona un insieme
di nodi che, con s e t, forma un cammino in C da s a t. CU T vince se tutti i nodi sono stati
selezionati e SHORT non ha completato un cammino da s a t. Dimostrate che il seguente
problema PS-completo: dato G , SHORT pu vincere indipendentemente dalle scelte di
CUT?
11.4
Passiamo ora a due classi di linguaggi definiti per mezzo di macchine di Turing che pos
sono servirsi di numeri casuali nella computazione. 1 linguaggi di programmazione pi
diffusi consentono di scrivere algoritmi che sfruttano un generatore di numeri casuali. La
funzione rand ( ), o una funzione dal nome simile, che restituisce un numero apparen
temente casuale o impredicibile, esegue in realt un algoritmo specifico che pu essere
ripetuto, anche se molto difficile rilevare uno schema nella sequenza di numeri prodotti.
Un semplice esempio (che in pratica non si usa) pu consistere nellelevare al quadrato
lintero precedente nella sequenza e prendere i bit mediani del risultato. I numeri prodotti
da una tale procedura meccanica sono detti pseudo casuali.
In questo paragrafo definiremo un tipo di macchina di Turing che modella la gene
razione di numeri casuali e il loro impiego negli algoritmi. Definiremo poi due classi di
linguaggi. VSV e Z V V , che si servono in modi diversi di questo genere di casualit e di
un vincolo polinomiale sul tempo. interessante osservare che le due classi sembrano
includere poco pi di V , ma le differenze sono importanti. Tn particolare vedremo nel Pa
ragrafo 1 1.5 che alcune delle questioni principali sulla sicurezza informatica riguardano
in realt la relazione di queste classi con V cd M V .
11.4.1
5 16
Capitolo 11
esempio ai, e dividiamo la sequenza in due parti: gli elementi pari ad i o pi piccoli e
gli elementi pi grandi. Lelemento selezionato detto pivot. Scegliendo unopportuna
rappresentazione dei dati, possiamo ripartire in tempo 0 (n) una sequenza di lunghezza n
in due sequenze le cui lunghezze sommate danno ancora n. Possiamo poi ordinare sepa
ratamente, in modo ricorsivo, la sequenza degli elementi piccoli (minori o uguali al pivot)
e quella degli elementi grandi (maggiori del pivot); il risultato sar una sequenza ordinata
di tutti gli n elementi.
Con un po di fortuna il pivot risulter essere un numero a met della sequenza ordina
ta. La lunghezza delle sottoliste sar allora vicina a n j 2. Se a ogni passo siamo fortunati,
dopo circa Iog2 n livelli di ricorsione avremo sequenze di lunghezza 1, ovviamente gi
ordinate. Di conseguenza il lavoro totale si compone di 0(log n) livelli, ciascuno di costo
0 (n ), per un tempo complessivo 0 (n log n).
Non detto per che tutto vada cos liscio. Per esempio, se la sequenza ordinata in
partenza, la scelta del primo elemento produce una sottosequenza di un solo elemento con
gli elementi restanti nella sottosequenza degli elementi grandi. In questo caso Quicksort
si comporta in modo molto simile allordinamento per selezione e impiega un tempo
proporzionale a ri2 per ordinare gli n elementi.
Perci le migliori implementazioni del Quicksort non scelgono il pivot in una posi
zione specifica della sequenza, ma in una posizione casuale. Ognuno degli n clementi
ha quindi probabilit l/n di essere scelto come pivot. Il tempo medio di esecuzione
del Quicksort randomizzato 0 (n log n). Ma poich rimane una probabilit, per quanto
piccola, che ogni scelta del pivot prenda lelemento pi grande o il pi piccolo, il tempo
di esecuzione del Quicksort nel caso peggiore ancora 0 ( n 2). Nonostante ci, Quicksort
il metodo preferito in molte applicazioni (per esempio viene usato nel comando sort
di UNIX) perch il suo tempo medio di esecuzione migliore rispetto ad altre soluzioni,
anche in confronto a quelle che nel caso peggiore sono 0 (n log n).
11.4.2
1973.
517
Nastri ausiliari
Figura 11.6 Una macchina di Turing in grado di usare numeri generati casualmente.
Se lidea di preparare la T M con un numero infinito di 0 e 1 scelti a caso non pare
realistica, si pu pensare a una T M equivalente il cui secondo nastro sia inizialmente
bianco. Quando la seconda testina guarda un blank, ha luogo un lancio di monetina
interno e la T M scrive immediatamente uno 0 o un 1 sulla cella, che vi rimane per sempre.
In questo modo non si compie alcun lavoro prima di avviare la T M randomizzata, tanto
meno un lavoro infinito, ma il secondo nastro sembra coperto di 0 e 1 scelti a caso perch
i bit casuali compaiono dovunque si trovi la testina del secondo nastro.
Esempio 11.12 Possiamo implementare la versione randomizzata del Quicksort su una
5 18
Capitolo 11
nastro; lm-csimo elemento della sottosequenza diventa il pivot. Osserviamo che
non sempre siamo in grado di scegliere ogni intero tra 1 ed m con la stessa probabi
lit, perch m pu non essere una potenza di 2. Tuttavia, se prendiamo [2 Iog2 mi\
bit dal nastro 2, li consideriamo come un numero compreso fra O c circa ni2, pren
diamo il resto della divisione per m e aggiungiamo 1, avremo tutti i numeri tra 1
ed m con una probabilit di scelta abbastanza vicina a l/m , come richiesto per il
funzionamento corretto del Quicksort.
11.4.3
xOsscrviamo che I a T M randomizzata descritta nell'F.sempio 11. 12 non riconosce un linguaggio, m a opera
lina trasformazione dellinput. Tl tempo di esecuzione, a differenza del risultato, dipende dal contenuto del nastro
casuale.
519
T M randomizzata Al. M usa solo un nastro di input e il nastro casuale. Il suo comporta
mento semplicissimo: non cambia mai un simbolo sui nastri e muove le testine soltanto
verso destra (direzione R) oppure le mantiene ferme (direzione S). Anche se non abbiamo
definito una notazione formale per le transizioni di una T M randomizzata, le voci della
tabella dovrebbero essere chiare: ogni riga corrisponde a uno stato e ogni colonna a una
coppia di simboli X W dove X il simbolo visto sul nastro di input e Y il simbolo visto
sul nastro casuale. Lelemento q lJ V D E significa che la T M entra nello stato q, scrive U
sul nastro di input e V sul nastro casuale, muove la testina di input in direzione D e quella
del nastro casuale in direzione E.
- Qu
Qi
(12
<13
*<il
00
qiOORS
Q1OORS
Ol
q30 \SR
10
q210RS
11
q^lSR
q210RS
q-.i00RR
q:illRR
BO
BI
q.]BOSS
q4BOSS
q4B0SS
r/4 B I SS
520
Capitolo 11
Consideriamo ora il caso di un input eterogeneo w, cio un input formato sia da 0 sia
da 1, come 00101. Linput non viene accettato se il primo bit casuale 0. Se il primo
bit casuale 1 , la sua probabilit di accettazione 2~\ dove i la lunghezza dellinput.
Perci la probabilit totale di accettazione di un input eterogeneo di lunghezza i
Per esempio la probabilit di accettazione di 00101 1/64.
Concludiamo che possibile calcolare la probabilit con cui una T M randomizzata
accetta una stringa assegnata. Che la stringa sia nel linguaggio o no dipende da come viene
definita appartenenza al linguaggio di una T M randomizzata. Nei prossimi paragrafi
daremo due diverse definizioni di accettazione, ognuna delle quali conduce a una classe
di linguaggi differente.
11.4.4
La classe TZV
L'essenza della prima classe di linguaggi, chiamata 'JZV (da random polynomial, ossia
polinomiale casuale), che per essere in TZ'P un linguaggio L devessere accettato da una
T M randomizzata Al nel senso chc ora definiamo.
1. Se w non in L, allora la probabilit che Al accetti w 0.
2. Se w in L , allora la probabilit che M accetti w almeno 1/2.
3. Esiste un polinomio T(n ) tale che se l'input w di lunghezza n, tutte le esecuzio
ni di M , indipendentemente dai contenuti del nastro casuale, si arrestano dopo al
massimo T(n) passi.
521
Nella definizione di 'JZV ci sono due questioni indipendenti. 1 punti (1) e (2) definisco
no una macchina di Turing randomizzata di tipo speciale, a volte denominata algoritmo
Montecarlo. A prescindere dal tempo di esecuzione, si pu dire che una T M randomiz
zata "Montecarlo se accetta con probabilit 0 oppure con probabilit superiore a 1/2,
senza casi intermedi. 11 punto (3) riguarda solo il tempo di esecuzione, che non dipende
dal fatto che la T M sia "Montecarlo o no.
Esempio 11.14 Consideriamo la T M randomizzata dellEsempio 11.13. Essa soddisfa
certamente la condizione (3) perch il suo tempo di esecuzione C)(n), indipendente
mente dai contenuti del nastro casuale. Per non accetta nessun linguaggio nel senso
richiesto dalla definizione di TZV. Infatti, mentre gli input omogenei come 000 sono ac
cettati con probabilit minima 1/2 e perci soddisfano il punto (2 ), esistono altri input,
come 0 0 1 , accettati con una probabilit che non n 0 n almeno 1/2 ; per esempio 001
accettato con probabilit 1/16.
Esempio 11.15 Descriviamo in termini informali una T M randomizzata che sia poli
nomiale sia Montecarlo, e dunque accetta un linguaggio in TZV. Uinput sar interpretato
come un grafo, e la domanda se il grafo contenga un triangolo, ossia tre nodi le cui
coppie sono connesse da lati. Gli input con un triangolo sono nel linguaggio, gli altri no.
L algoritmo Montecarlo sceglie ripetutamente e a caso un lato (x,y) e un nodo z,
diverso da x c y. Ogni scelta viene fatta leggendo nuovi bit sul nastro casuale. Per ogni
y e 2 selezionati, la T M verifica se linput contiene i lati (x,z) e (y, z), e se cos
dichiara che il grafo di input ha un triangolo.
In totale vengono compiute k scelte di un lato c di un nodo; la T M accetta se una di
esse risulta un triangolo: altrimenti si ferma senza accettare. Se il grafo non ha triangoli,
nessuna delle k scelte risulter un triangolo. La condizione (1) della definizione di 7ZV
quindi soddisfatta: se linput non nel linguaggio, la probabilit di accettazione 0 .
522
Capitolo 11
\k
(
4 )
11.4.5
Supponiamo ora di avere una macchina di Turing Montecarlo M chc riconosce un lin
guaggio L in tempo polinomiale. Abbiamo una stringa w e vogliamo sapere se in L. Se
eseguiamo M su L usando una monetina o un altro dispositivo che generi numeri casuali
per simulare la creazione di bit casuali, sappiamo che:
1. se w non in L, lesecuzione non condurr alla sua accettazione
2 . se w in L, esiste almeno il 5 0 % di probabilit chc sia accettato.
523
quando non avremmo dovuto (un falso positivo). Di conseguenza dobbiamo distinguere
la T M randomizzata dallalgoritmo che usiamo per decidere se w in L. Non possibile
evitare del tutto i falsi negativi, sebbene si possa ridurre la probabilit di incorrervi entro
limiti prefssati, ripetendo pi volte la verifica.
Per esempio, se vogliamo una probabilit su un miliardo di falso negativo, possiamo
eseguire una verifica trenta volte. Se W in L, la probabilit che tutte e trenta le veri
fiche non portino allaccettazione non supera 2-30, che meno di IO-9, cio una su un
miliardo. In generale, se vogliamo che la probabilit di falsi negativi sia minore di c > 0,
dobbiamo eseguire la verifica log2(l/c) volte. Questo numero una costante se lo c.
Poich unesecuzione della T M randomizzata M impiega tempo polinomiale (assumia
mo che L sia in TZV), sappiamo chc anche la ripetizione della verifica richiede tempo
polinomiale. Le conclusioni di questo ragionamento si possono enunciare in forma di
teorema.
Teorema 11.16 Se L in TZV, allora per ogni costante c > 0 piccola a piacere, esiste un
algoritmo polinomiale randomizzato chc risponde alla domanda se un input w in L, non
produce falsi positivi, e produce falsi negativi con una probabilit non maggiore di c.
524
Capitolo 11
11.4.6
La classe Z V V
11.4.7
Una semplice relazione lega le due classi randomizzate appena definite. Prima di enun
ciare il relativo teorema dobbiamo per esaminare i complementi delle classi. Dovrebbe
essere chiaro che se L in Z V V lo anche L. Infatti, se L accettato da una T M AT
Las Vegas con tempo medio polinomiale, allora L accettato da una variante di AT in cui
trasformiamo laccettazione in arresto senza accettazione, mentre se Al si arresta senza
accettare, passiamo a uno stato accettante e ci arrestiamo.
Non c invece ovvio che 7Z V sia chiusa rispetto alla complementazione, in quanto la
definizione delle macchine di Turing Montecarlo tratta in modo diverso accettazione c
rifiuto. Di conseguenza definiamo la classe CO-TtV come linsieme dei linguaggi L tali
che L sia in TZV \cio co-TZV rappresenta i complementi dei linguaggi in TZV.
Teorema 11.17 Z V V = TZV co-TZV.
525
11.4.8
11 Teorema 11.17 indica che Z V V C TZV. Possiamo collocare queste classi tra V cd M V
grazie a due semplici teoremi.
Teorema 11.18 V C Z V P .
DIMOSTRAZIONE Una T M deterministica con limite polinomiale sul tempo anche una
T M Las Vegas con limite polinomiale sul tempo, che non ricorre alla possibilit di com
piere scelte casuali.
526
Capitolo 11
11.5
527
11.5.1
Un numero intero p primo se gli unici interi che lo dividono senza resto sono 1 e il
numero stesso. Se un numero intero non primo, diciamo che composto. Ogni numero
composto pu essere scritto come prodotto di numeri primi in modo unico, salvo che per
lordine dei fattori.
Esempio 11.20 I numeri primi pi bassi sono 2, 3, 5, 7, 11, 13 e 17. Lintero 504
I
metodi pi comuni per aumentare la sicurezza nei computer si fondano sul 1ipotesi
che sia difficile fattorizzare un numero, cio trovare i fattori primi di un numero composto.
In particolare i sistemi basati sui cosiddetti codici RSA (dalle iniziali degli inventori della
tecnica, ossia R. Rivest, A. Shamir c L. Adleman) usano numeri interi, per esempio di 128
bit, che sono il prodotto di due primi, ciascuno di circa 64 bit. Presentiamo due situazioni
in cui i numeri primi hanno una funzione importante.
Crittografia a chiave pubblica
Vogliamo comprare un libro in una libreria on-line. Il venditore chiede il numero della
nostra carta di credito, ma rischioso inserirlo in un modulo e trasmetterlo per telefono
oppure via Internet: qualcuno potrebbe essere in ascolto sulla linea o intercettare pacchetti
durante il loro percorso.
Per evitare che un malintenzionato legga il numero della carta di credito, il sito di
vendita invia al browser una chiave k, per esempio il prodotto di due numeri primi con
lunghezza totale di 128 bit, generato a questo scopo dal computer della libreria virtuale.
II nostro browser applica una funzione y = /fc(z), che usa sia la chiave k sia i dati x
da crittografare. La funzione / , che fa parte dello schema RSA, pubblica, e quindi
nota anche a potenziali spie. Si ritiene per che non sia possibile, senza conoscere la
scomposizione in fattori di k, calcolare la funzione inversa /1, per la quale x = fj71(?/),
in un tempo inferiore a un esponenziale nella lunghezza di k.
Di conseguenza, anche se una spia vede y e conosce / , non pu recuperare x, chc in
questo caso il numero di carta di credito, senza prima scoprire k e scomporlo in fattori
528
Capitolo 1I
primi. D altra parte la libreria virtuale, che conosce la scomposizione in fattori della
chiave k, avendola generala, pu applicare facilmente /1 e ottenere x da y.
Firme con chiave pubblica
Descriviamo il contesto per cui sono stati sviluppati i codici RSA. Si vuole firmare
un messaggio elettronico in modo che i destinatari possano individuare con facilit il
mittente e che non sia possibile falsificarne la firma. Immaginiamo di voler firmare un
messaggio x = Mi impegno a pagare $10 a Sally Lee, ma di voler impedire che Sally, o
una terza persona, possa comporre un messaggio simile firmato a nostra insaputa.
A tal fine scegliamo una chiave k, di cui solo noi conosciamo i fattori primi, e la
pubblichiamo, per esempio sul nostro sito Web, in modo che chiunque possa applicare
la funzione / a un messaggio. Se vogliamo firmare il messaggio x e spedirlo a Sally,
calcoliamo y = /~1(a:) e le inviamo y. Sally recupera dal sito fk, la chiave pubblica, con
cui calcola x = fk{y). Viene cos a sapere con certezza che ci siamo impegnati a pagarle
$ 10.
Se neghiamo di aver inviato il messaggio y, Sally pu affermare davanti a un giudice
che solo noi conosciamo la funzione
, e che sarebbe impossibile per lei, o per un'altra
persona, scoprirla. Dunque solo noi possiamo aver creato y. Il sistema si fonda sulli
potesi, probabile ma non dimostrata, chc troppo difficile scomporre in fattori primi il
prodotto di due numeri primi grandi.
Requisiti concernenti la complessit della verifica di primalit
Si ritiene che le due situazioni descritte sopra siano adeguate e sicure, nel senso che ci
vuole davvero un tempo esponenziale per scomporre in fattori il prodotto di due numeri
primi grandi. La teoria della complessit studiata qui e nel Capitolo 10 ha un duplice
impiego nello studio della sicurezza e della crittografia.
1. La costruzione di chiavi pubbliche richiede la capacit di trovare velocemente nu
meri primi grandi. Un risultato fondamentale della teoria dei numeri afferma che
la probabilit che un numero di ri bit sia un numero primo nellordine di I/n.
Perci, se avessimo un metodo polinomiale in tempo (rispetto a n, non al valore
del numero primo) per verificare se un numero di n bit un numero primo, po
tremmo scegliere numeri a caso, esaminarli e fermarci quando ne abbiamo trovato
uno primo. Questo metodo produce un algoritmo Las Vegas polinomiale in tempo
per scoprire numeri primi, dato che il numero medio di numeri chc dobbiamo esa
minare prima di incontrare un primo di n bit circa n. Per esempio, se vogliamo
primi di 64 bit, dobbiamo verificare in inedia circa 64 interi, anche se in un caso
sfortunato potremmo doverne verificare un numero indefinitamente maggiore. Pur
troppo sembra che non esista un algoritmo che garantisce un tempo polinomiale per
529
i primi; come vedremo nel Paragrafo 11.5.4 esiste invece un algoritmo Montecarlo
in tempo polinomiale.
2. La sicurezza della crittografa basata su R SA dipende dalla mancanza di un metodo
generale e polinomiale in tempo (rispetto al numero di bit della chiave) per scom
porre in fattori un numero, in particolare un numero di cui si sa che il prodotto di
due numeri primi grandi. Sarebbe bello poter dimostrare che linsieme dei primi,
o almeno linsieme dei numeri composti, NP-completo. In questo caso, infatti,
un algoritmo polinomiale che scompone in fattori proverebbe che P rP perch
produrrebbe un algoritmo in tempo polinomiale per quei due linguaggi. Purtroppo
vedremo nel Paragrafo 11.5.5 che sia i numeri primi sia i numeri composti sono in
N P . In quanto complementi luno dellaltro, se uno dei due fosse NP-completo
nc conseguirebbe che rP = co-P, cosa di cui dubitiamo. Inoltre il fatto che
linsieme dei numeri primi in 7Z P significa che. se potessimo dimostrare che i
numeri primi sono NP-completi, potremmo concludere che 'R P = M P : unaltra
situazione improbabile.
11.5.2
Prima di esaminare gli algoritmi per riconoscere linsieme dei numeri primi, presentiamo
le nozioni fondamentali dellaritmetica modulare, ossia le comuni operazioni aritmetiche
eseguite modulo un intero, spesso un numero primo. Sia p un intero. Gli interi modulo p
sono 0 ,1 ,... , p 1.
Possiamo definire somma e prodotto modulo p su questo insieme di p interi eseguendo
il normale calcolo e considerando il resto della divisione per p del risultato. La somma
molto semplice perch il risultato o minore di p, e non dobbiamo fare altro, o com
preso fra p e 2p 2, nel qual caso basta sottrarre p per ottenere un intero nellintervallo
0 .1 ,.. . ,jp 1. La somma modulare rispetta le normali propriet algebriche: commu
tativa, associativa, e ha 0 come identit. La sottrazione ancora linverso della somma;
possiamo calcolare la differenza modulare x y sottraendo come sempre e aggiungen
do p se il risultato minore di 0. Lopposto di x, cio x, coincide con 0 x come
nellaritmetica ordinaria. Quindi 0 = 0, e se x 0, x coincide con p x.
Esempio 11.21 Poniamo p 13. Allora 3-f-5 = 8 e 7 + 10 = 4. Infatti nellaritmetica
ordinaria 7 + 10 = 17, che non inferiore a 13. Perci sottraiamo 13 per ottenere il
risultato corretto, 4. 11 valore di 5 modulo 13 13 5, cio 8. La differenza 1 1 4
modulo 13 7, mentre la differenza 4 LI 6. Infatti nell'aritmetica ordinaria 4 - 1 1 =
7, e aggiungendo 13 otteniamo 6.
La moltiplicazione modulo p viene svolta moltiplicando come si fa con i numeri ordi
nari e prendendo poi il resto del risultato diviso per p. Anche la moltiplicazione soddisfa
530
Capitolo 11
2
3
4
5
6
4
6
1
3
5
3
6
2
5
1
4
5
3
1
6
4
2
1
5
2
6
3
5
4
3
2
1
Esempio 11.22 Nella Figura 11.9 vediamo la tabella di moltiplicazione per interi non
nulli modulo il numero primo 7. Lelemento sulla riga i e sulla colonna j il prodotto
ij modulo 7. Osserviamo chc ogni intero non nullo ha un inverso; 2 e 4 sono ciascuno
linverso dellaltro, cos come 3 c 5, mentre 1 e 6 sono i propri inversi. In altre parole
2 x 4 , 3 x 5 , I X 1 e 6 X 6 sono tutti I. Di conseguenza possiamo dividere per qualsiasi
numero non nullo x/y calcolando y~] e moltiplicando poi x x y-1. Peresempio 3/4 =
3 X 4 -1 = 3 x 2 = 6.
1
2
3
4
5
4
0
2
4
3
0
3
0
3
2
0
4
2
4
3
2
1
531
1.
11.5.3
Prima di trattare le applicazioni del laritmetica modulare alla verifica di primalit, dob
biamo stabilire alcune propriet relative al tempo di calcolo delle operazioni essenziali.
Supponiamo di voler effettuare calcoli nellalgebra modulo un numero primo p , dove la
rappresentazione binaria di p lunga n bit, ovvero p dell'ordine di grandezza di 2n.
Come sempre il tempo di esecuzione di un calcolo dato in termini di n, la lunghezza
dellinput, anzich in termini di p , il valore dellinput. Per esempio, poich contare
fino a p richiede un tempo 0 (2 "), un calcolo che comporti p passi non sar in tempo
polinomiale come funzione di n.
Possiamo certamente sommare due numeri modulo p in un tempii O(n) con un com
puter o con una T M multinastro. Dobbiamo semplicemente sommare i numeri binari, e
se il risultato maggiore o uguale a p , sottrarre p. Analogamente possiamo moltiplicare
due numeri in un tempo 0 ( n 2) con un computer o con una macchina di Turing. Dopo
aver moltiplicato i numeri nel modo consueto e aver ottenuto un risultato di non pi di 2n
bit, dividiamo per p c teniamo il resto.
Calcolare una potenza del numero x pi complicato perch lesponente potrebbe a
sua volta essere esponenziale in ri. Come vedremo, un passo importante l'elevamento
di X alla potenza p 1. Dato che p 1 dell'ordine di 2n, se moltiplicassimo x per se
stesso p 2 volte compiremmo 0 (2 ") moltiplicazioni. Anche se ogni moltiplicazione
coinvolge solo numeri di ri bit e pu essere effettuata in un tempo 0 ( n 2), il tempo totale
sar 0 ( n 22 ), che non polinomiale in ri.
Possiamo per sfruttare la ricorsione per calcolare x~ (oppure ogni altra potenza di
X fino a p ) in un tempo polinomiale rispetto a n .
vD a non confondere con !' ultimo teorema di Fcrmat , che asserisce la non esistenza di soluzioni intere a
Xn + yn = zn per n > 3.
532
C a p ito lo ll
1Cin i
chc c il prodotto dei valori x2' per i quali a,j = 1. Poich nel passo (1) abbiamo cal
colato i (non pi di ri) valori x 2J, ognuno dei quali un numero di n bit, possiamo
calcolare il loro prodotto in un tempo 0 (n 3).
Quindi lintero calcolo di .Tp-1 richiede un tempo 0 ( ).
11.5.4
Consideriamo ora come impiegare un calcolo randomizzato per trovare numeri primi
grandi. Pi precisamente dimostreremo che il linguaggio dei numeri composti in TZV.
Il metodo usato in pratica per generare numeri primi di n bit consiste nel prendere a caso
un numero di n bit e applicare un numero elevato di volte, diciamo 50, il metodo Monte
carlo per riconoscere i numeri composti. Se almeno un esperimento indica che il numero
composto, sappiamo che non un numero primo. Se nessun esperimento indica che
composto, la probabilit che lo sia non supera 2~o0. Quindi possiamo affermare con una
certa fiducia che il numero primo, e fondare le operazioni su questo.
Non daremo lalgoritmo completo, e discuteremo invece unidea che funziona, tranne
che in un numero molto ristretto di casi. Ricordiamo il teorema di Fermat: se p primo
allora xp~l modulo p sempre 1. inoltre un fatto che se p un numero composto, ed
esiste un qualsiasi x per il quale ~ modulo p non 1, allora per almeno la met dei
valori di x nellintervallo da 1 ap 1 vale xp~l 1.
Quindi possiamo utilizzare la seguente procedura come metodo Montecarlo per i
numeri composti.
1. Prendiamo un numero x a caso nellintervallo da I a p 1.
2. Calcoliamo xp~] modulo p. Osserviamo che, se p un numero di ri bit, il calcolo
richiede un tempo 0 ( n 3), come abbiamo visto alla fine del Paragrafo 11.5.3.
533
11.5.5
534
Capitolo 11
i numeri composti.
1. Dato un numero di n bit scegliamo un presunto fattore / di non pi di ri bit, evitando
di scegliere / = I o / = p. Questa parte non deterministica. Ogni possibile
valore di / compare in una sequenza di scelte. 11 tempo richiesto per una qualunque
sequenza di scelte O(n).
2. Dividiamo p per / e verifichiamo se il resto 0. Se s, accettiamo il risultato.
Questa parte deterministica e pu essere completata in tempo 0 {n 2) su una T M
multinastro.
Se p composto deve avere almeno un fattore / diverso da 1 e p. Dato che la N T M
sceglie tutti i numeri di lunghezza fino a n bit, in qualche diramazione sceglier / . Questa
diramazione porta all'accettazione. Nellaltro senso, laccettazione da parte della N T M
implica chc stato trovato un fattore di p diverso da 1 o da p stesso. Quindi la N T M
descritta accetta il linguaggio formato da tutti e soli i numeri composti.
Riconoscere i numeri primi con una N T M pi diffcile. Se possiamo indovinare un
motivo (un fattore) per cui un numero non primo, e verificare che la scelta corretta,
come possiamo indovinare una ragione per cui un numero primo? L'algoritmo non
deterministico in tempo polinomiale si fonda sul fatto (affermato ma non provato) che se
p un numero primo, allora esiste un numero x compreso tra I c p 1 che ha grado p L
Abbiamo visto ncllEsempio 11.23 che per il numero primo p = 7 i numeri 3 e 5 hanno
ambedue grado 6.
Possiamo scegliere facilmente un numero x sfruttando il non determinismo di una
N T M , ma non chiaro come verificare che x ha grado p 1. Infatti, se applichiamo diret
tamente la definizione di grado, dobbiamo verificare che x 2, ar!, . . . , xp~'2 non valgono
1. Questo richiede lesecuzione di p - 3 moltiplicazioni, e quindi un tempo almeno 2\
se p un numero di n bit.
Una strategia migliore impiega un'altra propriet menzionata ma non dimostrata: il
grado di x modulo un primo p un divisore dip 1. Quindi se conosciamo i fattori primi
di p l 10, sufficiente verificare chc
1 per ogni q fattore primo di p 1.
Il numero di queste verifiche 0(n ), cos che possiamo eseguirle tutte con un algoritmo
in tempo polinomiale. Naturalmente non facile fattorizzare p 1 in numeri primi, ma
possiamo scegliere in modo non deterministico i fattori primi di p - 1 e:
a) verificare che il loro prodotto sia p 1
10Osserviamo che, se
p primo,
allora
1 non
mai primo,
= 3.
535
b) verificare che ogni fattore sia primo usando ricorsivamente lalgoritmo non deter
ministico in tempo polinomiale che abbiamo definito.
I dettagli dellalgoritmo e la dimostrazione che non deterministico e in tempo polino
miale si trovano nella dimostrazione del prossimo teorema.
Teorema 11.26 Linsieme dei numeri primi in M T .
DIMOSTRAZIONE Sia p un numero di n bit. Se n non pi grande di 2 (cio p 1, 2 o 3)
rispondiamo direttamente alla domanda: 2 e 3 sono primi, mentre I non lo . Altrimenti
procediamo.
1. Scegliamo una lista di presunti fattori (qi.qo qic). le cui rappresentazioni bi
narie non superino in totale 2n bit, e nessuno dei quali abbia pi di n I bit. Lo
stesso numero primo pu apparire pi di una volta, dato che p 1 pu avere un
fattore primo elevato a una potenza maggiore di I; per esempio se p = 13. i fattori
primi di p 1 = 12 formano la lista (2,2.3). Questa parte non deterministica e
ogni diramazione richiede un tempo (,).
2. Moltiplichiamo i q tra loro e verifichiamo se il prodotto p 1. Questa parte non
richiede un tempo maggiore di 0 ( n 2) ed deterministica.
3. Se il prodotto bp 1, verifichiamo ricorsivamente se ogni numero c primo usando
lalgoritmo descritto.
4. Se i q sono tutti primi, scegliamo un valore di x c controlliamo se
- 1 per
ogni qj. Questa verifica garantisce che x ha grado p 1 modulo p perche, se cos
non fosse, il suo grado dovrebbe dividere almeno un (p - 1 ) / , e abbiamo appena
visto che non vero. Ossen iamo che ogni x elevato a una qualsiasi potenza del
suo grado devessere 1. Per gli elevamenti a potenza si pu applicare un metodo
efficiente come quello descritto nel Paragrafo 11.5.3. Ci sono quindi al massimo k
elevamenti a potenza, cio senzaltro meno di n, ognuno dei quali pu essere svolto
in un tempo 0 ( n 3), con un tempo totale O (ri4) per questo passo.
Infine dobbiamo verificare che questo algoritmo non deterministico impieghi un tempo
polinomiale. Ogni passo, tranne quello ricorsivo (3), richiede un tempo non superiore
a 0 ( n 4) in ogni diramazione non deterministica. Bench la ricorsione sia complicata,
possiamo rappresentare le chiamate ricorsive con lalbero della Figura 11.11. Alla radice
sta il numero primo p di n bit che vogliamo esaminare. 1 suoi figli sono i q, gli ipotetici
fattori di p - 1 da noi scelti, di cui dobbiamo stabilire se sono primi. Sotto ogni ^ si
trovano gli ipotetici fattori di qj 1 che dobbiamo verificare, e cos via, fino a numeri di
non pi di 2 bit, che sono le foglie dellalbero.
536
Capitolo 11
Radice
Livello 1
Livello 2
Figura 11.11 Le chiamate ricorsive dellalgorimo del Teorema 11.26 formano un albero
di altezza e larghezza massima n.
Poich il prodotto dei figli di ogni nodo minore del valore del nodo stesso, il prodotto
dei valori dei nodi a ogni livello di profondit dalla radice al massimo p. 11 lavoro richie
sto per un nodo di valore i, escluso il lavoro svolto nelle chiamate ricorsive, al massimo
aO 0Sa *)4>dove a ^ una costante; abbiamo infatti stabilito che questo lavoro dellordi
ne di grandezza della quarta potenza del numero di bit necessari per la rappresentazione
binaria di i.
Per dare un limite superiore al lavoro necessario a ogni livello, dobbiamo massimizza
re la somma ^ -a (Iog2(ij)) , con il vincolo che il prodotto
non superi p. Poich
la quarta potenza una funzione convessa, il massimo si ottiene quando il valore con
centrato in uno degli ij. Se iy p t non ci sono altri ij, la somma a(log2 ). Questo
al massimo , dato che n il numero di bit della rappresentazione binaria di p. Quindi
Iog2 p non supera n.
Concludiamo che il lavoro richiesto a ogni livello al massimo 0 ( n 4). Dato che
ci sono al massimo n livelli, un lavoro 0 ( n r) sufficiente in ogni diramazione della
procedura non deterministica che verifica se p sia primo o no.
Ora sappiamo che sia i primi sia il loro complemento sono in AfV. Se luno o Paltro
fosse NP-completo, allora per il Teorema 11.2 avremmo una dimostrazione che A rV =
co-A'V.
11.5.6
Esercizi
Riepilogo
537
* b) 9 - 1 1
c) 5 X 8
* d) 5/8
e) 58.
Esercizio 11.5.2 Nel Paragrafo 11.5.4 abbiamo affermalo che, per la maggior parte dei
valori di x compresi tra 1 e 5 60. x560 = l modulo 561. Scegliete alcuni valori di x e
verificate lequazione. Ricordate di esprimere prima 560 in binario e poi calcolate x 2
modulo 561 per vari valori di j, per evitare di fare 559 moltiplicazioni, come spiegato nel
Paragrafo 11.5.3.
Esercizio 11.5.3 Un intero x compreso tra 1 e p 1 si dice un residuo quadratico modulo
p se esiste un intero y compreso fra 1 e p 1 tale chc y2 = x.
* a) Quali sono i residui quadratici modulo 7? Potete usare la tabella della Figura 11.9.
b) Quali sono i residui quadratici modulo 13?
! c) Dimostrate che se p primo, il numero dei residui quadratici modulo p (p
1 )/2, cio esattamente met degli interi non nulli modulo p sono residui quadratici.
Suggerimento: esaminate i risultati dei punti (a) c (b). Ne emerge uno schema
che spieghi per quale ragione ogni residuo quadratico il quadrato di due numeri
diversi? Un intero pu essere il quadrato di tre numeri diversi se p primo?
11.6
Riepilogo
538
Capitolo 11
11.7
Bibliografia
La relazione [2] ha dato inizio allo studio delle classi di linguaggi definiti da limiti sullo
spazio in una macchina di Turing. I primi problemi PS-completi sono descritti da Karp
[4] in un lavoro che esamina limportanza della NP-completezza. Ne abbiamo tratto la
PS-completezza del problema enunciato nellEsercizio 11.3.2, ossia se unespressione
regolare sia equivalente a *.
Bibliografa
539