John E. Hopcroft Rajeev Motwani Jeffrey D. Ullman
Automi, linguaggi e calcolabilità Terza edizione Edizione italiana a cura di Giovanni Pighizzini
c 2009 Pearson Paravia Bruno Mondadori S.p.A. Authorized translation from the English language edition, entitled: Introduction to Automata Theory, Languages, and Computation, 3nd Edition by Hopcroft, John E.; Motwani, Rajeev; Ullman, Jeffrey D., c 2007. published by Pearson Education, Inc., publishing as Addison Wesley, Copyright Italian language edition published by Pearson Paravia Bruno Mondadori S.p.A. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, c 2009. without permission from Pearson Education, Inc. Copyright
Le informazioni contenute in questo libro sono state verificate e documentate con la massima cura possibile. Nessuna responsabilità derivante dal loro utilizzo potrà venire imputata all’Autore, a Pearson Paravia Bruno Mondadori S.p.A. o a ogni persona e società coinvolta nella creazione, produzione e distribuzione di questo libro. Per i passi antologici, per le citazioni, per le riproduzioni grafiche, cartografiche e fotografiche appartenenti alla proprietà di terzi, inseriti in quest’opera, l’editore è a disposizione degli aventi diritto non potuti reperire nonché per eventuali non volute omissioni e/o errori di attribuzione nei riferimenti. I diritti di riproduzione e di memorizzazione elettronica totale e parziale con qualsiasi mezzo, compresi i microfilm e le copie fotostatiche, sono riservati per tutti i paesi. LA FOTOCOPIATURA DEI LIBRI È UN REATO. Le fotocopie per uso personale del lettore possono essere effettuate nei limiti del 15% di ciascun volume dietro pagamento alla SIAE del compenso previsto dall’art. 68, commi 4 e 5, della legge 22 aprile 1941 n. 633. Le riproduzioni effettuate per finalità di carattere professionale, economico o commerciale o comunque per uso diverso da quello personale possono essere effettuate a seguito di specifica autorizzazione rilasciata da AIDRO, corso di Porta Romana n. 108, 20122 Milano, e-mail e sito web
Curatore per l’edizione italiana: Giovanni Pighizzini Copy-editing: Federica Sonzogno Composizione: Giovanni Pighizzini Grafica di copertina: Nicolò Cannizzaro Stampa: Tip.Le.Co - S. Bonico (PC) Tutti i marchi citati nel testo sono di proprietà dei loro detentori. 978-88-7192-552-3 Printed in Italy 3a edizione: marzo 2009 Ristampa 00 01 02 03 04
Anno 09 10 11 12 13
Sommario
Prefazione all’edizione italiana
xv
Prefazione 1
xvii
Automi: metodo e follia
1.1
1.2
1.3
1.4
1.5
Perché studiare la teoria degli automi . . . . . . . . . . . . 1.1.1 Introduzione agli automi a stati finiti . . . . . . . . 1.1.2 Rappresentazioni strutturali . . . . . . . . . . . . . 1.1.3 Automi e complessità . . . . . . . . . . . . . . . . Introduzione alle dimostrazioni formali . . . . . . . . . . . 1.2.1 Dimostrazioni deduttive . . . . . . . . . . . . . . . 1.2.2 Riduzione a definizioni . . . . . . . . . . . . . . . 1.2.3 Altre forme di teorema . . . . . . . . . . . . . . . 1.2.4 Teoremi che non assomigliano a enunciati se-allora Altre forme di dimostrazione . . . . . . . . . . . . . . . . 1.3.1 Dimostrazioni di uguaglianza tra insiemi . . . . . . 1.3.2 Il contronominale . . . . . . . . . . . . . . . . . . 1.3.3 Dimostrazioni per assurdo . . . . . . . . . . . . . 1.3.4 Controesempi . . . . . . . . . . . . . . . . . . . . Dimostrazioni induttive . . . . . . . . . . . . . . . . . . . 1.4.1 Induzione sugli interi . . . . . . . . . . . . . . . . 1.4.2 Forme più generali di induzione sugli interi . . . . 1.4.3 Induzione strutturale . . . . . . . . . . . . . . . . 1.4.4 Induzione mutua . . . . . . . . . . . . . . . . . . . I concetti centrali della teoria degli automi . . . . . . . . . 1.5.1 Alfabeto . . . . . . . . . . . . . . . . . . . . . . . 1.5.2 Stringa . . . . . . . . . . . . . . . . . . . . . . . . 1.5.3 Linguaggio . . . . . . . . . . . . . . . . . . . . . 1.5.4 Problema . . . . . . . . . . . . . . . . . . . . . .
1
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
2 2 4 5 5 6 8 9 13 13 13 15 16 17 18 18 21 22 25 27 27 28 29 30
vi Sommario 1.6 1.7 2
Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Automi a stati finiti
2.1
2.2
2.3
2.4
2.5
2.6 2.7
Una descrizione informale degli automi a stati finiti . . . . . . . . . . . . . 2.1.1 Le regole fondamentali . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Il protocollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.3 Automi che possono ignorare azioni . . . . . . . . . . . . . . . . . 2.1.4 L’intero sistema come automa . . . . . . . . . . . . . . . . . . . . 2.1.5 Validazione del protocollo mediante l’automa prodotto . . . . . . . Automi a stati finiti deterministici . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Definizione di automa a stati finiti deterministico . . . . . . . . . . 2.2.2 Elaborazione di stringhe in un DFA . . . . . . . . . . . . . . . . . . 2.2.3 Notazioni più semplici per i DFA . . . . . . . . . . . . . . . . . . . 2.2.4 Estensione della funzione di transizione alle stringhe . . . . . . . . 2.2.5 Il linguaggio di un DFA . . . . . . . . . . . . . . . . . . . . . . . . 2.2.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automi a stati finiti nondeterministici . . . . . . . . . . . . . . . . . . . . . 2.3.1 Descrizione informale degli automi a stati finiti nondeterministici . . 2.3.2 Definizione di automa a stati finiti nondeterministico . . . . . . . . 2.3.3 La funzione di transizione estesa . . . . . . . . . . . . . . . . . . . 2.3.4 Il linguaggio di un NFA . . . . . . . . . . . . . . . . . . . . . . . . 2.3.5 Equivalenza di automi a stati finiti deterministici e nondeterministici 2.3.6 Un caso sfavorevole di costruzione per sottoinsiemi . . . . . . . . . 2.3.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un’applicazione: ricerche testuali . . . . . . . . . . . . . . . . . . . . . . . 2.4.1 Ricerca di stringhe in un testo . . . . . . . . . . . . . . . . . . . . . 2.4.2 Automi a stati finiti nondeterministici per ricerche testuali . . . . . . 2.4.3 Un DFA per riconoscere un insieme di parole chiave . . . . . . . . . 2.4.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automi a stati finiti con epsilon-transizioni . . . . . . . . . . . . . . . . . . 2.5.1 Uso delle -transizioni . . . . . . . . . . . . . . . . . . . . . . . . 2.5.2 La notazione formale per gli -NFA . . . . . . . . . . . . . . . . . 2.5.3 Epsilon-chiusure . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.4 Transizioni estese e linguaggi per gli -NFA . . . . . . . . . . . . . 2.5.5 Eliminazione delle -transizioni . . . . . . . . . . . . . . . . . . . . 2.5.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36 36 37 39 40 42 43 43 44 45 46 50 50 53 53 54 55 56 58 62 63 65 66 66 67 69 69 70 71 71 73 74 77 77 78
Sommario
3
Espressioni e linguaggi regolari
3.1
3.2
3.3
3.4
3.5 3.6 4
79
Espressioni regolari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Gli operatori delle espressioni regolari . . . . . . . . . . . . . . . . 3.1.2 Costruzione di espressioni regolari . . . . . . . . . . . . . . . . . . 3.1.3 Precedenza degli operatori delle espressioni regolari . . . . . . . . . 3.1.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automi a stati finiti ed espressioni regolari . . . . . . . . . . . . . . . . . . 3.2.1 Dai DFA alle espressioni regolari . . . . . . . . . . . . . . . . . . . 3.2.2 Conversione di DFA in espressioni regolari per eliminazione di stati 3.2.3 Conversione di espressioni regolari in automi . . . . . . . . . . . . 3.2.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Applicazioni delle espressioni regolari . . . . . . . . . . . . . . . . . . . . 3.3.1 Le espressioni regolari in UNIX . . . . . . . . . . . . . . . . . . . 3.3.2 Analisi lessicale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Ricerca di pattern in un testo . . . . . . . . . . . . . . . . . . . . . 3.3.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proprietà algebriche per le espressioni regolari . . . . . . . . . . . . . . . . 3.4.1 Associatività e commutatività . . . . . . . . . . . . . . . . . . . . . 3.4.2 Identità e annichilatori . . . . . . . . . . . . . . . . . . . . . . . . 3.4.3 Distributività . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.4 Idempotenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.5 Proprietà relative alla chiusura . . . . . . . . . . . . . . . . . . . . 3.4.6 Alla ricerca di proprietà per le espressioni regolari . . . . . . . . . . 3.4.7 Verifica di proprietà algebriche sulle espressioni regolari . . . . . . 3.4.8 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
Proprietà dei linguaggi regolari
4.1
4.2
4.3
Dimostrare che un linguaggio non è regolare . . . . . . . . . . . . . . 4.1.1 Il pumping lemma per i linguaggi regolari . . . . . . . . . . . 4.1.2 Applicazioni del pumping lemma . . . . . . . . . . . . . . . . 4.1.3 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proprietà di chiusura dei linguaggi regolari . . . . . . . . . . . . . . . 4.2.1 Chiusura dei linguaggi regolari rispetto a operazioni booleane . 4.2.2 Inversione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Omomorfismi . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.4 Omomorfismi inversi . . . . . . . . . . . . . . . . . . . . . . 4.2.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problemi di decisione per i linguaggi regolari . . . . . . . . . . . . . . 4.3.1 Conversioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2 Verificare se un linguaggio regolare è vuoto . . . . . . . . . . 4.3.3 Appartenenza a un linguaggio regolare . . . . . . . . . . . . .
vii
. 79 . 80 . 82 . 84 . 85 . 86 . 86 . 91 . 97 . 101 . 103 . 103 . 104 . 106 . 108 . 109 . 109 . 110 . 110 . 111 . 112 . 112 . 114 . 116 . 117 . 117 119
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. 119 . 120 . 121 . 123 . 124 . 125 . 130 . 132 . 133 . 138 . 141 . 142 . 144 . 145
viii Sommario
4.4
4.5 4.6 5
4.3.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . Equivalenza e minimizzazione di automi . . . . . . . . . 4.4.1 Verifica dell’equivalenza di stati . . . . . . . . . 4.4.2 Equivalenza di linguaggi regolari . . . . . . . . . 4.4.3 Minimizzazione di DFA . . . . . . . . . . . . . . 4.4.4 Perché il DFA minimo non può essere migliorato 4.4.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Grammatiche e linguaggi liberi dal contesto
5.1
5.2
5.3
5.4
5.5 5.6
Grammatiche libere dal contesto . . . . . . . . . . . . . . . . . . . 5.1.1 Un esempio informale . . . . . . . . . . . . . . . . . . . . . 5.1.2 Definizione delle grammatiche libere dal contesto . . . . . . 5.1.3 Derivazioni per mezzo di una grammatica . . . . . . . . . . 5.1.4 Derivazioni a sinistra e a destra . . . . . . . . . . . . . . . . 5.1.5 Il linguaggio di una grammatica . . . . . . . . . . . . . . . 5.1.6 Forme sentenziali . . . . . . . . . . . . . . . . . . . . . . . 5.1.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alberi sintattici . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Costruzione di alberi sintattici . . . . . . . . . . . . . . . . 5.2.2 Il prodotto di un albero sintattico . . . . . . . . . . . . . . . 5.2.3 Inferenza, derivazioni e alberi sintattici . . . . . . . . . . . . 5.2.4 Dalle inferenze agli alberi . . . . . . . . . . . . . . . . . . . 5.2.5 Dagli alberi alle derivazioni . . . . . . . . . . . . . . . . . . 5.2.6 Dalle derivazioni alle inferenze ricorsive . . . . . . . . . . . 5.2.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . Applicazioni delle grammatiche libere dal contesto . . . . . . . . . . 5.3.1 Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 YACC: un generatore di parser . . . . . . . . . . . . . . . . 5.3.3 Linguaggi di markup . . . . . . . . . . . . . . . . . . . . . 5.3.4 XML e DTD . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ambiguità nelle grammatiche e nei linguaggi . . . . . . . . . . . . . 5.4.1 Grammatiche ambigue . . . . . . . . . . . . . . . . . . . . 5.4.2 Eliminare le ambiguità da una grammatica . . . . . . . . . . 5.4.3 Derivazioni a sinistra come modo per esprimere l’ambiguità 5.4.4 Ambiguità inerente . . . . . . . . . . . . . . . . . . . . . . 5.4.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 146 . 146 . 146 . 149 . 151 . 154 . 156 . 156 . 157 159
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 159 . 160 . 161 . 163 . 165 . 167 . 168 . 169 . 171 . 171 . 173 . 174 . 175 . 176 . 180 . 181 . 182 . 182 . 184 . 185 . 188 . 194 . 195 . 195 . 197 . 200 . 201 . 203 . 204 . 205
Sommario
6
Automi a pila
6.1
6.2
6.3
6.4
6.5 6.6 7
Definizione di automa a pila . . . . . . . . . . . 6.1.1 Introduzione informale . . . . . . . . . 6.1.2 Definizione formale di automa a pila . . 6.1.3 Una notazione grafica per i PDA . . . . 6.1.4 Descrizioni istantanee di un PDA . . . . 6.1.5 Esercizi . . . . . . . . . . . . . . . . . I linguaggi di un PDA . . . . . . . . . . . . . . 6.2.1 Accettazione per stato finale . . . . . . 6.2.2 Accettazione per stack vuoto . . . . . . 6.2.3 Da stack vuoto a stato finale . . . . . . 6.2.4 Da stato finale a stack vuoto . . . . . . 6.2.5 Esercizi . . . . . . . . . . . . . . . . . Equivalenza di PDA e CFG . . . . . . . . . . . 6.3.1 Dalle grammatiche agli automi a pila . . 6.3.2 Dai PDA alle grammatiche . . . . . . . 6.3.3 Esercizi . . . . . . . . . . . . . . . . . Automi a pila deterministici . . . . . . . . . . . 6.4.1 Definizione di PDA deterministico . . . 6.4.2 Linguaggi regolari e PDA deterministici 6.4.3 DPDA e linguaggi liberi dal contesto . . 6.4.4 DPDA e grammatiche ambigue . . . . . 6.4.5 Esercizi . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . .
207
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
Proprietà dei linguaggi liberi dal contesto
7.1
7.2
7.3
ix
Forme normali per grammatiche libere dal contesto . . . . . . . 7.1.1 Eliminazione di simboli inutili . . . . . . . . . . . . . . 7.1.2 Calcolo dei simboli generatori e raggiungibili . . . . . . 7.1.3 Eliminazione di -produzioni . . . . . . . . . . . . . . . 7.1.4 Eliminazione delle produzioni unitarie . . . . . . . . . . 7.1.5 Forma normale di Chomsky . . . . . . . . . . . . . . . . 7.1.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Il pumping lemma per i linguaggi liberi dal contesto . . . . . . . 7.2.1 Dimensione degli alberi sintattici . . . . . . . . . . . . . 7.2.2 Enunciato del pumping lemma . . . . . . . . . . . . . . 7.2.3 Applicazioni del pumping lemma per i CFL . . . . . . . 7.2.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Proprietà di chiusura dei linguaggi liberi dal contesto . . . . . . 7.3.1 Sostituzione . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2 Applicazioni del teorema di sostituzione . . . . . . . . . 7.3.3 Inversione . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
207 207 209 211 212 215 216 217 218 218 221 223 224 225 228 232 233 234 234 236 236 237 238 239 241
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . 241 . . . . . 242 . . . . . 243 . . . . . 244 . . . . . 248 . . . . . 252 . . . . . 255 . . . . . 259 . . . . . 259 . . . . . 260 . . . . . 262 . . . . . 264 . . . . . 266 . . . . . 266 . . . . . 268 . . . . . 269
x Sommario
7.4
7.5 7.6 8
7.3.4 Intersezione con un linguaggio regolare . . . . . . . . . . . . . . . . 7.3.5 Omomorfismo inverso . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proprietà di decisione dei CFL . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1 Complessità delle conversioni fra CFG e PDA . . . . . . . . . . . . . 7.4.2 Tempo di esecuzione della conversione in forma normale di Chomsky 7.4.3 Verificare se un CFL è vuoto . . . . . . . . . . . . . . . . . . . . . . 7.4.4 Appartenenza a un CFL . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.5 Anteprima di problemi indecidibili per i CFL . . . . . . . . . . . . . 7.4.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Macchine di Turing: introduzione
8.1
8.2
8.3
8.4
8.5
Problemi che i calcolatori non possono risolvere . . . . . . . . . . . . . 8.1.1 Programmi che stampano “Ciao, mondo” . . . . . . . . . . . . 8.1.2 Un ipotetico verificatore di ciao-mondo . . . . . . . . . . . . . 8.1.3 Ridurre un problema a un altro . . . . . . . . . . . . . . . . . . 8.1.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La macchina di Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 La ricerca della soluzione a tutte le domande matematiche . . . 8.2.2 Notazione per la macchina di Turing . . . . . . . . . . . . . . . 8.2.3 Descrizioni istantanee delle macchine di Turing . . . . . . . . . 8.2.4 Diagrammi di transizione per le macchine di Turing . . . . . . . 8.2.5 Il linguaggio di una macchina di Turing . . . . . . . . . . . . . 8.2.6 Le macchine di Turing e l’arresto . . . . . . . . . . . . . . . . . 8.2.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tecniche di programmazione per le macchine di Turing . . . . . . . . . 8.3.1 Memoria nello stato . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 Tracce multiple . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3 Subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estensioni alla macchina di Turing semplice . . . . . . . . . . . . . . . 8.4.1 Macchine di Turing multinastro . . . . . . . . . . . . . . . . . . 8.4.2 Equivalenza di macchine di Turing mononastro e multinastro . . 8.4.3 Tempo di esecuzione e costruzione da n a un nastro . . . . . . . 8.4.4 Macchine di Turing nondeterministiche . . . . . . . . . . . . . 8.4.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Macchine di Turing ristrette . . . . . . . . . . . . . . . . . . . . . . . . 8.5.1 Macchine di Turing con nastri semi-infiniti . . . . . . . . . . . . 8.5.2 Macchine multistack . . . . . . . . . . . . . . . . . . . . . . . 8.5.3 Macchine a contatori . . . . . . . . . . . . . . . . . . . . . . . 8.5.4 La potenza delle macchine a contatori . . . . . . . . . . . . . .
. . . . . . . . . . . .
269 273 275 277 277 279 280 281 285 285 286 287 289
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . 289 . . . 290 . . . 292 . . . 295 . . . 298 . . . 298 . . . 299 . . . 300 . . . 301 . . . 304 . . . 308 . . . 308 . . . 309 . . . 311 . . . 311 . . . 312 . . . 314 . . . 315 . . . 317 . . . 317 . . . 318 . . . 319 . . . 321 . . . 322 . . . 325 . . . 325 . . . 328 . . . 330 . . . 331
Sommario
8.6
8.7 8.8 9
8.5.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le macchine di Turing e i computer . . . . . . . . . . . . . . . . . . . . . . . 8.6.1 Simulazione di una macchina di Turing da parte di un computer . . . 8.6.2 Simulazione di un computer da parte di una macchina di Turing . . . 8.6.3 Confronto dei tempi di esecuzione dei computer e delle macchine di Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Indecidibilità
9.1
9.2
9.3
9.4
9.5
9.6 9.7
Un linguaggio non ricorsivamente enumerabile . . . . . . . . . . 9.1.1 Enumerazione delle stringhe binarie . . . . . . . . . . . 9.1.2 Codici per le macchine di Turing . . . . . . . . . . . . . 9.1.3 Il linguaggio di diagonalizzazione . . . . . . . . . . . . 9.1.4 Dimostrazione che Ld non è ricorsivamente enumerabile 9.1.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Un problema indecidibile ma ricorsivamente enumerabile . . . . 9.2.1 Linguaggi ricorsivi . . . . . . . . . . . . . . . . . . . . 9.2.2 Complementi di linguaggi ricorsivi e RE . . . . . . . . . 9.2.3 Il linguaggio universale . . . . . . . . . . . . . . . . . . 9.2.4 Indecidibilità del linguaggio universale . . . . . . . . . . 9.2.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Problemi indecidibili relativi alle macchine di Turing . . . . . . 9.3.1 Riduzioni . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.2 Macchine di Turing che accettano il linguaggio vuoto . . 9.3.3 Il teorema di Rice e le proprietà dei linguaggi RE . . . . 9.3.4 Problemi sulle specifiche di macchine di Turing . . . . . 9.3.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Il problema di corrispondenza di Post . . . . . . . . . . . . . . . 9.4.1 Definizione del problema di corrispondenza di Post . . . 9.4.2 PCP modificato . . . . . . . . . . . . . . . . . . . . . . 9.4.3 Dimostrazione di indecidibilità di PCP: conclusione . . . 9.4.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Altri problemi indecidibili . . . . . . . . . . . . . . . . . . . . . 9.5.1 Problemi relativi a programmi . . . . . . . . . . . . . . 9.5.2 Indecidibilità dell’ambiguità delle CFG . . . . . . . . . 9.5.3 Il complemento di un linguaggio associato a una lista . . 9.5.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
xi 333 334 334 336
. 340 . 342 . 344 347
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 348 . 349 . 349 . 350 . 351 . 352 . 353 . 353 . 354 . 357 . 359 . 360 . 362 . 362 . 364 . 366 . 369 . 369 . 371 . 371 . 373 . 376 . 381 . 382 . 382 . 382 . 384 . 387 . 388 . 389
xii Sommario 10 Problemi intrattabili
391
10.1 Le classi P e N P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 10.1.1 Problemi risolvibili in tempo polinomiale . . . . . . . . . . . . . . . . 393 10.1.2 Un esempio: l’algoritmo di Kruskal . . . . . . . . . . . . . . . . . . . 393 10.1.3 Tempo polinomiale nondeterministico . . . . . . . . . . . . . . . . . . 396 10.1.4 Un esempio in N P : il problema del commesso viaggiatore . . . . . . . 397 10.1.5 Riduzioni polinomiali . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 10.1.6 Problemi NP-completi . . . . . . . . . . . . . . . . . . . . . . . . . . 399 10.1.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 10.2 Un problema NP-completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 10.2.1 Il problema della soddisfacibilità . . . . . . . . . . . . . . . . . . . . . 403 10.2.2 Rappresentazione di istanze di SAT . . . . . . . . . . . . . . . . . . . . 405 10.2.3 NP-completezza del problema SAT . . . . . . . . . . . . . . . . . . . . 406 10.2.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 10.3 Una versione ristretta di soddisfacibilità . . . . . . . . . . . . . . . . . . . . . 412 10.3.1 Forme normali di espressioni booleane . . . . . . . . . . . . . . . . . . 413 10.3.2 Conversione in CNF di espressioni booleane . . . . . . . . . . . . . . . 414 10.3.3 NP-completezza di CSAT . . . . . . . . . . . . . . . . . . . . . . . . . 416 10.3.4 NP-completezza di 3SAT . . . . . . . . . . . . . . . . . . . . . . . . . 421 10.3.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 10.4 Altri problemi NP-completi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 10.4.1 Descrivere problemi NP-completi . . . . . . . . . . . . . . . . . . . . 423 10.4.2 Il problema dell’insieme indipendente . . . . . . . . . . . . . . . . . . 424 10.4.3 Il problema della copertura per nodi . . . . . . . . . . . . . . . . . . . 427 10.4.4 Il problema del circuito hamiltoniano orientato . . . . . . . . . . . . . . 429 10.4.5 Circuiti hamiltoniani non orientati e TSP . . . . . . . . . . . . . . . . . 435 10.4.6 Riepilogo dei problemi NP-completi . . . . . . . . . . . . . . . . . . . 436 10.4.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 10.5 Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 10.6 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 11 Altre classi di problemi
11.1 Complementi dei linguaggi in N P . . . . . . . . . . . . . . . 11.1.1 La classe di linguaggi co- N P . . . . . . . . . . . . . 11.1.2 Problemi NP-completi e co- N P . . . . . . . . . . . . 11.1.3 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Problemi risolvibili in spazio polinomiale . . . . . . . . . . . . 11.2.1 Macchine di Turing in spazio polinomiale . . . . . . . 11.2.2 Le relazioni di PS e N PS con altre classi . . . . . . 11.2.3 Spazio polinomiale deterministico e nondeterministico 11.3 Un problema completo per PS . . . . . . . . . . . . . . . . . 11.3.1 PS-completezza . . . . . . . . . . . . . . . . . . . . . 11.3.2 Formule booleane con quantificatori . . . . . . . . . .
443
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....... . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . 444 . . 444 . . 445 . . 446 . . 447 . . 447 . . 448 . . 449 . . 451 . . 451 . . 453
Sommario
11.4
11.5
11.6 11.7
11.3.3 Valutazione di formule booleane con quantificatori . . . 11.3.4 PS-completezza del problema QBF . . . . . . . . . . . . 11.3.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Classi di linguaggi basate sulla randomizzazione . . . . . . . . . 11.4.1 Quicksort: un esempio di algoritmo randomizzato . . . . 11.4.2 Un modello di macchina di Turing con randomizzazione 11.4.3 Il linguaggio di una macchina di Turing randomizzata . . 11.4.4 La classe RP . . . . . . . . . . . . . . . . . . . . . . . 11.4.5 Riconoscimento di linguaggi in RP . . . . . . . . . . . 11.4.6 La classe ZPP . . . . . . . . . . . . . . . . . . . . . . 11.4.7 Relazioni tra RP e ZPP . . . . . . . . . . . . . . . . . 11.4.8 Relazioni con le classi P e N P . . . . . . . . . . . . . . Complessità e numeri primi . . . . . . . . . . . . . . . . . . . . 11.5.1 L’importanza della verifica di primalità . . . . . . . . . . 11.5.2 Introduzione all’aritmetica modulare . . . . . . . . . . . 11.5.3 La complessità del calcolo in aritmetica modulare . . . . 11.5.4 Verifica di primalità in tempo polinomiale randomizzato . 11.5.5 Verifiche di primalità nondeterministiche . . . . . . . . . 11.5.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . Riepilogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
A La gerarchia di Chomsky
A.1 A.2
A.3
Grammatiche . . . . . . . . . . . . . . . . . . . . . . A.1.1 Definizione di grammatica . . . . . . . . . . A.1.2 Derivazioni e linguaggi . . . . . . . . . . . . Tipi di grammatiche e gerarchia di Chomsky . . . . . A.2.1 Linguaggi di tipo 0 . . . . . . . . . . . . . . A.2.2 Linguaggi di tipo 1 o dipendenti dal contesto . A.2.3 Linguaggi di tipo 2 e di tipo 3 . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . .
Indice analitico
xiii . 454 . 456 . 460 . 461 . 461 . 462 . 463 . 465 . 467 . 468 . 469 . 470 . 470 . 471 . 473 . 475 . 476 . 477 . 480 . 480 . 482 485
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. 485 . 486 . 487 . 488 . 490 . 490 . 491 . 492 493
Prefazione all’edizione italiana
Questo libro ha una lunga storia. Nel 1969, John E. Hopcroft e Jeffrey D. Ullman pubblicarono per Addison-Wesley “Formal Languages and Their Relation to Automata”, uno dei primi libri dedicati alla presentazione sistematica della teoria dei linguaggi formali e degli automi. Il volume, completamente rivisto e notevolmente arricchito, venne riproposto nel 1979 dagli stessi autori e per lo stesso editore con il titolo “Introduction to Automata Theory, Languages, and Computation”. Dopo più di vent’anni, nel 2001, venne pubblicata una nuova edizione, questa volta anche con il contributo di Rajeev Motwani, profondamente modificata sia per la scelta dei contenuti (in gran parte ridotti rispetto alle edizioni precedenti), sia per lo stile della presentazione, meno formale. Rimandiamo alla prefazione degli Autori per le motivazioni che li hanno indotti a questa scelta. È sorprendente che questo famoso libro sia apparso in edizione italiana solo nel 2003, grazie a Pearson Education che ha tradotto la seconda edizione. Questo volume, seconda edizione italiana, è frutto di una completa revisione della edizione italiana precedente, nonché di un aggiornamento alla terza edizione americana, pubblicata nel 2007. Per completezza, ho ritenuto utile integrare questa edizione scrivendo una breve appendice relativa alle grammatiche e alla gerarchia di Chomsky. Questo argomento, forse “snobbato” negli Stati Uniti, è in genere presentato nei corsi di Linguaggi Formali delle università italiane ed è utile per fornire un inquadramento più preciso e completo di queste tematiche. Inoltre ritengo che sia un interessante arricchimento (che tra l’altro non richiede molto spazio né molto tempo per la presentazione in un corso) alla formazione culturale degli studenti, che può fornire uno stimolo per ulteriori letture e approfondimenti a chi sia più interessato a questi argomenti. Come affermato dagli Autori nella prefazione, il ruolo della teoria degli automi e dei linguaggi è cambiato negli ultimi venti anni. La disciplina è ampiamente riconosciuta come fondazionale nell’informatica. Gli automi e i linguaggi sono gli strumenti formali di riferimento per svariati settori e applicazioni. Tuttavia, a differenza di quanto affermato nella prefazione scritta dagli Autori, voglio sottolineare che esiste tuttora una fervida attività di ricerca in quest’area, che ha ricevuto proprio in questi ultimi anni nuovi significativi contributi. Allo stesso tempo, è doveroso segnalare che molti problemi rilevanti sono tuttora aperti. 1 1 Per
approfondimenti su questi punti, si veda ad esempio S. Yu “A renaissance of Automata Theory?”, Bulletin of EATCS 72 (2000), pp. 270-272, e J. Hromkovi˘c “Descriptional complexity of finite automata: concepts and open problems”, Journal of Automata, Languages and Combinatorics 7 (2002), pp. 519-531.
xvi Prefazione all’edizione italiana Ritengo questo libro uno strumento prezioso, contenente argomenti che devono fare necessariamente parte del bagaglio culturale di ogni laureato (anche di primo livello) nel settore informatico. Il libro è permeato dallo sforzo continuo di fornire, accanto alla teoria, esempi reali e pratici, al fine di mostrare come gli automi e i linguaggi formali siano fondamentali nell’informatica, anche a livello delle applicazioni. Tra la pubblicazione della seconda e della terza edizione americana, vi è stata un’importante novità, che tra l’altro è un’ulteriore conferma della vitalità e dell’importanza del settore. All’inizio di questo nuovo millennio è stata fatta l’importante scoperta che la verifica di primalità può essere effettuata in tempo polinomiale. In questa terza edizione, l’ultimo capitolo, dedicato in gran parte al test di primalità, è stato modificato menzionando brevemente questo nuovo risultato. Dalla versione americana traspare un certo rammarico da parte degli Autori per questa scoperta. In effetti essa va nella direzione opposta rispetto a quanto è stato creduto (e insegnato come probabilmente vero) per lungo tempo da molti. Ulteriori progressi in questa direzione potrebbero avere importanti e sconvolgenti implicazioni. Se ad esempio venisse trovato un algoritmo deterministico che in tempo polinomiale trova i fattori di un numero composto, i sistemi crittografici attualmente utilizzati risulterebbero immediatamente insicuri.
Ringraziamenti Desidero ringraziare Pearson Education per la fiducia con la quale mi ha affidato la revisione di questo libro. Ringrazio in particolare Marlene Farina che ha dato l’avvio a questo progetto e Alessandra Piccardo che ne ha curato la prosecuzione, Micaela Guerra per la gestione precisa e puntuale delle questioni organizzative e per la tempestività nel rispondere a ogni genere di domanda, Federica Sonzogno per gli utili e preziosi suggerimenti riguardanti lo stile e l’impaginazione.
Giovanni Pighizzini Milano, febbraio 2009
Prefazione
Nella prefazione all’edizione 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 un’involuzione, ma questa nuova veste ci soddisfa per diverse ragioni. Innanzitutto nel 1979 la teoria degli automi e dei linguaggi era ancora un’area 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 vent’anni è 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 formavano 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 vent’anni l’informatica 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 è 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 convinti 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 le tecniche 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 dell’edizione pre-
xviii Prefazione cedente con esempi di come i concetti 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. Un’ultima spiegazione dell’ampliamento e al contempo riduzione del libro risiede nell’impiego di due sistemi di composizione tipografica, TEX e LATEX, 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 LATEX. 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. Presumiamo 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 A. Se alcune parti di A ammettono soluzione, ci si può aspettare che lo stesso valga anche per le corrispondenti parti di B .
Supporto in rete La home page del libro è
Vi si trovano le soluzioni degli esercizi segnalati da un asterisco, gli errata corrige e altro materiale utile. A mano a mano che le lezioni procedono intendiamo pubblicare le dispense del nostro corso, inclusi esercizi e testi d’esame.
Prefazione
xix
Ringraziamenti La stesura di parte del primo capitolo è stata influenzata da una dispensa di Craig Silverstein su come scrivere le dimostrazioni. Commenti e segnalazioni di errori sulle bozze della seconda edizione del libro (2000) sono giunti da Zoe Abrams, George Candea, Haowen Chen, Byong-Gun Chun, Jeffrey Shallit, Bret Taylor, Jason Townsend ed Erik Uzureau. Abbiamo anche ricevuto diverse e-mail che segnalavano errori nella seconda edizione di questo libro. Ringraziamo tutti coloro che ci hanno fatto queste segnalazioni. I loro nomi sono indicati negli errata corrige pubblicati on-line. Un particolare ringraziamento per le numerose e significative segnalazioni a Zeki Bayram, Sebastian Hick, Kang-Rae Lee, Christian Lemburg, Nezam Mahdavi-Amiri, Dave Maier, A. P. Marathe, Mark Meuleman, Mustafa Sait-Ametov, Alexey Sarytchev, Jukka Suomela, Rod Topor, Po-Lian Tsai, Tom Whaley, Aaron Windsor, e Jacinth H.T. Wu. Riconosciamo volentieri il loro contributo. Gli errori che restano sono, ovviamente, da imputare a noi.
John E. Hopcroft Rajeev Motwani Jeffrey D. Ullman Ithaca NY e Stanford CA, febbraio 2006