Automi, Linguaggi e Calcolabilità - Hopcroft, Motwani, Ullman - 3 Ed. Pearson-Addison-Wesley

Scarica in formato pdf o txt
Scarica in formato pdf o txt
Sei sulla pagina 1di 548

Sommario

Automi: metodo e follia


1. 1 Perch studiare la teoria degli au to m i..............................................................
1.1.1 Introduzione agli automi a stati fin iti.................................................
1.1.2 Rappresentazioni strutturali ..............................................................
1.1.3 Automi e com plessit...........................................................................
1.2 Introduzionealledim ostrazioniform ali ..............................................
1.2.1 Dimostrazioni deduttive .....................................................................
1.2.2 Riduzione a definizioni..............................................................
1.2.3 A ltre fo rm e d ite o re m i........................................................................
1.2.4 Teoremi che non assomigliano a enunciati se-allora ...................
1.3 Altre forme di d im o strazio n e...........................................................................
1.3.1
Dimostrazioni di equivalenze tra in siem i..........................................
1.3.2 Ilcontronom inale.................................................................................
1.3.3 D im o strazio n ip erassu rd o .................................................................
1.3.4 C ontroesem pi........................................................................................
1.4 D im ostrazioniinduttivc.....................................................................................
1.4.1 In d u z io n isu g liin te ri................................................................. ...
1.4.2 Forme pi generali di induzioni sugli i n t e r i ....................................
1.4.3 Induzionistrutturali ...........................................................................
1.4.4 In d u z io n e m u tu a .................................................................................
1.5 I concetti centrali della teoria degli a u to m i....................................................
1.5.1
A lfa b eti..................................................................................................
1.5.2 S tringhe..................................................................................................
1.5.3 L inguaggi..............................................................................................
1.5.4 P r o b le m i...............................................................................................
1.6 R ie p ilo g o ............................................................................................................
1.7 B ib lio g rafia........................................................................................................

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

Espressioni e linguaggi regolari


89
3.1 E spressionircgolari.........................................................................................
89
3.1.1 Gli operatori delle espressioni reg o lari.............................................. 90
3.1.2 Costruzione di espressioni regolari....................................................
92
3.1.3 Precedenza degli operatori delle espressioni r e g o l a r i .................... 94
3.1.4 E s e rc iz i.................................................................................................
96
3.2 Automi a stati finiti ed espressioni reg o lari....................................................
97
3.2.1 D aiD FA alleespressioniregolari .......................................... ...
97
3.2.2 Conversione di DFA in espressioni regolari per
eliminazione di stati .......................................................................... 103
3.2.3 C onversionediespressioniregolariinautom i................................ 109
3.2.4 E s e rc iz i................................................................................................. 114
3.3 Applicazioni delle espressioni re g o la ri.......................................................... 116
3.3.1
Leespressioni regolari in U N I X ....................................................... 116
3.3.2 Analisi lessicale ................................................................................. 118
3.3.3 Ricerca di pattern in un te s to ..............................................................120
3.3.4 E se rc iz i................................................................................................. 122
3.4 Propriet algebriche per le espressioni regolari............................................. 122
3.4.1
Associativit e c o m m u ta tiv it .......................................................... 123
3.4.2 Identit e a n n ic h ila to ri....................................................................... 123
3.4.3 Propriet d istrib u tiv e...........................................................................124
3.4.4 La propriet di id em p o ten za..............................................................125
3.4.5 Propriet relative alla c h iu su ra .......................................................... 125
3.4.6 Alla ricerca di propriet per le espressioni regolari .......................126
3.4.7 Verifica di propriet algebriche sulle espressioni re g o la ri............. 128
3.4.8 E s e rc iz i................................................................................................. 129
3.5 R ie p ilo g o ........................................................................................................... 131
3.6 B ib lio g rafia........................................................................................................131

P ropriet dei linguaggi regolari


133
4.1 Dimostrare che un linguaggio non regolare.................................................133
4 .1. 1 II pumping lemma per i linguaggi re g o la ri.......................................134
4.1.2 Applicazioni del pumping l e m m a .................................................... 135
4.1.3 E se rc iz i................................................................................................. 137
4.2 Propriet di chiusura dei linguaggi regolari.................................................... 139
4.2.1 C hiusuradeilinguaggiregolaririspettoaoperazionibooleane . . 139
4.2.2 Inversione. ........................................................................................... 146
4.2.3 Om om orfism i....................................................................................... 147
4.2.4 Omomorfismi in v e rs i...........................................................................149
4.2.5 E se rc iz i................................................................................................. 155

viii

Sommario
4.3

4.4

4.5
4.6
5

Problemi di decisione per i linguaggi r e g o la r i ..............................................158


4.3.1
C onversioni............................................................................................159
4.3.2 Verificare se un linguaggio regolare v u o to .................................... 161
4.3.3 A ppartenenzaaunlinguaggioregolare ...........................................162
4.3.4 E s e rc iz i.................................................................................................. 163
E quivalenzaem inim izzazionediautom i........................................................164
4.4.1
Verifica dellequivalenza di s t a t i ........................................................164
4.4.2 Equivalenza di linguaggi regolari .....................................................167
4.4.3 M in im iz z a z io n e d iD F A .....................................................................169
4.4.4 Perch il DFA minimo non pu essere m ig lio ra to .......................... 172
4.4.5 E s e rc iz i.................................................................................................. 175
R ie p ilo g o ............................................................................................................ 175
B ib lio g ra fia.........................................................................................................176

G ram m atiche e linguaggi liberi dal contesto


179
5.1 G ra m m a tich e lib e rcd alco n te sto .....................................................................IBO
5 . 1.1
U n e s e m p io in fo rm a le ........................................................................ 180
5.1.2 D efinizionedellegram m atichelibercdalcontesto.......................... 181
5.1.3 Derivazioni per mezzo di una g ra m m atica....................................... 183
5.1.4 Derivazioni a sinistra e a destra ........................................................186
5.1.5 T llin g u ag g io d iu n ag ram m atica........................................................188
5.1.6 Forme sentenziali.................................................................................. 189
5.1.7 E s e rc iz i.................................................................................................. 190
5.2 Alberi s in ta ttic i.................................................................................................. 192
5.2.1 C o stru zio n ed ialb erisin tattic i........................................................... 193
5.2.2 Ilp ro d o tto d iu n alb ero sin tattic o ........................................................195
5.2.3 Inferenza, derivazioni e alberi sintattici ...........................................196
5.2.4 D a lle in fe re n z e a g lia lb e ri................................................................. 197
5.2.5 Dagli alberi alle d e riv a z io n i.............................................................. 198
5.2.6 Dalle derivazioni alle inferenze ricorsive...........................................202
5.2.7 E s e rc iz i.................................................................................................. 203
5.3 A p p licazionidellcgram m aticheliberedalcontesto.................................... 204
5.3.1 P a r s e r ......................................................................................................204
5.3.2 YACC: un generatore di p a rse r........................................................... 206
5.3.3 Linguaggi di m a rk u p ........................................................................... 208
5.3.4 X M L c D T D .........................................................................................211
5.3.5 E s e rc iz i.................................................................................................. 217
5.4 Ambiguit nelle grammatiche e nei lin g u a g g i..............................................218
5.4.1
G ram m aticheam bigue........................................................................ 218
5.4.2 Eliminare le ambiguit da una grammatica .................................... 220

Sommario

ix

5.4.3 Derivazioni a sinistra come modo per esprimere lambiguit . . . 223


5.4.4 Ambiguit in e re n te ............................................................................... 224
5.4.5 E s e rc iz i................................................................................................... 227
5.5 R ie p ilo g o ............................................................................................................. 229
5.6 B ib lio g ra fia .......................................................................................................... 230
6

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

P ro p riet dei linguaggi liberi dal contesto


271
7.1 F o rm en o m ialip e rg ra m m atich e lib ered alco n testo .................................... 271
7.1.1
E lim in az io n ed isim b o liin u tili............................................................272
7.1.2 C alco lo d eisim b o lig en erato rierag g iu n g ib ili................................. 274
7.1.3 Eliminazione di f-produzioni............................................................... 275
7.1.4 Eliminazione delle produzioni u n ita rie .............................................. 279
7.1.5 F o rm a n o rm a le d iC h o m sk y ............................................................... 283
7.1.6 E s e rc iz i................................................................................................... 286

Sommario
7.2

7.3

7.4

7.5
7.6

11 pumping lenuna per i linguaggi liberi dal c o n testo .................................... 291


7.2.1 Dim ensionedeglialberisintattici .....................................................291
7.2.2 Enunciato del pumping le m m a ........................................................... 292
7.2.3 Applicazioni del pumping lemma per i C F L .................................... 294
7.2.4 E se rc iz i.................................................................................................. 297
Propriet di chiusura dei linguaggi liberi dal c o n te s to .................................299
7.3.1
S ostituzioni............................................................................................299
7.3.2 Applicazioni del teorema di sostituzione...........................................301
7.3.3 Inversione............................................................................................... 302
7.3.4 Intersezione con un linguaggio re g o la re ...........................................302
7.3.5 Omomorfismo in v e r s o ........................................................................ 307
7.3.6 E s e rc iz i.................................................................................................. 309
Propriet di decisione dei C F L ........................................................................ 311
7.4.1 Complessit delle conversioni fra CFG e P D A .................................312
7.4.2 Tempo di esecuzione della conversione in forma normale
di C h o m sk y ............................................................................................313
7.4.3 Verificare se un CFL v u o to .............................................................. 314
7.4.4 Appartenenza a un CFL .....................................................................316
7.4.5 Anteprima di problemi indecidibili per i C F L .................................320
7.4.6 E s e rc iz i.................................................................................................. 321
R ie p ilo g o ............................................................................................................ 322
B ib lio g rafia.........................................................................................................323

M acchine di Tiring: introduzione


325
8.1 Problemi che i calcolatori non possono riso lv ere...........................................325
8.1.1
Programmi che stampano Ciao, mondo ....................................... 326
8.1.2 Un ipotetico verificatore di c ia o -m o n d o ...........................................329
8 . 1.3
Ridurre un problema a un a ltr o ........................................................... 332
8.1.4 E s e rc iz i.................................................................................................. 335
8.2 La macchina di T u r i n g ..................................................................................... 335
8.2.1 L aricercadellasoluzioneatuttcledom andem atem atiche . . . . 336
8.2.2 Notazione per la macchina di T u rin g ................................................. 337
8.2.3 Descrizioni istantanee delle macchine di T u rin g ..............................339
8.2.4 Diagrammi di transizione per le macchine di Turing ....................342
8.2.5 Illin g u a g g io d iu n a m a c c h in a d iT u rin g ...........................................346
8.2.6 Le macchine di Turing e larresto .................................................... 346
8.2.7 E s e rc iz i.................................................................................................. 347
8.3 Tecnichedi programmazione per le macchine di T u rin g ..............................349
8.3.1
Memoria nello stato ................ ...........................................................349
8.3.2 Tracce m u ltip le ..................................................................................... 351

Som m ano

xi

8.3.3 S u b ro u tin e ........................................................................................... 353


8.3.4 E se rc iz i.................................................................................................. 354
8.4 Estensioni alla macchina di Turing se m p lic e ................................................. 356
8.4.1
M acch in ed iT u rin g m u ltin astro ........................................................356
8.4.2 Equivalenza di macchine di Turing mononastro e multi nastro . . . 357
8.4.3 Tempo di esecuzione e costruzione da n a un n a stro .......................359
8.4.4 Macchine di Turing non determ inistiche...........................................360
8.4.5 E s e rc iz i.................................................................................................. 362
8.5 Macchine di Turing r i d o t t e .............................................................................. 365
8.5.1
Macchine di Turing con nastri se m i-in fin iti....................................365
8.5.2 Macchine m u ltista c k ........................................................................... 368
8.5.3 M a c ch in eaco n tato ri........................................................................... 371
8.5.4 La potenza delle macchine a c o n ta to ri..............................................372
8.5.5 E se rc iz i.................................................................................................. 374
8.6 L e m a c c h in e d iT u rin g c ic o m p u te r.............................................................. 375
8 .6 . 1 Simulazione di una macchina di Turing da parte di un computer . 375
8.6.2 Simulazione di un computer da parte di una macchina di Turing . 378
8.6.3 Confronto dei tempi di esecuzione dei computer
e delle macchine di T u r in g ................................................................. 382
8.7 R ie p ilo g o ............................................................................................................ 385
8.8 B ib lio g ra iia ..................................................................................? ...................387
9

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

10.4.6 Riepilogo dei problemi N P-com pleti................................................. 487


10.4.7 K sercizi.................................................................................................. 488
10.5 R ie p ilo g o ............................................................................................................492
10.6 B ib lio g ra fia.........................................................................................................493
11 Altre classi di problem i
495
11.1 Complementi dei linguaggi in J s f V ................................................................. 496
11.1.1 La classe di linguaggi CO-ArP ........................................................... 497
11.1.2 Problemi NP-completi e co - A f V .................................................... ... 498
11.1.3 E s e rc iz i.................................................................................................. 499
11.2 Problemi risolvibili in spazio p o lin o m ia le .................................................... 499
11.2.1 Macchine di Turing a spazio p o lin o m ia le ....................................... 500
11.2.2 Lc relazioni di V S ed A-rV S con altre c la s s i.................................... 501
11.2.3 Spazio polinomiale deterministico e non determ inistico................ 502
11.3 Un problema completo per V S ........................................................................505
11.3.1 PS-com pletezza..................................................................................... 505
11.3.2 F orm ulebooleaneconquantificatori................................................. 506
11.3.3 Valutazione di formule booleane con q u an tificato ri.......................507
509
11.3.4 PS-completezza del problema Q B F .......................................
11.3.5 E s e rc iz i.................................................................................................. 514
1 1 .4 Classi di linguaggi basate sulla randomizzazione ....................................... 515
11 .4 . 1 Quicksort: un esempio di algoritmo random izzato.......................... 515
11.4.2 Un modello di macchina di Turing con random izzazione............. 516
11.4.3 II linguaggio di una macchina di Turing ra n d o m iz z a ta ................ 518
11.4.4 La classe T Z V ........................................................................................ 520
11.4.5 Riconoscimento di linguaggi in
................................................. 522
11.4.6 La classe Z V V .....................................................................................524
1 1 .4.7 Relazioni tra W e Z V V ................................................................. 524
1 1 .4.8 Relazioni con le classi V ed M V ........................................................525
11.5 Complessit e numeri p rim i.............................................................................. 527
11.5.1 Limportanza della verifica di p r im a lit ...........................................527
11.5.2 Introduzione allaritmetica m odulare................................................. 529
11.5.3 La complessit del calcolo in aritmetica m odulare.......................... 531
11.5.4 Verifica di primalit in tempo polinomiale ra n d o m iz z a to ............. 532
11.5.5 Verifiche di primalit non determ inistiche....................................... 533
11.5.6 E s e rc iz i.................................................................................................. 536
11.6 R ie p ilo g o ............................................................................................................ 537
11.7 B ib lio g ra fia.........................................................................................................538
Indice analitico

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

che immediatamente monetizzabili. D altra parte, se vogliamo che la materia conservi il


suo ruolo tra le discipline proposte agli studenti di informatica, riteniamo indispensabile
sottolinearne le applicazioni, accanto agli aspetti matematici. Abbiamo perci sostituito
alcuni fra gli argomenti pi avanzati delledizione precedente con esempi di come i con
cetti possono essere applicati nella pratica. Le applicazioni della teoria degli automi e
dei linguaggi formali ai compilatori sono ormai talmente consolidate da essere di norma
trattate nei corsi sui compilatori, ma ci sono impieghi pi recenti, tra cui gli algoritmi
di model-checking per verificare protocolli, e i linguaggi di descrizione di documenti,
strutturati in modo simile alle grammatiche libere dal contesto.
U nultima spiegazione dellampliamento e al contempo riduzione del libro risiede
nel limpiego di due sistemi di composizione tipografica, TgX e LTgX, sviluppati da Don
Knuth e Les Lamport. Uno stile aperto di composizione, che produce libri di mole
maggiore, ma di pi agevole lettura, favorito in particolare da LTgX. Gli sforzi dei loro
ideatori meritano il nostro apprezzamento.

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

Automi: metodo e follia


La teoria degli automi c lo studio di dispositivi astratti di calcolo, o macchine. Negli an
ni 30, prima dellavvento dei computer, A. Turing studi una macchina astratta che aveva
tutte le capacit degli elaboratori odierni, almeno per quanto riguarda ci che possono cal
colare. Tl fine di Turing era descrivere precisamente il confine tra quello che un dispositivo
di calcolo pu fare e quello che non pu fare; le sue conclusioni non riguardano solo le
sue macchine di Turing astratte, ma anche le macchine reali di adesso.
Negli anni '40 c '50 diversi ricercatori studiarono alcuni tipi pi semplici di macchi
ne, che oggi sono dette automi a siali finiti. Questi automi, pensati originariamente per
fornire un modello del funzionamento cerebrale, risultarono utili per molti altri scopi, che
saranno introdotti nel Paragrafo 1.1. Nello stesso periodo, nei tardi anni 50. il lingui
sta N. Chomsky inizi a studiare le grammatiche formali. Per quanto non siano delle
macchine in senso proprio, queste grammatiche sono strettamente collegato agli automi
astratti e oggi stanno alla base di alcuni importanti componenti software, tra cui parti dei
compilatori.
Nel 1969 S. Cook approfond gli studi di Turing su ci che si pu calcolare. Cook riu
sc a distinguere i problemi risolvibili in modo efficiente da un elaboratore da quelli chc
possono essere risolti in linea di principio, ma che di fatto richiedono cos tanto tempo da
rendere inutilizzabile un computer se non per istanze del problema di dimensione limitata.
Questa seconda classe di problemi viene definita intrattabile, o NP-hard. E mollo proba
bile che nemmeno il progresso esponenziale nella velocit di calcolo dellhardware (legge
di Moore) avr un effetto determinante sulle nostre capacit di risolvere casi significativi
di problemi intrattabili.
Tutti questi sviluppi teorici hanno un rapporto diretto con quanto gli informatici fanno
attualmente. Alcuni concetti, come gli automi a stati finiti e certi tipi di grammatiche for
mali, vengono usati nella progettazione e realizzazione di importanti tipi di software. Altri
concetti, come la macchina di Turing, aiutano a comprendere che cosa ci si pu aspetta

Capitolo I

re dal software. In particolare la teoria dei problemi intrattabili permette di capire se


probabile che si riesca ad affrontare un problema direttamente e a scrivere un programma
per risolverlo (in quanto non incluso nella classe intrattabile), oppure se sia necessario
escogitare un modo per aggirarlo: trovare unapprossimazione, usare un metodo euristico
o di qualche altra natura per limitare la quantit di tempo che il programma impiega per
risolvere il problema.
In questo capitolo introduttivo si comincia da una panoramica ad alto livello della
teoria degli automi e delle sue applicazioni. Gran parte del capitolo dedicata allindagine
delle tecniche di dimostrazione e ai modi per ideare dimostrazioni. Ci occupiamo di
dimostrazioni deduttive, di riformulazioni di enunciati, di dimostrazioni per assurdo e
per induzione, e di altri importanti concetti. Lultimo paragrafo introduce i concetti che
permeano la teoria degli automi: alfabeti, stringhe e linguaggi.

1.1

Perch studiare la teoria degli automi

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

Introduzione agli automi a stati finiti

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

Perch studiare la teoria degli automi

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

F ig u ra 1.1 Un automa a stati finiti che rappresenta un interruttore.


Tl modello di automa a stati finiti per linterruttore rappresentato nella Figura 1.1. Come
per tutti gli automi a stati finiti, gli stati vengono indicati per mezzo di cerchi: nellesempio
considerato gli stati sono stati chiamati o ffe on. Gli archi tra gli stati vengono etichettati
dagli input, che rappresentano le influenze esterne sul sistema. Qui ambedue gli archi
sono etichettati dallinput Push, che rappresenta la pressione del pulsante. 11 significato
dei due archi chc, indipendentemente dallo stato presente, a fronte di un input Push il
sistema passa nellaltro stato.
Uno degli stati detto stato iniziale, cio lo stato in cui il sistema si trova inizial
mente. Nellesempio lo stato iniziale off, e per convenzione lo denoteremo con la parola
Stari (avvio) e una freccia che punta a quello stato. Spesso necessario indicare uno o
pi stati come gli stati finali o accettanti . Se uno di questi stati viene raggiunto dopo
una sequenza di input, tale sequenza di input si considera valida. Per esempio potremmo

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.

Figura 1.2 Un automa a stati finiti che modella il riconoscimento di t h e n .


Nella Figura 1.2 i cinque stati prendono il nome del prefisso di t h e n visto fino a quel
punto. Gli input corrispondono alle lettere. Possiamo immaginare che lanalizzatore les
sicale esamini un carattere per volta tra quelli del programma che sta compilando; ogni
nuovo carattere della sequenza da esaminare linput dellautoma. Lo stato iniziale corri
sponde alla stringa vuota e ogni stato ha una transizione attraverso la successiva lettera di
t h e n nello stato che corrisponde al prefisso pi ampio che viene immediatamente dopo.
Si passa allo stato chiamato t h e n quando linput ha formato la parola t h e n . Poich il
compito di questo automa riconoscere quando t h e n stato visto, possiamo considerare
quello come l'unico stato accettante.

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

Perch studiare la teoria degli automi

regola mostra come si formano di solito le espressioni dei linguaggi di programma


zione. Lc grammatiche libere dal contesto (context-free grammars), come vengono
comunemente chiamate, verranno introdotte nel Capitolo 5.
2. Anche le espressioni regolari denotano la struttura di un dato, specialmente di strin
ghe testuali. Come si vedr nel Capitolo 3, le configurazioni di stringhe che ven
gono descritte dalle espressioni regolari sono esattamente le stesse che possono
essere descritte da automi a stali finiti. Lo stile di queste espressioni si differenzia
significativamente da quello delle grammatiche. Limitiamoci a un semplice esem
pio. Lespressione regolare in stile UNIX ' [A -Z ] [ a - z ] * [ ] [A -Z ] [A -Z ] '
rappresenta parole con lettere iniziali maiuscole seguite da uno spazio e due lettere
maiuscole. Questa espressione rappresenta configurazioni testuali che potrebbero
indicare una citt seguita dall'indicazione dello stato, come I t h a c a NY. Non rie
sce a rappresentare nomi di citt formati da pi parole, come P a l o A l t o CA,
che potrebbe essere reso dallespressione pi complessa
'[A-Z][a-z]*([ ] [A-Z][a-z]*)*[ ] [A-Z][A-Z]'
Quando interpretiamo questa espressione, Punica cosa chc dobbiamo sapere che
[A -Z ] rappresenta una gamma di caratteri dalla A maiuscola alla Z maiuscola
(ossia qualunque lettera maiuscola) e [ ] indica il singolo carattere di spaziatu
ra. Inoltre * rappresenta qualunque numero di rispetto allespressione prece
dente. Lc parentesi si usano per raggruppare componenti dellespressione: non
rappresentano caratteri del testo descritto.

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

Introduzione alle dimostrazioni formali

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

Introduzione alle dimostrazioni formali

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

Se x > 4, allora (rr + l ) / ,r non

pu essere maggiore di 1,25, e perci ( i ^ i) * non pu essere maggiore di 1,5625. Dato


chc 1.5625 < 2, quando x maggiore di 4 il membro sinistro 2X cresce pi del membro
destro x 2. Dunque, purch si parta da un valore come x = 4, per cui la disuguaglianza
2X > x 2 gi soddisfatta, possiamo incrementare x quanto vogliamo e la disuguaglianza
rester soddisfatta.
Con ci abbiamo completato una dimostrazione informale ma rigorosa del Teore
ma 1.3. Ci ritorneremo precisando la dimostrazione neHEsempio 1.17, dopo aver intro
dotto le dimostrazioni induttive.
Il Teorema 1.3, come tutti i teoremi interessanti, implica un numero infinito di fatti
correlati, in questo caso lenunciato se x > 4 allora 2X > x 2" per tutti gli interi x.
Di fatto non abbiamo bisogno di assumere che x sia un intero, ma nella dimostrazione

Capitolo I

si parlato ripetutamente di incrementare x di 1 partendo da x = 4. Ci siamo dunque


effettivamente occupati solo della situazione in cui x un intero.

Enunciati con quantificatori


In molti teoremi compaiono enunciati che usano i quantificatori per ogni ed
esiste, o varianti simili, come per qualunque invece di per ogni. Lordine
in cui compaiono inlluisce sul significato dellenunciato. Spesso utile vedere
gli enunciati con pi di un quantificatore come una partita tra due giocatori,
per-ogni ed esiste, che a turno specificano i valori dei parametri menzionati
nel teorema. Poich per-ogni deve considerare tutte le scelte possibili, general
mente le sue scelte sono lasciate come variabili; esiste, invece, deve selezionare
un valore, chc pu dipendere dai valori scelti in precedenza. L'ordine dei quan
tificatori nell'cnunciato determina chi parie per primo. Se lultimo giocatore che
compie una scelta pu trovare sempre un valore accettabile, lenunciato vero.
Consideriamo per esempio una definizione alternativa di insieme infinito:
linsieme S infinito se e solo se, per ogni inicro n, esiste almeno un sottoinsicme T di S con n elementi. Qui per-ogni precede esiste, dunque dobbiamo
considerare un intero arbitrario n. Ora esiste seleziona un sottoinsieme T ser
vendosi della sua conoscenza di n. Per esempio, sc S fosse l'insieme degli interi,
esiste potrebbe scegliere il sottoinsieme T = { 1 , 2 , . . . , n} e cos farcela quale
che sia n. Questa una dimostrazione che linsieme degli interi infinito.
Lenunciato seguente sembra simile alla definizione di infinito, ma scorret
to perch rovescia lordine dei quantificatori: esiste un sottoinsieme T dellin
sieme S tale che. per qualunque ri, linsieme T ha esattamente n elementi. Ora,
dato un insieme S come gli interi, il giocatore esiste" pu selezionare qualsia
si insieme T . Poniamo che venga scelto {1,2,5}. Per questa scelta il giocatore
per-ogni deve mostrare che T ha n elementi per ogni possibile ri. Tuttavia perogni non pu farlo. Per esempio laffermazione falsa per n = 4 e, di fatto, per
ogni ri 3.

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

Introduzione alle dimostrazioni formali

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

Figura 1.3 Una dimostrazione formale del Teorema 1.4.


Nel passo (2) stabiliamo laltra parte dellipotesi del teorema: che i valori da elevare al
quadrato siano uguali almeno a 1. Tecnicamente questo enunciato rappresenta quattro
enunciati distinti, uno per ognuno dei quattro interi in questione. Poi nel passo (3) osser
viamo che se un numero almeno 1. anche il suo quadrato almeno 1. Adduciamo come
giustificazione il fatto che lenunciato ( 2 ) valido e facciamo riferimento a propriet
dellaritmetica. Cio presumiamo che il lettore conosca, o possa dimostrare, enunciali
semplici sulle diseguaglianze, come lenunciato se y > 1 , allora y 2 > 1 .
Il passo (4) impiega gli enunciati ( I ) e (3). Il primo enunciato dice che x la somma
dei quattro quadrati in questione e lenunciato (3) dice che ognuno dei quadrati almeno
1 . Ricorrendo di nuovo a ben noti principi dellaritmetica, concludiamo che x almeno
14-1 + 1 + 1, cio 4.

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.

Introduzione alle dimostrazioni formali


Enunciato originale

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

F igura 1.4 Riformulazionc dei dati del Teorema 1.5.

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

Altre forme di teoremi

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

Modi di dire se-allora


In primo luogo ci sono svariati tipi di enunciati di teoremi che sembrano diversi da una
fonila semplice come sc H allora C , ma che effettivamente dicono la stessa cosa: se
lipotesi H vera per un valore dato del parametro (o dei parametri), allora la conclusione
C vera per lo stesso valore. Ecco altri modi in cui pu presentarsi se H allora C".
1. TI implica C.
2. Ti solo se C .
3. C se H.
4. Quando H , segue C.
Inoltre ci sono molte varianti della forma (4), come se vale H , allora ne consegue C n,
oppure ogni volta chc vale H , vale anche C n.
Esempio 1.6 Lenunciato del Teorema 1.3 si presenta cos in queste quattro forme:
1. X > 4 implica 2X > x 2
2. X > 4 solo sc 2X > X 2
3. 2X > X 2 se X > 4
4. quando x > 1. segue 2X > x 2.

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").

Introduzione alle dimostrazioni formali

13

Quanto formali devono essere le dimostrazioni


Risolvere la questione non facile. Il fattore essenziale in materia di dimostra
zioni che il loro scopo quello di convincere qualcuno, un docente che valuta il
compito o lautore stesso, della correttezza di una strategia chc si sta usando nel
codice. Se convincente non occorre altro; se invece non riesce a convincere il
destinatario della dimostrazione, segno che si sono tralasciati troppi elementi.
Parte dellinccrtczza riguardo alle dimostrazioni dovuta al diverso grado
di conoscenza del destinatario. Perci nel Teorema 1.4 abbiamo supposto che il
lettore avesse una conoscenza completa dellaritmetica e che avrebbe creduto a
un enunciato come se y > 1 allora y 2 > 1". In caso contrario si sarebbe dovuto
procedere con qualche passo nella dimostrazione deduttiva.
Tuttavia determinati elementi sono obbligatori nelle dimostrazioni: la loro
omissione rende inadeguata una dimostrazione. Per esempio qualunque dimo
strazione deduttiva che impieghi enunciati non giustificati dallipotesi o da enun
ciati precedenti non pu essere adeguata. Quando svolgiamo la dimostrazione
di un enunciato se e solo se, di certo dobbiamo avere una dimostrazione per
la parte se e unaltra per la parte solo-se. A titolo di esempio aggiuntivo, le
dimostrazioni induttive, discusse nel Paragrafo 1.4, richiedono dimostrazioni per
la base e per linduzione.

2. La parte solo-se: se A allora B , spesso formulata nella forma equivalente uA


solo se B ".
Lc dimostrazioni possono essere presentate in qualsiasi ordine. In molti teoremi una parte
c decisamente pi facile dellaltra, ed comune, per togliersi il pensiero, presentare prima
la direzione pi semplice.
Per denotare un enunciato se-e-solo-se, nella logica formale si pu trovare loperatore
<-* oppure = . Cio A = B e A ^ B hanno lo stesso significato di iiA se e solo se B".
Quando si dimostra un enunciato se-e-solo-se, importante ricordare che si deve di
mostrare sia la parte se sia la parte solo-sc . A volte sar utile scomporre un se-e-solose in una successione di equivalenze. Vale a dire, per dimostrare uA se e solo se B si
pu in primo luogo dimostrare A se e solo se C , e poi dimostrare C se e solo se B '\
Il metodo funziona, purch si ricordi che ogni passo se-e-solo-sc deve essere dimostrato
in entrambe le direzioni. Dimostrare un qualunque passo in una sola direzione inficia
lintera dimostrazione.
Vediamo un esempio di semplice dimostrazione se-e-solo-se in cui si fa uso delle
notazioni seguenti.

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

Teoremi che non assomigliano a enunciati se-allora

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

Altre forme di dimostrazione

In questo paragrafo trattiamo alcuni argomenti supplementari riguardanti la stesura di


dimostrazioni:
1 . dimostrazioni sugli insiemi
2 . dimostrazioni per assurdo

3. dimostrazioni per controesempio.

Altre Conrie di dimostrazione

1.3.1

15

Dimostrazioni di equivalenze tra insiemi

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

2. dimostrare che se x in E , allora x c in E.


Per esemplificare questo processo dimostrativo proviamo la propriet distributiva dell'u
nione rispetto a llintersezione.
Teorem a 1.10 R U (S T ) = {R U S ) (R U ).
DIMOSTRAZIONE Lc due espressioni insiemistiche sono E = R u (S T ) e
F = (R U S ) n (R U T )

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) e definizione di unione


(3) e definizione di unione
(4), (5), e definizione
di intersezione

Figura 1.5 Passi della parte se del Teorema 1.10.


i Enunciato
1.
2.

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

F igura 1.6 Passi della parie solo-se del Teorema 1.10.

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.

Altre forme di dimostrazione

17

Se-e-solo-se per insiemi


Come menzionalo, i teoremi che affermano equivalenze fra espressioni sugli in
siemi sono enunciati se-e-solo-se. Dunque il Teorema I. IO si pu esprimere cos:
un elemento x in l U ( S T) se e solo se x in

(.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

Dimostrazioni per assurdo

Un altro modo di dimostrare un enunciato nella forma se H allora Cn dimostrare,


lenunciato
itH e non C implica il falso.
In altre parole si assumono inizialmente sia lipotesi H sia la negazione della conclusione
C c si completa la dimostrazione provando che qualcosa di notoriamente falso segue
logicamente da H e non C . Questa forma detta dimostrazione per assurdo.
Esem pio 1.12 Consideriamo il Teorema 1.5 in cui stato dimostrato un enunciato seallora con lipotesi TT = uU un insieme infinito, S un sottoinsieme finito di U c T
il complemento di S rispetto a U '\ La conclusione C era T infinito. Abbiamo
dimostrato questo teorema per assurdo, assumendo non C n', vale a dire, abbiamo assunto
che T sia finito.
La dimostrazione mirava a derivare il falso da H e non C . In primo luogo abbiamo
mostrato, a partire dallassunto che S e T sono entrambi finiti, che anche U devessere
finito. Ma poich si detto nellipotesi H che U infinito, e un insieme non pu essere
contemporaneamente finito e infinito, stato dimostrato lenunciato logico falso. In
termini logici abbiamo sia una proposizione p (U finito) sia la sua negazione non p (U
infinito). Ci serviamo dunque del fatto che p e non p equivale logicamente a falso.

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".

Altre forme di dimostrazione

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.

Discutiamo ora un teorema relativo allaritmetica modulare. Si deve porre in primo


luogo una definizione essenziale: se a e ft sono interi positivi, allora a mod b il resto
della divisione di a per b, vale a dire l'unico intero r tra O e f t - 1 tale che a = qb 4- r per
un intero q. Per esempio 8 mod 3 = 2 e 9 mod 3 = 0. Tl primo teorema candidato, chc si
vedr falso, c il seguente.
Teorem a presunto 1.14 Non esiste una coppia di numeri interi a c ft tali che
a mod ft = b mod a

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

X = 0 per qualunque intero x. Perci a mod 6 = 6 mod a = 0 se a = 6.


(Parte solo-se) Supponiamo ora chc a mod 6 = 6 mod a. Il miglior modo di procedere
una dimostrazione per assurdo; assumiamo dunque anche la negazione della conclusio
ne, ossia sia a b. Allora, poich a = 6 eliminato, restano da considerare solo i casi
a < b c 6 < a.
gi stato osservato che quando a < b abbiamo a mod 6 = a e 6 mod a < a. Perci
da questi enunciati e dall'ipotesi a mod 6 = 6 mod a si ricava una contraddizione. Per
simmetria, se 6 < a allora 6 mod a = 6 e a mod 6 < 6 . Si pu nuovamente dedurre una
contraddizione dellipotesi e concludere che anche la parte solo-se vera. Con ci sono
state dimostrate entrambe le direzioni e si pu affermare che il teorema vero.

1.4

Dimostrazioni induttive

Esiste una forma speciale


ha a chc fare con oggetti
pi familiari si occupano
dimostrazioni induttive su

di dimostrazione, detta induttiva, che essenziale quando si


definiti ricorsivamente. Molte delle dimostrazioni induttive
di interi, ma nella teoria degli automi c bisogno anche di
concetti definiti ricorsivamcnte come alberi ed espressioni di

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

Induzioni sugli interi

Supponiamo di dover dimostrare un enunciato S (n ) su un intero ri. Una soluzione


comune consiste nel dimostrare due cosc.
1. La base, in cui si dimostra S (i) per un particolare intero i. Di solito i = 0 op
pure i = 1 . ma ci sono esempi in cui si comincia da un pi allo, magari perch
lenunciato S falso per alcuni interi piccoli.
2. Il passo induttivo, in cui supponiamo chc n > i, dove i e lintero di base, e si
dimostra che se S{n) allora S (n + 1).
Intuitivamente queste due parti dovrebbero convincerci che S (n ) vero per ogni intero n
che sia uguale o maggiore dellintero di base i. Il ragionamento il seguente. Supponiamo
che S ( n ) sia falso per uno o pi di quei numeri interi. Allora dovrebbe esistere un minimo
valore di n. poniamo j , per il quale S(J) falso e tuttavia j > i. Ma j non pu essere i
perch abbiamo dimostrato (base) che S (i) vero; perci j devessere maggiore di i. Ora
sappiamo che j i > i e S (j
1 ) vero.
Proseguendo, nel passo induttivo abbiamo dimostrato che se n > i allora S (n ) implica
S'(n-f l). Supponiamo che sia n = j 1 . Allora sappiamo dal passo induttivo chc S ( j 1)
implica S (j). Poich sappiamo che S ( j
1) vero, possiamo concludere che lo c anche

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 )

Possiamo semplificare le equazioni (1.1) e (1.2) espandendo le somme e i prodotti a


destra:
(1.3)

(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.

2X > x 2 per x > 4. Con questa ipotesi dobbiamo dimostrare


lo stesso enunciato con x 4- 1 al posto di x , vale a dire 2X+11 > [it; + I]2. Questi sono gli
enunciati S ( x ) e S (x + 1 ) nel principio di induzione. Il fatto che si stia usando x invece
di n come parametro non rilevante; x cd n sono solo variabili locali.
Come nel Teorema 1.16, dobbiamo riscrivere S i x + 1) in modo chc contenga S (x ).
In questo caso possiamo scrivere 2 ^ + |J come 2 x 2X. Dato che S ( x ) ci dice chc 2X > x 2,
possiamo concludere che 2 /:+1 = 2 x 2X > 2x2.
Abbiamo per bisogno di qualcosa di diverso, in quanto dobbiamo dimostrare che
2 * 11 > (x + I )2. A tale scopo possiamo dimostrare che 2 x2 > (x + I ) 2 c poi ricorrere
alla transitivit di > per mostrare che 2:,:+l > 2x? > (x + I ) 2. Nella dimostrazione che
i n d u z i o n e Supponiamo che

2x2 > (x + I ) 2

(1.7)

possiamo far uso dell'assunto che x > 4. Cominciamo semplificando la ( 1 .7):


X 2 > 2.T + 1

(1.8)

X > 2 + X

(1.9)

Dividiamo la ( 1.8 ) per x e otteniamo:

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

I numeri interi come concetti definiti ricorsivamente


Si detto che le dimostrazioni induttive sono utili quando Toggclto su cui si ra
giona definito ricorsivamente. Tuttavia i primi esempi trattati sono induzioni
su interi, che normalmente non si considerano definiti ricorsivamente. Cionono
stante, esiste una definizione naturale e ricorsiva di numero intero non negativo, e
questa definizione si accorda con la maniera in cui si svolgono le induzioni sugli
interi: dagli oggetti definiti prima a quelli definiti in seguito.
BASE O un intero.
INDUZIONE Sc

1.4.2

n un intero, lo anche n 4 1.

Forme pi generali di induzioni sugli interi

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

INDUZIONE Supponiamo chc n > 10 e chc 5 (8 ), >(9), , S( n) siano veri. Da questi


dati dobbiamo dimostrare k9 ( n 4 l ) . La strategia consiste nel sottrarre 3 da n 4 1 , osservare

Dimosirazioni induttive

25

che I risultato si pu scrivere come somma di multipli di 3 e di 5, e aggiungere un ulteriore


3 alla somma per poter scrivere n + 1.
In termini pi formali si osserva che n 2 > 8 , cos possiamo supporre S (ri 2). In
altre parole n 2 = 3a 4- 5 b per due interi a e b. Allora n + 1 = 3 + 3 + 5 b, cos n + 1
pu essere scritto come la somma di 3, moltiplicato per a + 1, c di 5, moltiplicato per b.
Ci dimostra S (n + 1) e conclude il passo induttivo.

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:

1. si comincia con un nuovo nodo JV, che la radice dellalbero


2 . si aggiunge una copia degli alberi T i . T ,. . . , T^

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

E ed F sono espressioni, allora lo sono anche E 4- F, E * F c (E).

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

Figura 1.7 Costruzione induttiva di un albero.


1. Come base si dimostra S ( X ) per la struttura (o le strutture) di base di X .
2. Per il passo induttivo si prende una struttura X che secondo la definizione ricorsiva
formata da Y \ , Y2, . . . , Yfe. Si assumono veri gli enunciati S(Yy), S(Y2) , . . . . S(Yk)
e da essi si dimostra S ( X) .
Si conclude chc S ( X ) vera per ogni X . I prossimi due teoremi sono esempi di enunciati
dimostrabili relativi ad alberi ed espressioni.
Teorema 1.21 Ogni albero ha un nodo in pi rispetto ai suoi lati.

S ( T) che dobbiamo dimostrare per induzione strut


turale : se T un albero e T ha n nodi ed e lati, allora n = e + 1.

DIMOSTRAZIONE L'enunciato formale

BASE II caso di base si ha quando T un nodo singolo. Allora


relazione n = e + 1 valida.

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

ciati S (T i) siano validi per i = 1 .2 ,. . . , k. In altre parole, supponendo che T1 abbia Ui


nodi ed e, lati, si ha
= e, + 1 .
I nodi di T sono il nodo Ar e tutti i nodi degli alberi Ti. Esistono dunque 1 + n i +
n 2 H------- 1- rik nodi in T. 1 lati di T sono i k lati che sono stati aggiunti esplicitamente nel
passo di induzione, pi i lati di tutti i Ti. Perci T ha

k + e \. + e2 -\-----+ ('-k

(LlO)

lati. Se si sostituisce e - f i a n nel conteggio del numero di nodi di T, si trova che T ha


1 + [Cl + 1] + \e2 + 1] + + [ek + 1]

(1.11)

Dimostrazioni induttive

27

Fondamenti intuitivi dellinduzione strutturale


Possiamo suggerire in termini informali perch linduzione strutturale e un meto
do dimostrativo valido. Consideriamo una definizione ricorsiva in cui si asserisce
che le strutture X \ , X 2, -, prese una per volta, soddisfano la definizione. Gli
elementi di base vengono per primi, e il fatto che X 4- appartenga a quellinsie
me di strutture deve dipendere solo dal l'insieme delle strutture che precedono
X i nell'elenco. Da questo punto di vista uninduzione strutturale non altro che
uninduzione sullintero n dellenunciato 6(X n). Questinduzione pu avere la
forma generalizzata discussa nel Paragrafo 1.4.2, con casi di base multipli e un
passo induttivo che usa lutti i casi precedenti dell'enunciato. Tuttavia si deve te
nere presente, come spiegato nel Paragrafo 1.4.1. che questa intuizione non e una
dimostrazione formale. Infatti dobbiamo supporre la validit di questo principio
induttivo come stato fatto con la validit del principio induttivo originale nel
detto paragrafo.

nodi. Poich ci sono k termini + I in (1.11), possiamo riscriverla:

k + I + C] + (i2 H------- \-eic

(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

Possiamo supporre che S ( E ) e S ( F) siano vere; in altre parole E ha lo stesso numero


di parentesi aperte e chiuse, diciamo n, c similmente F ha lo stesso numero di parentesi
aperte c chiuse, diciamo m. Allora possiamo calcolare il numero di parentesi aperte e
chiuse in G per ognuno dei tre casi come segue.
1. Se G = E + F, allora G ha n 4 - rn parentesi aperte c n + rn parentesi chiuse; n
provenienti da E ed rn da F.
2. Se G = E * F, il conteggio delle parentesi di G d nuovamente 4 - m per ciascuna
parentesi, per la stessa ragione del caso (1 ).
3. Se G (E ), allora ci sono n + I parentesi aperte in G , una mostrata esplicitamente
ed n in E. Analogamente ci sono n f 1 parentesi chiuse in G; una esplicita, le
altre sono in E.
In ognuno dei tre casi si vede che il numero delle parentesi aperte c chiuse in G lo stesso.
Questa osservazione completa il passo induttivo e termina la dimostrazione.

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

Figura 1.8 Lautoma della Figura 1.1.


Sapendo che un numero n non pu essere allo stesso tempo pari e dispari, si potrebbe
supporre che Si implichi S2, e viceversa. Tuttavia ci che non sempre vero di un automa
c che si trovi in un solo stato. Di fatto lautoma della Figura 1.8 sempre esattamente in
un solo stato, ma questo deve essere dimostrato come parte dellinduzione mutua.
Diamo la base e linduzione delle dimostrazioni degli enunciati S i(n ) e S 2 (w). Le
dimostrazioni dipendono da diverse propriet degli interi pari e dispari: se si aggiunge o
toglie I da un intero pari si ottiene un intero dispari, e se si aggiunge o toglie 1 da un
intero dispari si ottiene un intero pari.

n = 0. Dato che ci sono due enunciati, ognuno dei quali deve


essere dimostrato in entrambe le direzioni (in quanto Si ed S 2 sono ciascuno enunciati
se-e-solo-se), in effetti ci sono quattro casi per la base e altrettanti per linduzione.
BASL Per la base scegliamo

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.

Dall'esempio 1.23 si pu ricavare il modello di tutte le induzioni mutue.


Ogni enunciato dev'essere dimostrato separatamente nella base e nel passo indutti
vo.
Se si tratta di enunciati se-e-solo-se, allora entrambe le direzioni di ogni enunciato
devono essere dimostrate, sia nella base sia nel passo induttivo.

1.5

I concetti centrali della teoria degli automi

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).

I concetti centrali della teoria degli automi

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

Convenzioni tipografiche per simboli e stringhe


Useremo comunemente lettere minuscole prese dall'inizio dellalfabeto (oppure
cifre) per denotare i simboli, e lettere minuscole dalla fine dell'alfabeto, di solito
UK X, y e z, per denotare le stringhe. Si consiglia di abituarsi a tale convenzione
perch facilita il riconoscimento del tipo di oggetto in discussione.

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.

Esempio 1.25 Poniamo x = 01101 e y = 110. Allora x y = 00110 e y x =


11001101. Perqualunque stringa w sono valide Ic equazioni ew = w t = w. In altre paro
le e Videntit per la concatenazione. dato che, concatenata con una qualunque stringa,
d come risultato la stringa stessa (nello stesso modo in cui 0 , l'identit per laddizione,
pu essere sommato a qualunque numero x e d come risultalo x).

I concetti centrali della teoria degli automi

1.5.3

33

Linguaggi

Un insieme di stringhe scelte da *, dove un particolare alfabeto, si dice un linguag


gio. Se un alfabeto e L C *, allora L un linguaggio su . Si noti che un linguaggio
su non deve necessariamente includere stringhe con tutti i simboli di ; perci, una vol
ta che abbiamo stabilito che L un linguaggio su , sappiamo anche che un linguaggio
su qualunque alfabeto includa .
La scelta del termine linguaggio pu sembrare strana; d'altra parte i linguaggi co
muni possono essere visti com e insiemi di stringhe. Un esempio l'inglese, in cui la
raccolta delle parole accettabili della lingua un insieme di stringhe sullalfabeto che
consiste di tutte le lettere. Un altro esempio il C, o qualunque altro linguaggio di pro
grammazione, in cui i programmi accettabili sono un sottoinsieme di tutte le possibili
stringhe che si possono formare con l'alfabeto del linguaggio. Questalfabeto un sottoinsieme dei caratteri ASCII. L'alfabeto pu variare leggermente tra diversi linguaggi di
programmazione, ma generalmente include Ic lettere maiuscole e minuscole, le cifre, la
punteggiatura e i simboli matematici.
Nello studio degli automi ci si imbatte in molti altri linguaggi. Alcuni sono esempi
astratti, come quelli che elenchiamo.
1. 11 linguaggio di tutte le stringhe che consistono di n 0 seguili da 1 , per n > 0 :
{ , 01 , 0011 , 000111 , . . . } .
2. Linsieme delle stringhe con un uguale numero di 0 e di I :

{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

a ogni alfabeto. Si noti che 0 { f }: il primo non ha stringhe mentre il secondo ne


ha una.
Lunica restrizione di rilievo sui linguaggi che tutti gli alfabeti sono finiti. Di conseguen
za i linguaggi, sebbene possano avere un numero infinito di stringhe, devono consistere
di stringhe tratte da un determinato alfabeto finito.

34

Capitolo I

I formatori di insiemi come un modo di definire linguaggi


Spesso si descrive un linguaggio usando un Jbnnutore di insiemi:
{k; ; enunciato su w}
Questespressione va letta comc l'insieme delle parole w tali che vale lenun
ciato su W a destra della barra verticale. Alcuni esempi:
1. {w I w consiste di un numero uguale di e di 1 }
2 . {tu I w un intero binario che primo}

3. {w I w un programma C sintatticamente corretto}.


Si suole anche sostituire w con unespressione con parametri e descrivere le strin
ghe del linguaggio enunciando le condizioni sui parametri. Ecco alcuni esempi,
il primo con un parametro n. il secondo con i parametri i e j .
1. {0n l n I ri > 1}. Leggi linsieme di 0 elevato alla Ti, 1 alla n tale che
n maggiore o uguale a 1; questo linguaggio formato dalle stringhe
{01.0011.000111,...} . Si noti che, come con gli alfabeti, possibile ele
vare un singolo simbolo alla potenza Ti per rappresentare n copie di quel
simbolo.
2. (Oi P' I 0 < ? '< .:? } Questo linguaggio consiste di stringhe con un certo
numero di 0 (eventualmente nessuno) seguiti da almeno altrettanti 1 .

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

I concetti centrali della teora degli automi

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.

la rappresentazione binaria di un numero primo e no in caso contrario. Per alcune


stringhe questa decisione c facile. Per esempio 0011101 non pu essere la rappresenta
zione di un primo, per la semplice ragione che ogni intero, con leccezione di 0, ha una
rappresentazione binaria che comincia con 1. Daltra parte c meno palese se la stringa
11101 appartenga a L v . Dunque qualunque soluzione a questo problema dovr avvalersi
di risorse computazionali di qualche tipo: tempo e spazio, per esempio.
Un aspetto potenzialmente insoddisfacente della nostra definizione di problema
che comunemente non si pensa a un problema in termini di decisione (p o non vero?),
bens come se si trattasse di una richiesta di computare o trasformare un certo input (tro
vare il miglior modo di svolgere un dato compito). Per esempio il compito di un parser
in un compilatore C pu essere visto come un problema nel nostro senso formale, in cui
si d una stringa ASCII e si chiede di decidere se la stringa sia o no un elemento di Lc,
linsieme dei programmi C validi. Tuttavia un parser non si limita a decidere: produce
infatti un albero sintattico, voci in una tabella di simboli ed eventualmente altro. Non
solo: il compilatore nel suo insieme risolve il problema di trasformare un programma C
in codice oggetto per una certa macchina, ben pi di una semplice risposta s o no
alla domanda sulla validit di un programma.
Nonostante ci, la definizione di problema come linguaggio ha resistito nel tempo co
me il modo pi opportuno di trattare le questioni cruciali della teoria della complessit. In
questa teoria linteresse volto a scoprire limiti inferiori della complessit di determinati
problemi. Di particolare importanza sono le tecniche per dimostrare che certi problemi
non possono essere risolti in tempo meno che esponenziale nella dimensione del loro in
put. Risulta che le versioni s-no oppure basate su linguaggi di problemi noti sono in
questo senso altrettanto difficili delle versioni risolvi .
In altre parole, se possiamo dimostrare che difficile decidere se una data stringa ap
partiene al linguaggio L x delle stringhe valide in un linguaggio di programmazione X ,

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

Dimostrazioni deduttive: questo metodo dimostrativo di base procede elencan


do enunciati che sono dati com e veri oppure seguono logicamente da uno degli
enunciati precedenti.
Dimostrazioni di enunciati se-allora: molti teoremi si presentano nella forma se
(qualcosa) allora (qualcosaltro). Lenunciato o gli enunciati che seguono se
sono lipotesi, quelli che seguono "allora sono la conclusione. Le dim ostrazio
ni deduttive di enunciati se-allora cominciano dallipotesi e continuano con enun
ciati chc seguono logicamente dallipotesi e dagli enunciati precedenti, finch si
dimostra la conclusione come uno degli enunciati.
Dimostrazioni di enunciati se-e-solo-se: altri teoremi hanno la forma (qualcosa)
se e solo se (qualcosaltro) . Si dimostrano provando gli enunciati se-allora in
entrambe le direzioni. Un analogo tipo di teorema asserisce luguaglianza di due
insiemi descritti in modi diversi; la dimostrazione si ottiene provando che ognuno
dei due insiemi contenuto nellaltro.
4- Dimostrazioni per contronominale: talvolta e pi facile dimostrare un enunciato
nella forma se H allora C dimostrando l'enunciato equivalente: se non C allora
non H ". 11 secondo detto il contronominale del primo.
Dimostrazioni per assurdo: in altri casi conviene dimostrare lenunciato se H
allora C dimostrando se TI e non C allora (qualcosa che si sa essere falso) . Una
dimostrazione di questo tipo detta "per assurdo.
Controesempi: talora si deve provare che un certo enunciato non vero. Se lenun
ciato ha uno o pi parametri, allora si pu mostrare che falso in generale fornendo
solo un controesempio, vale a dire un assegnamento di valori ai parametri che rende
falso l'enunciato.
Dimostrazioni induttive: un enunciato che ha un parametro intero n pu essere
spesso dimostrato per induzione su ri. Si dimostra che l'enunciato vero per la
base, cio un numero finito di casi per determinati valori di n , e poi si dimostra il
passo induttivo: che se lenunciato vero per valori fino a n allora vero per n + 1 .
Induzioni strutturali: in alcune situazioni, comprese molte di quelle trattate in que
sto libro, il teorema che devessere dimostrato induttivamente ri suarda un costrutto
definito ricorsivamente, come gli alberi. Si pu dim ostrare un teorema su oggetti
cos costruiti per induzione sul numero di passi compiuti nella costruzione. Questo
tipo di induzione detto strutturale.
Alfabeti: un alfabeto un insieme finito di simboli.
Stringhe: una stringa una sequenza di simboli di lunghezza finita.

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

Automi a stati finiti


Questo capitolo presenta la classe dei linguaggi detti regolari. Tali linguaggi sono esat
tamente quelli che possono essere descritti dagli automi a stati finiti, e che abbiamo gi
brevemente trattato nel Paragrafo 1.1.1. Definiremo gli automi a stati finiti in termini
formali dopo un dettagliato esempio che fornir la motivazione per lo studio successivo.
Come detto precedentemente, un automa a stati finiti ha un insieme di stati e un 'con
trollo che si muove da stato a stato in risposta a input esterni. Una distinzione cruciale tra
le classi di automi a stati finiti riguarda il controllo: se deterministico, ossia se l'autom a
non pu essere in pi di uno stato per volta, oppure non deterministico, ossia se l'autom a
pu trovarsi in pi stati contemporaneamente. Vedremo che laggiunta del non determi
nismo non permette di allargare la classe dei linguaggi definibili da automi a stati finiti
deterministici, ma pu essere pi efficace descrivere un'applicazione usando un automa
non deterministico. In effetti il non determinismo permette di programmare soluzioni
di un problema usando un linguaggio ad alto livello. Lautoma a stati finiti non determini
stico viene poi compilato, attraverso un algoritmo che verr spiegato in questo capitolo,
in un automa deterministico chc pu essere eseguito da un computer convenzionale.
Il
capitolo si chiude con lo studio di automi non deterministici estesi, che hanno la
scelta supplementare di fare una transizione da uno stato allaltro spontaneamente, ossia
sulla stringa vuota come input. Anchc questi automi accettano solo linguaggi regolari, ma
se ne vedr limportanza nel Capitolo 3, dove studieremo le espressioni regolari e la loro
equivalenza agli automi.
Lo studio dei linguaggi regolari prosegue nel Capitolo 3. Qui viene introdotto un altro
modo importante di descriverli: la notazione algebrica conosciuta come espressioni rego
lari. Dopo aver discusso le espressioni regolari e aver dimostrato la loro equivalenza agli
automi a stati finiti, nel Capitolo 4 useremo sia gli automi sia le espressioni regolari come
strumenti per mostrare alcune propriet importanti dei linguaggi regolari. Esempi di tali
propriet sono le propriet di chiusura, chc permettono di affermare che un linguaggio

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

Una descrizione informale degli automi a stati finiti

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

Lrua descrizione informale degli automi a stati finiti

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. Il cliente pu decidere di annullare. Il denaro viene inviato alla banca attraverso un


messaggio contenente le istruzioni di accredito dellimporto sul conto del cliente.
3. Il negozio pu consegnare la merce al cliente.
4. Il negozio pu riscattare il denaro, ossia il denaro viene mandato alla banca con la
richiesta di trasferirne il valore al negozio stesso.
5. La banca pu trasferire il denaro creando un nuovo file di denaro virtuale, adegua
tamente cifrato, e inviandolo 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.

Unii descrizione infrmale degli automi a stati finiti

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

Automi che possono ignorare azioni

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

mentari, a ogni occorrenza dellazione cancel, lautoma negozio morirebbe; l'automa,


cio, non si troverebbe in alcuno stato, e ulteriori azioni gli sarebbero impossibili.
Un altro potenziale problema che uno dei partecipanti possa, intenzionalmente o
per errore, inviare un messaggio inaspettato: questo comportamento non deve far morire
nessuno degli automi. Si supponga per esempio che il cliente decida di eseguire l'azione
pay una seconda volta, mentre il negozio si trova nello stato a. Poich lo stato non ha
alcun arco in uscita con l'etichetta pay, l'automa del negozio morirebbe prima di poter
ricevere il trasferimento dalla banca. Riassumendo, bisogna aggiungere agli automi della
Figura 2.1 cicli su certi stati, con etichette per tutte le azioni che devono essere ignorate
cjuando ci si trova in quegli stati. Gli automi completi sono rappresentati nella Figura 2.2.
Per risparmiare spazio, si combinano le etichette su un unico arco invece di mostrare
archi distinti con gli stessi estremi ma con etichette diverse. Si devono ignorare due tipi
di azioni.
1. Azioni che sono irrilevanti per il partecipante. Come gi visto, lunica azione irri
levante per il negozio c cancel, dunque ognuno dei sette stati ha un ciclo etichettato
cancel. Per la banca, sia pay sia ship sono irrilevanti, perci si pone un arco eti
chettato pay, ship su ognuno degli stati della banca. Per il cliente, ship , redeem e
transfer sono tutti irrilevanti, e pertanto si aggiungono archi con tali etichette. Di
fatto il cliente rimane nel suo unico stato per ogni sequenza di input: lautoma non
ha effetti sul l'operazione del sistema globale. 11 cliente comunque un partecipan
te. dato chc avvia le azioni pay e cancel. Tuttavia, come abbiamo detto, il fatto di
provocare le azioni non ha nulla a che vedere con il comportamento degli automi.
2. Azioni cui si deve impedire di uccidere un automa. Come abbiamo visto, non pos
siamo permettere al cliente di uccidere l'automa del negozio eseguendo lazione
pay una seconda volta. Per questa ragione sono stati aggiunti cicli con letichetta
pay a tutti gli stati, eccetto lo stato a (in cui lazione prevista e rilevante). Inoltre
sono stati aggiunti cicli con l'etichetta cancel agli stati 3 e 4 della banca, allo scopo
di impedire al cliente di uccidere l'automa di questa cancellando denaro gi riscat
tato. Correttamente la banca ignora tale richiesta. In modo analogo gli stati 3 c 4
hanno un ciclo su redeem. Il negozio non dovrebbe cercare di riscattare lo stesso
denaro due volte. Se lo fa, la banca ignora la seconda richiesta.

2.1.4

Lintero sistema come automa

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

Una descrizione informale degli automi a stati finiti


cancel

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

ship, redeem , transfer,


pay, cancel

Start

(b) Cliente

cancel

pay,redeem ,

pay,redeem ,

cancel, ship

cancel, ship

Aj
3 )-------- - ( 4

pay.
ship

redeem

transfer

Start

(c) Banca

Figura 2.2 Gli insiemi completi di transizioni per i tre automi.

complesso, e non immediatamente chiaro in quali combinazioni di stati possano trovarsi


i loro automi.
Abitualmente si esplora linterazione di automi come questi costruendo lautoma pro
dotto. Gli stati di tale automa rappresentano una coppia di stati, uno del negozio e uno
della banca. Per esempio lo stato (3, d) dellautoma prodotto rappresenta la situazione in
cui la banca si trova nello stato 3 e il negozio nello stato d. Poich la banca ha quattro
stati e I negozio ne ha sette, lautoma prodotto ha 4 x 7 = 28 stati.
Lautoma prodotto illustrato nella Figura 2.3. Per chiarezza i 28 stati sono disposti in
una griglia. La riga corrisponde allo stato della banca, la colonna a quello del negozio. Per
risparmiare spazio abbiamo usalo abbreviazioni per le etichette sugli archi: P . S . C. R e
T stanno rispettivamente per pay (pagamento), ship (spedizione), cancel (cancellazione),

46

Capitolo 2

redeem (riscatto) e transfer (trasferimento).

Figura 2.3 Lautoma prodotto per il negozio e la banca.


Per costruire gli archi dellautoma prodotto bisogna far funzionare in parallelo lauto
ma della banca e quello del negozio. I due componenti dellautoma prodotto compiono
transizioni sugli input autonomamente. Tuttavia importante notare che se a fronte di un
input uno dei due automi non ha uno staio a cui passare, anche l'autom a prodotto non pu
compiere la transizione, e quindi muore.
Per precisare la regola di transizione, supponiamo che lautoma prodotto si trovi nello
stato (i, x). Questo sialo corrisponde alla situazione in cui la banca si trova nello stato i e
il negozio nello stato x. Sia Z una delle azioni di input. Nellautoma che rappresenta la
banca cerchiamo una transizione a partire dallo stato i con etichetta Z. Immaginiamo che
tale transizione ci sia c chc conduca allo stato j (che potrebbe coincidere con i se la banca
compie un ciclo sullinput Z). N ellautoma del negozio cerchiamo un arco etichettato Z
che porti a uno stato y. Sc esistono sia j sia ?/, lautoma prodotto ha un arco dallo stato
(/, x ) allo stato (j, y), etichettalo Z . Sc j oppure y non esiste (perch la banca o il negozio
non hanno archi uscenti rispettivamente da i o da x per linput Z), allora non esiste nessun

Una descrizione informale degli automi a stati finiti

Al

arco uscente da (i. x) etichettato Z.


Risulta chiaro come sono stati scelti gli archi nella Figura 2.3. Per esempio, a fronte
dellinput pay il negozio passa dallo stato a allo staio b, ma resta fermo se si trova in
qualunque altro stato che non sia a. Quando l'input pay la banca permane in qualunque
stato si trovi, perch dal suo punto di vista lazione irrilevante. Questa osservazione
spiega i quattro archi etichettati P allestrema sinistra delle quattro righe nella Figura 2.3,
e i cicli etichettati P sugli altri stati.
Un altro esempio: consideriamo linput redeem. Se la banca riceve un messaggio
redeem quando si trova nello stato I, passa nello stato 3. Se si trova nello stato 3 oppure
4. resta ferma, mentre se si trova nello stato 2 muore, cio non ha nessuno stato dove
andare. 11 negozio, d altro canto, sullo stesso input pu fare transizioni dallo stato b
allo stalo d oppure da c a e. Nella Figura 2.3 vediamo sei archi etichettati redeem , che
corrispondono alle sei combinazioni di ire stati della banca e due stati del negozio che
hanno archi uscenti con letichetta R. Per esempio nello stato (1,6) larco etichettato R
porta lautoma allo stato (3, d), perch redeem conduce la banca dallo sialo 1 allo stato
3 e il negozio da b a d. Un altro esempio: esiste un arco etichettato R da (4, r;) a (4, n),
poich redeem riporta la banca dallo stato 4 allo stato 4, mentre conduce il negozio dallo
stato c allo stato c.

2.1.5

Validazione del protocollo mediante lautoma prodotto

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

Automi a stati finiti deterministici

arrivato il momento di presentare la nozione formale di automa a stati finiti, in modo da


poter precisare alcune argomentazioni e descrizioni informali viste nei Paragrafi 1.1.1 e
2.1. Cominciamo dalla definizione di automa a stati finiti deterministico, un automa che
dopo aver ietto una qualunque sequenza di input si trova in un singolo stato. Il termine
deterministico concerne il fatto che per ogni input esiste un solo stato verso il quale
l'automa passa dal suo stato corrente. All'opposto, gli automi a stati finiti non deter
ministici, tema del Paragrafo 2.3, possono trovarsi in diversi stati contemporaneamente.
Il termine automa a stati finiti far riferimento alla variet deterministica, anche se si
far uso di deterministico o dell'abbreviazione DIA (Deterministic Finite Automaton,
automa a stati finiti deterministico) per ricordare al lettore di quale tipo di automa si sta
parlando.

2.2.1

Definizione di automi) a stati finiti deterministico

Un automa a stati finiti deterministico consiste dei seguenti componenti.

1. Un insieme finito di stati, spesso indicato con Q.

2. Un insieme finito di simboli di input, spesso indicato con .


3. Una funzione di transizione, che prende come argomento uno stalo c un simbolo di
input c restituisce uno stato. La funzione di transizione sar indicata comunemente
con S. Nella rappresentazione grafica informale di automi che abbiamo visto, fi
rappresentata dagli archi tra gli stati e dalle etichette sugli archi. Se q uno stato e
a un simbolo di input, (q , a) lo stato p tale che esiste un arco etichettato con a
da q a p.2

4. Uno stato iniziale, uno degli stati in Q.


2Piii precisamente, il grafo la descrizione di una funzione di transizione <5, e gli archi del grafo sono costruiti
per riflettere le transizioni specificate da <5.

Autom i a siati finiti deterministici

49

5. Un insieme di stati finali, o accettanti, F. L'insieme F un sottoinsieme di Q.


Un automa a stati finiti deterministico verr spesso indicato con il suo acronimo DhA. La
rappresentazione pi concisa di un DFA unenumerazione dei suoi cinque componenti.
Nelle dimostrazioni denotiamo un DFA come una quintupla:

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

Elaborazione di stringhe in un DFA

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

Notazioni pi semplici per i DFA

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.

Autom i a stati finiti deterministici

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

F ig u ra 2.5 Tabella di transizione per il DFA d ellE sem pio 2.1.

2.2.4

Estensione della funzione di transizione alle stringhe

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.

Autom i a stati finiti deterministici

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) = (.).

Esempio 2.4 C ostruiam o un DFA che accetti il linguaggio


L = { v; I w ha un num ero pari di 0 e un num ero pari di 1 }
N on dovrebbe sorprendere che il com pito degli stati di questo DFA sia quello di contare
il num ero degli 0 e quello degli 1, m a di contarli m odulo 2. In altre parole si usa lo stato
per ricordare se il num ero degli 0 c il num ero degli I visti fino a quel m om ento sono pari
o dispari. Q uindi ci sono quattro stati, chc possono essere interpretati com e segue:

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=

92, <?:?}, (0 , l M .t f o {<7o})

La funzione di transizione descritta dal diagram m a di transizione della Figura 2.6. Si


noti che ogni input 0 fa s che lo stato aitraversi la linea tratteggiata orizzontale. Pertanto,
dopo aver visto un num ero pari di 0 ci troviam o al di sopra della linea, nello stato q0
oppure <71, m entre dopo averne visto un num ero dispari ci troviam o al di sotto, nello
stato q2 oppure q:i. A nalogam ente, ogni 1 fa s che lo stato attraversi la linea tratteggiata
verticale. Perci, dopo aver visto un num ero pari di 1 siam o a sinistra, nello stato q0
oppure q-2 , m entre dopo averne visto un num ero dispari siam o a destra, nello stato Cy1
o q%. Tali osservazioni sono una dim ostrazione inform ale che i quattro stati hanno le

54

Capitolo 2

F ig u ra 2.6 D iagram m a di transizione per il DFA dellEsem pio 2.4.

interpretazioni a loro attribuite. Si potrebbe dim ostrare in termini formali la correttezza


delle nostre affermazioni sugli stati, per mutua induzione, sulla scorta deUEsem pio 1.23.
E possibile rappresentare questo DFA anche per mezzo di una tabella di transizione,
com e illustrato nella Figura 2.7. Noi per non siam o interessati solo allideazione di
questo DFA; il nostro intento di usarlo per illustrare la costruzione di dalla funzione di
transizione '. Supponiamo che linput sia 110101. Dato chc questa stringa ha un numero
pari sia di 0 sia di 1, ci aspettiam o che appartenga al linguaggio, cio che S(qt, 110101)
qo, dato che q0 lunico stato accettante. Verifichiamo questasserzione.

* > <7o
1
<72
<73

<72
<73
<7o
<7i

<7i
<7o
<73
<72

F ig u ra 2.7 Tabella di transizione per il DFA dellEsem pio 2.4.


La verifica com porta il calcolo di (qo, w) per ogni prefisso w di IlO lO L a partire da e e
procedendo per aggiunte successive. Il riepilogo di questo calcolo :

S{qo,e) = ft)
(<7o, 1) =

1) = S{q0 , 1) = <?i

Autom i a stati finiti deterministici

55

Notazione standard e variabili locali


D opo aver letto questo paragrafo si potrebbe im m aginare che la notazione abi
tuale sia obbligatoria, cio che si debba usare per la funzione di transizione, A
per il nom e di un DFA, e cos via. In realt tendiam o a usare le stesse variabili
per denotare la stessa cosa in tutti gli esem pi perch ci aiuta a ricordare il tipo
delle variabili; analogam ente in un program m a una variabile i quasi sem pre di
tipo intero. Di fatto possiam o chiam are i com ponenti di un autom a, o qualunque
altro elem ento, com e vogliam o. Se lo desideriam o, possiam o chiam are un DFA
M e la sua funzione di transizione T.
N on ci si deve inoltre stupire del fatto che le stesse variabili hanno significati
diversi in contesti diversi. Per esem pio a entram bi i DFA degli Esem pi 2.1 e 2.4
stata assegnata una funzione di transizione chiam ata <5, m a ognuna delle due
funzioni una variabile locale, pertinente solo al suo esem pio. Le due funzioni
sono m olto diverse e non hanno alcuna relazione T una con laltra.

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

<5(90, 11010) = <5(<5(9o , 1101),0) = % 3, 0 ) =

qi

% 0 , 110101) = 5 ( % 0 , 1 1 0 1 0 ),1 ) = (qi , \ ) = q0.

2.2.5

II linguaggio di un DFA

Possiam o ora definire il linguaggio di un DFA A = ( Q , . , qo- F). Q uesto linguaggio


indicato con L(A) ed definito da

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.

F ig u ra 2.8 U na pista p er biglie.


* a) M odellate questa pista con un autom a a stati finiti. G li input A c B rappresentano
la via su cui la biglia viene fatta cadere. Supponete che l accettazione corrisponda
a lluscita della biglia da D, la non accettazione all'u scita da C.
! b) D escrivete inform alm ente il linguaggio d ellautom a.
c) S upponete chc le leve si ribaltino prima di perm ettere il passaggio della biglia.
C om e cam biano Ic risposte a (a) e (b)?

Automi a stati finiti deterministici

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) Dimostrate per induzione su n che, per ogni n > 0, 6(q,an ) = q, dove an la


stringa formata da ??. ripetizioni di a.
b) D im ostrateche o {a}* C L(A) o {a}* L(A) = 0.
*! E sercizio 2.2.9 Sia A = (Q , , , qo, {q/ }) un DFA e supponiam o chc per tutti gli a in
si abbia t)(qo, a) = S(qj.a).
A

a) D im ostrate che, per ogni w c, S(q0, w) = S(qf,w).


b) D imostrate che se x una stringa non vuota in L(A), allora per ogni k > O anche
x k (cio X scritta un numero k di volte) in L(A).
*! E sercizio 2.2.10 Considerate il DFA con la seguente tabella di transizione:

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.

! Esercizio 2.2.11 Ripetete Ksercizio 2.2.10 per la seguente tabella di transizione:

> *A
*B
C

2.3

0
B
C
C

1
A
A
C

Automi a stati finiti non deterministici

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

Automi a stati tniti non deterministici

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

Descrizione informale degli automi a stati finiti


non deterministici

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

Definizione di automa a stati finiti non deterministico

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

Automi a stati finiti non deterministici

61

essenzialm ente com e un DFA:


.4 = ( Q , E J , q o , F )
dove:
1. Q un insiem e finito di stati
2. E c un insiem e finito di simboli di input
3. qo, elem ento di Q, lo stato iniziale
4. F, un sottoinsiem e di Q, l insiem e degli stati finali (o accettanti)
5. <), la funzione di transizione, la funzione che ha com e argom enti uno stato in Q
e un sim bolo di input in , e restituisce un sottoinsiem e di Q. Si noti che lunica
differenza tra un NFA c un DFA nel tipo di valore restituito da : un insiem e di
stati nel caso di un NFA e un singolo stato nel caso di un DFA.

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

La funzione di transizione estesa

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

cui siamo partiti.

w sia della forma w xa, dove a il sim bolo finale di w e


X la parte restante. Supponiam o altres chc 6{q, x) = {p\,p2, - - ^Pk)- Sia
INDUZIONE Supponiamo che

IJ (pi,a) = { r ,,r 2l. . . , r m}


i- 1

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}

3. <%o,0 0 ) = % o,0 ) U <5(<7i , 0) = {Qo, <7i } U 0 = {qo,qi}


4. (<7o ,001) = 5(<7o, I) U S f a , 1) = {c/o} U {g2} = {0, }
5. (<7o,0010) = (qo, 0) U (2,0) = (io , <71} U (4 = {<7o*<?i}
6. (qo. 00101) = 5(9o, I) U <5(gi,l) = {</0} U {q2} = {qo.qi}
Il punto ( I ) la regola di base. Il punto (2) si ottiene applicando all'unico stato, qo, che
si trova nellinsieme precedente: il risultato {<70, </i}. Il punto (3) si ottiene prendendo
lunione, sui due stati dell'insiem e precedente, di ci che si ottiene quando si applica loro
<5 con input 0. In altre parole (qo, 0) = {</o, }, m entre d'(<7i , 0) = 0. Per il punto (4)
prendiam o lunione di 6(qo, 1) = {<Jo} e ^ , ) = {<72}. I punti (5) e (6) sono simili a
(3) e (4).

Automi a stati finiti non deterministici

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

1. S(qo, w) contiene qo per ogni w


A

2 . 6(qo, w) contiene q\ se e solo se w finisce per 0


3. 6(qo, vj) contiene q2 se e solo se w finisce per 0 1 .
Per dim ostrare questi enunciati, bisogna considerare in che m odo A pu raggiungere cia
scuno stato; ossia: qual stato lultim o sim bolo di input, e in quale stato si trovava A
prim a di leggere quel sim bolo?
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

Equivalenza di automi a stati finiti deterministici


e non deterministici

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

Automi it stati iinili non dclcirninistici

65

sugli autom i richiedono la costruzione di un autom a a partire da un altro. E im portante


considerare la costruzione per sottoinsiem i com e esem pio di descrizione form ale di un
autom a nei term ini degli stati e delle transizioni di un altro, senza conoscere i particolari
del secondo autom a.
La costruzione per sottoinsiem i parte da un NFA N = (Q1W, , ,. qo, F
\r). Il suo
(ine la descrizione di un DI-A D = (Q n, . Sn, {qo}, F d ) tale che L(D) L{N ).
Si noti che gli alfabeti di input dei due autom i sono gli stessi e lo stato iniziale di D
l insiem e che contiene solo lo stato iniziale di N . Gli altri com ponenti di D sono costruiti
com e segue.
Q d linsiem e dei sottoinsiem i di Q x ) vale a dire, Q d & 1' insieme potenza di
Q n . O sserviam o che se Q n ha ri stati, allora Q d avr 2" stati. Spesso dallo stato
iniziale di Q d non possibile raggiungere tutti questi stati. Gli stati inaccessibili
possono essere elim inati. D unque, in effetti, il num ero di stati di D pu essere
m olto inferiore a 2".
F d c l'insiem e dei sottoinsiem i S di Q_\ tali che S P v 0. In altre parole F d
c form ato dagli insiem i di stati di Ar che includono alm eno uno stato accettante.
Per ogni insiem e S C Q n e per ogni sim bolo di input a in ,

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

F ig u ra 2.13 R idenom inazione degli stati della Figura 2.12.


Degli otto stati della Figura 2.13, partendo dallo stato iniziale B possiam o raggiungere
solo gli stati B, E ed F. Gli altri cinque stati sono inaccessibili dallo stato iniziale c
potrebbero anche non esserci. Spesso si pu evitare il passo di costruire voci della tabella
di transizione per ogni sottoinsiem e di stati (cosa che richiede un tem po esponenziale) se
si com pie una valutazione differita dei sottoinsiem i. Vediamo com e.
BASE II singoletto form ato dal solo stato iniziale di

N certam ente accessibile.

S accessibile. A llora per


ogni sim bolo di input a com putiam o linsiem e di stati S[)(S, a ); sappiam o che anche
INDUZIONE Supponiam o di aver determ inato chc linsiem e

questi insiem i di stati saranno accessibili.


Per lesem pio in esam e, sappiam o che {<70} uno stato del DFA D. Troviam o che
/}({<7o}? 0 ) = {<7o-<7i} e ^ ( { 0}*!) = {<7o} A m bedue questi fatti si deducono dal
diagram m a di transizione della Figura 2.9 e osservando chc su 0 esistono archi uscenti da
qo verso sia qo sia
m entre su 1 esiste un arco diretto solo verso qo- A bbiam o dunque
una riga della tabella di transizione per il DFA: la seconda riga nella Fig. 2.12.

Automi a stati finiti non deterministici

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

}: O = SN (q0, 1) U SN (qx, I) = {0} U {q2} = {0^/ 2}


O ra abbiam o la quinta riga della Figura 2.12 e abbiam o scoperto un nuovo stato di D,
cio {(fa) <72} Un calcolo sim ile ci dice che

<M{9o,92},0) = <M<7o:0) U 5N (q2,Q) = {qo,Q\} U 0 = {<jo,</i}


1) =
I) U 5jv(2, 1) = { 9} U 0 = {q0}
Q uesti calcoli forniscono la sesta riga della Figura 2.12, m a producono solo insiem i di
stati che sono gi stati esam inati.
Q uindi la costruzione per sottoinsiem i arrivata a un punto ferm o; ora conosciam o tut
ti gli stati accessibili e le loro transizioni. Lintero DFA rappresentato dalla Figura 2.14.
O sserviam o che ha solo tre stati, cio, casualm ente, lo stesso num ero di stati d e llNFA
della Figura 2.9 dal quale stato costruito. D altra parte il DFA della Figura 2.14 ha sei
transizioni, a fronte delle quattro della F igura 2.9.

F ig u ra 2.14 II DFA costruito d allNFA della Figura 2.9.


D obbiam o dim ostrare form alm ente che la costruzione per sottoinsiem i corretta, sebbene
l'intuizione di ci sia suffragata dagli esem pi. D opo aver letto la sequenza di sim boli di
input iv, il DFA costruito si trova in un unico stato, che c linsiem e degli stati in cui si
troverebbe lNFA dopo aver letto ?/;. D ato che gli stati accettanti del DFA sono quegli stati
che includono alm eno uno stato accettante d ellNFA, e anche lNFA accetta se giunge in
alm eno uno dei suoi stati accettanti, possiam o concludere chc il DFA e lNFA accettano
esattam ente le stesse stringhe e dunque lo stesso linguaggio.

68

Capitolo 2

Teorema 2.11 Sc D = ( ( , , . {% }, Fd) I DFA costruito d allNFA Ar = ( Q .y .S .


S \ . qq, F ,\-) m edanle la costruzione per sottoinsiem i, allora L(D) = L (N ).
d im o s t r a z io n e

In prim o luogo dim ostriam o, per induzione su |i |, che


A

M f a o h w ) = S\'(q0,w )

Si noti che ognuna delle funzioni restituisce un insiem e di stati di Q \ , ma So interpreta


q u estinsiem e com e uno degli stati di Q d (c h o c l'in siem e potenza di Q \ ) , m entre jv lo
interpreta com e un sottoinsiem e di Q,\.
ba se

Sia |;| 0, ossia w = c. Per le definizioni della base di per i DFA e gli NFA, sia

< M { <70} c) sia Sn (q0, e) sono {q0 }

n + l e supponiam o vero l'en u n ciato per la lunghezza


n. Scom poniam o w in w xa, dove a il sim bolo finale di ?/;. Per lipotesi induttiva,
l)({c/o} c) <5jv(qo>x ) Q uesti due insiem i di stati di Ar siano { p i, p2, . . . . pk}
La parte induttiva della definizione di per gli N FA ci dice
INDUZIONE Sia w di lunghezza

Sn (qo,w) = IJ Sff (pi ,a)

(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:

,Pfc} nella parte

<M{<?o}>w) = SD(D({qo}.x),a) = SD( { p i.p 2 , . . . , p k) , a ) = |J (-,.) (2.4)


i= 1

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).

Teorema 2.12 Un linguaggio L accettato da un DFA se e solo se L accettato da un


NFA.

Automi a stati tniti non deterministici

69

DIMOSTRAZIONE (Se) L a parte se costituita dalla costruzione p er sottoinsiem i e dal


T eorem a 2.11.
(Solo-se) Q uesta parte facile; dobbiam o soltanto convertire un DFA in un NFA identico.
In m odo intuitivo, se abbiam o il diagram m a di transizione di un DFA, possiam o anche
interpretarlo com e il diagram m a di transizione di un NFA, in cui c esattam ente una
scelta di transizione in qualunque caso. In term ini pi form ali, sia D = (Q. . rto , qo? F)
un DFA. D eliniam o l NFA equivalente N = (Q i , ., qo, F), dove S\; definita dalla
seguente regola.
Se o(q, o.) = p, allora S^(q, a) = {/?}.
facile dim ostrare, per induzione su w |, che se Sr>(qo, w) = p allora

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

Un caso sfavorevole di costruzione per sottoinsiemi

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.

Esempio 2.13 C onsideriam o lNFA N della Figura 2.15. L ( N ) linsiem e di tutte le


stringhe di 0 e di 1 tali che -esim o sim bolo dalla fine sia 1. Intuitivam ente un DFA D
che accetti questo linguaggio deve ricordare gli ultimi a sim boli che ha letto.
P oich ci sono 2 sequenze distinte di lunghezza Ti, se D avesse meno di 2n stati,
ci sarebbe uno stato q raggiunto dopo aver letto due sequenze distinte di n bit, poniam o
a\a 2 On e &2 K D ato che le sequenze sono diverse, devono differire in una posizione, per esem pio
a bt . Supponiam o (per sim m etria) che a = I e b, = 0. Se i = 1, allora q deve essere
sia uno stato accettante sia uno stato non accettante, visto chc .i2 a accettato (Vnesim o sim bolo dalla line 1), e invece b_b-2 6n no. Se i > 1, allora consideriam o lo
stato p in cui D entra dopo aver letto i 1 sim boli 0 da q. A llora p deve essere sia accet
tante sia non accettante, dato che
( i e n00 0 accettato e
6n U 0
no.

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

* Esercizio 2.3.1 Convertite in un DFA il seguente NFA:


1
I

{p^}
Q
r
*.s

{*}

Esercizio 2.3.2 Convertite in un DFA il seguente NFA:

Automi a stati tniti non deterministici

71

Il principio della piccionaia


N ellEsem pio 2.13 abbiam o im piegato unim portante tecnica di ragionam ento,
detta principio della piccionaia. In parole povere, se si hanno pi piccioni che
cellette e ogni piccione si ricovera in una celletta, allora ci deve essere alm eno
una celletta contenente pi di un piccione. Nel nostro caso i piccioni sono le
sequenze di n bit e le cellette sono gli stati. Poich esistono meno stati che
sequenze, a uno stato devono essere assegnate due sequenze.
Il principio della piccionaia pu sem brare ovvio, m a dipende dal fatto che il
num ero delle cellette tnito.( Funziona perci per autom i a stati finiti, in cui gli
stati corrispondono alle cellette della piccionaia. Non si pu applicare invece ad
altri tipi di automi che hanno un num ero infinito di stati.
Per capire perch essenziale che il num ero delle cellette sia finito, si con
sideri la situazione infinita in cui le ccllctte corrispondono agli interi 1 ,2 .........
N um eriam o i piccioni 0 , 1 , 2 . . . . , in modo che ci sia un piccione in pi rispetto
alle cellette. Possiam o allora m andare il piccione i nella celletta i -I- 1 per ogni
i > 0. Cos ogni piccione ha la sua celletta e non ci sono due piccioni obbligati a
condividere lo stesso spazio.

^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

Stati trappola e DFA cui mancano alcune transizioni


A bbiam o form alm ente definito un DFA in m odo che per ogni stato e per ogni
sim bolo di input ci sia esattam ente una transizione verso un altro stato. A vol
te, per, in situazioni in cui sappiam o che nessuna estensione della sequenza di
input pu essere accettata, pi opportuno fare in m odo che il DFA 'm uoia .
Per esem pio osserviam o lautom a della Figura 1.2, chc svolge il proprio com pito
riconoscendo una sola parola, t h e n , e nientaltro. Q u estautom a non tecni
cam ente un DFA, in quanto gli m ancano le transizioni sulla m aggior parte dei
sim boli da ciascuno dei suoi stati.
T uttavia tale autom a un NFA. Se utilizziam o la costruzione per sottoin
siemi in m odo da convertirlo in un DFA, lautom a sem bra quasi lo stesso, ma
include uno stato trappola, ossia uno stato non accettante che conduce a se stesso
su ogni possibile sim bolo di input. Lo stato trappola corrisponde a 0. linsiem e
vuoto di stati deHautom a della Figura 1.2.
In generale possiam o aggiungere uno stato trappola a qualunque autom a chc
abbia non pi di una transizione per ogni stato e sim bolo di input: si aggiunge
una transizione verso lo stato trappola da uno stato q, su tutti i sim boli di input
per i quali q non ha transizioni. Il risultato sar un DFA nel senso pi stretto. A
volte, perci, faremo riferim ento a un autom a com e un DFA se ha al massimo
una transizione uscente da ciascuno stato su ogni sim bolo, piuttosto che se ha
esattamente una transizione.

* 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

U napplicazione: ricerche testuali

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

Unapplicazione: ricerche testuali

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

Ricerca di stringhe in un testo

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

Automi a stati finiti non deterministici per ricerche testuali


t

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.

U napplicazione: ricerche testuali

S ta rt

75

F ig u ra 2.16 U n NFA chc cerca le parole w e b e e b a y .

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

Un DFA per riconoscere un insieme di parole chiave

La costruzione per sottoinsiem i si pu applicare a qualunque NFA. Q uando la applichia


mo a un NFA costruito per un insiem e di parole chiave, secondo la strategia del Paragra
fo 2.4.2, troviam o che il num ero di stati del DFA non c mai m aggiore del num ero di stali
dellNFA. Poich invece, nel caso peggiore, il num ero di stati cresce esponenzialm ente
passando a un DFA. quello preso in esam e un caso favorevole, e spiega per quale ragio
ne si usa spesso il m etodo di determ inare un NFA per le parole chiave e di costruire da
questo un DFA. Ecco le regole per costruire linsiem e degli stati del DFA.
a) Se

c lo stato iniziale d ellNFA, allora (} uno degli stati del DFA.

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.

3. ogni altro stato d e llNFA raggiungibile da qo seguendo un cam m ino le cui


etichette sono un suffisso di a.\a2 arn, cio qualunque sequenza di sim boli
della form a ajaj+i am.

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.

Figura 2.17 C onversione in DFA d ell'N F A nella F igura 2.16.


Esempio 2.15 La costruzione di un DFA d a llNFA della Figura 2.16 illustrata nella F i
gura 2.17. O gni stato del DFA collocato nella stessa posizione dello stato p da cui
ricavato usando la regola (b). C onsideriam o per esem pio lo stato 135, che l abbrevia
zione per { 1 ,3 ,5 } . Tale stato stato costruito dallo stato 3; com e ogni altro insiem e di

Automi a stati finiti con epsilon-transizioni

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}.

Esercizio 2.4.2 Convertite ogni NFA deUEsercizio 2.4.1 in un DFA.

2.5

Automi a stati finiti con epsilon-transizioni

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

Uso delle e -transizioni

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

F ig u ra 2.18 Un e-NFA che accetta num eri decim ali.

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

Autom i a stati finiti con epsilon-transizioni

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.

Figura 2.19 Uso di e-transizioni per riconoscere parole.

2.5.2

La notazione formale per gli oNFA

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

{; -F ? 0 ,1 , . . . , 9}, , qo, {5})

( {0) Qi ?

dove definita dalla tabella della Figura 2.20.

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

F ig u ra 2.20 T abella di transizione per la Figura 2.18.

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) .

Autom i a siati finiti con epsilon-transizioni

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).

F ig u ra 2.21 E sem pi di stati e transizioni.

2.5.4

Transizioni estese e linguaggi per gli e-NF

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

1. Poniam o (q.x) = { p i,p 2, ,pk} In tal m odo i


sono tutti e soli gli stati
raggiungibili da q lungo cam m ini etichettati x. Un tale cam m ino pu term inare con
una o pi e-transizioni c pu contenere altre -transizioni.
2. Sia U t i S(Pi, a) linsiem e { r i , r, , r m }. In altre parole si seguono tutte le
transizioni etichettate a dagli stati che si raggiungono da q con cam m ini etichettati
X. Gli Tj sono alcuni degli stati raggiungibili da q con cam m ini etichettati uc. Gli
altri stati raggiungibili si trovano seguendo f-archi uscenti dagli r, nel passo (3),
pi avanti.
3. Infine S(q, w) = (JiL ECLOSE(rj). Q uesto ulteriore passo di chiusura include
tutti i cam m ini da q etichettati w, tenendo conto di eventuali e-archi dopo lultim o
sim bolo effettivo 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

5) si calcola com e segue.

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.

1. Dapprima si calcola S(q1: . ) U S(q4, . ) = { q2} U { <7.-3} = {^2, <73}.


2. Poi
S ( q 0 , 5 . ) = ECLOSE(^i ) U ECLOSE(^3) = { q } U {(/3, (/,->} = {<72: 3 , } -

Si calcola '(i70, 5 . 6 ) com e segue.


1. D apprim a si calcola S(q2, 6 ) U S(q3, 6 ) U S(q5, 6 ) = {y3 } U {<73} U 0 =

Autonii a stati finiti con epsilon-transizioni

83

2. Poi % 0? 5 . 6 ) = ECLOSE(^3) = {<73, <?5}

A questo punto possiam o definire il linguaggio di un e-NFA E = (Q, , <5, go, F)


com e il lettore pu im m aginare: L (E ) = {w \ S(qo. w) F 0}. Il linguaggio di E
c linsiem e delle stringhe w che portano dallo stato iniziale ad alm eno uno stato finale.
N ellEsem pio 2.20 abbiam o infatti osservato che S(qo, 5 . 6 ) contiene lo stato accettante
<75; ne deriva che la stringa 5 . 6 appartiene al linguaggio di queUe-NFA.

2.5.5

Eliminazione di e-transizioni

Dato un e-NFA E , possiam o trovare un DFA D che accetta lo stesso linguaggio di E.


La costruzione im piegata qui m olto sim ile a q u e lla per sottoinsiem i: gli stati di D sono
sottoinsiem i di stali di E. C una sola differenza: dobbiam o incorporare le e-transizioni
di E m ediante il m eccanism o di c-chiusura.
Sia E = (Q e , . S e , Qo-. F e ) II DFA equivalente

D = (Qv- ,

qi). Fo)

definito com e segue.


1. Q o l insiem e dei sottoinsiem i di Q e - Pi esattam ente scoprirem o che tutti gli
stati accessibili di D sono sottoinsiem i t-chiusi di Q e , cio insiem i S C Q e tali
che S = e c l o s e ( 5 ) . In altre parole un insiem e di stati S e-chiuso se ogni etransizione uscente da uno stato di S porta a uno stato di S. Si noti che 0 un
insiem e e-chiuso.
m

2. qp = ECLOSE(<7o); lo stato iniziale di D si ottiene chiudendo linsieme com posto


dal solo stalo iniziale di E. Si osservi che questa regola si distingue dalla costru
zione originale per soitoinsicm i, nella quale lo stato iniziale dclPaulom a costruito
l'in siem e contenente solo lo stato iniziale d ellNFA dato.
3. F d form ato dagli insiem i di stati che contengono alm eno uno stato accettante di
E. Q uindi F d = { 5 | S in Q o e S F e 0}.
4. Per ogni a in e per ogni insiem e S in Q d , Sd (S , a ) si calcola com e segue:
(a) sia S = Pi,P 2 ,---,P k }
(b) si determ ini l insiem e { r i , 7 ,. . , r m } ( J *=1 Se (p , )
(c) allora 5d (S.. u) =

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.

F ig u ra 2.22 II DFA D che elim ina le e-transizioni dalla Figura 2.18.


Poich lo stato iniziale di E qo, lo stato iniziale di D ECLOSE(yo), cio {r/0 , }. D ob
biam o anzitutto trovare i successori di r/0 e q\ rispetto ai sim boli di ; tali sim boli sono
i segni "pi e m eno, il punto c le cifre da 0 a 9. N ella Figura 2.18 osserviam o che q\
non ha archi uscenti per + e , m entre qo va in q\. D unque per calcolare
( {<7o- <?i}- + )
applichiam o la e-chiusura a {q\}. Non essendoci e-transizioni uscenti da e/i, abbiam o
d 'o ( { e / o , }, + ) = {e/i }. A nalogam ente
}: - ) = {</i} L e d u e tra n s iz io n i
sono rappresentate da un solo arco nella Figura 2.22.
D obbiam o ora calcolare 6i)({qo, q-}. . ). Poich qo non ha archi uscenti per il punto,
e c/i va in q2 (Figura 2.18), dobbiam o e-chiudere {2 }- N on ci sono e-transizioni uscenti
da <72, quindi il solo q2 form a la propria chiusura:
<7i}; . ) = {</2}
Infine calcoliam o 'd({c/o<?i} , 0) com e esem pio delle transizioni da {<zo?<7i} sulle
cifre. Scopriam o che qo non ha archi uscenti sulle cifre, m entre
va in q\ e in </4. Poich
nessuno di tali stati ha e-transizioni uscenti, concludiam o che {{% </i} 0) = {<71, q.\}\
per le altre cifre si procede nello stesso m odo.

Automi a stati finiti con epsilon-transizioni

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

L> = ( Q d , . So, qn-, L u )


D obbiam o dim ostrare che L(D) L(E)', a tale scopo proviam o che le funzioni di tran

/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

Se || = 0, allora w = e. Sappiam o che e(qo <0 = HCl.OSE(i/o) e che qo


ECLOSE(</o), perch questa la definizione dello stato iniziale di D. Infine per un DFA
b a se

sappiam o che (, e) = p per ogni stato p; in particolare 5o(qn, c) ECLOSe(/o)


A bbiam o cos provato che

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

_
_
_
_
_
_

1 Sia U =i Se (Pu o) uguale a { n . r 2, .. , r r}.


2. Ne segue che 5e (qo, iv) = U J l i ECLOSE(r).
Esam inando la costruzione del DFA D per sottoinsiem i, m odificata com e sopra, notiam o
che ({ , 2 . iPk } j a ) si ottiene dagli stessi passi (1) e (2) appena illustrati. Perci

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 sercizio 2.5.1 C onsiderate I seguente e-NFA.

e
0

V
</

{/>}

*r j {<!}

Cl

M
M
W

{</}
M
0

M
0

a) C alcolate le-chiusura di ciascuno stato.


b) Elencate tutte le stringhe di lunghezza minore o uguale a tre accettate d allautom a.
c) T rasform ate lautom a in un DFA.
E sercizio 2.5.2 Ripetete !Esercizio 2.5.1 p e rii seguente e-NFA:

<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

Automi a stati finiti deterministici (DFA ): un DFA ha un insiem e finito di stati e un


insiem e finito di sim boli di input. Uno degli stati iniziale; zero o pi stati sono
accettanti. Una funzione di transizione stabilisce com e cam bia lo stato a fronte di
un sim bolo di input.

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

Espressioni e linguaggi regolari


A priam o questo capitolo presentando le cosiddette espressioni regolari, un tipo di nota
zione per definire linguaggi gi brevem ente esem plificato nel Paragrafo 1.1.2. Le espres
sioni regolari si possono anche considerare come un linguaggio di program m azione in cui
esprim ere applicazioni rilevanti, relative per esem pio allam bito delle ricerche in testi o
com e com ponenti di un com pilatore. Le espressioni regolari sono strettam ente legate agli
autom i a stati finiti non determ inistici e possono rappresentare una com oda alternativa
alla notazione degli NFA per descrivere com ponenti softw are.
In questo capitolo, dopo averle definite, dim ostriam o che le espressioni regolari sono
in grado di definire tutti e soli i linguaggi regolari, dis cutiam o il m odo in cui esse sono
utilizzate in diversi sistem i softw are, quindi esam iniam o le leggi algebriche che si appli
cano loro. N onostante differenze rilevanti, tali leggi som igliano in m odo significativo a
quelle dellaritm etica.

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

Gli operatori delle espressioni regolari

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

3. I .a chiusura (o star o chiusura di Kleene1) di un linguaggio L viene indicata con


L* e rappresenta Tinsicm c delle stringhe che possono essere form ate prendendo un
num ero qualsiasi di stringhe da L, eventualm ente con ripetizioni (la stessa stringa
pu essere selezionata pi di una volta), e concatenandole tutte. Per esem pio, se
L = { 0 ,1 } , allora L* consiste di tutte le stringhe di 0 e I . Sc L = {0,11}, allora
L* consiste di quelle stringhe di 0 e I tali che gli 1 com paiono a coppie, per esem pio
O li, I l l l O e e, ma non 01011 o 101. In termini pi formali, L* lunione infinita
U>o L 1, dove L 0 = {e}, L 1 = L, e L \ p e r i > 1 L L L (la concatenazione di
i copie di L).
E sem p io 3.1 Dato chc lidea di chiusura di un linguaggio non im m ediatam ente com
prensibile, ne esam iniam o qualche esem pio. In prim o luogo, sia L = {0, 11}. L0 = {e},
indipendentem ente da L: la potenza di ordine 0 rappresenta la selezione di zero stringhe
da L. A bbiam o poi L 1 = L, ovvero la scelta di una stringa di L. Dunque i prim i due
term ini nellespansione di L* danno {e. 0 ,1 1 } .
C onsideriam o poi L 2. Prendiam o due stringhe da L, con ripetizioni consentite, per
cui ci sono quattro scelte, che danno L 2 {0, 0 1 1 .1 1 0 . 1111}. A nalogam ente I 3 lin
siem e delle stringhe che possono essere form ate com piendo tre scelte delle due stringhe
in L, cio

{ 000, 0011, 0110, 1100, 01111, 11011, 11110, 111111}


Per calcolare L* dobbiam o com putare L 1 per ogni i, e prendere lunione di tutti questi
linguaggi. L 1 ha 2' membri. Sebbene ogni Lx sia finito, lunione degli infiniti term ini L'
generalm ente un linguaggio infinito, com e nel nostro esem pio.
Sia ora L linsiem e di tutte le stringhe di 0. Si noti che L infinito, a differenza
dellesem pio precedente, in cui L era un linguaggio finito. Tuttavia non difficile scoprire
c o s L*. L 0 = {c}, com e sem pre, m entre L i = L. L 2 linsiem e di stringhe form ato
prendendo una stringa di 0 c concatenandola con un altra stringa di 0. Il risultato ancora
una stringa di 0. In effetti ogni stringa di 0 pu essere scritta com e la concatenazione di
due stringhe di 0 (non si dim entichi che e una stringa di 0 e pu sem pre essere una
delle due stringhe che vengono concatenate). Dunque T? = L. A nalogam ente L i = L,
e cos di seguito. Perci l unione infinita L* = L0 U L i U L 2 U L nel caso
particolare chc il linguaggio L sia linsieme di tutte Ic stringhe di 0.
C om e esem pio finale, 0* = {e}. N otiam o che 0 = {e}, m entre 0l vuoto per ogni
i > 1, dato che nessuna stringa pu essere selezionata d allinsiem e vuoto. Effettivam ente
0 uno degli unici due linguaggi la cui chiusura non infinita.

l La locuzione chiusura di Klccnc fa riferimento a S. C. Kleene. che ide la notazione delle espressioni
regolari c questoperatore.

92

Capitolo 3

Uso delloperatore asterisco


A bbiam o incontrato per la prim a volta loperatore asterisco nel Paragrafo 1.5.2,
dove !abbiam o applicato a un alfabeto, per esem pio *. Tale operatore forma
tutte le stringhe i cui sim boli sono scelti dallalfabeto . L 'operatore di chiusura
essenzialm ente lo stesso, sebbene vi sia una sottile differenza di tipo.
Supponiam o chc L sia il linguaggio contenente stringhe di lunghezza 1, c
che per ogni sim bolo a in esista una stringa a in L. A llora, sebbene L e
abbiano lo stesso aspetto, sono di tipo diverso: L un insiem e di stringhe,
m entre un insiem e di sim boli. D altra parte L* indica lo stesso linguaggio di

3.1.2

Costruzione di espressioni regolari

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).

2. Se E ed F sono espressioni regolari, allora E F un'espressione regolare che indi


ca la concatenazione di L ( E ) c L(F). O ssia L ( E F ) = L (E ) L (F ). Si osservi che
il punto pu essere usato facoltativam ente per indicare loperatore di concatena
zione, visto com e operatore su linguaggi oppure com e operatore in u n espressione
regolare. Per esem pio 0 1 u n espressione regolare che ha lo stesso significato
di OI e rappresenta il linguaggio {01}. T uttavia si eviter di usare il punto com e
concatenazione nelle espressioni regolari.2
3. Se E unespressione regolare, allora E * u n espressione regolare che indica la
chiusura di L(E). Cio L(E*) = (L(E))*.
4. Se E u n espressione regolare, allora anche (E), un E tra parentesi, unespres
sione regolare, e indica lo stesso linguaggio di E. In term ini form ali L ( ( E ) ) =

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

Le espressioni e i loro linguaggi


Per essere precisi, u n espressione regolare E appunto u n espressione, non un
linguaggio. Quando vogliam o riferirci al linguaggio denotato da E , dovrem m o
usare L(E). Tuttavia consuetudine fare riferim ento a E quando effettivamente
si intende L(E). R icorrerem o a tale convenzione finch sar chiaro che si tratta
di un linguaggio c non di u n espressione regolare.

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 + :

L(e + I ) = L(c) U L ( I ) = {e} U {1} = {r , 1}


Se concateniam o questo linguaggio con un qualsiasi altro linguaggio L t la scelta e d
tutte le stringhe in L, m entre la scelta 1 d Iw per ogni stringa w in L. Perci u n altra
espressione per l'insiem e di stringhe che alternano 0 e I :
( + 1 )(0 1 )( + 0)
Si noti che, per garantire che gli operatori siano raggruppati opportunam ente, sono neces
sarie le parentesi prima e dopo ogni espressione aggiunta.

3.1.3

Precedenza degli operatori delle espressioni regolari

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

0(1* + I). Il linguaggio di questespressione linsiem e di stringhe formale da uno 0


seguito da un numero arbitrario di 1.

3.1.4

Esercizi

Esercizio 3.1.1 Scrivete le espressioni regolari per i seguenti linguaggi.


* a) Linsiem e delle stringhe sullalfabeto {a, 6, c) che contengano almeno una a e
almeno una b.
b) Linsieme delle stringhe di 0 e 1 il cui decimo sim bolo a partire da destra sia 1.
c) Linsiem e delle stringhe di 0 c 1 con al massimo una coppia di 1 consecutivi.
! Esercizio 3.1.2 Scrivete le espressioni regolari per i seguenti linguaggi.
* a) Linsieme di tutte le stringhe di 0 e 1 tali che ogni coppia di 0 adiacenti com paia
prim a di qualunque coppia di 1 adiacenti.
b) Linsiem e delle stringhe di 0 e 1 il cui numero di 0 sia divisibile per cinque.
!! Esercizio 3.1.3 Scrivete le espressioni regolari p e ri seguenti linguaggi.
a) Linsieme di tutte le stringhe di 0 e 1 che non contengano 101 come sottostringa.
b) Linsieme di tutte le stringhe con un numero uguale di 0 e 1 tali chc in ogni prefisso
Ia differenza tra il numero di 0 e il numero di 1 sia minore di 2.
c) L'insiem e delle stringhe di 0 c 1 il cui numero di 0 sia divisibile per cinque e il
numero di 1 sia pari.
! Esercizio 3.1.4 Descrivete in italiano i linguaggi delle seguenti espressioni regolari:
* a) (1 + e)(0 0 Kl)~0*
b) ( 0 * )* 0 0 0 (0 + 1 )*
c) (0 + 10)*!*.
*! Esercizio 3.1.5 NellEsem pio 3.1 abbiam o sottolineato che 0 uno dei linguaggi la cui
chiusura finita. Qual laltro?

Autom i i stilli finiti ed espressioni regolari

3.2

97

Automi a stati finiti ed espressioni regolari

D escrivere un linguaggio per m ezzo di u n espressione regolare fondam entalm ente di


verso dal farlo per m ezzo di un autom a finito; eppure le due notazioni rappresentano di
fatto la stessa classe di linguaggi, quelli chc abbiam o denom inato regolari . A bbiam o
gi dim ostrato che gli autom i a stati finiti determ inistici e i due tipi di autom a a stati finiti
non determ inistici, con e senza -transizioni, accettano la stessa classe di linguaggi. Per
provare che le espressioni regolari definiscono la stessa classe, dobbiam o dim ostrare due
cose.
1. Ogni linguaggio definito da uno di questi autom i c definito anche da unespres
sione regolare. Per questa dim ostrazione possiam o assum ere che il linguaggio sia
accettato da un DFA.
2. Ogni linguaggio definito da u n espressione regolare definito da uno di questi au
tom i. Per questa parte della dim ostrazione pi sem plice m ostrare che esiste un
NFA con e-transizioni che accetta lo stesso linguaggio.
La F igura 3.1 illustra tutte le equivalenze che abbiam o dim ostrato o che dim ostrerem o.
Un arco dalla classe .Y alla classe Y significa che ogni linguaggio definito dalla classe
X definito anche dalla classe Y . Poich il grafo fortem ente connesso (cio possiam o
andare da ognuno dei quattro nodi a qualunque altro nodo) concludiam o chc le quattro
classi in realt coincidono.

Figura 3.1 Piano per la dim ostrazione d ellequivalenza di quattro diverse notazioni per i
linguaggi regolari.

3.2.1

Dai DFA alle espressioni regolari

La costruzione di un espressione regolare che definisca il linguaggio di un DFA dato


sorprendentem ente intricata. D etto a grandi linee, si devono form are espressioni che d e
scrivano insiem i di stringhe che etichettano certi cam m ini nel diagram m a di transizione

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.

Automi a stati finiti ed espressioni regolari

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)

Per costruire lespressione R ij usiam o la seguente definizione induttiva, a partire da


k = 0 per raggiungere infine k = n. Si noti che quando k = n, poich non esistono stati
pi grandi di n, non c alcuna restrizione sui cam m ini rappresentati.
BASE L a base k = 0. D ato che tutti gli stati sono num erati da I in su, la restrizione
com porta che il cam m ino non abbia nessuno stato interm edio. Ci sono solo due tipi di
cam m ino che soddisfano tale condizione:
1. un arco dal nodo (stato) i al nodo j
2. un cam m ino di lunghezza che consiste solam ente di un nodo i.
Se i j , allora possibile solo il caso (1). D obbiam o esam inare il DFA A e trovare i
sim boli di input a tali che esista una transizione dallo stato i allo stato j su a.
a) Se non esiste un tale sim bolo a , allora R ^ = 0.
b) Sc esiste esattam ente un tale sim bolo a, allora R ^ = a.
c) Se esistono sim boli a i , a ^ . . . . .ah che etichettano archi dallo stato i allo stato j ,
allora

= 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

< l) = 1 + ,)( ( " ,>) * ig " 1)


per le etichette di tutti i cam m ini dallo stato i allo stato j che non passano per stati pi alti
di k. Se costruiam o queste espressioni in ordine rispetto al valore d ellapice (A), allora,
dato che ogni
dipende solam ente dalle espressioni con un apice pi piccolo, tutte le
espressioni sono disponibili quando ne abbiam o bisogno.
A lla fine abbiam o R i^ 1 per ogni i e j. Possiam o assum ere che lo stato 1 sia lo stato
iniziale, mentre gli stati accettanti possono essere qualunque insiem e di stati. L 'espressio
ne regolare per il linguaggio d ell'au to m a allora la som m a (unione) di tutte le espressioni

R [ " 1 tali che lo stato j sia uno stato accettante.

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)

Automi a stali finiti ed espressioni regolari

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

Per sostituzione diretta

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.

La sem plificazione di R ^ e R 221 dipende da due regole relative a 0. Per qualunque


espressione regolare R, vale quanto segue.
1. 0/? = /0 = 0. In altre parole, 0 un annichilatore per la concatenazione; esso
stesso il risultato della concatenazione con una qualsiasi espressione a sinistra o a
destra. Tale regola ha un senso perch, se vogliam o che una stringa sia nel risultato
di una concatenazione, dobbiam o trovare stringhe da entram bi gli argomenti della
concatenazione. Se uno degli argom enti 0, im possibile trovare una stringa per
q uellargomento.
2. 0 + R = R+fl = R. O ssia 0 l'identit per lunione; quando com pare in ununione,
il risultato laltra espressione.
Di conseguenza u n espressione com e 0 (c + 1 )*(c.4-1 ) pu essere sostituita da 0. Le ultime
due sem plificazioni dovrebbero essere chiare.
C alcoliam o ora lespressione R (- f La regola induttiva applicata con k = 2 d:

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

Per sostituzione diretta

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.

Automi a stati finiti ed espressioni regolari

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

Conversione di DFA in espressioni regolari per


eliminazione di stati

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

Figura 3.7 U no stato s che sta per essere elim inato.

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

Automi a stati finiti ed espressioni regolari

105

Figura 3.8 Risultato d ellelim inazione di .<?dalla Figura 3.7.

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).

F ig u ra 3.9 Un generico autom a a due stati.


3. Se lo stato iniziale anche accettante, dobbiam o elim inare tutti gli stati d ellautom a
originale, eccetto quello iniziale. Cos facendo otteniam o un autom a a uno stato,
sim ile a quello della Figura 3.10. L 'espressione regolare che indica le stringhe che
tale autom a accetta R*.

Figura 3.10 Un generico autom a a uno stato.


4. L 'espressione regolare desiderata la som m a (unione) di tutte le espressioni de
rivate dagli autom i ridotti per ogni stato accettante, in virt delle regole (2) e
(3).

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.

Autom i a stati finiti ed espressioni regolari

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.

Lo stato B ha un predecessore. A, e un successore, C. N ei term ini delle espressioni


regolari del diagram m a nella F igura 3.7: Q i = I , Pi = 0 + I , R u = 0 (dato che l'arco
da A a C non esiste) e S = 0 (poich non c nessun ciclo sullo stato B ). N e risulta che
lespressione sul nuovo arco da A a C 0 + 10*(0 + 1).
P er sem plificare, elim iniam o prim a liniziale 0, che pu essere ignorato in u n u nio
ne. Lespressione diventa quindi 10 (O + 1). Si noti che lespressione regolare 0"
equivalente allespressione regolare e, dato che
L (0*) = {e} U ( 0 ) U L (0 )L (0 ) U
Dal m om ento che tutti i term ini eccetto il prim o sono vuoti, abbiam o 7.(0*) = {e}, il che
lo stesso di L(e). P erci 10*(0 + 1) equivalente a 1(0 f 1), che lespressione che
usiam o per larco A > C nella Figura 3.13.

0+1

Figura 3.13 E lim inazione dello stato B.

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

Figura 3.14 Un autom a a due stati con gli stati A e D .


Nei term ini del generico autom a a due stati della Figura 3.9, le espressioni regolari per
la Figura 3.14 sono: R = 0 + I, S = 1(0 + 1)(0 + I), T = 0 e U = fc>. L 'espressione
U* pu essere sostituita da c, ossia elim inata, in una concatenazione. La spiegazione
che, com e discusso sopra, 0* = e. Inoltre lespressione S U * T equivalente a 0, poi
ch , uno dei termini della concatenazione, 0. In questo caso lespressione generica
(R + SU*T)*SU* si sem plifica dunque in R * S , cio (0 + 1)" 1 (0 + 1 ) ( 0 + 1). In term ini
inform ali il linguaggio di q u estespressione una qualsiasi stringa che finisca per 1, se
guita da due sim boli che sono ciascuno U oppure 1. Tale linguaggio una porzione delle
stringhe accettate dallautom a della Figura 3.11: le stringhe la cui terzultim a posizione
occupata da un 1.
D obbiam o ora ricom inciare dalla F igura 3.13 ed elim inare lo stato D anzich C. Dato
che D non ha successori, l osservazione della Figura 3.7 rivela che non ci saranno cam
biam enti negli archi e che l arco da C a D viene elim inato insiem e allo stato D. Lautom a
a due stati che ne deriva rappresentato nella Figura 3.15.
Lautom a molto sim ile a quello della Figura 3.14; solo letichetta su llarco dallo
stato iniziale allo stato accettante diversa. Possiam o dunque applicare la regola per gli
autom i a due stati e sem plificare l espressione per ottenere (0 + 1 )* 1(0 + 1). Q uesta
espressione rappresenta laltro tipo di stringa accettata d allautom a: le stringhe con un 1
in penultim a posizione.
Non rim ane altro che com piere la som m a delle due espressioni per ricavarne lespres
sione relativa alFintero autom a della Figura 3.11. Q uesta

(0 + 1 )* 1 (0 + 1) + ( 0 + 1 ) - 1 ( 0 + 1 )(0 + 1).

A uiow i a stati finiti ed espressioni regolari

109

U ordine nell'eliminazione degli stati


C om e abbiam o osservato n ellE sem pio 3.6, uno stato viene elim inato in tutti gli
autom i derivati quando non n lo stato iniziale n uno stato accettante. Perci
uno dei vantaggi del processo di elim inazione di stati, paragonato alla generazio
ne m eccanica di espressioni regolari descritta nel P aragrafo 3.2.1, che p ossia
m o com inciare elim inando definitivam ente tutti gli stati che non sono n iniziali
n accettanti. Lo sforzo di riduzione duplicato solo quando si deve elim inare
qualche stato accettante.
A nche in questo caso possiam o com binare una parte dello sforzo. Per esem
pio, se ci sono tre stati accettanti p, q ed r , possibile elim inare p, c poi elim inare
separatam ente q ed r, producendo rispettivam ente gli autom i per gli stati accet
tanti r e q. Poi ricom inciam o con tutti e tre gli stati accettanti ed elim iniam o sia
q sia r ottenendo l autom a per p.

0 + 1

Figura 3.15 A utom a a due stati risultante d a lT elim inazione di D.

3.2.3

Conversione di espressioni regolari in automi

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.

Teorema 3.7 O gni linguaggio definito da u n espressione regolare definito anche da un


autom a a stati finiti.
DIMOSTRAZIONE Supponiam o che L = L (R ) per u n espressione regolare R. M ostriam o
che L = L ( E ) per un e-NFA E con:

HO

Capitolo 3

1. esattam ente uno stato accettante


2. nessun arco entrante nello stato iniziale
3. nessun arco uscente dallo stato accettante.
La dim ostrazione si svolge per induzione strutturale su R , seguendo la definizione ricor
siva delle espressioni regolari data nel Paragrafo 3.1.2.
....... >

Zr

**-

.....

'

(a)

(b)
\

f
Cl

V__

J
(C)

Figura 3.16 La base della costruzione di un autom a da u n espressione regolare.


L a base consta di tre parti, illustrate dalla Figura 3.16. N ella parte (a) vediam o co
me trattare lespressione e. Il linguaggio d e llautom a chiaram ente {e}, dato che lunico
cam m ino dallo stato iniziale verso uno stato accettante etichettato e. La parte (b) m ostra
la costruzione per 0. C hiaram ente non esistono cam m ini dallo stato iniziale allo stato
accettante; dunque il linguaggio di q u estautom a 0. Infine la parte (c) descrive lautom a
per l espressione regolare a. Il linguaggio di q u estautom a consiste palesem ente n e ll'u
nica stringa a che anche L ( a ). facile verificare che tutti questi automi soddisfano le
condizioni (1), (2) e (3) d e llipotesi induttiva.
b a se

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.

Automi a stati finiti ed espressioni regolat i

S......

-O

\ S'
8

-O

1
V

111

.
5

(b)

Figura 3.17 II passo induttivo nella costruzione dallespressione regolare alle-NFA.

1. Lespressione l 4- S per due espressioni pi piccole l ed S. Qui si usa l'automa


della Figura 3.17(a). In altre parole, partendo dal nuovo stato iniziale, possiamo
andare nello stato iniziale dellautoma per R oppure in quello dellautoma per S.
Raggiungiamo poi lo stato accettante di uno di questi automi seguendo un cammino
etichettato da una stringa chc si trova rispettivamente in L(R) oppure L(S). Una
volta raggiunto lo stato accettante dellautoma per R o S , possiamo seguire uno
degli archi e. verso lo stato accettante del nuovo automa. Il linguaggio dellautoma
della Figura 3.17(a) perci L(R) U L(S).

2. L'espressione RS per due espressioni pi piccole R ed S. Lautoma per la con


catenazione rappresentato dalla Figura 3.17(b). Si noti che lo stato iniziale del

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).

3. Lespressione R * per unespressione pi piccola R. Usiamo allora lautoma della


Figura 3.17(c), che offre due tipi di percorso.
(a) Direttamente dallo stato iniziale allo staio accettante lungo un cammino eti
chettalo e. Tale cammino fa accettare c, che si trova in L(Rr) a prescindere
da R.
(b) Verso lo stato iniziale dell'automa per R, attraverso tale automa una o pi
volte, e poi verso lo stato accettante. Questo insieme di cammini ci permette di
accettare stringhe in L(R). L(R)L(R). L(R)L(R )L(R ), e cos via, coprendo
cos tutte le stringhe in L (R *), eccetto eventualmente r. gi coperta dall'arco
diretto verso lo stato accettante menzionato in (3a).
4. Lespressione (R) per unespressione pi piccola R. Dato che le parentesi non
cambiano il linguaggio definito dallespressione, lautoma per R serve anche come
automa per (R).
Si osservi infine che gli automi costruiti soddisfano le tre condizioni date nellipotesi
induttiva: uno stato accettante, nessun arco entrante nello stato iniziale oppure uscente
dallo stato accettante.
Esempio 3.8 Convertiamo lespressione regolare (0 + 1)* 1(0 + 1) in un e-NFA. Il primo
passo costruire un automa per 0 + 1. Usiamo due automi costruiti secondo la Figu
ra 3.16(c), uno con etichetta 0 sullarco e uno con etichetta 1. Questi due automi vengo
no poi combinati usando la costruzione per lunione della Figura 3.17(a). Il risultato
rappresentato nella Figura 3.18(a).
In un secondo passo applichiamo alla Figura 3.18(a) la costruzione per la chiusura
della Figura 3.17(c). Il risultato illustrato dalla Figura 3.18(b). Gli ultimi due passi
comportano lapplicazione della costruzione per la concatenazione della Figura 3.17(b).
In primo luogo connettiamo l'automa della Figura 3.18(b) allautoma destinato ad ac
cettare solamente la stringa 1. Tale automa unaltra applicazione della costruzione di
base della Figura 3.16(c) con etichetta 1 sull'arco. Si noti chc dobbiamo creare un nuovo
automa per riconoscere 1; non possiamo usare lautoma che riconosce 1, gi parte della
Figura 3.18(a). Il terzo automa nella concatenazione di nuovo un automa per 0 + 1 .
Ancora una volta dobbiamo creare una copia dellautoma della Figura 3.18(a). non pos
siamo usare la copia che diventata parte della Figura 3.18(b). Lautoma completo

Automi a stati finiti ed espressioni regolari

Cd)

(b)

Start

(c)
^

Figura 3.18 G li automi costruiti per Esempio 3.8.

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

Esercizio 3.2.1 Ecco la tabella di transizione per un DFA:


0

Ql

<12

<12

<13

Ql

*<?3

(13

Q-2

* a) Scrivete tutte le espressioni regolari l]"'Nota: si consideri lo stato q come se


fosse lo stato numero i.
* b) Scrivete tutte le espressioni regolari R\)\ Semplificate le espressioni il pi possi
bile.
c) Scrivete tutte le espressioni regolari 7?^. Semplificate le espressioni il pi possi
bile.
d) Scrivete unespressione regolare per il linguaggio dellautoma.
* e) Costruite il diagramma di transizione per il DFA e scrivete unespressione regolare
per il suo linguaggio eliminando lo stato q-Esercizio 3.2.2 Ripetete !Esercizio 3.2.1 per il seguente DFA:

- 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
$

Automi a stati finiti ed espressioni regolari

115

Esercizio 3.2.4 Convertite le seguenti espressioni regolari in NFA con e-transizioni.


* a) 01 " .
b) (0 + 1)01.
c) 00(0+1)*.
Esercizio 3.2.5 Eliminate le e-transizioni dagli NFA delFEsercizio 3.2.4. Nelle pagine
Web del libro potete trovare una soluzione della parte (a).
Esercizio 3.2.6 Sia A = (Q. . S, q0, {r/f}) un e-NFA tale che non esiste nessuna transi
zione entrante in r/o c nessuna transizione uscente da qj. Descrivete il linguaggio accettato
da ognuna delle seguenti modificazioni di A nei termini di L = L{A).
* a) Lautoma costruito da A aggiungendo una r-transizionc da q a q^.
* b) L'automa costruito da .4 aggiungendo una e-transizione da qo verso ogni stato rag
giungibile da e/o (lungo un cammino le cui etichette possono includere sia i simboli
di sia e).
c) Lautoma costruito da A aggiungendo una r-transizionc verso q da ogni stato che
pu raggiungere q lungo un qualche cammino.
d) Lautoma costruito da A svolgendo sia il punto (b) sia il punto (c).
Esercizio 3.2.7 Possiamo semplificare le costruzioni del Teorema 3.7. che trasformano
un'espressione regolare in un e-NFA. Presentiamo tre soluzioni.
1. Per loperatore di unione, anzich creare un nuovo stato iniziale e un nuovo stato
accettante, combinate i due stati iniziali in un unico stato con tutte le transizioni di
entrambi gli stali iniziali. In modo simile, unite i due stati accettanti e dirigete verso
lo stato composto le transizioni dirette a ognuno dei due.
2. Per l'operatore di concatenazione possibile combinare lo stato accettante del
primo automa con lo stato iniziale del secondo.
3. Per loperatore di chiusura si possono semplicemente aggiungere le e-transizioni
dallo stato accettante allo stato iniziale, e viceversa.
Ognuna di queste semplificazioni produce di per s una costruzione corretta: le-NFA
risultante per una qualunque espressione regolare accetta il linguaggio dellespressio
ne. Quali sottoinsiemi di cambiamenti (1), (2) c (3) possono essere svolli insieme nella
costruzione, ottenendo comunque un automa concito per ogni espressione regolare?

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

Applicazioni delle espressioni regolari

Un'espressione regolare che rappresenta ci che si vuole riconoscere lo strumento pi


adatto per le applicazioni che cercano pattern in un testo. Le espressioni regolari vengono
poi tradotte, dietro le quinte, in automi deterministici o non deterministici, chc vengono
simulati per produrre un programma di riconoscimento di pattern nel testo. In questo
paragrafo tratteremo due importanti classi di applicazioni basate sulle espressioni regolari:
gli analizzatori lessicali e la ricerca testuale.

3.3.1

Le espressioni regolari in UNIX

Prima di esaminare le applicazioni, introduciamo la notazione di UNIX per le espressioni


regolari estese. Tale notazione offre alcune possibilit supplementari. In realt le esten
sioni di UNIX includono caratteristiche, in particolare la possibilit di nominare e fare
riferimento a stringhe precedenti conformi a un pallern, chc permettono il riconoscimen
to di linguaggi non regolari. Qui non si considerano tali aspetti; ci limitiamo a introdurre
alcune scorciatoie utili a esprimere concisamente espressioni regolari complesse.
La prima estensione riguarda il fatto che la maggior parte delle applicazioni impiega
linsieme dei caratteri ASCII. Nei nostri esempi abbiamo usato perlopi un alfabeto limi
tato. come {0,1}. L'esistenza di due soli simboli ci ha permesso di scrivere espressioni
concise come 0 + 1 per indicare qualunque carattere. Sc ci fossero invece, per esempio,
128 caratteri, la stessa espressione richiederebbe un elenco completo, e sarebbe poco pra
tica da scrivere. Le espressioni regolari di UNIX permettono dunque di esprimere classi
di caratteri" per la rappresentazione il pi possibile concisa di insiemi di caratteri. Le
regole per tali classi sono le seguenti.
llsimbolo . (dot) sta per qualunque carattere.
Lascquenza [Oya2

] sta per lespressione regolare


1 + ---- +

(lk

Questa notazione fa risparmiare la met dei caratteri, in quanto non necessario


scrivere i segni +. Per esempio i quattro caratteri usati negli operatori di confronto
del C possono essere espressi da [<>=!].

Applicazioni delle espressioni regolari

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

a) [ : d i g i t : ] l'insieme delle dicci cifre, esattamente come [0-9 ]


b) [ : a lp h a : ] sta per ogni carattere alfabetico, come [A-Za-z]
c) [ : alnura : ] sta per le cifre e le lettere (caratteri alfabetici e numerici), come
[A-Za-zO-9].
Ci sono altri operatori, usati nelle espressioni regolari di UNIX, che non abbiamo ancora
incontrato. Nessuno di questi operatori estende la classe dei linguaggi esprimibili, ma
talvolta consente di descrivere pi facilmente ci che si vuole.
1. Loperatore |si usa al posto di + per indicare lunione.
2. Loperatore ? significa zero oppure uno. Perci in UNIX R i lo stesso di f + R
nella notazione delle espressioni regolari usata in questo libro.
3. Loperatore +significa uno o pi di uno. Dunque in UNIX R+ labbreviazione
di R R * nella nostra notazione.
4. Loperatore {n} significa n copie. Dunque in UNIX /{5} labbreviazione di
RRRRR.
Le espressioni regolari di UNIX consentono luso di parentesi per raggruppare sottoe
spressioni, come per le espressioni regolari descritte nel Paragrafo 3.1.2, e si applicano
loro le stesse regole di precedenza degli operatori (con ?, + e {n} trattati come * per
quanto riguarda la precedenza). Loperatore star * viene usato in UNIX (ma non come
apice, per ovvi motivi) con lo stesso significato gi visto.
\Se si usa un codice diverso dallA SC II, incluso un codice in cui le cifre non abbiano codici consecutivi, Ia
notazione [ d i g i t : ] ha il vantaggio di rappresentare ancora [ 0 1 2 3 4 5 6 7 8 9 ] . mentre [ 0 - 9 / ipprcscnia
qualunque carattere il cui codice sia compreso fra quelli di 0 e di 9. estremi inclusi.

Capitolo 3

118

Tutta Ia verit sulle espressioni regolari di UNIX


Il lettore che desideri lelenco completo degli operatori e delle abbreviazioni di
sponibili nella notazione delle espressioni regolari di UNIX pu trovarlo nelle
pagine di manuale dei vari comandi. Ci sono alcune differenze tra Ic diverse
versioni di UNIX, ma con un comando come man g r e p si ottiene la notazione
usata per il comando g re p , chc c sempre presente. Per inciso, grep c Pacroni
mo di Global (search for) Regular Expression and Print, ossia ricerca globale e
stampa di espressioni regolari.

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

Applicazioni delle espressioni regolari

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)

Figura 3.19 Un esempio di input per lex.


La terza voce della Figura 3.19 corrisponde a >=, un operatore di due caratteri. Lultimo
esempio per il segno =, un operatore di un carattere. In pratica comparirebbero le
espressioni che descrivono ognuna delle parole-chiave, ognuno dei segni e dei simboli di
punteggiatura, come le virgole e le parentesi, c famiglie di costanti, come i numeri e le
stringhe. Molte di queste sono semplici: una sequenza di uno o pi caratteri specifici.
Altre invece somigliano piuttosto agli identificatori e per essere descritte richiedono tutta
la potenza della notazione delle espressioni regolari. Gli interi, i numeri a virgola mobile,
le stringhe di caratteri e i commenti sono altri esempi di insiemi di stringhe che si giovano
della capacit di comandi come lex di trattare espressioni regolari.
La conversione in automa di una famiglia di espressioni come quelle suggerite nella
Figura 3.19 procede pi o meno nel modo descritto in termini formali nei paragrafi pre
cedenti. .Si parte da un automa per l'unione di tutte le espressioni. A rigor di termini,
lautoma segnala solo che stato riconosciuto un token non specificato. Tuttavia, se si
segue la costruzione del Teorema 3.7 per lunione delle espressioni, lo stato dellV-NFA
indica esattamente quale token stato riconosciuto.
L'unico problema che pu essere individuato pi di un token alla volta; per esem
pio la stringa else si accorda non solo con l'espressione regolare else, ma anche con
quella per gli identificatori. La soluzione consueta far s che lanalizzatore lessicale dia

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

Ricerca di pattern in un testo

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.

Applicazioni delle espressioni regolari

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]*)*

(Street|S t \ . |A v e n u e |A ve\. |R o a d | R d \ .)'


Lavorando con questa espressione si ottengono buoni risultati, ma prima o poi si scopre
ohe manca qualcosa:
1. strade designate in modo diverso da street, avenue o road; per esempio Boulevard,
Place. Way e le loro abbreviazioni
2. nomi di strade formati, anche parzialmente, da numeri, come 42nd Street
3. caselle postali
4. nomi che non terminano per Street o simili. Un esempio El Camino Real nella
Silicon Valley. Dato che in spagnolo significa la strada regale', sarebbe ridondante
dire El Camino Real Road, e dunque bisogna trattare anche indirizzi come 2000
El Camino Real
5. ogni altra stranezza immaginabile.
Un compilatore di espressioni regolari pu facilitare in modo significativo il processo
di lenta convergenza verso un riconoscitore completo di indirizzi rispetto alla neces
sit di ricodificare direttamente ogni mutamento in un linguaggio di programmazione
convenzionale.

122

3.3.4

Capitolo 3

Esercizi

! Esercizio 3.3.1 Scrivete unespressione regolare per descrivere i numeri di telefono in


tutte Ic varie forme che riuscite a concepire. Considerate i numeri internazionali e anche
il fatto che i prefissi e i numeri locali sono formati da un numero diverso di cifre in nazioni
diverse.
! Esercizio 3.3.2 Scrivete un'espressione regolare per rappresentare gli stipendi come com
paiono nelle offerte di lavoro. Considerate chc gli stipendi possono essere indicati su base
oraria, settimanale, mensile oppure annuale, e che possono essere accompagnati dal sim
bolo del dollaro o da unit di misura come K. Una o pi parole vicine possono indicare
uno stipendio. Suggerimento: per farvi un'idea di quali pattern sono utili, esaminate gli
annunci economici in un giornale oppure gli elenchi di offerte di lavoro on-line.
! Esercizio 3.3.3 Alla (ine del Paragrafo 3.3.3 abbiamo fornito alcuni esempi di migliorie
per l'espressione regolare che descrive indirizzi. Modificate lespressione in modo da
includere tutte le opzioni menzionate.

3.4

Propriet algebriche per le espressioni regolari

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

Propriet algebriche per le espressioni regolari

123

aritmetica, soprattutto quando entra in gioco loperatore di chiusura. I prossimi paragrafi


forniscono un catalogo delle propriet principali. Alla fine si discuter di come sia pos
sibile verificare se una presunta propriet per Ic espressioni regolari sia veramente una
propriet: in altre parole, se valida per qualunque linguaggio che pu essere sostituito
alle variabili.

3.4.1

Associativit e commutativit

La commutativit la propriet di un operatore per cui possibile scambiare lordine dei


suoi operandi e ottenere lo stesso risultato. Un esempio per laritmetica stato fornito in
precedenza: x + y = y -I- x. Lassociativit la propriet di un operatore che consente
di raggruppare gli operandi quando loperatore viene impiegato due volte. Per esempio la
propriet associativa della moltiplicazione (x x y) x z = x x (y x z). Ecco tre propriet
di questo tipo, valide per le espressioni regolari.
L 4- M = M + L. La propriet commutativa dell'unione afferma che si pu
effettuare lunione di due linguaggi in qualsiasi ordine.

(L + M ) + N = L + ( M + .'V). La propriet associativa dell'unione afferma che


possibile effettuare lunione di tre linguaggi facendo prima o l'unione dei primi
due o lunione degli ultimi due. Si noli che, considerando anche la propriet com
mutativa, si conclude che possibile effettuare lunione di qualunque famiglia di
linguaggi in qualunque ordine e raggruppamento con lo stesso risultato. Intuitiva
mente una stringa in L 1 U
U U Lk se e solo se in uno o pi dei linguaggi
Li .
(L M )N = L (M N ). La propriet associativa per la concatenazione afferma che
possibile concatenare tre linguaggi concatenando inizialmente i primi due oppure
gli ultimi due.
In questa lista manca la propriet L M = M L. Ci significherebbe che la concatena
zione commutativa. Questa affermazione per falsa.
Esempio 3.10 Si considerino le espressioni regolari 01 c 10. Queste espressioni denotano
rispettivamente i linguaggi {01} c {10}. Poich i linguaggi sono diversi, la propriet ge
nerale L M M L non valida. Sc lo fosse, si potrebbe sostituire lespressione regolare
0 con L e i con M e si giungerebbe alla falsa conclusione che 01 = 10.

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

laddizione, in quanto 0 + x = x 4- 0 = a:, e 1 l'identit per la moltiplicazione, dato che


I x . ? : - X X I x. Un annichilatore per un operatore un valore tale che. quando lo
peratore viene applicato alFannichilatore e a un altro valore, il risultato FannichiIatore.
Per esempio O un annichilatore per la moltiplicazione, dato chc O x x = x x O = 0. Non
ci sono annichilatoli per laddizione.
Questi concetti permeano le tre seguenti propriet delle espressioni regolari.
V

0 -F L = L + 0 = L. Questa propriet asserisce che 0 lidentit per lunione.


c.L Le L. Questa propriet asserisce che c lidentit per la concatenazione.
01 = 710 = 0. Questa propriet asserisce che 0 lannichilatore per la concatena
zione.
Queste propriet sono utili strumenti di semplificazione. Per esempio, se abbiamo un'u
nione di svariate espressioni, tra cui alcune sono 0 oppure sono state semplificale in 0,
allora possiamo escluderle dallunione. Analogamente, se si ha una concatenazione di
diverse espressioni, tra cui alcune sono t oppure sono stale semplificate in e, nella con
catenazione possiamo ometterle. Infine, se si ha una concatenazione di un qualunque
numero di espressioni, e se anche una sola di loro 0. l'intera concatenazione pu essere
sostituita da 0.

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.

Propriet algebriche per le espressioni regolari

125

Teorema 3.11 Se L, M ed N sono linguaggi arbitrari, allora

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

Propriet relative alla chiusura

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*.

0* = e. La chiusura di contiene solamente la stringa e, come stato discusso


nelFEsempio 3.6.
c* = e. facile verificare chc l'unica stringa che pu essere formata concatenando
un qualunque numero di copie della stringa vuota la stringa vuota stessa.
L+ = L L = VcL. Ricordiamo che L + definito come L + LL 4- LLL 4- .
Inoltre L* = e. 4- L 4- LL + LLL 4- . Dunque

LL * = L e + LL + LLL 4- LLLL +

Se consideriamo che Le = L, deduciamo chc le espansioni infinite per LL* e per


L + sono le stesse. Ci dimostra L 1 LL*. La dimostrazione che L + L*L
analoga.5
L* = L + + e.. La dimostrazione facile, dato che lespansione di L + include ogni
termine nellespansione di L* eccetto e. Si osservi che se il linguaggio L contiene
la stringa e, allora il termine aggiuntivo 4-e non necessario; in altre parole, in
questo caso particolare L + = L*.
Lr. = f 4 L. Questa regola di fatto la definizione dell'operatore ? .

3.4.6

Alla ricerca di propriet per le espressioni regolari

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

(L + M)* = (L* M*)*


Questa propriet afferma che se abbiamo due linguaggi qualsiasi L ed M , e chiudiamo la
loro unione, otteniamo lo stesso linguaggio che otterremmo se prendessimo il linguaggio
'S i noti che di conseguenza qualsiasi linguaggio L commuta (nella concatenazione) con la sua chiusura:
L L* = I * L. Tale regola non contraddice il fatto che generalmente la concatenazione non commutativa.

Propriet algebriche per le espressioni regolari

127

L*M*, ossia tutte le stringhe composte da zero o pi scelte da L seguite da zero o pi


scelte da M, c lo chiudessimo.
Per dimostrarla, si supponga in primo luogo che la stringa w sia nel linguaggio (L +
M )*.6 Allora possiamo scrivere w = w\w2 Wk per un certo k, dove ogni w\ in L
oppure in M . Ne consegue che ogni Wi nel linguaggio LxM ". Per capirne il motivo,
se Wi in L, si prenda una stringa w. da L (tale stringa anche in L*). Non si prenda
invece alcuna stringa da Af, o meglio si prenda e da A/*. Se w in Ai, largomentazione
simile. Una volta che si dimostrato che w, in L*M*, ne consegue che w nella
chiusura di tale linguaggio.
Per completare la dimostrazione dobbiamo inoltre dimostrare l'inverso, ossia che le
stringhe in (L *M *)* sono anche in (L 4- Af)*. Dato che il nostro obiettivo non dimo
strare la propriet, ma mettere in luce limportante propriet delle espressioni regolari di
cui parleremo in seguito, tralasciamo questa parte della dimostrazione.
Qualunque espressione con variabili pu essere pensata come unespressione regolare
concreta, cio priva di variabili, considerando ogni variabile come se fosse un simbolo
distinto. Per esempio nellespressione (L -I- Af)* le variabili L ed Af possono essere
rimpiazzate, rispettivamente, dai simboli a e b. Si ottiene cos lespressione regolare
(a + b)*.
Una volta sostituite le variabili con linguaggi, il linguaggio dellespressione concreta
d informazioni sulla forma delle stringhe di qualsiasi linguaggio formato dallespressione originale. Cos nella nostra analisi di (L + Af)* abbiamo osservato che qualunque
stringa w composta da una sequenza di scelte da L oppure da Af si trova nel linguaggio
(L + M)*. Arriviamo a questa conclusione esaminando il linguaggio dellespressione
concreta L (( a + b)*), che evidentemente linsieme di tutte le stringhe di a c b. Potrem
mo sostituire qualunque occorrenza di a in una di quelle stringhe con una stringa qualsiasi
di L, e qualunque occorrenza di b con una stringa qualsiasi di M , scegliendo eventual
mente stringhe diverse per diverse occorrenze di a oppure b. Tali sostituzioni, applicate a
tutte le stringhe in (a + b)*, danno tutte le stringhe formate concatenando stringhe di L
ed M , in qualsiasi ordine.
Lenunciato qui sopra pu apparire ovvio, ma come sottolineato nel riquadro 11
metodo non si pu estendere al di l delle espressioni regolari, la sua validit viene meno
quando ai tre operatori delle espressioni regolari se ne aggiungono altri. Nel prossimo
teorema dimostriamo il principio generale perle espressioni regolari.
Teorema 3.13 Sia E un'espressione regolare con variabili L i, L2, ,L Tn. Formiamo
l'espressione regolare concreta C sostituendo ogni occorrenza di Li con il simbolo a,
per i = 1 .2 ,..., m. Allora per ogni sequenza di linguaggi L i, L 2, . . . , Lrn ogni stringa
w in L(E) pu essere scritta w = W\W2 Wk, dove ogni w\ in uno dei linguaggi,
6Per semplicit identificheremo le espressioni regolari e i loro linguaggi, ed eviteremo di specificare il
linguaggio di" davanti a ogni espressione regolare.

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.

I casi fondamentali si hanno laddove E e. 0 o una variabile L. Nei primi due


casi non c nulla da dimostrare, in quanto lespressione concreta C coincide con E.
Se E c una variabile L, allora L(E) = L. Lespressione concreta C a, dove a il
simbolo corrispondente a L. Dunque L(C) = {a.}. Se in qucstunica suinga sostituiamo
il simbolo a con tutte le stringhe di L otteniamo il linguaggio L, chc anche L(E).

base

E possiamo avere tre casi. In primo luogo


supponiamo che E = F + G. ossia che l'ultimo operatore sia lunione. Siano C c D
le espressioni concrete formate, rispettivamente, da F e G . sostituendo le variabili con
simboli concreti. Si noti che lo stesso simbolo deve sostituire tutte le occorrenze della
stessa variabile, sia in F sia in G. Allora lespressione concreta chc si ottiene da E
C + D, e L(C + D) = L(C) + L(D).
Supponiamo che w sia una stringa in L(E), con le variabili di E rimpiazzate da lin
guaggi specifici. Allora w in L(F) oppure in L(G). Per lipotesi induttiva, w si ottiene
a partire da una stringa concreta in L(C) o in L(D) sostituendo i simboli con stringhe
dei linguaggi corrispondenti. Di conseguenza, in entrambi i casi, la stringa w pu essere
costruita a partire da una stringa concreta in L(C + D) e compiendo le stesse sostituzioni
di simboli con stringhe.
Dobbiamo inoltre considerare i casi in cui E c F G oppure F * . Le dimostrazioni sono
analoghe a quelle viste sopra nel caso di unione. Le lasciamo al lettore.
INDUZIONE A seconda dellultimo operatore di

3.4.7

Verifica di propriet algebriche sulle espressioni regolari

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.

Propriet algebriche per le espressioni regolari

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

variabili di E ed F se e solo se L(C) = L(D).


(Solo se) Supponiamo chc L(E) = L(F) per tutte le scelte di linguaggi al posto delle
variabili. In particolare scegliamo per ogni variabile L il simbolo concreto a che rimpiaz
za L nelle espressioni C e D. Allora per questa scelta L(C) = L(E) e L(D) = L(F).
Poich L(E) = L(F) c dato, ne consegue che L(C) = L(D).
(Se) Supponiamo che L(C) = L(D). Per il Teorema 3.13 L(E) e L(F) sono entram
bi costruiti rimpiazzando i simboli concreti delle stringhe in L(C ) e L(D) con stringhe
nei linguaggi che corrispondono a quei simboli. Se le stringhe di L(C ) e L(D) sono le
stesse, allora anche i due linguaggi costruiti in questo modo saranno gli stessi; in altre
parole, L(E) = L(F).
Esempio 3.15 Consideriamo una propriet plausibile: (L + M)* = (L *M *)*. Se rim
piazziamo le variabili L ed M con i simboli concreti a e b, otteniamo le espressioni
regolari (a 4 b)* c (a*b')*. facile verificare chc entrambe denotano il linguaggio for
mato da tutte le stringhe di a e b. Di conseguenza le due espressioni concrete denotano lo
stesso linguaggio e la propriet c valida.
Come ulteriore esempio consideriamo L* = L*L*. I linguaggi concreti sono rispet
tivamente a* e a^a', e ognuno di questi linsieme di tutte le stringhe di a. Anche in
questo caso la propriet risulta valida: in altre parole la concatenazione di un linguaggio
chiuso con se stesso produce il linguaggio stesso.
Consideriamo infine la presunta propriet L 4- M L = (L 4- M )L. Se scegliamo
i simboli a e b per le variabili L ed M , otteniamo le due espressioni regolari concrete
a 4- ba e (a 4- b)a. Ebbene, i linguaggi di queste espressioni non sono gli stessi. Per
esempio la stringa aa nel secondo, ma non nel primo. La presunta propriet risulta
perci falsa.

3.4.8

Esercizi

Esercizio 3.4.1 Verificate le seguenti identit fra espressioni regolari.


* a) R.

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

Il metodo non si pu estendere al di l delle espressioni regolari


Consideriamo unalgebra estesa delle espressioni regolari che includa Toperaiorc
di intersezione. E interessante notare che, come vedremo nel Teorema 4.8, se
si aggiunge ai tre operatori delle espressioni regolari, linsieme dei linguaggi
che possiamo descrivere non si allarga. D'altra parte il metodo di verifica delle
propriet algebriche non pi valido.
Prendiamo in esame la propriet L M JV = L n M , cio linterse
zione di tre linguaggi qualsiasi coincide con lintersezione dei primi due. Questa
propriet palesemente falsa. Per esempio siano L M = {a} e N = 0. Il
metodo basato sulla sostituzione delle variabili non coglie la differenza. In altre
parole, sostituendo L, M ed N con i simboli a, b c r, dovremmo verificare se
{} {7;} {c} = {a} {/;}. Poich entrambi i membri sono linsieme vuoto,
i linguaggi coincidono e dovremmo concludere che la propriet vera.
N

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*.

b) (RS + R)*R = R(SR + R )*.


* c)

(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

(0 + I)*1(0 + 1) + (0 + 1)*1(0 + 1)(0 + 1)


Usate le propriet distributive per sviluppare due espressioni equivalenti, diverse e pi
semplici.

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

L'idea di espressione regolare e la dimostrazione dellequivalenza con gli automi a stati


finiti sono di S. C. Kleene [3]. La costruzione di un r-NFA da un'espressione regolare

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

Dimostrare che un linguaggio non regolare

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

II pumping lemma per i linguaggi regolari

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.

L = L(A) per un certo DFA


A. Supponiamo che A abbia n stati. Consideriamo una stringa w di lunghezza o pi:
DIMOSTRAZIONE Supponiamo che L sia regolare. Allora

Dimostrare che un linguaggio non regolare

135

w = 2 -m, dove rn > n e ogni a, un simbolo di input. Per i = 0 ,1 ,... ,n


definiamo lo stato p. come (cjo, 2 o), dove <5 la funzione di transizione di A e 0
lo stato iniziale. Dunque p, lo stato in cui si trova dopo aver letto i primi i simboli
di w. Si noti che po = qoPer il principio della piccionaia, dato che ci sono sofo n stati, gli il + 1 stati p per
i = 0 ,1 .. . . , non possono essere tutti distinti. Ci sono perci due interi distinti, i e j,
con 0 < i < j < n. tali che p, = p. Possiamo ora scomporre w = xyz:
A

1.x = ai2 o-i


2. y = tti+ 1n.i+ 2 Uj

3 . Z Oj -f-1^ y-|-2 ' ' ' Utn .


In altre parole x porta a pt la prima volta; y riporta da pt a p (dato che p e pj coincidono),
mentre 2 conclude w. Le relazioni fra stringhe e stati sono indicate nella Figura 4.1. Si
noti che x pu essere vuota (quando i = 0), cos come 2 (quando j = ri = ni). Viceversa,
y non pu essere vuota perch i strettamente minore di j.
>=

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

Applicazioni del pumping lemma

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

Il pumping lemma come gioco a due


Nel Paragrafo 1.2.3 abbiamo visto che un teorema il cui enunciato comprende
diverse alternative di quantificatori per ogni" ed esiste' pu essere considerato
come una partita fra due giocatori. 11 pumping lemma un esempio rilevante di
questo tipo di teorema perch comporta quattro quantificatori distinti: per ogni
linguaggio regolare L, esiste n tale che. per ogni w in L con \
w\> n, esiste xyz
uguale a w tale che . Possiamo interpretare lapplicazione del lemma come
un gioco in cui:
1. il giocatore 1 sceglie il linguaggio L, chc si suppone non regolare
2. il giocatore 2 sceglie n senza rivelarlo a I; 1 deve ideare una strategia per
qualsiasi n
3. il giocatore 1 sceglie w, chc pu dipendere da n c devessere di lunghezza
almeno pari a n
4. I giocatore 2 scompone u> in x , y e 2, rispettando i vincoli imposti dal
lemma: y e e \
xy\ < n\anche in questo caso 2 non deve rivelare x, y e
2 a 1. ma deve soltanto rispettare i vincoli
5. il giocatore 1 vince scegliendo k, che pu dipendere da n, x, y e 2 . in
modo che xykz non appartenga a L.

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.

Dimostrare che un linguaggio non regolare

137

mancano quelli di y. Poich y c, non ci possono essere pi di n 1 simboli 0 in x e


2 insieme. Cos, dopo aver supposto che Leq fosse regolare, abbiamo dimostrato un fatto
che sappiamo essere falso, cio che xz appartiene a Leq. Abbiamo dunque dimostrato per
assurdo che L Kq non regolare.
Esempio 4.3 Dimostriamo che il linguaggio Lpr, formato da tutte le stringhe di 1 la cui
lunghezza un numero primo, non regolare. Supponiamo che lo sia. Allora esiste
una costante n che soddisfa le condizioni del pumping lemma. Consideriamo un numero
primo p > ri + 2; dal momento che i numeri primi sono infiniti, un numero simile esiste.
Sia w = l p.
Per il pumping lemma possiamo scomporre w = xyz, con y e e |;ry| < n. Sia
[y\= m. Ne segue \xz\ = p rn. Consideriamo ora la stringa xyv~mz, che in base al
lemma dovrebbe appartenere a Lpr se questo fosse regolare. Abbiamo per

\xyp~rnz\= \xz\+ (p m)\y\ = p rn + (p rn)m = (rn + 1){p rn)


Poich ha due fattori, m + I e p m, I numero \xyp~mz\non sembra essere primo.
Dobbiamo per verificare che nessun fattore sia 1 perch in tal caso il numero potrebbe
essere primo. Poich y e, vale m > I, da cui m +1 > 1 . Anche p - m > 1, perch
abbiamo scelto p > n + 2, e m < n, dato che
m = \
y\< \
xy\< n '
Perci p - rii > 2.
Anche in questo caso abbiamo anzitutto supposto che un linguaggio fosse regolare, e
ne abbiamo derivato una contraddizione mostrando che una stringa non appartenente al
linguaggio dovrebbe invece appartenergli, secondo il pumping lemma. Deduciamo cos
che Lpr non un linguaggio regolare.

4.1.3

Esercizi

Esercizio 4.1.1 Dimostrate che i seguenti linguaggi non sono regolari.


a) {0"T" I ri > 1}. Questo linguaggio, i cui elementi sono formati da una stringa
di 0 seguita da una stringa di uguale lunghezza di 1, proprio Loi- il linguaggio
esaminato informalmente all'inizio del paragrafo. Nella dimostrazione applicate il
pumping lemma.
b) Linsieme delle stringhe di parentesi bilanciate. Si tratta delle stringhe di ( e )
che compaiono nelle espressioni aritmetiche ben formate.
* c) (On IOn ! n > 1}.

138

Capitolo 4

d) {0'"lm2u I n cd in sono interi arbitrari}.


e) {0 l m I Ti < rn).
0 (On I 2n I n > 1}.
! Esercizio 4.1.2 Dimostrate che i seguenti linguaggi non sono regolari.
* a) |0n I un quadrato perfetto}.
b) (On I un cubo perfetto}.
c) {0"

I 7?.

una potenza di 2}.

d) Linsieme delle stringhe di O e l la cui lunghezza un quadrato perfetto.


c) Linsieme delle stringhe di 0 e 1 della forma ww, formate cio da una stringa
ripetuta.
f) L'insieme delle stringhe di 0 e 1 della forma wwn, cio tonnate da una stringa
seguita dalla stessa, invertita (per una definizione formale dellinversione di una
stringa cfr. il Paragrafo 4.2.2).
g) Linsieine delle stringhe di 0 e 1 della forma ww, dove w formata da w sostituendo
gli 0 con 1, e viceversa; per esempio O li = 100, quindi 011100 appartiene al
linguaggio.
h) Linsieme delle stringhe della forma -UtI", dove w una stringa di 0 e 1 di lunghezza
n.
!! Esercizio 4.1.3 Dimostrate che i seguenti linguaggi non sono regolari.
a) Linsieme delle stringhe di 0 e 1 che cominciano per 1 e che. interpretate come
numero intero, danno un numero primo.
b) Linsieme delle siringhe della forma O1I j tali che il massimo comun divisore di i e
j 1.
! Esercizio 4.1.4 Quando proviamo ad applicare il pumping lemma a un linguaggio rego
lare vince lavversario, e non siamo in grado di portare a termine la dimostrazione.
.Spiegate dove fallisce la prova per i seguenti linguaggi:
* a) linsieme vuoto
*b ) {00,11}
* c) (00 + 11)"
d) 01* 0 * 1.

Propriet di chiusura dei linguaggi regolari

4.2

139

Propriet di chiusura dei linguaggi regolari

In questo paragrafo dimostreremo diversi teoremi della forma se determinati linguag


gi sono regolari e da essi si forma un linguaggio L per mezzo di certe operazioni (per
esempio L lunione di due linguaggi regolari), allora anche L c regolare. Spesso tali
teoremi sono detti propriet di chiusura perch mostrano che la classe dei linguaggi rego
lari chiusa rispetto alloperazione citata. Lc propriet di chiusura esprimono l'idea che
quando uno o pi linguaggi sono regolari, lo sono anche altri linguaggi correlati. Sono
inoltre un esempio interessante di come le rappresentazioni equivalenti dei linguaggi re
golari (automi ed espressioni regolari) si rinforzino a vicenda nella nostra comprensione
della classe dei linguaggi. Quando si tratta di dimostrare una propriet di chiusura, infatti,
una rappresentazione spesso di gran lunga migliore delle altre. Ecco un riassunto delle
principali propriet di chiusura dei linguaggi regolari:
1. l'unione di due linguaggi regolari regolare
2. lintersezione di due linguaggi regolari regolare
3. il complemento di un linguaggio regolare regolare
4. la differenza di due linguaggi regolari c regolare
5. l'inversione di un linguaggio regolare regolare
6. la chiusura (star) di un linguaggio regolare regolare
7. la concatenazione di linguaggi regolari regolare
8. un omomorfismo (sostituzione di simboli con stringhe) di un linguaggio regolare
regolare
9. lomomorfismo inverso di un linguaggio regolare regolare!

4.2.1

Chiusura dei linguaggi regolari rispetto a operazioni booleane

Lc prime propriet di chiusura riguardano le tre operazioni booleane: unione, intersezione


e complementazione.
1. Siano L ed M linguaggi sullalfabeto . Allora L U Al il linguaggio che contiene
tutte le stringhe che si trovano in L o in M oppure in entrambi.
2. Siano L ed M linguaggi sullalfabeto . Allora L M il linguaggio che contiene
tutte le stringhe che si trovano sia in L sia in M .

140

Capitolo 4

Che cosa succede se i linguaggi hanno alfabeti differenti


Due linguaggi, Li ed L2, di cui facciamo lunione o lintersezione, potrebbero
avere alfabeti differenti. Per esempio possibile che L i C {o. /)}, mentre L2 C
{b, c, d }*. Se per un linguaggio L consiste di stringhe con simboli in , allora L
pu essere pensato come un linguaggio su qualunque alfabeto finito che contenga
. Dunque possiamo considerare, per esempio, i due linguaggi citati sopra, Li ed
L 2, come linguaggi sullalfabeto {a,b,c,d}. Il fatto che nessuna delle stringhe
di Li contenga i simboli c o d irrilevante, come lo il fatto che Ic stringhe di
L 2 non contengano a.
Analogamente, se prendiamo il complemento di un linguaggio L che un
sottoinsieme di ^ per un alfabeto , possiamo scegliere di prendere il com
plemento rispetto a un alfabeto ,2 che contiene . In tal caso il complemento
di L sar 2 - L; in altre parole il complemento di L rispetto a 2 include (tra
le altre stringhe) tutte quelle stringhe in che hanno almeno un simbolo che si
trova in > ma non in . Se avessimo preso il complemento di L rispetto a ,
allora nessuna stringa con simboli in 2 - sarebbe stata presente in L. Quin
di, a rigor di termini, bisognerebbe sempre dichiarare lalfabeto rispetto al quale
si complementa. Spesso comunque risulta chiaro quale alfabeto si intende: per
esempio se L definito da un automa, allora la specifica di questo include lal
fabeto. Si parler quindi frequentemente del complemento senza specificare
lalfabeto.

3. Sia L un linguaggio sull'alfabeto . Allora L, il complemento di L, linsieme


delle stringhe in che non sono in L.
I linguaggi regolari risultano essere chiusi rispetto a tutte e tre le operazioni booleane.
Come si vedr, le dimostrazioni seguono per vie molto diverse.

Chiusura rispetto allunione


Teorema 4.4 Se L ed M sono linguaggi regolari, allora regolare anche L U M.

L ed M sono regolari, essi sono


descritti da espressioni regolari, poniamo L = L(R) e M = L(S). Allora L U M =
L(R + S) per la definizione dell'operatore -I- delle espressioni regolari.

DIMOSTRAZIONE La dimostrazione semplice. Poich

Propriet di chiusura dei linguaggi regolari

141

Chiusura rispetto alle operazioni regolari


Dimostrare che i linguaggi regolari sono chiusi rispetto allunionc stato estre
mamente facile perch l'unione una delle tre operazioni chc definiscono le
espressioni regolari. L'idea del Teorema 4.4 ;>i applica anche alla concatenazione
e alla chiusura:
se L ed M sono linguaggi regolari, anche L M regolare
se L un linguaggio regolare, allora Lx regolare.

Chiusura rispetto alla complementazione


Il teorema per lunione c stato facilitato dalluso delle espressioni regolari per rappre
sentare linguaggi. Consideriamo ora la complementazione. Di primo acchito difficile
immaginare come si possa trasformare unespressione regolare in una che definisce il
linguaggio complemento; eppure possibile perche', come vedremo nel Teorema 4.5,
possiamo facilmente partire da un DFA per costruire un DFA che accetta il complemento.
Partendo da unespressione regolare possiamo quindi trovarne una per il suo complemento
seguendo questa procedura:
1. convertiamo lespressione regolare in un e-NFA
2. convertiamo le-NFA in un DFA per mezzo della costruzione per sottoinsiemi
3. complementiamo gli stati accettanti del DFA
4. ritrasformiamo il DFA per il complemento in unespressione regolare servendoci
della costruzione descritta nei Paragrafi 3.2.1 o 3.2.2.
Teorema 4,5 Se L un linguaggio regolare sullalfabeto , allora anche L = * - L c
regolare.

L = L(A) per un DFA A = (Q, ..0. F). Allora L = L(B),


dove B il DFA (Q. , S. qo. Q F). In altre parole B esattamente come A, ma gli
stati accettanti di A sono diventati stati non accettanti di B , e viceversa. Allora w in
L(B) se e solo se d(qo, w) in Q F. il che succede se c solo se w non in L(A).
DIMOSTRAZIONE Sia

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

stringhe potrebbero non condurre ad alcuno stato di A, n accettante ne non accettante, e le


stringhe verrebbero a mancare sia in L(A) sia in L(B). Fortunatamente, per la definizione
data, un DFA ha in ogni stato una transizione su ciascun simbolo di : ogni stringa
conduce cos a uno stato in F oppure a uno stato in Q F.
Esempio 4.6 Sia A lautoma della Figura 2.14. Ricordiamo che A accetta tutte e sole
le stringhe di 0 e I che finiscono per 01; nei termini delle espressioni regolari, L(A) =
(0 + 1)*01. Il complemento di L(A) perci formato da tutte le stringhe di 0 e 1 che
non finiscono per 01. La Figura 4.2 mostra lautoma per {0 .1}* L(A). Esso uguale
a quello della Figura 2.14, ma con lo stato accettante reso non accettante e i due stati non
accettanti resi accettanti.
1

Figura 4.2 DFA che accetta il complemento del linguaggio

(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

Propriet di chiusura dei linguaggi regolari

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 =

(Q . < d > <//,, F jj)

c A\ = (Qa ; , JjVi Qm , F m ) Osserviamo che il nostro assunto che gli alfabeti di


entrambi gli automi siano uguali; in altre parole, se i due alfabeti sono diversi, c lunione
degli alfabeti di L ed Al. Effettivamente, la costruzione per prodotto funziona tanto per
gli NFA quanto per i DFA, ma per semplificare al massimo il ragionamento assumiamo
che A l e A m siano DFA.
Per L Al costruiremo un automa A che simuli sia A jj sia A m - Oli stati di A
sono coppie di stati, il primo da A l e il secondo da A m - Per stabilire le transizioni di
A, supponiamo che .4 si trovi nello stato (p.q). dove p lo stato di A l e q lo stato
di A m - Se a. il simbolo di input, vediamo come si comporta A l a fronte dellinput a;
poniamo che vada nello stato s. Vediamo anche come si comporta A m a fronte dell'input
a; poniamo che compia una transizione nello stato t. Allora il prossimo stato di .4 sar
(s.t). In questo modo A ha simulato leffetto sia di A l sia di A m - L'idea illustrata
nella Fig. 4.3.
I
dettagli che restano sono semplici. Lo stato iniziale di A la coppia di stati iniziali
di A l e A m - Poich vogliamo chc lautoma accetti se e solo se entrambi gli automi
accettano, selezioniamo come stati accettanti tutte quelle coppie (p.q) tali chc p sia uno

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 )

dove S((p,q).a) = (SL(p,a),dM (q,a)).


Per capire perch L(A) L (A l) L(Am), osserviamo in primo luogo che grazie a
una facile induzione su \
w\si dimostra che

w) = (l ( q l , w ), Sm ( q m ; ) ) .

Ma A accetta w se c solo se S((qr^q\f)<w) una coppia di stati accettanti. Quindi

0l (Ql -w ) devessere in h\ e S\f(q\i,w) devessere in Fm - In altre parole A accetta ir


se e solo se sia Ar, sia A m accettano w. Di conseguenza A accetta lintersezione di L ed
M.
Esempio 4.9 Nella Figura 4.4 sono rappresentati due DFA. Lautoma della Figura 4.4(a)
accetta Uitte le stringhe che hanno uno 0. mentre quello della Fig. 4.4(h) accetta tutte le
stringhe che hanno un 1. Nella Fig. 4.4(c) vediamo il prodotto dei due automi i cui stati
sono etichettali dalla coppia di stati degli automi in (a) e (b).
Si pu fcilmente dimostrare che tale automa accetta lintersezione dei primi due lin
guaggi: le stringhe che hanno sia uno 0 sia un I . Lo statopr rappresenta solo la condizione
iniziale, in cui non sono stati visti n 0 n I . Lo stato qr significa che sono stali visti solo

Propriet di chiusura dei linguaggi regolari

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.

Chiusura rispetto alla differenza


Una terza operazione viene spesso applicata agli insiemi e correlata alle operazioni boo
leane: la differenza. In termini di linguaggio. L M , la differenza di L cd M , linsieme
delle stringhe chc si trovano in L ma non in M. 1 linguaggi regolari sono chiusi anche
rispetto a quest'operazione, e la dimostrazione si desume facilmente dai teoremi appena
visti.

146

Capitolo 4

Teorema 4.10 Se L ed Al sono linguaggi regolari, allora anche L

At regolare.

DIMOSTRAZIONE Osserviamo che L M = L Al. Per il Teorema 4.5 Al c regolare, e

per il Teorema 4.8 L Af regolare. Di conseguenza L Al regolare.

4.2.2

Inversione

L'inversione di una stringa ( <in la stringa scritta al contrario, ossia _ a i .


Con wn denotiamo linversione della stringa w. Perci OOIOh c 0100 e t R = c.
L'inversione di un linguaggio L. denotata da Ln , il linguaggio formato dalle in
versioni di tutte le sue stringhe. Per esempio, se L = {001.10.111}, allora L h =
{ 100. 01. 111}.
Anche l'inversione preserva i linguaggi regolari: se L un linguaggio regolare, lo
anche L hi. Ci sono due semplici dimostrazioni, una basata sugli automi e una sulle
espressioni regolari. Per prima diamo una dimostrazione informale basata sugli auto
mi, lasciando i dettagli al lettore. In seguito dimostreremo il teorema in termini formali
servendoci delle espressioni regolari.
Dato un linguaggio L che sia L(A) per un certo automa a stati finiti .4, eventualmente
non deterministico c con e-transizioni. possiamo costruire un automa per L h seguendo
questa procedura:
1. invertiamo tutti gli archi nel diagramma di transizione di A
2. rendiamo lo stato iniziale di A unico stato accettante per il nuovo automa
3. creiamo un nuovo stato iniziale p con e-transizioni verso tutti gli stati accettanti di
A.
Il risultato un automa che simula .4 al contrario, e accetta dunque una stringa w se e
solo se A accetta w R. Dimostriamo ora il teorema dell'inversione in modo formale.
Teorema 4.11 Se L un linguaggio regolare, lo anche L n .

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.

DIMOSTRAZIONE Assumiamo che L sia definito dallespressione regolare

BASE Se E e, 0 oppure a, per un simbolo a. allora E n uguale a E. In altri termini

sappiamo che {e}/? = {e}, 0R = 0, e {a}n = {a}.


INDUZIONE Esistono tre casi, a seconda della forma di

E.

Propriet di chiusura dei linguaggi regolari

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

{0010 .0110 ,00111 ,01111 }


Se concateniamo le inversioni di L (E 2) e L(Ei ) in questordine, otteniamo

{ 00, 01} { 10, 111} = { 0010, 00111, 0110, 01111}


cio lo stesso linguaggio di (L (E iE 2) ) RIn generale, se una parola w in L(E)
la concatenazione di w da L(Ei ) e W 2 da L (E 2), allora wR = w2 w f .
3. E E\. Allora E n = (E{{)*. La giustificazione c che qualunque stringa w in
L(E ) pu essere scritta come W \ W2 wn. dove ogni w in L(E). Ma

e ogni wf1 in L (E n ), cos wR in L ((E /*)*). Viceversa, qualunque stringa in


L ( ( E f y ) della forma W\W2 -Wn, dove ogni Wi linversione di una stringa
in L (E i ). Linversione di questa stringa, w Rw R_ , wf*, dunque una stringa in
L (E *), che L(E). Abbiamo cos dimostrato che una stringa in L(E) se e solo
se la sua inversione in L ((E y)*).

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

In termini formali, se h un omomorfismo sullalfabeto e w = Ciia2 a,n una


stringa di simboli in , allora k(w) = /()/(2) h(an). Applichiamo cio /?. a ogni
simbolo di w c concateniamo i risultati in successione. Consideriamo lomomorfismo h
del !Esempio 4.13. Se tv = 0011, allora h(w) = h(0)h(0)h(\)h(\) = (nb)(ab)(c)(c) =
abab, come affermato nellesempio.
inoltre possibile applicare un omomorfismo a un linguaggio applicandolo a ognuna
delle stringhe in esso contenute. In altre parole, se L un linguaggio sullalfabeto e h
un omomorfismo su , allora h(L) = {h,(w) |w in L ). Per esempio, se L il linguaggio
dellespressione regolare IO+
T. cio un numero arbitrario di 0 preceduto e seguito da un
1, h(L ) il linguaggio (ab)*. La ragione che Fomomorfismo h dell'Escmpio 4.13
cancella di fatto gli 1, sostituendoli con e, e trasforma ogni O in ab. Lidea di applicare un
omomorfismo direttamente a unespressione regolare pu essere usata per dimostrare che
i linguaggi regolari sono chiusi rispetto a omomorfismi.
Teorema 4.14 Se L un linguaggio regolare sullalfabeto e h un omomorfismo su
, allora anche h(L ) regolare.

L = L(R) per un'espressione regolare R. In generale, se E


unespressione regolare con simboli in , sia Ii(E) l'espressione che si ottiene sostituendo
ogni simbolo a di in E con h(a). Sosteniamo che h(R) definisce il linguaggio h(L).
La dimostrazione una semplice induzione strutturale: se applichiamo h a ogni sot
toespressione E di R , ottenendo h(E), il linguaggio di h(E) lo stesso che si ottiene se
si applica li al linguaggio L(E). In termini formali L (h(E )) = h[L(E)).
DIMOSTRAZIONE Sia

BASE Se jE be oppure 0, allora

h( E) uguale a E, dato che h non ha effetto sulla stringa


e o sul linguaggio 0. Di conseguenza i^(h(E)) = L(E). Se d'altra parte E 0 o e,
allora L(E) o non contiene stringhe o contiene una stringa priva di simboli. Perci si ha
h (L (E )) = L(E) in ambedue i casi. Possiamo concludere chc L(h(E)) L(E) =
h{L(E)).
L'unico altro caso di base possibile si ha se E = a per un simbolo a. in . In questo
caso L(E) = {a}, dunque h (L (E)) = {/?()}. Inoltre h(E) lespressione regolare
formata dalla stringa di simboli h(a). Quindi anche L(h.(E)) {.()}, e concludiamo
che L{h(E)) = h (L (E )).
INDUZIONE Ci sono tre casi, tutti semplici. Prendiamo in esame solo il caso dell'unione,

con E = F + G. Il modo in cui applichiamo gli omomorfismi alle espressioni regolari


garantisce che h(E) = h.(F+G) = h(F)+ h(G). Sappiamo inoltre che L(E) = L(F) U
L(G) e

L(h(E)) = L (h(F) + h(G)) = LQ i(F)) U L(h(G))


per la definizione di + nelle espressioni regolari. Infine

(4.2)

Propriet di chiusura dei linguaggi regolari

h(L{E)) = h(L (F ) U L(G)) = A (L (F )) U h(L(G))

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

Figura 4.5 Un omomorfismo applicato in avanti e all'indietro.


1. Sc w comincia per a, allora h(w) comincia per 01. Ci significa che ha uno 0
isolato c non si trova in L.

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

Propriet di chiusura dei linguaggi regolari

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.

DIMOSTRAZIONE La dimostrazione parte da un DFA

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

dove la funzione di transizione 7 definita dalla regola 7 (7, a) = 6(q,h.(a)). In altre


parole la transizione chc B compie su input a il risultato della sequenza di transizioni

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).

Esempio 4.17 In questesempio useremo lomomorfismo inverso e alcune altre propriet


di chiusura degli insiemi regolari per dimostrare una strana propriet degli automi a stati
finiti. Supponiamo di imporre a un DFA di visitare ogni stato almeno una volta per accet
tare un input. Pi precisamente supponiamo che .4 = ( Q , , <5, i/o, F) sia un DFA e che
siamo interessati al linguaggio L di tutte le stringhe w in * tali che <5(go, w) in F, con la
propriet aggiuntiva che per ogni q in Q esiste un prefisso xq di w tale che (<70, xq) = qL regolare? Possiamo dimostrare che lo , ma la costruzione complessa.
In primo luogo partiamo dal linguaggio M che L(A ), ossia le stringhe che A ac
cetta nella maniera gi descritta, senza considerare quali stati vengono visitati durante
lelaborazione dellinput. Dal momento che la definizione di L pone unulteriore condi
zione sulle stringhe di L(A), osserviamo che L C Al. La dimostrazione che I, regolare
comincia facendo uso di un omomorfismo inverso per inserire gli stati di A nei simbo
li di input. Pi esattamente definiamo un nuovo alfabeto T consistente di simboli che
possiamo pensare come terne [paq], dove:

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

Propriet di chiusura dei linguaggi regolari

153

su input 0. Poich IUi una stringa accettata dallautoma, se vi applichiamo I r 1 avremo


2:5 = 8 stringhe, di cui sono due esempi [plp](pOg][yly] e [</l<7][<70g][plp].
Costruiamo ora L da Li ricorrendo a una serie di ulteriori operazioni che preservano
i linguaggi regolari. Il primo obiettivo eliminare tutte le stringhe di L\che non trattano
correttamente gli stali. Possiamo cio interpretare il simbolo [paq} dicendo che lautoma
si trovava nello stato p, ha letto l'input a ed quindi entrato nello stato q. Per essere con
siderata come una computazione accettante di ,4, la sequenza di simboli deve soddisfare
tre condizioni:
1. il primo stato nel primo simbolo deve essere q

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

Siringhe di A/ con le transizioni di stato incorporate


Intersezione con un linguaggio regolare
Nuova condizione: il primo stato iniziale
Dil lerenza tra linguaggi regolari
Nuova condizione: gli stati adiacenti sono uguali
Differenza tra linguaggi regolari

/ 4

'

Nuova condizione: tutti gli stati compaiono nel cammino


Omomorfismo
Elimina i componenti degli stali. lascia i simboli

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

Propriet di chiusura dei linguaggi regolari

155

parole L = H(Lli). L linsieme delle stringhe in * che sono accettate da .4 e che


visitano ogni stato di A almeno una volta durante la loro accettazione. Poich i linguaggi
regolari sono chiusi per omomorfismo, concludiamo che L regolare.

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
%

d) Se L il linguaggio L(0 + 12), che cos h(L)!


* e) Supponiamo chc L sia il linguaggio {ababa}, ossia il linguaggio formato dalla sola
stringa ababa. Chc cos' h i (L)l
! I) Se L il linguaggio L(a(ba)*), che cos' I r i (L) ?
*! Esercizio 4.2.2 Se L un linguaggio e a un simbolo, allora L j a, il quoziente di L e a,
linsieme delle stringhe w tali che wa in L. Per esempio, se L = {a, aab, bau}, allora
L/a = {e, ba}. Dimostrate che, se L regolare, lo anche L/a. Suggerimento: partite
da un DFA per L e considerate l'insieme di stati accettanti.
! Esercizio 4.2.3 Se L un linguaggio e a un simbolo, allora a\L linsieme delle stringhe
w tali che avo in L. Per esempio, se L = [a. aab, baa}, allora a\L = {e, ab}. Dimostra
te che se L regolare, lo anche a\L. Suggerimento: ricordate che i linguaggi regolari
sono chiusi rispetto all'inversione e alloperazione di quoziente dellEsercizio 4.2.2.
! Esercizio 4.2.4 Quale delle seguenii identit vera?
a) ( L/a)a = L (il membro sinistro rappresenta la concatenazione dei linguaggi L/a
e {}).
b) a(a\L) = L (anche qui si intende la concatenazione con {a}, questa volta a
sinistra).
c) (La)/a = L.
d) a\(aL) = 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-

*! h) Scrivete la regola per la derivata di RS. Suggerimento', bisogna considerare due


casi: se L(R) contiene o no c. Questa regola non esattamente uguale alla regola
del prodotto per le normali derivate, ma simile.
! c) Scrivete la regola per la derivata di una chiusura, ossia

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.

*! f) Caratterizzate i linguaggi L per cui ~ = L.


Esercizio 4.2.6 Mostrate che i linguaggi regolari sono chiusi rispetto alle seguenti opera
zioni.
a) min(L) {; |w in L 1ma nessun prefsso proprio di w in L }.
b)

max(L) = {w w in L e per nessun x diverso da c, wx c in T.} .

c) init(L) = {?/; |per qualche x. wx in L}.

Suggerimento: come nellEsercizio 4.2.2, la strada pi facile partire da un DFA e


compiere una costruzione per ottenere il linguaggio desiderato.
Esercizio 4.2.7 Se w = U1O^ an e x = bb bn sono stringhe della stessa lunghez
za. definite alt(w, x) come la stringa in cui si alternano i simboli di w e x, a partire da tv,
ossia a\b\a>2^2 ' ' *anbn- Se L ed M sono linguaggi, definite alt(L, Al) come linsieme
delle stringhe della forma alt(w,x), dove w u n a stringa qualsiasi in L e x una stringa
qualsiasi della stessa lunghezza in Al. Dimostrate che se L ed At sono regolari lo anche
alt(L. At).
Esercizio 4.2.8 Sia L un linguaggio. Definite hulf(L) come linsieme delle prime met
delle stringhe in L, ossia {?/; per un x tale che |x| = |w|, abbiamo wx in L}. Per
esempio, se L = {e, 0010. O li, 010110}, allora half(L) = {e, 00,010}. Notiamoche
le stringhe di lunghezza dispari non contribuiscono a halj\L). Dimostrate che se L un
linguaggio regolare lo anche IiaIf(L).

Propriet di chiusura dei linguaggi regolari

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

Problemi di decisione per i linguaggi regolari

In questo paragrafo cerchiamo di rispondere ad alcune questioni importanti relative ai


linguaggi regolari. Dobbiamo anzitutto stabilire chc cos una questione inerente a un
linguaggio. Poich di norma un linguaggio infinito, non possiamo porre questioni che ri
chiedano lesame dellinsieme di stringhe che lo compongono. Dobbiamo invece presen
tare il linguaggio per mezzo di una delle rappresentazioni finite che abbiamo sviluppato:
DFA, NFA, r-NFA ed espressioni regolari.
Ovviamente un linguaggio cos descritto regolare: di fatto non c modo di rappre
sentare linguaggi del tutto arbitrari. Nei capitoli successivi studieremo rappresentazioni
finite di linguaggi non regolari e potremo quindi trattare questioni sui linguaggi in classi

Problemi di decisione per i linguaggi regolati

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,

Data Structures and Algorithms, Addi son-Wesley, 1984.

160

Cupitolo 4

Dopo aver calcolato -chiusura, possiamo costruire il DFA equivalente tramite la


costruzione per sottoinsicmi. A priori, il costo dominante dato dal numero di stati del
DFA. che pu essere 2" . Pcrogni stato possiamo calcolare le transizioni in tempo 0 ( n 3)
consultando le informazioni delle-chiusura e la tabella di transizione dellNFA per ogni
simbolo di input. Supponiamo di dover calcolare S({qi,q-2 . ... ,qk}-o) per il DFA. Ci
possono essere fino a n stati raggiungibili da ogni cj* lungo cammini etichettati e, e ogni
stato pu avere fino a n archi etichettati a. Usando un array con gli stati come indici,
calcoliamo lunione di (fino a) n insiemi di (fino a) n stati in un tempo proporzionale a
Tl2.
Possiamo cos calcolare, per ogni qit linsieme degli stati raggiungibili da ql lungo
cammini etichettati a, eventualmente in presenza di e. Poich k < n, dobbiamo trattare al
massimo n stati. Per ciascuno calcoliamo gli stati raggiungibili in tempo 0 ( n 2). Il tempo
totale speso nel calcolo degli stati raggiungibili quindi 0 ( n 3). Lunione degli insiemi
di stati raggiungibili richiede solo un tempo aggiuntivo 0 ( n 2); possiamo concludere che
l'elaborazione di una transizione del DFA richiede un tempo 0(r3).
Si noti che assumiamo costante, cio indipendente da n, il numero di simboli di input.
Per questo motivo, in questa c in altre stime del tempo di esecuzione, non consideriamo
tra i fattori il numero di simboli di input. La dimensione dellalfabeto di input influisce
sul fattore costante nascosto nella notazione 0 grande, ma niente di pi.
Concludiamo che il tempo di esecuzione della conversione da NFA a DFA, incluso il
caso di NFA con e-transizioni, 0 ( n 32n). In pratica il numero di stati generali c di solito
molto minore di 2n, spesso pari a n. Si pu dire chc il tempo di esecuzione C)(n3$),
dove s il numero di stati del DFA.
Conversione da DFA a NFA
Questa conversione semplice e richiede tempo 0 (n ) per un DFA di n stati. Dobbiamo
soltanto modificare la tabella di transizione del DFA ponendo ira parentesi graffe gli stati
e, qualora si costruisca un t-NFA, aggiungendo una colonna per e. Poich assumiamo
costante il numero di simboli di input (cio la larghezza della tabella di transizione), la
copia e l'elaborazione della tabella richiedono un tempo 0(n).
Conversione da automa a espressione regolare
Esaminando la costruzione del Paragrafo 3.2.1, si nota che a ognuno degli n cicli, do
ve n c il numero di stati del DFA, la lunghezza delle espressioni regolari generate pu
quadruplicare. Ciascuna infatti costruita da quattro espressioni del ciclo precedente.
La sola scrittura delle n3 espressioni pu quindi richiedere un tempo 0 ( n 34 ). La va
riante migliorala del Paragrafo 3.2.2 riduce il fattore costante, ma non muta il carattere
esponenziale nel caso peggiore.

Problemi di decisione per i Iingaaggi regolari

161

Anche se non labbiamo dimostrato, la stessa costruzione opera con il medesimo


tempo di esecuzione se l'input un NFA o un c-NFA. E importante usare proprio que
sta costruzione per gli NFA: convertire un NFA in un DFA, c poi convertire questo
V

in espressione regolare, potrebbe richiedere un tempo 0 ( 4 2 ), che doppiamente


esponenziale.
Conversione da espressione regolare ad automa
Convertire un'espressione regolare in un e-NFA richiede tempo lineare. Bisogna leggere
lespressione in modo efficiente, con una tecnica che impieghi un lempo O (n) per un'e
spressione regolare di lunghezza .4 Si ottiene un albero sintattico con un nodo per ogni
simbolo dellespressione (le parentesi hanno il solo scopo di guidare il parser e possono
essere omesse).
Una volta ricavato lalbero dell'espressione, dobbiamo risalirlo costruendo un c-NFA
per ogni nodo. Le regole costruttive per la conversione di un'espressione regolare date
nel Paragrafo 3.2.3 non aggiungono mai pi di due stati e quattro archi per ogni nodo
deNalbero. Perci il numero di stati e di archi dcHc-NFA risultante sono entrambi O(n).
Inoltre il lavoro svolto per ogni nodo dellalbero sintattico nel creare tali clementi co
stante. purch la funzione che elabora ciascun sottoalbero restituisca puntatori allo stato
iniziale e agli stati accettanti del proprio automa.
Possiamo concludere che la costruzione di un c-NFA da unespressione regolare ri
chiede tempo lineare nella lunghezza dellespressione. Possiamo eliminare le ^-transizioni
da un c-NFA di n stati per fame un NFA normale, in tempo 0 ( n 3), senza aumentare il
numero di stati. Latrasformazione in DFA pu comunque richiedere tempo esponenziale.

4.3.2

Verificare se un linguaggio regolare vuoto

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

BASE Lo stato iniziale c sicuramente raggiungibile dallo stato iniziale.


INDUZIONE Se lo stato q raggiungibile dallo stato iniziale e c un arco da q a p
con etichetta arbitraria (un simbolo di input o t se lautoma un c-NFA), anche p
raggiungibile.
In questo modo determiniamo linsieme degli stati raggiungibili. Se fra loro c uno stalo
accettante, la risposta no (il linguaggio dellautoma non vuoto), altrimenti s. Si
noti che il calcolo non richiede tempo supcriore a 0 (n 2) se lautoma ha n stati; di fatto
al massimo proporzionale al numero di archi nel diagramma di transizione dellautoma,
che pu essere inferiore a ri2 e non pu superare 0 (n 2).
Se partiamo da unespressione regolare che rappresenta un linguaggio L, anzich da
un automa, possiamo trasformare lespressione in un f-NFA e continuare come sopra.
Poich l'automa ricavato da unespressione regolare di lunghezza n ha al massimo O(n)
stati e transizioni, lalgoritmo richiede un tempo O(n).
D'altra parte possiamo anche stabilire se il linguaggio vuoto esaminando diretta
mente lespressione regolare. Osserviamo anzitutto che, se nellespressione non compare
0, il linguaggio non pu essere vuoto. Se invece compare, il linguaggio pu esserlo op
pure no. Le regole ricorsive che seguono rivelano se un'espressione regolare denota il
linguaggio vuoto.
BASE 0 denota il linguaggio vuoto; r e a no. per qualsiasi simbolo di input .

R unespressione regolare. Si devono considerare quattro casi, chc corri


spondono ai modi in cui si pu costruire 7?.

INDUZIONE Sia

1. R = Ri + R 2. In questo caso L(R) vuoto se e solo se sia L (R i ) sia L (R 2) sono


vuoti.
2. R = R iR 2. In questo caso L(R) vuoto se e solo se o L(R\) o L(R2) vuoto.
3. R. = R^. In questo caso L(R) non vuoto: contiene sempre almeno e.
4. R = (7?i ). In questo caso L(R) vuoto se e solo se L (R i ) vuoto, dato che sono
lo stesso linguaggio.

4.3.3

Appartenenza a un linguaggio regolare

La prossima questione rilevante se. dati una stringa tv e un linguaggio regolare L, w


appartenga a L. Mentre w data esplicitamente, L rappresentato da un automa o da
unespressione regolare.
Se L rappresentato da un DFA. l'algoritmo semplice: si simula lelaborazione
della stringa w da parte del DhA a partire dallo stato iniziale; se il DFA finisce in uno
stato accettante, la risposta s, altrimenti no'. Questo algoritmo molto veloce.

Problemi di decisione per i linguaggi regolari

163

Se Itu I = n e il DFA rappresentato da una struttura dati appropriata, come un array


bidimensionale corrispondente alla tabella di transizione, ogni transizione richiede tempo
costante, e il tempo totale Q (n).
Se la rappresentazione di L e di altro tipo, possiamo convertirla in un DFA e procedere
come sopra. Questa soluzione pu richiedere tempo esponenziale nella dimensione della
rappresentazione, pur essendo lineare in ,
Se per la rappresentazione un NFA o
un e-NFA, pi semplice ed efficiente simularlo direttamente, cio elaborare i simboli
di w, uno per volta, tenendo traccia dellinsieme degli stati in cui pu trovarsi lNFA
seguendo ogni cammino etichettato da un certo prefisso di w. V idea stata presentata
nella Figura 2.10.
Se w lunga n e lNFA ha s stati, il tempo di esecuzione dell'algoritmo 0(ns'2).
Ogni simbolo di input viene elaborato esaminando i successori di ogni elemento dellin
sieme precedente di stati, che sono al massimo s. Si deve fare lunione di non pi di s
insiemi, ciascuno contenente al massimo .s stati, il che richiede tempo O (a2).
Se lNFA comprende ^-transizioni, prima di avviare la simulazione dobbiamo calco
lare le-chiusura. Quindi lelaborazione di ogni simbolo a di input comprende due fasi,
ognuna delle quali richiede tempo 0(.<r). Prima di tutto troviamo i successori, rispetto
al simbolo di input a, degli stati nellinsieme precedente. Poi calcoliamo le-chiusura del
nuovo insieme. L'insieme da cui avviare la simulazione l'e-chiusura dello stato iniziale
del lNFA.
Infine, se L rappresentato da un'espressione regolare di dimensione .<?, possiamo
convertirla in un c-NFA di non pi di 2$ stati in tempo O(s). Si compie poi la simulazione
come sopra in tempo 0 (n s 2) su un input w di lunghezza n.

4.3.4

Esercizi

* Esercizio 4.3.1 Ideate un algoritmo che decida se un linguaggio regolare L infinito.


Suggerimento: per mezzo del pumping Iemnui mostrate che se il linguaggio contiene una
stringa di lunghezza maggiore di una certa costante allora deve essere infinito.
Esercizio 4.3.2 Ideate un algoritmo che decida se un linguaggio regolare L contiene
almeno cento stringhe.
Esercizio 4.3.3 Sia L un linguaggio regolare sull'alfabeto . Ideate un algoritmo che
decida sc L = *, cio se contiene tutte le stringhe su quellalfabeto.

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

Equivalenza e minimizzazione di automi

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

Verifica delPequivalenza di stati

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

E quindi impossibile distinguere due stati equivalenti p e q partendo da uno di loro e


osservando se una data stringa di input porta a uno stato accettante. Si noti chc non si
richiede che '(p. tv) e (q. w) siano lo stesso stato, ma solo che siano entrambi accettanti
o non accettanti.
Sc due stati non sono equivalenti, diciamo che sono distinguibili. In altre parole lo
stato p distinguibile da q se esiste almeno una stringa w tale che uno fra (p. w) e S(q, w)
accettante e l'altro no.

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.

Equivalenza e minimizzazione di automi

165

Figura 4.8 Un automa con stati equivalenti.

Consideriamo invece A ed E: non sono accettanti, quindi e: non li distingue. A fronte di


input 1 entrambi vanno in F. Nessuna stringa che cominci per 1 pu quindi distinguerli
perch, per ogni stringa x, ( A Lr) = 6(E , la).
Esaminiamo ora il comportamento di .4 e di E su input che cominciano per 0: A va
in B , E in TI. Nessuno dei due nuovi stati accettante, perci la stringa 0 da sola non
distingue A da E. Anche B c H non sono daiuto: su input 1 entrambi vanno in C e
su input 0 entrambi vanno in G. Quindi nessun input che cominci per 0 pu distinguerli.
Concludiamo che nessuna stringa di input distingue A da E: i due stati sono equivalenti.

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.

Figura 4.9 Tabella di non equivalenza fra stali.

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.

Equivalenza c minimizzazione di automi

167

Teorema 4.20 Se due stati non sono distinti dallalgoritmo riempi-tabella, allora sono
equivalenti.
DIMOSTRAZIONE Fissiamo di nuovo un DFA A =

(Ct). ,, f/o- F).

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.

Una coppia di stati di questo tipo sar denominata cattiva.


Se ci sono coppie cattive, cc n' una distinta dalla stringa pi corta fra tulle quelle che
distinguono coppie cattive. Sia {p, q} una tale coppia e sia w aia -2 una stringa di
lunghezza minima fra quelle che distinguono p da q. Allora uno solo fra S(p, w) e (q, w)
accettante.
Innanzitutto osserviamo chc w non pu essere r perch, se e distingue una coppia di
stati, quella coppia marcata nella base delFalgoritmo riempi-tabella. Perci n > 1.
Consideriamo gli stati r = <5(p,ai) e s = 6(q, ) ; r ed s sono distinti dalla stringa
2 ; perch questa stringa li porta rispettivamente in (p,w) e S(q,w). Ma la
stringa chc distingue r da $ pi corta di ogni stringa chc distingue una coppia cattiva;
quindi {r, .s} non pu essere una coppia cattiva: lalgoritmo riempi-tabella deve avere
scoperto che sono distinguibili.
Ma poich scopre che (, ) = r distinguibile da S(q,a.\) = s, la parte indutti
va delFalgoritmo non si arresta prima di aver dedotto che anche p e q sono distinguibili.
Abbiamo cos contraddetto lipotesi che esistano coppie cattive; ma se non ci sono cop
pie cattive, ogni coppia di stati distinguibili distinta dallalgoritmo, come volevamo
dimostrare.

4.4.2

Equivalenza di linguaggi regolari

Lalgoritmo riempi-tabella fornisce un modo semplice per stabilire se due linguaggi re


golari coincidono. Siano L ed M due linguaggi rappresentati, per esempio, uno da une
spressione regolare e l'altro da un NFA. Convertiamo le due rappresentazioni in DFA.
Ora consideriamo un DFA i cui stati siano l'unione degli stati dei DFA di L e di M . Que
sto DFA avrebbe tecnicamente due stati iniziali, ma per quanto concerne la verifica di
equivalenza lo stato iniziale irrilevante. Possiamo quindi sceglierne uno arbitrario.
A questo punto verifichiamo se gli stati iniziali dei due DFA originali sono equivalenti
usando lalgoritmo riempi-tabella. Se sono equivalenti, L = M . altrimenti L Al.
Esempio 4.21 Analizziamo i due DFA della Figura 4.10. Entrambi accettano la stringa
vuota e tutte le stringhe che terminano per 0, cio il linguaggio dell'espressione regolare

168

Capitolo 4
O

Figura 4.10 Due DFA equivalenti.

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,

Equivalenza e minimizzazione di automi


B

169

Figura 4.11 Tabella di distinguibilit per la Figura 4.10.

l'algoritmo termina. Quindi non ci possono essere pi di 0 (n 2) iterazioni, e 0 (n 4)


senzaltro un limite superiore per il tempo di esecuzione dellalgoritmo.
Esiste tuttavia un algoritmo migliore, che riempie la tabella in tempo 0 ( n 2). Lidea
di predisporre, per ogni coppia di stati {r. .s}, un elenco delle coppie {/>, q) che dipen
dono da {/. s}, tali cio che. se {/, s} distinguibile, lo anche {/>. q}. Inizialmente gli
elenchi si creano esaminando ogni coppia di stati {p. q) e ponendola, per ogni simbolo u,
nellelenco associato alla coppia {S(p, a), 6{q, u)}, cio i successori di p e q rispetto ad u.
Se si stabilisce che {r. .s} distinguibile, si percorre lelenco a essa associato e si
dichiara distinguibile ogni coppia dell'elenco che non lo era ancora; tali coppie vengono
aggiunte a una coda di coppie per le quali si deve esaminare lelenco nello stesso modo.
Il
lavoro complessivo svolto dallalgoritmo proporzionale alla somma delle lunghez
ze degli elenchi perch a ogni passo o si aggiunge qualcosa a un elenco (fase di prepa
razione) o si esamina, per la prima c ultima volta, un elemento dellelenco (scansione
dellclcnco di una coppia dichiarata distinguibile). Poich si assume costante la dimen
sione dellalfabeto di input, ogni coppia sta in O (I) elenchi. Dato che ci sono 0 ( n 2)
coppie, il lavoro totale 0 ( n 2).

4.4.3

Minimizzazione di DFA

La soluzione al problema dellequivalenza di stati ha un'altra conseguenza importante:


possibile minimizzare un DFA, cio trovare un DFA equivalente con il numero minimo
di stati fra i DFA che accettano lo stesso linguaggio. Inoltre il DFA minimo rispetto agli
stati unico, a meno di rinominare gli stati. Vediamo l'algoritmo.
1. Per prima cosa si eliminano gli stati irraggiungibili dallo stato iniziale.
2. Gli stati rimanenti vengono poi ripartiti in blocchi in modo che gli stati in uno
stesso blocco siano tutti equivalenti e due stali in blocchi diversi non lo siano mai.
Il Teorema 4.24 mostra che possiamo sempre eseguire questa partizione.

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.

Possiamo usare il Teorema 4.23 a sostegno dellovvio algoritmo di partizionamento


degli stati: per ogni stato q costruiamo un blocco formato da q c da tutti gli stati a esso
equivalenti. Dobbiamo dimostrare che i blocchi cos formati sono una partizione, cio
che nessuno stato si trova in due blocchi distinii.
Osserviamo per prima cosa che tutti gli stati in un blocco sono fra loro equivalenti. In
altre parole, se p ed r si trovano nel blocco degli stati equivalenti a q. per il Teorema 4.23
p ed r sono fra loro equivalenti.
Supponiamo che ci siano due blocchi con unintersezione non nulla, ma non identici;
sia allora B un blocco contenente gli stati p e </, c sia C un altro blocco contenente p ma
non q. Poich p t q si trovano in uno stesso blocco, sono equivalenti. Vediamo come
stato formato il blocco C. Se fosse il blocco generalo da p, anche q. essendo equivalente
a p, sarebbe in C . Deve quindi esistere un terzo stalo s chc ha generato C, ovvero C
formalo dagli stati equivalenti a s.
Sappiamo che p, essendo nel blocco C, equivalente a ,s; sappiamo anche che p equi
valente a q perch entrambi appartengono al blocco B. Per transitivit (Teorema 4.23) q

Equivalenza e minimizzazione di automi

171

equivalente a s. Ma allora q appartiene a C, e quindi si ha una contraddizione. Concludia


mo chc lequivalenza fra stali c una partizione degli stessi: o due stati hanno il medesimo
insieme di stati equivalenti (compresi essi stessi) o i loro insiemi di stati equivalenti sono
disgiunti. Possiamo tirare le somme dell'analisi condotta fin qui.
Teorema 4.24 Se per ogni stato q di un DFA si crea un blocco formato da q e da lutti
gli stati equivalenti a q, allora linsieme dei blocchi distinti costituisce una punizione
dellinsieme degli stati.5 Quindi ogni stato appartiene a un solo blocco. Tutti gli elementi
di un blocco sono equivalenti, mentre due stati scelti da blocchi diversi non lo sono.
Possiamo ora riassumere Falgoritmo che minimizza un DFA A = (Q, , , q0, F).
1. Con l'algoritmo riempi-tabella determiniamo le coppie di stati equivalenti.
2. Con il metodo sopra descritto partizioniamo linsieme Q degli stati in blocchi di
stati a due a due equivalenti.
3. Costruiamo il DFA minimo equivalente B , prendendo i blocchi come stati. Sia 7
la funzione di transizione di B. Sia S un insieme di stati equivalenti di A, e a un
simbolo di input. Deve esistere allora un blocco T tale che, per ogni stato q in S,
(q, a) un elemento di T. In caso contrario il simbolo a porterebbe due stati di S,
p e q, in blocchi diversi e. per il Teorema 4.24, quegli stati sarebbero distinguibili.
Concludiamo perci che p e q non sono equivalenti c non appartengono entrambi a
S. Di conseguenza possiamo porre 7 (S,a) = T. Inoltre vale quanto segue.
(a) Lo stato iniziale di B il blocco contenente lo stato iniziale di A.
(b) Linsieme degli stati accettanti di B linsieme dei blocchi chc contengono
stati accettanti di .4. Notiamo che, se uno stato accettante, tutti gli stati nel
suo blocco devono essere accettanti. Infatti uno stato accettante distinguibile
da ogni stato non accettante: quindi un blocco di stati equivalenti non pu
contenere stati accettanti e stati non accettanti.

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

Figura 4.12 DFA minimo equivalente alla Figura 4.8.

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

Perch il DFA minimo non pu essere migliorato

Supponiamo di minimizzare un DFA ,4 con il metodo di partizionamento del Teore


ma 4.24, e di ottenere un DFA M. Il teorema dimostra che non possiamo raggruppare
gli stati di .4 in un numero pi piccolo di blocchi mantenendo lequivalenza dei DFA. Pu
esistere un altro DFA N , senza alcuna relazione con A, che accetta Io stesso linguaggio
di .4 e di M 3ma con meno stati di M ? Dimostreremo per assurdo chc N non esiste.
Cominciamo eseguendo la procedura per la distinguibilit descritta nel Paragrafo 4.4.1
sugli stati di M ed N congiuntamente, come se si trattasse di un solo DFA. Possiamo

Equivalenza e minimizzazione di automi

173

Minimizzare gli stati di un DFA


Si potrebbe pensare che la tecnica di partizione degli stati chc minimizza gli sta
ti di un DFA si applichi anche alla ricerca di un NFA minimo equivalente a un
DFA o a un NFA assegnato. Invece, anche se possibile trovare, per enumera
zione completa, un NFA con numero minimo di stati chc riconosce un linguaggio
regolare dato, non sufficiente ripartire gli stati di un NFA per quel linguaggio.
Ne abbiamo un esempio nella Figura 4.13. Non ci sono coppie di stati equi
valenti; lo stato B senzaltro distinguibile dagli stati non accettanti .4 e C ; A e
C sono distinguibili dall'input 0; A lunico successore di C e non accettante,
mentre linsieme dei successori di A c {/I. B}. che contiene uno stato accettante.
Perci non si pu ridurre il numero di stali raggruppando quelli equivalenti.
Eppure si pu trovare un NFA pi piccolo per lo stesso linguaggio eliminan
do lo stato C . A e B da soli accettano infatti tutte Ic stringhe che terminano per
0, c laggiunta di C non permette di acccttarc altre stringhe.

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

Figura 4.14 Un DFA da minimizzare.

Riepilogo

4.4.5

175

Esercizi

Esercizio 4.4.1 La Figura 4.14 riporta la tabella di transizione di un DFA.


a) Tracciate la tabella di distinguibilit dellautoma.
b) Costruite il DFA minimo equivalente.
Esercizio 4.4.2 Svolgete !Esercizio 4.4.1 per il Dl-A della Figura 4.15.

Figura 4.15 Un altro DFA da minimizzare.


Esercizio 4.4.3 Siano p e q due stati distinguibili di un DFA A con n stati. Qual il
pi stretto limite superiore, in funzione di ri, della lunghezza della stringa pi corta che
distingue p da q?

4.5

Riepilogo

Il pumping lemma: se un linguaggio regolare, allora ogni stringa sufficientemente


lunga nel linguaggio ha una sottostringa non vuota che pu essere replicata, ossia
ripetuta per un qualunque numero di volte senza che le stringhe risultanti escano
dal linguaggio. Si pu dunque usare il pumping lemma per dimostrare che diversi
linguaggi non sono regolari.
Operazioni che preservano la regolarit: molte operazioni, applicate ai linguaggi
regolari, producono come risultato un linguaggio regolare. Tra queste ci sono l'u
nione, la concatenazione, la chiusura, l'intersezione, la complcmentazione, la dif
ferenza, linversione, lomomorfismo (sostituzione di ogni simbolo con una stringa
associata) e !omomorfismo inverso.

176

Capitolo 4

Verificare se un linguaggio regolare vuoto: esiste un algoritmo che, data la rap


presentazione di un linguaggio regolare, come un automa oppure unespressione
regolare, decide se il linguaggio rappresentato e linsieme vuoto oppure no.
Verificare l'appartenenza a un linguaggio regolare: esiste un algoritmo che, data
una stringa e la rappresentazione di un linguaggio regolare, decide se la stringa
appartiene o no al linguaggio.
Distinguibilit di stati: due stati di un DFA sono distinguibili se esiste una stringa di
input che porta solo uno dei due in uno stato accettante. Partendo soltanto dal fatto
che le coppic formate da uno stato accettante e uno non accettante sono distingui
bili, e aggiungendo come nuove coppic quelle i cui successori su un certo simbolo
di input sono distinguibili, possiamo scoprire tulle le coppie di stali distinguibili.
4- Minimizzazione di automi a stati finiti deterministici', si possono ripartire gli stati
di un DFA in blocchi di stati a due a due indistinguibili. I membri di due blocchi
diversi sono sempre distinguibili. Se sostituiamo ogni blocco con un singolo stato,
otteniamo un DFA equivalente, con un numero di stati non superiore a quello di
ogni altro DFA per lo stesso linguaggio.

4.6

Bibliografia

A parte le ovvie propriet di chiusura delle espressioni regolari (unione, concatenazione


e star) dimostrate da Kleene [6], quasi tutti i risultati relativi alle propriet di chiusura dei
linguaggi regolari sono adattamenti di risultati simili per i linguaggi liberi dal contesto
(classe chc tratteremo nei prossimi capitoli). In particolare il pumping lemma per i lin
guaggi regolari la semplificazione di un risultato corrispondente per i linguaggi liberi dal
contesto, dimostrato da Bar-Hillel. Perles e Shamir fi I. Lo stesso articolo fornisce indiret
tamente diverse altre propriet di chiusura presentate qui. La chiusura per omomorfismo
inverso si deve invece a [2].
L'operazione di quoziente presentata nellEsercizio 4.2.2 risale a [31. Di fatto in quel
lavoro si tratta di unoperazione pi generale, in cui un simbolo a pu essere sostituito da
un linguaggio regolare. La serie di operazioni del tipo eliminazione parziale, a partire
dallEsercizio 4.2.8 sulle prime met delle stringhe di un linguaggio regolare, proviene da
[8], Seiferas e McNaughton [9] hanno stabilito nel caso generale quando unoperazione
di eliminazione preserva i linguaggi regolari.
Gli algoritmi originali di decisione per i problemi del linguaggio vuoto, della finitezza
e dellappartenenza per i linguaggi regolari sono tratti da |7J. Quelli per minimizzare gli
stati di un DFA compaiono nello stesso lavoro e in [5]. Lalgoritmo pi efficiente per
trovare il DFA minimo si trova in [4].

Bibliografa

177

1. Y. Bar-I IilleL M. Perles, K. Shamir, "On formal properties of simple phrase-structure


grammars, Z. Phonetik. Sprachwiss. Kommunikationsforsch. 14(1961), pp. 143
172.
2. S. Ginsburg, G. Rose, Operations which preserve definability in languages, .I.
ACM 10:2 ( 1963), pp. 175-195.
3. S. Ginsburg, E. H. Spanier. Quotients of context-free languages, .I. ACM 10:4
(1963), pp. 487-492.
4. J. E. Hopcroft, An n log n algorithm for minimizing the states in a finite automa
ton, in Z. Kohavi (ed. ) The Theory of Machines and Computations, Academic
Press, New York, pp. 189-196.
5. D. A. Huffman, The synthesis of sequential switching circuits J. Franklin Inst.
257:3-4 (1954), pp. 161-190 e 275-303.
6. S. C. KIecne, Representation of events in nerve nets and finite automata, in C. E.
Shannon, J. McCarthy, Automata Studies, Princeton Univ. Press, 1956, pp. 3-42.
7. E. F. Moore, Gedanken experiments on sequential machines, in C. E. Shannon, J.
McCarthy, Automata Studies, Princeton Univ. Press, 1956. pp. 129-153.
8. R. E. Stearns, J. Hartmanis, Regularity-preserving modifications of regular expres
sions, Infonnaiion and Control 6:1 ( 1963), pp. 55-69.
9. J. I. Seiferas, R. MeNaughton, Regularity-preserving modifications Theoretical
Computer Science 2:2 (1976), pp. 147-154.

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

Grammatiche libere dal contesto

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

Consideriamo il linguaggio delle palindrome. Una stringa palindroma se si pu leggere


indifferentemente da sinistra a destra e da destra a sinistra, come per esempio o t t o o
madamimadam ("Madam. I m Adam, la prima frase che si suppone Eva abbia udito nel
Giardino dellEden). In altri termini una stringa w palindroma se e solo se w w R. Per
semplificare le cose descriveremo solo le stringhe palindrome sullalfabeto {0.1}; questo
linguaggio comprende stringhe come 0110, 11011 e e, ma non 011 o 0101.
E facile verificare che il linguaggio Lpa) delle palindrome di 0 e 1 non un linguaggio
regolare. Per far,lo ci serviamo del pumping lemma. Se Lpai regolare, sia n la costante
associata, e consideriamo la stringa palindroma w = On IOn. Per il lemma possiamo
scomporre w in ir = xyz, in modo tale che y consista di uno o pi 0 dal primo gruppo.
Di conseguenza xz, che dovrebbe trovarsi in Lpai se Lpn] fosse regolare, avrebbe meno
0 a sinistra dellunico 1 rispetto a quelli a destra. Dunque xz non pu essere palindroma.
Abbiamo cos confutato lipotesi che Lpa sia un linguaggio regolare.
Per stabilire in quali casi una stringa di 0 c 1 si trova in Lpai , possiamo avvalerci
di una semplice definizione ricorsiva. La base della definizione stabilisce che alcune
stringhe semplici si trovano in Lpai\si sfrutta poi il fatto che se una stringa palindroma
deve cominciare e finire con lo stesso simbolo. Inoltre, quando il primo e lultimo simbolo
vengono rimossi, la stringa risultante devessere palindroma.
V

BASE e, 0 e 1 sono palindrome.


i n d u z i o n e Se ir palindroma. Io sono anche OuO e lw;l. Nessuna stringa di 0 e 1

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.

Grammatiche libere dal contesto

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

Definizione delle grammatiche libere dal contesto

La descrizione grammaticale di un linguaggio consiste di quattro componenti importanti.


1. Un insieme finito di simboli che formano le stringhe del linguaggio da definire.
Nellesempio delle palindrome linsieme {0.1}. Chiameremo quest'alfabeto i
terminali o simboli terminali.
2. Un insieme finito di variabili, talvolta dette anche non terminali oppure categorie
sintattiche. Ogni variabile rappresenta un linguaggio, ossia un insieme di stringhe.
Nell'esempio precedente c una sola variabile, P, usata per rappresentare la classe
delle stringhe palindrome sull'alfabeto (0.1}.
3. Una variabile, detta simbolo iniziale, che rappresenta il linguaggio da definire. Le
altre variabili rappresentano classi ausiliarie di stringhe, che contribuiscono a de
finire il linguaggio del simbolo iniziale. Nellesempio, P, l'unica variabile, il
simbolo iniziale.
4. Un insieme finito di produzioni, o regole, che rappresentano la definizione ricorsiva
di un linguaggio. Ogni produzione consiste di tre parti.
(a) Una variabile che viene definita (parzialmente) dalla produzione ed spesso
detta la testa della produzione.

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

Gpai = ({P},{0,\ },A ,P)


dove A rappresenta linsieme delle cinque produzioni nella Figura 5.1.
Esempio 5.3 Esaminiamo una CFG pi complessa, che rappresenta, semplificandole, le
espressioni in un tipico linguaggio di programmazione. Dapprima ci limitiamo agli ope
ratori + e *, corrispondenti a somma e moltiplicazione. Ammettiamo che gli operandi
siano identificatori, ma al posto dellinsieme completo di identificatori tipici (una lette
ra seguita da zero o pi lettere c cifre) accettiamo solo le lettere a e b e le cifre O e l .
Ogni identificatore deve iniziare per n o be pu continuare con una qualunque stringa in
{a. b. 0, I }*.
In questa grammatica sono necessarie due variabili. La prima, che chiameremo E,
rappresenta le espressioni. E il simbolo iniziale e rappresenta il linguaggio delle espres
sioni chc stiamo definendo. Laltra variabile. L rappresenta gli identificatori. Il suo
linguaggio regolare; il linguaggio dellespressione regolare
V

(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

Grammatiche libere dal contesto


1.
2.
3.
4.

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

Derivazioni per mezzo di una grammatica

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

Notazione compatta per le produzioni


opportuno pensare a una produzione come appartenente alla variabile della
sua testa. Useremo spesso termini come le produzioni per .4 oppure le ziproduzioni per riferirci alle produzioni la cui testa la variabile .4. Possiamo
scrivere le produzioni di una gram m atica elencando ogni variabile una volta, e
facendola seguire dai corpi delle sue produzioni, separati da barre verticali. In
altre parole le produzioni A * . A * 2 , . . . . > possono essere
sostituite dalla notazione A > |2| |. Per esempio la grammatica per le
palindrome della Figura 5.1 pu essere scritta come P e j 0 |I |OiO 11P1.

Cominceremo da un esempio di inferenza ricorsiva. Poich spesso pi naturale con


siderare una grammatica secondo lo schema della derivazione, come passo successivo
svilupperemo la notazione per descrivere le derivazioni.
Esempio 5.4 Consideriamo alcune inferenze possibili nella grammatica per le espressioni
della Figura 5.2. La Figura 5.3 riassume queste inferenze. Per esempio la riga (?) dice che
possiamo dedurre che la stringa a nel linguaggio per I usando la produzione 5. Le righe
dalla (H) alla (iv) affermano che possiamo dedurre che 600 un identificatore usando
una volta la produzione 6 (per ottenere la 6) e poi applicando due volte la produzione 9
(per accodare i due 0).

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)

Figura 5.3 Inferenza di stringhe dalla grammatica della Figura 5.2.


Ogni identificatore unespressione; le righe (v) e (vi) sfruttano quindi la produzione 1
per dedurre chc anche le stringhe a e 600, che risultano essere identificatori per inferenza

Grammadche Ubere dal contesto

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

a di terminali e variabili, a =?- a. In altri termini: qualunque


G

stringa deriva se stessa.


i n d u z i o n e Se

et =? 3 e => y, allora a =$ 7. Ossia, se a pu diventare in zero o


G

pi passi, e un passo ulteriore trasforma in 7, allora a pu diventare 7. Detto in altri


termini, => significa che esiste una sequenza di stringhe 7 1 , 72 >7 con n > 1,
tale che

Cr

1. et = 7i
2. = In
3. per i = 1 ,2 ,. . . . n 1. abbiamo 7 => 7 +i .
Se

Sc la grammatica G chiara dal contesto, allora scriviamo => anzich = .


Esempio 5.5 L'inferenza che a * (a + 600) appartiene al linguaggio della variabile E si
riflette in una derivazione della stringa, a partire dalla stringa E. Eccone un esempio.

E => E * E => I * E => a * E =


a * (E) => a * (E + E) => a * (I + E) => a * (a -l E ) =$>
a * (a + I) => a * (a 4- ) = a * (a + 00)

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

Derivazioni a sinistra e a destra

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

a * (E) =r a * (E + E) = a * (I + E) => a * (a + E) =>


im

Im

a * (a + I) => a * (a
Im

-t- IO)

Im

Im

Im

a * (a + /00) => a * (a + 600)


Im

Grammatiche libere dal contesto

187

Notazione per le derivazioni delle CFG


Per aiutarci a ricordare il ruolo dei simboli usati nel trattare le CFG, si usano
comunemente alcune convenzioni, che elenchiamo.
1. Le lettere minuscole in prossimit dell'inizio de IFalfabeto, a, b, e cos via,
sono simboli terminali. Assumiamo inoltre che cifre o altri caratteri, come
+ o le parentesi, sono terminali.
2. Le lettere maiuscole in prossimit dellinizio dellalfabeto, A, B. e cos
via, sono variabili.
3. Lc lettere minuscole in prossimit della fine dellalfabeto, come w o z,
sono stringhe di terminali. Questa convenzione ci ricorda che i terminali
sono analoghi ai simboli di input di un automa.
4. Le lettere maiuscole in prossimit della fine dellalfabeto, come X o Y,
sono terminali oppure variabili.
5. Le lettere minuscole greche, come a e 3, sono stringhe che consistono di
terminali e variabili.
Dato che non si tratta di un fattore importante, non esiste alcuna notazione speci
fica per le stringhe che consistono solo di variabili. Pu accadere che una stringa
denominata , o con unaltra lettera greca, contenga solo variabili.

Possiamo inoltre riassumere la derivazione a sinistra scrivendo E => *(+600), oppure


Irti
esprimerne alcuni passi tramite espressioni come E * E => a * (E).
Irn

Esiste una derivazione a destra che applica le stesse sostituzioni per ogni variabile,
sebbene in ordine diverso. Eccola.

E => E * E = > E * (E) = E * ( + )= >


rrn

rrn.

rrn

rrn

E * {E + T) => E * (E 4- IO) => E * (E + /00) => E * (E + 600) =>


rrn

rrn

rrn

E * (I + b00) => E * (a + 600) = T* (a + 600) => a * (a + 600)


rm

rrn

Questa derivazione permette di concludere E

rrn

rrn

a * (a + 0U).

rrn

188

Capitolo 5

Qualunque derivazione ha una derivazione a sinistra e una a destra equivalenti. In


altre parole, se w una stringa terminale e A una variabile, allora A
w se e solo se
A => w, e ,4 => w se e solo se A => w. Dimostreremo anche queste affermazioni nel
Im

Paragrafo 5.2.

5.1.5

rm

II linguaggio di una grammatica

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}

Se un linguaggio L e il linguaggio di una grammatica libera dal contesto, allora L detto


linguaggio libero dal contesto, o CFL (Context-Free Language). Per esempio abbiamo
affermato che la grammatica della Figura 5.1 definisce il linguaggio delle palindrome
sullalfabeto {(), 1}. Di conseguenza linsieme delle palindrome un linguaggio libero
dal contesto. Dimostriamo lenunciato.
Teorema 5.7 L (G paI), dove G pat la grammatica dellEsempio 5.1. linsieme delle
palindrome su {(), 1}.
DIMOSTRAZIONE Dimostreremo che una stringa w in {0,1}* in L (G pai) se e solo se
palindroma, ossia ir irR.
(Se) Supponiamo che w sia palindroma. Mostriamo per induzione su !u>| che w in
L(G pni).
BASE Usiamo le lunghezze 0 e I come base. Se |u;| = Oo \
u>\= I, allora w e, 0, 1.
Dato che esistono le produzioni P
P > 0 e P * I, concludiamo chc P =$ u; in
lutti i casi di base.
INDUZIONE Supponiamo che |u?| > 2. Poich w = wR, w deve iniziare c finire con lo
stesso simbolo. In altri termini w = OxO oppure ir = Ix L Oltre a ci x deve essere
palindroma, ossia x = xK. Si noti che abbiamo bisogno che !u.| > 2 per concludere che
esistono due simboli distinti agli estremi di w.
Se w = OxO invochiamo lipotesi induttiva per sostenere che P => x. Allora esiste
una derivazione di ; da P, cio P
0P0
0x0 = w. Se w = Ix l il ragionamento
c lo stesso, ma usiamo la produzione P I P l al primo passo. In entrambi i casi
concludiamo che w in L(G va). La dimostrazione completa.

(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.

Grammatiche libere dal contesto

189

BASE Sc la derivazione un solo passo, allora dobbiamo usare una delle tre produzioni

che non abbiano P nel loro corpo. In altre parole la derivazione P = e, P =$ Oo


P
1. Dato che r, O e 1 sono tutti palindromi, la base dimostrata.

n + 1 passi, dove n > 1, c l'e


nunciato sia vero per tutte le derivazioni di n passi. Ossia, se P => x in passi, allora x
un palindromo.
Consideriamo una derivazione di (ri + 1) passi, chc deve essere della forma
INDUZIONE Supponiamo ora che la derivazione compia

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 => E * E' => E * (E) => E * (E + E)

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

mostra che E * (E + E ) una forma sentenziale destra.

Capitolo 5

190

La forma delle dimostrazioni sulle grammatiche


11 Teorema 5.7 un tipico caso di dimostrazione che una grammatica definisce
un particolare linguaggio, descritto informalmente. Si parte da unipotesi indut
tiva chc enuncia le propriet di cui sono dotate le stringhe derivate da ciascuna
variabile. NeHescmpio in questione c una sola variabile, P. Dunque abbiamo
dovuto soltanto affermare che le sue stringhe sono palindrome.
Si dimostra la parte se: se una stringa w soddisfa lenunciato informale
sulle stringhe di una delle variabili A, allora A => w. Nellesempio, dato che P
il simbolo iniziale, abbiamo dichiarato P => w'\ dicendo che w appartiene
al linguaggio della grammatica. Di solito la parte se si dimostra per induzione
sulla lunghezza di w. Se ci sono k variabili lenunciato induttivo da dimostrare
ha k parti, che devono essere dimostrate per induzione mutua.
%
Si deve inoltre dimostrare la parte "solo-se: se A => w, allora w soddisfa
l'enunciato informale sulle stringhe derivate dalla variabile A. Nellesempio,
dovendo trattare solo il simbolo iniziale P, abbiamo supposto che u- fosse nel
linguaggio di Gpa come equivalente di P = w. La dimostrazione di questa
parte si compie di solito per induzione sul numero dei passi nella derivazione.
Se la grammatica contiene produzioni in cui due o pi variabili compaiono nelle
stringhe derivate, allora una derivazione di n passi va scomposta in pi parti,
con una derivazione per ognuna delle variabili. Queste derivazioni possono avere
meno di n passi, e si deve dunque compiere uninduzione supponendo lenunciato
valido per tutti i valori minori o uguali a ri, come discusso nel Paragrafo 1.4.2.

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.

Graininutichc libere dal contesto

191

Esercizio 5.1.2 La seguente grammatica genera il linguaggio dellespressione regolare


0* 1(0 + 1)*:

S
A
B

-
->
-

0.4 I
07? I 17? I c

Scrivete le derivazioni a sinistra e a destra delle seguenti stringhe:


* a) 00101
b) 1001
c) 00011 .
Esercizio 5.1.3 Dimostrate che ogni linguaggio regolare un linguaggio libero dal conte
sto. Suggerimento, costruite una CFG per induzione sul numero di operatori nell'espressione regolare.
Esercizio 5.1.4 Una CFG detta lineare a destra se il corpo di ogni produzione ha al
massimo una variabile, e la variabile si trova aUestrcmita destra. In altre parole tutte le
produzioni di una grammatica lineare a destra sono della forma A wD o A u\dove
A e B sono variabili e w una stringa di zero o pi terminali.
a) Dimostrate che ogni grammatica lineare a destra genera un linguaggio regolare.
Suggerimento: costruite un t-NFA che simula derivazioni a sinistra, usando il suo
stato per rappresentare lunica variabile nella forma sentenziale sinistra corrente.
b) Mostrate che ogni linguaggio regolare ha una grammatica lineare a destra. Sugge
rimento: cominciate da un DFA e fate in modo che le variabili della grammatica
rappresentino gli stati.
Esercizio 5.1.5 SiaT = {0,1.(,).+,+ ,0,6}. Possiamoconsiderare T come linsieme
dei simboli usati nelle espressioni regolari sullalfabeto {0 , 1 }; lunica differenza che si
usa e al posto del simbolo e per evitare confusione in ci che segue. Il vostro compito
definire una CFG, con T come insieme di terminali, che generi esattamente le espressioni
regolari con alfabeto {0 , 1 }.
Esercizio 5.1.6 Abbiamo definito la relazione = con una base a =>a e uninduzione
che dice a =- e 3 => 7 implicano => . La relazione => pu essere definita in al
tri modi che a loro volta equivalgono a dire => significa zero o pi =>-passi. Dimostrate
i seguenti enunciati.

192

Capitolo 5

a) a

3 se e solo se esiste una sequenza di una o pi stringhe


71,72: ,7 n

tali che a = 71 , = , e per i = 1 , 2 , . . . . n 1 abbiamo 7 => 7 +i.


^

^C

|(

b) Se a => /?, e => 7, allora = 7. Suggerimento: procedete per induzione sul


numero dei passi nella derivazione 3 => 7.
Esercizio 5.1.7 Consideriamo la CFG G deiinita dalle produzioni:

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

S -> aSbS I bSaS |e


Dimostrate che L(G) l'insieme di tutte le stringhe con lo stesso numero di a e di b.

5.2

Alberi sintattici

La rappresentazione ad albero delle derivazioni si rivelata particolarmente utile. Lal


bero mostra in modo chiaro come i simboli di una stringa terminale sono raccolti in
sottostringhc, ciascuna appartenente al linguaggio di una delle variabili della gramma
tica. Forse ancora pi importante che un albero di questo tipo, detto albero sintattico
(parse tree), sia la struttura dati ideale per rappresentare il programma sorgente in un
compilatore. La struttura ad albero del programma sorgente facilita la traduzione del pro
gramma stesso in codice eseguibile, delegando in modo naturale il processo di traduzione
a funzioni ricorsive.
In questo paragrafo presentiamo gli alberi sintattici c dimostriamo che la loro esi
stenza strettamente legata alle derivazioni e alle inferenze ricorsive. Studieremo poi la
questione dell'ambiguita nelle grammatiche e nei linguaggi, che costituisce un'applica
zione importante degli alberi sintattici. In alcune grammatiche una stringa terminale pu
avere pi di un albero sintattico; ci rende una grammatica inadatta a un linguaggio di pro
grammazione perch il compilatore non sarebbe in grado di stabilire la struttura di certi
programmi, e quindi non potrebbe dedurre con sicurezza il codice eseguibile appropriato.

Alberi sintattici

193

Terminologia relativa agli alberi


Supponiamo che il lettore conosca gi la nozione di albero e che le definizioni
pi comuni in questambito gli siano familiari. Quanto segue sar tuttavia un
utile ripasso terminologico.
Gli alberi sono collezioni di nodi, con una relazione genitore-figlio. Un
nodo ha al massimo un genitore, disegnato sopra il nodo, e zero o pi figli,
disegnati al di sotto. Una linea collega un genitore a ogni figlio. Le Figure
5.4, 5.5 e 5.6 sono esempi di alberi.
Ksistc un unico nodo senza genitori, posto alla sommit dell'albero: la
radice. 1 nodi privi di figli sono detti foglie. I nodi che non sono foglie
sono nodi interni.
11 tglio di un figlio di un di un nodo un discendente del nodo. 11
genitore di un genitore di un un antenato. Ogni nodo c discendente e
antenato di se stesso.
I figli di un nodo vengono ordinali da sinistra e disegnati di conseguen
za. Se il nodo N a sinistra del nodo M , allora si considera che tutti i
discendenti di N siano alla sinistra di tutti i discendenti di M.

5.2.1

Costruzione di alberi sintattici

Fissiamo una grammatica G = (V ,T ,P .S ). Gli alberi sintattici di G sono alberi che


soddisfano le seguenti condizioni.
1. Ciascun nodo interno etichettato da una variabile in V.
2. Ciascuna foglia etichettata da una variabile, da un terminale, o da e. Se una foglia
etichettata , deve essere lunico figlio del suo genitore.
3. Sc un nodo interno etichettato A e i suoi figli sono etichettati, a partire da sinistra,

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.

Figura 5.4 Un albero sintattico che illustra la derivazione di I + E da E.

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.

Figura 5.5 Un albero sintattico che illustra la derivazione P => Ul 1U.

A Iberi sintattici

5.2.2

195

II prodotto di un albero sintattico

Se concateniamo le foglie di un albero sintattico a partire da sinistra otteniamo una strin


ga, detta il prodotto dellalbero, che sempre una stringa derivata dalla variabile della
radice. Dimostreremo questa asserzione fra poco. Di particolare importanza sono gli
alberi sintattici che soddisfano queste due condizioni.
1. Il prodotto una stringa terminale. In questo caso tutte le foglie sono etichettate da
un terminale o da e.
2. La radice etichettata dal simbolo iniziale.
Questi sono gli alberi sintattici i cui prodotti sono stringhe nel linguaggio della grammati
ca associata. Fra breve dimostreremo che si pu descrivere il linguaggio di una gramma
tica anche come insieme dei prodotti degli alberi sintattici che hanno il simbolo iniziale
alla radice e una stringa terminale come prodotto.
E

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

presentata nella Figura 5.2. 11 prodotto di quest'albero la stringa u * (a + />00), derivata


nell'Hsempio 5.5. Vedremo che questo particolare albero sintattico una rappresentazione
di quella derivazine.

5.2.3

Inferenza, derivazioni e alberi sintattici

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

5. esiste un albero sintattico con radice A e prodotto w.


Se escludiamo linferenza ricorsiva, definita solo per stringhe terminali, le altre condizio
ni - lesistenza di derivazioni generiche, a sinistra o a destra, e di alberi sintattici - sono
equivalenti anche se m contiene variabili.
derivazione
a sinistra

derivazione
derivazione^------ a destra

_ albero
sintattico

inferenza
ricorsiva

Figura 5.7 Dimostrazione dellequivalenza di alcuni enunciati sulle grammatiche.


Dimostriamo queste equivalenze secondo lo schema della Figura 5.7. Ogni arco nel dia
gramma denota un teorema secondo il quale, se w soddisfa la condizione nella coda del
larco, allora soddisfa anche la condizione alla testa. Per esempio nel Teorema 5.12 di
mostreremo che, se si deduce che w nel linguaggio di A per inferenza ricorsiva, allora
esiste un albero sintattico con radice A e prodotto tv.

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

Dalle inferenze agli alberi

Teorema 5.12 Sia G = ( V, T. P, S) una CFG. Se la procedura di inferenza ricorsiva


indica che la stringa terminale w nel linguaggio della variabile A, allora esiste un albero
sintattico con radice A e prodotto w.
DIMOSTRAZIONE La dimostrazione un'induzione sul numero dei passi usati per dedurre

che w nel linguaggio di A.


Un solo passo. In questo caso deve essere stata usata soltanto la base della proce
dura di inferenza. Di conseguenza deve esistere una produzione A * w. L'albero della
Figura 5.8, in cui esiste una sola foglia per ogni posizione di iv, soddisfa le condizioni
degli alberi sintattici per la grammatica G , e ha evidentemente prodotto iv e radice A. Nel
caso speciale che w = e, lalbero ha una foglia singola etichettata e, ed quindi un albero
sintattico lecito, con radice A e prodotto w.
BASE

Figura 5.8 Albero costruito nel caso di base del Teorema 5.12.

Supponiamo di aver dedotto che w nel linguaggio di A dopo ?7 + 1 passi


di inferenza, e che lenunciato del teorema sia valido per tutte le stringhe x e variabili B
tali che lappartenenza di x al linguaggio B si deduca in , o meno, passi di inferenza.
Consideriamo l'ultimo passo dellinferenza che w nel linguaggio di ,4. Questa inferenza
impiega una certa produzione per ,4, poniamo A * X 1 X 2 Xk, dove ogni X i una
variabile oppure un terminale.
Possiamo scomporre w in W] W Wf soddisfacendo le seguenti clausole.
in d u z io n e

I. Se Xi un terminale, allora
terminale.

= X; cio Wi consiste solamente di questo

198

Capitolo 5

2. Sc X i una variabile, allora w, una stringa di cui stata precedentemente dedotta


l'appartenenza al linguaggio di X i . In altri termini linferenza relativa a W i ha
richiesto al massimo n degli n 4- 1 passi dell'inferenza per la quale w si trova nel
linguaggio di A. Non richiede tutti gli n+1 passi perch il passo finale, che si avvale
della produzione A >X 1 X 2 Xk- non sicuramente parte dellinferenza di
Di conseguenza possiamo applicare lipotesi induttiva a w. e Xj, e concludere che
esiste un albero sintattico con prodotto Wi e radice X t.

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

Dagli alberi alle derivazioni

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

come la derivazione di una stringa da una variabile pu essere incorporata in unaltra


derivazione. Illustriamo il punto con un esempio.
Esempio 5.13 Consideriamo ancora una volta la grammatica delle espressioni della Fi
gura 5.2. Si pu verificare facilmente che esiste una derivazione

I => Ib =$ab

Di conseguenza per tutte le stringhe a e 3 vero anche che

(*E => OlT => alb.3 => aab3


La giustificazione data dal fatto che possiamo applicare le stesse produzioni sostituendo
ogni testa con il relativo corpo, sia nel contesto di a e 3 sia isolatamente.1
Per esempio, se abbiamo una derivazione che comincia con E => E -+E => E + ( ),
possiamo applicare la derivazione di ab dalla seconda E trattando "E + ( come a e)
come 3. La derivazione pu continuare cos:

E + ( E ) = * E + ( I ) = * E + (Tb) ^ E + (ab)

Ora possiamo dimostrare un teorema che ci permette di convenire un albero sintattico


in una derivazione a sinistra. La dimostrazione uninduzione sull'altezza dellalbero,
ovvero sulla lunghezza massima di un cammino che parte dalla radice e procede verso il
basso fino a una foglia passando attraverso i discendenti. Per esempio l'altezza dellalbero
della Figura 5.6 7. In questalbero il cammino pi lungo dalla radice a una foglia
raggiunge la foglia etichettata b. Si noti che. per convenzione, la lunghezza dei cammini
conta gli archi, non i nodi, per cui un cammino che consista di un nodo singolo di
lunghezza 0.
Teorema 5.14 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 sinistra A => w nella grammatica G.
Im

DIMOSTRAZIONE Svolgiamo uninduzione sullaltezza dellalbero.

La base corrisponde allaltezza I. Ia pi bassa chc un albero sintattico con prodotto


fatto di terminali pu avere. In questo caso l'albero simile a quello della Figura 5.8, con
una radice etichettata A e figli che formano w, da sinistra a destra. Poich questalbero
c un albero sintattico, .4 > u; devessere una produzione. Dunque .4 => w una
.
.
Im
derivazione a sinistra di un solo passo, di w da A.
base

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

La dimostrazione un'altra induzione, stavolta su i. Per la base, i = 0, sappiamo gi chc


A = X i X 2 - Xk- Per linduzione ipotizziamo che
Im

A => W\U)2 ** Wi-IX iX i +1 ***Xk


Im

a) Sc X i c un terminale, non facciamo nulla. In seguito per considereremo X i come


Ia stringa terminale
Perci abbiamo gi

A => Wi W2 WiXi+lX i+2 ---Xk


Im

b) Se X i una variabile, continuiamo con una derivazione di Wi da X i, nel contesto


della derivazione chc si sta costruendo. In altre parole, se la derivazione

X i => cti => Oc2 -


=> Wi
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 =

k, il risultato una derivazione a sinistra di w da .4.

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

sottoalbero radicato nel terzo figlio della radice ha la derivazione a sinistra

E = (E) => ( + )= > (I + E) = (a + ) =>


hn

Im

(a + I) => (a

Im

hn

hn

IO) => (a + /00) => (a + 600)

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

do seguire ogni passo da *E per rispettare il contesto in cui usata la derivazione. La


derivazione a sinistra si presenta dunque finora come

E => E * E => I * E => a * E


hn

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

dalla stringa vuota. Questa derivazione gi stata trattata nellEsempio 5.6:

E => E * E ==> I * E => a * E =r>


Im

Im

Im

Im

a * (E) => a * (E jTE) => a * (1 + E) => a * (a + /)=>


Im

Im

Im

hn

a * (a + I) => a * (a + 10) ==> a * (a -r 100) => a * (a 4- 600)


hn

hn

Im

Un teorema analogo ci permette di convertire un albero in una derivazione a destra. La


costruzione di una derivazione a destra a partire da un albero molto simile alla costru
zione di una derivazione a sinistra. Dopo essere partiti con il passo A => X 1 X 2 Xk
rrn

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

Dalle derivazioni alle inferenze ricorsive

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:

E =$ E * E = > E * E + E=$-f * E - r E = r I * I + E = >


I * I -f T =$-a*I + I=>a*b-\-I => a * b + a
Consideriamo la terza forma sentenziale, E * E + E, e la E mediana in questa forma.2
Partendo da E * E + E possiamo seguire i passi della derivazione descritta sopra, ma
eliminando le posizioni derivate da E* a sinistra della E centrale o da +E alla sua destra.
I passi della derivazione diventano allora E. E, /, /, J , 6, b. In altre parole il primo passo
non cambia la E centrale, il successivo la trasforma in T, i due passi a seguire Ia lasciano
2Nel discutere la ricerca di soitoderivazioni da derivazioni pi grandi, abbiamo ipotizzato di trattare una
variabile nella terza forma sentenziale di una derivazione data. L'idea comunque applicabile a una variabile in
qualunque passo di una derivazione.

Alberi sintattici 203


immutata come 1. quello dopo la trasforma in b, e il passo finale non muta quanto derivato
dalla E centrale.
Se prendiamo solo i passi che trasformano ci che deriva dalla E centrale, la se
quenza di stringhe E , E . I , I , I , b , b diventa la derivazione E = I
b, che descrive
correttamente come la E centrale si trasforma nel corso della derivazione completa.
Teorema 5.18 Sia G = (V. T. P, 5) una CFG, e supponiamo che esista una derivazione
A
w, dove w in T*. Allora la procedura di inferenza ricorsiva, applicata a G ,
determina che w nel linguaggio della variabile A.
DIMOSTRAZIONE La dimostrazione un'induzione sulla lunghezza della derivazione A =>

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

Applicazioni delle grammatiche libere dal contesto

Inizialmente le grammatiche libere dal contesto erano state concepite da N. Chomsky


come un modo per descrivere il linguaggio naturale. Quelle speranze sono state deluse.
D altra parte il moltiplicarsi di concetti definiti ricorsivamente nell'informatica ha reso le
CFG sempre pi utili per descriverne esempi. Tratteremo brevemente due casi, uno datato
e uno recente.
1. Le grammatiche si impiegano per descrivere i linguaggi di programmazione, ma
un aspetto pi importante la possibilit di trasformare automaticamente una CFG
in un parser, cio in quel componente di un compilatore che rileva la struttura del
codice sorgente e la rappresenta per mezzo di un albero sintattico. Questa una
delle prime applicazioni delle CFG, ed in effetti uno dei primi casi in cui un'idea
teorica si c fatta strada nella pratica dellinformatica.
X

2. H facile prevedere che lo sviluppo di XML (extensible Markup Language) age


voler il commercio elettronico permettendo ai partner di condividere convenzioni
sul formato degli ordini, delle descrizioni dei prodotti e di altri tipi di documenti.
Una parte essenziale di XML la DTD (Document Type Definition), in sostanza
una grammatica libera dal contesto che descrive i tag ammessi e i modi in cui essi
possono strutturarsi. I tag sono parole racchiuse fra parentesi angolari. Per esempio
<EM> e </EM> vengono impiegate in HTML per delimitare un testo da porre in
evidenza. I tag di XM L non riguardano per rimpaginazione di un testo, ma il suo
significato. Ad esempio una sequenza di caratteri da interpretare come un numero
telefonico potrebbe essere racchiusa dai tag <PHONE> e </PHONE>.

5.3.1

Parser

La struttura di molti aspetti di un linguaggio di programmazione si pu descrivere per


mezzo di espressioni regolari. Nellesempio 3.9 abbiamo discusso di come gli identifi
catori possano essere rappresentati in questo modo. D altra parte ci sono anche aspetti

Applicazioni delle grammatiche libere dui contesto 205


molto importanti di linguaggi di programmazione tipici che non si possono rappresentare
con le sole espressioni regolari. Eccone due esempi.
Elsempio 5.19 Di norma le parentesi si possono annidare e devono essere bilanciate, cio
devessere possibile associare una parentesi aperta a quella chiusa immediatamente alla
'ira destra, cancellarle, e ripetere il procedimento. Se in questo modo si eliminano tutte
le parentesi, allora la stringa bilanciata, altrimenti no. Esempi di stringhe di parentesi
bilanciate sono (()), ()(), (()()) e e, mentre )( e (() non lo sono.
La grammatica Gbai
{(, )}, P , B ), in cui P consiste nelle produzioni

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

Molti aspetti di un tipico linguaggio di programmazione si comportano come parentesi


bilanciate. In espressioni di vario genere compaiono innanzitutto le parentesi in senso
proprio. Altri esempi sono i segnali di inizio e di fine dei blocchi di codice, come begin
e end in Pascal o le parentesi graffe { . . .} nel C. Le parentesi graffe presenti in un
programma C devono formare una sequenza bilanciata, con { come parentesi aperta e }
come parentesi chiusa.
In alcuni casi compare anche una figura affine, in cui le parentesi possono essere
bilanciale, con leccezione che ci possono essere parentesi aperte in eccesso. Ne un
esempio la struttura di if e else in C. Una clausola if pu essere priva della clausola else,
oppure pu essere bilanciata da un else corrispondente. Ecco una grammatica che genera
le sequenze ammissibili di if e else, rappresentati rispettivamente da i ed c:

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

YACC: un generatore di parser

La generazione di un parser (o analizzatore sintattico, la funzione che crea alberi sintattici


a partire dal codice sorgente) stata istituzionalizzata dal comando YACC, presente in
tutti i sistemi UNIX. Linput di YACC una CFG. in una notazione che differisce da

Applicazioni delle grammatiche libere dal contesto

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

{ ...}
{..-}
{...}
{..-}
{...}

Figura 5.11 Esempio di grammatica nella notazione di YACC.


Notiamo alcune corrispondenze fra la notazione di YACC e la nostra.

Capitolo 5

208

I due punti sono il simbolo delle produzioni, in luogo di .


Le produzioni con la stessa testa sono riunite c i loro corpi sono separati dalla barra
verticale. Noi ammettiamo questa convenzione in via facoltativa.
Lelenco dei corpi di una stessa testa si chiude con il punto e virgola. Noi non
abbiamo un simbolo di chiusura.
I terminali sono racchiusi fra apici. Lfna coppia di apici pu racchiudere pi ca
ratteri. Anche se lesempio non lo mostra, YACC permette di definire anche ter
minali simbolici. La presenza di questi terminali nel codice sorgente rilevata
dallanalizzatore lessicale e segnalata al parser mediante il valore da esso restituito.

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

Consideriamo ora una famiglia di linguaggi detti linguaggi di markup. Lc stringhe di


questi linguaggi sono documenti corredati di segnali, detti tag. I tag forniscono informa
zioni sul significato di porzioni del documento.
Uno dei pi noti linguaggi di markup l HTML {HyperText Markup Language). Que
sto linguaggio ha due scopi principali: creare collegamenti fra documenti diversi e descri
vere la veste grafica di un documento. Daremo solo un quadro semplificato della struttura
di HTML: gli esempi che seguono dovrebbero comunque suggerirne la struttura e il modo
in cui una CFG pu sia descrivere i documenti HTML validi sia guidarne il trattamento,
cio la visualizzazione su uno schermo o sulla pagina stampata.
Esempio 5.22 La Figura 5.12(a) presenta un brano testuale contenente un elenco; la Fi
gura 5.12(b) ne presenta lespressione in HTML. Si pu notare che lHTML consiste di
testo normale costellato di tag. I tag accoppiati sono della forma <x> t </x> per una
siringa x.3 Per esempio la coppia di tag <EM> c </EM> segnala che il testo racchiuso
deve essere posto in risalto, cio composto in corsivo o in un altro tipo di carattere. La
coppia <OL> e </0L> segnala invece un elenco ordinato, cio una enumerazione di voci.
Vediamo anche due esempi di lag singoli, < P > e < L I > , che introducono rispettiva
mente un capoverso e una voce d elenco. HTML permette, anzi incoraggia, l im piego dei
tag di chiusura < / P > c < / L I > al termine di un capoverso e di una voce d elenco, m a
3Talvolta I tag di apertura <x> reca pi in formazioni del semplice nome x. ma negli esempi non
consideriamo questa possibilit.

Applicazioni delle grammatiche libere dal contesto

209

non lo richiede. Per complicare un po l'esempio di grammatica da sviluppare abbiamo


omesso i tag di chiusura.

Le cose che detesto:


1. il pane am m uffito

2. coloro che guidano lentamente nella corsia di sorpasso.


(a) Il testo come appare

<P>Le cose che <EM>detesto</EM>:


<OL>
<LI>il pane ammuffito
<LI>coloro che guidano lentamente
nella corsia di sorpasso.
</OL>
(b) Sorgente HTML

Figura 5.12 Un documento HTML e la sua versione stampata.


A un documento HTML, sono associate diverse classi di stringhe. Elencheremo soltanto quelle necessarie a capire un testo come quello dell'Esempio 5.22. Per ogni classe
introdurremo una variabile con un nome descrittivo.
1. Tuxt una siringa di caratteri che si pu interpretare alla lettera, cio non con
tiene tag. Un esempio di elemento di tipo Texi nella Figura 5.12(a) ''il pane
ammuffito.
2. Char una stringa fatta di un solo earaiiere lecito in un testo HTML. Notiamo che
gli spazi sono compresi fra i caratteri.
3. Doc rappresenta documenti, che sono sequenze di elementi. La definizione degli
elementi, data in seguito, mutuamente ricorsiva con quella di Doe.
4. Element una stringa di tipo Text, o una coppia di tag con il documento racchiu
so. o un tag singolo seguito da un documento.
5. L istIiem il tag <LI> seguilo da un documento, che forma una voce di elenco.
6. List una sequenza di zero o pi voci di elenco.

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

< LI> Doe

6.

List

e I Listltern List

Figura 5.13 Porzione di una grammatica per HTML.

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.

Applicazioni delle grammatiche libere dui contento 211

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:

<ADDR>12 Maple St.</ADDR>


D altra parte non ovvio che <ADDR> significhi un indirizzo stradale. Se per esempio
il documento riguardasse l'allocazione di memoria, il tag <ADDR> potrebbe riferirsi a un
indirizzo in memoria. Per chiarire il senso dei diversi tipi di tag e le strutture che possono
trovarsi racchiuse fra coppie di tag, si possono sviluppare convenzioni, nella forma di
DTD, condivise entro un ambito applicativo specifico.
Una DTD in sostanza una grammatica libera dal contesto, con una propria notazione
per descrivere variabili e produzioni. Nel prossimo esempio mostreremo una semplice
DTD e introdurremo alcune regole linguistiche per descrivere DTD. Il linguaggio per
le DTD ha a sua volta una grammatica libera dal contesto, ma non siamo interessati a
descriverla. Il linguaggio per descrivere DTD essenzialmente una notazione di tipo
CFG: intendiamo vedere come usarlo per esprimere CFG.
La forma di una DTD la seguente.

<!DOCTYPE nome-della-DTD [
elenco di definizioni di elementi
]>
La definizione di un elemento ha invece questa forma.

<!ELEMENT nome-elemento (descrizione dell'elemento)>


Lc descrizioni di elementi sono sostanzialmente espressioni regolari. Elenchiamo ora le
basi di tali espressioni.
1. Nomi di altri elementi, a rappresentare il fatto che gli elementi di un tipo possono
comparire in elementi di altro tipo, cos come in HTML un lesto in risalto pu
trovarsi in un elenco.

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.

2. La virgola, che denota la concatenazione.


3. Tre varianti delloperatore di chiusura, come nel Paragrafo 3.3.1. Esse sono *,
loperatore usuale, chc significa zero o pi occorrenze di"; +, che significa una o
pi occorrenze di; ?, che significa zero o una occorrenza di.
Lc parentesi possono associare gli operatori ai loro argomenti; altrimenti si applicano le
solite regole di precedenza delle espressioni regolari.
Esempio 5.23 Supponiamo chc alcuni produttori di computer concordino di definire una
DTD per pubblicare sul Web le descrizioni dei PC in catalogo. La descrizione di un
PC deve contenere un codice del prodotto e i dati caratteristici, per esempio la quantit di
RAM, il numero e la dimensione dei dischi, e cos via. La Figura 5.14 illustra un'ipotetica
DTD, molto semplice, per personal computer.

<!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.

Applicazioni delle grammatiche libere dal contesto 213


Tl nome della DTD PcSpecs. Il primo elemento, analogo al simbolo iniziale di una
CFG, PCS (elenco di specifiche di PC). La sua definizione. PC*, dice che una PCS
formata da zero o pi voci di tipo PC.
Segue la definizione dellelemento PC. Essa consiste nella concatenazione di cinque
entit. Le prime quattro sono altri elementi, corrispondenti a modello, prezzo, tipo di
processore e RAM del PC. Ciascuno deve comparire una volta, nellordine dato, perch
la virgola rappresenta la concatenazione. Lultimo costituente, DISK+, indica la presenza
di una o pi voci relative ai dischi.
Molti costituenti sono puramente testuali: MODEL, P R IC E e RAM sono di questo tipo.
L'elemento PROCESSOR, invece, strutturato. Dalla sua definizione notiamo che esso
consiste di produttore, modello e velocit, in questordine; ogni elemento testuale.
La voce pi complessa D IS K . Innanzitutto un disco pu essere un disco fisso, un
CD o un DVD, come indicato dalla regola per lelemento D IS K , che consiste nellOR di
tre altri elementi. I dischi fissi, a loro volta, hanno una struttura in cui si specificano il
produttore, il modello e la dimensione, mentre CD e DVD sono rappresentati solo dalla
velocit.
La Figura 5.15 riporta un esempio di documento XML conforme alla DTD della Fi
gura 5.14. Notiamo che ogni elemento rappresentato nel documento da un tag con il
nome dellelemento e da un secondo tag con una sbarra obliqua in pi, come in HTML.
Per esempio osserviamo i tag < P C S > . . . < / P C S > al livello pi esterno. Fra i due tag
si trova un elenco di voci, una per ogni PC venduto dal produttore; ne abbiamo riportata
esplicitamente una sola.
Nella voce <PC> illustrala leggiamo senza difficolt che il codice del modello 4560,
il prezzo $2295, e il processore un Intel Pentium a 800MHz. Il PC ha una RAM
di 256 MB, un disco Maxtor Diamond di 30,5 GB e un lettore di CD-ROM 32x. Non
tanto importante che noi possiamo leggere queste informazioni, quanto che un programma
possa leggere il documento e, guidato dalla grammatica nella DTD della Figura 5.14 letta
in precedenza, sappia interpretarne opportunamente il contenuto.
Il
lettore ha forse notato che le regole per gli elementi in una DTD simile a quella
della Figura 5.14 non somigliano alle produzioni delle grammatiche libere dal contesto.
Molte sono nella forma corretta; per esempio
< !ELEMENT PROCESSOR

(MANF, MODEL,

S P E E D )>

analoga alla produzione

Processor' *M a n f M odel Speed


Daltra parte la regola
< ! ELEMENT D I S K

(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:

D isk H ardD isk \Cd \


Dvd
Il caso pi difficile

<!ELEMENT PC {MODEL, PRICE, PROCESSOR, RAM, DISK+)>


in cui il corpo contiene un operatore di chiusura. La soluzione consiste nel sostitui
re DISK+ con una variabile, D isks , che genera, mediante due produzioni, uno o pi
esemplari della variabile Disk. Le produzioni equivalenti sono

Applicazioni delle grammatiche libere dui contesto

215

Pc > Model Price Processor Ram Disks


Disks * Disk I Disk Disks
C una tecnica generale per trasformare una CFG con espressioni regolari come corpi
delle produzioni in una CFG normale. Presentiamo lidea informalmente; il lettore pu
cercare di formalizzare sia il significato di CHG aventi produzioni i cui corpi sono formati
da espressioni regolari sia la prova che lestensione non produce linguaggi al di l dei
CFL. Mostriamo induttivamente come convertire una produzione con espressioni regolari
come corpo in una serie di produzioni usuali equivalenti. Linduzione si compie sulla
dimensione dell'espressione nel corpo.
BASL Se il corpo una concatenazione di elementi, la produzione c gi in una forma lecita

per le CFG: non occorre mutarla.


INDUZIONE Altrimenti ci sono cinque casi, a seconda dellultimo operatore.

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

4. La produzione della forma A (i?i)+. Introduciamo una nuova variabile, B,


che non compare altrove, e sostituiamo la produzione con

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

<!ELEMENT PC (MODEL, PRICE, PROCESSOR, RAM, DISK+)>


in un insieme di produzioni lecite per le CFG. Possiamo trattare il corpo della regola come
la concatenazione di due espressioni, rispettivamente MODEL, PRICE, PROCESSOR,
RAM e DISK+. Associamo due variabili, A e B , alle due sottoespressioni, e definiamo le
produzioni

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:

Pc Model Price Processor Ram B


B > D isk B I Disk

Applicazioni delle grammatiche libere dal contesto 217

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 > .

b) Un elemento pu consistere in un elenco non ordinato, oltre che ordinato. Gli


elenchi non ordinati sono racchiusi fra i tag <UL> e </UL>.
! c) Un elemento pu consistere in una tabella. Le tabelle sono racchiuse fra <TABLE>
e il </TABLE> pi vicino. Fra i due tag si trovano una o pi righe, ciascuna
racchiusa fra <TR> e < /TR>. La prima riga fa da intestazione con uno o pi campi,
ciascuno introdotto dal tag <TH> (assumiamo che non ci sia il tag di chiusura, anche
se dovrebbe esserci). I campi delle rige successive sono introdotti dal tag <TD>.
Esercizio 5.3.5 Convertite la DTD della Figura 5.16 in una grammatica libera dal conte
sto.

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)>

]>

Figura 5.16 Una DTD per corsi universitari.

5.4

Ambiguit nelle grammatiche e nei linguaggi

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.

Ambiguit nelle grammatiche e nei linguaggi

219

(a)

+
(b)

Figura 5.17 Due alberi sintattici con lo stesso prodotto.


La differenza fra le due derivazioni rilevante. Rispetto alla struttura delle espressioni, la
derivazione ( I ) dice che la seconda e la terza espressione vanno moltiplicate, e il risultato
va sommato alla prima; la derivazione (2), invece, somma le due prime espressioni e
moltiplica il risultato per la terza. Piii concretamente la prima derivazione suggerisce di
raggruppare 1 + 2 * 3 in questo modo: 1 + (2 * 3) = 7, mentre la seconda suggerisce il
raggruppamento (I + 2) * 3 = 0. Solo il primo modo corrisponde alla nozione usuale di
raggruppamento delle espressioni aritmetiche.
La grammatica della Figura 5.2 d due strutture diverse a una stringa di terminali de
rivata sostituendo le tre espressioni in E -I-E * E con identificatori; dunque questa gram
matica non genera strutture univoche. In particolare, pur associando il raggruppamento
corretto a unespressione aritmetica, essa ne associa anche uno scorretto. Per poter im
piegare questa grammatica in un compilatore dovremmo modificarla in modo chc generi
solo il raggruppamento corretto.
L'esistenza di derivazioni distinte per la stessa stringa (e non di alberi sintattici distinti)
non comporta di per s un difetto nella grammatica. Il prossimo esempio illustra questo
punto.
Esempio 5.26 Nella stessa grammatica delle espressioni, la stringa a 4- b ammette molte
derivazioni distinte. Ecco due esempi:
1. = > + ^ + =$ + = > + = +

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

Eliminare le ambiguit da una grammatica

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

Ambiguit nelle grammatiche e nei linguaggi

221

lambiguit. 11 problema della grammatica delle espressioni (Figura 5.2) esemplare. A


titolo di esempio esamineremo come eliminarne l'ambiguit.
Notiamo anzitutto che nella grammatica in esame si hanno due cause di ambiguit.
1. La precedenza degli operatori non rispettata. Mentre la Figura 5.17(a) raggruppa
correttamente l'operatore * prima di +, la Figura 5.17(b) forma un albero sintattico
altrettanto valido, ma raggruppa + prima di *. Dobbiamo fare in modo che in una
grammatica non ambigua sia lecita solo la struttura di (a).
2. Una sequenza di operatori identici si pu raggruppare sia da sinistra sia da destra.
Se per esempio gli * nella Figura 5.17 fossero sostituiti da +, vedremmo due di
versi alberi per la stringa E + E 4- E. Poich la somma e la moltiplicazione sono
associative, non importa se raggruppiamo da sinistra o da destra, ma per eliminare
lambiguit dobbiamo fare una scelta. La soluzione convenzionale prevede di rag
gruppare da sinistra; l'unico raggruppamento corretto dei due segni + quindi la
struttura della Figura 5.17(b).
Il problema di imporre una precedenza si risolve introducendo alcune variabili, ognuna
delle quali rappresenta le espressioni con lo stesso grado di forza di legamento", secondo
lo schema seguente.
1. Un fattore unespressione che non si pu scomporre rispetto a un operatore adia
cente, * o +. Nel linguaggio delle espressioni i soli fattori sono i seguenti.
(a) Identificatori. Non possibile separare le lettere di un identificatore inserendo
un operatore.
(b) Qualsiasi espressione fra parentesi, indipendentemente dal suo contenuto. Lo
scopo delle parentesi proprio quello di impedire che ci che racchiudono
diventi loperando di un operatore esterno.
2. Un termine c unespressione che non pu essere scomposta dalloperatore +. Nel
lesempio, in cui + e * sono i soli operatori, un termine il prodotto di uno o pi
fattori. Per esempio il termine a * b pu essere scomposto se applichiamo asso
ciativit a sinistra e poniamo a l* alla sua sinistra. Infatti al * a * 6 raggruppato
come (ai * a) * b, che separa a * b. Se invece poniamo un termine additivo come
a l+ a sinistra o + a l a destra, non possiamo spezzarlo. Il raggruppamento corretto
di a 1 + a * b a l + (a * b), mentre quello di a * b + al (a * b) + a l .
3. Per espressione intenderemo dora in avanti qualsiasi espressione, comprese quelle
che possono essere spezzate da un * o da un + adiacente. NeHcsempio, perci,
unespressione la somma di uno o pi termini.

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

Figura 5.19 Una grammatica delle espressioni non ambigua.

Figura 5.20 Lunico albero sintattico di a + a * a.


Non affatto evidente che questa grammatica non ambigua. Alcune osservazioni spie
gano perch nessuna stringa nel linguaggio pu avere due alberi sintattici distinti.
Qualsiasi stringa derivata da T, cio un termine, devessere una sequenza di uno o
pi fattori legati da *. Un fattore, secondo la definizione e secondo le produzioni
per F nella Figura 5.19. un singolo identificatore o unespressione qualsiasi fra
parentesi.

Ambiguit nelle grammatiche e nei linguaggi 223


T

Figura 5.21 La forma di tutti gli alberi sintattici di un termine.

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

Derivazioni a sinistra come modo per esprimere Tambiguita

Le derivazioni non sono necessariamente uniche, anche in grammatiche non ambigue,


ma in una grammatica non ambigua Ie derivazioni a sinistra sono uniche, cos come le

224

Capitolo 5

derivazioni a destra. Tratteremo solo le derivazioni a sinistra, limitandoci per quelle a


destra a enunciare il risultato.
Esempio 5.28 Come esempio consideriamo i due alberi sintattici della Figura 5.18, che
hanno entrambi il prodotto E + E * E. Le derivazioni a sinistra corrispondenti agli alberi
(a) e (b) sono le seguenti.
a) E => E 4- E => I + E =$ a
Im

hn

a + a * T => a + a. * a

Im

E =$ a + E * E => a + I * E => a 4- a * E =>


Im

Im

Im

Im

Im

b) E ' => E * E => E


Im

Im

E * E = T + E1* E
Im

a -t-a * E => a + a * I => a + a * a


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.

Ambiguit nelle grammatiche e nei linguaggi

225

Risoluzione delle ambiguit in YACC


Poich la grammatica delle espressioni che abbiamo esaminato ambigua, pos
siamo chiederci se lesempio di programma per YACC della Figura 5 .11 sia realistico. E vero, la grammatica soggiacente ambigua, ma lutilit di YACC come
generatore di parser deriva in gran parte dai semplici meccanismi chc offre al
lutente per risolvere le cause pi diffuse di ambiguit. Per la grammatica delle
espressioni basta sapere quanto segue.
V

a) * ha precedenza su -K In altre parole * si raggruppa prima di ogni + adia


cente, da qualsiasi lato. Questa regola impone di usare la derivazione (1)
anzich la (2) nell'Esempio 5.25.
b) Sia * sia + sono associativi a sinistra. In altre parole una sequenza di
espressioni, tutte legate da *, si raggruppano da sinistra; lo stesso vale per
le sequenze legate da -K
YACC permette di definire la precedenza degli operatori elencandoli in ordine
crescente di priorit. Tecnicamente la precedenza di un operatore si applica in
ogni produzione nel cui corpo loperatore sia lultimo terminale a destra. Median
te le parole % l e f t e % r ig h t si pu dichiarare che un operatore associativo
a sinistra o a destra. Ad esempio, per dichiarare che + e * sono entrambi asso
ciativi a sinistra e che * ha precedenza su +, si devono porre i seguenti enunciati
prima della grammatica della Figura 5. M .

%left '+'
%left

Non dimostreremo lesistenza di linguaggi inerentemente ambigui. Tratteremo invece


un esempio di linguaggio di cui si pu dimostrare lambiguit inerente e spiegheremo
in termini intuitivi perch qualsiasi grammatica che lo generi devessere ambigua. Il
linguaggio L

L = {anbncmdm I ri > L m > I } U {a"brncr"d n \n > 1, m > 1}


Il linguaggio L consiste quindi delle stringhe in a b~c~d 1 tali chc vale una delle se
guenti condizioni.
I . Ci sono tanti a quanti b c tanti c quanti d.

226

Capitolo 5

2. Ci sono tanti a quanti d e tanti b quanti c.


Il linguaggio L libero dal contesto. La grammatica pi evidente per L, presentata nella
Figura 5.22, impiega insiemi separati di produzioni per generare i due tipi di stringhe di
L.

S
A
B
C
D

-
>
-

->

AB I C
aA b I ab
cBd cd
aCd I uDd
bDc i bc

Figura 5.22 Una grammatica per un linguaggio inerentemente ambiguo.


Questa grammatica ambigua. Per esempio la stringa aabbccdd ha due derivazioni a
sinistra:
1. S => AB => aAbB => aabbB
Im

2. S => C
Im

Im

Im

aCd

Im

Im

Im

aabbcBd => aabbccdd


Im

aaDdd => aahDcdd, => aabbccdd.


Im

Im

e i due alberi sintattici illustrati nella Figura 5.23.


La dimostrazione che tutte le grammatiche per L sono ambigue complessa; possia
mo per descriverne la sostanza. Dobbiamo provare che, latta eccezione per un numero
finito di stringhe, tutte le stringhe contenenti lo stesso numero di a, b, ce d possono essere
generate in due modi diversi: nel primo caso si fa in modo che il numero di a sia uguale
al numero di b e il numero di c uguale al numero di /; nel secondo si generano tanti a
quanti d e tanti b quanti c.
Per esempio il solo modo di generare stringhe con lo stesso numero di a e di b si serve
di una variabile come .4 nella grammatica della Figura 5.22. Esistono alcune varianti,
naturalmente, ma il quadro di fondo non muta. Vediamo alcuni esempi.
Si possono evitare alcune stringhe brevi, per esempio modificando la produzione di
base A >ab in A * aaabbb.
Possiamo far s che A divida il suo compito con altre variabili, per esempio definen
do Ai c A2 , destinate a generare rispettivamente un numero dispari e un numero
pari di a: Ai * aA^b |ab; A +aA\b \
ab.
Possiamo anche fare in modo che il numero di a e di b generati da A non sia lo
stesso, ma differisca di una quantit finita. Possiamo per esempio partire dalla
produzione S AbB e poi servirci di .4 a Ab \
a per generare un a in pi dei b.

Ambiguit nelle grammatiche c nei linguaggi 227


S

Cl

b
(a)

c
(b)

Figura 5.23 Due alberi sintattici per aabbeedd.

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

* Ksercizio 5.4.1 Considerate la grammatica

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

a) Mostrate che questa grammatica non ambigua.


b) Trovate una grammatica ambigua per lo stesso linguaggio e dimostratene lambi
guit.
*! Esercizio 5.4.6 La grammatica con cui avete risolto lEsercizio 5.1.5 non ambigua? Se
non Io fosse, rendetela non ambigua.
Esercizio 5.4.7 La grammatica che segue genera espressioni in notazione prefissa con gli
operandi x e y e gli operatori binari +, , 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

Grammatiche libere dal contesto, una CFG un modo di descrivere un linguag


gio per mezzo di regole ricorsive chiamate produzioni. Una CFG consiste di un
insieme di variabili, un insieme di simboli terminali e una variabile iniziale, oltre
alle produzioni. Ogni produzione consiste di una variabile di testa c di un corpo,
formato da una stringa di zero o pi variabili e terminali.
Derivazioni e linguaggi: a partire dal simbolo iniziale deriviamo le stringhe termi
nali sostituendo ripetutamente una variabile con il corpo di una produzione che ha
tale variabile come testa. Il linguaggio della CFG linsieme delle stringhe ter
minali che possibile derivare in questo modo, ed detto linguaggio libero dal
contesto.
Derivazioni a sinistra e a destra: se in una stringa sostituiamo sempre la variabile
pi a sinistra (o, rispettivamente, la pi a destra), otteniamo una derivazione a sini
stra (rispettivamente, a destra). Ogni stringa nel linguaggio di una CFG ha almeno
una derivazione a sinistra e almeno una derivazione a destra.
Forme sentenziali', ogni passo di una derivazione una stringa di variabili e termi
nali chiamata forma sentenziale. Se la derivazione a sinistra (a destra), allora la
stringa una forma sentenziale sinistra (destra).
Alberi sintattici: un albero sintattico un albero che mostra gli elementi essenziali
di una derivazione. I nodi interni sono etichettati da variabili e le foglie sono eti
chettate da terminali o da e. Per ogni nodo interno deve esistere una produzione tale
che la testa della produzione letichetta del nodo, e le etichette dei suoi nodi figli,
lette da sinistra a destra, formano il corpo della produzione.
Equivalenza di alberi sintattici e derivazioni: una stringa terminale nel linguag
gio di una grammatica se e solo se il prodotto di almeno un albero sintattico.
Perci lesistenza di derivazioni a sinistra, derivazioni a destra e alberi sintattici so
no condizioni equivalenti, ognuna delle quali definisce esattamente le stringhe nel
linguaggio di una CFG.
Grammatiche ambigue: per determinate CFG possibile trovare una stringa termi
nale con pi di un albero sintattico o, il che equivalente, pi di una derivazione
a sinistra o pi di una derivazione a destra. Una grammatica di questo tipo detta
ambigua.
Eliminazione dellambiguit: per molte grammatiche utili, come quelle che de
scrivono la struttura dei programmi in un tipico linguaggio di programmazione,

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.

Parser, il concetto di grammatica libera dal contesto essenziale per realizzare


compilatori e altri strumenti per linguaggi di programmazione. Strumenti come
YACC prendono una CFG come input e producono un parser, il componente di un
compilatore chc estrae la struttura del programma in compilazione.
Document Type Definition. Io standard XML per la condivisione di informazioni
mediante documenti Web ha una notazione, detta DTD. per descrivere la struttura
dei documenti attraverso linserimento di tag semantici nel documento. Una DTD
essenzialmente una grammatica libera dal contesto il cui linguaggio una classe
di documenti correlati.

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

5. R. W. Flovd. On ambiguity in phrase-structurc languages, Comm. ACM 5:10


(1962), pp. 526-534.
6. M. Gross, Inherent ambiguity of minimal linear grammars, Information and Con
trol 7:3 (1964), pp. 366-368.
7. P. Naur et al., Report on the algorithmic language ALGOL 60, Comm. ACM 3:5
(1960), pp. 299-314. Vedi anche Comm. ACM 6:1 (1963), pp. 1-17.

8. World-Wide-Web Consortium, http: //www.w3 .org/TR/REC-xml (1998).

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

Definizione di automa a pila

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.

Definizione di automa a pila

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.

Esempio 6.1 Consideriamo il linguaggio


Lwwr = {w w R I w in (0 + 1)*}
Si tratta del linguaggio detto thu;-w rovesciato, costituito dalle palindrome di lunghezza
pari sullalfabeto {0 ,1}. E un CFL generato dalla grammatica della Figura 5.1 omettendo
le produzioni P 0 e P * 1. Descriviamo un automa a pila che accetta L wwr.2
1. Partiamo da uno stato <r/o che rappresenta la congettura di non avere ancora esau
rito la stringa ur, supponiamo cio di non aver visto la fine della stringa che deve
essere seguita dal suo inverso. Finch ci troviamo nello stato qo leggiamo i simboli
e li accumuliamo nello stack uno per volta.
2 . In qualunque momento possiamo scommettere di aver visto la prima met, cio

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

Definizione formale di automa a pila

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.

Q: un insieme finito di stati, analoghi a quelli di un automa a stati finiti.


: un insieme finito di simboli di input, anche questi analoghi al componente corri
spondente di un automa a stati finiti.
: un alfabeto di stack, finito. Questo componente, che non ha analoghi negli automi
a stati finiti, l'insiem e dei simboli che possono essere inseriti nello stack.

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

2. a un simbolo di input in oppure a = t, la stringa vuota, che assumiamo


non sia un simbolo di input
3. X un simbolo di stack, ossia un membro di .
Loutput di un insieme finito di coppie (p, 7), dove p il nuovo stato e 7 la
stringa di simboli di stack che rimpiazza X alla sommit dello stack. Per esempio,
se 7 = e, allora il simbolo in cima allo stack viene eliminato; se 7 = X lo stack
rimane immutalo; se 7 Y Z , allora A' sostituito da Z, c Y viene inserito nello
stack.

qo'. lo stato iniziale. Il PDA inizia a operare da questo stato.


Zo'. il simbolo iniziale. Lo stack del PDA consiste allinizio in una sola copia di questo
simbolo c nient'altro.
F : linsieme degli stati accettanti, o stati finali.

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

Definizione di automa a pila

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

P = ({0,41, }. {0, I }, { 0 ,1. Z q}; , qo. Z0, {<?2})


dove definita dalle seguenti regole.
1 . (</o,0. Z 0) = {(go,0Zo)} e

(q0, L Z 0) = {(q0A Z 0)}. Una di queste regole


viene applicata aH'inizio. quando ci troviamo nello stato q0 e vediamo il simbolo
iniziale Z u alla sommit dello stack. Leggiamo il primo input e lo inseriamo nello
stack, lasciando Zo a indicare il fondo.

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

Una notazione grafica per i PDA

Come abbiamo visto nelFEsempio 6.2. la definizione di non di immediata compren


sione. A volte un diagramma simile al diagramma di transizione di un automa a stati finiti
chiarisce il comportamento di un PDA. Presentiamo dunque il diagramma di transizione
per un PDA. dove valgono le clausole seguenti.
a) I nodi corrispondono agli stati del PDA.
b) Una freccia etichettata S t a r t indica lo stalo iniziale; come per gli automi a stali
liniii, gli stati contrassegnati da un doppio cerchio sono accettanti.
c) Gli archi corrispondono alle transizioni del PDA. In particolare un arco etichettato
a. X /'a dallo stato q allo stato p significa che 6(q, a, X ) contiene la coppia (p, a ),
ed eventualmente altre coppie. In altre parole l'etichetta dell'arco indica quale input
viene usato, oltre alla sommit dello stack, prima e dopo la transizione.
L'unica informazione che il diagramma non fornisce il simbolo iniziale dello stack. Per
convenzione usiamo Z0, salvo indicazione contraria.
0 , Z 0 /O Z 0
1 , Z 0 / I Z 0

0 , 0 /0 0
0 , l/o i
1 , 0/10

0, 0/
I , 1/

1,1/11

, I / I

Figura 6.2 Rappresentazione di un PDA come diagramma di transizione generalizzato.

Esempio 6.3 II PDA dellEsempio 6.2 rappresentato dal diagramma della Figura 6.2.

Definizione di automa a pila

6.1.4

239

Descrizioni istantanee di un PDA

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

3. 7 il contenuto dello stack.


Per convenzione mostriamo la sommit dello stack allestremo sinistro di 7 e il fondo al
lestremo destro. La tripla detta descrizione istantaneo (ID, Instantaneous Description)
dellautoma a pila.
Per gli automi a stati finiti la notazione sufficiente a rappresentare sequenze di
descrizioni istantanee attraverso le quali un automa si muove, perche la ID coincide con
10 stato. Per i PDA, invece, occorre una notazione che descriva le trasformazioni di stato,
l'input e lo stack. Per connettere le coppie di ID che rappresentano una o pi mosse di un
PDA adottiamo perci una notazione particolare.
Sia P = (Q. , , (5, <70, . F ) un PDA. Definiamo l , o V- quando P sottinteso.
r
Supponiamo chc S(q. a. A') contenga (p. a). Allora, per tutte le stringhe w in * e in
*:
(q, a w , X 3) h (p, w, a 3)
A

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

BASE I t i per qualunque ID I.


INDUZIONE I Ir J se esiste una ID K tale che I t K c K ,/.

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 )

F igura 6.3 Le ID del PDA dell'Esempio 6.2 su input 1111.


A partire dalla TD iniziale ci sono due mosse possibili. La prima ipotizza che la prima
met non sia stata vista e conduce alla ID (q0. 111,1 Z0): un 1 stato rimosso dallinput
ed stato inserito nello stack.
La seconda equivale a supporre che la prima met sia stata raggiunta. Il PDA va nello
stato r/i portando alla ID (<71, 1 1 1 1. Z 0) senza consumo di input. Poich' accetta se si trova
nello stato q- con Z0 alla sommit dello stack, il PDA passa alla ID (</2,1111, Z 0), che
non accettante perch linput non stato interamente consumato. Se linput fosse stato

Definizione di automa a pila

241

Notazione convenzionale per i PDA


Continueremo a usare le convenzioni sulluso dei simboli introdotte per gli auto
mi a stati Iiniti c le grammatiche. NelFadattare la notazione sottolinciamo che i
simboli di stack hanno un ruolo analogo all'unione dei terminali c delle variabili
di una CFG. Di conseguenza:
1. i simboli dellalfabeto di input saranno rappresentati dalle lettere iniziali
del lalfabeto, minuscole, come a e b
2 . gli stati saranno di solito rappresentati da

q e p, o da altre lettere prossime

a queste nellordine alfabetico


3. Ic stringhe di simboli di input saranno rappresentate dalle ultime lettere
dell'alfabeto, minuscole, per esempio w o z
4. i simboli di stack saranno rappresentati dalle ultime lettere dell'alfabeto,
maiuscole, come X o Y
5. le stringhe di simboli di stack saranno rappresentate da lettere greche, come
o7.

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.

Teorem a 6.5 Se P = (Q , , , <5, qo, Zo , F) un PDA, e ( q, x , a) H (p. y , ), allora per


ogni stringa

w in * e 7 in 1'* vero anche che


( q , x w , a /y) F ( p . y w j 7 )

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

(<7, X, a) F (p, //, )

giustificata dalle transizioni di P senza ricorrere in nessun m odo

a w e 7 . Di conseguenza, quando queste stringhe si trovano in input e sullo stack, ogni


m ossa ancora giustificata.
N otiam o per inciso chc l'inverso di questo teorem a falso. Un PDA potrebbe c o m
piere certe operazioni levando un sim bolo dallo stack, usando alcuni simboli di 7 e poi
sostituendoli sullo stack, operazioni impossibili senza esam inare 7 . Ma, secondo il prin
cipio (3), possibile rim uovere Linput non utilizzato perch un PD A non pu consum are
simboli di input e poi ripristinarli. E nunciam o il principio (3) in termini formali.

Teorem a 6.6 Se P = (Q, , , , qo, Z q, F) un PDA e

( q , x w . a ) F (p. y u \ 3)
P

allora vero anche che (q, x, a )

6.1.5

(p, y, fi).

Esercizi

Esercizio 6.1.1 S u p p o n ia m o c h e il PDA P =


abbia la seguente funzione di transizione:

L S ( q ,0 ,Z 0) = { ( q , X Z o)}
2 . % , O .X ) = { ( g , J O : ) }

({<7, 7?}, { 0 , 1}; { Z o , X } , S , q , Z o , {p})

I linguaggi di un PDA

243

ID per automi a stati finiti


Ci si pu chiedere perch non abbiam o introdotto per gli automi a stati Iiniti una
notazione come quella delle ID utilizzata per i PDA. Anche se un FA non con
tiene uno stack, potrem m o usare una coppia (q, w), dove q lo stato e w l'input
residuo, com e ID di un automa a stati finiti. Anche cos, per, non avremmo nes
suna ulteriore informazione sulla raggiungibilit tra ID rispetto alla notazione S.
Infatti, per ogni automa a stati finiti, si pu dimostrare che S(q, w) = p se e solo
sc (q, wx) F (p, x) per ogni stringa x. L'indipendenza da
di un FA c un teorema analogo ai Teoremi 6.5 e 6 .6 .

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

Sia P ( Q , , . , r/o, Zo- F) un PDA. Allora L(P). il linguaggio accettato da P per


stato finale,
{; I (qf,W ,Z 0) l (q.c.a)}
per uno stato q in F e una stringa qualsiasi a . In altre parole, a partire dalla ID iniziale
con w in input, P consuma w cd entra in uno stato accettante. A questo punto il contenuto
dello stack irrilevante.
Esempio 6.7 Abbiamo affermato che il PDA deUEsempio 6.2 accetta il linguaggio L wwr,
cio il linguaggio delle stringhe in {U, I } * che hanno la forma Wtvn . Vediamo ora per
ch l'enunciato vero. La dimostrazione un enunciato se e solo se: il PDA P
dellEsempio 6.2 accetta la stringa .r per stato finale se e solo se x della forma w w R.
(Se) Questa parte facile: occorre solo esibire la computazione accettante di P. Se
X = wu-R, allora osserviamo che

(q0,wwR, Z 0) (qo,wR,Wn Z0) h (<7 i ,wH, w RZa) (<?i,e,Z0) h (q2,c,Z0)


In altri termini il PDA ha la possibilit di leggere w dallinput e memorizzarlo alla ro
vescia nello stack. Nel passo successivo il PDA passa spontaneamente allo stato qi e fa
corrispondere irH sullinput alla stessa stringa nello stack; infine va spontaneamente nello
stato q2
(Solo se) Questa parte pi difficile. In primo luogo osserviamo che il solo modo di
entrare in uno stato accettante q-> trovarsi nello stato q\ c avere Z0 alla sommit dello
stack. Inoltre qualunque computazione accettante di P parta dallo stato q0 fa una sola
transizione a qi senza tornare a qo. Perci dobbiamo trovare le condizioni su x per cui
(qo, X , Zo) r (f/i, (, Zo); si tratta proprio delle stringhe x che P accetta per stalo finale.
Dimostreremo per induzione su |x| lenunciato pi generale:
se (<7o x, a) (y*, e, a ), allora x c della forma w w 11.
BASE Se X = r, allora x della forma w w R (con w = (). Perci la conclusione vera

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.

(qo, aia? , ft) I- (qo,n.2 an ,a ia ). Una sequenza di mosse pu terminare


con (q i,c . a ) solo se lultima mossa uneliminazione:
(<]\,an >aiOc) H (q\,e,a)
In tal caso si ha necessariamente a\ = an . Sappiamo inoltre che
(<7 , 2 - , ) h (q1} , )
Per il Teorema 6.6 possiamo eliminare dallinput il simbolo inutilizzato an. Quindi

(,,,a-2 - U n - U 1 ft) F

( q i , f-,1 ft)

Poich linput per questa sequenza ha lunghezza minore di n, possiamo applicare


lipotesi induttiva e concludere che 2 ,.-1 della forma y y R per un y oppor
tuno. Poich X = c t i y y Ra u , c sappiamo chc ai = a n , concludiamo che x della
forma w w R, con w = a i y.
Abbiamo descritto il nucleo della dimostrazione che x accettata solo se usuale a w w H
per un certo w. Di conseguenza abbiamo la parte solo se della dimostrazione; insieme
con la parte se, gi dimostrata, essa afferma che P accetta esattamente le stringhe in
IJwwr CI

6.2.2

Accettazione per stack vuoto

Per ogni PDA P = (Q, , , ', qo. Zo-F) definiamo

N ( P ) = {w I (qo, w. Zo) ^ (q, e, e) }


per qualsiasi stato q. Quindi N ( P ) linsieme degli input w chc P pu consumare,
svuotando nel contempo lo stack.
Esempio 6.8 II PDA P dellEsempio 6.2 non vuota mai il suo stack, dunque N ( P ) = 0.
Ma con una piccola modifica P pu accettare Lwwr sia per stack vuoto sia per stato finale.
Invece della transizione (/71, e, Z 0) = {(<72, Z 0)) definiamo 5(qi, e, Zq) = {(q2, c)}.
Ora, quando P accetta, elimina dallo stack lultimo simbolo, e L(P) = N ( P ) = L irwr.

Poich linsieme degli stati accettanti irrilevante, se ci interessa solo il linguaggio


che P accetta per stack vuoto, a volte ometteremo lultimo (il settimo) componente della
specificazione di un PDA P. Scriviamo allora P come una sestupla (Q. . , <5, qo. Zo).
3 A in Ar( P ) sta per slack nullo", sinonimo di "stack vuoto.

246

6.2.3

Capitolo 6

Da stack vuoto a stato finale

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

iniziale di Py sia un segnale che indica quando P ^ ha svuotato lo stack. Quando P y


vede .Yq ^ la sommit del proprio stack, sa chc P\ vuoterebbe lo stack sullo stesso input.

, X ()/

F igura 6.4 Py simula P y e accetta se P y vuota il proprio stack.


Abbiamo inoltre bisogno di un nuovo stato iniziale, p0. Ia cui unica funzione inserire
Z 0, il simbolo iniziale di Py. in cima allo stack ed entrare nello stato q0, lo stato iniziale
di Pa:. A questo punto Py simula P ^ finch lo stack di P y vuoto: P y se ne accorge
perch vede X 0 alla sommit dello stack. Infine occorre un altro nuovo stato p f, che lo
stato accettante di Py. Questo PDA entra nello stato p j quando scopre che P \ avrebbe
svuotato il proprio stack.

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 ),

(Se) Sappiamo che


inserire

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

Di conseguenza Pjr accetta

Py

(6.1 )

Py

per stato finale.

(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)

dove <5,v definita come segue.


1. S,\(qA, Z ) = {(, Z Z ) } . Questa regola inserisce una Z quando leggiamo una i.

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

P f = ({p:<l- r}, {t',e}, { , 0} , , , X o - M )


dove consiste di quattro regole.
1. (,(:, Xq) = {(/; Z X U)}. Questa regola fa partire Pp simulando P n , con X 0
come indicatore di fondo dello stack.
2. 6p(q. L Z ) = {(q ,Z Z ) ) . Questa regola inserisce una Z quando leggiamo una i,
simulando Pn .
3. (,. ) = {(q.t)}. Questa regola elimina una Z quando leggiamo una c,
simulando P n .
4. p ( q . f . X o) = {(r,e)}. In questo modo Pp accetta nei casi in cui P n svuota il
proprio stack.

6.2.4

Da stato finale a stack vuoto

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

P v = (Q U {}?,1 U {X},<5,v,7>(), Xq)


dove tfy definita come segue.
L 5v(po,Xo) = {(<7,^ )} Cominciamo inserendo il simbolo iniziale di Pp
nello stack e andando nello stato iniziale di Pp.
2. Per ogni stato q in Q, ogni simbolo di input a in ( n. = e) e ogni Y in ,
jv(q, a, Y ) contiene tutte le coppie presenti in S/r(q, a, Y). In altre parole P y
simula Pp.
3. Per tutti gli stati accettanti q in F e i simboli di stack Y in (o Y = XoX
e, Y ) contiene (p, e). Per questa regola, ogni volta che Pp accetta, P 1y pu
cominciare a vuotare il suo stack senza consumare ulteriore input.
4. Pertutti i simboli di stack Y in (o Y = Xo), (p, e, Y ) = {(p , e)}. Giunto nello
stato p , il che possibile solo quando Pp ha accettato, P y elimina ogni simbolo
nel suo stack fino a vuotarlo. Non si consuma altro input.
Dobbiamo ora dimostrare chc w in N ( P n ) se e solo se w c in L(Pp). Si procede
secondo la linea della dimostrazione del Teorema 6.9. La parte se una simulazione
diretta, mentre la parte solo-se richiede un esame delle poche operazioni che il PDA
costruito, P v , pu compiere.
(Se) Supponiamo (qo. tv, Zo) H ( 17. e, n) per uno stato accettante q e una stringa di stack

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

{po,w, X 0) L (0. w, Z 0X q) F (q, e, o X (l) F (p: e,e)


PjV

P jV

P 1V

dove q uno stato accettante di Py.


Oltre a ci, tra le ID ( ^ 1 w, Z oX 0) e (q, e, oX o), tutte le mosse sono mosse di Pp.
In particolare Xo non mai in cima allo stack prima di raggiungere la ID (</, e .a X y ).5
Concludiamo quindi che la stessa computazione pu avvenire in Pp-, ovviamente senza
\ ^
X 0 nello stack; in altre parole (q0.w, Z ()) F (q. e, a ). Cio Pp- accetta n per stato finale.
Pf

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.

{Z0, A., }, , qQ, Z0, { /} ) un PDA

^ 0, a, Z q ) = ((\, A A Z 0) (qo, b, Z0) = (q2, DZ0) 6(q0, e, Z0) = (/. e)


d(ql t a, A) = (qi,AAA)
(qi,b, A) = (<71, e)
(qi, c, Z0) = (q0, Z0)
'(<72, a, Ti) - (3 , c)
(q-2, b,t) = (q2, B B )
(q2, c. Z0) = (<70, Z0)
6(q:i. e,B) = (q2,e)
S(q-,t, Z0) = (^1. A Z 0)
Poich c una sola mossa per ogni insieme, abbiamo omesso le parentesi graffe dalle
regole.
* a) Scrivete una traccia di esecuzione (una sequenza di ID) a dimostrazione chc la
stringa bah in L(P).
b) Scrivete una traccia di esecuzione a dimostrazione che abb in L(P).
c) Scrivete il contenuto dello stack dopo che P ha letto b7a4.
! d) Descrivete in termini informali L(P).
Esercizio 6.2.6 Considerate il PDA P dell'Esercizio 6 . 1. 1.
a) Convertite P in un altro PDA Pi che accetta per stack vuoto lo stesso linguaggio
che P accetta per stato finale: ossia Ar(P l ) = L(P).
b) Trovate un PDA P2 tale che L(P2) = N (P ); tale cio che P2 accetta per stato
finale ci che P accetta per stack vuoto.
! Esercizio 6.2.7 Mostrate chc sc P un PDA, allora esiste un PDA P2 con due soli simboli
di stack tale che L(Lj2) = L(P). Suggerimento, date una codifica binaria dell'alfabeto di
stack di P.
*! Esercizio 6.2.8 Un PDA si dice vincolato se a ogni transizione pu aumentare l'altezza
dello stack di non pi di un simbolo. In altre parole, se 6 ( q ,a . Z ) contiene (p. 7 ), deve
essere |7 | < 2. Dimostrate che se P un PDA. allora esiste un PDA vincolato P3 tale chc
L(P) = L(Pa).

Equivalenza di PDA e CFG

6.3

253

Equivalenza di PDA e CFG

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

Dalle grammatiche agli automi a pila

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,

6(q, , .4) = {(</,$) I A una produzione di G)


2. Per ogni terminale a, S(q , a, a) = {(<7, e)}.
Esem pio 6.12 Convertiamo in PDA la grammatica delle espressioni della Figura 5.2,
riportata qui.

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 ) =

{ (g,e)}; S ( q , K b) = {(,*)}; <5(tf,0,0) =

{(?,)}; 6(q,(,() = {(<7<f)};


% , * , * ) = {(9,e)}

% , ) , ) ) = {(<L<:)};

{(<7: e)}; S(q, 1 .1 ) =

^(<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).

Equivalenza di PDA e CFG

255

DIMOSTRAZIONE Dimostriamo che w in N ( P ) se e solo se in L(G).

(Se) Supponiamo che w sia in L(G). Allora w ha una derivazione a sinistra

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

mosse, la base dimostrata.


Trattiamo ora il caso della seconda forma sentenziale sinistra e delle succes
sive. Assumiamo
( q , w , S ) (q, yi, a-i)
in d u z io n e

e dimostriamo (q ,w ,S ) F (, y,+1. a i+1). Essendo una coda, a comincia con una


variabile A. Inoltre il passo della derivazione 7 => 7 i+ i comporta la sostituzione di A
con il corpo di una delle sue produzioni, poniamo fi. Per la regola (1) della costruzione di
P possiamo sostituire A con fi in cima allo stack; per la regola (2) possiamo ora abbinare
i terminali in cima allo stack ai successivi simboli di input. Raggiungiamo cos la ID
(q. yi+i, fti+ i), che rappresenta la successiva forma sentenziale sinistra 7*+i
Per completare la dimostrazione notiamo che a n = t perch la coda di j n (cio w)
vuota. Quindi (q, w, S ) F (q, e, e), il chc dimostra che P accetta w per stack vuoto.
(Solo se) Dobbiamo dimostrare un fatto pi generale: chc sc P esegue una serie di mosse
il cui effetto finale quello di togliere una variabile A dalla cima dello stack senza mai
scendere sotto A nello stack, allora A genera in G la stringa di input consumata nel corso
di questo processo. Formalmente:
se (<7, .X, A) F (q, e, e), allora A => x.
P

Cj

La dimostrazione procede per induzione sul numero di mosse fatte da P.


BASE Una mossa. Il solo caso possibile che A e sia una produzione di G, e che sia

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

Le successive ri 1 mosse di P devono consumare x dallinput e produrre leffetto di


levare Yi , Y2, e cos via, dallo stack, uno per volta. Possiamo scomporre x in x \ x 2 Xk >
dove Xi la parte di input consumata fino a quando si elimina dallo stack Yi (quindi lo
stack all'inizio contiene k 1 simboli). A sua volta X2 la parte di input consumata nel
corso della eliminazione di Y2, e cos via.
La Figura 6.9 illustra come scomporre x c gli effetti corrispondenti sullo stack. La
figura suggerisce che B a C , quindi x diviso in tre parti, X\X2Xz, con x 2 = a.
Notiamo che in generale, se Yi un terminale, Xi devessere lo stesso terminale.

Figura 6.9 II PDA P consuma x ed elimina B a C dallo stack.


|

Deduciamo che (q , XiXi+ 1 Xk,Yi) I- (q, Xi 1 x k , e) per ogni i = 1 ,2 ,. . . , k. Inol


tre, se Yi una variabile, si applica lipotesi di induzione, perche nessuna sequenza pu
fare pi di ri 1 mosse. Concludiamo allora che Yi => Xi.
Se Yi un terminale, ci pu essere solo una mossa, che abbina lunico simbolo di X i
a Yt, che gli uguale. Anche in questo caso concludiamo che Yi U X i senza usare alcun
passo. Abbiamo ora la derivazione
A = * Y1Y2 Yfc 4
cio A 4

x.

XiY2 ---Yk 4

X1X2 ---Xk

Equivalenza di PDA e CFG

257

Per completare la dimostrazione, siano A = S e x = w. Poich sappiamo che w in


Ar(P ), sappiamo che (q, w, S) h ( q , e. e). Da quanto abbiamo dimostrato per induzione
ricaviamo S => w, ossia w appartiene a L(G).

6.3.2

Dai PDA alle grammatiche

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

avere l'effetto di eliminare U, e altre ancora di eliminare V. L'effetto finale che Y\


stata sostituita dal nulla, cio stata eliminata; i simboli di input letti fino a quel punto
formano X[.
La Figura 6.10 illustra anche il mutamento di stato. Supponiamo chc il PDA parta
dallo stato p0, con Yi in cima allo stack. Dopo le mosse il cui effetto leliminazione di
Y1, il PDA nello stato . Da l procede a eliminare Y leggendo la stringa di input x-,
per trovarsi, dopo un certo numero di mosse, nello stato p 2 , avendo eliminato Yi dallo
stack. Lelaborazione prosegue fino a eliminare dallo stack tutti i simboli.
La costruzione di una grammatica equivalente impiega variabili chc rappresentano
ciascuna un evento, con due componenti:
1. leliminazione effettiva di un simbolo X dallo stack
2. il passaggio dallo stato p allo stato q, dopo la sostituzione di X con e sullo stack.
Rappresentiamo questa variabile con il simbolo \pXq]. Questa sequenza di caratteri de
scrive uno variabile; non si tratta di cinque simboli distinti. La costruzione formale data
nel teorema seguente.
Teorem a 6.14 Sia P = (Q. . , S, qo, Z0) un PDA. Allora esiste una grammatica libera
dal contesto, G, tale che L(G) N ( P ) .
DIMOSTRAZIONE Costruiamo G = (V. , t, S), il cui insieme di variabili V contiene:

1. il simbolo speciale S comc simbolo iniziale


2. tutti i simboli della forma \pXq\, con p e q stati in Q , e X simbolo di stack in .
Le produzioni di G sono definite come segue.
a) Perogni stato p, G contiene la produzione S [q{)Z0p\. Il simbolo [qoZop] serve a
generare tutte le stringhe w che provocano l'eliminazione di Zo dallo stack di P nel
passare dallo stato qo a p. Formalmente (qo, w, Zo) F (p, e, e). Queste produzioni
indicano allora che lo stato iniziale S genera tutte le stringhe w che fanno svuotare
lo stack in P a partire dalla ID iniziale.
b) Supponiamo che S(q , , X ) contenga la coppia (r, Yl Yr2 Yk), dove:
L a un simbolo in oppure a = e
2. k un intero positivo arbitrario, eventualmente 0, nel qual caso la coppia
( e).

Equivalenza di PDA e CFG

259

Allora, per ogni sequenza di stati r .r ,. . . , rk, G contiene la produzione

[qXrk] -> [IWri Y2T2] - - [rk_ i Y kr k}


Questa produzione indica un modo di eliminare X e passare dallo stato q a rk:
leggere a (che pu essere r), usare parte dellinput per eliminare Y\ dallo stack,
passando dallo stato r a A1, quindi leggere unaltra parte dellinput per eliminare Y2.
dallo stack e passare da r i a r2, e cos via.
Dimostriamo ora che l'interpretazione informale delle variabili [qXp] corretta.
[q X p j

w se e solo se (q, w, X ) r (p, e, e).

(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

(q, w , X ) F (p. e, e) richieda n passi, con n >

1. La prima mossa deve avere la forma

(q. w , X ) h (r0, x, Y\Y2 Yk) (p, e, e)


dove w = ax per un a che r oppure un simbolo in . Ne deriva che la coppia
(r0, YxY2 - - Yk) devessere in S(q . a, X ) . Inoltre, per la costruzione di G , c una produ
zione [qXrk] a[r0V iri][riY 2r 2] [rk- i Yfcrfc], in cui:
1. rk = p

2. n , r 2, . . . , r k- 1 sono stati arbitrari in Q.


Come suggerito dalla Figura 6.10, osserviamo in particolare che i simboli Y j, V2, . . . . Yk
vengono eliminati dallo stack uno per volta, e che possiamo scegliere pi uguale allo stato
del PDA quando si elimina Yi, per i = 1 ,2 ,. . . . k 1. Sia x WiW2 wk, dove Wi
linput consumato nelleliminare Yi dallo stack. Vale allora (r. i, Wi , Yi) I- (r, c, c).
Poich ognuna di queste sequenze richiede meno di ri mosse, possiamo applicare lipalesi di induzione e concludere che [r_ \ Yjrl]
wi. Possiamo unire queste derivazioni
alla prima produzione applicata e dedurre la formula

[qXrk] =*> Qfr0Y ir1][ri l'Vr2] [rk - i Y krk] 4


awi[r\ Y2r2][r2Yxr3\ [rfc_iY fcr fc] 4
awxWzfoYzrs] [rfc_i Yfcrfc] =>
aw i l'2 * Wk = w

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

INDUZIONE Supponiamo che [qXp] => w in n passi, con n > I. Trattiamoesplicitamente

la prima forma sentenziale, che deve avere la forma


[ q X r k ]

=> a[r0yi r i Jfr1F2^] * [nt-i Vfcrfc] 4

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

(ri-iiWiWi+i w k , FjFi+1 Fa) h (r,wf+i wk . F - i Ffc)


Riunendo tutte le sequenze vediamo chc

(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

Equi valenza di PDA e CFG

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:

G = ({}, {*, e}, {S -> i S S j e}. S)

6.3.3

Esercizi

* Esercizio 6.3.1 Convertite la grammatica


S
A

-
->

OSI I A
IAO I S I

in un PDA che accetta per stack vuoto lo stesso linguaggio.

262

Capitolo 6

Esercizio 6.3.2 Convertite la grammatica

S
A

>

aA A
a S I bS I a

in un PDA che accetta per stack vuoto lo stesso linguaggio.


* Esercizio 6.3.3 Convertite in una CFG il PDA P = ({p, q}: {0,1}, {X. Zn}. 6, q , Z0),
con <i>definita da:

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).

! c) {0T'l rri I n < rn < 2??.}.


itI Esercizio 6.3.6 Dimostrate che se P un PDA, esiste un PDA P 1 con un solo stato tale
C heA r( P 1) = Ar( P ) .

! 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.

Autom i a pila deterministici

6.4

263

Automi a pila deterministici

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

Definizione di PDA deterministico

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

Figura 6.11 Un PDA detenu inisti co che accetta L wcwr.

6.4.2

Linguaggi regolari e PDA deterministici

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.

Autom i a pila deterministici

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

DPDA e linguaggi liberi dal contesto

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

DPDA e grammatiche ambigue

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?

Autom i a pila dctcrministici

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

Esercizio 6.4.1 Per ognuno dei seguenti PDA verificate se deterministico o no mo


strando che soddisfa la definizione di DPDA oppure trovando una o pi regole che la
violano.
a) Il PDA dellEsempio 6.2.
* b) Il PDA del lEsercizio 6.1.1.
c) Il PDA dellEserc zio 6.3.3.
Esercizio 6.4.2 Definite un automa a pila deterministico per ognuno dei seguenti linguag
gi:
7La dimostrazione del Teorema 6.19 compare ncU'Esercizio 6.4.3, ma possiamo vedere facilmente come
si costruisce P ' da P. Aggiungiamo un nuovo stato q, in cui P ' entra ogni volta che P si trova in uno stato
accettante e l'input successivo S. Nello stato q. P ' elimina tutti i simboli dallo stack. Inoltre P ' ha bisogno
dellindicatore di fondo dello stack per evitare uno svuotamento accidentale mentre simula P.

268

Capitolo 6

a) (O71I r" I n < m }


b) {0n l m I n > rn}
c) (O71I mO" I ri ed m sono arbitrari}.
Esercizio 6.4.3 Dimostrate il Teorema 6.19 in tre passi:
* a) mostrate chc se L = Ar(P ) per un DPDA P, allora L ha la propriet di prefisso
! b) mostrate che se L = A7(P ) per un DPDA P, esiste un DPDA P 1 tale che L =
L ( P t)
*! c) mostrate che se L ha la propriet di prefisso cd L(P') per un DPDA P ', esiste un
DPDA P tale che L = N (P ).
Esercizio 6.4.4 Mostrale che il linguaggio

L = {0 I n > 1} U (OriI 2'1 I Ti > 1}


un linguaggio libero dal contesto che non accettato da alcun DPDA. Suggerimento:
mostrate chc devono esistere due stringhe della forma On I n per valori differenti di n,
poniamo rii cd n 2, tali che un ipotetico DPDA per L entra nella stessa ID dopo aver letto
le due stringhe. In termini intuitivi il DPDA deve cancellare dal suo stack quasi tutto ci
che vi colloca durante la lettura degli 0, allo scopo di controllare che sia stato visto lo
stesso numero di 1. Dunque il DPDA non pu decidere se accettare dopo aver letto ri\ o
n- simboli 1.

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

Accettazione negli automi a pila: un PDA segnala laccettazione in due modi al


ternativi: entrando in uno stato accettante oppure vuotando lo stack. I due metodi
sono equivalenti, nel senso che qualunque linguaggio venga accettato tramite un
metodo accettato anche tramite laltro (da un altro PDA).
Descrizioni istantanee: per descrivere la condizione corrente di un PDA ci ser
viamo di ID composte da uno stalo, dallinput residuo e dal contenuto dello stack.
Una funzione di transizione h tra le ID rappresenta le singole mosse di un PDA.
Automi a pila e grammatiche: i linguaggi accettati dai PDA per stato finale o stack
vuoto sono esattamente i linguaggi liberi dal contesto.
Automi a pila deterministici: un PDA deterministico se non ha mai la scelta fra
mosse alternative per un dato stato, un simbolo di input (incluso e) e un simbolo di
stack. Inoltre non ha mai scelta tra una mossa che consuma input effettivo e una su
input e.
Accettazione negli automi a pila deterministici: i due modi di accettazione, per
stato finale e per stack vuoto, nei DPDA non hanno la stessa portata. I linguaggi
accettati per stack vuoto coincidono con quelli accettati per stato finale che hanno la
propriet di prefisso: nessuna stringa nel linguaggio il prefisso di unaltra parola
nel linguaggio stesso.
I linguaggi accettati dai DPDA: i DPDA accettano (per stato finale) tutti i linguag
gi regolari e alcuni linguaggi non regolari. I linguaggi dei DPDA sono liberi dal
contesto e hanno tutti CFG non ambigue. Perci si collocano, in senso stretto, tra i
linguaggi regolari e i linguaggi liberi dal contesto.

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

2. P. C. Fischer, On computability by certain classes of restricted Turing machines,


Proc. Fourth Anni. Symposium on Switching Circuit Theory and Logical Design
(1963), pp. 23-32.
3. D. E. Knuth, On the translation oflanguages from left to right, Information and
Control 8:6 (1965), pp. 607-639.
4. A. G. Oettinger, Automatic syntactic analysis and the pushdown store Proc. Sym
posia on Applied Math. 12 (1961), American Mathematical Society, Providence,
RI.
5. M. P. Schutzenberger, On context-free languages and pushdown automata, Informotion and Control 6:3 (1963), pp. 246-264.

Capitolo 7

Propriet dei linguaggi liberi


dal contesto
Completiamo lo studio dei linguaggi liberi dal contesto trattando alcune loro propriet.
Il nostro primo compito c semplificare le grammatiche libere dal contesto in modo da
dimostrare pi facilmente propriet dei CFL; se un linguaggio un CFL. possiamo infatti
provare che ha una grammatica di forma speciale.
Dimostreremo poi un pumping lemma per i CFL. Si tratta di un teorema analogo al
Teorema 4.1 per i linguaggi regolari, ma che pu essere usato per dimostrare che un
linguaggio non libero dal contesto. Successivamente considereremo propriet dei tipi
gi studiati per i linguaggi regolari nel Capitolo 4: propriet di chiusura e di decisione.
Vedremo che alcune propriet di chiusura (ma non tutte) di cui godono i linguaggi regolari
valgono anche per i CFL. Analogamente certe questioni riguardanti i CFL sono risolte da
algoritmi che generalizzano quelli sviluppati per i linguaggi regolari, ma esistono anche
questioni sui CFL cui non siamo in grado di dare risposta.

7.1

Forme normali per grammatiche libere dal contesto

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

2. Dobbiamo eliminare le e-produzioni, cio quelle della forma A * t per una


variabile A.
3. Dobbiamo eliminare le produzioni unitarie, cio quelle della forma A > B, con
A c B variabili.

7.1.1

Eliminazione di simboli inutili

Diremo che un simbolo X utile per una grammatica G = ( V , T , P , S ) se esiste una


derivazione della forma S => = w, dove w appartiene a T*. Notiamo che X pu
provenire da V o daT , e che laforma sentenziale X fi pu essere la prima o lultima della
derivazione. Se X non utile, diremo che inutile. Ovviamente il linguaggio generato da
una grammatica non cambia se omettiamo un simbolo inutile; possiamo quindi scoprirli
tulli ed eliminarli.
Per eliminarli, stabiliamo anzitutto due cose chc un simbolo deve poter fare per essere
utile.
A

>

1. Diciamo che X un generatore se esiste una stringa terminale w tale che X = w .


Ogni terminale un generatore perch genera se stesso tramite una derivazione di
zero passi.
2. Diciamo che X raggiungibile se esiste una derivazione S => per qualche
et e 3.
Un simbolo utile devessere senz'altro sia generatore sia raggiungibile. Se eliminiamo
prima i simboli non generatori e poi, dalla grammatica che ne risulta, i simboli non
raggiungibili, rimarranno solo, come dimostreremo, i simboli utili.
Esempio 7.1 Consideriamo la grammatica:

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

Ora soltanto S e a sono raggiungibili da S. Eliminando A e b rimane soltanto la


produzione S > a. Questa produzione forma da sola una grammatica il cui linguaggio
{a}, che coincide con quello della grammatica di partenza.
Se verifichiamo prima la raggiungibilit, scopriamo che tutti i simboli della gramma
tica

Forme normali per grammatiche libere dal contesto

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

da X un generatore. Quindi X => w.


G%

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

raggiungibile, quindi S => .


Gi

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

Concludiamo che X utile in G\ e che, poich X un simbolo arbitrario di G \, in G i


non ci sono simboli inutili.
Lultimo punto da dimostrare L(Gi) L(G). Come di consueto, per provare che
due insiemi coincidono dimostriamo che ciascuno contenuto nellaltro.

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

Calcolo dei smboli generatori e raggiungibili

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

simbolo di o generatore. Allora A generatore. Notiamo che la regola include il caso


in cui o = c; tutte le variabili che hanno e come coipo di una produzione sono senzaltro
generatori.
Esempio 7.3 Consideriamo la grammatica dellEsempio 7.1. Per la base, a e b sono
generatori. Per linduzione possiamo usare la produzione A > b per concludere chc A
generatore. A questo punto linduzione conclusa. Dato che non stato stabilito chc D c
generatore non possibile usare la produzione S AB. Linsieme di simboli generatori
dunque {a, 6, .4, S}.
Teorema 7.4 Lalgoritmo enunciato sopra trova tutti e soli i simboli generatori di G.
DIMOSTRAZIONE In una direzione si prova facilm ente, p er induzione su llo rdine in cui i
sim boli vengono aggiunti a llinsiem e dei generatori, che ogni sim bolo aggiunto davvero
un generatore. L asciam o al lettore questa parte della dim ostrazione.

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.

Forme normali per grammatiche libere dal contesto

275

BASE S sen zaltro raggiungibile.


INDUZIONE Supponiamo di aver scoperto che una ccrta variabile A raggiungibile. Allo

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

ma 7.4. Le lasciamo come esercizio.

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

ra 7? annullabile. Notiamo chc per essere annullabile ogni


deve essere una variabile:
dunque dobbiamo considerare unicamente le produzioni con sole variabili nel corpo.
Teorema 7.7 In una grammatica G i soli simboli annullabili sono le variabili trovate
mediante lalgoritmo descritto.

276

Capitolo 7

Lenunciato del teorema di fatto A annullabile se e solo se lalgo


ritmo la identifica come annullabile. Per la parte se, osserviamo che, grazie a una sem
plice induzione sullordine in cui vengono scoperti i simboli annullabili, da ognuno di essi
deriva effettivamente e. Per quanto riguarda la parte solo se, svolgiamo uninduzione
sulla lunghezza della pi breve derivazione A = e:.
D IM O ST R A Z IO N E

Un solo passo. Allora A + t devessere una produzione, e A viene scoperto nella


base dellalgoritmo.
BASE

jl

Supponiamo A => e in n passi, con n > I. Il primo passo sar A =>


G j G2 Ck => dove da ogni C 1deriva e in meno di n passi. Per lipotesi induttiva ogni
Ci dichiarala annullabile dall'algoritmo. Dalla produzione A => C \ C -2 C \ => e, con
il passo di induzione deduciamo che A annullabile.

in d u z io n e

Esemplifichiamo ora la costruzione di una grammatica priva di e-produzioni. Sia


G = ( V , T , P , S ) una Cf;G. Determiniamo tutti i simboli annullabili di G. Costruiamo
una nuova grammatica G i (V, T,
S), il cui insieme di produzioni Pi definito
come segue.
Per ogni produzione A X i X o X k di P, con k > 1, supponiamo che rn dei k
X i siano annullabili. La nuova grammatica G i avr 2m versioni della produzione, dove
le X i sono presenti o assenti in tutte le possibili combinazioni. C per uneccezione: se
w = k, ossia tutti i simboli sono annullabili (e quindi lo A). Non consideriamo pertanto
il caso in cui tutte le X i sono assenti. Notiamo inoltre chc se una produzione della forma
A * e c in P , non la collochiamo in Pi .
Esem pio 7.8 Consideriamo la grammatica

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

Forme normali per grammatiche libere dal contesto

277

annullabile a c presente comunque. Le quattro scelte danno le produzioni:

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

Concludiamo lo studio relativo alleliminazione delle e-produzioni dimostrando che


la costruzione esemplificata sopra non trasforma il linguaggio, salvo il fatto chc e non
pi presente se lo era nel linguaggio di G. Poich chiaro che la costmzionc elimina le
e-produzioni, avremo una dimostrazione compieta deHaffermazione che per ogni CFG G
esiste una grammatica G i priva di e-produzioni tale che

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

in L(G). Come capita spesso, pi facile dimostrare un enunciato pi generale. In questo


caso dobbiamo occuparci delle stringhe terminali generate da ciascuna variabile, anche se
ci interessa solo quanto viene generato dal simbolo iniziale S. Dimostreremo dunque:
A

4 => w se e solo se A => w e w e.


G1

Cr

In ciascun caso la dimostrazione uninduzione sulla lunghezza della derivazione.


(Solo se) Supponiamo che A => w. Allora senzaltro w e perch G i non ha eGi

produzioni. Dobbiamo mostrare per induzione sulla lunghezza della derivazione che
4 =* w.
c

278

Capitolo I

BASE Un passo. Allora esiste una produzione A w in G\. Per la costruzione di G\

esiste in G una produzione A a, tale chc o w, con zero o pi variabili annullabili


intercalate. Dunque A = a => w in G, dove i passi successivi al primo, se ce ne sono,
G

generano c. da tutte le variabili presenti in a.


INDUZIONE Supponiamo che la derivazione compia n > 1 passi. Allora la derivazione

sar .4 => X y X ^ Xk => w. La prima produzione applicata deve provenire da una


Gi

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

una variabile, la derivazione X i = w, compie meno di n passi. Per lipotesi induttiva


O1

possiamo concludere che X t => Wi .


Costruiamo ora una derivazione corrispondente in G:

A => YyY2 Ym => X]X'2 Xh => W\W'2 Wk tv


G

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

BASE Un passo. In questo caso A > w una produzione di G. Poich w e, questa


Si

produzione anche una produzione di G i, e A => w.


Gi

INDUZIONE Supponiamo chc la derivazione compia n > 1 passi. Allora la derivazione


sar A => > Yrn => w. Possiamo scomporre w = W1 W2 **wm in modo chc
a

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

c concludere che se Wj e, allora Yj => Wj. Dunque A = .Y1A'2 X k => w.


Gl

Cl

Cri

Completiamo ora la dimostrazione. Sappiamo che w in L(G\ ) se e solo sc S => w.

Forme normali per grammatiche libere dal contesto

279

pf(

Ponendo A S otlcniamo che w in L( Gi ) se c solo se S => w e w c. In altre parole


CJ

w in L(G \) se e solo se w in L(G) e w t.

7.1.4

Eliminazione delle produzioni unitarie

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

una produzione, dove C una variabile. Allora (A C ) una coppia unitaria.


Esempio 7.10 Consideriamo la grammatica delle espressioni dell'Esempio 5.27 riprodot
ta sopra. La base produce le coppie unitarie (E, E), ( T , T), (F, F ) e (7. 7). Per quanto
riguarda il passo induttivo possiamo fare le seguenti deduzioni:
1. (E, E) c la produzione E ^ T danno la coppia unitaria (E. T)

2. (E, T) c la produzione T > F danno la coppia unitaria (E, F )


3. (E, F) e la produzione F > 1 danno la coppia unitaria (E. T)
4. (T , T) e la produzione T >F danno lacoppia unitaria (T, F)
5. (T, F ) e la produzione F > / danno la coppia unitaria (T, I)
6. (F, F ) e la produzione F * I danno la coppia unitaria (F, 7).
Non si possono dedurre altre coppie: queste dieci rappresentano effettivamente tutte le
derivazioni che applicano solo produzioni unitarie.
Lo schema dovrebbe essere ormai familiare. Il fatto che lalgoritmo proposto generi tutte
le coppie attese si basa su una semplice dimostrazione. Sfruttiamo quindi queste coppie
per eliminare le produzioni unitarie da una grammatica e provare che i linguaggi delle due
grammatiche coincidono.
Teorema 7.11 L'algoritmo descritto determina le coppie unitarie di una CFG G.
DIMOSTRAZIONE In una direzione si tratta di una semplice induzione sullordine in cui

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.

Forme normali per grammatiche libere dal contesto

281

INDUZIONE Supponiamo che .4 => P operi in n passi, per n > 0, dove a ogni passo si

applica una produzione unitaria. La derivazione de! tipo

A 4

C=>B

)|C

La derivazione A => C compie n 1 passi; per lipotesi induttiva scopriamo dunque


la coppia (/L C). La parte induttiva dellalgoritmo combina poi la coppia (A, C ) con la
produzione C > B per dedurre la coppia (A, B).
La procedura per eliminare le produzioni unitarie costruisce la CFG Gy = (V, T i P i , S)
a partire da una CFG G = (Vt T t P i S ) in due fasi.
1. Si determinano tutte le coppie unitarie di G.
2. Per ogni coppia unitaria (A, B) si aggiungono a P 1 tutte Ic produzioni A * a,
dove B ? a una produzione non unitaria in P . Si noti che pu essere A = t\ in
tal modo P i contiene tutte le produzioni non unitarie di P.
Esempio 7.12 Riprendiamo LEsempio 7.10, in cui abbiamo svolto il passo ( 1) della co
struzione descritta sopra per la grammatica delle espressioni dellEsempio 5.27. La Figu
ra 7.1 illustra il passo (2) dellalgoritmo, dove formiamo il nuovo insieme di produzioni
usando il primo membro di una coppia come testa c tutti i corpi non unitari per il secondo
membro della coppia come corpi delle nuove produzioni.
Coppia

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 [

essere sostituito da uno o pi passi di derivazione in G. Unendo queste sequenze di passi


concludiamo che S => w.
G
(Solo se) Supponiamo ora che w sia in L(G). Per le equivalenze del Paragrafo 5.2 sap
piamo che w ha una derivazione a sinistra, ossia S =- w. Ogni volta che si usa una
Im

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.

Forme normali per grammatiche libere dai contesto

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

Forma normale di Chomsky

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

Cominciamo da (a). Per ogni terminale a che compare in un corpo di lunghezza 2 o pi


creiamo una nuova variabile, A. Questa variabile ha una sola produzione, A > a. D ora
in poi adoperiamo A anzich a in tutti i corpi di lunghezza 2 o pi. A questo punto il
corpo di ogni produzione o un terminale o una sequenza di almeno due variabili senza
terminali.
Per il punto (b) dobbiamo scomporre le produzioni A
B i B 2 B k, con k > 3, in
una serie di produzioni con due variabili in ogni corpo. Definiamo k 2 nuove variabili,
C \ , C2, ., Ck 2 La produzione originale va sostituita con le k: 1 produzioni

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

Forme normali per grammatiche libere dal contesto

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

Figura 7.3 Corpi costituiti da un terminale o da due variabili.

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

derivazione in G2 diventa quindi uno o pi passi nella derivazione di w mediante le pro


duzioni di G\. Se un X 1 terminale, sappiamo che Gi ha una variabile corrispondente
Bj e una produzione B > X i. Se k > 2, G j ha le produzioni A > B \ G, Gi B 2C2,
e cos via, dove Bi la variabile introdotta per il terminale X o X i stessa, nel caso
questa sia una variabile. Queste produzioni simulano in G i un passo di una derivazione
di G 2 che usa A X i X 2 Xk- Concludiamo che in G i c una derivazione di w, e
quindi w in L(G\ ).
(Se) Sia w in L(G 1). Allora esiste un albero sintattico in G i con S alla radice e w come
prodotto. Lo convertiamo in albero sintattico di G2, ancora con radice S e prodotto w.
Per prima cosa dobbiamo disfare la parte (b) della costruzione CNF. Supponiamo
che ci sia un nodo etichettato A, con due figli etichettati B i e G , dove C\ una delle
variabili introdotte al punto (b). Questa parte dellalbero sintattico ha quindi la forma
della Higura 7.4(a). Infatti, poich le variabili introdotte hanno ciascuna una sola produ
zione, esse possono comparire in un solo modo e, come abbiamo visto, tutte le variabili
introdotte per la produzione A >B \ B 2 B k devono comparire insieme.
Ognuno di questi grappoli di nodi dev'essere sostituito dalla produzione che rappre
senta. La trasformazione dellalbero illustrata nella Figura 7.4(b).
Non ancora detto che lalbero risultante sia un albero sintattico di G2. Infatti il pas
so (a) della costruzione di CNF introduce altre variabili da cui derivano singoli terminali.
D'altra parte possiamo rilevarle nell'albero corrente e sostituire un nodo etichettato da
una tale variabile A e il suo unico figlio, di etichetta a, con un solo nodo di etichetta a.
Ogni nodo interno dell'albero forma ora una produzione di G2. Poich w il prodotto di
un albero sintattico in G2, concludiamo che w in L(G 2).

7.1.6

Esercizi

* Esercizio 7.1.1 Trovate una grammatica equivalente a

S
A
B
C

A B ICA
a
B C IAB
- aB \ b

senza simboli inutili.


* Esercizio 7.1.2 Considerate la grammatica:

Forme normali per grammatiche libere dal contesto

287

(b)

F ig u ra 7.4 Un albero sintattico in Gi deve usare le nuove variabili in un modo specifico.

288

Capitolo 7

Forma normale d Greibach


C unaltra forma normale interessante, per la quale non daremo dimostrazioni.
Ogni linguaggio non vuoto privo di e L(G) per una grammatica G le cui pro
duzioni sono della forma A * , dove o un terminale e a una stringa di zero
o pi variabili. Convertire in questa forma una grammatica complesso, anche
se il compito risulta pi facile se si parte, per esempio, da una grammatica in for
ma normale di Chomsky. Per sommi capi, espandiamo la prima variabile di ogni
produzione fino a raggiungere un terminale. Per via di possibili cicli in cui non
si raggiunge mai un terminale, si deve per cortocircuitare la procedura defi
nendo una produzione che inserisca nel corpo un terminale come primo simbolo,
seguito da variabili che generano tutte le sequenze di variabili che sarebbero state
generate nel corso della derivazione di quel terminale.
Questa forma, detta forma normale di Greibach perche Sheila Greibach fu
la prima a descrivere un modo per costruirla, ha diverse propriet interessanti.
Poich lapplicazione di una produzione introduce esattamente un terminale nella
forma sentenziale, una stringa di lunghezza n ha una derivazione di esattamente
n passi. Inoltre, se applichiamo la costruzione dei PDA del Teorema 6.13 a una
grammatica in forma normale di Greibach. otteniamo un PDA senza e-transizioni;
si dimostra cos chc sempre possibile eliminarle da un PDA.

ed eseguite nellordine i passi seguenti.


a) Eliminate le -produzioni.
b) Eliminate le produzioni unitarie.
c) Eliminate i simboli inutili.
d) Costruite la forma normale di Chomsky.
Esercizio 7.1.3 Ripetete !Esercizio 7.1.2 per questa grammatica:
5
A
B
C

-
-

OAO I I i i l I B B
C
S IA

Esercizio 7.1.4 Ripetete lEsercizio 7.1.2 per la seguente grammatica:

Forme normali per grammatiche libere dal contesto

S
A
B

->

289

A A A IB
aA I B
(

Esercizio 7.1.5 Ripetete lEsercizio 7 .1.2 per la seguente grammatica:

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

I )/{n I ) passi. Quanto ci si pu effettivamente avvicinare al limite?


Esercizio 7.1.8 Sia C una grammatica con n produzioni, priva di e-produzioni; suppo
niamo di averla convertita in CNF.
a) Dimostrate che la grammatica CNF ha 0(n?) produzioni.
b) Dimostrate che la grammatica CNF pu avere un numero di produzioni propor
zionale a n 2. Sugge rmenlo: esaminate la procedura che elimina le produzioni
unitarie.
Esercizio 7.1.9 Scrivete le dimostrazioni induttive che completano i seguenti teoremi.
a) La parte del Teorema 7.4 in cui si prova che i simboli rilevati sono effettivamente
generatori.
b) Le due direzioni del Teorema 7.6, in cui si dimostra la correttezza dellalgoritmo
del Paragrafo 7.1.2 per determinare i simboli raggiungibili.
c) La parte del Teorema 7 .1 1 in cui si dimostra che tutte le coppie rilevate sono
effettivamente unitarie.
Esercizio 7.1.10 Per ogni linguaggio libero dal contesto e privo di e, possibile trovare
una grammatica le cui produzioni siano tutte della forma A * B C D (corpo fatto di
tre variabili) oppure della forma A a (corpo fatto di un solo terminale)? Dimostrate
questo enunciato o fornite un controcsempio.

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

tutte le altre produzioni di A i . Notiamo che ogni pj deve cominciare o con un


terminale o con una variabile di indice maggiore di i. Introduciamo una nuova
variabile, B i, e sostituiamo le prime m produzioni con

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:

Il pumping Icnnmi per i linguaggi liberi dal contesto

7.2

->

->

291

A A IO
SS I 1

II pumping lemma per i linguaggi liberi dal contesto

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

Dimensione degli alberi sintattici

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.

n = I. Ricordiamo chc in un albero la lunghezza di un cammino il numero di


archi, cio il numero dei nodi meno uno. Perci un albero con una lunghezza massima
dei cammini pari a 1 consiste nella sola radice e in una foglia, etichettata da un terminale.
La stringa w questo terminale, quindi \w\ = 1. Poich in questo caso 2"_1 = 2 - 1,
la base provata.

BASE

INDUZIOiNE Supponiamo che il cammino pi lungo abbia lunghezza n , con n > 1. La

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

di induzione, i due sottoalberi hanno ciascuno un prodotto di lunghezza al pi 2 - 2 . Il


prodotto dell'intero albero la concatenazione dei loro prodotti, e ha quindi lunghezza
non superiore a 2n~2 + 2n~2 = 2n~i . Abbiamo cos provato il passo induttivo.

7.2.2

Enunciato del pumping lemma

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

normale di Chomsky. Questo non tecnicamente possibile se L il CFL 0 o {f}. D'altra


parte se L = 0, l'enunciato del teorema, che si riferisce a una stringa z in L . non pu
essere violato perch in 0 non c nessuna stringa. Inoltre la grammatica CNF G genera
in realt L - {e}, ma questo irrilevante perch sceglieremo n > 0. nel qual caso 2 non
pu comunque essere e.
Fissata ora una grammatica CNF G = (V ,T, P, S) tale che L(G) = L { r}, suppo
niamo che G abbia rn variabili. Scegliamo n = 2m. Supponiamo poi che z in L sia lunga
almeno ri. Per il Teorema 7.17 un albero sintattico il cui cammino pi lungo sia lungo rn,
o meno, ha un prodotto di lunghezza 2m_1 = n f 2, o meno. Un tale albero sintattico non
pu avere z come prodotto perch 2 troppo lunga. Ogni albero sintattico con prodotto 2
ha perci un cammino di lunghezza almeno pari a m + 1.
La Figura 7.5 illustra il cammino pi lungo nellalbero per z, dove k almeno rn e
il cammino lungo k + 1. Poich k > rn, lungo il cammino ci sono almeno rn + 1
occorrenze di variabili A0, A \ , . . . , A k. Ma in V ci sono solo m variabili distinte, quindi
almeno due delle ultime m -1-1 variabili del cammino (da A k,n ad Ak incluse) devono
essere uguali. Supponiamo A = A 1, con k rn < i < j < k.
Possiamo allora dividere l'albero come illustrato nella Figura 7.6. La stringa w il
prodotto del sottoalbero radicato in A r Le stringhe v e x sono quelle a sinistra e a destra
di w nel prodotto del sottoalbero pi grande, radicato in A i. Si osservi che, non essendoci

Il pumping lemma per i linguaggi liberi dal contesto

293

F ig u ra 7.5 Una stringa sufficientemente lunga in L deve avere un cammino lungo nel
suo albero sintattico.

produzioni unitarie, v e x non possono essere entrambe e. Infine u e y sono le parti di z a


sinistra e a destra del sottoalbero radicato in A i.
Se Ai = Aj = A, possiamo costruire nuovi alberi sintattici a partire da quello ori
ginale, come illustrato nella Figura 7.7(a). Possiamo anzitutto sostituire il sottoalbero
radicato in A i, chc ha prodotto vwx, con quello radicato in A j , che ha prodotto w. Pos
siamo farlo perche' ambedue gli alberi hanno la radice etichettata A. Lalbero risultante,
illustrato nella Figura 7.7(b), ha come prodotto la stringa uury e corrisponde al caso i - U
nello schema u v lw x %y.
La Figura 7.7(c) suggerisce unaltra possibilit. Qui il sottoalbero radicato in A j
stato sostituito dallintero sottoalbcro radicato in At. Loperazione valida per Io stesso
motivo di prima: sostituiamo un albero con radice etichettata A con un altro avente la
stessa caratteristica. Il prodotto di questo albero u v 2w x 2y. Se ora sostituissimo il
sottoalbero della Figura 7.7(c) che ha come prodotto w con il sottoalbero pi grande, di
prodotto vwx, otterremmo un albero di prodotto uv3w x 3y. Potremmo continuare cos
per ogni esponente i. In G ci sono quindi alberi sintattici per tutte le stringhe di forma
U v 1W X 1XJ, e il lemma quasi dimostrato.
Lultimo dettaglio la condizione (1), che dice \vwx\ < n. Poich abbiamo scelto A i
vicino alla base dellalbero (k i < m), il cammino pi lungo nel sottoalbero radicato in
A i non pu essere pi lungo di m + 1. Per il Teorema 7.17 la lunghezza del prodotto del
sottoalbero radicato in A i non pu superare 2m = n.

294

Capitolo 7
S

F igura 7.6 Scomposizione della stringa w.

7.2.3

Applicazioni del pumping lemma per i CFL

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.

11 pumping lemma per i linguaggi liberi dal contesto

295

F igura 7.7 Le stringhe v e x, replicate prima zero, poi due volte.

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.

Esempio 7.21 Sia L = {ww \w in {0.1}*}. L consiste di stringhe ripetute, come


e, 0101, 00100010 0 110110. Supponiamo L libero dal contesto, c sia n la costante del
pumping lemma. Consideriamo la stringa 2 = On I nOn I n . La stringa la ripetizione di
On I n, ed quindi in L.
Prendendo spunto dagli esempi precedenti scomponiamo 2 = uvwxy in modo che
< n e vx e. Proveremo che uwy non in L, dimostrando cos per assurdo chc
L non libero dal contesto.
Osserviamo per prima cosa che da vwx < n segue \uwy\ > 3n. Perci se uwy
una stringa ripetuta, come ft, la lunghezza di t e almeno 3n/2. A seconda della posizione
di vwx in 2 dobbiamo considerare diversi casi.
1. Supponiamo che vwx sia nei primi n 0. In particolare sia vx fatto di k 0, con
k, > 0. Allora uwy comincia con 0n-fcl n. Poich \uwy\ in k, sappiamo che

Il pumping lemma per i linguaggi liberi dal contesto 297


se uwy tt si ha |f| = 2n - k j 2. Pertanto t termina dopo il primo blocco di I , e
quindi termina con uno 0. Ma uwy termina in 1, e non pu essere uguale a tt.

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}.

! f) {wwRw I w una stringa di 0 e I }, cio l insieme delle stringhe formate da una


stringa w seguita dalla stessa stringa rovesciata, e ancora da
come 0 0 1 1 0 0 0 0 1 .

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

3. per ogni i, uvwxly in L.


Dimostrate il lemma di Ogden. Suggerimento: la dimostrazione coincide con quella del
Teorema 7.18, se fingiamo che le posizioni non privilegiate di 2 siano assenti quando
scegliamo un cammino lungo nellalbero sintattico di 2.
* Esercizio 7.2.4 Applicate il lemma di Ogden (Esercizio 7.2.3) per semplificare la dimo
strazione dellEsempio 7.21 che L = {ww \
w in {0. 1}*} non un CFL. Suggerimento:
con 2 = On I nOn I " dichiarate privilegiati i due blocchi mediani.
Esercizio 7.2.5 Per mezzo del lemma di Ogden (Esercizio 7.2.3) dimostrate che i seguenti
linguaggi non sono CFL.
! a) (O1I j Ofc I j =--max(i, Ar)}.
!! b) {anbncl I i ri}. Suggerimento: se n la costante del lemma di Ogden. conside
rate la stringa 2 = anbncn'.

Propriet di chiusura dei linguaggi liberi dal contesto 299

7.3

Propriet di chiusura dei linguaggi liberi dal contesto

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

anibn an'2bn'2 onk bnk


per qualche A: > 0 e per qualsiasi sequenza di interi positivi ny.n^.
comprende fra le sue stringhe e, aabbaaabbb e abaabbabab.

11 linguaggio

Teorema 7.23 Sc I un linguaggio libero dal contesto sullalfabeto , ed s una


sostituzione su tale chc s(a) un CFL per ogni a in , allora s(L) un CFL.

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).

V' lunione di V c di tutti i Va, per a in .


T' l'unione di tutti i Ta, per a in .
P' contiene:
1. tutte le produzioni in ogni Pn, per a in
2 . Ie produzioni di P . nei cui corpi ogni terminale a sostituito da Sa.

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

Propriet di chiusura dei linguaggi liberi dal contesto 301

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.

in , sono disgiunte. Perci in vetta alFalbero, a partire da S, si applicano solo produzioni


di G fino a derivare simboli Sa, al di sotto dei quali si applicano solo produzioni di G a.
Di conseguenza, se w ha T come albero sintattico, possiamo determinare una stringa
a.\a.2 a in L(G) e stringhe X i nel linguaggio s(a) tali che:

1. w = .T1X2

2. la stringa Sllt Sa2 San il prodotto di un albero formato da T eliminando alcuni


sottoalberi (come suggerito nella Figura 7.8).
Ma la stringa x
Xn in s(L), essendo formata dalla sostituzione di ogni a con .x.
Concludiamo che w in s(L).

7.3.2

Applicazioni del teorema di sostituzione

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

3. chiusura (*) e chiusura positiva (+)

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.

2. Concatenazione: siano L\ ed L2 due CFL. Allora LyL2 il linguaggio fi(L), dove


il linguaggio { 1 2 } ed .s la stessa sostituzione del caso ( 1).
3. Chiusura e chiusura positiva: siano Ly un CFL. L il linguaggio { 1 }* ed s la sosti
tuzione .s(l) = L i; allora L\ = s(L). Analogamente, se L invece il linguaggio
{ 1 }+, allora Ljt = '().
4. Sia L un CFL sullalfabeto e sia h un omomorfismo su . Sia s la sostituzione
chc rimpiazza ogni simbolo a in con il linguaggio formato dalla sola stringa h(a).
Cio $(a) = {h(a)} per ogni a in . Allora h(L) = s(L).

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.

Teorema 7.25 Se L un CFL. allora lo anche Ln .


DIM OSTRAZIONE Sia L = L(G) per un CFL G = (V ,T ,P,S). Costruiamo G r =
(V, , P R, S), dove P r linsieme degli inversi delle produzioni in P: se A > a
una produzione di G, A > a n una produzione di G n . Una semplice induzione sulla
lunghezza delle derivazioni in G e G r dimostra che L (G n) = Ln . In sostanza tutte le
forme sentenziali di G n sono inversi di forme sentenziali di G , e viceversa. Ne lasciamo
la dimostrazione formale come esercizio.

7.3.4

Intersezione con un linguaggio regolare

I CFL non sono chiusi rispetto alloperazione di intersezione. Lo prova un semplice


esempio.

Propriet di chiusura dei linguaggi liberi dal contesto 303


Esempio 7.26 NellEsempio 7.19 abbiamo visto che il linguaggio

L = {0n l" 2 n | n > 1}


non c libero dal contesto. D'altra parte i due linguaggi che seguono lo sono.

L1 = {0 12* I n > 1,* > 1 }


L2 = {0*l 2n I n > L i > 1}
Una grammatica per L\ ad esempio la seguente:

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.

Teorema 7.27 Se L un CFL ed P un linguaggio regolare, L i) R h un CFL.


DIMOSTRAZIONE Ci serviamo delle rappresentazioni dei CFL mediante automi a pila e

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

Figura 7.9 Un PDA e un FA eseguiti in parallelo formano un nuovo PDA.

Formalmente sia

P = (? ; , , ,., Fp )
un PDA che accetta L per stalo finale, e sia

A = (Q.4, , <$4, fjf.4, F 4 )


un DFA per R. Definiamo il PDA

P' = (Q p X Q a , , . <5, (qp, <7,4 ), Z 0. Fp x F a )


dove S((q. p), , X ) per definizione linsieme delle coppie ((r, .s),7 ) tali che:
/V

1 .s = Sa (P>a)

2. la coppia (r, ) appartiene a Sp(q, a, X ).


Ogni mossa del PDA P pu essere compiuta anche in P'\ inoltre un secondo componente
dello stato di P ' tiene traccia dello stato del DFA A. Notiamo che a pu essere un simbolo
di o t. Nel primo caso ( , a) =
mentre se a = e, allora <5(jy, a) = p ; dunque A
non cambia stato mentre P muove su input e.
A

Propriet di chiusura dei linguaggi Jiben dal contesto 305


Una semplice induzione sul numero di mosse fatte dal PDA dimostra che ( q p , w, Z q ) F
*
P
( q . e , 7 ) se e solo se ( ( q p . q A ) , w , Z q ) F; ((<M>); e, 7 ), dove p = ( , w ) . Lasciamo
le induzioni per esercizio. Poich ( q . p ) uno stato accettante di P' se e solo se q uno
stalo accettante di P e p e accettante in .4, concludiamo che P ' accetta w se e solo se sia
P sia A accettano, cio se w in L R.

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 =

{ , c },{Z ,X q},5f . p ,X q, {r})

dove S p cos specificata:


1. . (p,e, X 0) = {(q, Z X q)}

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

(p,s),X 0,{r} x {.s,i})

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.

1: ((, a), e, X 0) = {((</, s), Z X c,)}.


2a: S{(q,s),i,Z) = {((q, s), ZZ)}.
36: S((q,f),c,Z) = {((q,t),e)}.
4: <((g, .s), c, Xo) = { ((r. s), e)}. Nota: possiamo provare che questa regola non si
applica mai perche impossibile togliere dallo stack senza aver visto un e, e quando
F vede un e, il secondo componente del suo stato diventa t,.

3c: S((q,t.),e,Z) = { ((^ ,i),r)} .


4: 6({q,t),e,X 0) = { ((r,i),e )}.
11 linguaggio L R l insieme delle stringhe composte da un certo numero di i seguiti
da un e in pi, cio {nen+1 j n > 0}. Si tratta proprio dellinsieme di violazioni fatte
di un blocco di if seguito da un blocco di else. Il linguaggio evidentemente un CFL,
generato dalla grammatica con le produzioni S > iSe |e.
Osserviamo che il PDA P accetta il linguaggio L R. Dopo aver inserito uno Z
nello stack, ne inserisce altri in risposta agli input i, rimanendo nello stato [q, s). Quando
vede un c:, va nello stato (r/, t) e comincia a svuotare lo stack. Lautoma muore se vede
un i\quando X () compare in cima allo stack compie una transizione spontanea allo stato
(r, f) e accetta.
Dal fatto che i CFL non sono chiusi rispetto al l'intersezione, ma lo sono rispetto
all intersezione con un linguaggio regolare, ricaviamo le propriet relative alle operazioni
di differenza e complemento, compendiate nel teorema seguente.
Teorema 7.29 Siano L, Ly ed L i tre CFL, ed R un linguaggio regolare.
1. L R e un linguaggio libero dal contesto.
2 . L pu non essere libero dal contesto.

3. L i L 2 pu non essere libero dal contesto.

Propriet di chiusura dei linguaggi liber da/ contesto 307


DIMOSTRAZIONE Per ( 1) notiamo che L - I l - L R. Se R regolare, per il Teorema 4.5
anche R regolare. Quindi, per il Teorema 7.27, L - R b un CFL.
Per (2) supponiamo che L sia libero dal contesto quando lo e L. Poich

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

Riprendiamo dal Paragrafo 4.2.4 loperazione detta "omomorfismo inverso". Se h un


omomorfismo ed L un linguaggio, I r i (L) l'insieme delle stringhe w tali che h(w)
in L. La dimostrazione che i linguaggi regolari sono chiusi per omomorfismo inverso
indicala nella Figura 4.6, dove si illustra come definire un automa a stali finiti che elabora
un simbolo di input a applicandogli un omomorfismo h e simulando un altro automa a
stati finiti sulla sequenza h(a).
La stessa propriet di chiusura, ma per i CFL, si pu dimostrare in modo molto simile
impiegando i PDA in luogo degli automi a stali finiti. I PDA presentano per un problema
che gli automi a stati finiti non hanno. Lazione di un automa a stati finiti su una sequenza
di input una transizione di stato, e quindi, rispetto al nuovo automa, affine a una mossa
singola.
Se lautoma un PDA. invece, una sequenza di mosse pu non equivalere a una mossa
su un solo simbolo di input. In particolare il PDA pu, in n mosse, eliminare n simboli
dallo stack, mentre in una mossa ne pu eliminare uno solo. La costruzione per i PDA
analoga alla Figura 4.6 perci un po' pi complessa ed illustrata nella Figura 7.10.
L'adattamento consiste nel collocare h(o) in un buffer dopo aver letto l input . I
simboli di h(a) vengono passati, uno alla volta, al PDA da simulare. Il nuovo PDA legge
un altro simbolo di input e gli applica l'omomorfismo solo quando il buffer vuoto. Nel
prossimo teorema formalizziamo questa costruzione.
Teorema 7.30 Sia L un CFL e h un omomorfismo. Allora h~ (L) un CFL.
DIMOSTRAZIONE Supponiamo che h si applichi ai simboli dellalfabeto e produca strin
ghe in T*. Assumiamo anche che L sia un linguaggio sullalfabeto 7 . Come suggerito

Capitolo I

308

Input

Accetta/
rifiuta

Figura 7.10 Costruzione di un PDA che accetta Fomomorfismo inverso del linguaggio di
un PDA assegnato.

in precedenza partiamo da un PDA P = (Q ,T ,r,8,qo,Zo,F) che accetta L per stato


finale. Costruiamo un nuovo PDA

P' = (<?', , . 8', (0 . e). Z0. F x {e})

(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.

Propriet di chiusura dei linguaggi liberi dal contesto 309


X ) = { ^(, h(a)), X j } per ogni simbolo a in , ogni stato q

(a)

in Q e ogni simbolo X di stack in . Notiamo che qui a non pu essere e.


Quando il buffer vuoto, P 1pu consumare il simbolo di input successivo a
e collocare h(a ) nel buffer.
(b) Se 5(q, b. X ) contiene (p. 7 ), dove b in T o b = e, allora

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

Esercizio 7.3.2 Considerate i due linguaggi seguenti:


L i = {anb2ncm I n , m > 0}
L2 = {anbmc2m I n .m > 0 }
a) Dimostrate che sono entrambi liberi dal contesto definendo una grammatica per
ognuno.
! b) L i L2 un C1FL? Giustificate la risposta.
Esercizio 7.3.3 Dimostrate che i CFL non sono chiusi rispetto alle seguenti operazioni.
* a) min, definita nell'Esercizio 4.2.6(a).
b) max, definita nellEserczio 4.2.6(b).
c) half, definita nell*Esercizio 4.2.8.
d) alt, definita nellEsercizio 4.2.7.

Esercizio 7.3.4 Definiamo shuffle di due stringhe w e x l insieme di tutte le stringhe


ottenute intercalando arbitrariamente le posizioni di w e x. Pi esattamente, shuffle(w, x)
l insieme delle siringhe z tali che:
1. ogni posizione di 2 si possa attribuire a w o a x, ma non a entrambi
2. Ie posizioni di 2 attribuite a w formano w se lette da sinistra a destra
3. Ie posizioni di 2 attribuite a x formano .r se lette da sinistra a destra.
Per esempio, se w = O le x = 110, shuffle(01. 110) e linsieme di stringhe {01110,01101,
10110,10101, I 1010, 11001}. Per illustrare il ragionamento: la terza stringa, 10110, si
ottiene attribuendo la seconda e la ciuinla posizione a 01 e le altre a I 10 : la prima stringa.
0 1 1 1 0 , si pu ottenere in tre modi attribuendo la prima posizione e una fra la seconda,
la terza e la quarta a 01, le altre tre a HO. Possiamo estendere loperazione ai linguaggi
definendo shuffle(L \
, L2) come l'unione su tutte le coppie di stringhe, w in L 1 e x in L2,
di shuffle(w, x).
a) Che cos' shuffle(00,111)?
* b) Che cos Shuffle(Ll ^L2) se L 1 =

1(0 ) e L2 = {0n l n |n > 0 } ?

*! c) Dimostrate che se L i ed L2 sono linguaggi regolari, lo anche

shuffle(Li, L2)

Propriet di decisione dei CFL

3 11

Suggerimento: partite da un DFA per Li e da un altro per L 2


! d) Dimostrate che, se L un CFL ed R un linguaggio regolare, shuffle(L, R) un
CFL. Suggerimento: partite da un PDA per L e da un DFA per R.
!! e) Dimostrate con un controesempio che se L i ed L 2 sono CFL. shufjle{Ly, Lo) pu
non essere un CFL.

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

(qp, w, Z0) F (q.t, 7 )


P

se e solo se ((qP,qA),w, Z0) I^ (((/,/>),

7.4

7 ) e P = S(pA,w).

Propriet di decisione dei CFL

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

Complessit delle conversioni fra CFG e PDA

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.

Propriet di decisione dei CFL

313

Riesaminando la costruzione di produzioni da una regola del tipo iiSiq. , X ) contie


ne (?o V j Y2 Yk) notiamo che essa d luogo a una serie di produzioni della forma
[qXrk] -* [roY\r\\[rXY2T2) [rk i VfcrfcJ per tutte le sequenze di stati T1-T2. . . . , rk.
Poich k pu essere vicino a n, e il numero di stati pu essere vicino a n, il numero
totale di produzioni cresce come n " . La costruzione quindi impraticabile per PDA di
dimensione media se c anche una sola stringa di stack lunga.
Per fortuna si pu evitare il caso peggiore. Come suggerito nellEsercizio 6.2.8, pos
siamo dividere l inserimento di una stringa di simboli di stack in una sequenza di non pi
di n passi, ognuno dei quali inserisce un simbolo. Se S(q, a, X ) contiene (ro, YiY2 *Yk).
definiamo i nuovi stati p<, p:i, . . . ,pk-i. A questo punto sostituiamo (ro, YiY2 -- Yk) in
S(q, a. X ) con (pk-\, Yk-\Yk) e introduciamo le nuove transizioni

S(plc I. Vfc-I ) = {{pk-2, Yk-^Yk l)}? S(pk-2,Yk-2) = {(Pk-- Yk 3 ^ - 2 )}


e cos via, fino a S(p2, Y2) = {(ro, YiY2)].
Nessuna transizione ha ora pi di due simboli di stack. Abbiamo aggiunto al massi
mo n nuovi stati, e la lunghezza totale di tutte le regole di transizione di 0' cresciuta al
massimo di un fattore costante, rimanendo quindi 0(n). Ci sono O(n) regole di transi
zione, ognuna delle quali genera 0 (n 2) produzioni perch nelle produzioni derivate da
ogni regola si devono scegliere solo due stati. La grammatica cos formata ha quindi lun
ghezza 0(ri:i) e si costruisce in tempo cubico. Il prossimo teorema compendia lanalisi
informale.
Teorema 7.31 C un algoritmo di costo 0 ( n 3) che, a partire da un PDA P la cui rappre
sentazione lunga n, produce una CFG di lunghezza 0 ( ). La CFG genera il linguaggio
che P accetta per stack vuoto. Eventualmente possiamo far s che G generi il linguaggio
accettato da P per stato finale.

7.4.2

Tempo di esecuzione della conversione in forma normale


di Chomsky

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

2. Detenninare le coppie unitarie ed eliminare le produzioni unitarie come nel Para


grafo 7.1.4 richiede tempo 0 (n 2)\la grammatica risultante ha lunghezza 0 ( 2).
3. La sostituzione di terminali con variabili nel corpo delle produzioni come nel Pa
ragrafo 7.1.5 (forma normale di Chomsky) richiede tempo 0 (n ) e determina una
grammatica di lunghezza O (n).
4. Anche la scomposizione dei corpi di lunghezza 3. o pi. in corpi di lunghezza 2.
svolta nel Paragrafo 7.1.5, richiede tempo O(ri) e d luogo a una grammatica di
lunghezza 0(n).
Il punto critico riguarda la costruzione del Paragrafo 7.1.3. in cui si eliminano le cproduzioni. Da una sola produzione il cui corpo lungo k possiamo generare iI k 1
produzioni per la nuova grammatica. Poich k pu essere proporzionale a n. questa parte
della costruzione pu richiedere tempo 0 (2 ") e produrre una grammatica di lunghezza

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

Verificare se un CFL vuoto

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

Propriet di decisione dei CFL

315

essere necessari 0(r) passi. Dunque unimplementazione ingenua del metodo ha un


costo 0 (n 2).
Esiste per un algoritmo pi scaltro, che prepara una struttura dati appropriata e ri
duce il tempo di ricerca dei generatori a O (ri). La struttura, illustrata nella Figura 7.11,
comincia con un array (a sinistra nella Figura) i cui indici sono le variabili, per ognuna
delle quali dice se ha gi stabilito che generatrice. Nella Figura 7.11, secondo quanto
indica larray, abbiamo gi scoperto che B generatrice, ma non sappiamo se lo sia .4.
Dal momento che una variabile non generatrice se lalgoritmo non la dichiara tale, al
termine dellesecuzione i punti interrogativi diventano dei 'no.
Generatore?
Contatore

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

Altre applicazioni della verifica lineare di linguaggio vuoto


La stessa struttura dati c la stessa tecnica impiegata nel Paragrafo 7.4.3 per stabi
lire se una variabile generatrice consentono di eseguire in tempo lineare anche
altre verifiche citate nel Paragrafo 7.1. Due esempi importanti:
1 . quali simboli sono raggiungibili?
2 . quali simboli sono annullabili?

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

Possiamo anche stabilire se una stringa w appartiene a un CFL L. Supponendo assegnata


una grammatica o un PDA per L. Ia cui dimensione si possa considerare costante e indipendente da w, esistono diversi modi per farlo in tempo esponenziale rispetto a |w|, cio
inefficienti. Per esempio si pu cominciare convertendo la rappresentazione di L in una

Propriet di decisione dei 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

A => Ojtti+ 1 a.j- In particolare ci interessa sapere se 5 nell'insieme X i n perch ci


equivale a dire S = tv, ossia w in L.

x I5
*25
X 13 X 24 * 3 5
X 12

*23

*34

*45

x U

X 22

*33

*44

*2

fl3

aI

Figura 7.12 La tabella costruita dallalgoritmo C Y K.


Per riempire la tabella procediamo verso l'alto, riga per riga. Ogni riga corrisponde a
un valore di lunghezza delle sottostringhe; la pi bassa per le stringhe di lunghezza
3Dal nome dei tre ricercatori che nella sostanza hanno concepito, indipendentemente l'uno daali altri, la
stessa idea: J. Cocke, D. Younger e T. Kasami.

3 18

Capitolo 7

1, la seconda dal basso per quelle di lunghezza 2 , e cos via, fino alla riga in alto, che

corrisponde allunica sottostringa lunga n, cio w. Lelaborazione di ogni voce della


tabella, secondo il metodo che descriveremo ora. richiede tempo ()(n). Poich la tabella
ospita n(n + l) / 2 voci, l intera procedura di riempimento richiede tempo O(TVi). Ecco
lalgoritmo per determinare gli X i j .
La prima riga si calcola cos. La stringa che comincia e finisce nella posizione i il
terminale a,; poich la grammatica in CNF, c un solo modo di derivare Ia stringa a:
una produzione della forma A > a t. Dunque X u l insieme delle variabili A tali che
A *Uj una produzione di G.
base

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
|

da B deriva un prefisso di aa+i 3, diciamo B => Ciidi+i ak per un k < j.


Invece da C deve derivare il resto di ata +1 aj, cio C => at+i at +2 a,j.
Concludiamo che per porre A in X ij dobbiamo trovare due variabili B e C, e un
intero k . tali che:
1. i < k < j

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

Propriet di decisione dei CFL

319

Figura 7.13 II calcolo di X ij richiede di abbinare la colonna sottostante con la diagonale


a destra.
l'appartenenza. Quindi il tempo per confrontare Xik e X ^ + ij, e per trovare le variabili
da inserire in X jj 0 (1 ). Poich ci sono al massimo ri coppie da confrontare per ogni
X ij, il costo totale 0 (n 3).

Esempio 7.34 Elenchiamo le produzioni di una grammatica CNF.

S
A
B
C

AB I B C
BA I a
-# C C I b
-+ AB I a
-.

Veriiichiamo se la stringa baaba appartiene a L(G). La Figura 7.14 riproduce la tabella


compilata per questa stringa.
Per costruire la prima riga dal basso ci serviamo della regola di base. Dobbiamo
considerare solamente le variabili con una produzione il cui corpo sia a (A e C) o b (solo
B). Perci sopra Ie posizioni occupate da a vediamo lelemento {A,C}, e sopra quelle
occupate da b vediamo {/?}. In altre parole X n = X 44 = {/?}, e X 22 = X.r = X rs> =
Nella seconda riga vediamo i valori di X ^ , X 23 , X 34. e X 4.5 A titolo desempio
consideriamo . C un solo modo di spezzare la stringa dalla posizione 1 alla 2, cio
ba, in due sottostringhe non vuote. La prima devessere la posizione 1, la seconda la
posizione 2. Per generare ba. una variabile deve avere un corpo la cui prima variabile sia
in X 11 = {B} (deve cio generare b) e la seconda sia in X 22 = { A ,C } (per generare
a). Questo corpo pu essere soltanto BA o BC. Lesame della grammatica rivela che le
produzioni A BA e S * B C sono le uniche con questa caratteristica. Perci le due
teste, A ed 51, formano X 12.

320

Capitolo 7

Figura 7.14 La tabella per la stringa baaba costruita dallalgoritmo CYK.

Come esempio pi articolato consideriamo il calcolo di X 24 . Possiamo spezzare la strin


ga aab, che occupa le posizioni da 2 a 4, terminando la prima stringa dopo la posizione
2 o dopo la 3. Possiamo cio scegliere k = 2 o k = 3 nella definizione di X 24 Dob
biamo allora esaminare tutti i corpi in ^ 2 2 ^ 3 4
-^23 -^44 Questo insieme di stringhe
{yl, C } { 6 \C } U {?}{.?} = {/l, AC, CS, CC, B B ). Dei suoi cinque elementi solo
C C un corpo; la sua testa B. Perci X 24 = {O-

7.4.5

Anteprima di problemi indecidibili per i CFL

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?

Propriet di decisione dei CFL 321


5. Un CFL dato uguale a *, dove lalfabeto del linguaggio?
Notiamo che la natura del problema (1), sull'ambiguit, si distingue dalle altre per essere
inerente a una grammatica e non a un linguaggio. Gli altri problemi assumono tutti che
il linguaggio sia rappresentato da una grammatica o da un PDA, ma vertono appunto su
linguaggi. Per esempio, diversamente dal problema (1), il secondo chiede se, data una
grammatica G (o anche un PDA), esiste una grammatica equivalente non ambigua. Se G
stessa non ambigua la risposta certamente s; in caso contrario potrebbe esistere una
grammatica non ambigua per lo stesso linguaggio, come abbiamo visto per la grammatica
delle espressioni nellEsempio 5.27.

7.4.6

Esercizi

Esercizio 7.4.1 Ideate un algoritmo per ognuno dei seguenti problemi.


* a) Data una CFG G, L(G) finito? Suggerimento', applicate il pumping lemma.
! b) Data una CFG G, L(G) contiene almeno 100 stringhe?
!! c) Data una CFG G e una delle sue variabili A, esiste una forma sentenziale in cui A
il primo simbolo? Nota: ricordate che, anche se A compare per la prima volta in
mezzo a una forma sentenziale, i simboli alla sua sinistra potrebbero generare e.

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

Eliminazione di simboli inutili: possiamo eliminare una variabile da una CFG se


non genera alcuna stringa di terminali e non compare in almeno una stringa derivata
dal simbolo iniziale. Per eliminare correttamente i simboli inutili dobbiamo prima
verificare se da una variabile deriva una stringa terminale ed eliminare, insieme
con tutte Ic loro produzioni, quelle che non soddisfano il vincolo. Solo in seguito
eliminiamo Ic variabili non derivabili dal simbolo iniziale.
Eliminazione delle e-produzioni e delle produzioni unitarie: data una CFG, esiste
unaltra CFG che genera lo stesso linguaggio, tranne la stringa e, ma priva di
e-produzioni (quelle con corpo formato da e) e di produzioni unitarie (quelle con
corpo formato da una sola variabile).
Forma normale di Chomsky: data una CFG che genera almeno una stringa non
vuota, ne esiste un'altra che genera lo stesso linguaggio, tranne e, e che in forma
normale di Chomsky: non ci sono simboli inutili e il corpo di ogni produzione
consiste o di due variabili o di un terminale.
//pumping lemma: dato un CFL. in ogni stringa sufficientemente lunga del linguag
gio si pu trovare una sottostringa tale che i suoi estremi possono essere replicati
in tandem, cio ripetuti un numero arbitrario di volte. Le stringhe replicabili non
sono entrambe c. Con questo lemma, e con una versione pi forte detta lemma di
Ogden, citata nellEsercizio 7.2.3, si pu dimostrare che molti linguaggi non sono
liberi dal contesto.
Operazioni che preservano i linguaggi liberi dal contesto: i CFL sono chiusi rispet
to alle operazioni di sostituzione, unione, concatenazione, chiusura, inversione e
omomorfismo inverso. Non sono chiusi rispetto all'intersezione e al complemento,
anche se l intersezione di un CFL e di un linguaggio regolare sempre un CFL.
Verificare se un CFL vuoto: data una CFG, c un algoritmo che rivela se essa
genera almeno una stringa. Mediante unimplementazione accurata, lesecuzione
dell'algoritmo richiede tempo proporzionale alla dimensione della grammatica.
Verificare l appartenenza a un CFL: lalgoritmo di Cocke-Younger-Kasami rivela
se una stringa appartiene a un dato linguaggio libero dal contesto. Fissato un CFL,
lalgoritmo richiede tempo 0 (n3), dove n la lunghezza della stringa in esame.

Bibliograiiii

7.6

323

Bibliografia

La forma normale di Chomsky c introdotta in [2], la forma normale di Greibach in |4J.


anche se la costruzione delineata nellEsercizio 7.1.11 si deve a M.C. Paull.
Molte propriet fondamentali dei linguaggi liberi dal contesto sono introdotte in [1J.
Tra queste il pumping lemma, le prime propriet di chiusura, e alcuni metodi per verificare
semplici propriet, come la vuotezza e la finitezza di un CFL. Aggiungiamo [6 J come
origine della non chiusura rispetto allintersezione e al complemento, mentre |3] presenta
altri risultati di chiusura, come la chiusura dei CFL rispetto alPomomorfismo inverso. Il
lemma di Ogden introdotto in f5].
Per lalgoritmo CYK sono note tre fonti indipendenti: il lavoro di J. Cocke. che
stato diffuso solo privatamente, senza essere pubblicato; la versione di T. Kasami di un
algoritmo sostanzialmente identico, inclusa in un memorandum interno della US-AirForce; il lavoro di D. Younger, che stato invece pubblicato |7J.
1. Y. Bar-Hillel, M. Perles, E. Shamir, On formal properties of simple phrase-structure
grammars, Z Phonetik. Sprachwiss. Kommunikationsforsch. 14(1961), pp. 143
172.
2. N. Chomsky, On certain formal properties of grammars, information and Control
2:2(1959), pp. 137-167.
3. S. Ginsburg. G. Rose, Operations which preserve definability in languages J.
ACM 10:2 (1963), pp. 175-195.
4. S. A. Greibach, A new normal-form theorem for context-free phrase structure
grammars, J. ACM 12:1 (1965), pp. 42-52.
5. W. Ogden, "A helpful result for proving inherent ambiguity,' Mathematical Systems
Theory 2:3 (1969), pp. 3142.
6 . S. Scheinberg, Note on the boolean properties of context-free languages, Infor

mation and Control 3:4 ( 1960). pp. 372-375.


7. D. H. Younger, Recognition and parsing of context-free languages in time n 3,
Infonnation and Control 10:2 (1967), pp. 189-208.

Capitolo 8

Macchine di Turing: introduzione


In questo capitolo cambiamo decisamente direzione. Finora ci siamo occupati soprattutto
di semplici classi di linguaggi e dei modi di utilizzarle in relazione a problemi circoscrit
ti, come lanalisi di protocolli, la ricerca in testi e l'analisi sintattica di programmi. Ora
cominciamo a chiederci quali linguaggi possano essere definiti mediante un dispositivo di
calcolo qualsiasi. Ci equivale a chiedersi che cosa pu fare un calcolatore. Infatti pos
siamo esprimere qualsiasi problema in modo formale come problema di riconoscimento
delle stringhe di un linguaggio, e daltra parte possiamo considerare un calcolatore come
un dispositivo per risolvere problemi.
Supponendo noto il linguaggio C, cominciamo da un ragionamento informale che di
mostra lesistenza di problemi specifici, irrisolvibili da un calcolatore. Questi problemi si
dicono indecidibili. Presentiamo poi un modello formale, ormai venerando, di calcola
tore: la macchina di Turing. Una macchina di Turing non somiglia affatto a un PC. Se per
caso unazienda dovesse pensare di produrla e venderla, risulterebbe disastrosamente len
ta; eppure da molto tempo e riconosciuta come un modello preciso di quello che qualsiasi
dispositivo fisico di calcolo pu fare.
Nel Capitolo 9 ci serviremo della macchina di Turing per sviluppare una teoria dei
problemi indecidibili (problemi che nessun calcolatore pu risolvere). Dimostreremo
che certi problemi, facili da enunciare, sono in realt indecidibili. Un esempio? Stabilire
se una grammatica ambigua. Ne vedremo per molti altri.

8.1

Problemi che i calcolatori non possono risolvere

Questo paragrafo ha lo scopo di presentare informalmente, sulla base della programma


zione in C, la dimostrazione che un calcolatore non pu risolvere un problema specifico.
Il problema consiste nello stabilire se la prima cosa che un programma in C stampa

326

Capitolo 8

C ia o , mondo. Possiamo pensare che simulando il programma si possa stabilire che


cosa fa, ma dobbiamo fare i conti con programmi che impiegano un tempo straordina
riamente lungo per produrre un output. Questo problema - non sapere quando qualcosa
avverr, se mai avverr - la ragione principale della nostra incapacit di stabilire chc co
sa fa un programma. Dimostrare formalmente che non esiste alcun programma in grado di
svolgere un certo compito difficile, e per farlo dobbiamo sviluppare opportuni strumenti
formali. In questo paragrafo spieghiamo lidea intuitiva su cui poggiano le dimostrazioni
formali.

8.1.1

Programmi che stampano Ciao, mondo

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") ;

Figura 8.1 II programma di saluto di Kernighan e Ritchie.


Esistono anche altri programmi in grado di stampare C i a o , mondo, ma che lo facciano
tuttaltro che ovvio. La Figura 8.2 ne illustra un esempio. Il programma prende come
input n e cerca soluzioni intere positive all'equazione xn + yn zn. Se ne trova una,
stampa C ia o , mondo. Se non esistono tre interi x, y t z che soddisfano lequazione,
la ricerca non ha mai fine c il programma non arriva a stampare la frase.
Per capire che cosa fa questo programma, osserviamo in primo luogo che exp
una funzione ausiliaria che calcola esponenziali. Il programma deve esaminare le tri
ple (#, y, z) in un ordine tale da garantire chc ogni tripla di interi positivi venga prima o
poi esaminata. Per organizzare adeguatamente la ricerca, ricorriamo a una quarta variabi
le, t o t a l , che parte da 3 e nel ciclo while incrementata di ununit alla volta in modo
da raggiungere qualunque intero finito. AlFintemo del ciclo while dividiamo t o t a l in
tre interi positivi x, y e dapprima facendo variare x da 1 a t o t a l - 2 , e poi, allinterno
del ciclo for, facendo variare y da I alla differenza fra t o t a l e x, diminuita di uno. Il
rimanente, che compreso tra 1 e t o t a l - 2 , viene assegnato a 2 .
1B. W. Kernighan. D. M. Ritchie, Tlie C Programming Ixmguage, 1978. Prentice-Hall, Englewood Cliffs,
NJ.

Problemi chc i calcolatori non possono risolvere


i n t e x p ( i n t i , n)
/* c a lc o la i e le v a to

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+ + ;
}
}

Figura 8.2 L'ultimo teorema di Fermar espresso come programma di saluto.

Nel ciclo pi interno si verifica se x n + y n = Zn . Sc s, il programma slampa C ia o ,


mondo; in caso contrario non stampa nulla.
Se I valore di n letto dal programma 2, il programma trova combinazioni di interi,
come t o t a l = 12, x = 3, y = 4 e z = 5, per cui x n + y n = zn. Di conseguenza, per
linput 2, il programma stampa effettivamente C i a o , mondo.
D'altro canto, per qualunque intero n > 2, il programma non trover mai una tripla di
interi positivi che soddisfi x n + y" = zn, e dunque non potr stampare C ia o , mondo.
interessante osservare che fino a qualche anno fa non si sapeva se il programma avrebbe
stampato C ia o , mondo per valori interi di n molto grandi. Fu Fermai a sostenere per
primo, trecento anni fa. che non lo avrebbe fatto, ossia che non esistono soluzioni intere
allequazione x n + y" = zn se n > 2. Questo enunciato, noto come ultimo teorema di
Fermat, stato dimostrato solo di recente.

328

Capitolo 8

Perch devono esistere problemi indecidibili


Se difficile dimostrare che un problema specifico, come il problema ciaomondo trattato qui, indecidibile, invece molto facile capire le ragioni per cui
quasi tutti i problemi devono essere indecidibili per un sistema di programma
zione. Ricordiamo che per problema intendiamo lappartenenza di una stringa
a un linguaggio. 11 numero di linguaggi diversi su un qualunque alfabeto di pi
di un simbolo non numerabile. In altre parole non esiste un modo di assegnare
interi ai linguaggi tale che ogni linguaggio corrisponda a un intero c ogni intero
sia assegnato a un unico linguaggio.
D'altra parte i programmi, essendo stringhe finite su un alfabeto finito (soli
tamente un sottoinsieme dellalfabeto ASCII), sono numerabili. Infatti i program
mi possono essere ordinati per lunghezza, c i programmi della stessa lunghezza
possono essere ordinati lessicalmente. Di conseguenza si pu parlare del primo
programma, del secondo programma, e in generale dell'i-esimo programma per
un qualunque intero i.
Ne deduciamo che esistono infinitamente meno programmi che problemi.
Se scegliessimo un linguaggio a caso, quasi sicuramente sarebbe un problema
indecidibile. Lunica ragione per cui sembra che la maggior parte dei problemi
sia decidibile che di rado siamo interessati a problemi scelti a caso; preferia
mo piuttosto considerare problemi semplici c ben strutturati, che effettivamente
sono spesso decidibili. Eppure anche tra i problemi di cui ci interessiamo e che
possiamo enunciare in termini chiari e concisi, ce ne sono molti indecidibili; il
problema ciao-mondo uno di questi.

Il problema ciao-mondo consiste nello stabilire se i primi 11 caratteri stampati da un dato


programma C, con un dato input, sono C ia o , mondo. In seguito diremo spesso, per
brevit, che un programma stampa C ia o , mondo per indicare che stampa queste due
parole come i primi 1 1 caratteri.
Sc i matematici hanno impiegato 300 anni per risolvere una questione relativa a un
solo programma lungo 22 righe, il problema generale di dire se un programma dato, su un
input dato, stampa C i a o , mondo devessere veramente arduo. In effetti tutti i problemi
che i matematici non hanno saputo risolvere possono essere trasformati nella domanda:
il tal programma, con tale input, stampa C ia o , mondo? Sarebbe dunque notevole
se riuscissimo a scrivere un programma in grado di esaminare qualunque programma
P e input I per P, e dire se P, eseguito con 1 come input, stampa C ia o , mondo.
Dimostreremo che un tale programma non esiste.

Problemi che i calcolatori non possono risolvere 329

8.1.2

Un ipotetico verificatore di ciao-mondo

Limpossibilt di compiere la verifica di ciao-mondo si dimostra per assurdo. In altre


parole supponiamo che esista un programma, chc chiameremo H, che prende come input
un programma P e un input I , e dice se P con input / stampa C ia o , mondo. La
Figura 8.3 illustra uno schema di H . In particolare l unico output di H la stampa dei
due caratteri s oppure dei due caratteri no. H fa sempre o !una o laltra cosa.

Verificatore

ciao-mondo
H

yf
X

s
no

Figura 8.3 Un ipotetico programma H che funge da verificatore di ciao-mondo.


Se un problema ha un algoritmo come IL che dice sempre in maniera corretta se uni
stanza del problema riceve la risposta s oppure no, il problema detto decidibile.
Negli altri casi il problema indecidibile. Il nostro obiettivo dimostrare che I I non
esiste, vale a dire che il problema ciao-mondo indecidibile.
Per dimostrare lenunciato per assurdo, apporteremo diverse modifiche ad II, fino a
giungere a un altro programma, detto II, di cui proveremo la non esistenza. Visto che le
modifiche ad TI sono semplici trasformazioni che possono essere applicate a qualunque
programma C, lunico enunciato dubbio lesistenza di H. Questo dunque lassunto
che avremo contraddetto.
Per facilitare la discussione imporremo alcuni vincoli ai programmi in C, tesi a ren
dere pi semplice il compito di H. Se possiamo dimostrare che un verificatore di ciaomondo non esiste per questi programmi limitati, a maggior ragione non pu esistere per
una classe di programmi pi ampia. I vincoli sono i seguenti.
1. Loutput a caratteri; non usiamo pacchetti grafici o qualunque altro mezzo per
ottenere un output che non sia formato da caratteri.
2. Loutput a caratteri si ottiene usando p r i n t f, e non p u t e h a r ( ) o altre funzioni
di output.
Assumiamo ora che il programma I I esista. La prima modifica consiste nel mutare lout
put no, che rappresenta la risposta di H quando il suo programma di input P non stampa

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

Figura 8.4 H \si comporta come t. ma stampa C i a o , mondo anzich no.


La trasformazione successiva un po' pi complicata. Si tratta essenzialmente dell'in
tuizione chc permise ad Alan Turing di dimostrare il suo risultato di indecidibilit sulle
macchine di Turing. Dato che il nostro interesse limitato a programmi che prendono
altri programmi comc input c ne dicono qualcosa, limitiamo t\ in due modi.
a) L'input ridotto a P omettendo I.
b) Il nuovo programma determina che cosa farebbe P se l'input fosse il suo stesso
codice, cio che cosa farebbe t ^ avendo in input P sia come programma sia come

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.

Problemi chc i calcolatori non possono risolvere 331

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

Figura 8 .6 Che cosa fa H 2 quando ha come input se stesso?


Supponiamo che Ho (il quadralo nella Figura 8 .6 ) produca l'output s . Allora H 2 nel
quadrato afferma che il suo inpul H 2, quando riceve se stesso come input, stampa C ia o ,
mondo come primo output. Eppure abbiamo appena ipotizzato che il primo output di H 2
in questa situazione sia s anzich C i a o , mondo.
Di conseguenza l'output di H 2 nella Figura 8 .6 dovrebbe essere C i a o , mondo, dato
che devessere uno dei due. Ma se H 2, ricevendo se stesso come input, stampa per primo
C ia o , mondo, loutput del quadrato nella Figura 8 .6 devessere s . Qualunque sia
l'output ipotizzato di H 2, possiamo dedurre che produca invece laltro.
Si tratta di una situazione paradossale, c possiamo concludere che H2 non esiste.
Abbiamo quindi confutato l'ipotesi che H esista. In altre parole abbiamo dimostrato che
nessun programma H pu dire o no se un dato programma P con input I stampa C i a o ,
mondo come primo output.

332

8.1.3

Capitolo 8

Ridurre un problema a un altro

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.

Problemi che i calcolatori non possono risolvere

333

Un computer pu davvero farlo?


Esaminando un programma come quello della Figura 8.2 potremmo chiederci
se effettivamente cerca controesempi allultimo teorema di Fermat. In un tipico
computer gli interi hanno lunghezza pari a soli 32 bit; se il pi piccolo controesempio coinvolgesse interi nelTordine dei miliardi, si produrrebbe un errore di
overflow prima di trovare la soluzione. Si pu senzaltro sostenere che un com
puter con una memoria centrale di 128 megabyte e un disco di 30 gigabyte ha
solo 25630128000000 stati ed quindi un automa a stati finiti.
D altra parte, trattare i computer come automi a stati finiti (o trattare il cer
vello umano come un automa a stati finiti, motivo per cui sono nati gli FA)
inutile. Il numero di stati coinvolti cos grande e i limiti sono cos vaghi che
impossibile trarre conclusioni proficue. In effetti si pu ragionevolmente pensare
che l insieme di stati di un computer sia espandibile arbitrariamente.
Per esempio possibile rappresentare gli interi come liste di cifre di lun
ghezza arbitraria. Se la memoria insufficiente, il programma pu stampare la
richiesta di smontare il disco, salvarlo e sostituirlo con un disco vuoto. Il compu
ter potrebbe man mano stampare richieste di scambi tra tutti i dischi che gli sono
necessari. Si tratterebbe di un programma molto pi complesso di quello della
Figura 8.2, ma la sua scrittura non andrebbe oltre le nostre capacit. Con simili
espedienti qualsiasi programma pu ovviare alle limitazioni sulla capacit della
memoria o sulla dimensione degli interi o di altri dati.

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

Limportanza della direzione di una riduzione


X

E un errore comune quello di dimostrare che un problema P2 indecidibile ri


ducendo P2 a un altro problema indecidibile noto P i , ossia provando lenunciato
se P 1 decidibile, allora P2 decidibile". Tale enunciato, per quanto senz'altro
vero, c inutile perch poggia su un ipotesi, decidibile, falsa.
Lunico modo per dimostrare l indecidibilit di un nuovo problema Po
ridurre a P2 un problema indecidibile noto Pi- In questo modo dimostriamo
lenunciato se P2 decidibile, allora P\ decidibile. U contronominale di tale
enunciato se P 1 indecidibile, allora P2 indecidibilc'. Sapendo che P x
indecidibile possiamo dedurre che P2 indecidibile.

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.

Lu macchina di Turing 335


Supponiamo che Q con input y stampi C i a o , mondo come primo output. Allora R, per
come stato costruito, chiama foo. Ma se Q con input y non stampa C ia o , mondo
come primo output, R non chiama mai foo. Sc possiamo decidere se R con input 2
chiama foo, allora sappiamo anche sc Q con input y (ricordiamo che y 2 ) stampa
C i a o , mondo. Sapendo che non esiste alcun algoritmo capace di decidere il problema
ciao-mondo. e che i quattro passi della costruzione di R da Q potrebbero essere svolti da
un programma che editi il codice sorgente, il nostro assunto sullesistenza di un verifi
catore del problema della chiamata falso. Tale programma non esiste e il problema
indecidibile.

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

La teoria dei problemi indecidibili non ha soltanto lo scopo di stabilire l'esistenza di


questi problemi, un concetto di per s intellettualmente stimolante, ma anche di fornire
una guida ai programmatori su quanto possibile realizzare mediante la programmazio
ne. La teoria ha anche importanti riflessi pragmatici nella trattazione di problemi che,
sebbene decidibili, richiedono considerevoli quantit di tempo per essere risolti (come
vedremo nel Capitolo 10). Questi problemi, detti intrattabili, tendono a presentare ai
programmatori e ai progettisti di sistemi difficolt maggiori rispetto ai problemi indecidi
bili. Infatti, mentre i problemi indecidibili lo sono di solito palesemente, e nella pratica
si cerca di risolverli di rado, i problemi intrattabili si presentano ogni giorno. Inoltre es
si si prestano frequentemente a piccole modifiche nei requisiti o a soluzioni euristiche.
11 progettista si trova quindi a dover decidere se un problema appartenga alla classe dei
problemi intrattabili e, se s, che cosa occorra fare.
Per dimostrare se un problema indecidibilc o intrattabile ci servono strumenti ade
guati. La tecnica presentata nel Paragrafo 8.1 utile per questioni relative a programmi,

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

La ricerca della soluzione a tutte le domande matematiche

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

La macchina di Turing 337


modello di computazione universale. Si tratta di un modello pi simile a un computer che
a un programma, anche se i calcolatori elettronici, o anche elettromeccanici, sarebbero
arrivati alcuni anni dopo (e Turing stesso si occup della costruzione di una macchina di
questo tipo durante la seconda guerra mondiale).
E interessante notare che tutte le proposte di modello di computazione hanno la stessa
potenza, cio calcolano le stesse funzioni o riconoscono gli stessi linguaggi. Lassunto
indimostrabile che qualunque modo generale di computare permette di computare solo le
funzioni ricorsivc parziali (oppure ci che le macchine di Turing o i computer moderni
possono calcolare, il che equivalente) detto ipotesi di Church (dal nome del logico A.
Church) o tesi di Church-Turing.

8.2.2

Notazione per la macchina di Turing

Possiamo rappresentare la macchina di Turing come nella Figura 8 .8 . La macchina consi


ste di un controllo Jnito. che pu trovarsi in uno stato, scelto in un insieme finito. C un
nastro diviso in caselle, o celle; ogni cella pu contenere un simbolo scelto in un insieme
finito.

X I.

X /I B

Figura 8 .8 Una macchina di Turing.

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.

Q : linsieme finito degli stati del controllo.


: linsieme finito dei simboli di input.
: linsieme completo dei simboli di nastro: sempre un sottoinsieme di .

S: la funzione di transizione. Gli argomenti di S(q, X ) sono uno stato q e un simbolo


di nastro X . Il valore di (q, X ), se definito, una tripla (p, Y. D), dove:
1. p , elemento di Q, lo stato successivo
2. Y il simbolo di scritto nella cella guardata, al posto di qualunque simbolo
vi fosse
3. D una direzione. L o R - rispettivamente per left (sinistra) e right
(destra) -, e segnala la direzione in cui si muove la testina.

qo: lo stato iniziale del controllo; un elemento di Q.


D: il simbolo detto blank. Si trova in ma non in , cio non un simbolo di input.
Inizialmente il blank compare in tutte le celle tranne quelle (finite) che contengono
i simboli di input.

F: l insieme degli stati finali o accettanti, un sottoinsieme di Q.

La macchina di Turing 339

8.2.3

Descrizioni istantanee delle macchine di Turing

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

1. Se i - 1, allora M si muove verso il blank a sinistra di X 1. In tal caso,

q X i ^ 2 Xn IM

X 2 Xn

2. Se i = n c Y = B, allora il simbolo B scritto su X n si unisce alla sequenza di


blank in coda e non compare nella ID seguente. Perci

XyX> X ri- i q X n
Supponiamo ora che

X 1 X 2 X n-2pXn - 1

5(q, X t) = (p. Y, /?), cio la prossima mossa verso destra. Allora

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

2. Se %= I e Y = B , allora il simbolo B scritto su X j si unisce alla sequenza infinita


di blank in testa e non compare nella ID seguente. Perci,
^ X 1X 2 -.-Xn I- p X , -Xn
M

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

M = ({<?,4 , 2 ,<?3 ,^}, { 0 ,1 } .{ 0 ,1 ,X , Y .B } J .q 0,B..{q.y})

La macchina di Turing 341

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}.

dove data dalla tabella nella Figura 8.9.


Mentre Al svolge la sua computazione, la porzione del nastro su cui passata la
testina sempre una sequenza di simboli descritta dallespressione regolare X*0*Y*1*.
In altre parole ci sono degli 0 che sono stati trasformati in A', seguiti da 0 che non sono
stati trasformati. Ci sono poi degli 1 che sono stati trasformati in Y e 1 che non sono stati
ancora trasformati. Possono poi esserci altri 0 e 1.
Lo stato qo lo stato iniziale; M rientra in q0 ogni volta che ritorna allo 0 residuo pi
a sinistra. Se M si trova nello staio qo c guarda uno 0, la regola in alto a sinistra nella
Figura 8.9 impone di andare nello stato q\, trasformare lo 0 in A e muoversi verso destra.
Nello stato q i, M continua a muoversi verso destra su tutti gli 0 e le Y in cui si imbatte sul
nastro, rimanendo in q}. Se M legge una A o una B. muore. Se invece legge un 1 quando
si trova nello stato q-\
, lo trasforma in Y , entra nello stato q- e comincia a muoversi verso
sinistra.
Nello stato q%, M si muove verso sinistra sugli 0 e le F , rimanendo in q2. Quando
raggiunge la A pi a destra, che segna lestremit destra del blocco di 0 gi trasformati in
X . M ritorna nello stato q0 e si muove verso destra. Possiamo individuare due casi.
1. Se ora M vede uno 0, ripete il ciclo di abbinamento appena descritto.
2. Se M vede una Y , tutti gli 0 sono stati trasformati in A . Sc tutti gli 1 sono stati
trasformati in Y , allora linput era di forma O71I r' ed M deve accettare. Di conse
guenza M entra nello stato q:i e comincia a muoversi verso destra, sulle Y . Se il
primo simbolo diverso da una Y che M vede un blank, allora il numero di 0 e di 1
era lo stesso; dunque M entra nello stato <74 e accetta. D altra parte, se M incontra
un altro 1, allora ci sono troppi I ed M muore senza accettare. M muore anche se
incontra uno 0 (input della forma sbagliata).
Presentiamo un esempio di computazione accettante da parte di M . Il suo input 0011.
Inizialmente M si trova nello stato q{) e guarda il primo 0, cio la ID iniziale di M
()0011. Lintera sequenza di mosse di M :

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

Diagrammi di transizione per le macchine di Turing

Possiamo rappresentare le transizioni di una macchina di Turing graficamente come ab


biamo fatto per i PDA. Un diagramma di transizione consiste in un insieme di nodi cor
rispondenti agli stati della TM. Un arco dallo stato q allo stato p etichettato da uno o
pi oggetti della forma X / Y D , dove X e F sono simboli di nastro e D una direzione,
L o R. In altre parole, ogni volta che d'(y, X ) = (p, F, D), troviamo 1 etichetta X / F D
sullarco da y a p. Nei diagrammi la direzione D rappresentata graficamente da < per
sinistra e per destra.
Come per altri tipi di diagrammi di transizione, rappresentiamo lo stalo iniziale con
la parola Start e una freccia chc entra in tale stato. Gli stati accettanti sono segnalati
dal doppio cerchio. Dunque lunica informazione sulla TM chc non si ricava direttamente
dal diagramma il simbolo usato per il blank. Supponiamo che il simbolo sia B, salvo
indicazione contraria.
Esempio 8.3 La Figura 8 .10 mostra il diagramma di transizione per la macchina di Turing
delPEsempio 8.2, la cui funzione di transizione c stata data nella Figura 8.9.

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.

La macchina di Turing 343


Yl
( ) / 0 ^

Y/ Y ^

Figura 8.10 Diagramma di transizione per una TM chc accetta stringhe della forma On 1n.

Una TM che compie tale operazione c specificata da

M = ({io><7i> ;<&>}> {0,1).(0,1,1?}, 5, c/o,#)


Poich questa TM non viene usata per accettare linput, abbiamo omesso il settimo com
ponente, chc c l'insieme di stati accettanti. M parte con un nastro su cui presente la
stringa di input Om IO" preceduta e seguita da blank. M si arresta con Om^ n sul nastro,
circondato da blank.
Lo schema di funzionamento chc viene ripetuto il seguente: M trova lo 0 residuo
pi a sinistra e lo sostituisce con un blank. Si sposta allora verso destra, alla ricerca di un
1. Dopo aver trovato un I, continua a destra finch non arriva a uno 0 e lo sostituisce con
un I. M torna allora verso sinistra cercando lo 0 pi a sinistra: lo identifica quando si
imbatte per la prima volta in un blank e poi muove di una cella verso destra. Literazione
si ferma in uno dei casi seguenti.
1. Cercando uno 0 a destra M trova un blank. Allora gli n 0 in 07" 10'" sono stati tutti
trasformati in 1 e n -f 1 degli rn 0 sono stati trasformati in D. M sostituisce gli

344

Capitolo 8

4-1 simboli 1 con uno 0 cd n simboli t, lasciando m n simboli 0 sul nastro.


Poich in questo caso m > n, m n = m n.

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.

qo. lo stato che d avvio al ciclo c che lo interrompe quando opportuno. Se M


guarda uno 0, il ciclo dev'essere ripetuto. Lo 0 viene rimpiazzato da B, la testina
si muove verso destra e si entra nello stato q\. D'altra parte, se M guarda 1, allora
sono state fatte tutte le possibili combinazioni tra i due gruppi di 0 sul nastro, ed M
va nello stato q$ per riempire il nastro di blank.
<7i : in questo stato M muove verso destra attraverso il blocco iniziale di 0, alla ricerca
delF'l pi a sinistra. Dopo averlo trovato, M passa nello stato q-.

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

Figura 8.12 Tl diagramma di transizione per la TM dellEscmpio 8.4.

Capilolo 8

346

Convenzioni notazionali per le macchine di Turing


I simboli usati normalmente per le macchine di Turing sono simili a quelli gi
visti per gli altri tipi di automa.
1. Lc prime lettere minuscole dell'alfabeto indicano i simboli di input.
2. Le lettere maiuscole, di solito in prossimit della fine dellalfabeto, sono
usate per i simboli di nastro che possono essere o no simboli di input.
3. Le ultime lettere minuscole ddl'alfabeto indicano stringhe di simboli di
input.
4. Le lettere greche indicano stringhe di simboli di nastro.
5. Le lettere q, p e quelle circostanti indicano gli stati.

8.2.5

II linguaggio di una macchina di Turing

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

L(M) linsieme di stringhe w in * tale che qow I per uno stato p in F e


qualunque stringa di nastro a e . Abbiamo ipotizzato questa definizione nel discutere la
macchina di Turing dellEsempio 8.2, chc accetta le stringhe della forma OriI n.
I
linguaggi chc possiamo accettare usando una macchina di Turing sono spesso de
nominati linguaggi ricorsivamente enumerabili o linguaggi RE (Recursively Enumera
ble). Il termine ricorsivamente cnumerabile deriva da formalismi computazionali che
precedono cronologicamente la macchina di Turing, ma che definiscono la stessa classe
di linguaggi o funzioni aritmetiche. Vedremo le origini del termine in un excursus del
Paragrafo 9.2.1.

8.2.6

Le macchine di Turing e l arresto

Per le macchine di Turing si usa comunemente unaltra nozione di accettazione: lac


cettazione per arresto. Diremo che una TM si arresta se entra in uno stato q guardando un
simbolo di nastro X c non ci sono mosse in questa situazione; cio 6(q. Ar) indefinito.

La macchina di Turing 347


Esempio 8.5 La macchina di Turing M dellEsempio 8.4 non stata definita per accet
tare un linguaggio. L'abbiamo vista piutlosto nel suo aspetto di calcolo di una funzione
aritmetica. Notiamo per che M si arresta su tutte le stringhe di 0 e 1 perch, a prescin
dere da quali stringhe trova sul nastro, finisce per cancellare il secondo gruppo di 0 , se
lo trova, a fronte del primo gruppo di 0. Di conseguenza deve raggiungere lo stato qo e
arrestarsi.
Possiamo sempre assumere che una TM si arresti se accetta. In altre parole, senza
cambiare il linguaggio accettato, possiamo rendere S(q, X ) indefinito per ogni q accet
tante. In generale, senza specificarlo esplicitamente,
assumiamo che una TM si arresti sempre quando si trova in uno stato accettante.
Purtroppo non c sempre possibile richiedere che una TM si arresti, anche se non ac
cetta. I linguaggi per cui esiste una macchina di Turing che prima o poi si arresta, in
dipendentemente dallaccettare o no, sono delti ricorsivi, e ne studieremo le propriet a
partire dal Paragrafo 9.2.1. Le macchine di Turing che si arrestano sempre, a prescindere
dal fatto che accettino o no, sono un buon modello di algoritmo. Se esiste un algo
ritmo per risolvere un dato problema, diciamo che il problema decidibile. Le TM
che si arrestano sempre hanno dunque un posto importante nella teoria della decidibilit
(Capitolo 9).

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 .

a) Scrivete le transizioni della vostra macchina di Turing e spiegate lo scopo di cia


scuno stato.
b) Mostrate la sequenza di ID della vostra TM quando le viene dato linput $111.
Esercizio 8.2.4 In questo esercizio esploriamo lequivalenza tra la computazione di fun
zioni e il riconoscimento di linguaggi per le macchine di Turing. Per semplicit conside
riamo solo funzioni da interi non negativi a interi non negativi, ma le idee soggiacenti a
questo problema si applicano a qualsiasi funzione computabile. Ecco le due definizioni
cruciali.
11 grafo di una funzione / sia l'insieme di tutte le stringhe della forma [x, f(x)\,
dove X un intero non negativo in binario e f{x) il valore della funzione / con
argomento x, scritto in binario.
Si dice che una macchina di Turing computa la funzione f se, partendo da un intero
non negativo x sul nastro, in binario, si arresta (in qualunque stato) con f(x), in
binario, sul nastro.
Rispondete ai seguenti quesiti con costruzioni informali, ma chiare.
a) Mostrate come, data una TM che computa / , si pu costruire una TM che accetta
il grafo di / come linguaggio.
b) Mostrate come, data una TM che accetta il grafo di / , si pu costruire una TM chc
computa f.
c) Si dice che una funzione parziale se pu essere indefinita su certi argomenti. Se
estendiamo le idee di questo esercizio alle funzioni parziali, non richiediamo che
la TM che computa / si arresti qualora il suo input x sia uno degli interi per cui il
valore f(x) non definito. Le vostre costruzioni per le parli (a) e (b) sono valide se
la funzione / parziale? In caso negativo spiegate come modificare la costruzione
in modo che funzioni.
Esercizio 8.2.5 Considerate la seguente macchina di Turing:

M - ({ 0 , 7 i , Q2 ^Qf} {0,1}, {0. \


,B},S,qo,B, {qf })
Descrivete in termini informali, ma chiari, il linguaggio L(M ) se S specificata come
segue:

Tecniche di programmazione per le macchine di Turing 349


* a) 5(90,0) = ( g i , l , f t ) ; % i , l ) = (q0, 0, R); (q: D) = (qf ,B ,R )
b) (/,) =
( /, B i R)

(qo,B,R), 5(flo,l) =

^ ( , ) = (<71, B.R); 6{qy, Ti) =

!c ) % o ,0 ) = (1 , 1 , R); 6(qu l) = (2 , 0 . 1 ); '(g2 , l ) = (0 , 1 , ^ ) ; 5(qi, B) =

(/,?, Tl).

8.3

Tecniche di programmazione per le macchine


di IYiring

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

Memoria nello stato

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

M = (Q, {0 , 1 }, {0 , 1 , B }, , [0 , B J, { [a, , B]})


che ricorda nel controllo il primo simbolo letto (Oo 1) e verifica che non ricompaia nel
linput. M accetta dunque il linguaggio U lt -I-10*. Il riconoscimento di un linguaggio

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.

a], a) = ([<71, a], a, R ), dove a il complemento di a, cio 0 se a = 1 e 1 se


a = 0. Nello stato q 1, M supera ogni simbolo, 0 1, diverso da quello conservato
nello stato, e prosegue verso destra.

3. <5([</i, a], B) = ([</1 . B\,B, R) per a = ( ) o = I. Se M raggiunge il primo blank,


entra nello stato accettante [^1 . B\.

Tecniche di programmazione per le macchine di Turing 351


Notiamo che, in Al, ((<71, a],a) non definita per a = O o a = I. Di conseguenza, se
incontra per la seconda volta il simbolo conservato nel suo controllo, M si ferma senza
entrare nello stato accettante.

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:

L Wc.w {wcw |u in (0 + 1 )+}


La macchina di Turing destinata allo scopo

M = (Q. , , , [qi,B], [B , B), {[<&,B}})


Q : l insieme degli stati {<?i, q?,. . . . q$} x {(), I, B), cio le coppie formate da uno
stato di controllo q e da una componente di dati, 0, 1 o B. Ci serviamo nuovamente
della memoria nel controllo e facciamo in modo che lo stato ricordi un simbolo di
input, 0 o I .
: l'insieme dei simboli di nastro {/?,*} x (0. l,c . B}. La prima componente, o
traccia, pu essere bianca (simbolo ) o vistata (simbolo *). Ci serviamo di *
per contrassegnare i simboli del primo e del secondo gruppo di 0 e 1 , per poter
infine confermare chc la stringa a sinistra della c, segnale di mezzo, uguale a
quella a destra. La seconda componente di un simbolo di nastro reca il simbolo di
nastro vero e proprio. Cos il simbolo |, X ] corrisponde al simbolo di nastro X ,
per X = OA.c.B.
: i simboli di input sono [B, 0] c [7?, 1 ], che identifichiamo rispettivamente, come
spiegato, con O e L

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-,

vista il simbolo appena letto e si sposta a destra. Notiamo che il visto si


ottiene cambiando da B a * il primo componente del simbolo di nastro.
2 . ([<72,], [B, ]) = ([<72, a], [B. &]. R). M si sposta verso destra in cerca del

simbolo c. Ricordiamo che sia a sia b possono valere, indipendentemente, 0


o 1 , ma non c.
3. ([</2 , a], [B, c]) = ([<73, o], [B,c],.R). Quando legge c, M prosegue verso
destra, ma cambia in q:i lo stato di controllo.
4. <5([<73,a], [*,&]) ([<73, a], [*, 6], R). Nello stato <73, M prosegue, superando
tutti i simboli vistati.
5. ([<73, ], [B, a]) = {{q\. B\, [*, a], L ). Se il primo simbolo non vistato che M
trova coincide con quello nel controllo, lo vista, perch si abbina con il sim
bolo corrispondente nel primo blocco di 0 e I. M va nello stato di controllo
<74, elimina il simbolo dal controllo c comincia a muoversi verso sinistra.
6 . ([<74, Bi, [*, 0.]) = ([<74, B], [*,a].L). Al oltrepassa verso sinistra i simboli

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

cui il simbolo a sinistra di c non vistato. M va nello stato qo e prosegue a


sinistra in cerca di un simbolo vistato.
9. ([fle, B], [B , a]) ([<7^, B ], [7?.a], L). Finch i simboli non sono vistati. M
resta nello stato qo e si sposta a sinistra.
10. ([ge, B\, [*,]) = ([</i,?], [*,a], J?). Quando trova il simbolo vistato, M
entra nello stato </1 e si sposta a destra per memorizzare il prossimo simbolo
non vistato.

Tecniche di programmazione per le macchine di Turing 353


11. ([^5 . B], [*, a]) = (fc/7 , Bj, [*, a], 11). Ora M tratta il caso in cui dallo stato
<73 si appena spostata a sinistra di c e trova un simbolo vistato. Al ricomincia

a muoversi verso destra entrando nello stato (.


12. <S([<77, B\, [/?, e]) = ({qs, B], [B, c], R). Nello stalo q-, Al vede certamente c.
Allo stesso tempo entra nello stato q$ e prosegue verso destra.
13. ([t/s, B\, [*, ]) = ([8, B], [*, a], R). Al si sposta nello stato
do qualsiasi 0 1 vistato.

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

4. Lultimo passo consiste nel cancellare la sequenza iniziale IOn I.


Il cuore deHalgoritmo una subroutine, che chiameremo Copy, destinata a eseguire il
passo (2), cio a copiare in coda il blocco di n simboli 0. Pi esattamente Copy trasforma
una ID di forma 0m-fcIgiOn IO ^fc-1 " nella TD Om-fc IgsOriIOfcr'. Lc transizioni di Copy
sono illustrate nella Figura 8.14. La subroutine contrassegna il primo 0 con X , si sposta
a destra nello stato g> fino a un blank, vi copia lo 0 e si sposta a sinistra nello stato <73 fino
alla A'. Il ciclo si ripete finch, nello stato q\, trova un 1 anzich uno 0. A quel punto,
nello stato q.\,ritrasforma gli X in 0 e termina nello stato q-j.
La macchina di Turing completa per la moltiplicazione parte dallo stato qo. Per prima
cosa passa, in pi mosse, dalla ID go0m10 a^ a ID Om - 1 lg ,0 n l. Le transizioni ne
cessarie sono illustrate nella Figura 8.15, a sinistra della chiamata di subroutine; queste
transizioni coinvolgono solo gli stati qo e g.
Nella Figura 8.15, a destra della chiamata alla subroutine, si vedono gli stati da q7
a ci 2 Gli stati q 7 , q$ c q<j hanno lo scopo di riprendere il controllo dopo che Copy ha
copiato un blocco di n simboli 0 e si trova nella ID 0m-fc IgsOrtIOfcn. Da questi stati la
TM giunge infine allo stalo go0m-fc IOn IOfcr'. A quel punto I ciclo ricomincia, c Copy
viene chiamata di nuovo per copiare il blocco di n 0 .
Nello stato gg, per, la TM pu rilevare che tutti gli m 0 sono stati mutati in blank
(cio k = ni). In tal caso avviene una transizione allo stato g)0. Insieme a gn questo
stato trasforma in blank la sequenza iniziale IOii I , per poi passare allo stato di arresto qr.
Ora la TM si trova nella ID g12Or'm e il suo compito terminato.

8.3.4

Esercizi

! Esercizio 8.3.1 Ridefinite le macchine di Turing dellEscrcizio 8.2.2 sfruttando le tecni


che di programmazione descritte nel Paragrafo 8.3.
! Esercizio 8.3.2 Unoperazione frequente nei programmi per macchine di Turing compor
ta uno slittamento. In teoria vorremmo creare una cella in pi accanto alla posizione
corrente della testina per collocarvi un simbolo, ma non possiamo alterare il nastro in
questo modo. Dobbiamo allora spostare di una cella a destra il contenuto di ogni cella a
destra della testina, per poi tornare alla posizione corrente. Spiegate come realizzare que
sta operazione. Suggerimento: lasciate un simbolo speciale per contrassegnare il punto in
cui riportare la testina.
* Esercizio 8.3.3 Scrivete una subroutine che sposti la testina di una TM dalla posizione
corrente verso destra, saltando gli 0 fino a raggiungere un I o un blank. Se la posizione
corrente non contiene uno 0, la subroutine deve arrestarsi. Potete assumere che i simboli
di input siano solo 0, I e B (blank). Servitevi della subroutine per definire una TM che
accetta le stringhe di 0 e 1 che non hanno due 1 consecutivi.

Tecniche di programmazione per le macchine di Turing


1/1 -*

l/l

0/0

0/0

Figura 8.14 La subroutine Copy.

Figura 8.15 II programma per la moltiplica/ione impiega la subroutine Copy.

356

8.4

Capitolo 8

Estensioni alla macchina di Turing semplice

In questo paragrafo vedremo alcuni modelli di calcolatore analoghi alle macchine di Tu


ring e con le stesse capacit di riconoscimento dei linguaggi del modello di base di TM fin
qui trattato. Uno di essi, la macchina di Turing multinastro, importante perch rispetto
al modello mononastro facilita la simulazione di un vero calcolatore (o di macchine di
Turing d'altro tipo). Per quanto riguarda la capacit di riconoscere linguaggi, i nastri in
pi non aggiungono nulla.
Esaminiamo poi la macchina di Turing non deterministica, un'estensione del modello
di base che pu scegliere fra un insieme finito di mosse in ogni situazione. Anche questa
estensione facilita in certi casi la programmazione di una macchina di Turing senza
allargare i linguaggi definibili rispetto al modello di base.

8.4.1

Macchine di Turing multinastro

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.

Estensioni alla macchina di Turing semplice 357

Figura 8.16 Una macchina di Turing multinastro.

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

Equivalenza di macchine di Turing mononastro e multinastro

Ricordiamo che i linguaggi ricorsivamente enumerabili sono, per definizione, quelli ac


cettati da una TM mononastro. Ovviamente le TM multinastro accettano tutti i linguaggi
ricorsivamentc enumerabili, perch una TM mononastro un caso particolare di TM mul
tinastro. Possiamo chiederci allora se esistono linguaggi non ricorsivamente enumerabili,
ma accettati da una TM multinastro. La risposta no, e lo proveremo spiegando comc
simulare una TM multinastro per mezzo di una TM mononastro.
Teorema 8.9 Ogni linguaggio accettato da una TM multinastro ricorsivamente enume
rarle.
D IM O STR A ZIO N E La dimostrazione illustrata nella Figura 8.17. Sia

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.

Estensioni alla macchina di Turing sem plice

359

Richiamo sulla finitezza


Confondere un valore che a ogni istante finito con un insieme finito di valori un
errore frequente. La costruzione da n a 1 nastro serve a illustrare la differenza. In
essa sfruttiamo le tracce del nastro per registrare le posizioni delle testine. Perch
non possiamo registrare le posizioni come interi nel controllo? Sbagliando, si
potrebbe ragionare cos: dopo n mosse, le testine della TM devono trovarsi a
distanze inferiori a n dalle posizioni iniziali: dunque per ogni testina si deve
memorizzare un intero non pi grande di n.
In realt, anche se in ogni istante le posizioni sono espresse da numeri finiti,
linsieme delle posizioni possibili in tutti gli istanti infinito. Per poter rappresen
tare qualsiasi posizione, un componente dello stato deve poter registrare qualsiasi
intero. Questo componente imporrebbe allinsiem e degli stati di essere infinito,
sebbene in ogni istante solo un numero finito di essi sia possibile. La definizione
di m acchina di Turing richiede chc Yinsieme degli stati sia finito. Non quindi
possibile memorizzare la posizione di una testina nel controllo finito.

8.4.3

Tempo di esecuzione e costruzione da n a un nastro

Introduciamo un concetto che diventer importante in seguito: la complessit in tempo,


o tempo di esecuzione, di una macchina di Turing. Diciamo che il tempo di esecuzione
della TM Al sull'input w il numero di passi che Al compie prima di arrestarsi. Se Al
non si arresta su tv, diciamo che il tempo di esecuzione infinito. La complessit in tempo
della TM Al la funzione T(n), definita come il massimo, su tutti gli input w di lunghezza
n, del tempo di esecuzione di Al su w. Per una macchina di Turing che non si arresta su
tutti gli input. T(n) pu essere infinito per alcuni , o anche per tutti. Dedicheremo
particolare attenzione alle TM che si arrestano su tutti gli input, e in particolare a quelle
che hanno complessit in tempo polinomiale, a partire dal Paragrafo 10.1.
La costruzione del Teorema 8.9 pu sembrare contorta. In effetti la TM mononastro
pu avere tempi di esecuzione molto pi lunghi di quella multinastro. D altra parte i tempi
di esecuzione delle due macchine sono commensurabili in senso debole: quello della TM
mononastro non supera il quadrato del tempo dellaltra. Lelevamento al quadrato, sep
pure non trascurabile, preserva la polinomialit del tempo di esecuzione. Nel Capitolo 10
prenderemo in considerazione due fatti.
a) La differenza fra tempo polinomiale e tassi di crescita pi alti lo spartiacque fra
problemi risolvibili e problemi irrisolvibili nella pratica con un calcolatore.
b) Nonostanic studi approfonditi, per molti problemi il tempo di esecuzione si pu

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.

Dimostriamo ora che i tempi di esecuzione di una TM multinastro e della corrispondente


m ononastro sono in rapporto quadratico.
Teorema 8.10 II tempo necessario alla TM mononastro N del Teorema 8.9 per simulare
n mosse della TM con k nastri M 0 ( n 2).
DIMOSTRAZIONE Dopo n mosse di M i marcatori delle testine non possono essere distanti
fra loro pi di 2n celle. Perci, partendo dal marcatore pi a sinistra, per trovarli tutti N
non deve spostarsi di pi di 2 n celle a destra. A quel punto pu tornare verso sinistra
modificando il contenuto dei nastri simulati di M e spostando i marcatori a sinistra o a
destra. Questa operazione non richiede pi di 2 ri movimenti a sinistra, oltre a non pi
di 2 k mosse nellaltra direzione per scrivere un marcatore X nella cella a destra (se una
testina di M si sposta a destra).

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

Macchine di Turing non deterministiche

Una macchina di Turing non deterministica (NTM, Nondetenninistic Turing Machine) si


distingue da quella determ inistica nella funzione di transizione <5, che associa a ogni stato
q e a ogni simbolo di nastro X un insieme di triple:

Siqi X ) = { foi, Y i, D 1), (q2 Y2, D2)

, (qk, Yk, Dk))

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

Estensioni alla macchina di Turing sem plice

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

F ig u ra 8.18 Sim ulazione di una NTM da parte di una D TM .


Per elaborare la ID corrente, M

compie quattro operazioni.

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

4. M o torna alla ID corrente contrassegnata in precedenza, cancella il contrassegno c

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

Esercizio 8.4.1 P ero g n i linguaggio dcllEsercizio 8.2.2 descrivete, informalmente ma


chiaramente, una macchina di Turing multinastro che lo accetti. Cercate di avere tempi di
esecuzione proporzionali alla lunghezza dell'input.
Esercizio 8.4.2 Definiamo la funzione di transizione della TM non deterministica M =
({yo- 1-(/2 }, { 0 ,1 ) ,(0 , l ,B } ,6 tqo,B, {<?2}):

Qo
Qi
<72

{(<?o,l, R)}
{(<7i,0, R), (</o,0. L)}
0

{ (9 i,0 , /?)}
{( 1, 1. R), (0, L I ) }
0

Elencate le ID raggiungibili dalla ID iniziale per i seguenti input:

{(</2 <B,R)}
0

Estensioni alla macchina di Turing semplice

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

M = {{qo,<h,q2,qf}. { 0 .1}; {0 . 1 , B},, Qq, B, {(//})


D escrivete, informalmente ma chiaram ente, il linguaggio L ( M ) se <5 definita dalle se
guenti regole: (q0,Q) = {(g0, l , R ) , (g i,l.J S ) } ; (q\A) = {( 2 , 0 . / 1)}; <S(fl2 , l ) =
{(q0,l,R )}\ 6(q x,B ) = {(qf ,B , R ) } .

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

Macchine di Turing ridotte

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

Macchine di Turing ridotte

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

Macchine di Turing con nastri semi-infiniti

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.

Teorema 8.12 Ogni linguaggio accettato da una TM M 2 accettato anche da una TM


M y con i seguenti vincoli.

1. La testina di My non va mai a sinistra della posizione iniziale.


2. M y non scrive mai un blank.
DIMOSTRAZIONE II secondo vincolo non pone problemi: si definisce un nuovo simbolo
di nastro, B ', che funge da blank, ma non il blank B.

a) Se in M 2 vale la regola 2(q ,X ) = (p ,B ,D ) . Ia modifichiamo in o(q. X ) =


( , ', ) .

b) Per ogni stato q definiamo iiq, B ') = S2(q, B).


11 primo vincolo pi impegnativo. Sia
M 2 = (Q , , 2,5 2, /2- B , F 2)

Macchine di Turing ridotte

367

la TM AZ2 modificata in modo che non scriva mai il blank B. Costruiamo


AZ1 = (Q 1, X { B } ,r u S ,,Q0^ B iB l F 1)
con le seguenti definizioni.
Qi : gli stati di M i sono {go, g} U (Q 2 x {U, L }). Essi comprendono lo stato iniziale
go, un secondo stato gj e tutti gli stati di AZ2 con un secondo componente, di valore
U (superiore) o L (inferiore). Il secondo componente indica se AZ2 guarda la traccia
superiore o quella inferiore (vedi Figura 8.19). In altre parole U significa che la
testina di M 2 sulla sua posizione iniziale o alla sua destra; L significa che a
sinistra.
] : i simboli di nastro di M i sono coppie di simboli di F 2, cio elementi di 2 x F 2. I
simboli di input di M i sono coppie formate da un simbolo di input di M 2 nel primo
componente e un blank nel secondo, cio coppie della forma [. B], dove a in .
Il blank di M 1 formato da blank nei due componenti. Inoltre, per ogni simbolo
X in 2 , c una coppia [X, *] in F j . Qui * un nuovo simbolo, esterno a T2, che
serve a marcare lestremo sinistro del nastro di AZ1.
^1: le transizioni di AZ1 sono definite come segue.
1. h (go, [a, B ]) = (gl5 [. *],/?) per ogni a in . La prima mossa di M 1 colloca
il segno * sulla traccia inferiore della cella pi a sinistra. Lo stalo diventa q\ e
la testina si sposta a destra perch non pu andare a sinistra n restare ferma.
2. 5 i(g i, [X, ]) = ([g2, U], \X, B\,L) per ogni X in T2- Nello stato qi, M 1
riproduce le condizioni iniziali di Ai2 riportando la testina alla posizione ini
ziale ed entrando nello stato [g2. 7], lo stato iniziale di AZ2, con la testina che
legge la traccia superiore di AZ1.
3. Se <52(g .X ) = (, Y, D ), allora per ogni Z in F 2:
(a) ,( ( ,,i/] , [ X Z ) ) = ( [ p ,i/],[ y ,Z ] ,B )

(b) 1(1, I. [z, X!) = (Ip, I, IZ, n D


dove D la direzione opposta a D , cio L se D = B., ed l se D = L. Se non
si trova al bordo sinistro, M 1 simula AZ2 sulla traccia opportuna: la superiore
se il secondo componente dello stato U, Finferiore se L. Notiamo chc
AZ1, quando opera sulla traccia inferiore, si muove nella direzione opposta
a quella di AZ2. Infatti la met sinistra del nastro di AZ2 stata ripiegata, e
quindi rovesciata, lungo la traccia inferiore del nastro di M 1.
4. Se 2(<7< X ) = (p, Y-l), allora

^1(Ig1L )JX ,* ])

=S 1 HqiU].. [X,*]) = (\p,U],\Y,*],R)

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

Consideriamo ora alcuni modelli computazionali fondati su generalizzazioni deMautoma


a pila. Esaminiamo in primo luogo che cosa succede se dotiamo un PDA di pi di una
pila. DaHEsempio 8.7 sappiamo che una macchina di Turing pu accettare linguaggi chc
nessun PDA con una pila accetta. Scoprirem oche i PDA con due stack accettano gli stessi
linguaggi delle macchine di Turing.
Consideriamo poi una classe di macchine dette 'a contatori". Esse possono solamente
memorizzare un numero finito di interi (detti contatori) e scegliere fra mosse diverse a
seconda che uno dei contatori valga 0. Una macchina a contatori pu solo sommare o
sottrarre 1 dai contatori e non in grado di distinguere due valori differenti, diversi da
0. Di fatto un contatore uno stack in cui si possono collocare solo due simboli: un
segnale di fondo-stack, che compare esclusivamente al fondo, e un altro simbolo, che si
pu mettere e togliere.
Non svolgeremo una trattazione formale delle macchine multistack; il concetto il
lustrato dalla Figura 8.20. Una macchina con ,-stack un PDA deterministico dotato di
k stack. Al pari di un PDA, esso riceve linput da una sorgente anzich leggerlo su un

Macchine di Turing ridotte

Input

369

A ccetta/rifiu ta

F ig u ra 8.20 Una macchina con tre stack.

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

e sostituire X i in cima alli-esim o stack con la stringa 7 *, per ogni i = 1 , 2 , . . . , k. Le


macchine multistack accettano entrando in uno stato finale.
A ggiungiam o una caratteristica che semplifica il trattamento dcll'input da parte di
queste macchine deterministiche: assum iam o la presenza di un sim bolo speciale $. detto
segnale di fine, che compare solo alla fine dellinput, ma non fa parte dellinput. La
presenza del segnale di fine permette di sapere quando tutto l'input stato consumato. Nel
prossimo teorema vedremo che questo segnale semplifica la sim ulazione di una m acchina
di Turing da parte di una macchina multistack. Notiam o chc la TM tradizionale non ne
ha bisogno perch il primo blank segnala la fine dell'input.

Teorema 8.13 Sc un linguaggio L accettato da una m acchina di Turing, allora L


accettato da una macchina con due stack.
Si sfrutta il fatto chc due stack possono simulare il nastro di una mac
china di Turing; uno stack conserva ci che sta a sinistra della testina, l'altro ci che sta
a destra (sono escluse le stringhe infinite di blank oltre i simboli diversi dal blank pi
a sinistra e pi a destra). In dettaglio, sia L L ( M ) per una TM M con un nastro.
Descriviamo le operazioni della macchina con due stack 5 .
d i m o s t r a z i o n i *;

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.

Macchine di Turing ridotte

371

(d) Il nuovo stato di M viene registrato in un componente del controllo di S al


posto del precedente.
(e) Sc M sostituisce X con Y e va a destra, S pone Y sul primo stack a rappre
sentare il fatto che ora Y a sinistra della testina di M . X viene tolto dal
secondo stack di S. Ci sono due ecce/ioni.
i. Sc contiene solo lindicatore di fondo (e quindi X un blank), il secondo
stack non viene modificato: M si spostato su un altro blank pi a destra.
ii. Sc Y c un blank e il primo stack vuoto, il primo stack rimane vuoto. Il
motivo chc a sinistra della testina di M ci sono ancora solo blank.
(0 Se M sostituisce X con Y e va a sinistra, S toglie il simbolo in cim a al primo
stack (diciamo Z) e sostituisce X con Z Y nel secondo stack. In questo modo
si tiene conto del fatto che il simbolo che era immediatamente a sinistra della
testina ora sotto di essa. Si ha uneccezione quando Z il segnale di fondo;
M deve allora porre B Y sul secondo stack senza togliere nulla dal primo.
6. S accetta se il nuovo stato di M accettante, altrimenti simula unaltra mossa di
M nello stesso modo.

8.5.3

Macchine a contatori

Ci sono due modi di vedere una macchina a contatori.


1. Una macchina con la stessa struttura delle macchine multistack (Figura 8.20), ma
con un contatore al posto di ogni stack. I contatori memorizzano interi non negativi,
ma possiamo distinguere solo un valore nullo da uno non nullo. Dunque la mossa
di una macchina a contatori dipende dallo stato, dal simbolo di input e da quali
contatori, se cc nc sono, hanno valore nullo. In una mossa la macchina compie due
operazioni.
(a) C am biastato.
(b) Somma o sottrae 1 da un contatore. Poich' un contatore non pu diventare
negativo, la macchina non pu sottrarre 1 da un contatore nullo.
2. Una macchina multistack con i vincoli seguenti.
(a) Ci sono due soli simboli di stack, che denoteremo Z 0 ( indicatore di fondo
stack) c X .
(b) A llinizio ogni stack contiene Z (>.

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 .

Ci serviremo della definizione ( 1) di macchina a contatori, ma chiaro che le due defi


nizioni sono equivalenti. Infatti uno stack X iZ 0 si pu identificare con il valore i. Nella
definizione (2) possiamo distinguere un contatore nullo dagli altri perch vediamo Z q an
zich X alla sommit dello stack. Non possiamo invece distinguere fra loro due contatori
non nulli perch entrambi hanno X in cima allo stack.

8.5.4

La potenza delle macchine a contatori

Per ci che riguarda i linguaggi accettati da macchine a contatori, alcune osservazioni,


per quanto ovvie, sono degne di nota.
Ogni linguaggio accettato da una macchina a contatori ricorsivamcntc enumcrabile. Infatti una macchina a contatori un caso speciale di macchina multistack, e
questa un caso speciale di macchina di Turing multinastro, che per il Teorema 8.9
accetta solo linguaggi ricorsivamente enumerabili.
Ogni linguaggio accettato da una macchina con un contatore un CFL. Secondo
la Definizione (2) un contatore uno stack; dunque una macchina con un conta
tore un caso particolare di macchina con uno stack, cio un PDA. I linguaggi
delle macchine monocontatore sono in effetti accettati da PDA deterministici, ma
la dimostrazione sorprendentemente complessa. La difficolt nasce dal fatto che
le macchine multistack e a contatori hanno un segnale $ alla fine dell'input. Un
PDA non deterministico pu scommettere di aver letto lultimo simbolo di input
e di dover leggere $; quindi un PDA non deterministico privo del segnale di fine
input pu chiaramente simulare un DPDA con quel segnale. La parte difficile, che
non tratteremo, c la prova chc un DPDA senza segnale pu simulare un DPDA con
il segnale.
Le macchine a contatori danno un risultato sorprendente: due contatori sono sufficienti
per simulare una macchina di Turing, e quindi per accettare qualsiasi linguaggio ricor
sivamente enumerabile. Ce ne occupiamo ora, dimostrando dapprima che bastano tre
contatori, e poi simulandone tre con due soltanto.

Teorema 8.14 Ogni linguaggio ricorsivamente enumerabile accettato da una macchina


con tre contatori.

M acchine di Turing ridotte

373

Partiamo dal Teorema 8.13, secondo cui ogni linguaggio ricorsivamente


enumcrabilc accettato da una macchina con due stack. Dobbiamo spiegare come si
simula uno stack tramite contatori. Supponiamo che la macchina a stack usi r 1 simboli
di nastro. Possiamo identificarli con le cifre da I a r - I e trattare uno stack X y X 2 X n
come un intero in base r. Lo stack, con la sommit a sinistra come al solito, sarebbe
dunque rappresentato dallintero X nr n~ 1 + X n i rn~'2 -1------- 1- X 2r + XiCi serviamo di due contatori per memorizzare gli interi che rappresentano i due stack.
Il terzo contatore serve a regolare gli altri due. In particolare serve a dividere o moltipli
care un numero per r.
Le operazioni su uno stack sono di tre tipi: togliere il simbolo alla sommit, scambiar
lo con un altro, immettere un nuovo simbolo. Una mossa della macchina con due stack
pu richiedere pi di unoperazione; in particolare la sostituzione del simbolo alla som
mit, X , con una stringa si divide nella sostituzione di X e nel successivo inserimento di
simboli. Descriviamo ora come svolgere queste operazioni su uno stack rappresentato da
un valore i. Notiamo chc per compiere unoperazione che richiede di contare fino a r, o
meno, si pu usare il controllo della macchina multistack.
d im o s t r a z io n e

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.

Per completare la costruzione dobbiamo predisporre i contatori in modo chc simulino le


condizioni iniziali degli stack con il solo simbolo iniziale della loro macchina. Questo
passo si compie aumentando il valore dei due contatori di una quantit pari al numero, fra
1 c r 1, che corrisponde al simbolo iniziale.

Teorema 8.15 Ogni linguaggio ricorsivamente cnumerabilc accettato da una macchina


con due contatori.

374

Capitolo 8

Scelta delle costanti nella simulazione da 3 a 2 contatori


Nella dimostrazione del Teorema 8.15 fondamentale che 2, 3 e 5 siano numeri
primi distinti. Sc scegliessimo per esempio rn = 2*3J'4 fe, il valore m = 12
potrebbe rappresentare sia i = 0, j = I e k = 1, sia i = 2, j = 1 e k = 0. Non
potremmo quindi stabilire se i o k vale 0 e non potrem m o simulare fedelmente la
macchina a tre contatori.

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

Esercizio 8.5.1 Descrivete informalmente, ma chiaramente, le macchine a contatori che


accettano i linguaggi seguenti. In ciascun caso usate il m inor numero possibile di conta
tori, ma mai pi di due.

L e m acchine di Turing e i com puter

375

* a) (OriI m I n > m > 1}.


b) (On I m I I < m < n}.

*! 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

Le macchine di Turing e i computer

Confrontiam o ora la macchina di Turing e un com puter ordinario. Possono sembrare


modelli alquanto diversi, ma in effetti accettano esattam ente gli stessi linguaggi, ossia i
linguaggi ricorsivamente enum erabili. Poich il concetto di com puter ordinario non
definito in termini matematici precisi, la trattazione di questo paragrafo necessariam en
te informale. Per quanto riguarda le capacit dei com puter ci affidiamo allintuizione,
specialm ente quando i numeri coinvolti eccedono i limiti insiti nellarchitettura di queste
m acchine (per esempio spazi di indirizzamento a 32 bit). Le affermazioni del presente
capitolo possono essere suddivise in due parti.
1. Un com puter pu sim ulare una macchina di Turing.
2. Una macchina di Turing pu simulare un com puter in tem po pari al pi a un
polinom io nel num ero di operazioni svolte dal computer.

8.6.1

Simulazione di una macchina di Turing da parte


di un computer

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 sin is tra


d e lla te stin a

N a s tro a d estra
d e lla te stin a

Figura 8.21 Simulazione di una m acchina di Turing tramite un comune computer.

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

Le macchine di Turing e i com puter

377

Il problema di alfabeti molto ampi


Il ragionamento del Paragrafo 8.6.1 diventa discutibile se il numero di simboli di
nastro cos grande che il codice di un simbolo non pu stare in un disco. Ce ne
dovrebbero essere davvero molti, visto che per esempio un disco da 30 GB pu
rappresentare 2240000000000 simboli. Anche il numero di stati potrebbe essere
cos alto da non permetterci di rappresentarne uno neppure usando tutto il disco.
Per risolvere il problema si pu anzitutto limitare il numero di simboli di
nastro. Possiamo codificare in binario qualsiasi alfabeto. Perci ogni TM M pu
essere simulata da unaltra TM M 1 con tre simboli di nastro: 0. 1 e t. Per
M 1 ha bisogno di molti stati. Per simulare una mossa di M . deve percorrere il
nastro e ricordare nel controllo tutti i bit chc indicano il simbolo guardato da M .
Gli insiemi di stati diventano enormi e pu darsi che il PC che simula M f debba
smontare e rimontare svariati dischi per decidere qual lo stato di M ' e quale la
m ossa successiva. Nessuno vorrebbe usare un com puter cos, e dunque i sistemi
operativi non hanno supporto per programmi di questo tipo. Si pu comunque
programmare il com puter grezzo" per dotarlo di questa capacit.
Per fortuna il problema di simulare una TM con un gran numero di stati o
simboli di nastro ammette unaltra soluzione. Vedremo nel Paragrafo 9.2.3 come
definire una TM a programma memorizzato. Questa TM. detta universale , ri
ceve sili nastro la funzione di transizione di un'altra TM. codificata in binario, e la
simula. La TM universale ha un ragionevole numero di stati e di simboli di nastro.
Simulando la TM universale, un computer ordinario pu accettare qualunque lin
guaggio ricorsivamente enumerabile senza dover ricorrere alla simulazione di un
numero di stati che superi i limiti di memoria del disco.

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

Simulazione di un computer da parte di una macchina


di Turing

Consideriamo ora il problema opposto: esistono funzioni che un computer comune pu


svolgere e una macchina di Turing no? U nimportante domanda subordinata : un com
puter pu svolgere determinate funzioni pi velocemente di una macchina di Turing? Nel
presente paragrafo dimostriamo che una TM pu simulare un computer e nel Paragra
fo 8.6.3 proviamo che la simulazione pu essere svolta in modo efficiente, nel senso chc
i tempi di esecuzione del computer e della TM su un dato problema sono separati solo
da un polinomio. Ricordiamo nuovamente al lettore che ci sono ragioni importanti per
considerare simili i tempi di esecuzione in rapporto polinomiale, mentre differenze espo
nenziali nei tempi di esecuzione sono eccessive . Riprenderemo la teoria dei tempi di
esecuzione polinomiali confrontati con quelli esponenziali nel Capitolo 10.
Per cominciare lo studio della simulazione di un computer da parte di una TM, diamo
un modello realistico, per quanto informale, di come opera un tipico computer.
a) Innanzitutto supporremo che la memoria di un computer consista di una sequenza
indefinitamente lunga di parole, ciascuna con un indirizzo. In un computer reale
le parole possono essere lunghe 32 oppure 64 bit, ma qui non porremo limiti di
lunghezza. Assumiamo che gli indirizzi siano gli interi 0, 1, 2, e cos via. In un
computer reale i singoli byte sono numerati da interi consecutivi. Pertanto le parole
hanno indirizzi multipli di 4 o 8 , ma una differenza irrilevante. In un computer
reale ci sarebbe inoltre un limite al numero di parole contenute nella memoria ;
dato chc vogliamo trattare il contenuto di un numero arbitrario di dischi o altri
dispositivi di memoria, assumeremo che da questo punto di vista non esista limite.
b) Supponiamo che il programma del computer sia memorizzalo in alcune parole di
memoria, ognuna delle quali rappresenta una semplice istruzione (come nel lin
guaggio macchina o assembly di un tipico computer). Ne sono esempi le istruzioni
che spostano i dati da una parola a unaltra o chc sommano una parola a unaltra.
Assumiamo che sia permesso !indirizzamento indiretto, per cui unistruzione
pu fare riferimento a unaltra parola e usarne il contenuto comc indirizzo della
parola cui viene applicata loperazione. Tale capacit, che ritroviamo in tutti i com
puter moderni, necessaria per accedere a un array, per seguire i link di una lista o,
in generale, per compiere operazioni su puntatori.

Le macchine di Turing e i computer

379

c) Supponiamo che ciascuna istruzione tocchi un numero limitato (finito) di parole c


che ciascuna istruzione cambi il valore di non pi di una parola.
d) Un computer tipico dispone di registri, che sono parole di memoria con un ac
cesso particolarmente rapido. Spesso ci sono limitazioni tali che operazioni come
laddizione si svolgono solo nei registri. Qui non faremo queste restrizioni e per
metteremo che qualunque operazione venga svolta su qualunque paiola. Non si
terr conto della velocit relativa delle operazioni su parole diverse: quando ci li
mitiamo a confrontare le capacit di riconoscimento di linguaggi dei com puter e
delle macchine di Turing, non necessario. Anche se siamo interessati a tempi di
esecuzione a meno di un polinomio, le velocit relative di accessi a parole diverse
sono irrilevanti, dato chc le differenze costituiscono solo un fattore costante.
La Figura 8.22 suggerisce come si potrebbe definire la macchina di Turing perch simuli
un computer. Tale TM usa diversi nastri, ma potrebbe essere convertita in una TM a nastro
unico usando la costruzione del Paragrafo 8.4.1. 11 primo nastro rappresenta l intera m e
moria del computer. Abbiamo usato un codice in cui gli indirizzi delle parole di memoria,
in ordine numerico, si alternano con i contenuti delle parole di memoria stesse. Sia gli
indirizzi sia i contenuti sono scritti in binario. I simboli marcatori * e # facilitano il rico
noscimento del termine degli indirizzi e dei contenuti, c indicano se una stringa binaria c
un indirizzo oppure un contenuto. Un altro marcatore, $, indica linizio della sequenza di
indirizzi e contenuti.
Il secondo nastro il contatore di istruzione e contiene un unico intero in binario,
chc rappresenta una delle locazioni di memoria sul nastro I. Il valore memorizzato in
questa locazione sar interpretato come la prossima istruzione da eseguire.
Il terzo nastro contiene un indirizzo di memoria o il suo contenuto dopo che esso
stato individuato sul nastro 1. Per eseguire un istruzione, la TM deve trovare il contenuto
di uno o pi indirizzi di memoria che contengono dati usati nella computazione. In primo
luogo lindirizzo desiderato viene copiato sul nastro 3 e confrontato con gli indirizzi sul
nastro 1 finch si ottiene una corrispondenza. Il contenuto di tale indirizzo viene copiato
sul terzo nastro e spostato ovunque ce ne sia bisogno, di solito in uno degli indirizzi bassi,
che rappresentano i registri del computer.
La TM simula il ciclo-istruzione del computer nel modo seguente.
1. Percorriamo il primo nastro alla ricerca di un indirizzo che corrisponda al numero
di istruzione sul nastro 2. Partiamo dal $ sul primo nastro e ci muoviamo verso
destra, confrontando ogni indirizzo con i contenuti del nastro 2. Il confronto di
indirizzi sui due nastri facile, dato che ci basta muovere le testine verso destra, in
tandem, controllando che i simboli guardati siano sempre gli stessi.
2. Quando troviamo lindirizzo dellistruzione esaminiamo il suo valore. Assum ia
mo che quando una parola un'istruzione i suoi primi bit rappresentano l'azione

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.

Le macchine di Turing c i com puter

381

(a) Copiare il valore in un altro indirizzo. Otieniamo il secondo indirizzo dal


l'istruzione; lo troviamo collocandolo sul nastro 3 e cercandolo sul nastro 1,
come visto in precedenza. Dopo averlo trovato, copiamo il valore nello spazio
riservato al valore d ellindirizzo. Sc c bisogno di uno spazio maggiore per il
nuovo valore oppure il nuovo valore usa meno spazio del vecchio, cambiamo
lo spazio disponibile in questo modo.
i. Copiamo su un nastro ausiliario lintero nastro non bianco a destra del
punto in cui va a porsi il nuovo valore.
ii. Scriviamo il nuovo valore usando uno spazio adeguato.
iii. Copiamo nuovamente il nastro ausiliario sul nastro 1, immediatamente a
destra del nuovo valore.
Pu succedere, in un caso particolare, che lindirizzo non compaia ancora sul
primo nastro perch non stato usato dal com puter in precedenza. In tal caso
troviamo il punto nel primo nastro in cui dovrebbe stare, operiamo come sopra
per creare uno spazio adeguato, e vi memorizziamo sia l'indirizzo sia il nuovo
valore.
(b) Sommiamo il valore appena trovato al valore di un altro indirizzo. Torniamo
allistruzione per localizzare laltro indirizzo, che troveremo sul nastro I. Fac
ciamo una somma binaria del valore di tale indirizzo e del valore memorizzato
sul nastro 3. Percorrendo i due valori a partire dalle loro estremit a destra,
una TM pu svolgere facilmente una somma con riporto. Sc per il risultato
ci volesse maggiore spazio, usiamo la tecnica descritta per creare spazio sul
nastro 1.
(c) Listruzione un salto", cio la direttiva di prendere la prossima istruzione
dallindirizzo che il valore memorizzato sul nastro 3. Copiamo semplicemente il nastro 3 sul nastro 2 e ricominciamo il ciclo-istruzione.
5. Dopo aver eseguito l istruzione e determinato che non si tratta di un salto, aggiun
giamo 1 al contatore di istruzione sul nastro 2 e ricom inciam o il ciclo-istruzione.

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

Confronto dei tempi di esecuzione dei computer


e delle macchine di Turing

Dobbiamo ora affrontare il punto relativo al tempo di esecuzione di una macchina di


Turing che simula un computer. Come suggerito precedentemente, possiamo fare tre
importanti osservazioni.
Il tempo di esecuzione un aspetto importante perche ci serviremo della TM non
solo per stabilire che cosa sia calcolabile in assoluto, ma anche quanto sia calco
labile con tanta efficienza da poter applicare una soluzione basata sulluso di un
computer.
In genere si ritiene che lo spartiacque tra problemi trattabili, ossia quelli che pos
sono essere risolti efficientemente, e intrattabili, ossia quelli che possono essere
risolti, ma non abbastanza velocemente da rendere fruibile la soluzione, si collo
chi tra quanto pu essere computato in un tempo polinomiale c quanto richiede un
tempo di esecuzione maggiore di qualsiasi polinomio.
Abbiamo dunque bisogno di assicurarci che se un problema pu essere risolto in
tempo polinomiale con un tipico computer, allora pu essere risolto in tempo poli
nomiale da una m acchina di Turing, e viceversa. Data questa equivalenza polino
miale", le nostre conclusioni su ci che una m acchina di Turing pu o non pu fare
con adeguala efficienza si applicano anche a un computer.
Ricordiamo che nel Paragrafo 8.4.3 abbiamo determinato che la differenza nel tempo di
esecuzione tra una TM a nastro unico e una TM multinastro polinomiale, e in parti
colare quadratica. Di conseguenza basta mostrare che qualunque cosa il com puter in
grado di fare, la pu fare anche la TM multinastro descritta nel Paragrafo 8.6.2, in tempo
polinomiale rispetto al tempo richiesto dal computer. Sappiamo che la stessa conclusione
quindi valida anche per una TM a nastro unico.

L c macchine di Turing c i com puter

383

Prima di fornire la dim ostrazione che la macchina di Turing descritta pu simulare n


passi di un computer in un tempo 0 (n 3), dobbiamo affrontare la questione della m olti
plicazione come istruzione di un computer. Il problema che non abbiamo posto limiti
al numero di bit che possono essere contenuti in una parola. Se il computer dovesse par
tire con una parola contenente, per esempio, l'intero 2 c moltiplicarla per se stessa per ri
passi consecutivi, allora la parola conterrebbe il numero 2'2 . Per essere rappresentato,
questo numero richiede 2" 4- 1 bit; dunque il tempo impiegato dalla macchina di Turing
per simulare queste n istruzioni sarebbe al minimo esponenziale in n.
Una soluzione consiste nel richiedere che le parole mantengano una lunghezza m assi
ma fissa, poniamo 64 bit. Allora le moltiplicazioni (o altre operazioni) che producessero
una parola troppo lunga causerebbero l'arresto del computer, e la macchina di Turing non
10 simulerebbe oltre. Saremo pi tolleranti e permetteremo chc il computer usi parole in
grado di crescere fino a qualunque lunghezza. Faremo per in modo che u n istruzione
possa produrre solo una parola che pi lunga di un bit rispetto al pi lungo dei suoi
argomenti.
E sem pio 8.16 In conformit con la restrizione espressa sopra, la som m a permessa, dato
che il risultato pu essere di un solo bit pi lungo della lunghezza massima degli addendi.
La moltiplicazione non invece permessa, in quanto due parole di ?r?-bit possono avere un
prodotto di lunghezza 2 rn. Possiamo per simulare una m oltiplicazione di interi di m -bit
tramite una sequenza di m addizioni, inframmezzate da spostamenti del moltiplicando di
un bit a sinistra (il che unaltra operazione che aumenta la lunghezza della parola solo di
ununit). Di conseguenza possiamo ancora moltiplicare parole di lunghezza arbitraria,
ma il tempo impiegato dal com puter proporzionale al quadrato della lunghezza degli
operandi.
Ipotizzando una crescita massima di un bit per ogni istruzione eseguita, siamo in
grado di dimostrare il rapporto polinomiale tra i due tempi di esecuzione. Lidea alla base
della dimostrazione consiste nel notare che dopo lesecuzione di n istruzioni il numero di
parole presenti sul nastro di memoria della TM 0 (n ), e ogni parola richiede 0 (n ) celle
della macchina di Turing per essere rappresentata. Perci il nastro lungo O (ri2) celle e
la TM pu localizzare il numero finito di parole necessario per unistruzione in un tempo
O (ri2).

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

Teorema 8.17 Sc un computer:


1. ha solo istruzioni che aumentano la lunghezza massima delle parole di non pi di

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

La macchina di Turing: la TM una macchina di calcolo astratta con la potenza


sia dei computer reali sia di altre definizioni matematiche per quanto riguarda ci
che pu essere calcolato. La TM consiste di un controllo a stati finiti e di un nastro
infinito diviso in celle. Ciascuna cella contiene un simbolo di nastro; i simboli di
nastro sono in numero finito. Una cella la posizione corrente della testina del
nastro. La TM compie mosse basate sul suo stato corrente e sul simbolo di nastro
nella cella guardata dalla testina. In una mossa la TM cam bia stato, soprascrive la
cella corrente con un simbolo di nastro e muove la testina di una cella verso sinistra
o verso destra.
Accettazione da parte di una macchina di Turing', la TM parte con l'input, una
stringa di lunghezza finita di simboli, sul nastro; il resto del nastro contiene il sim
bolo blank in ogni cella. Il blank c uno dei simboli di nastro e l'input scelto da
un sottoinsieme dei simboli di nastro, tranne il blank, detti simboli di input. La TM
accetta il suo input se entra in uno stato accettante.
Hnguaggi ricorsivamente enumerabili : i linguaggi accettati dalle TM sono det
ti linguaggi ricorsivamente enumerabili (RE). I linguaggi RE sono dunque quelli
che possono essere riconosciuti o accettati da un qualunque tipo di dispositivo di
calcolo.
Descrizioni istantanee di una TM: possiamo descrivere la configurazione corrente
di una TM mediante una stringa di lunghezza finita che include tutte le celle del
nastro, dal simbolo diverso dal blank pi a sinistra a quello pi a destra. Lo stato e
la posizione della testina si indicano ponendo lo stato allinterno della sequenza dei
simboli di nastro, alla sinistra della cella guardata.
Memoria nel controllo finito: per definire una TM per un particolare linguaggio,
conviene a volte pensare che lo stato abbia due o pi componenti. Un componente
quello del controllo, e ha lo stesso funzionamento di un normale stato. Gli altri
componenti contengono dati chc la TM deve ricordare.

Tracce multiple: spesso utile considerare i simboli di nastro come vettori con un

numero fisso di componenti. Possiamo visualizzare ciascun componente comc una


traccia distinta del nastro.

386

Capitolo 8

Macchine d Turing multinastro: un modello di TM esteso ha un numero fisso


di nastri, pi grande di uno. Una mossa di questa TM basata sullo stato e sul
vettore di simboli guardati dalle testine su ognuno dei nastri. In una m ossa la TM
multinastro cambia stato, soprascrive i simboli sulle celle guardate da ognuna delle
testine e sposta alcune o tutte le testine di una cella in una delle due direzioni.
Per quanto sia in grado di riconoscere determinati linguaggi pi rapidamente della
convenzionale TM a nastro unico, la TM multinastro non riesce a riconoscere un
linguaggio che non sia RE.
Macchine di Turing non deterministiche: la NTM ha un numero finito di scelte
della mossa seguente (stato, nuovo simbolo e movimento della testina) per ciascuno
stato e ciascun simbolo guardato. Accetta un input se una qualunque tra le diverse
sequenze di scelte porta a una ID con stato accettante. Per quanto apparentemente
pi potente della TM deterministica, la NTM non in grado di riconoscere un
linguaggio che non sia RE.
Macchine di Turing con nastro semi-infinito: possiamo limitare una TM a un nastro
chc sia infinito solo verso destra e privo di celle a sinistra della posizione iniziale
della testina. Una TM di questo tipo pu accettare qualunque linguaggio RE.
Macchine multistack: possiamo limitare i nastri di una TM multinastro in modo che
si comportino come stack. L'input si trova su un nastro separato, che viene letto una
volta da sinistra verso destra, a imitazione della modalit di input per un automa a
stati finiti o un PDA. Una macchina a stack unico in effetti un DPDA, mentre una
macchina a due stack pu accettare qualunque linguaggio RE.
Macchine a contatori: possiamo limitare ulteriormente gli stack di una macchina
multistack in modo che abbiano solo un simbolo diverso dallindicatore di fondo.
Perci ciascuno stack funziona come un contatore e permette di memorizzare un
intero non negativo c di verificare se lintero memorizzato 0, m a nientaltro. Una
macchina con due contatori sufficiente per accettare qualunque linguaggio RE.
Simulazione di una macchina di Turing da parte di un computer reale: possibi
le simulare una TM per mezzo di un computer reale se accettiamo che esista una
riserva potenzialmente infinita di dispositivi di memoria rimovibili, come i dischi,
per simulare la porzione non bianca del nastro della TM. Poich le risorse materiali
per produrre dischi non sono infinite, si tratta di unargomentazione discutibile. Ma
dato che la quantit di memoria esistente nelluniverso sconosciuta e indubbia
mente vasta, ipotizzare una risorsa infinita, come il nastro delle TM, nella pratica
realistico e generalmente accettato.
Simulazione di un computer da parte di una macchina di Turing: una TM pu
simulare la memoria e il controllo di un com puter reale impiegando un nastro che

Bibliografa

387

memorizza tutte le locazioni e il loro contenuto: registri, memoria centrale e altri


dispositivi di memoria. Di conseguenza possiamo essere certi che un compito non
eseguibile da una TM non pu essere eseguito neppure da un computer reale.

8.8

Bibliografa

La macchina di Turing tratta da | 8 J. Per caratterizzare che cosa pu essere computato,


allincirca nello stesso periodo si fecero diverse proposte non fondate sulla nozione di
macchina. Segnaliamo i lavori di Church fi], Kleene 15] e Post |7J. Tutti questi studi
erano stati preceduti dai risultati di Godei [3], che in effetti aveva dimostrato chc un
computer non pu rispondere a tutte le domande matematiche.
Lo studio delle macchine di Turing multinastro, in particolare la questione di comc il
loro tempo di esecuzione si confronti con quello di un modello a nastro unico, cominci
con Hartmanis e Stearns [41. Lesame delle macchine multistack e a contatori tratto da
[6 ], sebbene la costruzione presentata qui provenga da |2J.
L'impiego di ciao-mondo come surrogato per laccettazione o l arresto da parte di una
macchina di Turing, descritto nel Paragrafo 8.1, contenuto in note inedite di S. Rudich.
1. A. Church. An undecidable problem in elementar}' number theory, American J.
Math. 58 (1936), pp. 345-363.
2. P. C. Fischer. Turing machines with restricted memory access, Information and
Control 9:4 (1966), pp. 364-379.
3. K. Godei, ber formal unentscheidbare Siitze der Principia Mathematica und verwandter Systcme, Monatshefte Jiir Mathematik und Physik 38 (1931), pp. 173
198.
4. J. Hartmanis. R. E. Steams, On the computational complexity of algorithms,
Transactions of the AM S 117 (1965), pp. 285-306.
5. S. C. Kleene, General recursive functions of natural numbers, Mathematische
Annalen 112 (1936), pp. 727-742.
6 . M. L. Minsky, Recursive unsolvability of Post's problem o f tag and other topics

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.

2:43, pp. 544-546.

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

Un linguaggio non ricorsivamente enumerabile

Ricordiam o che un linguaggio L ricorsivamente enumerabile (RE) se L = L ( M ) per


una TM M . Nel Paragrafo 9.2 presenterem o i linguaggi ricorsivi , o decidibili , chc
non solo sono ricorsivamente enum erabili, ma sono accettati da una TM che si arresta
sempre, a prescindere dal fatto che accetti o no.
11 nostro obiettivo finale dim ostrare !indecidibilit del linguaggio form ato dalle
coppie ( M ,w ) tali che:
1. M una macchina di Turing (adeguatam ente codificata in binario) con alfabeto di
input { 0 , 1 }
2 . tu una stringa di 0 e di 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

Un linguaggio non ricorsivamcnte enumerabile

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

Enumerazione delle stringhe binarie

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

Codici per le macchine di Turing

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

un elemento irrilevante in quanto segue, perch mostreremo che nessuna codifica pu


rappresentare una TM M tale che L ( M ) = Zri.
Una volta scelti gli interi che rappresentano stati, simboli e direzioni, possiamo codifi
care la funzione di transizione Supponiam oche una regola di transizione sia 6(q{. X j ) =
(qk, X i , D in), per certi valori interi i, j, k, I ed m. Codifichiamo questa regola per mezzo
della stringa OtIOj IOfeIOi IOm. Poich i, j, k, l ed rn valgono ciascuno almeno 1, nel
codice di una transizione non compaiono mai due o pi 1 consecutivi.
Un codice per lintera TM M consiste di tutti i codici delle transizioni in un ordine
fissato, separati da coppie di 1:

C 1IlC2Il-- Cn-XllCn
dove ognuna delle C il codice di una transizione di M .

Esempio 9.1 C onsideriam olaT M


M -

1 } .{ 0 ; l,I3},S ,q i,B , {q2})

dove consiste nelle regole:

<*(tt.l) = (<73,0,)
<% 3 , 0 ) = (71 , 1, R)
(<73,1) = (2,0, R)
S(Qz-B) = (q$,l,L)

I codici per le regole sono, rispettivamente:

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.

Un linguaggio non ricorsivamente enumerabile

9.1.3

393

II linguaggio di diagonalizzazione

Nel Paragrafo 9.1.2 abbiamo codificato le macchine di Turing. Disponiamo quindi di


una nozione concreta di M u la /-esima macchina di Turing : la TM M il cui codice
Wu !-esima stringa binaria. Molti interi non corrispondono a nessuna TM. Per esempio
11001 non comincia per 0 c 0010111010010100 ha tre 1 consecutivi. Se
non un
codice di TM valido, considereremo Mi come la TM con un unico stato e nessuna tran
sizione. In altre parole, per questi valori di , Mt la macchina di Turing che si arresta
immediatamente su qualunque input. Di conseguenza L ( M i) 0 sc Wi non un codice
valido.
A questo punto possiamo dare una definizione fondamentale.
Il linguaggio L,i, detto linguaggio di diagonalizzazione, c linsieme delle stringhe
Wi tali che w r non in L ( M i).
In altre parole Ld consiste di tutte le stringhe w tali che la TM M con codice w non
accetta quando riceve w come input.
La ragione per cui L, detto linguaggio di diagonalizzazione chiarita dalla Fi
gura 9.1. La tabella indica per ogni i e j se la TM M 1 accetta la stringa di input Wj ; 1
significa s, accetta e 0 significa no, non accetta.1 Possiamo interpretare !'-esima
riga comc il vettore caratteristico del linguaggio L ( M i)', in altre parole gli 1 in questa
riga indicano le stringhe che appartengono al linguaggio.
I valori sulla diagonale segnalano se M i accetta Wi. Per costruire Ld complemcntiamo
la diagonale. Per esempio, se la Figura 9.1 fosse la tabella corretta, allora la diagonale
com plemntala comincerebbe con 1 , 0 . 0 , 0 , . . . . Perci Ld conterrebbe w\ = e, e non le
stringhe da w 2 a w4, che sono 0, 1, 00, e via di seguito.
II metodo di complementare la diagonale per costruire il vettore caratteristico di un
linguaggio che non compare in nessuna riga detto diagonalizzazione. Esso funziona
perch il complemento della diagonale di per s un vettore caratteristico chc descrive
lappartenenza a un determinato linguaggio, e cio a Ld- Questo vettore caratteristico
si trova in disaccordo con ogni riga della tabella nella Figura 9.1 in almeno una colon
na. Quindi il complemento della diagonale non pu essere il vettore caratteristico di una
m acchina di Turing.

9.1.4

Dimostrazione che L,i non ricorsivamente enumerabile

Sfruttando il ragionamento riguardante i vettori caratteristici e la diagonale, dimostrere


mo ora in termini formali un risultato fondamentale sulle macchine di Turing: nessuna
macchina di Turing accetta Ld1II lettore pu osservare chc la tabella reale molto diversa da quella della figura. Poich i numeri interi
bassi non possono rappresentare codici di TM validi, e di conseguenza rappresentano la TM banale che non
compie alcuna mossa. Ie prime righe della tabella sono in effetti formate interamente da 0.

394

Capitolo 9

D iag o n ale

F ig u ra 9.1 La tabella che rappresenta accettazione di stringhe da parte delle macchine


di Turing.

Teorema 9.2 L d non un linguaggio ricorsivamente enumerabile. In altre parole non


esiste alcuna macchina di Turing che accetta Ld.
DIMOSTRAZIONE Supponiamo L d = L ( M ) per una TM M . Poich L d un linguaggio
sullalfabeto {0, I }, M rientra nellelenco di macchine di Turing chc abbiamo costruito,

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

Esercizio 9.1.1 Scrivete le stringhe seguenti.


* a) W37.

Un problema indecidibile ma ricorsivamente enumerabile

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.

b) L'insiem e di tutte le w tali chc w^i non accettata da M 1.

! 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

Un problema indecidibile ma ricorsivamente


enumerabile

Abbiamo studiato un problema, il linguaggio di diagonalizzazione


chc non viene ac
cettato da nessuna macchina di Turing. Il prossimo obiettivo consiste nel precisare la
struttura dei linguaggi ricorsivamente enumerabili (RE), ossia quelli accettati dalle TM.
suddividendoli in due classi. La prima, che corrisponde a ci che consideriamo norm al
mente un algoritmo, dispone di TM che non solo riconoscono un linguaggio, ma segna
lano anche quando una stringa di input non appartiene al linguaggio. Una m acchina di
Turing di questo tipo finisce sempre per arrestarsi, che raggiunga o no uno stato accettante.
La seconda classe di linguaggi costituita dai linguaggi RE che non sono accettati da
alcuna macchina di Turing con la garanzia di arrestarsi. Questi linguaggi sono accettati
in un modo scomodo: se linput nel linguaggio, prima o poi lo veniamo a sapere; in
caso contrario la macchina di Turing pu girare per sempre, e non possiamo decidere che
linput non verr accettato. Comc vedremo, un esem pio di questo tipo di linguaggio
linsieme di coppie codificate ( M ,w ) tali chc la TM M accetta l'input w.

396

9.2.1

Capitolo 9

Linguaggi ricorsivi

Diremo ricorsivo un linguaggio L se L = L ( M ) per una m acchina di Turing M tale che:


1. se w in L, allora M accetta (e dunque si arresta)
2. se w non in L , allora M si arresta pur non entrando in uno stato accettante.
Una TM di questo tipo corrisponde alla nostra nozione informale di algoritmo : una
sequenza ben definita di passi che termina sempre e produce una risposta. Se consideria
mo il linguaggio L come un problem a, come succeder spesso, allora il problema L
detto decidibile se si tratta di un linguaggio ricorsivo, e indecidibile se non si tratta di un
linguaggio ricorsivo.
Lesistenza o non esistenza di un algoritmo per risolvere un problema c sovente pi
im portante dellesistenza di una TM che risolve il problema. Come detto, una macchina
di Turing senza garanzia di arresto non d sufficienti informazioni per concludere che una
stringa non si trova nel linguaggio. In un certo senso, quindi, queste TM non risolvono
il problema. Di conseguenza la distinzione di problemi e linguaggi in due classi, ossia
i decidibili, che vengono risolti mediante un algoritmo, c gli indecidibili, spesso pi
importante della divisione tra linguaggi ricorsivamente enum erabili (quelli per cui c
una TM) c linguaggi non ricorsivamente enumerabili (chc non hanno alcuna TM). La
Figura 9.2 illustra la relazione fra tre classi di linguaggi:
1. Iinguaggiricorsivi
2. linguaggi ricorsivamente enumerabili ma non ricorsivi
3. linguaggi non ri corsivamente enumerabili (non RE).
Abbiamo collocato al suo posto il linguaggio non RE Ld e abbiamo inoltre indicato il
linguaggio L u, o linguaggio universale, di cui dimostrerem o fra breve la non ricorsivit,
sebbene si tratti di un RE.

9.2.2

Complementi di linguaggi ricorsivi e RE

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.

Un problema indecidibile ma ricorsivamente enumerabile

397

F ig u ra 9.2 Relazione tra linguaggi ricorsivi, RF c non RE.


Sia L = L ( M ) per una TIVI M che si arresta sempre. Costruiamo
una TM M tale che L = L ( M ) secondo lo schema illustrato nella Figura 9.3. Come si
vede, M si comporta esattamente come M . Per formare M modifichiamo M nel modo
seguente.

D IM O STR A ZIO N E

1. Gli stati accettanti di M diventano stati non accettanti di M senza transizioni; in


questi stati M si arresta senza accettare.
2. M ha un nuovo stato accettante r; non esiste alcuna transizione uscente da r.
3. Per ogni combinazione di uno stato non accettante e di un simbolo di nastro di
M tale che M non abbia alcuna transizione (cio M si arresta senza accettare),
aggiungiamo una transizione verso lo stato accettante r.
Poich garantito che M si arresta, Io stesso vale per M . Inoltre M accetta proprio le
stringhe che M non accetta. Di conseguenza M accetta L.
U naltra importante propriet del complemento di un linguaggio restringe ulterior
mente le possibili collocazioni di un linguaggio e del suo complemento nel diagramma
della Figura 9.2. Questa propriet enunciata nel prossimo teorema.
Teorem a 9.4 Se un linguaggio L e il suo complemento sono RE. allora L ricorsivo.
Osserviamo che in questo caso, per il Teorema 9.3, anche L ricorsivo.

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.

La dimostrazione illustrata nella Figura 9.4. Siano L L (M i) e


L = L (M i). M i ed M 2 sono simulate in parallelo da una TM M . Possiamo trasformare
M in una TM a due nastri e poi convertirla in una TM a nastro singolo per facilitare la
simulazione. Un nastro di M simula quello di M i, l'altro simula il nastro di M 2. Gli stati
di M i ed M i sono componenti dello stato di M .
Se l'input w di M in L , M\ accetta in un tempo finito, quindi M accetta c si arresta.
Sc w non in L. allora in L, dunque M 2 prima o poi accetta. A quel punto M si arresta
senza accettare. Di conseguenza M si arresta su tutti gli input, ed L ( M ) esattamente L.
Poich M si arresta sempre e L ( M ) = L, concludiamo che L c ricorsivo.
D IM O STR A ZIO N E

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.

Un problema indecidibile ma ricorsivamente enumerabile

399

A ccetta

R ifiuta

F ig u ra 9.3 Costruzione di una TM chc accetta il complemento di un linguaggio ricorsivo.

F ig u ra 9.4 Simulazione di due TM che accettano un linguaggio e il suo complemento.

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.

Un problem a indecidibile ma ricorsivamente enum erabile

401

Ausiliario

F ig u ra 9.5 Struttura di una m acchina di Turing universale.

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

Una TM universale pi efficiente


Una simulazione efficiente di M da parte di U, che non imponga di slittare
simboli sul nastro, richiede di determinare in primo luogo il numero di simboli di
nastro usati da M . Sc il num ero di simboli com preso tra 2k~1 4- I e 2k, U pu
usare un codice binario a Ar-bit per rappresentarli univocamente. Una cella del na
stro di M pu allora essere simulata da k celle di U. Per facilitare ulteriormente le
cose, U pu riscrivere le transizioni di M applicando il codice binario a lunghez
za fissa anzich il codice unario a lunghezza variabile che abbiamo introdotto.

5. Se M non ha transizioni per lo stato simulato e il simbolo di nastro, non ci sar


alcuna transizione in (4). M si arresta nella configurazione simulata e U deve fare
altrettanto.
6. Se M entra nel suo stato accettante, allora U accetta.
In questo modo U simula M su w. U accetta la coppia codificata (M , ve) se e solo se M
accetta w.

9.2.4

Indecidibilit del linguaggio universale

Abbiamo individuato un problem a che RE ma non ricorsivo: il linguaggio L u. Per


molti aspetti sapere chc L u indccidibilc (non un linguaggio ricorsivo) vale pi della
precedente scoperta che L,i non RE. Il motivo chc possiam o ridurre L u a un altro
problema P per dimostrare che non esiste alcun algoritmo in grado di risolvere P, a
prescindere dal fatto che P sia o no RE. La riduzione di La a P b per possibile solo se
P non RE. quindi non possiamo usare Ld per mostrare lindecidibilit di quei problemi
che sono RE ma non ricorsivi. D altro canto, se vogliamo dimostrare chc un problema
non RE, possiamo usare solo Ld', L u non serve, dato che RE.
T eorem a 9.6 L u RE ma non ricorsivo.
DIMOSTRAZIONE Nel Paragrafo 9.2.3 abbiamo dimostrato che L u RE. Supponiamo chc
L u sia ricorsivo. Per il Teorema 9.3 anche L u, il complemento di L u, ricorsivo. Se
abbiamo una TM M che accetta L u, possiamo costruire una TM che accetta Ld (grazie
al metodo illustrato sopra). Poich sappiamo gi che Ld non RE, ne ricaviamo una
contraddizione con lipotesi che Lu sia ricorsivo.
Supponiamo L ( M ) = L u. Come suggerito dalla Figura 9.6 possiamo modificare la
TM M in una TM M 1 chc accetta L,.

Un problema indecidibile ma ricorsivamente enumerabile

403

F igura 9.6 Riduzione di L,. a L u.

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

ricorsivo. (Rileggete il riquadro II problema dell'arresto nel Paragrafo 9.2.4.)


E sercizio 9.2.2 Nel riquadro Perch ricorsivo del Paragrafo 9.2.1 abbiamo ricordato la
nozione di funzione ricorsiva, in competizione con la macchina di Turing come modello
di calcolabile. In questesercizio esploriamo un esempio di notazione per le funzioni
ricorsive. Vna funzione ricorsiva una funzione F definita da un insieme finito di regole.
Ogni regola .specifica il valore della funzione F per determinati argomenti; la specifica
pu servirsi di variabili, costanti intere non negative, la funzione successore (somma uno),
la funzione F stessa ed espressioni costruite per composizione di funzioni. Per esempio
la funzione di Ackermann viene definita dalle regole seguenti:
1. A(0, y) = 1 per ogni y > 0
2. ,4(1,0) = 2
3. (, 0) = X + 2 per x > 2
4. A(a; 4 -1 ,// + 1) = A (A (x , y + 1), y) per ogni x > 0 e y > 0.
* a) Valutate .4(2, l ).
! b) Quale funzione di x 4 (;r, 2)?
! c) Valutate A (4 , 3).
E sercizio 9.2.3 Descrivete in termini informali macchine di Turing multinastro che enu
merano i seguenti insiemi di interi, nel senso che. a partire da nastri vuoti, stampano su
uno di essi la stringa IOn IOt2I per rappresentare linsieme {i i . i-, }
* a) Linsieme di tutti quadrati perfetti { 1 .4 .9 ,...} .
b) Linsieme di tutti i numeri primi { 2 ,3 , 5 , 7 , 1 1 , . . .}.
!! c) Linsieme di tutti gli i tali chc M i accetta tu*. Suggerimento: non possibile gene
rare questi i nellordine numerico perch questo linguaggio, cio L, RE ma non
ricorsivo. 1 linguaggi RE ma non ricorsivi si possono infatti definire come quelli
enumerabili, ma non nellordine numerico. P erpoterli enumerare dobbiamo simu
lare tutte le M i su Wi . Non possiamo per farne girare una per un tempo indefinito,
altrimenti non potremmo simulare nessuna M j con j i se M 1 non si arresta su
u?. Dobbiamo quindi istituire dei turni e fare in modo che nel turno k si provino
solo un numero finito di M*, e solo per un numero finito di passi. Possiamo cos
completare ogni turno in un tempo finito. Se, per ogni TM M i e per ogni numero
di passi .%, c un turno in cui M i viene simulata per almeno s passi, prima o poi
scopriremo ogni Ai*che accetta W 1, e i entrer nellenumerazione.

Problemi indecidibili relativi alle macchine di Turing

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

Problemi indecidibili relativi alle macchine


di Turing

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

Abbiamo introdotto la nozione di riduzione nel Paragrafo 8.1.3. In generale, se abbiamo


un algoritmo per convertire le istanze di un problema P i in istanze di un problem a l\
che hanno la stessa risposta, allora diciam o che Pi si riduce a P. Possiamo avvalerci di
questa dimostrazione per provare che P difficile alm eno quanto . Di conseguenza,
se P i non ricorsivo, allora P non pu essere ricorsivo. Se non RE, allora P
non pu essere RE. Come abbiamo detto nel Paragrafo 8.1.3, bisogna sempre ridurre un
problema diffcile e noto a uno di cui si vuole dimostrare che almeno altrettanto difficile,
mai il contrario.

Figura 9.7 Le riduzioni trasformano istanze positive in positive e istanze negative in


negative.

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

Problemi indecidibili relativi alle macchine di Turing

407

la riduzione in entrambi i modi. Limportanza delle riduzioni sottolineata dal seguente


teorema, di cui vedremo numerose applicazioni.

Teorema 9.7 Se esiste una riduzione da P i a Po, allora:


a) se Pi indecidibile, lo anche P
b) se P\ non RE, lo anche P 2.
DIMOSTRAZIONE Supponiamo dapprima chc P 1 sia indecidibile. Se possibile decidere
P2, allora possiamo combinare la riduzione da Pi a P 2 con lalgoritmo che decide P 2 per

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

Macchine di Turing che accettano il linguaggio vuoto

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

Figura 9.8 Costruzione di una NTM che accetta L ne .


Descriviamo le operazioni di M .
1. M riceve in input un codice di TM M i .

2. Impiegando la sua capacit non deterministica M tenta un input w che M i po


trebbe accettare.
3. M verifica se
che accetta L u .

accetta w. Per questa parte M pu simulare la TM universale U

4. Se M i accetta w, allora M accetta il proprio input, ossia M 1.


In questo modo, se M i accetta anche solo una stringa, M la tenter (tra tutte le altre, ov
viamente) e accetter M i . Se per L ( M 1) - 0, nessun tentativo w porta all'accettazione
da parte di M, ed M non accetta M i . Di conseguenza L ( M ) = L n c .

Problemi indccidibili relativi alle macchine di Turing

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

Figura 9.9 Schema della TM M 1 costruita da ( , nel Teorema 9.9. M t accetta un


input arbitrario se c solo se M accetta w.
Definiamo M t affinch com pia le seguenti operazioni.
I . M t ignora il proprio input x, o meglio, lo sostituisce con la stringa che rappresenta
la TM M e la stringa di input w. Poich M 1 concepita per una specifica coppia
(M , ;), di lunghezza n, possiamo costruire M t in modo che abbia una sequenza di
stati <jo, /i? ?Qn, dove qo lo stato iniziale.
(a) Nello stato q, p e r i = 0 ,1 ,
, n I, M 1 scrive ( i -+-1)-esim obit del codice
per (M , w), va nello stato qi+ \e si muove verso destra.
(b) Nello stato qn, se necessario M t si muove verso destra rimpiazzando eventuali
simboli diversi dal blank (che formano la parte finale di x se tale input di M t
pi lungo di ri) con blank.

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.

Problemi indecidibili relativi alle macchine di Turing

411

Perch un problema e il suo complemento sono diversi


Intuitivamente sappiamo che un problema c il suo complemento sono in realt
lo stesso problema. Per risolvere luno possiamo usare lalgoritmo dell'altro c
allultimo passo invertire lesito: diciamo s anzich no, e viceversa. Se il
problema e il suo complemento sono ricorsivi, lintuizione corretta.
Esistono per, come abbiamo visto in questo paragrafo, altri due casi. Il
primo che n il problema n il suo complemento sono RE. I due problemi
risultano ancora simili in un certo senso, perch entrambi non risolvibili da alcun
tipo di TM. Il secondo, pi interessante, esemplificato da L c ed L ne, si ha quando
luno RE e l altro non RE.
Per il linguaggio che RE possiamo definire una TM che prende un input
w e va in cerca di una ragione per cui w si trova nel linguaggio. Cos, data una
TM M come input, per Lne avviamo la nostra TM alla ricerca di stringhe da lei
stessa accettate. Non appena ne troviamo una, accettiamo M . Se M una TM
con un linguaggio vuoto, non siamo mai in grado di stabilire con certezza che
non sia in L nf,. Tuttavia non la accettiamo mai, ed cos che la TM deve reagire
correttamente.
Daltra parte, per il problema complemento L e, che non c RE, non c modo
di accettare tutte le sue stringhe. Supponiamo di avere una stringa M che una
TM il cui linguaggio vuoto. Possiamo saggiare gli input della TM M ed
possibile che non ne troviamo mai uno accettato da M . Eppure non possiamo
mai essere certi che non esista un input chc non abbiamo ancora provato ma chc
potrebbe essere accettato. Di conseguenza M non pu mai essere accettata, anche
se dovrebbe esserlo.

9.3.3

II teorema di Rice e le propriet dei linguaggi RE

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.

F ig u ra 9.10 Costruzione di M 1 per la dimostrazione del teorema di Rice.


M 1 una TM a due nastri. Un nastro usato per simulare M su w. Ricordiamo che
lalgoritmo che effettua la riduzione riceve come input M e w, e li usa nella definizione

Problemi indecidibili relativi alle macchine di Turing

413

delle transizioni di M '. Di conseguenza la simulazione di M su w incorporata in Af7;


la seconda TM non deve leggere le transizioni di M sui suoi nastri.
Se necessario, laltro nastro di M ' viene usato per simulare M l sullinput x di M 1.
Anche qui Ie transizioni di M l sono note allalgoritm o di riduzione e possono essere
incorporate nelle transizioni di M ' . La TM M ' costruita per operare nel modo seguente.
1. Simula M su input w. Osserviam o che w non linput di M'\ M ' scrive invece M
e w su uno dei due nastri e sim ula la TM universale U su tale coppia come nella
dimostrazione del Teorema 9.8.
2. Se M non accetta w, allora M 1 non fa nientaltro. M ' non accetta mai il proprio
input x, per cui L ( M t) = 0. Poich assumiamo che 0 non sia nella propriet V , ci
significa che il codice di M 1 non in Lp.
3. Se M accetta w, allora M 1 com incia a simulare M l sul proprio input x. Perci M '
accetter esattamente il linguaggio L. Poich L in V , il codice di M 1 in Lp .
11 lettore pu notare che la costruzione di M 1 da M e w pu essere realizzata da un
algoritmo. Dato che tale algoritmo trasforma (Ai, w) in una M 1 che in L-p se e solo
se ( M ,w ) in L u, esso una riduzione di L u a L-p, e dim ostra che la propriet V
indecidibile.
Non abbiamo ancora finito. Ci resta da considerare il caso in cui 0 in V . Esam i
niamo allora la propriet com plem ento V , l insieme dei linguaggi RE che non hanno la
propriet V. Per quanto abbiamo visto sopra, V indecidibile. M a poich ogni TM accet
ta un linguaggio RE, Lp , linsieme di (codici per) macchine di Turing che non accettano
un linguaggio in V uguale a L ^ , linsiem e di TM che accettano un linguaggio in V.
Supponiamo che Lp sia decidibile. Allora lo sarebbe anche L.p, perch il com plem ento
di un linguaggio ricorsivo ricorsivo (Teorema 9.3).

9.3.4

Problemi sulle specifiche di macchine di Turing

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

l problema di corrispondenza di Posi

415

Esercizio 9.3.5 Sia L il linguaggio formato dalle coppie di codici di TM pi un intero,


(M i, M 2 ; &), tali che L (M i ) L ( M 2) contiene almeno k stringhe. Dimostrate chc L
RE ma non ricorsivo.
Esercizio 9.3.6 Dimostrate che le seguenti questioni sono decidibili.
* a) Linsieme dei codici di TM M tali che, una volta partita con un nastro bianco, M
scrive prima 0 poi un simbolo diverso dal blank sul nastro. Suggerimento: se M ha
m stati, considerate le sue prime m transizioni.
! b) Linsieme dei codici di TM che non compiono mai una mossa verso sinistra.
! c) Linsieme delle coppie (M , w) tali che la TM M , partita con input w, non visita
mai una cella di nastro pi di una volta.
Esercizio 9.3.7 Dimostrate che i seguenti problemi non sono ricorsivamente enumerabili.
* a) L'insieme delle coppie (M , w) tali che la TM M , partila con input w, non si arresta.
b) Linsieme delle coppie (M i, M 2 ) tali che L (A ii) L ( M 2) = 0.
c) Linsieme delle triple (M i, M 2, M 3 ) tali che L ( M i) = L ( M 2)L(M s), cio tali che
il linguaggio della prima TM la concatenazione dei linguaggi delle altre due.
Esercizio 9.3.8 Dite se i seguenti insiemi sono ricorsivi, RE ma non ricorsivi, o non RE.
* a) L'insieme di tutti i codici di TM chc si arrestano su ogni input.
b) Linsieme di tutti i codici di TM che non si arrestano su nessun input.
c) Linsieme di tutti i codici di TM che si arrestano su almeno un input.
* d) L'insieme di tutti i codici di TM che non si arrestano su almeno un input.

9.4

II problema di corrispondenza di Post

In questo paragrafo cominciamo a ridurre problemi indccidibili sulle macchine di Turing


a problemi indecidibili su oggetti reali', cio svincolati dallastrazione della macchina
di Turing. Partiamo dal cosiddetto problema di corrispondenza di Post (PCP, Posts
Correspondence Problem), che ancora un problema astratto, ma si riferisce a stringhe
anzich a macchine di Turing. Intendiamo dimostrare che questo problema indecidibile
e poi sfruttare il risultato per dimostrare che altri problemi sono indecidibili per riduzione
di PC P
Dimostriamo chc PCP indecidibile riducendo L u a PCP. Per semplificare la prova
definiamo un PCP modificato e lo riduciamo al PCP originale. Quindi riduciamo L u al
PCP modificato. La catena di riduzioni illustrata nella Figura 9.11. Poich sappiamo
che L u indecidibile, concludiamo che PCP indecidibile.

416

Capitolo 9

M PCP

un

un

alg o ritm o

PCP

alg o ritm o

Figura 9.11 Riduzioni chc dimostrano Pindecidihilit del problema di corrispondenza di


Post.

9.4.1

Definizione del problema di corrispondenza di Post

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

F ig u ra 9.12 U nistanza di PCP.

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.

Il problema di corrispondenza di Post

417

II PCP come linguaggio


Per trattare la questione se unistanza di PCP abbia una soluzione, dobbiamo
esprimere il problema come linguaggio. Poich le istanze di PCP hanno alfa
beto arbitrario, il linguaggio corrispondente di fatto una stringa su un alfabeto
(issato, che codifica le istanze di PCP cos come nel Paragrafo 9 . 1.2 abbiamo co
dificato macchine di Turing con insiemi arbitrari di stati e di simboli di nastro. In
particolare, se lalfabeto di un'istanza di PCP ha meno di 2k simboli, possiamo
usare codici di k bit per ogni simbolo.
Poich le istanze di PCP hanno tutte alfabeto finito, per ciascuna possiamo
fissare il valore di k. A questo punto possiamo codificare unistanza impiegando
un alfabeto di tre simboli: 0. 1 c un simbolo virgola per separare le stringhe.
Collochiamo allinizio del codice il numero k in binario seguito dalla virgola e
dalle coppie di stringhe, separate da virgole e codificate secondo un codice a k
bit.

Lista A

Lista B

Wi

Xi

1
2

10
011
101

101
11
011

Figura 9.13 Unaltra istanza di PCP.


E sem pio 9.14 Ecco unistanza senza soluzione. Prendiamo ancora = {0 . 1 }, ma le
due liste sono quelle della Figura 9 . 13.
Supponiamo che listanza di PCP della Figura 9.13 abbia la soluzione i , 2, <im,
per un m > 1. Affermiamo che 1 = 1. Infatti, se 1 = 2 , una stringa chc comincia per
W2 = O li dovrebbe coincidere con una che comincia per x = 11. Ma ci impossibile
perch i primi simboli delle due stringhe sono, rispettivamente, 0 e 1. Analogamente non
possibile che i\ = 3 perch in tal caso una stringa che com incia per
= 101 dovrebbe
coincidere con una chc comincia per Xi = O li.
Se 1 = I, le due stringhe corrispondenti nelle liste A c B dovrebbero cominciare
cos:

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.

Il problema di corrispondenza di Post 4 19

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

coppia dellistanza di MPCP; questa coppia ha un * in pi allinizio di w\, c possiamo


usarla per avviare la soluzione di PCP. Allistanza di PCP aggiungiamo unultima coppia,
($, *$), che far da coppia terminale nelle soluzioni di PCP che imitano soluzioni di
MPCP
Definiamo ora formalmente la costruzione. Abbiamo unistanza di MPCP con sequen
ze A = ,'i. w2 , . . . , Wk Q B = x i, X2 ; j ^k- Supponiamo che * c $ non siano elementi
dellalfabeto di questa istanza. Costruiamo unistanza di PCP C = ?/0; y i, . . . , yk+i e
D = z0, z i , . . . , z k+i.
1. Per i = 1 ,2 .. . . . k sia
uguale a wit ma con un * dopo ogni simbolo, e sia Zi
uguale a Xi, ma con un * prima di ogni simbolo.
2. ?yo = *Vl e Zq = z\. La coppia di posto 0 uguale a quella di posto 1, salvo che
per il simbolo * supplementare davanti alla stringa della prima lista. Notiamo che
la coppia di posto 0 lunica, nellistanza di PCP, in cui le due stringhe cominciano
per lo stesso simbolo, cos che ogni soluzione deve cominciare dall'indice 0.
3. yk+ 1 = S e zk+i = *$.
Esempio 9.16 Supponiamo che la Figura 9.12 sia unistanza di MPCP Listanza di PCP
costruita comc descritto illustrata nella Figura 9.14.

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

Figura 9.14 Costruzione di unistanza di PCP da unistanza di MPCP.


Teorema 9.17 MPCP si riduce a PCP.
DIMOSTRAZIONE II nucleo della prova la costruzione definita sopra. Supponiamo per
prima cosa che i, 2 , , im sia una soluzione allistanza assegnata di MPCP con liste A

e B. Sappiamo allora chc WiWil Wi2 wm = x\XiiXi2 xm. Sostituendo le w con le


y e le x con le 2 otteniamo due stringhe quasi uguali: Vvyi1Vi2 yim e z\zit Zi2 - Zim.
Alla prima stringa manca un * allinizio; alla seconda ne manca uno alla fine. Quindi
* y m , V i -2 - V i m = Z 1Z 1 Zi 2 Z i r n *

Il problema di corrispondenza di Post

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 *

Per il simbolo * finale possiamo accodare lindice k + 1. Poich yk+1 = $ e Zk+\ *$


abbiamo:
V o V i1V i2 ' ' ' V itrlV k + ! = z O Z il Z i2 Z im Z k Jr 1

Abbiamo cos dimostrato che 0, i \


, 2 ; , im k + 1 una soluzione dellistanza di PCP
Dobbiamo ora dimostrare che, se listanza del PCP derivato ha una soluzione, anche
listanza dellMPCP originale ha una soluzione. Osserviamo che una soluzione delli
stanza di PCP deve cominciare con lindice 0 e finire con lindice k + 1, perch solo la
coppia di posto 0 formata da stringhe che cominciano per lo stesso simbolo, e solo la
coppia di posto (k 4-1) formata da stringhe che finiscono con lo stesso simbolo. Perci
possiamo scrivere cos la soluzione di PCP: 0,i, i 2 , -,
k, 4- 1.
Affermiamo che
, i rn una soluzione dellistanza di MPCP. Infatti se elimi
niamo gli * e il S finale dalla stringa JJoVil Vi2 ' ' 'VtmVk+1 otteniamo w \ w tl w i 2 - W i m .
Inoltre se eliminiamo gli * e il S da ZQZi1Zi2 ---ZtmZk+\otteniamo x\XtiXi2 -XimSappiamo che
V o V il V i2 V i mV k + 1 = Zozu Zi2 - - - z i m z k + 1

perci deduciamo che


W i W i l W i 2 W i m = X 1X i l X i 2 X im

Quindi da una soluzione dellistanza di PCP ricaviamo una soluzione dellistanza di


MPCP.
Ora chiaro che la costruzione descritta prima del teorema un algoritmo per con
vertire unistanza di MPCP con una soluzione in unistanza di PCP con una soluzione, e
unistanza di MPCP senza soluzioni in unistanza di PCP senza soluzioni. Esiste dunque
una riduzione di MPCP a PCP, a conferma che se PCP fosse decidibile lo sarebbe anche
MPCP.

9.4.3

Dimostrazione di indecidibilit di PCP: finale

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

da prefissi della sequenza di ID di : # #2 # 3 # . dove a i la ID iniziale di M


con input w, e a, l ttj+i per ogni i. La stringa presa dalla lista B sar sempre di una ID
pi avanti rispetto a quella presa da .4. salvo che M entri in uno stato accettante. In quel
caso saranno disponibili le coppie con cui A pu raggiungere B e produrre infine una
soluzione. Sc per M non entra in uno stato accettante, non c modo di servirsene, c non
ci sono soluzioni.
Per semplificare la costruzione dellistanza di MPCP ricorriamo al Teorema 8.12, se
condo il quale possiamo assumere che la TM non stampa mai blank e non si sposta mai
a sinistra della posizione iniziale della testina. In questo modo ogni ID della macchina di
Turing una stringa della forma , dove a e 3 sono stringhe di simboli di nastro diversi
dal blank, e q uno stato. ,3 pu essere vuoto se la testina si trova sul blank immediata
mente a destra di a; evitiamo cos di collocare un blank a destra dello stato. I simboli di
a e corrispondono quindi esattamente al contenuto delle celle in cui si trovava linput,
pi tutte le celle verso destra gi visitate dalla testina.
Sia M = (Q, . . , qo, B, F) una TM che soddisfa il Teorema 8.12, e sia w 6 *,
una stringa di input. Costruiamo unistanza di MPCP. Per capire i motivi della scelta delle
coppie ricordiamo che la prima lista deve sempre trovarsi di una ID dietro la seconda, a
meno che M accetti.
1. La prima coppia :
Lista A

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

permettono di copiare simboli chc non contengono lo stato. La scelta di queste


coppie ci consente in effetti di estendere la stringa di A in accordo con quella di B,
copiando al contempo parti della ID precedente in coda alla stringa di B. Possiamo
in questo modo formare la ID successiva nella sequenza di mosse di M , in coda
alla stringa di B.
3. Per simulare le mosse di M disponiamo di coppie che le rispecchiano. Per ogni q
in Q - F (cio q uno stato non accettante), p in Q, e X , Y e Z in abbiamo:

Il problema di corrispondenza di Post 423

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:

q2 ,q), {0,1}, {0,1, B},< q\ . B, {3 })

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)

Figura 9.15 Istanza di MPCP costruita dalla TM M dellEsempio 9.18.


Osserviamo che M accetta linput 01 tramite la sequenza di mosse
g 01 I- Ig2I I- IOgi t" IgaOl l g3 101
Consideriamo ora la sequenza di soluzioni parziali che imita questa computazione di M

l problema di corrispondenza di Posi

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:

A: # <71O l # I <72 l# 1 0 i/ i # l ^ 2 01#^ 3 lOl#<73Ol#<7:3l#


B: # 9101# I 2 1 # I Og1 # 172 01 #
10 1 # 3 01 #<73 1#

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 # #

Teorema 9.19 II problema di corrispondenza di Post indecidibile.


DIMOSTRAZIONE La catena di riduzioni illustrata nella Figura 9.11 quasi completa. La

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

11problema di corrispondenza di Post 427


-4: X
Ti: xy
dove X una sequenza di ID di Al che rappresentano una computazione di Al su input w,
eventualmente seguita da # e dallinizio della ID successiva a. Il residuo y il comple
tamento di a, un altro # e l'inizio della ID chc segue a, fino al punto in cui x termina in
a.
In particolare, finche' Al non entra in uno stato accettante, la soluzione parziale non
una soluzione: la stringa di B pi lunga di quella di .4. Quindi, se c una soluzione, Al
deve a un certo punto entrare in uno stato accettante, cio Al accetta w.

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

Altri problemi indecidibili

Consideriamo ora alcuni altri problemi di cui possiamo dimostrare lindccidibilit. La


tecnica principale la riduzione di PCP al problema che vogliamo dimostrare indecidibile.

9.5.1

Problemi relativi a programmi

Partiamo da unosservazione: si pu scrivere un programma, in un normale linguaggio di


programmazione, che accetta in ingresso unistanza di PCP e nc cerca le soluzioni siste
maticamente (per esempio per ordine di lunghezza - numero di coppie - della soluzione).
Poich PCP ammette alfabeti arbitrari dobbiamo codificare i simboli dellalfabeto in bi
nario o in un altro alfabeto fissato, comc descritto nel riquadro Il PCP come linguaggio
del Paragrafo 9.4.1.
Siamo liberi di scegliere che cosa fa il programma, per esempio arrestarsi o stampare
un frase, se e quando trova una soluzione. In caso contrario il programma non esegue
mai lazione prescelta. Dunque stabilire se un programma stampa C ia o , mondo, se
si arresta, se chiama una certa funzione, se emette il bip della console, o se esegue
una qualsiasi azione non banale, sono tutti problemi indecidibili. Esiste in effetti un
analogo del teorema di Rice per i programmi: qualsiasi propriet non banale relativa
alle operazioni di un programma (in contrasto con le propriet lessicali o sintattiche del
programma stesso) indccidibile.

9.5.2

Indecidibilit delFambiguit delle CFG

Se consideriamo le analogie fra programmi e macchine di Turing, le affermazioni del


Paragrafo 9.5.1 non sono sorprendenti. Spieghiamo ora come ridurre PCP a un problema
del tutto estraneo ai calcolatori: la questione se una grammatica libera dal contesto sia
ambigua.
Lidea di base di considerare stringhe chc rappresentano una sequenza di indici (in
teri), al contrario, insieme con le stringhe corrispondenti costruite secondo una delle liste
di unistanza di PCP. Queste stringhe possono essere generate da una grammatica. Anche
lanalogo insieme di stringhe per l'altra lista nellistanza di PCP pu essere generato da
una grammatica. Lunione delle due grammatiche, con gli ovvi aggiustamenti, genera una
stringa usando le produzioni di ciascuna grammatica se e solo se listanza di PCP ha una
soluzione. Perci c una soluzione se e solo se lunione delle grammatiche ambigua.
Precisiamo lidea intuitiva. Supponiamo che l'istanza di PCP sia formata dalle liste
A = ?/,'i. wo.. . . . Wk c D = x\, X2 , -. . , Xk- Per la lista A costruiamo una CFG con A
come unica variabile. I terminali sono tutti i simboli dell'alfabeto impiegati nellistanza
di PCP, oltre a un insieme distinto di simboli indice i, a? . . . . . Oyc, che rappresentano le
scelte di coppie di stringhe in una soluzione dellistanza di PCP. 11 simbolo indice a

Altri problemi indecidibili

429

rappresenta quindi la scelta di Wi dalia lista A o di Xi dalla lista D. Le produzioni della


CFG per la lista A sono:

>

WiAay I W2Aa2 | |IvkAak \


W d]

I W2O2I I Wk Cik

Denoteremo con Ga questa grammatica e con La il suo linguaggio. Ci riferiremo a un


simile linguaggio L ,\come al linguaggio per la lista A.
Osserviamo che le stringhe terminali derivate da G a sono tutte quelle della forma
Wil Wh WirnCiim (I-2-m Per un w > l e una lista di interi * i,2, ; im\0 Sn' intero
varia tra 1 e k. Tutte le forme sentenziali di Ga hanno una sola A fra le stringhe (le
io) e i simboli indice (gli a) fino al momento in cui usiamo una produzione scelta fra le
ultime k, chc non hanno A nel corpo. Gli alberi sintattici hanno la forma illustrata nella
Figura 9.16.

w.
/2

a.
/2

vv.
Im

a l.
m

Figura 9.16 La forma degli alberi sintattici della grammatica G .4 .


Possiamo anche osservare che ogni stringa terminale derivabile da A in Ga ha una sola
derivazione. I simboli indice al termine della stringa determinano univocamente quale
produzione applicare a ogni passo. Solamente due corpi di produzioni terminano infatti
con un dato simbolo indice
A WiAai e A > Wiai. Dobbiamo usare la prima
produzione se il passo di derivazione non l'ultimo, e la seconda se l'ultimo.

430

Capitolo 9

Consideriamo laltra parte dellistanza assegnata di PCP, la lista B = .T1, x2, . . . . a?*.
Per questa lista sviluppiamo unaltra grammatica, G d -

X1S fl1 I X2Bu2 I I XkBcik I


X 1 A 1 I X 2 Ci2 I I Xfcflfc

Denoteremo il linguaggio di questa grammatica con Le. Lc osservazioni gi fatte per


G a si applicano anche a G d . In particolare una stringa terminale di L d ha una sola
derivazione, determinata dai simboli indice in coda alla stringa.
Combiniamo infine i linguaggi c le grammatiche delle due liste a formare la gramma
tica G ab per listanza di PCP Ecco i componenti di G a b 1. Le variabili A, B ed 5; S il simbolo iniziale.
2. Le produzioni S * A |B .
3. Tutte le produzioni di G a
4. Tutte le produzioni di G d Sosteniamo che G ab ambigua se e solo se l'istanza (A, B) di PCP ha una soluzione;
questa tesi il nucleo del prossimo teorema.
Teorema 9.20 II problema dellambiguit di una CFG indecidibilc.
Abbiamo gi quasi compiuto la riduzione di PCP al problema se una
CFG sia ambigua; questa riduzione dimostra che il problema dellambiguit di una CFG
indccidibile perch PCP indecidibile. Dobbiamo solo provare chc la costruzione
corretta, cio:
D IM O S T R A Z IO N E

G ab ambigua se e solo se listanza (.4. B) di PCP ha una soluzione.


(Se) Supponiamo che Z1, i 2, . . . , im sia una soluzione di questa istanza di PCP Conside
riamo le due seguenti derivazioni in G a d '

iS r- A Tr 'IVi j A.(]. j V Wt^ CL'/2 4 A j .j f l 21. - - ^


Wi1Wi2 Wim-I Adjm Aj2Aj1 => Wi1Wi2 WimClim Ai2At1
_

S =$B => Xi l B ail =* Xi1Xi2Bai2ait = >=>


x U X i ^ i m - I B a i n ^ l Aj2 A j 1 =*> X j 1X j 2 X j m Aim Oj2 A j l

Poich i , 2j . , i m una soluzione, sappiamo chc W i 1 W i2 - - W iin = X j 1X j2 - X i r n .


Queste due derivazioni generano la stessa stringa terminale. Trattandosi di due derivazioni
a sinistra, e distinte, della stessa stringa terminale deduciamo che G ab ambigua.

Altri problemi indecidibili

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

II complemento di un linguaggio associato a una lista

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

Altri problemi indecidibili

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

Esercizio 9.5.3 E indecidibile stabilire se il complemento di un CFL un CFL. Dal


l'Esercizio 9.5.2 si ricava che la questione se il complemento di un CFL sia regolare
indecidibile, ma non la stessa cosa. Per provare l'ipotesi dobbiamo definire un nuovo
linguaggio che rappresenta le non-soluzioni di un'istanza (.4, B ) di PCP. Sia L ab lin
sieme delle stringhe della forma / tali che valgano le condizioni 1-3 e almeno
una delle condizioni 4-7:

1. w e X sono stringhe sullalfabeto dellistanza di PCP


2. y c z sono siringhe sullalfabeto degli indici 1 di questa istanza
3. # un simbolo assente sia da sia da I

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

genera secondo la lista A.

Osservate chc L ab formato da tutte le stringhe in * # * # /* # /* salvo che listanza


( A B) abbia una soluzione, ma L ab un CFL in ogni caso. Dimostrate che L ab
un CFL se e solo se non ci sono soluzioni. Suggerimento: per imporre l'uguaglianza
delle lunghezze di certe sottostringhe come suggerito nell'Esercizio 7.2.5(b), applicate la
tecnica dellomomorfismo inverso dellEsercizio 9.5.2 e il lemma di Ogden.

9.6

Riepilogo

Linguaggi ricorsivi e ricorsivamente enumerabili: i linguaggi accettati dalle mac


chine di Turing sono detti ricorsivamente enumerabili (RE). I linguaggi RE accettati
da una TM che si arresta sempre sono detti ricorsivi.
Complementi di linguaggi ricorsivi e RE: i linguaggi ricorsivi sono chiusi rispetto
alla complementazione. e se un linguaggio e il suo complemento sono entrambi RE,
allora entrambi sono ricorsivi. Di conseguenza il complemento di un linguaggio RE
ma non ricorsivo non pu essere RE.

Bibliografa

435

Decidibilit e indecidibilit: decidibile sinonimo di ricorsivo, anche se si


tende a usare ricorsivo per i linguaggi e decidibile per i problemi (chc sono
linguaggi interpretati comc domande). Se un linguaggio non ricorsivo, diciamo
indecidibile il problema espresso da tale linguaggio.
Il linguaggio Ld'. linsieme delle stringhe di 0 e di 1 che, interpretate comc TM,
non sono nel linguaggio della TM stessa. 11 linguaggio La un buon esempio di
linguaggio non RE, vale a dire non accettato da alcuna macchina di Turing.
Il linguaggio universale: il linguaggio Lu consiste delle stringhe che vengono in
terpretate come una TM seguita da un input per la TM. Una stringa in Lu se la
TM accetta linput. Lu un buon esempio di un linguaggio RE ma non ricorsivo.
Teorema di Rice: qualunque propriet non banale dei linguaggi accettati dalle mac
chine di Turing indecidibile. Un esempio: per il teorema di Rice indecidibile
linsieme dei codici di macchine di Turing il cui linguaggio vuoto. Si tratta in
effetti di un linguaggio non RE, sebbene il suo complemento, ossia l'insieme di
codici di TM chc accettano almeno una stringa, sia RE ma non ricorsivo.
Problema della corrispondenza di Post: si chiede se. date due lisie con lo stesso
numero di stringhe, sia possibile scegliere una sequenza di stringhe corrispondenti
dalle due liste e formare per concatenazione la stessa stringa. Il PCP un importante
esempio di problema indccidibile. inoltre utile come problema da ridurre a un
altro per provarne l'indccidibilit.
Problemi indecidibili sui linguaggi liberi dal contesto: per riduzione da PCP pos
siamo mostrare lindccidibilit di un numero di questioni sui CFL o le loro gram
matiche. Per esempio indecidibile se una CFG ambigua, se un CFL contenuto
in un altro, oppure se lintersezione di due CFL vuota.

9.7

Bibliografia

L'indecidibilit del linguaggio universale essenzialmente un risultato di Turing |9J. an


che se nel suo lavoro espressa in termini di computazione di funzioni aritmetiche e
arresto anzich in termini di linguaggi e accettazione per stato finale. Il Teorema di Rice
tratto da IBJ.
L'indccidibilit del problema di corrispondenza di Post dimostrata in [7J, sebbe
ne la dimostrazione fosse gi stata tratteggiata da R.W. Floyd in una memoria inedita.
Lindecidibilit dei Post tag system (definiti nell'Escrcizio 9.4.4) tratta da [6],
Gli scritti fondamentali sullindecidibilit di questioni conccmcnti i linguaggi liberi
dal contesto sono fi 1 e f5J. Lindecidibilit della questione se una CFG sia ambigua

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

In questo paragrafo presentiamo i fondamenti della teoria del lintrattabilit: le classi V


cd M V dei problemi risolvibili in tempo polinomiale rispettivamente da TM deterministi
che e non deterministiche, e la tecnica della riduzione polinomiale. Definiamo inoltre la
nozione di NP-completezza, una propriet di alcuni problemi in H V che sono almeno
tanto ardui (a meno di un polinomio rispetto al tempo) quanto ogni altro problema in M V .

10.1.1

Problemi risolvibili in tempo polinomiale

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

Tra polinomiale ed esponenziale


Nella trattazione introduttiva, e anche successivamente, ipotizziamo che tutti i
programmi impieghino tempo polinomiale (cio 0 (n h) per un intero k), o tempo
esponenziale (cio 0(2cn) per una costante c > 0), o superiore. Nella pratica gli
algoritmi conosciuti per i problemi comuni rientrano effettivamente in una delle
due categorie. Esistono per tempi di esecuzione compresi tra polinomiale ed
esponenziale. Quando parliamo di esponenziale, intendiamo qualunque tempo
di esecuzione pi grande di qualsiasi polinomio".
Un esempio di funzione tra i polinomi e gli esponenziali n log2 . Si tratta
di una funzione che cresce pi velocemente di qualsiasi polinomio in n, dato chc
logre, diventa (per valori grandi di n) maggiore di qualunque costante k. D altra
parte n log2 n = 2^'K2 ; per convincersene basta prendere il logaritmo di en
trambi i membri. Questa funzione cresce pi lentamente di 2cn per qualunque
c > 0. In altre parole, per quanto piccola sia la costante positiva cn finir per
essere maggiore di (Iog2 n)2.

10.1.2

Un esempio: lalgoritmo di KruskaI

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

a graph and the traveling salesman

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

d o g e ). Limplementazione pi semplice procede in e turni. Una tabella fornisce la


componente di ogni nodo a ogni istante. In tempo O(c) scegliamo fra i lati restanti quello
di peso pi piccolo, e in tempo O (I) troviamo le componenti dei due nodi uniti dal lato.
Se si trovano in componenti diverse, in tempo 0(rn) riuniamo tutti i nodi che recano
quei valori, percorrendo la tabella dei nodi. Il tempo totale impiegato daH'algoritmo
0(e(e -I- m )). Questo tempo di esecuzione polinomiale nella dimensione dellinput,
che possiamo informalmente considerare come la somma di e ed m.
Se proviamo a tradurre queste idee nei termini di una macchina di Turing, ci troviamo
di fronte ad alcuni problemi.
Nello studio di algoritmi ci imbattiamo in problemi chc richiedono una variet di
forme di output, come la lista dei lati di un MWST. Trattando macchine di Turing,
possiamo considerare i problemi solo come linguaggi, e lunico output s o
no, ossia accettazione o rifiuto. Per esempio il problema MWST potrebbe essere
espresso cos: dato il grafo G e lintero W , G ha un albero di copertura di peso
non superiore a W T Dato che non chiede di determinare lalbero di copertura,
questo problema sembra pi facile rispetto alla versione di MWST che abbiamo
studiato. Ma nella teoria dellintrattabilit vogliamo in genere dimostrare che un
problema difficile, non facile, c il fatto che la versione s/no di un problema sia
difficile implica che difficile anche la versione in cui si deve calcolare una risposta
completa.
Sc possiamo considerare la dimensione di un grafo come il numero dei suoi nodi
e lati, linput di una TM una stringa su un alfabeto finito. Di conseguenza gli
elementi del problema, come nodi e lati, devono essere adeguatamente codificati.
Ne segue chc gli input di una macchina di Turing sono di solito pi lunghi rispetto
alla dimensione intuitiva del linput. Ci sono per due ragioni per cui la differenza
non rilevante.
1. La differenza tra la dimensione come stringa di input di una TM e la dimen
sione come input di un problema informale non mai superiore a un fattore
piccolo, solitamente il logaritmo della dimensione dell'input. Di conseguenza
quanto pu essere fatto in tempo polinomiale rispetto a una misura pu essere
fatto in tempo polinomiale anche rispetto all'altra.
2. La lunghezza di una stringa che rappresenta l'input effettivamente una mi
sura pi precisa del numero di byte che un computer deve leggere per ottenere
linput. Per esempio, se un nodo rappresentato da un intero, allora il nu
mero di byte necessari per rappresentarlo proporzionale al logaritmo della
dimensione dellintero, e non un byte per qualsiasi nodo, come potremmo
immaginare in una spiegazione informale della dimensione dell'input.

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

Tempo polinomiale non deterministico

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

Una variante dellaccettazione non deterministica


Abbiamo imposto alle NTM di arrestarsi in tempo polinomiale in tutte le dira
mazioni, a prescindere dal fatto che accettino o no. Avremmo potuto imporre
il limite di tempo polinomiale T(n) solo sulle diramazioni che conducono al
laccettazione; cio avremmo potuto definire ArV come insieme dei linguaggi
accettali da NTM che accettano tramite almeno una sequenza di non pi di T(r)
mosse, per un polinomio T(n).
Avremmo comunque ottenuto la stessa classe di linguaggi. Sapendo infatti
che, se M accetta, lo fa in T(n) mosse, possiamo modificarla in modo che conti
fino a T(n) su una traccia distinta del nastro e si arresti senza accettare se supera
T(n). La M modificata pu compiere 0 (T 2(n)) passi, ma T2(n) un polinomio
sc lo T(r).
In effetti avremmo potuto anche definire V per accettazione da parte di TM
che accettano in tempo non supcriore a T(n), per un polinomio X(n), ma che
possono non arrestarsi se non accettano. Con la stessa costruzione usata per le
NTM possiamo infatti modificare la DTM in modo che conti fino a T(n) e si
arresti se si eccede il limite. La DTM opererebbe in tempo ( 2()).

la questione, tuttora aperta, se V ArV, ossia se effettivamente tutto ci chc


una NTM pu fare in tempo polinomiale possa essere fatto da una DTM in tempo
polinomiale, eventualmente di grado pi elevalo, una delle questioni pi profonde
della matematica.

10.1.4

Un esemplare di fV: il problema del commesso viaggiatore

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.

Figura 10.2 Schema di riduzione.


Supponiamo di voler dimostrare lenunciato se P2 in V . allora lo anche P i. Poich
sosteniamo che Py non in V, potremmo allora affermare che neanche P2 c in V. La
2U affermazione non del tutto vera. In realt ipotizziamo che P i non sia in P in base a un indizio molto
forte: il fatto che NP-completo, un concetto chc tratteremo nel Paragrafo 10.1.6. Dimostriamo chc anche
P-2 NP-completo". e abbiamo cos l'indizio chc P i non in V .

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

2. Per ogni linguaggio L ' in M V esiste una riduzione polinomiale di L ' a L.


Come vedremo, un esempio di problema NP-completo e il problema del commesso viag
giatore, introdotto nel Paragrafo 10.1.4. Poich si ritiene chc V M V , e che in parti
colare tutti i problemi NP-completi sono in M V V, consideriamo la dimostrazione di
NP-complctczza di un problema come la dimostrazione che quel problema non in V.
Dimostreremo che un primo problema, detto SAT (abbreviazione di boolean satisfia
bility, soddisfacibilit booleana), NP-completo provando che il linguaggio di ogni NTM
con tempo polinomiale ha una riduzione polinomiale a SAT. Se disponiamo di alcuni pro
blemi NP-completi, possiamo dimostrare l'NP-completezza di un nuovo problema ridu
cendo a questo uno di quelli noti tramite una riduzione polinomiale. Il teorema che segue
spiega perch una riduzione di questo tipo serve a dimostrare che il problema darrivo
NP-completo.
Teorema 10.4 Sia Pi un problema NP-completo e Po un problema in MV. Se esiste una
riduzione polinomiale di P\a P-. allora P NP-completo.
Dobbiamo dimostrare che ogni linguaggio L in M V si riduce in tempo
polinomiale a P. Sappiamo che esiste una riduzione polinomiale di L a P1 che impiega
un tempo polinomiale p (n ). Di conseguenza una stringa w in L di lunghezza n viene
convertita in una stringa a; in Pi di lunghezza massima p{n).
Sappiamo inoltre chc esiste una riduzione polinomiale di Pi a P; supponiamo che
essa impieghi un tempo polinomiale q(m). La riduzione Irasfonna dunque x in una stringa
y in P2, impiegando un tempo massimo </(p()). Pertanto la trasformazione di w in y
impiega un tempo massimo p(n) + q(p(n)), che polinomiale. Concludiamo che L
riducibile in tempo polinomiale a P. Dato che L un linguaggio arbitrario in M V ,
abbiamo dimostrato che lintera classe M V si riduce polinomialmente a P-, cio che P<
NP-completo.
D IM O S T R A Z IO N E

C un altro importante teorema da dimostrare in relazione ai problemi NP-completi:


se uno qualunque di essi in V, allora tutta la classe M V contenuta in V. Poich siamo
convinti che molti problemi in M V non sono in V, consideriamo la dimostrazione che un
problema NP-completo equivalente alla dimostrazione che esso non ha alcun algoritmo
polinomiale, e quindi neppure una soluzione pratica basata su computer.
Teorema 10.5 Se un problema NP-completo P in V, allora V = M V .
Supponiamo chc P sia NP-completo e si trovi in V. Ogni linguaggio
L in M V si riduce allora in tempo polinomiale a P. Sc P in V, allora L c in V, come
discusso nel Paragrafo 10.1.5.

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

Altre nozioni di NP-completezza


11 vero obicttivo dello studio dellNP-completezza il Teorema 10.5, cio l'iden
tificazione dei problemi la cui appartenenza a V implica V = AfV. La definizio
ne di "NP-completo usata finora, detta spesso Karp-compelezzo perch venne
utilizzata per la prima volta in un fondamentale studio di R. Karp sullargomento,
adatta a cogliere ogni problema chc possiamo ritenere soddisfi il Teorema 10.5.
Altre nozioni pi ampie di NP-completezza sono compatibili con il Teorema 10.5.
Per esempio Cook, nel suo studio originale sul tema, definiva un problema P
come NP-completo se. dato un oracolo per il problema P, ossia un meccanismo
che in una unit di tempo pu rispondere a qualunque domanda sullappartenenza
di una data stringa a P. possibile riconoscere qualunque linguaggio in AfV in
tempo polinomiale. Questo tipo di NP-complctezza c detta Cook-completezza. In
un certo senso la Karp-completezza c il caso speciale in cui si pone alloracolo
una sola domanda. La Cook-completezza per permette anche di invertire la
risposta; per esempio si potrebbe porre alloracolo una domanda e poi rispondere
il contrario di quanto dice loracolo. Una conseguenza della definizione di Cook
che anche i complementi dei problemi NP-completi sarebbero NP-completi.
Usando una nozione pi ristretta della Karp-completczza, come effettivamente
facciamo, nel Paragrafo 11.1 siamo in grado di operare un importante distinzione
tra i problemi NP-completi (nel senso di Karp) e i loro complementi.

(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

Figura 10.3 Un grafo con n 2, m = 3.

Eseguite quanto segue e rispondente al quesito posto.


* a) Dimostrate che Li riducibile in tempo polinomiale a L->.
b) Dimostrate che L i riducibile in tempo polinomiale a Li.
* c) Che cosa dicono (a) e (b) circa la possibilit che L\ ed L- siano NP-complcti?
Esercizio 10.1.6 In quanto classi di linguaggi, V ed V hanno ciascuno determinate
propriet di chiusura. Dimostrate che V chiuso rispetto alle seguenti operazioni:
a) inversione
* b) unione
*! c) concatenazione
! d) chiusura (star)
e) omomorfismo inverso
* f) complementazione.
Esercizio 10.1.7 Anche M V chiuso rispetto a ognuna delle operazioni elencate per
V nellEsercizio 10.1.6, con leccezione (presunta) della complementazione al punto
(f). Non noto se M V sia chiuso rispetto alla complementazione o no: questo pun
to verr discusso pi avanti nel Paragrafo 11.1. Dimostrate che i punti da (a) a (e)
dellEsercizio 10.1.6 valgono anche per MV.

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

II problema della soddisfacibilit

Lc espressioni booleane sono costruite a partire da:


1. variabili a valori booleani, ossia 1 (vero) o 0 (falso)
2. gli operatori binari e V, che significano AND e OR logico di due espressioni
3. loperatore unario

chc significa la negazione logica

4. parentesi per raggruppare operatori e operandi in modo da modificare, se necessa


rio, lordine di precedenza predefnito: prima ->, poi , infine V.
Esempio 10.6 Un esempio di espressione booleana x ->(?/ V z). La sottoespressione
y V z vera se la variabile y o la variabile 2 ha valore vero, cd falsa se le due variabili
sono false. La sottoesprcssione pi ampia ->(y V z) vera quando y V 2 falsa, ossia
quando sia y sia z sono false. Se y z oppure entrambe sono vere, allora ->(y V z)
falsa.
Infine consideriamo lintera espressione. In quanto AND logico di due sottoespres
sioni, essa vera quando entrambe le sottoespressioni sono vere. Quindi x A ->(y V j )
vera quando x vera, y falsa e z falsa. Cl
Un assegnamento di valori di verit per una data espressione booleana E assegna i
valori vero o falso a ognuna delle variabili presenti in E. Il valore dell'espressione E
rispetto a un assegnamento di valori di verit T, denotato come E(T ) , il risultato della
valutazione di E con ciascuna variabile x sostituita dal valore T(x) (vero o falso) che T
assegna a x.
Un assegnamento di valori di verit T soddisfa lespressione booleana E se E(T) =
1, cio se rende vera l'espressione E. Unespressione booleana E si dice soddisfacibile
se esiste almeno un assegnamento di valori di verit T che soddisfa E.
Esempio 10.7 Lespressione x ->(y V z) dellEsempio 10.6 soddisfacibile. Abbiamo
visto che lassegnamento di valori di verit T definito da T(x) = 1, T(y) = Oe T(z ) 0
la soddisfa, in quanto rende vero (1) il valore dellespressione. Abbiamo inoltre osservato

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.

F ha valore 0 solo per il quarto assegnamento, in cui x = 0 Qy = 1. Quindi F


soddisfacibile.
Il problema della soddisfacibilit cos definito:
un'espressione booleana assegnata soddisfacibile?
In genere denoteremo con SAT il problema della soddisfacibilit. Enunciato come lin
guaggio, il problema SAT linsieme delle espressioni booleane (codificate) soddisfacibili. Le stringhe che non sono codi fiche valide per unespressione booleana o che sono
codilichc per espressioni booleane non soddisfacibili non appartengono a S AT.

10.2.2

Rappresentazione di istanze di SAT

I simboli in unespressione booleana sono , V.


le parentesi aperta e chiusa, e i simboli
che rappresentano le variabili. La soddisfacibilit di unespressione non dipende dai nomi
delle variabili, ma solo dal fatto che due occorrenze di variabili rappresentino la stessa
variabile o due variabili diverse. Di conseguenza possiamo presumere che Ie variabili
siano X i,X 2 , anche se negli esempi continueremo a usare nomi di variabili come y o
z . oltre a x. Assumiamo inoltre di rinominare le variabili in modo da usare gli indici pi

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,

e ) sono rappresentati da se stessi.

2. La variabile x rappresentata dal simbolo x seguito dalla rappresentazione binaria


di i.
Lalfabeto per il problema/linguaggio SAT ha quindi solo otto simboli. Tutte le istanze di
SAT sono stringhe su questo alfabeto finito.
Esempio 10.8 Consideriamo lespressione x A ->(y V z) tratta dallEsempio 10.6. Il
primo passo da compiere nella codifica sostituire le variabili con x dotati di indici.
Essendoci tre variabili, adoperiamo a?i, x- e :r;!. Possiamo scegliere liberamente quale fra
x, y e z sostituire con ognuna delle a;,. Poniamo x = X1, y = x% e z = 3 . Lespressione
diventa dunque Xi A ~(2 V 3 ). Lespressione codificata :

x l A -(10 V x l l )

Osserviamo che la lunghezza dellespressione booleana codificala pari a circa il


numero di posizioni nellespressione, contando 1 per ogni occorrenza di variabile. La
differenza si spiega con il fatto che se lespressione ha m posizioni, pu avere O (ni)
variabili; le variabili richiedono quindi O(Iogm) per la codifica. Quindi un'espressione
la cui lunghezza di m posizioni pu avere un codice lungo n = O ( log m) simboli.
La differenza tra m e m log rn senzaltro limitata da un polinomio. Perci, finch
trattiamo la questione se un problema possa essere risolto in tempo polinomiale nella
lunghezza del suo input, non c bisogno di distinguere tra la lunghezza della codifica di
unespressione e il numero di posizioni nellespressione stessa.

10.2.3

NP-completezza del problema SAT

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

La prima parte della dimostrazione, cio provare che SAT in ArV.

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

2. ao h I- h &, dove k < p(??.)


3. a/t una ID con uno stato accettante
4. ciascun a formato soltanto da simboli diversi dal blank (tranne il caso in cui a,;
finisce con uno stato e un blank) e si estende dalla posizione iniziale della testina
(cio il simbolo di input pi a sinistra) verso destra.

Un problema NP-completo 455


La strategia adottata pu essere riassunta come segue.
a) Ciascun a pu essere scritto come una sequenza di simboli X qX ).
Uno di questi uno stato e gli altri sono simboli di nastro. Come sempre assumiamo
che gli stati e i simboli di nastro siano disgiunti, per cui possiamo stabilire quale
X 11 lo stato, e dunque dove si trova la testina. Osserviamo che non c motivo di
rappresentare i simboli a destra dei primi p(n) simboli sul nastro (contando lo stato
abbiamo cos una ID di lunghezza p(n) 1) perch questi non possono influenzare
una mossa di M se questa si arresta entro p(n) mosse.
b) Descriviamo la sequenza di ID in termini di variabili booleane. creando la variabile
tjijA per rappresentare la proposizione Xj = A. Qui i e j sono interi nell'intervallo
da 0 a p(n) e A un simbolo di nastro oppure uno stato.
c) Esprimiamo la condizione che la sequenza di ID rappresenta laccettazione di un
input w scrivendo unespressione booleana soddisfacibile se e solo se M accetta w
con una sequenza di non pi di p(n ) mosse. Lassegnamento soddisfacente quello
che dice la verit sulle ID; in altre parole xjja vero se e solo se X 13 = A. Per as
sicurarci della correttezza della riduzione di L(M ) a SAT, scriviamo l'espressione
in modo tale che indichi le caratteristiche della computazione.

i. Avvio corretto. La ID iniziale qov seguito da blank.


i/i Mossa successiva lecita (cio la mossa rispetta le regole della TM). Ogni ID
successiva segue dalla precedente tramite una delle mosse lecite di M .
ni. Terminazione corretta. Esiste una ID con stato accettante.
Prima di definire come si costruisce l'espressione booleana, dobbiamo precisare alcuni
punti.
In primo luogo abbiamo specificato che una ID termina dove comincia la coda
infinita di blank. Quando si simula una computazione polinomiale pi opportuno
considerare tutte Ic ID come aventi la stessa lunghezza. p(n) + 1. Perci in una ID
pu essere presente una coda di blank.
In secondo luogo opportuno assumere che tutte le computazioni durino esatta
mente p(n) mosse (e abbiano perci p(n) + I ID) anche se l'accettazione avviene
prima. Dunque facciamo s che ogni ID con uno stato accettarne sia il proprio
successore. In altre parole, se o ha uno stato accettante, permettiamo la mossa
a l tt. Perci possiamo assumere chc, se esiste una computazione accettante, allo
ra ttp(n) avr una ID accettante. Questo ci che si deve verificare per la condizione
Terminazione corretta.

Capitolo 10

456

La Figura 10.4 illustra una computazione polinomiale di M. Le righe corrispondono alla


sequenza di 1D; le colonne sono le celle del nastro usato nella computazione. Osserviamo
che il numero di celle nella Figura 10.4 (p(n) + 1). Inoltre il numero di variabili che
rappresentano ciascuna cella finito e dipende solo da M ; infatti la somma del numero
degli stati e dei simboli di nastro di M.
ID

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)

Figura 10.4 Costruzione dellarray di celle/ID.


Scriviamo ora un algoritmo per costruire un'espressione booleana E m ,w da M c tv. La
forma complessiva di E m ,w c S A N A F, dove S, N ed F sono espressioni indicanti
chc M comincia, si muove e termina correttamente.
Avvio corretto
X 0O dev'essere lo stato iniziale qo di M , i simboli da Xoi a J5T0n devono formare ui
(dove n la lunghezza di w), e i rimanenti Xoj devono essere il blank, . Quindi se
w = Oi02 a:

VoOq0

2/01, A D o i a 2 A A VOnan A ),+1, A V o , n + 2 ,B A

A V o . p ( n ) . B

Un problema NP-completo

457

Data la codifica di M e dato w, possiamo senzaltro scrivere S in un tempo 0(p(r)) sul


secondo nastro di una TM multinastro.
Terminazione corretta
Avendo ipotizzato che una ID accettante si ripeta per sempre, laccettazione da parte di
M equivale a trovare uno stato accettante in a p(n). Ricordiamo che per ipotesi la NTM
Al, se accetta, lo fa entro p(n) passi. Di conseguenza F l'OR delle espressioni Fj, per
j = 0 , 1,. . . ,p(rc), dove Fj afferma che X v(n).j uno stato accettante. In altre parole
F jQ y>(n),j,a\ V yp(n),j,a-2 V V

>dove o i , (>2 , .. , Ok sono tutti gli stati


accettanti di M . Quindi
F = F0 V F 1 V
V Fv(n)
Osserviamo che ogni Fi impiega un numero costante di simboli, che dipende da Ni,
ma non dalla lunghezza n dell'input w. Perci F ha lunghezza ((.)). Inoltre il tempo
per scrivere F, data una codifica di M e linput w, polinomiale in ri; in realt F pu
essere scritta in un tempo Q(p(n)) su una TM multinastro.
Mossa successiva lecita
Assicurarsi che le mosse di M siano corrette la parte di gran lunga pi complicata.
Lespressione Ar sar lAND delle espressioni Ni, per = 0, 1,. . . ,() 1, e ogni Ni.
sar definita in modo da garantire che a+1 sia una delle ID che possono seguire Cti in M .
Per spiegare come si scrive Ni, osserviamo anzitutto il simbolo X-i+i.j nella Fig. 10.4. E
sempre possibile determinare Xi+i.j dai seguenti dati.
1. I tre simboli sopra di esso: X i.)- 1, X ij e X i,j+
2. La mossa scelta da M se uno dei simboli lo stato di a, .
Scriveremo Ni come lA delle espressioni Aj V B ij, dove j = 0 . 1 , . . . ,p(n).

Lespressione AiJ indica chc:


a) lo stato di o c alla posizione j (cio X ij lo stato)
b) M pu scegliere una mossa, dove X ij lo stato e X j +i il simbolo guar
dato, che trasforma la sequenza di simboli X i^--[Xij X i_j+\ nella sequen
za X i+] j-iXi+i.jXi+\,j+i. Osserviamo che, sc X ij uno stato accettan
te, esiste la scelta di non fare alcuna mossa, per cui tutte le ID successive
coincidono con quella che per prima ha condotto allaccettazione.
Lespressione B ij indica che:

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 .

Bij la pi facile da scrivere. Siano <71, q2, . . . ,


i simboli di nastro. Allora:

B ij

gli stati di M , e siano Z i i Z 2, . . . , Z r

(Ji.ji.qi V ViJ-Isii V V ViJ-IlQm) V


(Vi,j+l,qi V Vi.j +l.in V V
+
)V
((Vij.Zi V
V V ViJ1Zr) A
{{Vi,j,Zi A
V ( v i j , z 2 A 'f/j+i, 7 .Z2 ) V V {vij,zr A ?y;+ i . ?.z,.)))

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

X i+ yj-.X i +yjX i+ ij+ ,


Il numero di assegnamenti validi alle sei variabili quindi finito. Sia Ail un OR di termini,
un tonnine per ogni insieme delle sei variabili che forma un assegnamento valido.
Per esempio supponiamo che una mossa di M derivi dal fatto che (q, A) contie
ne (p, C\L). Sia D un simbolo di nastro di M. Un assegnamento valido sar dunque

Un problema NP-completo 459


X ij- iX ijX ij+ i = DqAe X i+ i'j- X i+ ijX i+ ij+ i = pDC. Osserviamo che lasse
gnamento riflette il cambio di ID causato dalla mossa di M . 11termine che esprime questa
possibilit
V i , j - \ , D yi.j.q A yi.j + , A Vi+ 1,j l ,p A J/+1,j.D A /t+LJ + KC

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

N i = (>lo V B o ) A (i4ji V B h ) A ( {) V BiP{n))


e dunque
' = Aro N i ()_ i
Se / ha molti stati simboli di nastro, A ij e B i., possono essere molto grandi, ma
la loro dimensione comunque una costante rispetto alla lunghezza dellinput w; in altre
parole la loro dimensione indipendente da n, la lunghezza di w. Di conseguenza la
lunghezza di N i 0 (p(n )) e la lunghezza di N ( 2()). Laspetto pi importante
che possiamo scrivere N su un nastro di una TM multinastro in un tempo proporzionale
alla sua lunghezza e polinomiale in n, la lunghezza di w.
Dimostrazione del teorema di Cook: conclusione
Abbiamo descritto la costruzione di

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

Figura 10.5 Se SAT e in V, si pu dimostrare che ogni linguaggio in M V si trova in V


tramite una DTM definita in questo modo.

10.2.4

Esercizi

Esercizio 10.2.1 Quanti assegnamenti di valori di verit soddisfacenti hanno le seguenti


espressioni booleane? Quali sono in SAT?
* a) .TA (y V -<x) A (2 V ->?/).
b) (o V y) A (-(. V z) V (~>z A
Esercizio 10.2.2 Sia G un grafo di quattro nodi:l, 2, 3 e 4. Sia Xjj, per 1 < i < j <
4, una variabile proposizionale la cui interpretazione esiste un lato tra i nodi i e f\
Qualsiasi grafo su questi nodi pu essere rappresentato da un assegnamento di valori di
verit. Per esempio il grafo della Figura 10.1 e rappresentato dichiarando falsa *14 e
vere le altre cinque variabili. Qualsiasi propriet del grafo che riguardi solo lesistenza
o la non esistenza di lati si pu esprimere come unespressione booleana vera se e solo
se lassegnamento di valori di verit alle variabili descrive un grafo con quella propriet.
Scrivete le espressioni per le seguenti propriet.
* a) G ha un circuito hamiltoniano.
b) G connesso.

Un problema di soddisfacibilit vincolino

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

Un problema di soddisfacibilit vincolato

Intendiamo dimostrare NP-completezza di un'ampia gamma di problemi, tra cui il TSP,


citato nel Paragrafo 10.1.4. In teoria procediamo per riduzione polinomiale dal problema
SAT al problema in esame. Esiste per un importante problema intermedio, detto 3SAT,
molto pi facile da ridurre ai problemi tipici rispetto a SAT. Anche 3SAT un problema
di soddisfacibilit di espressioni booleane, ma per espressioni di forma molto regolare,
formate dalla congiunzione logica di clausole, ognuna delle quali la disgiunzione logica
di esattamente tre variabili, eventualmente negate.
In questo paragrafo presentiamo la terminologia relativa alle espressioni booleane. R i
duciamo poi la soddisfacibilit di un'espressione qualsiasi alla soddisfacibilit di espres
sioni nella forma di 3SAT. interessante osservare che, se ogni espressione booleana E
ha unespressione equivalente F nella forma normale di 3SAT, la dimensione di F pu
essere esponenziale in quella di E. Una riduzione in tempo polinomiale di SAT a 3SAT
deve quindi essere pi scaltra di una semplice manipolazione algebrica. Dobbiamo con
vertire ogni espressione E di SAT in un'espressione F nella forma normale di 3SAT. Non
occorre che F sia equivalente a E: basta che F sia soddisfacibile se e solo se E lo .

10.3.1

Forme normali di espressioni booleane

Diamo tre definizioni fondamentali.


Un letterale una variabile o una variabile negata. Ne sono esempio x e ->y. Per
risparmiare spazio scriveremo spesso y in luogo di ->?/.
Una clausola la disgiunzione logica (OR) di uno o pi letterali. Ne sono esempio
x, X V y, e X V y V z.
Un'espressione booleana si dice in forma normale congiuntiva, o CNF ( Conjuncti
ve Normal Form), se la congiunzione logica (AND) di una o pi clausole.
Per abbreviare ulteriormente le espressioni adottiamo una notazione alternativa, in cui
trattiamo V come una somma, c scriviamo +, e A come un prodotto. Per il prodotto
ricorriamo di solito alla giustapposizione, senza operatore, come per la concatenazione
nelle espressioni regolari. Confomaemente diremo che una clausola una somma di
letterali e unespressione in CNF un prodotto di clausole.

462

Capitolo 10

Esempio 10.10 Nella notazione compressa lespressione (x V ->y) A (^x V z) sar


scritta (x 4- y)(x 4- z). Lespressione in forma normale congiuntiva perch il prodotto
(AND) delle clausole (x + y) e (x 4- z).
Lespressione (x + yz)(x 4- y 4- z)(y 4- ) non in CNF. bens il prodotto di tre
sottoespressioni: (x + yz), (x 4- y 4- z) e (y 4- z), ma solo Ie ultime due sono clausole.
La prima la somma di un letterale e del prodotto di due letterali.
Lespressione xyz c in CNF. Ricordiamo che una clausola pu contenere anche un
solo letterale. Lespressione in esame quindi il prodotto di tre clausole: (x), (y) e (z).

Unespressione si dice in forma normale k-congiuntiva (fc-CNF) se il prodotto di


clausole, ognuna delle quali la somma di k letterali distinti. Per esempio (x + y)(y 4z)(z + a;) in 2-CNF perch ognuna delle sue clausole ha esattamente due letterali.
Ogni vincolo sulle espressioni booleane d luogo a un problema di soddisfacibilit
delle espressioni che lo soddisfano. Affronteremo quindi i due problemi seguenti.
CSAT: una data espressione booleana in CNF soddisfacibile?
ASAT: una data espressione booleana in -CNF soddisfacibile?
Vedremo che CSAT, 3SAT e ^SAT per ogni k maggiore di 3 sono NP-completi. Esistono
invece algoritmi in tempo lineare per ISAT e 2SAT.

10.3.2

Conversione in CNF di espressioni booleane

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.

Un problema di soddisfacibilit vincolato

463

Trattamento di input malformati


Tutti i linguaggi di cui abbiamo parlato - SAT, CSAT, 3SAT, e cos via - sono
linguaggi su un alfabeto fissato, di 8 simboli, le cui stringhe si possono a volte
interpretare come espressioni booleane. Una stringa che non possa essere inter
pretala come espressione non pu essere nel linguaggio di SAT. In modo simile,
se consideriamo espressioni di forma vincolata, una stringa che sia un'espressio
ne booleana ben formata, ma non della forma richiesta, non nel linguaggio. Un
algoritmo di decisione per il problema CSAT. per esempio, risponde no a fronte
di unespressione booleana soddisfacibile ma non in CNF.

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

" ( H * + :?/))(* +1/))


->(^(x + y)) -I- ->(x + y)
x + y + ->(x + y)

& + 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.

Teorema 10.12 Perogni espressione booleana E esiste unespressione equivalente F in


cui le negazioni compaiono solo nei letterali, cio si applicano direttamente alle variabili.
Inoltre la lunghezza di F lineare nel numero di simboli di E, ed F si costruisce da E in
tempo polinomiale.
DIM OSTRAZIONE La dimostrazione un'induzione sul numero di operatori (, V e -0 in
E. Dimostriamo lesistenza di unespressione equivalente F con lutti i -i nei letterali. Se
E contiene n > 1 operatori, F ne contiene al pi 2n 1.
Poich F si pu scrivere usando non pi di una coppia di parentesi per operatore, e il
numero delle variabili di unespressione pu superare il numero di operatori al massimo
di uno. concludiamo che la lunghezza di F linearmente proporzionale a quella di E. Ve
dremo inoltre che la costruzione di F tanto semplice da richiedere tempo proporzionale
alla sua lunghezza, e quindi proporzionale alla lunghezza di E.
b a se Se contiene un solo operatore, E dev'essere della forma ->x, a* V y o x A y. con x
e y variabili. In ogni caso E c gi della forma desiderata e possiamo porre F = E. Sia
E sia F hanno un operatore, quindi vale la relazione il numero di operatori di F al pi
doppio di quello di E, meno 1.
INDUZIONE Supponiamo chc lenunciato sia vero per tutte le espressioni con meno opera
tori di E. Se il suo operatore di livello pi alto non
E dev'essere della forma V E 2
A E 2. In entrambi i casi lipotesi induttiva si applica a E i e a
essa dice che
esistono due espressioni equivalenti, rispettivamente F\ed F2, in cui i ->figurano solo nei
letterali. Quindi F = F\ V F o F = (Fi ) A (F2) equivalente a E. Supponiamo che

Un problema di soddisfacibilit vincolato

465

Ey ed F 2 abbiano rispettivamente a c b operatori. Allora E ne ha a + b + 1. Per lipotesi


induttiva Fi ne ha al massimo 2a 1 od F2 al massimo 2b I . Perci F ha al massimo
2a + 2b I operatori, cio non pi di 2(a + b + 1) 1, ossia il doppio di F , meno 1.
Consideriamo ora il caso in cui E ha forma -'Ey. A seconda delloperatore pi esterno
di F i distinguiamo tre casi. Osserviamo che F i deve contenere un operatore; in caso
contrario F rientrerebbe nei casi di base.
1. F t = - F 2. Per la legge della doppia negazione, F = >('F 2 ) equivale a F 2.
Poich F 2 ha meno operatori di F , si applica lipotesi di induzione. Possiamo
quindi trovare una F equivalente a Eoy in cui i -1 figurano solo nei letterali. La
stessa F vale per F. Poich il numero di operatori di F non supera il doppio del
numero di operatori di F 2, meno 1, non pu superare neppure il doppio di quello
di F , diminuito di I .
2. Ey = F 2 V F 3 . Per la legge di DeMorgan, F = -(Eo V F 3 ) equivale a
(- (F 2)) (- (F 3)). Sia - (F 2) sia (F j) hanno meno operatori di F ; per li
potesi induttiva esistono espressioni equivalenti F2 ed Fi con tutti i - nei letterali.
Quindi F = (F2) (F i) serve da equivalente di F. Affermiamo inoltre chc il
numero di operatori di F non troppo elevalo. Sia a il numero di operatori di F 2
e b quello di F j . Allora F ha a + b + 2 operatori. Poich - (F 2) e (F 3 ) hanno
rispettivamente a + 1 e b + 1 operatori, ed F 2 ed Fi sono ricavati da quelle espres
sioni, per ipotesi di induzione sappiamo che F 2 cd Fi hanno al pi rispettivamente
2(a + 1) 1 e 2(b + 1 ) -1 operatori. Quindi F ha non pi di 2a + 2b + .'3 operatori.
Questo numero esattamente il doppio del numero di operatori di F , meno 1.
3. F i = F 2 Ei . In questo caso si procede comc in (2) applicando la seconda legge
di DeMorgan.

10.3.3

NP-completezza di CSAT

Dobbiamo ora convertire in CNF unespressione F formata da AND e OR di letterali.


Come gi dello, per produrre in tempo polinomiale, a partire da F, unespressione F
soddisfacibile se e solo se F soddisfacibile, dobbiamo rinunciare alle trasformazioni che
preservano lequivalenza e introdurre in F variabili che non figurano in E. Ci serviremo
di questa tecnica per dimostrare che CSAT NP-completo; per chiarire la costruzione, ne
daremo poi un esempio.
Teorema 10.13 CSAT NP-completo.

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

prodotto di clausole in tempo non superiore a eri2 per unespressione di lunghezza n. A


seconda delloperatore principale di E distinguiamo due casi.
Caso I: E = E\ A E2. Per lipotesi di induzione esistono due espressioni in CNF, F\
ed F, derivate rispettivamente da E\ ed E 2. Tutti e soli gli assegnamenti soddisfacenti
per E 1 si possono estendere ad assegnamenti soddisfacenti per Fi , e lo stesso vale per E 2
ed F2. Senza perdere in generalit, assumiamo che le variabili di Fi e quelle di F2 siano

Un problema di soddisfacibilit vincolato

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.

F = Fi F2. F 1 F2 chiaramente unespressione in CN F se lo sono F i ed F2.


Dobbiamo dimostrare che un assegnamento di valori di verit T per E si pu estendere a
un assegnamento soddisfacente per F se e solo se T soddisfa E.
Sia

E. Sia T1 come T, ma limitato alle variabili presenti


in E\, e sia T2 la stessa cosa riferita a E2. Per ipotesi di induzione, T 1 e T2 si possono
estendere ad assegnamenti S i ed S2 che soddisfano rispettivamente F i ed F2. Definiamo
S in accordo con Si ed S2 sulle rispettive variabili. Poich le sole variabili comuni a
F1 ed F2 sono quelle di E , ed S i ed S2 devono coincidere su di esse se sono entrambe
definite, sempre possibile costruire S. Dunque S unestensione di T chc soddisfa F.
(Se) Supponiamo che T soddisfi

(Solo se) N ellaltra direzione, sia

S unestensione di T che soddisfa F. Sia T1 (rispet

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

T2. Poich F lA N D di F 1 ed F 2, necessariamente Si soddisfa F 1, ed


S2 soddisfa F2. Per ipotesi di induzione, T1 (risp. T2) soddisfa E] (risp. E 2). Dunque T
soddisfa E.
unestensione di

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.

E2) soddisfa F 1 (risp. E2) se e

solo se si pu estendere a un assegnamento che soddisfa F i (risp. F2).


2. Le variabili di F i ed
3. F i ed

F2 sono disgiunte, tranne quelle presenti in E.

F2 sono in CNF.

Per costruire F non possiamo fare semplicemente O R di F j ed F2 perch l esito non


sarebbe in CNF. Ricorriamo dunque a una costruzione pi complicata, in cui sfruttia
mo il fatto che vogliamo solo preservare la soddisfacibilit senza chiedere l equivalenza.
Supponiamo

^ i = g\A g2 A - A gp
ed F2 == h\ A
variabile y. Sia

h2 A hq, dove le g e le h sono clausole. Introduciamo una nuova

F = (y + g] ) A (y 4- g2) A (y + gv) A (y + Zi1) (y + /2) A A (y + hq)


Dobbiamo dimostrare che un assegnamento di valori di verit T per
solo se T si pu estendere a un assegnamento S che soddisfa F .

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

Un problema di soddisfacibilit vincolato 469


Dobbiamo ancora determinare il valore della costante c che consente di provare T(n) <
cn2. Le clausole di base per T (I) e per T(2) corrispondono ai casi in cui E consiste in
uno o due simboli, cio in un un letterale. Non si ha quindi ricorsione. e la procedura
richiede tempo pari a e. La clausola ricorsiva sfrutta I fatto che E composta da E\ ed
E 2, legate dalloperatore o da V, e lunghe rispettivamente e n 1. Nel complesso
la conversione di E in F comporla due passi: scomporre E in E i ed 2 , c trasformare
Ei ed E 2 in F. Sappiamo che ognuno di questi richiede al massimo un tempo dn, pi le
trasformazioni ricorsive di Ei in F\c di E2 in E2.
Dobbiamo dimostrare per induzione su n lesistenza di una costante c tale che, per
ogni ri, T(ri) < cri2.
BASE

Per n = 1 scegliamo c maggiore o uguale a e.

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

T (i ) + T(n i 1) < n2 2i(n i) 2(n - i) + I

(10.1)

Poich n > 3 e 0 < t < n - 1, 2i(n - i) maggiore o uguale a n, e 2(n i)


maggiore o uguale a 2. Quindi il membro destro di (10.1) minore di ri2 n per ogni
valore ammissibile di i. La parte ricorsiva della definizione di T(n) afferma allora che
T(n ) < dn + cri2 cn. Scegliendo c > d deduciamo che T(n) < a i2 vera per n, e
questo completa l induzione. Perci la costruzione di E da E richiede tempo 0 (n 2).
Esempio 10.14 Applichiamo la costruzione del Teorema 10.13 a un'espressione sempli
ce: E = xy + x(y + z). Lalbero sintattico dell'espressione illustrato nella Figura 10.7.
Presso ogni nodo riportata lespressione in CNF associata a quella rappresentata dal
nodo.
Le foglie corrispondono ai letterali; per ogni letterale lespressione in CNF una clau
sola formata dal letterale stesso. Per esempio lespressione in CNF associata alla foglia
contrassegnata da y (y). Le parentesi sono superflue; le manteniamo nelle espressioni
in CNF per ricordare che trattiamo con prodotti di clausole.
Per un nodo AND la costruzione dell'espressione in CNF consiste nel formare il pro
dotto (AND) di tutte le clausole delle due sottoespressioni. Quindi, per esempio, le
spressione in CNF associata al nodo della sottoespressione x(y + z) il prodotto di una
clausola per x, cio (z), e delle due clausole per y -I-2 , cio (v -I-?/)( + 2 ).3
Per un nodo OR dobbiamo introdurre una nuova variabile. La aggiungiamo a tutte le
clausole delloperando sinistro, e ne aggiungiamo la negazione alle clausole delloperando destro. Consideriamo per esempio il nodo radice nella Figura 10.7. Esso l'OR delle
In questo caso particolare, in cui la sottoespressione y + z c di per s una clausola, non necessario
compiere Ia costruzione generale per lO R di espressioni, e avremmo potuto scegliere (y + z) come prodotto di
clausole equivalente a y + z. In questo esempio ci atteniamo alla regola generale.

470

Capitolo IO
(u

+ X

)(u + V )(u + X )(u + V + y ) (m + v + z )

(y +> )(v +z )

(v )

(z )

Figura 10.7 Trasformazione in CNF di unespressione booleana.

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

F = (u + .r)( -r y)( + )( + V + y)(u + v + z)


Secondo il Teorema 10.13 ogni assegnamento di valori di verit T che soddisfa E si
pu estendere a un assegnamento S che soddisfa F. Per esempio lassegnamento T(x) =
0, T(y) = I e T(z) = 1 soddisfa E. Possiamo estendere T a S aggiungendo S(u) = 1
e S(v) = Oa S(x) = 0, S(y) = I e S(z) = 1 derivate da T. Si pu verificare che S
soddisfa F.
Osserviamo che nella scelta di S abbiamo dovuto porre S(u) = 1perch T rende vera
solo la seconda parte di E, cio x(y + z). Il prodotto di clausole (u + x)(u + y), derivato
dalla prima parte di E , diventa vero se S(u ) = 1. Possiamo invece scegliere qualsiasi
valore per v, dal momento che entrambi i membri di OR in y + z sono veri rispetto a T.

10.3.4 NP-completezza di 3SAT


Definiamo ora una classe ancora pi ristretta di espressioni booleane, per la quale il
problema della soddisfacibilit NP-completo. Ripetiamo lenunciato di 3SAT.

Un problema di soddisfacibilit vincolato 471


Data unespressione booleana E in forma di prodotto di clausole, ognuna delle
quali sia la somma di tre letterali distinii, E soddisfacibile?
Pur essendo solo una piccola parte delle espressioni in CNF, quelle in 3-CNF sono abba
stanza complesse da rendere NP-completa la verifica di soddisfacibilit, come dimostra il
prossimo teorema.
Teorema 10.15 3SAT NP-completo.
DiMOSTRiVZIONE 3SAT c in H V perch SAT in H V . Per dimostrare che NP-completo,
riduciamo CSAT a 3SAT. Data un'espressione in CNF E = e\ A 2 A A c,y., for
miamo una nuova espressione F sostituendo ogni clausola e nel modo chc descrivere
mo. 11 tempo necessario per costruire F lineare nella lunghezza di E, e vedremo che
un assegnamento di valori di verit soddisfa E se e solo se possiamo estenderlo a un
assegnamento che soddisfa F.
1. Se et un letterale4, poniamo x, introduciamo due nuove variabili u e v. Sostituia
mo (#) con lequattro clausole (x+w+tj)(x+iti+v)(a;-|-tt+i?)(a: + u+i7). Poich
u e V compaiono in tutte le combinazioni, c un solo modo di soddisfare tutte le
clausole: rendere vera x. Di conseguenza lutti gli assegnamenti che soddisfano E,
e solo quelli, si possono estendere ad assegnamenti che soddisfano F.
2. Sia ti la somma di due letterali: (x -I- y). Introduciamo la nuova variabile z e
sostituiamo c con il prodotto di due clausole (:r + y + z)(x + 3/ + 2 ). Come nel
caso I, il solo modo per soddisfarle soddisfare (x -I-y).
3. Se la somma di tre letterali,
lasciarla in F cos com.

c gi nella forma richiesta per 3-CNF e possiamo

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

Un assegnamento T che soddisfa E deve rendere vero almeno un letterale di e, ; sia


x.j quel letterale (Xj pu essere una variabile semplice o negata). Se dichiariamo
j/, y 2, . . . , (jj -2 vere e ijj-y , yj+\ , . . . , Vm- 3 false, tutte le clausole di (10.2) risul
tano vere. Perci T pu essere estesa in modo da soddisfarle. Viceversa, se in T
tutte le X sono false, non possibile estendere T rendendo (10.2) vera. Infatti ci
sono m 2 clausole, e ognuna delle m 3 variabili y, che sia vera o falsa, pu
rendere vera una sola clausola.
4Per comodit tratteremo i letterali comc variabili non negate, per esempio x, ma le costruzioni si applicano
anche se alcuni o tutti i letterali sono negati, come x.

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 Altri problemi NP-completi


Descriviamo ora schematicamente il processo per cui un problema NP-completo permet
te di dimostrare che altri problemi sono NP-completi. Questo modo di scoprire nuovi
problemi NP-completi ha due effetti importanti.

Altri problemi NP-completi 473


Scoprire che un problema NP-completo indica che ci sono poche chance di trovare
un algoritmo efficiente per risolverlo. Siamo invece incoraggiati a cercare per via
euristica soluzioni parziali, approssimazioni o altri modi per aggirare il problema.
Possiamo procedere cos senza temere che la soluzione giusta ci sia sfuggita.
Ogni nuovo problema NP-completo P che si aggiunge allelenco avvalora la tesi
che tutti i problemi NP-completi richiedono un tempo esponenziale. La fatica spesa
nella ricerca di un algoritmo polinomiale per P in realt rivolta inconsciamente a
dimostrare che V = AV. Proprio il peso crescente dei tentativi falliti da parte di
tanti abili scienziati e matematici per dimostrare qualcosa di equivalente a V = AiV
ci convince che questa uguaglianza poco plausibile, e che invece ogni problema
NP-completo richiede tempo esponenziale.
Tn questo paragrafo incontreremo diversi problemi NP-completi relativi ai grafi, spesso
presenti nella soluzione di questioni di rilevanza pratica. Tratteremo del problema del
commesso viaggiatore (TSP. Traveling Salesman Problem) chc abbiamo gi incontrato
nel Paragrafo 10.1.4. Dimostreremo che una sua versione pi semplice, ma altrettanto
importante, detta problema del circuito hamiltoniano (HG), NP-completa; questo dimo
stra anche che il pi generale TSP NP-completo. Presentiamo alcuni altri problemi di
copertura di grafi, come il problema della copertura per nodi, in cui si cerca il pi
piccolo insieme di nodi chc copre tutti i lati, che comprende cio almeno un estremo di
ogni lato.

10.4.1

Descrivere problemi NP-completi

Nel presentare nuovi problemi NP-completi adottiamo il seguente schema di definizione.


1. Il nome del problema, di solito accompagnato da unabbreviazione come 3SAT o
TSP.
2. L'input del problema: che cosa si rappresenta, c come.
3. L'output richiesto: in quali circostanze l output d ev essere s ?
4. Il problema da cui si compie la riduzione per dimostrare lNP-completezza.
Esempio 10.16 Ecco come descriviamo il problema 3SAT e la dimostrazione di NPcompletezza.
PROBLEMA: soddisfacibilit di espressioni in 3-CNF (3SAT).
INPUT: u n espressione booleana in 3-CNF.
OUTPUT: s se e solo se l espressione soddisfacibile.
R ID U Z IO N E DA:

CSAT.

474

Capitolo 10

10.4.2

II problema degli insiemi indipendenti

Sia G un grafo non orientato. Un sottoinsieme I di nodi di G si dice un insieme indipen


dente se nessuna coppia di nodi di I collcgata da un lato di G. Un insieme indipendente
massimale se ha almeno tanti nodi quanti ogni altro insieme indipendente.
Esempio 10.17 Nel grafo della Figura 10.1 (v. Paragrafo 10.1.2) {1.4} cun insieme indipendente massimale. Si tratta dellunico insieme indipendente di cardinalit due, perch
ogni altra coppia di nodi unita da un lato. Perci nessun insieme di tre o pi elementi
indipendente; per esempio {1.2,4} non indipendente perch c un lato fra I e 2. Quin
di {1 , 1} un insieme indipendente massimale. in effetti lunico insieme indipendente
massimale del grafo in esame; in generale un grafo pu averne pi di uno. Ancora un
esempio per lo stesso grafo: { 1} un insieme indipendente, ma non massimale.
Nel campo dellottimizzazione combinatoria il problema dell'insieme indipendente
massimale spesso enunciato in questo modo: dato un grafo, trovare un insieme indipendente massimale. Noi invece, come d'abitudine nella teoria dei problemi intrattabi
li, vogliamo enunciarlo in termini s/no. Dobbiamo perci incorporare nell'enunciato
un limite inferiore ed esprimere il problema in questi termini: esiste nel grafo assegna
to un insieme indipendente di dimensione pari almeno al limite dato? Ecco dunque la
definizione formale del problema.
PR O B L E M A :

insieme indipendente (IS, Independent Set).

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.

Come anticipato, dimostriamo chc IS NP-completo per riduzione polinomiale da 3SAT.


Teorema 10.18 II problema dellinsieme indipendente NP-completo.
V

d im o s t r a z io n e

E facile vedere che IS in V: dato un grafo G e un intero k, scegliam o

k nodi arbitrari e verifichiam o se sono indipendenti.


Spieghiamo ora come ridurre 3SAT a IS. Sia E = (^i)(62 ) * (c-m) unespressione in
3-CNE A partire da E costruiamo un grafo G con 3m nodi, ai quali diamo i nomi [i,j],
con 1 < i < m e j = 1, 2 o 3. Il nodo [i,j] rappresenta il j-esimo letterale della clausola
La Figura 10.8 presenta il grafo G derivato dallespressione in 3-CNF
( X 1 + X 2 + ){\ + 2 + ^ 4 ) ( ^ 2 +

+ 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.

Altri problemi NP-completi 475

Figura 10.8 Costruzione di un insieme indipendente da unespressione booleana


soddisfacibile. in 3-CNF.

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

Sulla facilit dei problemi s/no


Potremmo sospettare che la versione s/no di un problema sia pi facile di quella
di ottimizzazione. Per esempio, pu essere difficile trovare un insieme indipen
dente di dimensione massima, mentre verificare che ci sia un insieme indipenden
te di dimensione k, per un valore piccolo di k, potrebbe essere semplice. Questo
vero, ma la costante k potrebbe essere proprio la dimensione massima di un
insieme indipendente. In tal caso risolvere la versione s/no equivale a trovare un
insieme indipendente massimale.
In effetti, per tutti i comuni problemi NP-completi, la versione s/no e quel
la di ottimizzazione sono equivalenti per complessit, a meno di un polinomio.
In un caso tipico, come IS, se avessimo un algoritmo polinomiale in tempo per
trovare gli insiemi indipendenti massimali, saremmo in grado di risolvere il pro
blema s/no trovando un insieme massimale e osservando se la sua dimensione
almeno k. Poich' dimostriamo che la versione s/no NP-complcta. anche laltra
devessere intrattabile.
Possiamo fare il confronto anche nell'altro senso. Supponiamo che ci sia
un algoritmo polinomiale in tempo per la versione s/no di IS. Se il grafo ha
nodi, la dimensione dellinsieme indipendente massimale compresa fra 1 ed n.
Risolvendo IS per tutti i valori fra 1 ed n siamo certi di trovare la dimensione di
un insieme indipendente massimale (anche se non linsieme stesso) in un tempo
pari a n volte quello necessario per risolvere il problema una volta. Riconendo
alla ricerca binaria possiamo addirittura ridurre a Iog2 ri il fattore moltiplicativo.

un insieme indipendente di dimensione m, esso deve contenere esattamente un nodo per


ogni clausola.
Inoltre un insieme indipendente non pu contenere nodi corrispondenti a una variabile
X e alla sua negala x. C infatti un lato fra tutte le coppic di quei nodi. Pertanto un
insieme indipendente I di dimensione m genera un assegnamento di valori di verit T
che soddisfa E. Se il nodo corrispondente alla variabile x in I, definiamo T(x) = 1; se
il nodo associato a x in /, definiamo T(x) = 0. Se nessun nodo in Tcorrisponde a x o
a x, definiamo arbitrariamente T(x). Il punto (2) discusso sopra spiega perch non si pu
generare una contraddizione, cio la compresenza in I dei nodi associati a, rea x.
Sosteniamo che T soddisfa E. Infatti, per ogni clausola di E , 1 contiene un nodo
corrispondente a uno dei suoi letterali, e T assegna il valore vero a quel letterale. Perci,
se esiste un insieme indipendente di dimensione m, E soddisfacibile.

Altri problemi NP-completi 477


(Solo se) Supponiamo che esista un assegnamento T chc soddisfa E. Poich T rende vera
ogni clausola di E, per ognuna di esse c almeno un letterale vero rispetto a T. Se ci
vale per due o tre letterali in una clausola, ne scegliamo uno in modo arbitrario. Formiamo
un insieme I di rn nodi scegliendo per ogni clausola il nodo abbinato al letterale prescelto.
Affermiamo chc / un insieme indipendente. Se un lato unisce due nodi derivati dalla
stessa clausola (le colonne nella Figura 10.8), quei nodi non possono trovarsi entrambi in
I perch abbiamo scelto un solo nodo per clausola. Se un lato unisce una variabile c Ia sua
negata, i suoi estremi non possono trovarsi entrambi in Tperch abbiamo scelto solo nodi
corrispondenti a letterali veri rispetto a T. T pu assegnare il valore vero a i o a x, ma
non a entrambi. Concludiamo che sc E soddisfacibile, G ha un insieme indipendente di
dimensione m.
C quindi una riduzione polinomiale di 3SAT a IS. Per il Teorema 10.5, IS NPcomplcto dato chc lo stesso vale per 3SAT.
Esempio 10.19 Applichiamo la costruzione del Teorema 10.18 al caso in cui

E = [X1 + Z2 + 3)(2T + xI + ^ 4 )(^ 2 + x-s + 5 )(^ 3 + +


II grafo ricavato da questa espressione illustrato nella Figura 10.8.1nodi sono disposti in
quattro colonne corrispondenti alle quattro clausole. Per ogni nodo sono riportati il nome
(una coppia di interi) c il letterale associato. Ogni coppia di nodi nella stessa colonna,
corrispondenti a letterali in una clausola, unita da un lato. Anche i nodi corrispondenti
a una variabile e alla sua negata sono uniti da un lato. Per esempio il nodo [3,1], che
corrisponde a X2 , unito da lati ai nodi [1 , 2 ] c [2 , 2 ], corrispondenti a occorrenze di X2Un tratto pi spesso indica i nodi, uno per colonna, che formano un insieme I.
chiaro che essi formano un insieme indipendente. I quattro letterali in I sono ari, x?, x
e X4 . Possiamo definire un assegnamento di valori di verit T: T(Xi ) = I, T(x2 ) = 1,
T(x) = * &T(x4 ) = 0 . Dobbiamo assegnare un valore anche a X5 , e possiamo sceglierlo
arbitrariamente, per esempio T(Xrj ) = 0. Cos T soddisfa E , e linsieme di nodi / indica
un letterale per ogni clausola, al quale T assegna il valore vero.

10.4.3 II problema della copertura per nodi


Unaltra classe rilevante di problemi di ottimizzazione combinatoria riguarda la coper
tura di un grafo. Per esempio una copertura per lati un insieme di lati tali che ogni
nodo lestremo di almeno un lato dellinsieme. Una copertura per lati minimale se
ogni altra copertura dello stesso grafo ha un numero di lati uguale o maggiore. Stabilire
se un grafo ha una copertura per lati di k elementi richiede tempo polinomiale, ma non lo
dimostreremo.
Proveremo invece che il problema della copertura per nodi NP-completo. Una
copertura per nodi di un grafo un insieme di nodi che contiene almeno un estremo di

478

Capitolo O

Utilit degli insiemi indipendenti


Le applicazioni dei problemi NP-completi che presentiamo esulano dalla materia
di questo libro. La scelta dei problemi trattati nel Paragrafo 10.4 si deve a un
fondamentale lavoro di R. Karp sullNP-completezza, nel quale l'autore esamina
i problemi pi importanti nel campo della ricerca operativa e dimostra che molti
sono NP-completi. Di qui la chiara indicazione che certi problemi reali possono
essere risolti mediante quelli astratti che abbiamo presentato.
Possiamo per esempio impiegare un algoritmo per la ricerca di insiemi indipendenti allo scopo di programmare una sessione di esami. A ogni corso associa
mo un nodo del grafo; uniamo due nodi con un lato se uno o pi studenti seguono
i due corsi corrispondenti. Gli esami per quei due corsi non possono aver luogo
contemporaneamente. Se troviamo un insieme indipendente massimale, possia
mo convocare gli esami dei corsi corrispondenti nella stessa data, senza causare
problemi a nessuno studente.

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:

il problema della copertura per nodi (NC, Node Cover).

un grafo G e un limite superiore k, compreso fra 0 e il numero di nodi di G meno

uno.
output

: s

r id u z io n e

se e solo se G ha una copertura per nodi con non pi di k nodi.

DA:

insieme indipendente.

Teorema 10.20 11 problema della copertura per nodi NP-completo.


NC chiaramente in N V . Scegliamo un insieme di k nodi e verifichia
mo che contenga almeno un estremo di ogni lato di G.
Per completare la dimostrazione, riduciamo IS a NC. Ci basiamo sul fatto, illustrato
dalla Figura 10.8. che il complemento di un insieme indipendente una copertura per
nodi. Per esempio linsieme dei nodi di tratto pi sottile nella figura una copertura per
nodi. Poich i nodi con tratto spesso formano un insieme indipendente massimale, gli
altri formano una copertura minimale.
d im o s t r a z io n e

Altri problemi NP-completi 479


Siano G e k gli elementi di un'istanza del problema dell'insieme indipendente. Se G
ha n nodi, siano G e Ti k gli clementi dell'istanza di NC che vogliamo costruire. La
trasformazione si pu evidentemente compiere in tempo lineare. Sosteniamo che
G ha un insieme indipendente di dimensione k se e solo se G ha una copertura per
nodi di dimensione n k.
(Se) Sia N linsieme dei nodi di G, e G la copertura per nodi di dimensione n k.
Affermiamo che N C un insieme indipendente. Supponiamo il contrario, cio che
ci siano due nodi v e w in N C uniti da un lato di G. Poich' n v n w sono in C, il
lato (v, w) di G non coperto da C. Abbiamo quindi dimostrato per assurdo che N G
un insieme indipendente. Questo insieme ha chiaramente k nodi, e questa parte della
dimostrazione conclusa.
(Solo se) Sia 1 un insieme indipendente di k nodi. Affermiamo che N - I una copertura
per nodi con n k nodi. Ragioniamo per assurdo. Se un lato (?;, 7x?) non coperto da
N I, sia V sia w sono in J; ma essi sono uniti da un lato, il che contraddice la definizione
di insieme indipendente.

10.4.4 II problema del circuito hamiltoniano orientato


Vogliamo dimostrare che il problema del commesso viaggiatore (TSP) NP-completo
perch si tratta di un problema molto rilevante nellambito dellottimizzazione combina
toria. La migliore dimostrazione nota della sua NP-completezza in realt la prova che
un problema pi semplice, il problema del circuito hamiltoniano (HC)\ NP-completo.
PROBLEM A:

problema del circuito hamiltoniano (HC).

INPUT: un grafo non orientato G.


OUTPUT: s se e solo se G ha un circuito hamiltoniano, cio un ciclo c h e p a ssa p e r ogni
nodo di G e sa tta m e n te una volta.

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.

Teorema 10.21 II problema del circuito hamiltoniano orientato NP-completo.

DIMOSTRAZIONE facile provare chc D H C in ,: si sceglie un ciclo potenziale e si ve


rifica che tutti i suoi archi siano presenti nel grafo. Per ridurre 3SAT a D H C dobbiamo co
struire un grafo complicato, con blocchi, cio sottografi specializzati, che rappresentano
le variabili e le clausole dellistanza di 3SAT.
Per avviare la costruzione di unistanza di D H C a partire da unespressione booleana
in 3-CNF, poniamo E = e.\ A e2 Cf, dove ogni clausola Ci la somma di tre
letterali: e = (* I- 2 + 3 ). Siano . 2, , xn le variabili di . Per ogni clausola
e per ogni variabile costruiamo un blocco, secondo la Figura 10.9.
Per ogni variabile
definiamo il sottografo H illustrato nella Figura 10.9(a). Il
numero rm il pi grande fra il numero di occorrenze di X i c quello di x in E . Fra le due
colonne di nodi, denotate da b e c, poniamo archi, in entrambe le direzioni, fra bj e c.xj.
Da ogni nodo b esce poi un arco verso il nodo c. al livello sottostante. Da bij c quindi
un arco verso Ci,j+ se j < mi. Simmetricamente un arco va da Cij a
1, per j < m.
Infine ci sono un nodo sommitale a, con archi verso i nodi ,o c c0, e un nodo di fondo
di al quale giungono due archi, da Iyitni c da Cimr
La struttura dellintero grafo delineata nella Figura 10.9(b). Ogni esagono rappre
senta un blocco relativo a una variabile, strutturato come la Figura 10.9(a). I blocchi sono
legati in forma di ciclo mediante archi dal nodo di fondo di un blocco al nodo sommitale
del successivo.
Supponiamo che questo grafo abbia un circuito hamiltoniano orientato e che il circuito
parta da . Se il nodo successivo , esso devessere seguito da , altrimenti Cm non
potrebbe far parte del circuito. Infatti, se il ciclo andasse da a 610 a Cu, non potrebbe
pi raggiungere Cm, avendo gi usato i suoi due predecessori.
Se il ciclo comincia con A1 e b0, deve scendere la scala alternando i due iati:
i.

co, bu, C u , . . . , b1mi

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

Altri problemi NP-completi

481

(c)
Figura 10.9 Elementi per la dimostrazione che il problema del circuito hamiltoniano

NP-completo.

482

Capitolo I O

grafo in esame, e il secondo ordine, da un b al c sottostante, come assegnazione del valore


falso.
Dopo aver attraversato H i, il ciclo procede in 2 , dove si deve scegliere fra 620 c ^20
Come abbiamo spiegato per H u compiuta questa prima scelta, il resto del cammino in
2 obbligato. In generale, allingresso in H possiamo scegliere se andare a sinistra o
a destra. In seguito non abbiamo scelta, se vogliamo evitare di rendere inaccessibile un
nodo (cio irraggiungibile nel circuito hamiltoniano orientato), perch i suoi predecessori
nel grafo sono gi stati usati.
Nel seguito conviene considerare la scelta di andare da a* a b0 come lassegnamento
di vero a
e quella di andare da at a co come lassegnarle il valore falso. Perci il
grafo della Figura 10.9(b) ha esattamente 2n circuiti hamiltoniani orientati, corrispondenti
ai 2 " assegnamenti di valori di verit alle n variabili.
La Figura 10.9(b) per solo lo scheletro del grafo abbinato allespressione in 3-CNF
E . Pcrogni clausola ej introduciamo il sottografo Ij riprodotto nella Figura 10.9(c). Se
un ciclo entra in Ij da Tj, deve uscirne da uj; se entra da Sj, deve uscire da Vji se entra da
Lj, deve uscire da u'j. Per provarlo osserviamo chc se il ciclo, raggiunto Ij, non esce dal
nodo sottostante quello di entrata, uno o pi nodi risultano inaccessibili e non possono far
parte del ciclo. Sfruttando la simmetria possiamo trattare solo il caso in cui Tj il primo
nodo di Ij nel ciclo. Distinguiamo tre situazioni.
1. I due vertici successivi nel ciclo sono sj e tj. Se il ciclo va a Wj ed esce, Vj risulta
inaccessibile. Se attraversa Wj e Vj ed esce, Uj risulta inaccessibile. Perci deve
uscire da Uj dopo aver attraversato tutti i sei nodi del blocco.
2. I vertici che seguono Vj sono Sj e Vj. Se il ciclo non prosegue da u-j, questo ri
sulta inaccessibile. Se dopo Uj il ciclo passa a Wj, non pu pi passare da tj. Il
ragionamento inverte quello fondato sullinaccessibilit. Il nodo tj pu essere
raggiunto dallesterno, ma se il ciclo include tj pi avanti, non potr proseguire
perch i due successori di tj sono gi apparsi nel ciclo. Anche in questo caso,
quindi, il ciclo esce da Uj. Osserviamo che Lj e Wj non sono stati attraversati, e
dovranno comparire pi avanti nel ciclo.
3. 11 circuito va direttamente da Tj a u. Se il ciclo prosegue con Wj, tj non pu
comparire nel ciclo perch i suoi successori sono gi stali usati, come spiegato al
punto (2). In questo caso, quindi, il ciclo deve uscire direttamente da Uj; restano
quattro nodi da aggiungere al ciclo pi tardi.
Per completare la costruzione del grafo G da unespressione E , dobbiamo collegarc gli
Lj agli H i. Sia X1, variabile non negata, il primo letterale della clausola Cj. Scegliamo un
nodo Cip, con p compreso fra 0 e
- 1, non ancora usato per allacciarsi a uno dei blocchi
1. Aggiungiamo gli archi da cip a Tj e da Uj a bip+y. Se il primo letterale della clausola

Altri problemi NP-completi

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

Se ignoriamo le deviazioni negli Tj il circuito hamiltoniano devessere uno dei 2n cicli


possibili usando solo gli H , quelli ricavati dalla scelta di passare da ogni a a ^ o a co
Ogni scelta corrisponde a un assegnamento di valori di verit alle variabili di E . Se una
di queste scelte produce un circuito hamiltoniano che comprende gli Ij. lassegnamento
corrispondente soddisfa E.
Infatti, se il ciclo va da a a bto, possiamo deviare verso Ij solo se nella j-esima
clausola x, compare come letterale. Se il ciclo va da a, a C1Q, possiamo deviare verso
Ij solo se x compare nella j-esima clausola come letterale. Perci, se tutti i blocchi Ij
possono essere inclusi, allora lassegnamento rende vero almeno uno dei tre letterali di
ogni clausola, ed E soddisfacibile.

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

Circuiti hamiltoniani non orientati e TSP

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.

AIlri problem i N P -com pleti

Figura 10.10 Esempio di costruzione di circuito hamiltoniano

485

486

Capitolo 10

PROBLEMA: problem a del circuito ham iltoniano non orientato.


INPUT: un grafo non orientato G.
OUTPUT: s se e solo se G ha un circuito hamiltoniano.
RIDUZIONE DA: DHC.

Teorema 10.23 H C NP-completo.


DIMOSTRAZIONE Ridurremo D H C ad HC. Sia Gd un grafo orientato. Denotiamo con Gu
il grafo non orientato che dobbiamo costruire. Per ogni nodo v di Gd poniamo in G v i tre
nodi v()f t>W e
I lati di G u sono i seguenti.
1. Per ogni nodo v di Gd poniamo in G u i lati (t^. t/1)) e (/1). tA2^).
2. Se in Gd c un arco v w, poniamo in G u il lato

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 .

evidente che la costruzione di G u da Gd pu compiersi in tempo polinomiale. Dobbia


mo dimostrare che
G u ha un circuito hamiltoniano se e solo se Gd ha un circuito hamiltoniano orien
tato.

Altri problemi NP-completi

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

un circuito hamiltoniano non orientato di G u, ottenuto percorrendo verso il basso ogni


colonna c saltando alla sommit della successiva seguendo un arco di Gd.
(Solo se) Ossen iamo che ogni nodo t>(1) di Gu ha due soli lati adiacenti. In un circuito
hamiltoniano esso deve quindi avere
o
come predecessore immediato c laltro
come successore immediato. Perci gli apici dei nodi in un circuito hamiltoniano di Gn
devono seguire lo schema 0 ,1 ,2 ,0 ,1 ,2 ,... o il suo opposto 2 ,1 , 0 ,2 ,1 ,0 ,... Poich i
due schemi corrispondono ad attraversare il ciclo nelle due direzioni, possiamo supporre
che lo schema sia 0 ,1 ,2 ,0 ,1,2 ,... I lati del ciclo che uniscono un nodo con apice 2 a
uno con apice 0 corrispondono ad archi di Gd e vengono percorsi nella direzione del
larco. Quindi da un circuito hamiltoniano non orientato di Gu ricaviamo un circuito
hamiltoniano orientato di G,..
PROBLEMA: p roblem a del co m m esso viaggiatore.
INPUT: un grafo non orientato G con pesi interi sui lati, e un limite k.
OUTPUT: s se e solo se in G c un circuito h am ilto n ian o tale ch c la so m m a dei pesi
dei lati che lo co m pongono m in o re o uguale a k.
RIDUZIONE DA:

HG.

Teorema 10.24 II problema del commesso viaggiatore NP-completo.


DIMOSTRAZIONE Procediamo per riduzione da HC. Dato un grafo G , costruiamo un grafo
pesato G" con gli stessi nodi e lati di G, ma con il peso 1 su tutti i lati. Il limite k uguale
al numero n di nodi di G. In G' c un circuito hamiltoniano di peso n se e solo se in G
c un circuito hamiltoniano.

10.4.6

Riepilogo dei problemi NP-completi

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

Figura 10.12 Riduzioni fra problemi NP-completi.

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.

Altri problemi NP-completi

489

*! Esercizio 10.4.2 Un problema di colorazione cos definito: dati un grafo G e un intero

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.

Figura 10.14 Un grafo.


Esercizio 10.4.3 Non occorre un grafo enorme per rendere molto difficile risolvere a
mano questioni NP-complete. Considerate il grafo della Figura 10.14.
* a)

Il grafo contiene un circuito hamiltoniano?

b) Qual linsieme indipendente pi grande?


c) Qual la pi piccola copertura per nodi?
d) Qual la pi piccola copertura per lati (vedi Paragrafo 10.4.3)?

Altri problemi NP-completi

491

e) Si pu colorare il grafo con due colori?

Esercizio 10.4.4 Dimostrate che i seguenti problemi sono NP-completi.


a) Il problema dellisomorfismo di grafi: dati i grafi Gi e G 2, G i contiene una copia
di G 2 come sottografo? Possiamo cio trovare un sottoinsieme dei nodi di Gi che,
insieme con i lati che li uniscono in G, forma una copia esatta di G 2, a patto
di scegliere unopportuna corrispondenza fra i nodi di G 2 e quelli del sottografo
di G? Suggerimento: cercate una riduzione dal problema della clique descritto
nellEsercizio 10.4.1.
! b) Il problema feedback edge: dati un grafo G e un intero k, esiste un insieme di k lati
di G tale che ogni ciclo di G contenga almeno uno di essi?
! c) Il problema della programmazione lineare intera: dato un insieme di vincoli lineari
della forma = - c =- aixi ^ove S*' ai e c sono costanti intere,
c .Ti, :r2, ... ,x n sono variabili, esiste un assegnamento di valori interi alle variabili
che verifica tulli i vincoli?
! d) Il problema dellinsieme dominante: dati un grafo G e un intero k, esiste un sotloinsicmc S di k nodi di G tale che ogni nodo o in S o adiacente a un nodo in
SI
e) Il problema degli idranti: dati un grafo G, una distanza o e un numero / di idranti,
possiamo scegliere / nodi di G in modo che nessun nodo sia distante pi di d da un
idrante (la distanza il numero di lati da percorrere)?
*! f) Il problema della semi-clique: dato un grafo G con un numero pari di vertici, esiste
una clique (vedi Esercizio 10.4.1) formata da met dei nodi di G? Suggerimento:
riducete CLIQU E a questo problema. Dovete scoprire come aggiungere nodi in
modo da regolare la dimensione della clique pi grande.
!! g) Il problema della pianificazione a tempi unitari: dati k, compiti
Ti, T2,. . . , T k
un numero p di processori, un limite di tempo t, e dei vincoli di precedenza
della forma Ti < Tj tra coppie di compiti, stabilite se esiste una pianificazione dei
compiti tale che:
1. a ogni compito assegnato un istante compreso fra 1 e t
2.

lo stesso istante assegnato al massimo a p compiti

3. i vincoli di precedenza sono rispettati, cio a T si assegna un istante che


precede quello assegnato a T y se Ti < T i.

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.

Esercizio 10.4.5 Un cammino hamiltoniano in un grafo G c una permutazione ??i, n o , . . . ,


nk di tutti i nodi tale che. per ogni i 1 ,2 ,... ,k 1, esiste un lato da Ui a ni+1. Un
cammino hamiltoniano orientato lo stesso per grafi orientati: dcvesserci un arco da n,
a ni+ i. Osserviamo che questa definizione solo leggermente pi debole di quella di cir
cuito hamiltoniano. Sc si richiedesse anche lesistenza di un lato o arco da n k a rii, Ic due
definizioni coinciderebbero. Il problema del cammino hamiltoniano (orientato) chiede se
un grafo (orientato) possiede almeno un cammino hamiltoniano (orientato).
* a) Dimostrate che il problema del cammino hamiltoniano orientato NP-completo.
Suggerimento: fate una riduzione da DHC. Scegliete un nodo e sdoppiatelo in modo
che i due nodi risultanti siano gli estremi di un cammino hamiltoniano orientato e
che quel cammino esista se e solo se il grafo originale ha un circuito hamiltoniano
orientato.
b) Dimostrate chc il problema del cammino hamiltoniano non orientato NP-completo.
Suggerimento: adattate la costruzione del Teorema 10.23.
*! c) Dimostrate che questo problema NP-completo: dati un grafo G e un intero k, G
possiede un albero di copertura con al massimo k foglie? Suggerimento: fate una
riduzione dal problema del cammino hamiltoniano.
! d) Dimostrate che questo problema NP-completo: dati un grafo G e un intero d, G
possiede un albero di copertura senza nodi di grado maggiore di d (il grado di un
nodo n nellalbero di copertura il numero di lati dell'albero chc hanno n a un
estremo)?

10.5

Riepilogo

Le classi V ed N V : V formata da tutti i linguaggi o problemi accettati da una


macchina di Turing in tempo polinomiale rispetto alla lunghezza dell'input. N rV

BibIiografiu

493

la classe di linguaggi o problemi accettati da T M non deterministiche con un limile


polinomiale sul tempo impiegato in una sequenza di scelte non deterministiche.
La questione V = N 'P : non c noto sc V ed A rV siano la stessa classe di linguaggi
oppure no, ma lopinione pi diffusa che esistano linguaggi in N V che non sono
in V .
Riduzioni polinomiali, se possibile trasformare in tempo polinomiale istanze di
un problema in istanze di un secondo problema chc ha la medesima risposta, s o
no, diciamo che il primo problema e riducibile in tempo polinomiale al secondo.
Problemi NP-completi: un linguaggio NP-completo se in N V ed esiste una
riduzione polinomiale da ogni linguaggio in N V al linguaggio in questione. Siamo
convinti chc nessuno dei problemi NP-completi sia in V . A suffragare questa lesi
si pu addurre il fatto chc non ancora stato trovato un algoritmo polinomiale per
uno qualunque delle migliaia di problemi NP-completi conosciuti.
I problemi NP-completi di soddisfacibilit: il teorema di Cook ha indicalo il primo
problema NP-completo, cio se unespressione booleana sia soddisfacibile, ridu
cendo tulti problemi in N V al problema SAT in tempo polinomiale. Il problema
rimane NP-compleio anche se si vincola l'espressione a consistere in un prodotto
di clausole, ciascuna formata da tre soli letterali. Questo il problema 3SAT.
Altri problemi NP-completi: si conosce una vasta gamma di problemi NP-completi.
Di ciascuno si dimostra -completezza tramite una riduzione polinomiale da
un problema NP-completo gi noto. Abbiamo fatto riduzioni per dimostrare NPcompleti i seguenti problemi: insieme indipendente, copertura per nodi, versio
ni orientata e no del problema del circuito hamiltoniano. problema del commesso
viaggiatore.

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

Altre classi di problemi


La storia dei problemi intrattabili non si esaurisce conArV . Molte altre classi di problemi
sembrano intrattabili o sono interessanti per ragioni diverse. Alcune questioni che le
riguardano, come la questione V = A 'V , rimangono irrisolte.
Cominceremo studiando una classe strettamente collegata a ? e d A rV : la classe dei
complementi dei linguaggi M V , detta co-MV'. Se V = M V , allora CO-ArV uguale a
entrambe perch V chiusa rispetto alla complementazione. Si ritiene invece che co-MV
sia diversa da ambedue e che nessun problema NP-completo sia in CO-ArV .
Considereremo quindi la classe V S . formata da tutti i problemi chc possono essere
risolti da una macchina di Turing impiegando una quantit di nastro polinomiale nella
lunghezza dellinput. Queste T M possono richiedere tempo esponenziale, purch si muo
vano entro un'area limitata del nastro. Diversamente dal caso del tempo polinomiale,
possiamo dimostrare che il non determinismo non aumenta la potenza delle T M quando
ci si limita a uno spazio polinomiale. Ovviamente V S include A rV , ma non sappiamo se
coincide con M V o con V . Ci aspettiamo chc non valga nessuna delle due uguaglianze, e
descriveremo un problema completo per 'PS che sembra non essere in A rV.
Ci occuperemo poi degli algoritmi randomizzati e di due classi di linguaggi che si
collocano tra V ed M V . La prima la classe TZV dei linguaggi polinomiali random,
che hanno un algoritmo in tempo polinomiale basato sul lancio della monetina, os
sia, in pratica, su un generatore di numeri casuali. L'algoritmo conferma lappartenenza
dellinput al linguaggio oppure risponde non so. Se linput nel linguaggio, c una
probabilit maggiore di che lalgoritmo risponda s. Eseguendolo pi volte, possiamo
decidere correttamente lappartenenza con una probabilit tendente a 1.
Anche la seconda classe, detta Z V V (Zero-error Probabilistic Polynomial, polino
miale probabilistico con errore nullo), ricorre alla randomizzazione. Gli algoritmi per i
linguaggi appartenenti a questa classe, per, dicono s, linput nel linguaggio oppu

496

Capitolo 11

re no, non e. 11 tempo di esecuzione previsto polinomiale, ma ci possono essere


esecuzioni che impiegano tempo superiore a qualsiasi limite polinomiale.
Per collegare fra loro questi concetti esaminiamo un problema importante: la verifica
di primalit. Molti sistemi crittografici si basano su due elementi:

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

Complementi dei linguaggi in MV

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

(si veda in propo

sito h t t p : / / w w w . c s e . i i t k . a c . i n / u s e r s / m a n i n d r a / i n d e x . h c m l ). Questo nuovo risultato non


invalida le considerazioni svolte qui e nel Paragrafo 11.5; conferma anzi lipotesi chc il problema non sia
NP-complcto. In particolare non se ne pu dedurre un algoritmo efficiente per fattorizzare numeri primi. [N.d.T. |

Complementi dei linguaggi in ArP

11.1.1

497

La classe d linguaggi CO-ArP

Co-NV linsieme dei linguaggi i cui complementi sono in N V . Abbiamo osservato


all'inizio del Paragrafo 11.1 che il complemento di un linguaggio in V in V , e dunque
in N V . D'altra parte si pensa che nessun problema NP-completo abbia il complemento in
N V , e quindi che nessun problema NP-completo sia in co-.\rV. Analogamente si ritiene
che i complementi dei problemi NP-completi, che per definizione sono in co-N'P, non
siano in N V . lai Figura 11.1 illustra le relazioni presunte fra le classi V , N V e co-NV.
Dobbiamo per considerare che se V dovesse risultare uguale a N V , tutte e tre le classi
coinciderebbero.

Figura 11.1 Le presunte relazioni tra co-N'P e altre classi di linguaggi.

Esempio 11,1 Consideriamo il complemento del linguaggio SAT, chc c senzaltro un


membro di co-N'P e che denoteremo con USAT (da unsatisfiable, non soddisfacibile).
USAT comprende tutte le stringhe chc codificano espressioni booleane non soddisfacibili.
In USAT. per, ci sono anche le stringhe che non codificano espressioni booleane valide
perch nessuna di esse in SAT. Si pensa che USAT non sia in N P , ma non esiste alcuna
dimostrazione in merito.
Un altro esempio di problema che supponiamo essere in co-N'P ma non in N P
TAUT, linsieme di tutte Ie espressioni booleane (codificate) che sono tautologie, cio

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

Problemi NP-completi e co-AV

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.

Teorema 11.2 N V = co- NP se e solo se esiste un problema NP-completo il cui com


plemento in N V .

DIMOSTRAZIONE (Solo se) Se N V e co-NV sono uguali, ogni problema NP-completo


L , trovandosi in N P , anche in co-NV. Dato che il complemento di un problema in
CO-ArP in N V , il complemento di L in N V .
(Se) Sia P un problema NP-completo il cui complemento P in N V . Per ogni linguaggio
L in N V esiste dunque una riduzione polinomiale di L a P. La stessa riduzione anche
una riduzione polinomiale di L a P. Dimostriamo che N V = co-NV provando che
ciascuna contenuta nell'altra.
N V C co-ArP : supponiamo che L sia in A P . Allora L in co-ArP . Combiniamo la
riduzione polinomiale di L a P con il presunto algoritmo polinomiale non deterministico
per P per produrre un algoritmo polinomiale non deterministico per L. Ne consegue che
per ogni L in N V anche L in N V . D altra parte L in co-NV perch il complemento
di un linguaggio in A rP . Abbiamo dunque A rP C co-NV.
co-ArP C A rP : supponiamo che L sia in co-NV. Esiste allora una riduzione polinomiale
di L a P perch P NP-completo ed L in A rP . Essa contemporaneamente anche
una riduzione di L a P. Poich P in A rP. combiniamo la riduzione con lalgoritmo
polinomiale non deterministico per P per dimostrare che L in N P .

Problemi risolvibili in spazio polinomiale

11.1.3

499

Esercizi

Esercizio 11.1.1 Dite se i seguenti problemi sono in N V e in co-N'P, e descrivete il


complemento di ognuno di essi. Se il problema o il suo complemento sono NP-completi,
dimostratelo.
* a) Tl problema TRUE-SAT: data un'espressione booleana E , vera quando tutte le va
riabili hanno valore vero, esiste un altro assegnamento di valori di verit che la
rende vera?
b) 11 problema FALSE-SAT: data unespressione booleana E , falsa quando tutte le sue
variabili hanno valore falso, esiste un altro assegnamento di valori di verit chc la
rende falsa?
c) Il problema DOUBLE-SAT: data unespressione booleana E , esistono almeno due
assegnamenti di valori di verit che la rendono vera?
d) Tl problema NHAR TAUT: data un'espressione booleana E . esiste al massimo un
assegnamento di valori di verit che la rende falsa?
Esercizio 11.1.2 Supponiamo che esista una funzione / , biunivoca sullinsieme degli
interi a n-bit, tale che:
1 . f(x ) pu essere computata in tempo polinomiale
2 . f~ 1 (x) non pu essere computata in tempo polinomiale.

Dimostrate che il linguaggio formato da coppic di interi (x, y) tale che

/(*) < y
sarebbe in

11.2

(N P

co-ArV) V .

Problemi risolvibili in spazio polinomiale

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

Macchine di Tring a spazio polinomiale

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

Figura 11.2 Una T M a spazio polinomiale.

Definiamo V S (Polynomial Space, spazio polinomiale) comc la classe di tutti e soli


i linguaggi accettati da macchine di Turing deterministiche con limite polinomiale sullo
spazio. Definiamo inoltre M V S (Nondeterministic Polynomial Space, spazio polinomiale
non deterministico) come la classe formata dai linguaggi accettati da T M non determini
stiche con limite polinomiale sullo spazio. Evidentemente V S C M V S perche ogni T M
deterministica un caso speciale di T M non deterministica. Dimostreremo il risultato
sorprendente che V S = M V S ?

2Qucsta classe talvolta denominata P S P A C E . Dato che non useremo pi A


lequivalenza

V S A rPS,

noi preferiamo invece la sigla

spazio polinomiale deterministico (o non deterministico).

PS

rV S

dopo aver dimostrato

per denotare la classe di problemi risolti in

Problemi risolvibili in spazio polinomiale

11.2.2

501

Le relazioni di VS ed A'V S con altre classi

Innanzitutto le relazioni V C V S e j\rV C JKrV S dovrebbero essere evidenti. La ragio


ne che se una T M fa solo un numero polinomiale di mosse, allora usa non pi di un
numero polinomiale di celle; in particolare il numero massimo di celle che pu visitare
corrisponde al numero di mosse pi uno. Una volta dimostrato V S = Ar'PS, vedremo che
effettivamente le tre classi formano una catena rispetto al contenimento: V C M V C V S .
Una propriet essenziale delle T M con limite polinomiale sullo spazio che posso
no fare solo un numero esponenziale di mosse prima di dover ripetere una 1D. Questa
propriet ci serve per dimostrare altre propriet interessanti di V S . e per dimostrare che
V S contiene solo linguaggi ricorsivi, cio linguaggi con algoritmi. Osserviamo che nella
definizione di V S rV S non si richiede che la T M si arresti. possibile che la T M
compia cicli perpetui senza lasciare un'area del nastro di dimensione polinomiale.
Teorema 11.3 Se M una T M (deterministica o non deterministica) con limite poli
nomiale sullo spazio, e p(n) il suo limite polinomiale sullo spazio, allora esiste una
costante c tale che, se Al accetta un input w di lunghezza n, lo fa entro c1+p(n) mosse.
DIMOSTRAZIONE II concetto di fondo che Al deve ripetere una ID prima di superare le

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 .

DIM OSTRAZIONE Dimostreremo lenunciato per le T M deterministiche; lo stesso ragio


namento vale per le N T M . Sappiamo che L accettato da una T M Af1 che ha un limite
polinomiale p(n) sullo spazio. Allora, per il Teorema 11.3, se
accetta w lo fa in non
pi di t1+P(M) passi.
Definiamo una nuova T M AZ2 dotata di due nastri. Sul primo nastro AZ2 simula AZ1,
sul secondo conta in base c fino a c1+p0M! ). Se M 2 raggiunge questo numero, si arresta
senza accettare. Perci A i2 usa 1
celle sul secondo nastro. Abbiamo ipotizzato
che M i non impieghi pi di p(|tt;|) celle, per cui anche M 2 non usa pi di p(|u'|) celle sul
primo nastro.
Se convertiamo AZ2 in una T M AZ3 a nastro singolo, possiamo essere certi che AZs non
usa pi di 1 + p(n) celle di nastro, su qualsiasi input di lunghezza . M 3 pu impiegare
il quadrato del tempo di esecuzione di AZ2, ma non pi di O (c 2p01) ) . 3 p at0 che M3 non
compie pi di dc2p(n mosse per una costante d, possiamo scegliere q(n) = 2 p(n) +
Iogc d. AZ3 fa dunque al massimo Cq^ passi. Poich AZ2 si arresta sempre, anche AZ3 fa
lo stesso. Dal momento che M 1 accetta L , lo fanno anche AZ2 ed AZ3. Di conseguenza
AZ3 soddisfa lenunciato del teorema.

11.2.3

Spazio polinomiale deterministico e non deterministico

Se il confronto tra V ed M V sembra difficile, sorprende che lo stesso confronto tra V S ed


N V S sia invece facile: queste due classi di linguaggi infatti coincidono. La dimostrazio
ne consiste nel simulare una T M non deterministica con un limite polinomiale sullo spazio
p(n) mediante una T M deterministica con limite polinomiale sullo spazio 0 ( p 2 (n)).
11 nocciolo della prova consiste nel verificare, in modo ricorsivo e deterministico, se
una N T M N pu passare dalla ID Z alla ID J in non pi di m mosse. Una D T M D tenta
sistematicamente tutte le ID intermedie K per controllare se da Z pu passare a K in m /2
mosse e da A' a J in altre m /2 mosse. Supponiamo cio chc esista una funzione ricorsiva
reach(I. J, m ) che decide se Z r .7 in rn mosse al massimo.

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)

/-2 multinastro possono essere simulate in 0 ^ p ( n ) c p(n ^


affermato prima.

celle. D i conseguenza
passi, che m eno di

mosse della T M
^c2p^n ^ , com e abbiamo

Problemi risolvibili in spazio polinomiale

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;

Figura 11.3 La funzione ricorsiva reach verifica se da una ID si pu passare a unaltra


entro un numero fissato di mosse.
importante osservare chc reach, sebbene chiami se stessa due volte, compie le chia
mate in sequenza, e dunque in ogni istante solo una di esse attiva. Cosi, se parliamo
da uno stack frame [Zi, .J\.rn], a ogni istante c solo una chiamata [I2 ^ h ^ r i 2 ], una
[/3 , J :i,m/4\, una [/4 , J 4 . ra/8 ], e cos via, finch a un certo punto il terzo argomento
diventa I e reach pu applicare il passo di base senza ulteriori chiamate ricorsive, reach
verifica se / = J oppure I h J, restituendo TRUE se almeno una delle due vera e
FALSE in caso contrario. Dato un valore iniziale m del numero di mosse, la Figura 11.4
illustra lo stack della D T M D con tutte le possibili chiamate attive a reach.
Se pu sembrare che siano possibili molte chiamate a reach e che il nastro della Figu
ra 11.4 possa diventare molto lungo, dimostreremo che non potr essere troppo lungo.
Se si parte da un numero di mosse pari a rn, sul nastro ci possono essere a ogni istante solo
Iog2 rn stack frame. Poich il Teorema 11.4 garantisce che la N T M Ar non pu fare pi di
c p () mosse, m pu avere un valore iniziale non maggiore. Di conseguenza il numero di
4Per

stackframe intendiamo

unarca dello stack destinata ai dati di una chiamata di funzione.

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 .

DIMOSTRAZIONE evidente che V S C rV S , dato che ogni D T M anche una N T M .


Dobbiamo perci dimostrare soltanto che A fV S C V S , cio che, se L accettato da
una N T M N con limite polinomiale sullo spazio p(n), per un polinomio p(n), allora
L accettato anche da una D T M D con limite polinomiale sullo spazio q(n), per un
altro polinomio q(n). In effetti dimostreremo che q(n) pu essere scelto di un ordine di
grandezza pari al quadrato di p(n).
Per il Teorema 11.3 possiamo assumere innanzitutto che se Ar accetta, lo fa in non pi
di c1+p(n) passi per una costante c. Dato un input w di lunghezza n, D scopre come si
comporta N a fronte di un input w ponendo ripetutamente sul nastro la tripla [J0, J. m] e
chiamando reach con questi argomenti, dove:
1. lo la ID iniziale di N con input w
2. J una qualsiasi ID accettante che usa al pi p(n) celle di nastro; le diverse J sono
enumerate sistematicamente da D mediante un nastro ausiliario
3. m = ci+P(n).
Abbiamo gi dimostrato chc non ci sono mai pi di Iog2 m chiamate ricorsive attive nello
stesso momento, cio una con terzo argomento , una con r r i / 2 , una con i n / 4, e cos via,
fino a I. Di conseguenza non ci sono pi di Iog2 m frame sullo stack, e Iog2 m 0 (p (n )).
Gli stack frame occupano ciascuno uno spazio 0 (p (n )). Infatti ognuna delle due ID
richiede di scrivere solo I + p(n) celle, e se si scrive rn in binario abbiamo bisogno di
Iog2 cl+P("> = 0(j}(n)) celle. Di conseguenza lintero stack frame, formato dalle due
ID e da un intero, occupa uno spazio 0 (p (n )).
Poich D ha al massimo ( ( )) stack frame, lo spazio complessivo O (p2 ) .
Questo spazio un polinomio se lo p{n), e possiamo concludere che L ha una D T M
con limite polinomiale sullo spazio.
In conclusione possiamo aggiungere le classi a spazio polinomiale al quadro delle
relazioni fra classi ^i complessit. 11 diagramma completo illustrato nella Figura 11.5.

Un problema completo per V S

505

Figura 11.5 Relazioni note tra classi di linguaggi.

11.3

U n problema completo per

VS

In questo paragrafo presentiamo il problema delle formule booleane con quantificatori


e dimostriamo che completo per V S .

11.3.1

PS-completezza

Diremo che un problema P completo per V S (PS-completo) se:


1. P c 'm V S
2. ogni linguaggio L in V S riducibile a P in tempo polinomiale.
Si noti che. sebbene ci occupiamo di spazio polinomiale (e non di tempo), la condizione
per la PS-completezza analoga a quella per la NP-completezza: la riduzione dev'es
sere compiuta in tempo polinomiale. La ragione che vogliamo sapere che V = V S
se un problema PS-completo dovesse risultare in V , e che A rV = V S se un proble
ma PS-complcto in A fV . Se la riduzione richiedesse solo uno spazio polinomiale, la

506

Capitolo 11

dimensione delloutput potrebbe essere esponenziale nella dimensione dell'input, e non


potremmo dimostrare il prossimo teorema. Dal momento che consideriamo riduzioni in
tempo polinomiale, otteniamo le relazioni desiderate.
Teorema 11.6 Sia P un problema PS-completo.
a) Se P in V , allora P = P S .
b) Se P in A rP , allora rV = P S .

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

Formule booleane con quantificatori

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.

Un problema completo per 'PS

507

1. 0 (false), I (true), e una qualsiasi variabile sono QBF.


2. Se E ed F sono QBF, lo sono anche (F), -(E ), (E ) A (F) e (E ) V (F), che
rappresentano una E tra parentesi, la negazione di E , lA N D di E ed F , e l'OR
di E ed F. Le parentesi superflue possono essere eliminate secondo le regole di
precedenza consuete: NOT, poi A N D , infine OR. Di norma seguiremo lo stile arit
metico per A N D e OR, dove A N D rappresentato dalla giustapposizione (nessun
operatore) e O R rappresentato dal +. Quindi scriveremo spesso (F )(F ) in luogo
di (E ) (F), e (E ) + (F) in luogo di (E ) V (F).
3. Se F una QBF senza quantificatori per la variabile x, allora (Vx)(F) e (Bx)(F)
sono Q B F Diremo che la portata (scope) di x lespressione E . Intuitivamente
X definita solo entro E , cos come la portata di una variabile in un program
ma si estende alla funzione in cui dichiarata. Le parentesi prima e dopo E (ma
non prima e dopo il quantificatore) possono essere eliminate se non c ambiguit.
Per evitare un eccesso di parentesi le une dentro le altre, scriveremo una catena di
quantificatori come

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)

Partiamo dalle variabili x e y, le connettiamo con A N D c applichiamo il quantificatore


(By) per produrre la sottoespressione (3y)(xy). Analogamente costruiamo lespressio
ne booleana ->x -r 2 e applichiamo il quantificatore (Vz) ottenendo la sottoespressione
(Vz) (-IX 4-z). Combiniamo poi Ic due espressioni con OR; non servono parentesi perche'
+ (OR) ha la precedenza pi bassa. Infine applichiamo il quantificatore (Vx) per produrre
la Q BF finale.

11.3.3

Valutazione di formule booleane con quantificatori

Dobbiamo ancora definire in termini formali il significato di una Q B K Se per leggiamo


V come per ogni ed 3 come esiste, possiamo farcene unidea. La Q B F deHEsempio 11.7 afferma che per ogni x (cio I = O o x = 1) esiste un y tale che sia x sia y
sono vere, oppure per ogni 2 , ->x + z vera. Per dimostrare che lenunciato valido,
osserviamo che se x = 1 possiamo scegliere y = 1 e rendere vera xy. Se x = 0, allora
i.T I-z vera per ambedue i valori di z.
Se una variabile x si trova nella portata di un quantificatore per x, diremo che loccorrenza di x vincolata. Negli altri casi diremo che libera.

508

Capitolo 11

Esempio 11.8 Nella Q BF dell'equazione (11.1) ogni occorrenza di ciascuna variabile


vincolata, in quanto si trova nella portata di un quantificatore per la variabile. Per esempio
Ia portata della variabile y quantificata in (By)(xy) lespressione xy. Dunque in questo
caso loccorrenza di y vincolata. Luso di x in xy legato al quantificatore (Va), la cui
portata lintera espressione.
Il valore di una Q B F che non ha variabili libere 0 oppure 1 (cio vero o falso).
Possiamo calcolare I valore della QBF per induzione sulla lunghezza n dellespressione.
Sc lespressione ha lunghezza I, pu essere solo una costante 0 I, perch se fosse
una variabile sarebbe libera. 11 valore dellespressione coincide con lespressione stessa.

BASE

Supponiamo di avere unespressione senza variabili libere di lunghezza n > 1


e di saper valutare una qualsiasi espressione di lunghezza inferiore, purch non abbia
variabili libere. Una QBF di questo tipo pu avere sci forme.
in d u zio n e

1. Lespressione della forma ( E). Quindi E di lunghezza n 2 e siamo in grado


di valutarla. 11 suo valore 0 o I. Il valore di (E ) lo stesso.
2. Lespressione della forma -<E. Quindi E di lunghezza n 1 c pu essere
valutata. Sc E = 1, allora ~<E = 0, c viceversa.
3. Lespressione della forma E F . Allora sia E sia F sono pi brevi di n. per cui
possono essere valutate. Il valore di E F 1 se sia E sia F hanno valore 1, e 0 se
una delle due vale 0.
4. Lespressione c della forma E + F. Allora sia E sia F sono pi brevi di n, per cui
possono essere valutate. II valore di E + F I sc E oppure F ha valore L c 0 se
entrambe sono 0.
5. Se lespressione c della forma (Vr)(F), in primo luogo sostituiamo tutte le oc
correnze di X in E con 0, e otteniamo lespressione F 0; sostituiamo poi ogni oc
correnza di X in E con 1, ottenendo !espressione F i. Osserviamoche Fo ed F 1
soddisfano due condizioni.
(a) Non hanno variabili libere perch unoccorrenza libera di una variabile in E 0
o E i non pu essere x, e sarebbe quindi libera in E.
(b) Hanno lunghezza n 6, e sono quindi pi brevi di n.
Valutiamo Fo ed F i. Se entrambe hanno valore I, allora (Vx)(F) ha valore 1;
altrimenti ha valore 0. Osserviamo che la regola rispecchia l'interpretazione per
ogni a; di (Vx).

Un problema completo per P S

509

6. Se lespressione (Bx)(E), procediamo come nel punto (5), costruendo , cd E\


e valutandole. Se Eq o E i ha valore I. allora (Bz)(E) ha valore 1; altrimenti ha
valore 0. Osserviamo chc la regola rispecchia linterpretazione esiste x " di (3x).
Esempio 11.9 Valutiamo la Q B F dellEquazione (11.1). Essa della forma (Vx)(E).
Dobbiamo quindi valutare prima E q, che :
(Hy)(Oy) + (Vs) (->0 + 2 )

(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)

L'Espressione (By)(Iy) ha valore 1. come si vede sostituendo y = I. Di conseguenza


E 1, ovvero lEquazione (11.3), ha valore 1. Concludiamo che l'intera espressione, cio
lEquazione ( 11.1). ha valore 1.

11.3.4

PS-completezza del problema QBF

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

in grado di generare, in tempo polinomiale, unespressione indicante che la T M accetta


il suo input. Quando trattiamo un limite polinomiale sullo spazio, il numero delle ID in
una computazione pu essere esponenziale nella dimensione dellinput, e non possiamo
scrivere in tempo polinomiale unespressione booleana per indicare la correttezza della
computazione. Fortunatamente abbiamo un linguaggio pi espressivo, e la disponibilit
dei quantificatori ci permette di scrivere una Q BF di lunghezza polinomiale che indica
che la T M con limite polinomiale sullo spazio accetta il suo input.
Dal Teorema 11.5 prendiamo Ia tecnica ricorsiva per esprimere il fatto che una ID pu
diventarne un'altra in un numero elevato di mosse. In altre parole, per dire che la ID I
pu diventare la ID J in rn mosse, diciamo che esiste una ID K tale che 1 diventa K in
m /2 mosse e K diventa J in altre m /2 mosse. Il linguaggio delle formule booleane con
quantificatori ci permette di dirlo con un'espressione di lunghezza polinomiale, anche se
m esponenziale nella lunghezza dell'input.
Prima di procedere alla dimostrazione che ogni linguaggio in V S riducibile in tempo
polinomiale a QBF, dobbiamo dimostrare chc Q B F in V S . Anche questa parte della
dimostrazione della PS-completezza non immediata: la isoliamo comc teorema a s
stante.
Teorema 11.10 QBF in V S .

Nel Paragrafo 1 1 .3.3 abbiamo descritto una procedura ricorsiva per va


lutare una QBF F . Possiamo implementarla per mezzo di uno stack memorizzato sul
nastro di una macchina di Turing, come abbiamo fatto nella dimostrazione del Teore
ma 11.5. Supponiamo chc F sia di lunghezza n. Creiamo un record di lunghezza 0 (n )
per F , che contiene F stessa e lo spazio per la sottoespressione di F che stiamo trattando.
Due esempi presi dalle sei forme possibili di F chiariranno il processo di valutazione.
d im o s t r a z io n e

1. Supponiamo che F = F 1 + Fz- Operiamo allora come segue.


(a) Poniamo Fi in un record a s, a destra di quello per F.
(b) Valutiamo ricorsivamente Fi.
(c) Se il valore di F 1 1, restituiamo il valore I per F.
(d) Se il valore di Fi 0, sostituiamo il suo record con un record per F 2 e
valutiamo ricorsivamente F2.
(e) Restituiamo come valore di F il valore restituito da F 2.
2. Supponiamo che F = (3x)(F). Operiamo allora come segue.
(a) Formiamo lespressione Fo sostituendo 0 a ogni occorrenza di x e collochia
mo F 0 in un suo record, a destra di quello per F.
(b) Valutiamo ricorsivamente F 0.

Un problema completo per V S

5 11

(c) Se il valore di E q 1, restituiamo 1 come valore di F .


(d) Se il valore di Eq 0, formiamo E 1 sostituendo l a z i n E.
(e) Sostituiamo il record per E q con un record per , e valutiamo ricorsivamente
E 1.
(f) Restituiamo come valore di F il valore restituito da E 1l.
Lasciamo al lettore il compito di descrivere i passi da compiere nei casi in cui F ha una
delle altre quattro possibili forme: F 1 F 2, ~>E, (E ) oppure (Vz)(E). Il caso di base, in cui
F una costante, ci obbliga a restituire quella costante senza formare altri record.
Osserviamo chc in ogni caso a destra del record per un'espressione di lunghezza rn
ce ne sar uno per unespressione di lunghezza inferiore a m. Anche se dobbiamo spesso
valutare due sottoespressioni diverse, le valutiamo una per volta. Pertanto nel caso (!) non
abbiamo mai simultaneamente sul nastro il record per F 1, o per una sua sottoespressione,
e quello per E 2 , o per una sua sottoespressione. Lo stesso vale per E q ed E\ nel caso (2).
Perci, se partiamo con unespressione di lunghezza n, sullo stack non ci possono
mai essere pi di n record. Inoltre la lunghezza di ogni record 0 (n ). Quindi lintero
nastro non diventa mai pi lungo di 0 ( n z). Abbiamo ora una costruzione per una T M
con limite polinomiale sullo spazio che accetta QBF; il suo limite in spazio quadratico.
Osserviamo che questalgoritmo impiega di norma un tempo esponenziale in n, per cui
non polinomiale in tempo.
Passiamo ora alla riduzione da un linguaggio arbitrario L in V S al problema QBF.
Vorremmo usare variabili proposizionali ijja come nel Teorema 10.9 per asserire che la
ji-esima posizione nell-esima ID A. Per, dato che esiste un numero esponenziale
di ID, per un input w di lunghezza n non potremmo neppure scrivere quelle variabili in
tempo polinomiale in n. Sfruttiamo invece i quantificatori per far s che lo stesso insieme
di variabili rappresenti molte ID diverse. Lidea sviluppata nella dimostrazione che
segue.
Teorema 11.11 II problema Q BF PS-completo.

DIMOSTRAZIONE Sia L in V S , accettato da una T M deterministica M che usa al massimo


uno spazio p(n) su input di lunghezza n. Per il Teorema 11.3 sappiamo che esiste una
costante c tale che M accetta in non pi di c1+p^n^ mosse un input di lunghezza ri. De
scriveremo ora come, a partire da un input w di lunghezza n, si possa costruire in tempo
polinomiale una QBF E senza variabili libere e con valore 1 se e solo se w in L (M ).
Per formare E dovremo introdurre un numero polinomiale di ID-variabili, cio insie
mi di variabili del tipo y A ', V j a indica che la j-esima posizione della ID rappresentata ha
il simbolo A , con j compreso fra 0 e p(n). Il simbolo A un simbolo di nastro oppure
uno stato di M . Di conseguenza il numero di variabili proposizionali in una ID-variabile

512

Capitolo 11

polinomiale in n. Assumiamo che tutte le variabili proposizionali in diverse ID-variabili


siano distinte, ossia che nessuna variabile proposizionale appartenga a due diverse IDvariabili. Sc il numero di ID-variabili polinomiale, anche il numero totale di variabili
proposizionali polinomiale.
Conviene servirsi della notazione (37), dove I una ID-variabile, per denotare (3,-ci )
(3^2) (3Xti), dove x \, .T2, . . . , xm sono tutte le variabili proposizionali nella ID-varia
bile I. Analogamente (V/) sta per il quantificatore V applicato a tutte le variabili proposi
zionali in I.
La Q BF formata da w ha la forma
(3I 0 )(3 If)(S N ?)
dove:
1. Io c If sono ID-variabili che rappresentano rispettivamente la ID iniziale e quella
finale
2. S unespressione chc indica avvio corretto, cio Iq proprio la ID iniziale di
M con input w
3. N unespressione che indica mossa lecita, cio M passa da / 0 a / /
4. F unespressione che indica terminazione corretta, cio Tf una ID accettante.
Osserviamo che, mentre lintera espressione non ha variabili libere, le variabili di Z0 sono
libere in 5, quelle di Tf sono libere in F , ed entrambi i gruppi di variabili sono liberi in
N.

Avvio corretto

S lA N D logico di letterali; ogni letterale una delle variabili di Io. S ha il letterale


ijjA se la j-esima posizione della ID iniziale con input w A, altrimenti ha il letterale
VjA- Quindi, se w = \- * a, allora y0qo, yai, y2a2, .,Vnan c tutte le yjB , per
j - + l, r + 2 ,... ,p(n), compaiono senza negazione, mentre tutte le altre variabili di
Io sono negate. Assumiamo che q0 sia lo stato iniziale di M e B sia il suo blank.

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.

Un problema completo per P S

513

Una costruzione inefficiente


A prima vista si sarebbe tentati di costruire N 2i da N i secondo una strategia divide et impera: se T F J in Ti o meno mosse, allora deve esistere una ID K per cui
in i mosse o meno si ha 7 F K e K F J . Se per scriviamo la formula che espri
me questo concetto, per esempio (, J) = (3/\')(,Yi(7. K ) N i(K , J)), la
lunghezza dellespressione raddoppia, come i. Per esprimere tutte le possibi
li computazioni di Al, i devessere esponenziale in n. Impiegheremmo quindi
troppo tempo per scrivere Ar, che risulterebbe di lunghezza esponenziale.

Mossa lecita

Lespressione N c costruita ricorsivamente in modo da raddoppiare il numero di mosse


considerate aggiungendo solo O (p(n)) simboli allespressione in costruzione e impiegan
do solo un tempo 0(p (n )) per scrivere lespressione. Definiamo labbreviazione I = .7,
dove I c J sono ID-variabili, come A N D logico delle espressioni che uguagliano le va
riabili corrispondenti di I e J . In altre parole, se I consiste nelle variabili i/jA e J nelle
variabili ZjA, allora I = J c lA N D delle espressioni ( ijjaZja + (yJ){zJ)), con j che
varia da 0 a p[n), e con A che un simbolo di nastro o uno stato di Al.
Costruiamo ora le espressioni
J), per i = 1,2.4,8, a indicare che I h J in
i o meno mosse. In queste espressioni solo Ic variabili proposizionali delle ID-variabili 1
e J sono libere; tutte le altre sono vincolate.
Per i = I , Ni(I, J) afferma che I = J oppure I F J. Abbiamo appena visto come
esprimere la condizione I = J . Per la condizione I F J rinviamo il lettore alla discus
sione nella sezione Mossa successiva lecita della dimostrazione del Teorema 10.9, dove
viene trattato lo stesso problema (una ID segue da quella chc la precede). Lespressione
A i lO R logico di queste due espressioni. Osserviamo chc possibile scrivere Ni in
tempo 0 (p (n )).
BASE

Costruiamo (, J ) a partire da N i. Nel riquadro Una costruzione ineffi


ciente sottolineiamo che la soluzione immediata, con luso di due copie di N i per costrui
re A'2 , non rispetta ilimiti di spazio e di tempo necessari. 11 modo corretto di scrivere N 2i
impiega una sola copia di Ni nellespressione, passando entrambi gli argomenti (I . K ) e
( K .J ) alla stessa espressione. In altre parole N-2 {I. J ) user ununica sottoespressione
Ar(P, Q). Scriviamo
(/, J) per affermare che esiste una ID K tale che per tutte le ID
P e Q vale una delle seguenti condizioni:
in d u z io n e

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

Abbiamo illustrato come trasformare linput w in una QBF


(3I0 )(3If )(S A N A F )
in tempo polinomiale in |w|. Inoltre abbiamo spiegato perch ognuna delle espressioni $,
N ed F vera se e solo se le sue variabili libere rappresentano le ID I0 e If, che sono
rispettivamente la ID iniziale e quella accettante di una computazione di M su input w
con Io l Tf. Quindi questa QBF ha valore 1 se e solo se M accetta w.

11.3.5

Esercizi

Esercizio 11.3.1 Completate Ia dimostrazione del Teorema 11.10 trattando i seguenti

casi:
a) F = FyF 2
b) F = (Vx)(E)
c) F = -(F)
d) F = (E).

Classi di linguaggi basale sulla randomiazione

515

Esercizio 11.3.2 Dimostrate che il seguente problema PS-completo: data un'espres

sione regolare E , E equivalente a *, dove l'insieme di simboli che compaiono


in E l Suggerimento: invece di ridurre QBF a questo problema, pu risultare pi facile
dimostrare la riduzione al problema di un linguaggio arbitrario in V S . Per ogni TM con
limite polinomiale sullo spazio, dimostrate chc, dato un input w, si pu costruire in tempo
polinomiale unespressione regolare che genera tutte le stringhe che non sono sequenze
di ID della T M che conducono allaccettazione di w.
Esercizio 11.3.3 II gioco detto Shannon Switching Game si svolge su un grafo G con due

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

Classi di linguaggi basate sulla randomizzazione

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

Quicksort: un esempio di algoritmo randomizzato

"Quicksort un nolo algoritmo di ordinamento, di cui descriviamo in sintesi il funziona


mento. Data una sequenza di elementi ai, a?,. . . , an da ordinare, ne scegliamo uno, per

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

Un modello di macchina di Turing con randomizzazione

Per rappresentare in termini astratti in una macchina di Turing la capacit di compiere


scelte casuali in modo analogo a un programma che chiama una o pi volte un gene
ratore di numeri casuali, ricorriamo alla variante di una T M multinastro illustrata nella
Figura 11.6. 11 primo nastro contiene linput, secondo la prassi per le TM multinastro.
Anche il secondo nastro contiene inizialmente simboli diversi dal blank. Lintero nastro
in effetti occupato da O e 1, ciascuno scelto a caso e in modo indipendente; la pro
babilit di scegliere O 1/2, c lo stesso vale per I. Il secondo nastro sar denominato
nastro casuale. Il terzo nastro e i successivi, se vengono usati, sono inizialmente bianchi
7N o n forniremo la prova di questa affermazione. Per una dimostrazione c u n analisi del tempo medio di
esecuzione per Quicksort, rimandiamo a D . E . Knutht TJie Art of Computer Programming,

Searching. Addi son-Wesley,

1973.

Voi. IH: Soning and

Classi di linguaggi basate sulla randomizzazione

517

e hanno la funzione di nastri ausiliari. Chiameremo questo modello macchina di Turing


randomizzata.

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

T M randomizzata. Il punto cruciale il processo ricorsivo in cui si prende una sottose


quenza (chc ipotizziamo memorizzata in celle consecutive sul nastro di input e delimitata
da marcatori alle due estremit), si sceglie a caso un pivot e si divide la sottosequenza in
due sottosequenze. Descriviamo il succedersi delle operazioni.
1. Supponiamo che la sottosequenza da dividere abbia lunghezza ro. Per scegliere un
numero casuale tra 1 ed ro occorrono circa O(Iog m ) nuovi bit casuali sul secondo

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.

2. Copiamo I pivot sul nastro 3.


3. Percorriamo la sottosequenza delimitata sul nastro 1, copiando sul nastro 4 gli
elementi che non sono pi grandi del pivot.
4. Percorriamo nuovamente la sottosequenza sul nastro 1, copiando sul nastro 5 gli
elementi pi grandi del pivot.
5. Copiamo il nastro 4 e poi il nastro 5 nello spazio sul nastro 1 che prima conteneva
la sottosequenza delimitata. Collochiamo un marcatore tra le due sequenze.
6. Se una delle due sotto-sottosequenze, o entrambe, ha pi di un elemento, la (o le)
ordiniamo ricorsivamente con lo stesso algoritmo.
Osserviamo che questa implementazione del Quicksort impiega un tempo O(nlogn),
anche se il dispositivo di calcolo una T M multinastro e non un computer convenzionale.
Lesempio interessante non tanto per il tempo di esecuzione quanto per l'impiego dei
bit casuali sul secondo nastro per generare il comportamento casuale della macchina di
Turing.

11.4.3

II linguaggio di una macchina di Tring randomizzata

Di solito consideriamo il linguaggio accettato da una macchina di Turing (o da un F-A o


da un PDA) anche se linsieme vuoto oppure l'insieme di tutte le stringhe sull'alfabeto
di input. Nel trattare macchine di Turing randomizzate bisogna usare una certa cautela in
merito al concetto di accettazione; anche possibile che una T M randomizzata non accetti
alcun linguaggio. Quando esaminiamo le operazioni di una T M randomizzata M a fronte
di un input w, dobbiamo considerare tutti i contenuti possibili del nastro casuale. E pos
sibile che M accetti un input con determinate stringhe casuali e lo rifiuti con altre; anzi,
se la T M randomizzata deve operare con maggior efficienza rispetto a una deterministica,
essenziale che contenuti diversi del nastro casuale inducano comportamenti diversi.8
V

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.

Classi di linguaggi basate sulla randomizzazione

519

Se applichiamo a una T M randomizzata il criterio di accettazione per stato finale,


come in quelle tradizionali, ogni input w ha una probabilit di essere accettato pari alla
frazione dei possibili contenuti del nastro casuale chc porta aHaccettazione. Poich il
numero dei possibili contenuti del nastro infinito, il calcolo della probabilit richiede
una certa cura. Dal momento che ogni sequenza di mosse che porta allaccettazione visita
solo una porzione finita del nastro casuale, la probabilit di una particolare configurazione
finita e uguale a 2 ~m, se rn il numero di celle del nastro casuale che sono state visitate
e che hanno influenzato almeno una mossa della TM . Un esempio illustrer il calcolo in
un caso semplice.
Esempio 11.13 La tabella della Figura 11.7 riproduce la funzione di transizione di una

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

Figura 11.7 La funzione di transizione di una macchina di Turing randomizzata.


Riassumiamo il comportamento di Al su una stringa di input w di 0 e I. Nello stato
iniziale qo, M guarda il primo bit casuale e svolge una verifica su u,\ a seconda che il bit
casuale sia 0 o 1.
Se 0, Al verifica se w consiste in un solo simbolo, 0 o I, eventualmente ripetuto.
In questo caso Al non legge nessun altro bit casuale, ma mantiene ferma la testina del
secondo nastro. Se il primo bit di w 0, Al passa allo stato q\, in cui si muove verso
destra sopra ogni 0, ma muore se vede un 1. Se Al raggiunge il primo blank sul nastro
di input mentre si trova nello stato qi, passa allo stato accettante q. Analogamente, se il
primo bit di w 1, e il primo bit casuale 0, Al passa allo stato q2, dove controlla se tutti
gli altri bit di w sono 1. Se cos, accetta.

520

Capitolo 11

Consideriamo ora che cosa fa M se il primo bit casuale I. M confronta w con il


secondo bit causale e con quelli successivi, accettando solo se le due stringhe coincidono.
Di conseguenza dallo stato q0, se legge 1 sul secondo nastro, Al passa allo stato q:i. Nel
farlo Al muove la testina del nastro casuale verso destra sopra un nuovo bit casuale,
mentre la testina del nastro di input viene mantenuta ferma, per cui tutti i simboli di w
saranno confrontati con i bit casuali. Nello stato 3 , M confronta i due nastri, spostando
verso destra le due testine. Se a un certo punto i simboli non coincidono, M muore senza
accettare; se invece raggiunge un blank sul nastro di input, accetta.
Calcoliamo ora la probabilit di accettazione di certi input. In primo luogo consideria
mo un input omogeneo, cio formato con un solo simbolo, come 0' per i > I. Il primo bit
casuale sar 0 con probabilit 1/2. In questo caso Ia verifica di omogeneit d esito positi
vo c Oi viene accettato. D'altra parte c' una probabilit 1/2 che il primo bit casuale sia 1.
In questo caso 0' sar accettato se e solo se i bit casuali dal secondo air(+ 1)-esimo sono
tutti 0, il che accade con probabilit 2~\ Pertanto la probabilit totale di accettazione di
Ui
- 4--2-i = - +

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.

Classi di linguaggi basate sulla randomizzazione

521

Non determinismo e caso


Tra una T M randomizzata e una T M non deterministica ci sono analogie super
ficiali. Possiamo immaginare le scelte non deterministiche di una N T M comc
governate da un nastro con bit casuali: ogni volta che la N T M ha una scelta, con
sulta il nastro casuale c sceglie dando la stessa probabilit a tutte le opzioni. Se
per interpretiamo una N T M in questo modo, la regola di accettazione piuttosto
diversa da quella per 7ZV: un input viene rifiutato se la sua probabilit di accetta
zione 0 , e viene accettalo se la probabilit qualsiasi valore maggiore di 0 , per
quanto piccolo.

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

Supponiamo che il grafo abbia n nodi ed e lati. Se c almeno un triangolo, la proba


bilit che i suoi tre nodi siano selezionali in unesecuzione (2 )(L ) . Infatti tre degli
c lati sono nel triangolo, e se uno di essi viene scelto, la probabilit che anche il terzo
nodo venga selezionato 1 / ( 7 1 2). Si traila di una probabilit bassa, ma l'esperimento
ripetuto k volte. La probabilit che almeno uno dei k esperimenti produca il triangolo :
(

\k
(

4 )

Secondo una nota approssimazione, per piccoli valori di x, (1 x )k circa c~kx,


dove e = 2.718 la base dei logaritmi naturali. Di conseguenza, se scegliamo k in
modo che, per esempio, kx = 1 , e~h'J: sar significativamente minore di 1 / 2 e 1 e~kx
sar significativamente maggiore di 1/2, pi precisamente circa 0.63. Perci possiamo
scegliere k = e(n 2)/3 per garantire che la probabilit di accettazione di un grafo con
un triangolo secondo lEquazionc 11.4 sia almeno 1/2. L'algoritmo descritio dunque
Montecarlo.
Dobbiamo ora considerare il tempo di esecuzione della T M . Sia e sia n non superano
la lunghezza dellinput, e si scelto chc k non sia maggiore del quadrato della lunghezza,
perch proporzionale al prodotto di e cd n. Ogni tentativo scandisce linput al massi
mo quattro volte (per scegliere il lato e il nodo, e poi per controllare la presenza di due
ulteriori lati), ed quindi lineare rispetto alla lunghezza dell'input. Pertanto la T M si
arresta dopo un tempo al massimo cubico nella lunghezza dellinput, cio la T M ha un
tempo di esecuzione polinomiale e soddisfa quindi la terza e ultima condizione per cui un
linguaggio in 'JZV.
Concludicimo che il linguaggio dei grafi con un triangolo nella classe TZV. Dato che
sarebbe possibile fare una ricerca sistematica di tutti i possibili triangoli, il linguaggio
anche in V . Come abbiamo detto allinizio del Paragrafo 11.4, difficile trovare esempi
in T Z V - V .

11.4.5

Riconoscimento di linguaggi in IZV

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.

Se per consideriamo il risultato di un'esecuzione come definitivo, a volte rifiuteremo w


quando avremmo dovuto accettarlo (un falso negativo), anche se non accetteremo mai

Classi di linguaggi basate sulla randomizzazione

523

Il ruolo di 1/2 nella definizione di TZV


Abbiamo definito TZV imponendo che la probabilit di accettare una stringa w in
L sia almeno 1/2, ma avremmo potuto usare una qualunque costante compresa
tra 0 e 1, estremi esclusi. Il Teorema 11.16 afferma che, ripetendo lesperimento
fatto da M per un congruo numero di volte, possiamo elevare a piacimento la pro
babilit di acccttazione, fino a 1 escluso. La tecnica per diminuire la probabilit
di non accettazione di una stringa in L chc abbiamo usato nel Paragrafo 11.4.5 ci
permetter, data una TM randomizzata con una probabilit maggiore di 0 di ac
cettare w in L, di aumentare questa probabilit fino a 1/2. ripetendo lesperimento
per un numero fisso di volte.
Continueremo a richiedere 1/2 come probabilit di accettazione nella defi
nizione di TZV, ma dobbiamo essere consapevoli che qualunque probabilit non
nulla adeguata. Peraltro un cambio della costante modifica il linguaggio defini
to da una particolare T M randomizzata. NellEsempio 11.14 abbiamo visto che,
abbassando la probabilit richiesta a 1/16, la stringa 0()1 sarebbe nel linguaggio
della T M randomizzata.

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

La seconda classe di linguaggi legala alla randomizzazione della polinomiale probabili


stica con errore nullo, o Z V V . Essa basata su T M randomizzate che si arrestano sempre
con un tempo medio di arresto che un polinomio nella lunghezza dell'input. Queste T M
accettano entrando in uno stato accettante (e arrestandosi in quel punto) e rifiutano un in
put se si arrestano senza aver accettato. La definizione della classe Z V V quindi molto
simile a quella di V , salvo per il fatto che Z V V permette al caso di influire sul compor
tamento della T M , e che il tempo di esecuzione misurato quello medio anzich quello
relativo al caso peggiore.
Una T M che d sempre la risposta corretta, ma il cui tempo di esecuzione varia a
seconda dei valori dei bit casuali, detta macchina di Turing Las Vegas o algoritmo Las
Vegas. Possiamo dunque considerare Z V V come la classe dei linguaggi accettati da
macchine di Turing Las Vegas con tempo medio di esecuzione polinomiale.

11.4.7

Relazioni tra IZV e Z V V

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.

DIMOSTRAZIONE In primo luogo dimostriamo TZV c o - W C Z V V. Sia L un lin


guaggio in TZV co-TZV. Allora c' una T M Montecarlo per L e una per L, ciascuna
con tempo di esecuzione polinomiale. Sia p(n) un polinomio sufficientemente grande da
limitare il tempo di esecuzione di ambedue le macchine. Definiamo una T M Las Vegas
AT per L.
1. Eseguiamo IaTM Montecarlo per L; se accetta, allora Al accetta e si arresta.
2. In caso contrario eseguiamo la T M Montecarlo per L. Se la T M accetta, allora AT
si arresta senza accettare. Altrimenti Al ritorna al passo (1).
Ovviamente Al accetta un input tv solo se questo si trova in L e lo rifiuta solo se non si
trova in L. 11 tempo di esecuzione di un turno (esecuzione dei passi 1 e 2) 2p(n). La

Classi di linguaggi basate sulla randomizzazione

525

probabilit che un turno risolva la questione almeno 1/2. Infatti, se w in L, allora il


passo (1) ha il 5 0 % di probabilit di condurre allaccettazione da parte di M , e se w non
in L, il passo (2) ha il 5 0 % di probabilit di condurre al rifiuto da parte di M . Quindi il
tempo medio di esecuzione di M non maggiore di

2P() + 22p(7t) + \ 2p^

+ g2P(n) + ' = 4 P(n )

Consideriamo ora l'inverso: assumiamo che L sia in Z V V c dimostriamo che L sia


in TZV sia in co-TZV. Sappiamo che L accettato da una T M Las Vegas M\ con un tempo
medio di esecuzione che un polinomio p(n). Costruiamo una T M Montecarlo T M M 2
per L. M 2 simula M\ per 2p(n) passi. Se My accetta durante questo intervallo di tempo,
10 fa anche M 2; altrimenti M 2 rifiuta.
Supponiamo che linput w di lunghezza n non sia in L. Allora Ai1 non accetter w,
e perci non lo far neppure M 2. Supponiamo che ?/; sia in L. Prima o poi Mi accetter
sicuramente w, ma non detto che lo faccia entro 2p(n) passi.
Noi affermiamo per che la probabilit che Mi accetti w entro 2p(n) passi almeno
1/2. Supponiamo che la probabilit di accettazione di w da parie di M\ entro il tempo
2p{n) sia una costante c < 1/2. Allora il tempo medio di esecuzione di M\ su input w
almeno (1 c)2p(n,), dato che 1 c la probabilit che impieghi pi di 2p(n). Se
c < 1/2, allora 2( 1 - c) > 1, e il tempo medio di esecuzione di M i su w maggiore di
p(n). Abbiamo cos contraddetto lipotesi che M\ abbia un tempo medio di esecuzione
non superiore a p(n), e perci concludiamo che la probabilit che M 2 accetti almeno
1/2. Di conseguenza M 2 una T M Montecarlo con limite polinomiale sul tempo, il che
dimostra che L in TZV.
Per dimostrare che anche L in co-7ZV. usiamo essenzialmente la stessa costruzione,
complementando per il risultato di M 2. In altre parole, per accettare L facciamo s che
M 2 accetti quando M\ rifiuta entro un tempo 2p(n), mentre M 2 rifiuta nel caso opposto.
In questo modo M 2 una T M Montecarlo con limite polinomiale sul tempo per L.

11.4.8

Relazioni con le classi V ed M V

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.

Teorema 11.19 TZV C M V .

526

Capitolo 11

DIMOSTRAZIONE Supponiamo di avere una TM Montecarlo M i con limite polinomiale


sul tempo per un linguaggio L. Possiamo costruire una T M non deterministica M 2 per L
con lo stesso limite di tempo. Ogni volta che M i esamina un bit casuale per la prima volta,
M 2 sceglie, in modo non deterministico, entrambi i valori possibili di quello specifico bit,
e li scrive su un nastro che simula il nastro casuale di M\. M 2 accetta quando e solo
quando M\ accetta.
Sia w in L. Allora, dato che M\ ha almeno il 50% di probabilit di accettare w, deve
esistere una sequenza di bit sul nastro casuale che porta allaccettazione di w. M 2 sceglie
r, fra le altre, quella sequenza di bit, e quindi accetter per quella scelta. Quindi w in
L ( M 2). Se per w non in L, nessuna sequenza di bit casuali porta M i allacccttazione,
e perci nessuna sequenza di scelte induce M 2 ad accettare. Di conseguenza w non in
L ( M 2).
La Figura 11.8 illustra la relazione tra le classi che abbiamo introdotto c le altre classi
"vicine.

Figura 11.8 Relazioni di Z V P ed 'JZV con altre classi.

Complessit e numeri primi

11.5

527

Complessit e numeri primi

In questo paragrafo esamineremo un problema particolare: verificare se un intero pri


mo. Il problema interessante anzitutto perch, come spiegheremo, i numeri primi e la
verifica di primalit sono componenti essenziali nei sistemi di sicurezza per i computer.
Mostreremo poi chc i numeri primi sono sia in M V sia in co-MV. Infine discuteremo un
algoritmo randomizzato con cui si dimostra che sono anche in VSP.

11.5.1

Limportanza della verifica di primalit

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

composto e la sua scomposizione in fattori 2,! x 32 x 7.

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

Complessit e numeri primi

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

Introduzione allaritmetica modulare

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

le comuni propriet algebriche: e commutativa e associativa, 1 lidentit, 0 lelemento


neutro, e la moltiplicazione distributiva rispetto alla somma. La divisione per valori non
nulli pi complessa, e lesistenza di inversi di interi modulo p dipende dal fatto che p
sia o no un numero primo. In generale, se x un intero modulo p, ossia 0 < x < p, allora
.T- 1 , o 1/x, quel numero y tale che xy = 1 modulo p.
1

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

Figura 11.9 Moltiplicazione modulo 7.

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

Figura 11.10 Moltiplicazione modulo 6.


Confrontiamo questo caso con la tabella di moltiplicazione modulo 6. In primo luogo
osserviamo che solo I e 5 hanno un inverso; ciascuno il proprio inverso. Esistono
inoltre numeri diversi da 0, ma il cui prodotto 0, come 2 e 3. Si tratta di una situazione
che non si verifica mai nella comune aritmetica degli interi e nellaritmetica modulo un
numero primo.
Un'altra differenza fra la moltiplicazione modulo un numero primo e quella modulo
un numero composto si rivela molto importante per le verifiche di primalit. Il grado di

Complessit c numeri primi

531

un numero a modulo p la pi piccola potenza positiva di a uguale a 1. Enunciamo, senza


dimostrarle, alcune propriet importanti.
Sc p c un numero primo, allora ap_1 = 1 modulo p. Questo enunciato detto
teorema di Fermat.9
Il grado di a modulo un numero primo p sempre un divisore di p

1.

Sc p un numero primo, esiste sempre un a di grado p - I modulo p .


Esempio 11.23 Riconsideriamo la tabella della moltiplicazione modulo 7 nella Figura
11.9. Il grado di 2 3, dato che 22 = 4 e 2,J = I. Il grado di 3 6. dato che 32 2,
33 = 6, 34 = 4, 3 = 5 e 36 = 1. Con calcoli analoghi si scopre che 4 ha grado 3, 5 ha
grado 6. 6 ha grado 2, e 1 ha grado 1.

11.5.3

La complessit del calcolo in aritmetica modulare

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

1. Calcoliamo le potenze x ,x 2,x 4 .x * , . . . con esponente minore o uguale a p 1,


che sono al massimo ri. Ogni valore un numero di n bit, calcolato in un tempo
0 ( n 2) elevando al quadrato il valore precedente della sequenza. Il costo totale
quindi 0 ( n 3).
2. Troviamo la rappresentazione binaria di pl,ciop1 = -\ 0. Possiamo
scrivere
p 1 = (io + 2tti + 42 + + 2 1Qn-I
dove ogni a.j 0 oppure 1. Quindi
j- V ~ 1 ^."+2<4a2H-- f2 "

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

Verifica di primalit in tempo polinomiale randomizzato

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.

Complessit e numeri primi

533

Fattorizzare in tempo polinomiale randomizzato


Lalgoritmo del Paragrafo 11.5.4 rivela che un numero composto, ma non di
ce come fattorizzarlo. Si ritiene che non ci sia modo di fattorizzare un numero
in tempo polinomiale anche ricorrendo al caso, e nemmeno in media. Se que
sta assunzione fosse errata, le applicazioni presentate nel Paragrafo 11.5.1 non
sarebbero sicure e non dovremmo usarle.

3. Se xp 1 1 modulo p, accettiamo: p composto. Altrimenti ci arrestiamo senza


accettare.
Se p primo, allora a*-1 = 1. Quindi ci arresteremo sempre senza accettare; questo
uno dei requisiti di un metodo Montecarlo: se linput non nel linguaggio, non va
mai accettato. Per quasi tutti i numeri composti, almeno la met dei valori di x soddisfa
xp-1 \ Pertanto avremo almeno il 50% di probabilit di accettare a ogni esecuzio
ne dellalgoritmo, e questo un altro requisito di un algoritmo per poter essere di tipo
Montecarlo.
Quella appena descritta potrebbe essere la dimostrazione che i numeri composti sono
in 7ZV, se non fosse per lesistenza di un piccolo insieme di numeri composti c. per i
quali
= 1 modulo c per la maggior parte degli x nellintervallo da I a c - 1, in
particolare per gli x che non condividono un fattore primo con c. Questi numeri, detti
numeri di Carmichael, richiedono unaltra verifica pi complessa (che non descriviamo)
per scoprire che sono numeri composti. Il pi piccolo numero di Carmichael 561. Ci
significa che x560 = 1 modulo 561 per tutti gli x che non sono divisibili per 3, 11 o 17,
anche se 501 = 3 x l l x l 7 evidentemente un numero composto. Possiamo quindi,
senza darne la dimostrazione completa, enunciare un teorema.
Teorema 11.24 Linsieme dei numeri composti in TZV.

11.5.5

Verifiche di primalit non deterministiche

Esaminiamo un altro risultato interessante e significativo legato alle verifiche di primalit:


il linguaggio dei numeri primi in M V Co-ArV . Pertanto il linguaggio dei numeri com
posti, complemento dei primi, in N V co-NV. Se ne deduce che improbabile che
i numeri primi o i numeri composti siano NP-completi, perch in questo caso avremmo
linattesa uguaglianza N V = co-NV.
Una parte semplice: i numeri composti sono ovviamente in N V , quindi i primi sono
in co-rV . Proveremo innanzitutto questa propriet.

534

Capitolo 11

Teorema 11.25 Linsieme dei numeri composti in A fV .


D IM O S T R A Z IO N E

Descriviamo un algoritmo non deterministico in tempo polinomiale per

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

Il motivo che tutti i primi, eccetto 2. sono dispari.

mai primo,

tranne chc nel caso poco interessante

= 3.

Complessit e numen primi

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

Esercizio 11.5.1 Calcolate modulo 13:


a) 1 1 + 9

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

La classe co-ArV : un linguaggio in co-NV se il suo complemento in N V . Tutti


i linguaggi in V sono senzaltro in co- N V , ma probabile che esistano linguaggi in
N V che non sono in co-NV, e viceversa. In particolare non sembra che i problemi
NP-completi siano in co-NV.
La classe V S : un linguaggio in V S (spazio polinomiale) se accettato da una
T M deterministica per la quale esiste un polinomio p ( n ) tale che, dato un input di
lunghezza n, la T M non usa pi di p ( n ) celle del nastro.
La classe N V S : possiamo definire laccettazione da parte di una T M non determi
nistica il cui uso del nastro limitato da una funzione polinomiale della lunghezza
dellinput. La classe di linguaggi corrispondente detta N V S . Per il teorema di
Savitch sappiamo che V S = N V S . In particolare una N T M con limite di spazio
p ( n ) pu essere simulata da una D T M in spazio p 2 ( n ) .

538

Capitolo 11

Algoritmi randomizzati e macchine di Turing: molti algoritmi sfruttano la casualit.


In un computer reale si usa un generatore di numeri casuali che simula il lancio
della moneta. Una macchina di Turing pu produrre un comportamento soggetto al
caso se le viene dato un nastro aggiuntivo su cui viene scritta una sequenza casuale
di bit.
La classe TZP: un linguaggio accettato in tempo polinomiale randomizzato se
esiste una macchina di Turing randomizzata a tempo polinomiale che ha almeno il
50 % di probabilit di accettare un input se nel linguaggio. Se linput non nel
linguaggio, allora la T M non accetta mai. La T M , o un algoritmo, che si comporta
in questo modo detta Montecarlo.
La classe Z V V '. un linguaggio nella classe polinomiale probabilistica a errore
nullo se accettato da una macchina di Turing randomizzata che prende sempre
la decisione corretta sullappartenenza al linguaggio. La T M deve avere un tempo
medio di esecuzione polinomiale; il caso peggiore pu essere maggiore di qualsiasi
polinomio. Una T M o un algoritmo che si comportano in questo modo sono detti
Las Vegas .
Relazioni tra classi di linguaggi: la classe co-'JZV linsieme dei complementi dei
linguaggi in TZV. Sono note le seguenti relazioni di inclusione: V C Z V V C
(7Z P co-TZV). Inoltre TZV C AfV , e perci co-TZV C co-AiP.
/ numeri primi ed N P : sia i numeri primi sia il complemento del linguaggio dei
primi (i numeri composti) sono in A iV . Dunque improbabile che i numeri primi o
quelli composti siano NP-completi. Poich esistono importanti schemi crittografici
che si basano sui numeri primi, una tale dimostrazione sarebbe una prova evidente
della loro sicurezza.
/ numeri primi ed TZV: i numeri composti sono in TZV. L algoritmo polinomiale
randomizzato per verificare se un numero composto usato per la generazione di
numeri primi grandi, o almeno di numeri grandi con una probabilit arbitrariamente
piccola di essere composti.

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

La PS-completezza delle formule booleane con quantificatori contenuta in un lavoro


mai pubblicato di L.J. Stockmeycr. La PS-completezza del gioco di Shannon (Eserci
zio 11.3.3) tratta da 11J.
La dimostrazione che i numeri primi sono in V si deve a Pratt [9], La presenza
dei numeri composti in TZV fu provata per la prima volta da Rabin [1J. E interessante
notare che nello stesso periodo venne pubblicata una dimostrazione che i numeri primi
sono in V , a condizione che unipotesi, non dimostrata ma generalmente ritenuta valida,
detta ipotesi estesa di Riemann. sia vera [6],
Numerosi libri permettono di approfondire le conoscenze sui temi presentati in questo
capitolo. [7] tratta gli algoritmi randomizzati, compresi quelli per la verifica di primalit;
[5J un riferimento per gli algoritmi di aritmetica modulare; [3] e [8] trattano diverse altre
classi di complessit non citate qui.
N

1. S. Even, R. E. Tarjan, A combinatorial problem which is complete for polynomial


space, J. A C M 23:4 ( 1976), pp. 710-719.
2. J. Hartmanis, P. M . Lewis II, R. E. Stearns, Hierarchies of memory limited com
putations, P roc. Sixth Annual IEEE Symposium on Switching Circuit Theory and
Logical Design (1965), pp. 179-190.
3. J. E. HopcrofL J. D. Ullman. Introduction to Automata Theory, Languages, and
Computation. Addison-Wesley. Reading M A , 1979.
4. R. M . Karp, Reducibility among combinatorial problems, in Complexity of Com
puter Computations (R. E. Miller, ed.), Plenum Press, New York, 1972, pp. 85-104.
5. D. E. Knuth, The Art of Computer Programming, Vol. II: Seminumerical Algori
thms, Addison-Wesley, Reading M A , 1997 (terza edizione).
6. G. L. Miller, Riemann's hypothesis and tests for primality, J. Computer and
System Sciences 13(1976), pp. 300-317.
7. R. Motwani, P. Raghavan, Randomized Algorithms, Cambridge Univ. Press, 1995.
8. C. H. Papadimitriou. Computational Complexity, Addison-Wesley, Reading M A .
1994.
9. V. R. Pratt, Every prime has a succinct certificate, SIAM J. Computing 4:3 ( 1975),
pp. 214-220.
10. M. O. Rabin. Probabilistic algorithms, in Algorithms and Complexity: Recent
Results and New Directions (J. F. Traub1 ed.), pp. 21-39, Academic Press. New
York, 1976.

Potrebbero piacerti anche