Sei sulla pagina 1di 328

Linguaggi, Modelli, Complessit`a

Giorgio Ausiello
Universit`a di Roma La Sapienza
Fabrizio dAmore
Universit`a di Roma La Sapienza
Giorgio Gambosi
Universit`a di Roma Tor Vergata
Questo documento `e stato
scritto con lausilio del sistema
L
A
T
E
X2.
Stampato il 10 aprile 2002.
iii
Da queste premesse incontrovertibili dedusse che la Biblioteca `e totale, e che i
suoi scaali registrano tutte le possibili combinazioni dei venticinque simboli
ortograci (numero, anche se vastissimo, non innito) cio`e tutto ci`o ch`e dato
di esprimere, in tutte le lingue. Tutto: la storia minuziosa dellavvenire, le
autobiograe degli arcangeli, il catalogo fedele della Biblioteca, migliaia e
migliaia di cataloghi falsi, la dimostrazione della falsit`a di questi cataloghi,
la dimostrazione della falsit`a del catalogo autentico, levangelo gnostico di
Basilide, il commento di questo evangelo, il commento del commento di questo
evangelo, il resoconto veridico della tua morte, la traduzione di ogni libro in
tutte le lingue, le interpolazioni di ogni libro in tutti i libri.
J.L. Borges La Biblioteca di Babele
iv
Indice
Capitolo 1 Concetti matematici di base 1
1.1 Insiemi, relazioni e funzioni . . . . . . . . . . . . . . . . . . . . 1
1.2 Strutture algebriche elementari . . . . . . . . . . . . . . . . . . 21
1.3 Caratteristiche elementari dei linguaggi . . . . . . . . . . . . . 25
1.4 Notazione asintotica . . . . . . . . . . . . . . . . . . . . . . . . 32
Capitolo 2 Linguaggi formali 35
2.1 Grammatiche di Chomsky . . . . . . . . . . . . . . . . . . . . . 36
2.2 Grammatiche con -produzioni . . . . . . . . . . . . . . . . . . 48
2.3 Linguaggi lineari . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.4 Forma Normale di Backus e diagrammi sintattici . . . . . . . . 55
2.5 Accettazione e riconoscimento di linguaggi . . . . . . . . . . . . 58
Capitolo 3 Linguaggi regolari 71
3.1 Automi a stati niti . . . . . . . . . . . . . . . . . . . . . . . . 71
3.2 Automi a stati niti non deterministici . . . . . . . . . . . . . . 77
3.3 Relazioni tra ASFD, ASFND e grammatiche di tipo 3 . . . . . 83
3.4 Il pumping lemma per i linguaggi regolari . . . . . . . . . . . 92
3.5 Propriet`a di chiusura dei linguaggi regolari . . . . . . . . . . . 94
3.6 Espressioni regolari e grammatiche regolari . . . . . . . . . . . 102
3.7 Predicati decidibili sui linguaggi regolari . . . . . . . . . . . . . 110
3.8 Il teorema di Myhill-Nerode . . . . . . . . . . . . . . . . . . . . 113
Capitolo 4 Linguaggi non contestuali 121
4.1 Forme ridotte e forme normali . . . . . . . . . . . . . . . . . . . 123
4.2 Il pumping lemma per i linguaggi CF . . . . . . . . . . . . . 134
4.3 Chiusura di operazioni su linguaggi CF . . . . . . . . . . . . . . 136
4.4 Predicati decidibili sui linguaggi CF . . . . . . . . . . . . . . . 138
4.5 Automi a pila e linguaggi CF . . . . . . . . . . . . . . . . . . . 139
4.6 Automi a pila deterministici . . . . . . . . . . . . . . . . . . . . 153
4.7 Analisi sintattica e linguaggi CF deterministici . . . . . . . . . 155
4.8 Grammatiche e linguaggi ambigui . . . . . . . . . . . . . . . . . 159
4.9 Algoritmi di riconoscimento di linguaggi CF . . . . . . . . . . . 163
Capitolo 5 Macchine di Turing 169
5.1 Macchine di Turing a nastro singolo . . . . . . . . . . . . . . . 170
5.2 Calcolo di funzioni e MT deterministiche . . . . . . . . . . . . . 178
5.3 Calcolabilit`a secondo Turing . . . . . . . . . . . . . . . . . . . . 180
vi Indice
5.4 Macchine di Turing multinastro . . . . . . . . . . . . . . . . . . 181
5.5 Macchine di Turing non deterministiche . . . . . . . . . . . . . 192
5.6 Riduzione delle Macchine di Turing . . . . . . . . . . . . . . . . 199
5.7 Descrizione linearizzata delle MT . . . . . . . . . . . . . . . . . 203
5.8 La macchina di Turing universale . . . . . . . . . . . . . . . . . 210
5.9 Il problema della terminazione . . . . . . . . . . . . . . . . . . 214
5.10 Linguaggi di tipo 0 e MT . . . . . . . . . . . . . . . . . . . . . 215
5.11 Linguaggi di tipo 1 e automi lineari . . . . . . . . . . . . . . . . 219
Capitolo 6 Modelli Imperativi e Funzionali 223
6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
6.2 Macchine a registri . . . . . . . . . . . . . . . . . . . . . . . . . 224
6.3 Macchine a registri e macchine di Turing . . . . . . . . . . . . . 230
6.4 Macchine a registri e linguaggi imperativi . . . . . . . . . . . . 234
6.5 Funzioni ricorsive . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.6 Funzioni ricorsive e linguaggi imperativi . . . . . . . . . . . . . 242
6.7 Funzioni ricorsive e linguaggi funzionali . . . . . . . . . . . . . 247
Capitolo 7 Teoria generale della calcolabilit`a 251
7.1 Tesi di Church-Turing . . . . . . . . . . . . . . . . . . . . . . . 251
7.2 Enumerazione di funzioni ricorsive . . . . . . . . . . . . . . . . 252
7.3 Propriet`a di enumerazioni di funzioni ricorsive . . . . . . . . . 256
7.4 Funzioni non calcolabili . . . . . . . . . . . . . . . . . . . . . . 259
7.5 Indecidibilit`a in matematica ed informatica . . . . . . . . . . . 263
7.6 Teoremi di Kleene e di Rice . . . . . . . . . . . . . . . . . . . . 266
7.7 Insiemi decidibili e semidecidibili . . . . . . . . . . . . . . . . . 269
Capitolo 8 Teoria della Complessit`a 277
8.1 Valutazioni di complessit`a . . . . . . . . . . . . . . . . . . . . . 278
8.2 Tipi di problemi . . . . . . . . . . . . . . . . . . . . . . . . . . 281
8.3 Complessit`a temporale e spaziale . . . . . . . . . . . . . . . . . 284
8.4 Teoremi di compressione ed accelerazione . . . . . . . . . . . . 288
8.5 Classi di complessit`a . . . . . . . . . . . . . . . . . . . . . . . . 293
8.6 Teoremi di gerarchia . . . . . . . . . . . . . . . . . . . . . . . . 294
8.7 Relazioni tra misure diverse . . . . . . . . . . . . . . . . . . . . 300
8.8 Riducibilit`a tra problemi diversi . . . . . . . . . . . . . . . . . . 305
Capitolo 9 Trattabilit`a ed intrattabilit`a 311
9.1 La classe P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
9.2 La classe NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
9.3 NP-completezza . . . . . . . . . . . . . . . . . . . . . . . . . . 326
9.4 Ancora sulla classe NP . . . . . . . . . . . . . . . . . . . . . . . 337
9.5 La gerarchia polinomiale . . . . . . . . . . . . . . . . . . . . . . 344
9.6 La classe PSPACE . . . . . . . . . . . . . . . . . . . . . . . . . 350
Indice vii
Capitolo A Note storiche e bibliograche 341
viii Indice
Introduzione
x Indice
Capitolo 1
Concetti matematici di base
In questo primo capitolo vengono richiamate, in modo sintetico, alcune nozio-
ni matematiche preliminari riguardanti concetti che sono alla base degli argo-
menti trattati nel volume: relazioni, funzioni, strutture algebriche, ecc. Inoltre
vengono introdotte denizioni, propriet`a elementari ed operazioni su linguag-
gi, strutture matematiche che hanno un ruolo fondamentale in informatica,
dotate di propriet`a insiemistiche ed algebriche particolarmente interessanti.
Inne vengono illustrate alcune delle tecniche che saranno pi` u frequentemente
utilizzate nella dimostrazione di teoremi nel corso dei successivi capitoli.
Come si `e detto nella premessa, in questo capitolo assumeremo noti il con-
cetto primitivo di insieme e la denizione delle principali operazioni su insiemi
(unione, intersezione, complementazione). Tra gli insiemi cui ci riferiremo, al-
cuni sono particolarmente importanti; essi sono riportati in Tabella 1.1 insieme
ai simboli utilizzati per rappresentarli. Assumeremo anche noti i signicati dei
connettivi logici (and, or, not, implica, equivale a) e dei quanticatori (esiste,
per ogni), che utilizzeremo anche al di fuori del contesto di speciche teo-
rie logiche, semplicemente come notazione per esprimere in modo formale e
sintetico i concetti ad essi corrispondenti.
1.1 Insiemi, relazioni e funzioni. Cardinalit`a e contabilit`a degli
insiemi.
1.1.1 Insieme delle parti
Sia dato un insieme A. Ricordiamo che con x A indichiamo che lelemento
x appartiene ad A, con B A indichiamo che linsieme B `e un sottoinsieme
di A e con B A indichiamo che B `e un sottoinsieme proprio di A. Se A `e un
insieme costituito da un numero nito n di elementi, con [ A[ indichiamo la sua
2 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
simbolo descrizione
IN naturali
IN
+
naturali positivi
ZZ interi
ZZ
+
interi positivi (coincide con IN
+
)
ZZ

interi negativi
Q razionali
Q
+
razionali positivi
Q

razionali negativi
IR reali
IR
+
reali positivi
IR

reali negativi
Tabella 1.1 Simboli adottati per indicare alcuni insiemi di particolare interesse.
cardinalit`a, cio`e il numero di elementi che lo compongono e quindi abbiamo
[ A[= n. Inne con indichiamo linsieme vuoto, tale cio`e che [ [= 0 .
Denizione 1.1 Linsieme composto da tutti i sottoinsiemi di un insieme A
si dice insieme delle parti di A, e si indica con T(A)
Si noti che T(A) contiene A e linsieme vuoto .
`
E facile dimostrare che se [ A[ `e nita e pari ad n allora [ T(A) [ `e pari a
2
n
: per questa ragione linsieme T(A) viene anche indicato con 2
A
.
Esercizio 1.1 Dimostrare che se A `e un insieme nito [ 2
A
[= 2
|A|
.
Denizione 1.2 Due insiemi A e B si dicono uguali, e si scrive A = B, se
ogni elemento di A `e anche elemento di B e, viceversa, se ogni elemento di B
`e anche elemento di A, cio`e
A = B(A B B A).
1.1.2 Principio di Induzione Matematica
Nel caso in cui si debbano dimostrare propriet`a relative ad insiemi niti, in
teoria si pu`o sempre pensare di vericare esaustivamente le propriet`a su tutti
gli elementi, per quanto tale procedimento potrebbe risultare non praticabile
per insiemi aventi numerosi elementi. Nel caso in cui si debbano dimostrare
1.1. INSIEMI, RELAZIONI E FUNZIONI 3
propriet`a relative ad insiemi inniti, tale procedimento `e chiaramente non ac-
cettabile, nemmeno in teoria: per questo motivo `e necessario utilizzare metodi
adeguati a questo genere di insiemi.
Un metodo particolarmente utile per dimostrare propriet`a dei numeri na-
turali `e il principio di induzione matematica. Questo principio aerma quanto
segue.
Data una proposizione P(n) denita per un generico numero
naturale n, si ha che essa `e vera per tutti i naturali se
P(0) `e vera (passo base dellinduzione);
per ogni naturale k, P(k) vera (ipotesi induttiva) implica
P(k + 1) vera (passo induttivo).
Esempio 1.1 Un classico esempio di dimostrazione per induzione matematica `e quel-
lo della formula che esprime il valore della somma dei naturali non superiori ad
n
n

i=0
i =
n(n + 1)
2
.
Questa relazione pu`o essere dimostrata per induzione osservando che per quanto
riguarda il passo base si ha che
0

i=0
i =
0(0 + 1)
2
= 0,
mentre per quanto riguarda il passo induttivo si ha
k+1

i=0
i =
k

i=0
i + (k + 1) =
k(k + 1)
2
+ (k + 1) =
k
2
+ 3k + 2
2
=
(k + 1)(k + 2)
2
.
Il che prova lasserto.
Una versione pi` u generale del principio di induzione matematica aerma
quanto segue.
Data una proposizione P(n) denita per n n
0
(con n
0
intero non
negativo) si ha che essa `e vera per tutti gli n n
0
se:
P(n
0
) `e vera (passo base dellinduzione);
per ogni naturale k n
0
, P(k) vera (ipotesi induttiva)
implica P(k + 1) vera (passo induttivo).
4 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Ci`o `e giusticato dallosservazione che applicare la versione generalizzata allo
scopo di dimostrare che P(n) `e vera per ogni n n
0
`e equivalente a dimostrare
che la proposizione P
n
0
(n) P(n n
0
) `e vera per ogni naturale. Applicare
dunque la versione generalizzata, per un qualsiasi n
0
0, equivale ad applicare
quella originale modicando leggermente la proposizione P qualora sia n
0
> 0.
Anche il metodo sia applicato correttamente `e necessario che il passo
induttivo sia valido per ogni valore di k n
0
.
Esercizio 1.2 Dimostrare per induzione che

n1
i=0
2
i
= 2
n
1 per n 1.
Si noti che, applicando in modo non corretto il principio di induzione
matematica, si pu`o erroneamente giungere alla conclusione che in un branco
di cavalli, tutti gli esemplari hanno il manto dello stesso colore. Si consideri il
seguente ragionamento:
Passo base
Nel caso di un solo cavallo il predicato `e senzaltro vero.
Passo induttivo
Si consideri un qualunque insieme di n+1 cavalli; allontanando momen-
taneamente un cavallo da tale branco, diciamo il cavallo c
i
, otteniamo
un branco di n cavalli che, per ipotesi induttiva, `e costituito da cavalli
con il manto di uno stesso colore . Se riportiamo c
i
nel branco, e suc-
cessivamente allontaniamo c
j
,= c
i
otteniamo di nuovo un insieme di n
cavalli che, per ipotesi induttiva, `e costituito da cavalli con il manto di
uno stesso colore . Dunque c
i
ha colore e c
j
ha colore . Poiche nel
branco ci sono n1 cavalli che non sono mai stati allontanati, e poiche il
manto di questi non pu`o aver cambiato colore, ne segue necessariamente
che = e che c
i
, c
j
e gli altri n 1 cavalli hanno tutti il manto del
medesimo colore.
Esercizio 1.3 Che errore `e stato commesso nellapplicazione del principio di induzio-
ne?
Nel seguito utilizzeremo frequentemente dimostrazioni per induzione. Si
noti che, in alcuni casi, si far`a uso di una formulazione del principio di induzio-
ne pi` u forte di quella fornita precedentemente. Tale principio viene chiamato
principio di induzione completa ed aerma quanto segue.
Data una proposizione P(n) denita per un generico numero
naturale n n
0
si ha che essa `e vera per tutti gli n n
0
se:
P(n
0
) `e vera (passo base dellinduzione);
per ogni naturale k n
0
, P(i) vera per ogni i, n
0
i k
(ipotesi induttiva), implica P(k + 1) vera (passo induttivo).
1.1. INSIEMI, RELAZIONI E FUNZIONI 5
Esempio 1.2 Supponiamo di voler dimostrare la proposizione:
Ogni intero n 2 `e divisibile per un numero primo.
Il passo base dellinduzione `e costituito dal fatto che lasserto `e vero per n = 2.
Consideriamo ora un generico numero k > 2. Se k `e composto, allora esso `e
divisibile per due interi k
1
e k
2
entrambi minori di k. Poich`e per ipotesi induttiva sia
k
1
che k
2
sono divisibili per un numero primo (ad esempio p
1
e p
2
, rispettivamente),
ne segue che anche k `e divisibile per p
1
(e per p
2
). Se, al contrario, k `e un numero
primo, allora esso `e divisibile per se stesso. Ne segue dunque che lasserto `e vericato
per ogni n 2.
In molte applicazioni il principio di induzione completa risulta pi` u comodo da
utilizzare rispetto al principio di induzione matematica. Nellesempio abbiamo
infatti visto che la validit`a della propriet`a di interesse per un intero k non
sembra potersi semplicemente inferire dalla sola validit`a della propriet`a per il
valore k 1.
Peraltro si pu`o osservare che il principio di induzione matematica implica
il principio di induzione completa, e viceversa.
Teorema 1.1 Per ogni pressata propriet`a P il principio di induzione mate-
matica ed il principio di induzione completa sono equivalenti.
Dimostrazione. Supponiamo per semplicit`a che la base dellinduzione sia
n
0
= 0. Si osservi che i due principi possono essere rispettivamente formulati
nel seguente modo:
1. P(0) k

(P(k

) P(k

+ 1)) nP(n)
2. P(0) k

(P(0) . . . P(k

) P(k

+ 1)) nP(n).
Chiaramente, se P(0) `e falso o `e vero che nP(n), lequivalenza `e banalmente
dimostrata.
Se, al contrario, P(0) `e vera ed `e falso che nP(n) allora si deve dimostrare
lequivalenza dei termini intermedi delle disgiunzioni. Chiaramente dal fatto
che esiste k

tale che P(0) . . . P(k

) P(k

+ 1) sia vero si pu`o dedurre


che esiste k

= k

che verica la congiunzione P(k

) P(k

+1). Viceversa se
disponiamo di k

che verica P(k

) P(k

+1) possiamo osservare che o P(i)


`e vera per ogni i, 0 i k

e quindi in tal caso k

= k

, o esiste un valore
0 k

< k

tale che P(0) . . . P(k

) P(k

+ 1). 2
Esercizio 1.4 I numeri di Fibonacci sono deniti mediante le seguenti regole: F
0
= 1,
F
1
= 1 e F
n
= F
n1
+F
n2
per n 2.
Utilizzando il principio di induzione completa si dimostri che, per ogni n 2, dato
un qualsivoglia intero positivo k, 1 k n, F
n
= F
k
F
nk
+F
k1
F
n(k+1)
.
6 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
1.1.3 Relazioni
Siano dati due insiemi A e B.
Denizione 1.3 Il prodotto cartesiano di A e B, denotato con A B, `e
linsieme
C = x, y) [ x A y B,
cio`e C `e costituito da tutte le possibili coppie ordinate ove il primo elemento
appartiene ad A ed il secondo a B
1
.
Il prodotto cartesiano gode della propriet`a associativa, mentre non gode di
quella commutativa.
Generalmente si usa la notazione A
n
per indicare il prodotto cartesiano di
A con se stesso, ripetuto n volte, cio`e per indicare
A A.
. .
n volte
Si noti che se A = o B = allora AB = .
Denizione 1.4 Una relazione n-aria R su A
1
, A
2
, . . . , A
n
`e un sottoinsieme
del prodotto cartesiano A
1
A
n
R A
1
A
n
.
Il generico elemento di una relazione viene indicato con il simbolo
a
1
, a
2
, . . . , a
n
) R,
oppure con il simbolo
R(a
1
, . . . , a
n
);
n viene detto arit`a della relazione R. Nel caso delle relazioni binarie (n = 2)
si usa anche la notazione a
1
Ra
2
.
Esempio 1.3 La relazione binaria minore di denita sui naturali, `e linsieme R
IN
2
denito da R = x, y) IN
2
[ z IN(z ,= 0 x +z = y).
Esempio 1.4 La relazione quadrato di denita sui naturali `e linsieme R IN
2
R =
_
x, y) [ x
2
= y
_
.
Relazioni che godono di propriet`a particolarmente interessanti sono le cosid-
dette relazioni dordine e le relazioni dequivalenza.
1
Quando considereremo una coppia di simboli, useremo le parentesi angolari se lordine
con cui si considerano gli elementi `e signicativo, le normali parentesi tonde se lordine non
`e signicativo. Cos` le coppie a, b e b, a sono distinte, mentre non lo sono (a, b) e (b, a)
1.1. INSIEMI, RELAZIONI E FUNZIONI 7
Denizione 1.5 Una relazione R A
2
si dice relazione dordine se per ogni
x, y, z A valgono le seguenti propriet`a
1. x, x) R (riessivit`a),
2. x, y) R y, x) Rx = y (antisimmetria),
3. x, y) R y, z) R x, z) R (transitivit`a).
Un insieme A su cui `e denita una relazione dordine viene detto insieme
parzialmente ordinato.
Denizione 1.6 Una relazione dordine R A
2
tale che
a, b) A
2
aRb bRa,
dove cio`e ogni elemento `e in relazione con ogni altro elemento, si dice relazione
di ordine totale.
Esempio 1.5 La relazione `e una relazione dordine su IN. In questo caso lordi-
namento `e totale in quanto per ogni x ed y si ha che x, y) R oppure che y, x) R,
oppure valgono entrambe, nel qual caso si ha che x = y, per antisimmetria.
Esercizio 1.5 Dimostrare che la relazione su IN non `e una relazione dordine.
Denizione 1.7 Una relazione R A
2
si dice relazione dequivalenza se,
per ogni x, y, z A, valgono le seguenti propriet`a
1. x, x) R (riessivit`a),
2. x, y) Ry, x) R (simmetria),
3. x, y) R y, z) Rx, z) R (transitivit`a).
Esempio 1.6 Consideriamo linsieme delle coppie n, m) con n IN ed m IN
+
. La
relazione
E =
_
u, v), p, q)) [ uq = vp
_
`e una relazione dequivalenza.
Un insieme A su cui sia denita una relazione dequivalenza R si pu`o par-
tizionare in sottoinsiemi, detti classi dequivalenza, ciascuno dei quali `e un
sottoinsieme massimale che contiene solo elementi tra loro equivalenti. Dati
un insieme A ed una relazione dequivalenza R su A
2
, linsieme delle classi
dequivalenza di A rispetto a R `e detto insieme quoziente, e viene normalmen-
te denotato con A/R. I suoi elementi vengono denotati con [a], dove a A `e
un rappresentante della classe dequivalenza: [a] denota cio`e linsieme degli
elementi equivalenti ad a.
8 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Esempio 1.7 Dato un intero k, deniamo la relazione
k
, detta congruenza modulo
k, su IN
2
nel seguente modo:
n
k
m esistono q, q

, r, con 0 r < k, tali che


_
n = qk +r
m = q

k +r
Essa `e una relazione dequivalenza e le sue classi dequivalenza sono dette classi resto
rispetto alla divisione per k.
Denizione 1.8 Data una relazione dequivalenza R A
2
, si dice indice di
R, e si denota con ind(R), il numero di elementi di A/R.
Esercizio 1.6 Dato un intero k, qual `e lindice della relazione
k
?
Di particolare interesse godono, in informatica, le relazioni rappresentabili
mediante gra.
Denizione 1.9 Dato un insieme nito V ed una relazione binaria E V
V , la coppia V, E) si denisce grafo orientato.
Per visualizzare un grafo orientato si usa rappresentare gli elementi di V con
punti (detti nodi ) e le coppie i, j) di E con frecce da i a j (dette archi ).
Esempio 1.8 Sia dato linsieme V = A, B, C, D. Consideriamo la relazione
E = A, B), A, C), A, D), B, C), C, D), B, B), B, A).
Essa si pu`o rappresentare con il grafo orientato di Figura 1.1.
A
B
C
D
Figura 1.1 Esempio di relazione rappresentata mediante grafo orientato.
Se la relazione E gode della propriet`a simmetrica il grafo pu`o essere rappresen-
tato senza assegnare un orientamento agli archi. In tal caso la coppia V, E)
si denisce grafo non orientato o semplicemente grafo.
1.1. INSIEMI, RELAZIONI E FUNZIONI 9
1.1.4 Operazioni tra relazioni
Le operazioni che si possono denire per le relazioni non dieriscono molto da
quelle note per insiemi generici. Ad esempio lunione `e denita da
R
1
R
2
= x, y) [ x, y) R
1
x, y) R
2
,
mentre la complementazione `e denita da
R = x, y) [ x, y) , R.
Unoperazione che possiede caratteristiche interessanti `e la chiusura transitiva.
Denizione 1.10 Sia R una relazione su A
2
; si denisce chiusura transitiva
di R, denotata con R
+
, la relazione
R
+
= x, y) [ y
1
, . . . , y
n
A, con n 2, y
1
= x, y
n
= y, tali che
y
i
, y
i+1
) R, i = 1, . . . , n 1.
In alcuni casi `e interessante denire la chiusura transitiva e riessiva.
Denizione 1.11 Sia R una relazione su A
2
; si denisce chiusura transitiva
e riessiva di R, denotata con R

, la relazione
R

= R
+
x, x) [ x A.
Esercizio 1.7 Sia dato un grafo orientato G = V, E) in cui V `e linsieme dei nodi
ed E V V `e linsieme degli archi orientati. Dimostrare che se R `e la relazione
tale che xRy se e solo se x = y oppure `e possibile raggiungere y a partire da x
percorrendo gli archi secondo il loro orientamento, allora R `e la chiusura transitiva e
riessiva della relazione E.
Esercizio 1.8 Dimostrare che dato un insieme nito V ed una qualsiasi relazione
binaria simmetrica E denita su V
2
, E

`e una relazione dequivalenza.


Esercizio 1.9 Dato un grafo orientato G = V, E), cosa rappresentano le classi
dequivalenza del grafo G

= V, E

)?
1.1.5 Funzioni
Un particolare tipo di relazioni sono le relazioni funzionali.
Denizione 1.12 Si dice che R X
1
. . . X
n
(n 2) `e una rela-
zione funzionale tra una (n 1)-pla di elementi e ln-esimo elemento, se
x
1
, . . . , x
n1
) X
1
. . . X
n1
esiste al pi` u un elemento x
n
X
n
tale
che x
1
, . . . , x
n
) R.
10 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
In tal caso si denisce funzione (o anche applicazione, o corrispondenza uni-
voca) la legge che allelemento x
1
, . . . , x
n1
) X
1
. . . X
n1
associa, se
esiste, quellunico elemento x
n
X
n
tale che x
1
, . . . , x
n
R. La notazione
usata per indicare lesistenza di una relazione di tipo funzionale tra gli elementi
x
1
, . . . , x
n
`e
f(x
1
, . . . , x
n1
) = x
n
.
In tal caso diciamo che la funzione f ha arit`a n1. Per convenzione si ammette
che una funzione possa anche avere arit`a 0. In tal modo un valore costante
a pu`o essere considerato come il risultato della applicazione di una funzione
0-aria: f() = a.
La notazione generalmente usata per indicare tra quali insiemi viene rea-
lizzata la corrispondenza, cio`e per stabilire il ruolo degli insiemi in gioco
`e:
f : X
1
X
n1
X
n
.
Lespressione X
1
X
n1
X
n
viene detta tipo della funzione f
2
.
Nel caso in cui X
1
= = X
n1
= X
n
= X il tipo della funzione pu`o essere
indicato da X
n1
X.
Denizione 1.13 Data una funzione f : X
1
X
n1
X
n
, linsieme
X
1
X
n1
viene detto dominio della funzione, dom(f), e linsieme X
n
viene detto codominio, cod(f).
Denizione 1.14 Data una funzione f : X
1
X
n1
X
n
si chiama
dominio di denizione della funzione f, e lo si indica con la notazione def (f),
il sottoinsieme di dom(f) cos` denito:
def (f) = x
1
, . . . , x
n1
) dom(f) [ x
n
cod(f)f(x
1
, . . . , x
n1
) = x
n

Il dominio di denizione di f `e cio`e linsieme di tutte le (n1)-ple x


1
, . . . , x
n1
per cui f(x
1
, . . . , x
n1
) `e denita.
Denizione 1.15 Si denisce immagine della funzione f, e lo si indica con
la notazione imm(f), il sottoinsieme di X
n
cos` denito:
imm(f) = x
n
X
n
[ x
1
, . . . , x
n1
) dom(f)f(x
1
, . . . , x
n1
) = x
n
.
Limmagine di f `e quindi linsieme di tutti i valori assunti da f.
Denizione 1.16 Data una funzione f e considerato un generico elemento
x
n
cod(f) si dice controimmagine (o bra) di x
n
, e lo si indica con f
1
(x
n
),
il seguente sottoinsieme del dominio di f
f
1
(x
n
) = x
1
, . . . x
n1
) [ x
1
, . . . x
n1
) def (f)
f(x
1
, . . . x
n1
) = x
n
.
2
Si noti che frequentemente, nellambito dei linguaggi di programmazione, per tipo di
una funzione si intende il tipo del valore restituito da essa.
1.1. INSIEMI, RELAZIONI E FUNZIONI 11
La controimmagine di x
n
`e cio`e linsieme di tutte le (n 1)-ple per cui f
assume valore x
n
.
Si noti che il dominio di denizione di una funzione pu`o o meno coinci-
dere con il dominio. Infatti, in molti casi `e necessario considerare funzioni
che per alcuni valori del dominio non sono denite. Ad esempio la funzione
f(x) = 1/ sin(x) ha come dominio linsieme IR ma come dominio di denizione
linsieme IRk [ k ZZ.
Denizione 1.17 Una funzione f : X
1
. . . X
n1
X
n
viene detta totale
se def (f) = dom(f). Nel caso pi` u generale in cui def (f) dom(f), f viene
detta funzione parziale.
Chiaramente tutte le funzioni sono parziali (anche se ci`o non viene sempre
esplicitamente dichiarato) e le funzioni totali sono un caso particolare. Ana-
logamente a quanto accade per il dominio di una funzione possiamo osservare
che anche limmagine di una funzione pu`o coincidere o meno con il codominio
relativo.
Denizione 1.18 Una funzione f : X
1
X
n1
X
n
viene detta
suriettiva se
imm(f) = cod(f).
Denizione 1.19 Una funzione f si dice iniettiva o uno-ad-uno (1:1) se fa
corrispondere ad elementi diversi del dominio di denizione elementi diversi
del codominio, come esplicitato di seguito

1
, . . . , x

n1
_
X
1
. . . X
n1
,

1
, . . . , x

n1
_
X
1
. . . X
n1
,
x

1
, . . . , x

n1
) ,=

x

1
, . . . , x

n1
_
f(x

1
, . . . , x

n1
) ,= f(x

1
, . . . , x

n1
).
Equivalentemente, possiamo anche notare che, in tal caso,
f(x

1
, . . . , x

n1
) = f(x

1
, . . . , x

n1
)

1
, . . . , x

n1
_
=

x

1
, . . . , x

n1
_
.
Naturalmente la bra di ogni elemento dellimmagine di una funzione iniettiva
ha cardinalit`a unitaria.
Denizione 1.20 Una funzione si dice biiettiva o biunivoca se `e allo stes-
so tempo iniettiva, suriettiva e totale. Una funzione biiettiva si dice anche
biiezione.
Esercizio 1.10 Dimostrare che esiste una biiezione tra linsieme dei sottoinsiemi di
un insieme S nito di cardinalit`a [ S[= n e le sequenze binarie di lunghezza n.
Unimportante propriet`a delle funzioni iniettive `e espressa dal seguente
teorema
3
.
3
Il nome letteralmente signica Principio della piccionaia e si riferisce allimpossibilit`a
che due piccioni occupino la stessa cella di una piccionaia. Per questo teorema, come dal-
tronde accadr`a per altri teoremi nel corso del volume, manteniamo la dicitura inglese perche
con tale dicitura il principio `e universalmente noto e citato.
12 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Teorema 1.2 (Pigeonhole Principle) Dati due insiemi niti A e B, tali
che
0 <[ B[<[ A[,
non esiste alcuna funzione iniettiva totale f : A B.
Dimostrazione. Si procede per induzione, ragionando sulla cardinalit`a
dellinsieme B.
Passo base
Se [ B [= 1 (cio`e B = b per un opportuno elemento b) allora
[ A [ 2 (A = a
1
, a
2
, . . .); per qualunque funzione totale f deve
necessariamente valere f(a
1
) = f(a
2
) = b. cio`e f non `e iniettiva.
Passo induttivo
Supponiamo il teorema vero per [ B [ n e consideriamo il caso in cui
[ B[= n + 1 e [ A[ n + 2. Scelto arbitrariamente un elemento b B si
hanno due casi:
Se [ f
1
(b) [ 2, il teorema `e dimostrato in quanto la f non `e
iniettiva.
Se [ f
1
(b)[ 1, allora si considerino gli insiemi A

= Af
1
(b)
e B

= B b. Vale naturalmente [ A

[ n + 1 >[ B

[= n. Si
consideri inoltre la funzione f

: A

tale che a A

(a) =
f(a) (detta restrizione della f ad A

). Per ipotesi induttiva f

non
pu`o essere iniettiva, il che equivale a dire che esistono a

, a

tali che a

,= a

e f

(a

) = f

(a

). Dato che, per costruzione,


abbiamo che a

, a

A, f

(a

) = f(a

) e f

(a

) = f(a

), ne deriva
che esistono a

, a

A tali che a

,= a

e f(a

) = f(a

).
2
Si noti che il Pigeonhole principle esclude, in particolare, che si possa avere
una biiezione tra un insieme A ed un suo sottoinsieme proprio B A.
`
E
importante osservare che tale situazione non si verica invece se consideria-
mo insiemi inniti. Vedremo infatti, nella prossima sezione, che `e possibile
stabilire una corrispondenza biunivoca tra gli elementi di un insieme innito
(ad esempio i naturali) e quelli di un suo sottoinsieme proprio (ad esempio i
numeri pari).
Esercizio 1.11 Dato un insieme nito B deniamo k-partizione una famiglia di k
insiemi non vuoti A
1
, . . . , A
k
tali che A
1
A
k
= B e i, j se i ,= j allora
A
i
A
j
= . Dimostrare che se [ B[> 2 non esiste una biiezione tra le 2-partizioni e
le 3-partizioni di B.
1.1. INSIEMI, RELAZIONI E FUNZIONI 13
Esercizio 1.12 Dimostrare che in ogni grafo semplice (privo cio`e di archi multipli fra
coppie di nodi e di archi riessivi) esistono almeno due nodi con lo stesso grado (con
lo stesso numero di archi incidenti).
1.1.6 Cardinalit`a di insiemi inniti e numerabilit`a
Allinizio del Capitolo abbiamo introdotto informalmente la denizione di car-
dinalit`a di un insieme innito (vedi Sezione 1.1.1). Al ne di poter estendere
agli insiemi inniti il concetto di cardinalit`a si rende ora necessario denire in
modo pi` u formale tale concetto, basandoci sulla possibilit`a di confrontare la
numerosit`a di due insiemi.
Denizione 1.21 Due insiemi A e B si dicono equinumerosi se esiste una
biiezione tra di essi.
Esempio 1.9 Gli insiemi
luned`, marted`, . . . , domenica e 5, 7, 31, 50, 64, 70, 75
sono equinumerosi.
Esercizio 1.13 Dimostrare che la relazione di equinumerosit`a `e una relazione dequi-
valenza.
Prima di considerare come il concetto di equinumerosit`a ci permette di
denire la cardinalit`a di insiemi inniti, osserviamo che, utilizzando tale con-
cetto, `e possibile ridenire in modo formale la cardinalit`a di insiemi niti, nel
seguente modo.
Denizione 1.22 Dato un insieme nito A, la sua cardinalit`a [ A [ `e cos`
denita:
[ A[=
_
0 se A =
n se A `e equinumeroso a 0, 1, . . . , n 1, con n 1.
Il concetto di cardinalit`a pu`o essere utilizzato per dare una denizione insiemi-
stica del concetto di numero cardinale: il numero n pu`o infatti essere denito
come la classe dequivalenza di tutti gli insiemi equinumerosi a 0, . . . , n1.
In particolare, il numero 0 `e la classe dequivalenza dellinsieme vuoto.
Denizione 1.23 Un insieme si dice numerabile se esso `e equinumeroso a
IN.
Denizione 1.24 Un insieme si dice contabile se esso `e nito o numerabile.
14 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Mentre nel caso degli insiemi niti la cardinalit`a pu`o essere espressa appunto
dal numero cardinale corrispondente, nel caso di insiemi inniti si fa general-
mente uso di simboli aggiuntivi introdotti ad hoc. In particolare, per indicare
la cardinalit`a degli insiemi inniti equinumerosi ad IN si utilizza il simbolo
0
(aleph
4
zero)
In base alle denizioni poste si pu`o facilmente dimostrare il seguente
risultato.
Teorema 1.3 Se un insieme A `e equinumeroso a un insieme B, con B C,
dove C `e un insieme contabile, allora anche A `e contabile.
Dimostrazione. La dimostrazione `e lasciata come esercizio al lettore (Eser-
cizio 1.14). 2
Esercizio 1.14 Dimostrare il Teorema 1.3.
Esempio 1.10 Linsieme ZZ degli interi relativi risulta essere numerabile (cio`e [ ZZ[=

0
) poiche i suoi elementi possono essere posti in corrispondenza biunivoca con IN
tramite la biiezione f : ZZ IN denita nel seguente modo:
f(i) =
_
2i se i 0
2i 1 se i > 0.
Il precedente esempio ci permette di osservare unimportante caratteristica
degli insiemi inniti. Infatti linsieme IN `e propriamente contenuto nellinsieme
ZZ: ciononostante i due insiemi risultano equinumerosi. Si osservi che ci`o non
si pu`o vericare nel caso di insiemi niti come visto in base al Pigeonhole
principle.
Esempio 1.11 Linsieme delle coppie di naturali IN
2
`e numerabile. La corrisponden-
za biunivoca pu`o essere stabilita con la seguente biiezione, frequentemente chiamata
funzione coppia di Cantor
p(i, j) =
(i +j)(i +j + 1)
2
+i.
Il metodo con cui la biiezione p pone in corrispondenza coppie di naturali con i naturali
`e illustrato in Figura 1.2.
Pi` u in generale `e possibile mostrare che, per ogni n IN, se A `e contabile, anche
A
n
lo `e.
5
Il procedimento di enumerazione illustrato in Figura 1.2 fu originariamente
introdotto da Cantor per mostrare la numerabilit`a dellinsieme Q dei numeri
4
Prima lettera dellalfabeto ebraico.
5
La funzione p(i, j) `e frequentemente denominata funzione coppia di Cantor.
1.1. INSIEMI, RELAZIONI E FUNZIONI 15
0
1
2
3
4
5
0 1 2 3 4 5
0 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Figura 1.2 Dimostrazione della numerabilit`a delle coppie di naturali.
razionali. A tal ne dobbiamo innanzi tutto ricordare che i numeri razio-
nali corrispondono alle classi dequivalenza della relazione binaria R denita
sullinsieme ZZ (ZZ
+
):
R(a, b), c, d)) se e solo se ad = bc.
Per tale motivo, linsieme Q `e dunque equinumeroso allinsieme ZZ
(ZZ
+
)/
R
. Daltronde poiche ZZ `e contabile, anche ZZ
2
lo `e e cos` anche lin-
sieme ZZ (ZZ
+
)/
R
che `e equinumeroso ad un sottoinsieme proprio di ZZ
2
. Ci`o
prova che Q `e contabile. Si noti che il procedimento di Cantor pu`o essere
ulteriormente generalizzato per mostrare il seguente risultato.
Teorema 1.4 Lunione di una quantit`a contabile di insiemi contabili `e ancora
un insieme contabile.
Dimostrazione. Lenumerazione pu`o essere eettuata applicando ancora il
metodo di Cantor, come si pu`o vedere in Figura 1.3, dove si suppone che la
riga i-esima contenga gli elementi delli-esimo insieme. 2
Esercizio 1.15 Si consideri linsieme delle equazioni di grado intero, a coecienti
interi:
a
0
+a
1
x +a
2
x
2
+. . . +a
n
x
n
= 0.
Linsieme dei numeri algebrici reali `e per denizione linsieme delle soluzioni reali di
tali equazioni. Dimostrare che tale insieme `e numerabile.
16 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
a
01
a
02
a
03
a
04
a
11
a
12
a
13
a
21
a
22
a
23
a
31
. . .
. . .
. . .
.
.
.
Figura 1.3 Tecnica per enumerare gli elementi dellunione di una quantit`a
contabile di insiemi contabili.
1.1.7 Insiemi non numerabili
Dopo aver introdotto alcuni esempi di insiemi numerabili, `e utile mostrare
lesistenza di insiemi non numerabili. A tal ne useremo una tecnica che sar`a
ripetutamente utilizzata in questo volume, la cosiddetta tecnica di diagonaliz-
zazione, introdotta da Cantor proprio per illustrare la non numerabilit`a dei
numeri reali, e diusamente utilizzata per provare risultati importanti nella
teoria della calcolabilit`a.
Data una lista di oggetti, la tecnica di diagonalizzazione consiste nel creare
un controesempio, cio`e un oggetto non appartenente alla lista, mediante un
procedimento che deliberatamente lo costruisce garantendo che esso sia diverso
da tutti gli altri oggetti appartenenti alla lista; tale oggetto `e appunto detto
oggetto diagonale.
In termini pi` u formali, data una sequenza
0
,
1
, . . ., dove ciascun
i
`e
a sua volta una sequenza di inniti elementi a
i0
, a
i1
, . . . , a
in
, . . ., la diagona-
lizzazione consiste nel creare una sequenza diagonale che si dierenzia, per
costruzione, da ogni
i
. In particolare, lelemento i-esimo di sar`a diverso
dallelemento i-esimo a
ii
di
i
.
Teorema 1.5 Linsieme IR dei reali non `e numerabile.
Dimostrazione. Innanzi tutto osserviamo che linsieme aperto (0, 1) e lin-
sieme IR sono equinumerosi (una possibile biiezione `e 1/(2
x
+1), che ha dominio
IR e codominio (0, 1)). Basta dunque mostrare che linsieme dei reali in (0, 1)
non `e numerabile. A tal ne, consideriamo dapprima linsieme delle sequen-
ze innite di cifre decimali che rappresentano la mantissa dei reali in (0, 1) e
1.1. INSIEMI, RELAZIONI E FUNZIONI 17
mostriamo che tale insieme non `e numerabile. Per farlo si supponga per as-
surdo di aver trovato una qualsiasi corrispondenza tra i naturali e le sequenze:
questa corrispondenza denirebbe una enumerazione
i
.
Introduciamo ora la sequenza avente come i-esima cifra, per i =
0, 1, 2, . . ., il valore ottenuto sommando 1( mod 10) alla i-esima cifra di
i
. Con
riferimento, ad esempio, alla Figura 1.4 si ottiene = 124 . . ..
La sequenza viene a costituire elemento diagonale dellenumerazione

0
,
1
, . . . in quanto dierisce da ogni altra sequenza
i
nella posizione i.
mantisse dei
i
0 1 2 3

0 0

1 0 0 1

2 2 1 3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

k

0
1
3
Figura 1.4 Costruzione per diagonalizzazione del numero reale 0.124 . . . non
appartenente allenumerazione.
In altre parole, dopo aver supposto per assurdo di poter enumerare tut-
te le rappresentazioni decimali di reali nellintervallo (0, 1), `e stato possibile
costruire per diagonalizzazione unulteriore rappresentazione che, seppure re-
lativa ad un reale in (0, 1), non appartiene allenumerazione, il che contrasta
con lipotesi che linsieme delle rappresentazioni dei reali sia numerabile.
La non numerabilit`a dei reali in (0, 1) deriva da quanto detto ed osservan-
do inoltre che ogni numero reale ha al pi` u due rappresentazioni distinte (ad
esempio, 0.01000 . . . e 0.00999 . . .) 2
Un secondo importante esempio di insieme non numerabile `e linsieme delle
parti di IN, T(IN).
Teorema 1.6 Linsieme delle parti di IN, T(IN), non `e numerabile.
Dimostrazione. Supponiamo per assurdo che T(IN) sia numerabile e sia
18 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
P
0
, P
1
, . . . una sua enumerazione. A ciascun P
i
, con i = 0, 1, 2, . . ., associamo
una sequenza b
i0
, b
i1
, b
i2
, . . . , dove
b
ij
=
_
0 se j , P
i
1 se j P
i
.
Costruiamo ora linsieme diagonale P. La sequenza associata a P `e p
0
, p
1
, . . .,
dove p
i
= 1 b
ii
per i = 0, 1, 2, . . .. Linsieme P `e perfettamente denito
dalla sequenza p
0
, p
1
, . . ., ma dierisce da ciascuno degli insiemi P
i
poiche,
per costruzione, i Pi , P
i
. Avendo dunque supposto che sia possibile
enumerare gli elementi di T(IN), si `e riusciti a costruire un insieme P T(IN)
che non fa parte della enumerazione, il che falsica tale ipotesi. 2
Chiaramente il risultato di non numerabilit`a ora trovato non vale solo per
linsieme delle parti di IN, ma per linsieme delle parti di ogni insieme di
cardinalit`a
0
.
1.1.8 Cardinalit`a transnita
Nella sezione precedente abbiamo visto esempi di insiemi la cui cardinalit`a `e
superiore ad
0
. Vediamo ora come possa essere caratterizzata la cardinalit`a di
tali insiemi. A tal ne consideriamo innanzitutto la seguente classe di funzioni
a valore binario.
Denizione 1.25 Si denisce funzione caratteristica f
S
(x) di un insieme
S IN la funzione totale f
S
: IN 0, 1
f
S
(x) =
_
1 se x S
0 se x , S.
(1.1)
`
E utile introdurre questa classe di funzioni perche ci`o consente di ricondurre il
problema del riconoscimento di insiemi al problema del calcolo di una funzione.
Si pu`o facilmente mostrare che anche linsieme delle funzioni caratteristiche
su IN non `e numerabile. Per dimostrarlo si usa, al solito, il procedimento
diagonale.
Teorema 1.7 Linsieme delle funzioni caratteristiche f [ f : IN 0, 1
non `e numerabile.
Dimostrazione. Si supponga per assurdo di avere una corrispondenza tra
linsieme delle funzioni caratteristiche e i naturali, come in Figura 1.5. A par-
tire dalle funzioni di questa enumerazione, si pu`o costruire una nuova funzione,
denita come di seguito:

f(i) = 1 f
i
(i).
Questa

f(i) assume ovviamente solo valori in 0, 1. La funzione cos` costrui-
ta `e evidentemente diversa da tutte quelle enumerate per almeno un valore
dellargomento, il che dimostra lasserto. 2
1.1. INSIEMI, RELAZIONI E FUNZIONI 19
0 1 2 3 4
j
f
0 0 0 0 0 0
f
0
(j)
f
1 0 1 0 1 0
f
1
(j)
f
2 0 1 1 0 1 f
2
(j)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
f
i
f
i
(0) f
i
(1) f
i
(2) f
i
(3) f
i
(4) f
i
(j)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Figura 1.5 Enumerazione delle funzioni caratteristiche.
Il risultato trovato `e, in eetti, ovvio, nel momento in cui si osserva che esi-
ste una corrispondenza biunivoca naturale tra sottoinsiemi di IN e funzioni
caratteristiche.
Come abbiamo visto in Sezione 1.1.1, dato un insieme nito A di cardi-
nalit`a n, linsieme T(A) ha cardinalit`a 2
n
. Per analogia, dato un insieme A
numerabile, e quindi di cardinalit`a
0
, si dice che linsieme T(A) ha cardinalit`a
2

0
(o, con un leggero abuso di notazione, 2
|IN|
). Gli insiemi aventi cardinalit`a
2

0
vengono detti insiemi continui . Losservazione precedente circa la corri-
spondenza tra linsieme T(IN) e linsieme f [ f : IN 0, 1 ci permette
di asserire che questultimo insieme `e un insieme continuo.
Tale risultato pu`o essere in realt`a esteso a tutte le funzioni intere. Infatti
da un lato vale che:
[ f [ f : IN IN[ [ f [ f : IN 0, 1[= 2

0
.
Daltra parte ogni funzione totale intera pu`o essere vista come un insieme di
coppie di interi, cio`e come un elemento di T(IN
2
), e poiche sappiamo che IN
2
`e equinumeroso a IN, `e chiaro che linsieme delle funzioni intere ha cardinalit`a
non superiore a 2

0
. Ne risulta che [ f [ f : IN IN[= 2

0
.
Si noti che il problema dellesistenza di un insieme avente cardinalit`a com-
presa tra
0
e 2

0
(noto come problema del continuo) `e tuttora un problema
aperto.
6
Raniamo ora il risultato del Teorema 1.5 dimostrando che linsieme
dei reali ha cardinalit`a 2

0
.
6
Se chiamiamo 1 il primo cardinale transnito maggiore di 0 il problema del continuo
si pu`o formulare come il problema di stabilire se 1 = 2

0
.
20 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Teorema 1.8 Linsieme IR dei reali `e un insieme continuo.
Dimostrazione.
`
E suciente mostrare che tale propriet`a `e goduta dallin-
sieme dei reali compresi fra 0 e 1, poiche, come abbiamo visto, esiste una
corrispondenza biunivoca tra IR e linsieme dei reali in (0, 1) (vedi dimostra-
zione del Teorema 1.5). Osserviamo che ad ogni sottoinsieme dei naturali `e
possibile associare una unica stringa binaria che ne descrive la funzione carat-
teristica e che tale stringa, a sua volta, pu`o essere vista come la mantissa di
un unico reale in (0, 1). Daltro canto, come osservato nella dimostrazione del
Teorema 1.5, ad ogni reale corrispondono al pi` u due diverse mantisse e quindi
due diversi sottoinsiemi dei naturali. Ne deriva quindi che i reali in (0, 1) sono
almeno la met`a dei sottoinsiemi dei naturali e non pi` u di questi ultimi. Il
teorema `e dimostrato constatando che la presenza di un fattore moltiplicativo
nito non modica una cardinalit`a transnita. 2
Per indicare la cardinalit`a degli insiemi inniti sono stati introdotti da Cantor
i cosiddetti cardinali transniti .
0
e 2

0
sono esempi di cardinali transniti.
Cantor ha anche mostrato che esistono inniti cardinali transniti, in base alla
propriet`a che se un insieme A ha cardinalit`a transnita , linsieme T(A) ha
cardinalit`a transnita 2

. Tale risultato `e basato su un uso della tecnica di


diagonalizzazione estesa ai numeri transniti.
Teorema 1.9 Linsieme delle funzioni reali f [ f : IR IR ha cardinalit`a
2
2

0
.
Dimostrazione. Poiche ad ogni elemento dellinsieme
F = f [ f : IR IR
si pu`o associare un elemento di T(IR
2
) abbiamo che [ F [[ T(IR
2
) [. Daltra
parte IR
2
`e equinumeroso a IR: infatti basta vericare, per quanto visto nella
dimostrazione del Teorema 1.5, che [ (0, 1)[=[ (0, 1)
2
[. Ci`o `e sicuramente vero,
se consideriamo la biiezione che associa ad ogni elemento a di (0, 1) la coppia
di (0, 1)
2
avente per mantisse le cifre ottenute estraendo le cifre dispari e pari,
rispettivamente, della mantissa di a. Dunque
[ F [[ T(IR
2
)[=[ T(IR)[= 2
2

0
.
Possiamo poi osservare che esiste una ovvia corrispondenza biunivoca fra
T(IR) e F

= f [ f : IR 0, 1 F. Ne segue che [ F [[ F

[= 2
2

0
.
Da quanto visto, risulta che deve necessariamente essere [ F [= 2
2

0
. 2
In Tabella 1.2 sono riassunti vari risultati di cardinalit`a ottenuti su insiemi di
interesse.
1.2. STRUTTURE ALGEBRICHE ELEMENTARI 21
insiemi cardinalit`a
IN, ZZ, Q, IN
n
, ZZ
n
, Q
n

0
T(IN), f [ f : IN 0, 1, f [ f : IN IN, IR, IR
n
2

0
T(IR), f [ f : IR 0, 1, f [ f : IR IR 2
2

0
Tabella 1.2 Cardinalit`a di alcuni insiemi notevoli.
Esercizio 1.16 Determinare la cardinalit`a dei seguenti insiemi:
1. linsieme delle relazioni n-arie, per n qualunque, su un insieme nito A,
2. linsieme delle relazioni n-arie, per n qualunque, sullinsieme dei naturali,
3. linsieme delle relazioni binarie sullinsieme dei reali.
1.2 Strutture algebriche elementari
Nel seguito della trattazione avremo necessit`a di considerare insiemi su cui
sono denite operazioni aventi particolari propriet`a. Come si ricorda, un in-
sieme chiuso rispetto a una o pi` u speciche operazioni `e generalmente denito
algebra. Prima di tutto `e dunque utile richiamare denizioni e propriet`a delle
strutture algebriche cui si far`a riferimento nel seguito.
1.2.1 Semigruppi, monoidi, gruppi, semianelli
Supponiamo dato un insieme universo U, che per ipotesi contiene tutti gli
elementi degli insiemi cui faremo riferimento nel seguito.
Denizione 1.26 Dato un insieme non vuoto S U, si denisce operazione
binaria su S una funzione : S S U.
Denizione 1.27 Un insieme non vuoto S si dice chiuso rispetto ad una
operazione binaria su S se imm() S.
Se un insieme S `e chiuso rispetto a , ne segue quindi che applicando tale
operazione ad elementi di S si ottengono ancora elementi dellinsieme stesso.
Si consideri ora un insieme S chiuso rispetto ad unoperazione binaria .
22 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Denizione 1.28 La coppia S, ) viene detta semigruppo se loperazione
binaria soddisfa la seguente propriet`a:
xyz S (x (y z)) = (x y) z) (associativit`a).
Se inoltre vale la seguente propriet`a:
xy S (x y) = (y x) (commutativit`a)
il semigruppo `e detto commutativo.
Esempio 1.12 La coppia IN, +), dove + `e lusuale operazione di somma, `e un se-
migruppo commutativo, in quanto, chiaramente, loperazione di somma di naturali `e
associativa e commutativa.
Denizione 1.29 La terna S, , e) viene detta monoide se S, ) `e un
semigruppo, e se e S `e tale che:
x S (e x) = (x e) = x
Lelemento e viene detto elemento neutro o unit`a del monoide. Se `e anche
commutativa, il monoide viene detto commutativo.
Esempio 1.13 Le terne IN, +, 0) e IN, , 1), dove + e sono le usuali operazioni
di somma e prodotto, sono monoidi commutativi. Infatti, oltre alle propriet`a di
associativit`a e commutativit`a della somma e del prodotto di naturali, si ha anche che
x IN (x + 0) = (x 1) = x.
Denizione 1.30 La terna S, , e) viene detta gruppo se S, , e) `e un
monoide ed inoltre loperazione ammette inverso, cio`e se
x S y S (x y) = (y x) = e.
Lelemento y viene detto inverso di x, e si denota come x
1
.
Se il monoide S, , e) `e commutativo il gruppo viene detto commutativo (o
abeliano).
Esempio 1.14 Le terne IN, +, 0) e IN, , 1) non sono gruppi, in quanto linsieme IN
non `e chiuso rispetto allinverso di + e di . Al contrario, le terne ZZ, +, 0) e Q, , 1)
sono gruppi abeliani.
Esercizio 1.17 Dimostrare che la seguente denizione di elemento inverso
x S y S (x y) = e,
`e equivalente a quella data.
Osserviamo ora che, se `e unoperazione associativa, allora ((x y) z) =
(x(y z)) e potremo non considerare lordine di applicazione delloperazione,
scrivendo semplicemente x y z.
1.2. STRUTTURE ALGEBRICHE ELEMENTARI 23
Denizione 1.31 Dati un semigruppo S, ) e un insieme X S, si denisce
chiusura di X linsieme
X
T
= x S [ x
1
, . . . , x
n
) X
n
x
1
x
2
x
n
= x, n 1.
Vale a dire che X
T
`e linsieme degli elementi di S che possono essere otte-
nuti, applicando loperazione un numero arbitrario di volte, a partire dagli
elementi in X. Un importante caso particolare `e quando X
T
= S.
Denizione 1.32 Dati un semigruppo S, ) e un insieme X S, gli
elementi di X si dicono generatori di S se X
T
= S.
Denizione 1.33 Dati un insieme S ed una operazione associativa , de-
niamo semigruppo libero sulla coppia S, ) il semigruppo S
+
,
+
), dove:
1. S
+
`e linsieme di tutte le espressioni x = x
1
x
2
. . . x
n
, per ogni n 1,
con x
1
, . . . , x
n
S;
2. loperazione
+
`e denita nel modo seguente: se x = x
1
. . . x
n
e
y = y
1
. . . y
n
, allora x
+
y = x
1
. . . x
n
y
1
. . . y
n
.
Per semplicit`a, gli elementi di S
+
vengono usualmente denotati senza indicare
il simbolo doperazione (pertanto, anziche x
1
x
2
x
3
scriviamo ad esempio
x
1
x
2
x
3
).
Se estendiamo S
+
introducendo un elemento aggiuntivo , detto parola
vuota, possiamo denire sullinsieme risultante S

= S
+
loperazione

,
estensione di
+
, tale che, x, y S
+
x

y = x
+
y e x S

x = x

=
x).
La terna S

, ) `e allora un monoide e viene detto monoide libero.


Esercizio 1.18 Data una sequenza di tre caratteri, si considerino le operazioni di
rotazione verso destra (d), di rotazione verso sinistra (s) e loperazione neutra (i) che
non opera alcuna rotazione. Dimostrare che la coppia d, s, i , ),, dove loperazione
`e la composizione delle rotazioni, `e un gruppo commutativo. Dimostrare che d `e un
generatore del gruppo. Denire il monoide libero associato alla coppia d , ).
Se consideriamo coppie di operazioni denite su S possiamo individuare
le seguenti strutture algebriche pi` u complesse.
Denizione 1.34 La quintupla S, +, , 0, 1) `e detta semianello se valgono le
seguenti propriet` a:
S, +, 0) `e un monoide commutativo;
S, , 1) `e un monoide;
loperazione gode della propriet`a distributiva rispetto alloperazione +,
cio`e x, y, z S x (y +z) = (x y) + (x z);
24 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
lo 0 `e un elemento assorbente per il prodotto, cio`e x S (x 0) =
(0 x) = 0.
Il semianello `e detto commutativo se loperazione `e anchessa commutativa.
Esempio 1.15 Esempi di semianello sono le strutture algebriche seguenti:
- T(S), , , , S), per ogni insieme S,
- Q, +, , 0, 1),
- false, true, , , false, true) (detto semianello booleano).
In tutti i casi si tratta di semianelli commutativi perche le operazioni di prodotto sono
commutative.
Esercizio 1.19 Dimostrare che la quintupla IN , min, +, , 0) `e un semianello
commutativo (si assuma che x IN x + = e min(x, ) = x).
Tra le strutture algebriche, le algebre di Boole rivestono un interesse
particolare in informatica.
Denizione 1.35 Un algebra di Boole `e un semianello B, +, , 0, 1 ) con le
seguenti propriet`a aggiuntive:
0 ,= 1;
per ogni x B esiste x
1
B (inverso) tale che xx
1
= 0 e x+x
1
=
1;
per ogni x B, x x = x.
1.2.2 Congruenze, monoide quoziente e gruppo quoziente
Introduciamo ora alcuni importanti concetti riguardanti relazioni tra gli
elementi di strutture algebriche.
Denizione 1.36 Dato un semigruppo S, ), una congruenza `e una
relazione dequivalenza su S che soddisfa la seguente propriet`a:
x, y S x yz S ((x z y z) (z x z y)).
Esempio 1.16 NellEsempio 1.7 `e stata denita la relazione dequivalenza
k
delle
classi resto rispetto alla divisione per k.
`
E facile osservare che tale relazione `e una
congruenza rispetto al semigruppo commutativo IN, +): infatti, se n
k
m, abbiamo
che l (n+l
k
m+l) e, chiaramente, anche l +n
k
l +m. Viceversa, se l (n+l
k
m+l) allora abbiamo, nel caso particolare l = 0, n
k
m.
Si noti che nel caso di semigruppi non commutativi possiamo denire anche
congruenze destre (sinistre), cio`e relazioni tali che
x yz S (x z y z) (x yz S (z x = z y)).
1.3. CARATTERISTICHE ELEMENTARI DEI LINGUAGGI 25
Esempio 1.17 Dato un semigruppo S, ), una relazione dequivalenza denita nel
modo seguente,
xRyz (x z = y z)
`e una relazione di congruenza destra. Infatti essa `e chiaramente una relazione de-
quivalenza, ed inoltre, poiche xRyx z = y z per ogni z, abbiamo che xRy
z (xz)R(yz). Daltra parte, se z (xz)R(yz) allora zz

(xzz

= yzz

)
e quindi, assumendo u = z z

abbiamo u (x u = y u) che per denizione implica


xRy.
Dati un semigruppo S, ) e una congruenza C su S, denotiamo con S mod C
o S/C linsieme delle classi dequivalenza della congruenza. Sia [x] la classe
dequivalenza dellelemento x S: se deniamo [x] [y] = [x y], la struttura
S/C, ) `e un semigruppo, ed `e chiamato semigruppo quoziente. Inoltre, dato
il monoide S, , 1), la struttura S/C, , [1]) `e chiamata monoide quoziente.
Dato il gruppo S, , 1), se deniamo [x]
1
= [x
1
], abbiamo che la struttura
S/C, , 1) `e un gruppo, detto gruppo quoziente. Il numero di elementi di una
struttura algebrica (semigruppo, monoide, gruppo) ottenuta come struttura
quoziente, viene chiamato indice della struttura.
Esempio 1.18 Consideriamo ad esempio il semigruppo ZZ, +) e la congruenza
k
(con k 2). Allora, per ogni x ZZ, la classe di equivalenza [x] `e data dallinsieme
y ZZ [ i ZZ (x y) = ik degli interi che dieriscono da x per un multiplo
di k. Il relativo semigruppo quoziente (in eetti un gruppo quoziente) `e costituito
dallinsieme ZZ
k
degli interi positivi minori o uguali a k e dalloperazione + denita
modulo k, come x, y, z ZZ
k
(x +y) = zx +y = z ik, k ZZ.
Esercizio 1.20 Si consideri il gruppo dei razionali Q, +, 0). Dimostrare che la re-
lazione aRba b ZZ `e una congruenza. Denire inoltre il gruppo quoziente e
mostrare che il suo indice non `e nito.
1.3 Caratteristiche elementari dei linguaggi
Fra le strutture matematiche utilizzate nellambito dellinformatica, i linguag-
gi formali svolgono un ruolo particolarmente importante. In questa sezione
introduciamo alcuni concetti relativi ai linguaggi ed alle principali operazioni
che nel seguito avremo occasione di utilizzare.
1.3.1 Alfabeto, stringa, linguaggio
Deniamo innanzitutto i concetti pi` u elementari di alfabeto e stringa.
Denizione 1.37 Un insieme nito non vuoto di simboli (detti caratteri)
prende il nome di alfabeto.
26 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Esempio 1.19 Ad esempio 0, 1 `e lalfabeto binario, mentre
A, . . . , Z, a, . . . , z, +, , , /, <, >, ., :, ; , =,

, , ), (, ], [, 0, 1, . . . , 9
oltre ai simboli spazio, virgola, parentesi graa aperta e parentesi graa chiusa,
costituisce lalfabeto utilizzato nel linguaggio di programmazione Pascal.
Se consideriamo i caratteri di un alfabeto come i generatori di un se-
migruppo, possiamo fare riferimento al monoide libero corrispondente (vedi
Denizione 1.33).
Denizione 1.38 Dato un alfabeto , denotiamo come

, , ) il monoide
libero denito su . Tale monoide `e chiamato anche monoide sintattico. Gli
elementi di

vengono detti parole o stringhe. Lelemento viene detto


parola vuota. Loperazione :

denita sul monoide `e chiamata


concatenazione e consiste nel giustapporre due parole di

:
x
i
1
. . . x
i
n
y
j
1
. . . y
j
m
= x
i
1
. . . x
i
n
y
j
1
. . . y
j
m
,
con x
i
1
, . . . , x
in
, y
j
1
, . . . , y
jm
.
Dato un alfabeto ed il monoide sintattico denito su di esso vale natural-
mente la propriet`a:
x x = x = x.
La concatenazione di due stringhe x e y `e frequentemente indicata omettendo
il simbolo , cio`e scrivendo xy anziche x y.
Con la notazione [ x [ indichiamo la lunghezza di una parola x, ovvero il
numero di caratteri che la costituiscono. Chiaramente [ [= 0. Si osservi
inoltre che la concatenazione non gode della propriet`a commutativa e quindi
in generale:
x y ,= y x.
Un caso particolare di concatenazione `e quello in cui la stringa viene con-
catenata con se stessa: con x
h
si denota la concatenazione di x con se stessa
iterata h volte. Per convenzione con x
0
si intende la stringa vuota.
Normalmente si rappresentano per convenzione i caratteri di con le prime
lettere minuscole dellalfabeto latino e le parole di

con le ultime lettere,


sempre minuscole, dellalfabeto latino.
Denizione 1.39 Dato un alfabeto , si denisce linguaggio un qualsivoglia
sottoinsieme di

.
Si noti che poiche

, un alfabeto `e a sua volta un linguaggio.


Denizione 1.40 Si chiama linguaggio vuoto, e lo si indica con , il
linguaggio che non contiene stringa alcuna.
1.3. CARATTERISTICHE ELEMENTARI DEI LINGUAGGI 27
Si noti che ,= .
Esempio 1.20 Dato lalfabeto a, b, linsieme a
n
b
n
[ n 1 `e il linguaggio
composto da tutte le stringhe costituite dalla concatenazione di un certo numero di
a, seguita dalla concatenazione dello stesso numero di b.
Data una stringa x, risulter`a interessante considerare la stringa ottenuta in-
vertendo lordine dei caratteri di x. Pi` u formalmente, abbiamo la seguente
denizione.
Denizione 1.41 Data una stringa x, chiamiamo inversa (o riessa) di x la
stringa x denita nel seguente modo:
x =
_
x se x = o x = a
a y se x = ya
per ogni a .
Inne, dato un alfabeto , deniamo linsieme delle stringhe palindrome su
come x [ x = x.
1.3.2 Operazioni su linguaggi
Dati due linguaggi L
1
ed L
2
si possono denire su essi varie operazioni: in par-
ticolare introdurremo in questa sezione le operazioni binarie di intersezione,
unione e concatenazione (o prodotto), nonche quelle unarie di complementa-
zione ed iterazione. Intersezione, unione e complementazione sono normali
operazioni su insiemi, mentre concatenazione ed iterazione sono denite sulla
base della struttura algebrica del monoide

, , ).
Denizione 1.42 L intersezione di due linguaggi L
1
e L
2
`e il linguaggio L
1

L
2
costituito dalle parole di L
1
e di L
2
, cio`e L
1
L
2
= x

[ x L
1
x
L
2
.
Denizione 1.43 L unione di due linguaggi L
1
e L
2
`e il linguaggio L
1
L
2
costituito dalle parole appartenenti ad almeno uno fra L
1
ed L
2
, cio`e L
1
L
2
=
x

[ x L
1
x L
2
.
Si noti cheL
1
= e L
1
= L
1
.
Denizione 1.44 Il complemento di un linguaggio L
1
`e il linguaggio L
1
=

L
1
costituito dalle parole appartenenti a

ma non ad L
1
, cio`e L
1
=
x

[ x , L
1
.
Denizione 1.45 La concatenazione (o prodotto) di due linguaggi L
1
e L
2
`e
il linguaggio L
1
L
2
7
delle parole costituite dalla concatenazione di una stringa
di L
1
e di una stringa di L
2
, cio`e
L
1
L
2
= x

[ y
1
L
1
y
2
L
2
(x = y
1
y
2
) .
7
Si osservi che, anche se per indicare la concatenazione tra stringhe e tra linguaggi viene
adottato lo stesso simbolo, le due operazioni sono comunque diverse e, peraltro, il contesto
consente di evitare ogni ambiguit` a.
28 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Si noti che L = L = L, e che L = L = .
Esempio 1.21 Dati L
1
= a
n
[ n 1 e L
2
= b
m
[ m 1,
L
1
L
2
= a
n
b
m
[ n, m 1.
Esempio 1.22 Dati L
1
= astro, fisio ed L
2
= logia, nomia, abbiamo
che L
1
L
2
`e costituito dalle stringhe astrologia, astronomia, fisiologia e
fisionomia.
Esercizio 1.21 Dimostrare che la quintupla
T(

), , , , )
`e un semianello non commutativo.
Il concetto di potenza inteso come iterazione della concatenazione viene
esteso ai linguaggi mediante la seguente denizione.
Denizione 1.46 La potenza L
h
di un linguaggio `e denita come
L
h
= L L
h1
, h 1
con la convenzione secondo cui L
0
= .
Si noti che, in base alla suddetta convenzione,
0
= . Con questa denizio-
ne, linsieme delle stringhe di lunghezza h sullalfabeto si pu`o indicare con

h
.
Denizione 1.47 Il linguaggio L

denito da
L

_
h=0
L
h
prende il nome di chiusura riessiva del linguaggio L rispetto alloperazione di
concatenazione, mentre loperatore prende il nome di iterazione o stella
di Kleene.
Si noti che, dato un qualunque linguaggio L, L

, e che

= .
Esempio 1.23 Se L = aa, allora L

= a
2n
[ n 0.
Esempio 1.24 Dati i linguaggi L
1
= bis ed L
2
= nonno, il linguaggio L

1
L
2
contiene le stringhe nonno, bisnonno, bisbisnonno, . . . .
Denizione 1.48 Si indica con L
+
la chiusura (non riessiva) denita da
L
+
=

_
h=1
L
h
Risulta ovviamente L

= L
+
.
Esempio 1.25 Se L = aa, allora L
+
= a
2n
[ n 1.
Si noti che le Denizioni 1.47 e 1.48 sono coerenti con quanto specicato
nella Denizione 1.38. In particolare si noti che

pu`o essere ottenuto come


chiusura riessiva del linguaggio .
1.3. CARATTERISTICHE ELEMENTARI DEI LINGUAGGI 29
1.3.3 Espressioni regolari
Le considerazioni nora svolte relativamente ai linguaggi sono state eettuate
senza fornire alcuno strumento specico di descrizione dei linguaggi stessi.
Nel seguito introdurremo vari formalismi per la rappresentazione di linguaggi:
nella presente sezione introduciamo un primo strumento, di natura algebrica,
che verr`a frequentemente utilizzato a tale scopo. Tale strumento `e costituito
dalle cosiddette espressioni regolari e consente di descrivere tutti i linguaggi
appartenenti a unimportante classe.
Denizione 1.49 Dato un alfabeto e dato linsieme di simboli
+,

, (, ), ,
si denisce espressione regolare sullalfabeto una stringa
r ( +, , (, ), ., )
+
tale che valga una delle seguenti condizioni:
1. r =
2. r
3. r = (s +t), oppure r = (s t), oppure r = s

, dove s e t sono espressioni


regolari sullalfabeto .
Come si `e detto, le espressioni regolari consentono di rappresentare linguag-
gi mediante una opportuna interpretazione dei simboli che le compongono.
Nella Tabella 1.3 si mostra la corrispondenza tra unespressione regolare e il
linguaggio che essa rappresenta. Per convenzione, se s e t sono due espressioni
Espr. regolari Linguaggi

a a
(s +t) L(s) L(t)
(s t) L(s) L(t)
s

(L(s) )

Tabella 1.3 Espressioni regolari e corrispondenti linguaggi. L(r) denota il


linguaggio rappresentato dallespressione regolare r.
regolari, al posto di (s t) si pu`o scrivere (st). Inoltre, assumendo che il sim-
bolo abbia precedenza sul simbolo e questo abbia precedenza sul simbolo
+, e tenendo conto dellassociativit`a di queste operazioni, si possono spesso
eliminare alcune parentesi.
30 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Esempio 1.26 Lespressione regolare
_
a +
_
b (c d)
_
_
denita sullalfabeto =
a, b, c, d pu`o essere sostituita da a +bcd.
Va detto che anche per le espressioni regolari si pu`o introdurre la potenza,
scrivendo ad esempio (r)
3
per indicare lespressione regolare rrr e la chiusura
(non riessiva) scrivendo (r)
+
per indicare r(r)

, dove r `e una qualunque


espressione regolare.
8
Si noti che per rappresentare la stringa vuota pu`o essere
utile a volte usare il simbolo nelle espressioni regolari, con lo scopo di indicare
il linguaggio . Tuttavia ci`o non `e formalmente necessario in quanto, per le
propriet`a viste, abbiamo che il linguaggio rappresentato da

`e esattamente
.
Esempio 1.27 Lespressione regolare (a +b)

a rappresenta il linguaggio
L((a +b)

a) = L
_
_
a +b
_

_
L(a)
=
_
L(a +b)
_

L(a)
=
_
L(a) L(b)
_

a
=
_
a b
_

a
= a, b

a
= x [ x a, b
+
, x termina con a.
Esempio 1.28 Posto c = 0, 1, . . . , 9, lespressione regolare che rappresenta i nu-
meri reali nella forma c
i1
c
i2
. . . c
in
.c
f1
c
f2
. . . c
fm
(dove c
ij
rappresenta la j-esima cifra
prima del punto decimale, e c
fk
la k-esima cifra dopo il punto decimale) `e
_
(1 + 2 +. . . + 9)(0 + 1 +. . . + 9)

+ 0
_
.(0 + 1 +. . . + 9)
+
.
Nei capitoli seguenti si vedr`a che i linguaggi rappresentabili mediante espres-
sioni regolari appartengono ad una classe molto particolare, detta appunto
classe dei linguaggi regolari , che gode di molte propriet`a notevoli, fra cui la
chiusura rispetto alle cinque operazioni denite allinizio della Sezione 1.3.2.
Esercizio 1.22 Determinare lespressione regolare che, sullalfabeto a, b, denisce
linsieme delle stringhe il cui terzultimo carattere `e una b.
Esercizio 1.23 Determinare il linguaggio denito dallespressione regolare a

_
(aa)

b+
(bb)

a
_
b

.
Esercizio 1.24 Sia data la mappa stradale (con tratti stradali a senso unico e
contrassegnati da caratteri dellalfabeto) schematicamente indicata in Figura 1.6.
Fornire unespressione regolare che denisca tutti i percorsi, anche passanti pi` u
volte per uno stesso nodo, tra A e B.
8
Tuttavia tali arricchimenti non accrescono, come `e evidente, la potenza descrittiva delle
espressioni regolari, ma solo la loro sinteticit` a.
1.3. CARATTERISTICHE ELEMENTARI DEI LINGUAGGI 31
A B
a d
f
e
g
c
b
Figura 1.6 Mappa stradale (relativa allEsercizio 1.24).
1.3.4 Cardinalit`a dei linguaggi
Tra i problemi pi` u basilari che debbono essere arontati nellinformatica vi
`e quello di riconoscere se una stringa appartenga o meno ad un determina-
to linguaggio, opportunamente denito. Ad esempio, quando un compilatore
analizza un programma in linguaggio C o Pascal deve vericare che tale pro-
gramma sia sintatticamente corretto, o, in altri termini, che la stringa costitui-
ta dal programma stesso appartenga al linguaggio dei programmi C o Pascal
sintatticamente corretti. Ebbene, il problema di riconoscere lappartenenza di
una stringa ad un linguaggio non pu`o essere sempre risolto mediante un algo-
ritmo. Infatti, i concetti deniti precedentemente ci permettono di valutare
la cardinalit`a dellinsieme di tutti i linguaggi deniti su un dato alfabeto, e
di osservare, in modo intuitivo, lesistenza di linguaggi per i quali non esiste
alcun algoritmo di riconoscimento.
Denizione 1.50 Dato un alfabeto = a
1
, . . . , a
n
, si denisce ordina-
mento lessicograco delle stringhe di

lordinamento < ottenuto stabilendo


un (qualunque) ordinamento tra i caratteri di (conveniamo, senza perdita
alcuna di generalit` a, di modicare la numerazione dei caratteri in modo da
assicurare che a
1
< a
2
< . . . < a
n
) e denendo lordinamento di due stringhe
x, y

in modo tale che x < y se e solo se una delle condizioni seguenti `e


vericata
1. [ x[<[ y [;
2. [ x[=[ y [ ed esiste z

tale che x = za
i
u e y = za
j
v, con u, v

e
i < j.
Esempio 1.29 Dato lalfabeto = a, b, dove assumiamo a < b, le stringhe di

sono enumerate in modo lessicograco come segue: , a, b, aa, ab, ba, bb, aaa, aab,
aba, abb, baa, . . .
32 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
Lesistenza dellordinamento lessicograco per le stringhe di

conduce diret-
tamente ad una enumerazione, il che ci consente di aermare che la cardinalit`a
di

`e
0
e, in base a quanto visto in precedenza, che linsieme di tutti i lin-
guaggi su , essendo equinumeroso a T(

), ha cardinalit`a 2

0
, e non `e quindi
numerabile.
Consideriamo ora la cardinalit`a dellinsieme dei programmi che possono es-
sere scritti utilizzando un qualunque linguaggio di programmazione, ad esem-
pio il Pascal. Se
P
`e lalfabeto del linguaggio Pascal, i programmi sono
stringhe di

P
che sono accettate (senza segnalazione di errori sintattici) da
un compilatore Pascal. Naturalmente la correttezza sintattica non implica la
correttezza di comportamento del programma rispetto ai calcoli che vogliamo
eseguire, ma ci`o, per il momento, non ci interessa.
Utilizzando ancora lordinamento lessicograco, osserviamo che i program-
mi Pascal possono essere enumerati nel seguente modo: vengono generate via
via le stringhe di

P
in ordine lessicograco, ogni stringa viene sottoposta al
compilatore, il quale ne verica la correttezza sintattica, e la stringa entra a
far parte dellenumerazione se e solo se tale verica d`a esito positivo.
`
E chiaro
dunque che anche linsieme dei programmi Pascal ha cardinalit`a (al pi` u)
0
.
Poniamoci ora il seguente problema.
`
E possibile che, dato un qualunque
L

, esista un programma Pascal che, data in input una qualunque stringa


x

, ne decida lappartenenza a L, vale a dire restituisca il valore true


se la stringa appartiene ad L e restituisca il valore false altrimenti? Una
semplice considerazione di cardinalit`a ci consente di osservare immediatamente
che i programmi Pascal sono una quantit`a contabile e non possono quindi
essere messi in corrispondenza con i linguaggi, che hanno la cardinalit`a del
continuo. In altre parole, esistono pi` u linguaggi da riconoscere che programmi
che riconoscono. Devono perci`o necessariamente esistere linguaggi per i quali
non esiste alcun programma Pascal di riconoscimento.
Questo risultato, ottenuto in modo informale, ed ovviamente indipenden-
te dal linguaggio di programmazione preso ad esempio, sar`a successivamente
confermato in modo pi` u preciso quando dimostreremo che qualunque forma-
lismo per il calcolo di funzioni o per il riconoscimento dinsiemi ha un potere
computazionale limitato ed esistono quindi funzioni che esso non pu`o calcolare
ed insiemi che esso non pu`o riconoscere.
1.4 Notazione asintotica
Unultima serie di concetti che desideriamo richiamare prima di passare alla
trattazione degli argomenti principali di questo volume riguarda la notazione
che esprime landamento asintotico di una funzione rispetto ad unaltra.
Denizione 1.51 Data una funzione f : IN IN, la notazione O(f(n))
denota linsieme delle funzioni:
g [ (c > 0) (n
0
> 0) (n n
0
) (g(n) cf(n)) .
1.4. NOTAZIONE ASINTOTICA 33
Se una funzione g(n) `e tale che g(n) O(f(n)) si ha quindi che asintoticamen-
te, per valori sucientemente grandi, la funzione assume valori non superiori
a quelli assunti dalla funzione f(n), a meno di una costante moltiplicativa pre-
ssata. In tal caso diciamo che g(n) cresce al pi` u come f(n). Con un abuso
di notazione scriveremo anche g(n) = O(f(n)).
Denizione 1.52 Data una funzione f : IN IN, la notazione (f(n))
denota linsieme delle funzioni:
g [ (c > 0) (n
0
> 0) (n n
0
) (g(n) cf(n)) .
Se g(n) (f(n)) si dice che g(n) cresce almeno come f(n). Con un abuso
di notazione si scrive anche g(n) = (f(n)).
Denizione 1.53 Data una funzione f : IN IN, la notazione (f(n))
denota linsieme delle funzioni:
g [ (c
1
> 0) (c
2
c
1
) (n
0
> 0) (n n
0
)(c
1
f(n) g(n) c
2
f(n)) .
Se g(n) (f(n)) si dice che g(n) e f(n) crescono nello stesso modo. Con un
abuso di notazione si scrive anche g(n) = (f(n)).
Denizione 1.54 Date due funzione f, g : IN IN, con la notazione g(n) =
o(f(n)) indichiamo che:
lim
n
g(n)
f(n)
= 0.
Se g(n) = o(f(n)) diciamo che g(n) `e un innitesimo rispetto a f(n) o, equi-
valentemente, che f(n) `e un innito rispetto a g(n). La stessa relazione pu`o
essere espressa mediante la notazione f(n) = (g(n)).
Valgono ovviamente le seguenti propriet`a:
f(n) = O(g(n))g(n) = (f(n))
f(n) = (g(n))g(n) = (f(n))
f(n) = (g(n))
_
f(n) = O((g(n))
_

_
f(n) = (g(n))
_
.
Come vedremo, la notazione asintotica viene utilizzata in particolare per
rappresentare il costo di esecuzione degli algoritmi e la complessit`a dei pro-
blemi. Nel seguito utilizzeremo tale notazione ancor prima di denire formal-
mente il concetto di complessit`a computazionale, per indicare il numero di
passi eseguiti da un algoritmo ed esprimere quindi, anche informalmente, il
suo costo di esecuzione. Nel dire, ad esempio, che un algoritmo ha un costo
O(n
2
) per una stringa in input di n caratteri, intenderemo dire che esiste una
opportuna costante c tale che, per ogni n sucientemente grande, il numero di
34 CAPITOLO 1. CONCETTI MATEMATICI DI BASE
passi eseguiti dallalgoritmo su ogni stringa di lunghezza n `e minore o eguale
a cn
2
.
Esercizio 1.25 Esprimere con le notazioni O, , e o landamento asintotico delle
seguenti funzioni:
f(n) = 3n
2
+ 2 log n
g(n) = 2

n + 5
n
4/3
n
Capitolo 2
Linguaggi formali
Tra i concetti principali alla base dellinformatica, il concetto di linguaggio
riveste un ruolo particolarmente importante. Anche se da un punto di vi-
sta matematico un linguaggio `e semplicemente un insieme di stringhe su un
dato alfabeto, nellambito dellinformatica siamo interessati a linguaggi, ge-
neralmente inniti, le cui stringhe sono caratterizzate da qualche particolare
propriet`a: ad esempio, il linguaggio dei programmi C `e costituito da tut-
te le stringhe che soddisfano la propriet`a di poter essere analizzate da un
compilatore C senza che venga rilevato alcun errore sintattico.
Lo studio formale dei linguaggi `e una parte importante dellinformatica
teorica e trova applicazione in varie direzioni. La prima, pi` u evidente, `e ap-
punto lo studio delle propriet`a sintattiche dei programmi, cio`e lo studio dei
metodi di denizione della sintassi di un linguaggio di programmazione, dei
metodi per la verica che un programma soddis le propriet`a sintattiche vo-
lute e dei metodi di traduzione da un linguaggio ad un altro (tipicamente da
un linguaggio di programmazione ad alto livello al linguaggio di macchina).
Inoltre, al di l`a di questa importante applicazione, la familiarit`a con i
concetti di generazione e riconoscimento di linguaggi `e importante in quanto
stringhe di caratteri aventi struttura particolare vengono frequentemente uti-
lizzate, in informatica, per rappresentare vari aspetti relativi allelaborazione
di dati, come ad esempio sequenze di operazioni eseguite da un programma,
sequenze di passi elementari eseguiti da una macchina, protocolli di comuni-
cazione, sequenze di azioni eseguite nellinterazione con uninterfaccia utente,
ecc.
Inne, `e importante tenere presente che, nella formulazione dei problemi
trattati mediante metodi algoritmici (come il calcolo di funzioni, la risoluzione
di problemi di ottimizzazione, ecc.) ci si riconduce frequentemente al problema
standard di decidere lappartenenza di una stringa ad un dato linguaggio: ad
esempio, anziche porsi il problema di calcolare una funzione f : IN IN, ci si
36 CAPITOLO 2. LINGUAGGI FORMALI
pu`o porre il problema di riconoscere il linguaggio a
n
b
f(n)
[ n 0.
La denizione di linguaggi si pu`o eettuare mediante strumenti diversi.
Un primo esempio di strumento formale per la denizione di linguaggi sono le
espressioni regolari, gi`a incontrate in Sezione 1.3.3. Come vedremo in seguito,
tuttavia, le espressioni regolari consentono di denire linguaggi di tipo partico-
lare, con una struttura piuttosto semplice, e non sono idonee a rappresentare
linguaggi pi` u complessi, come ad esempio i linguaggi di programmazione.
Un approccio alternativo `e il cosiddetto approccio generativo, dove si uti-
lizzano opportuni strumenti formali, le grammatiche formali appunto, che con-
sentono di costruire le stringhe di un linguaggio tramite un insieme pressato
di regole, dette regole di produzione.
Altro approccio di interesse, inne, `e quello riconoscitivo, che consiste
nellutilizzare macchine astratte, dette automi riconoscitori , che deniscono
algoritmi di riconoscimento dei linguaggi stessi, vale a dire algoritmi che per
un dato linguaggio L

stabiliscono se una stringa x

appartiene a L
o meno.
2.1 Grammatiche di Chomsky
In generale, con il termine di grammatica si intende un formalismo che permet-
te di denire un insieme di stringhe mediante limposizione di un particolare
metodo per la loro costruzione. Tale costruzione si eettua partendo da una
stringa particolare e riscrivendo via via parti di essa secondo una qualche
regola specicata nella grammatica stessa.
Le grammatiche formali presentate in questo capitolo sono denominate
Grammatiche di Chomsky perche furono introdotte appunto dal linguista
Noam Chomsky con lo scopo di rappresentare i procedimenti sintattici ele-
mentari che sono alla base della costruzione di frasi della lingua inglese. Pur
essendosi presto rivelate uno strumento inadeguato per lo studio del linguag-
gio naturale, le grammatiche formali hanno un ruolo fondamentale nello studio
delle propriet`a sintattiche dei programmi e dei linguaggi di programmazione.
Vediamo ora, in modo pi` u preciso, cos`e una grammatica formale e come
si caratterizzano le stringhe da essa generate.
Denizione 2.1 Una grammatica formale ( `e una quadrupla
( = V
T
, V
N
, P, S)
in cui
1. V
T
`e un insieme nito e non vuoto di simboli detto alfabeto terminale,
i cui elementi sono detti caratteri terminali, o terminali;
2. V
N
`e un insieme nito e non vuoto di simboli, detto alfabeto non termi-
nale i cui elementi sono detti caratteri non terminali (o non terminali,
o variabili, o categorie sintattiche);
2.1. GRAMMATICHE DI CHOMSKY 37
3. P `e una relazione binaria di cardinalit`a nita su
(V
T
V
N
)

V
N
(V
T
V
N
)

(V
T
V
N
)

.
P `e detta insieme delle regole di produzione (o delle produzioni, o delle
regole sintattiche). Una coppia , ) P, si indica generalmente con
la notazione ;
4. S V
N
`e detto assioma ed `e il simbolo non terminale di inizio, ossia la
categoria sintattica pi` u generale.
Si noti la presenza di almeno un carattere non terminale nel membro sinistro
di ogni produzione: le produzioni di una grammatica rappresentano le regole
mediante le quali una stringa non composta tutta di caratteri terminali pu`o
venire trasformata (riscritta) in unaltra. Il linguaggio generato dalla gram-
matica `e linsieme delle stringhe costituite da soli terminali ai quali si pu`o
pervenire partendo dallassioma e applicando una sequenza, arbitrariamente
lunga, di passi di riscrittura.
Esempio 2.1 Si consideri la grammatica ( = a, b, S, B, C, P, S), le cui regole
di produzione sono
1. S aS
2. S B
3. B bB
4. B bC
5. C cC
6. C c.
Con questa grammatica si possono generare le stringhe del linguaggio
L(() = a
n
b
m
c
h
[ n 0, m, h 1.
Ad esempio, per generare la stringa aabccc si deve applicare prima due volte la rego-
la 1, poi la regola 2, poi la regola 4, poi due volte la regola 5 ed inne la regola 6. Si
noti che per generare la stringa non `e stata mai usata la regola 3.
Normalmente un insieme di produzioni aventi stessa parte sinistra, del tipo
cio`e

1

2
. . .

n
,
viene convenzionalmente indicato, in maniera pi` u compatta, con la notazione

1
[
2
[ . . . [
n
.
38 CAPITOLO 2. LINGUAGGI FORMALI
Inoltre, lunione V
T
V
N
viene indicata con V . Ancora per convenzione, si
usano le maiuscole dellalfabeto latino per denotare i caratteri di V
N
, le mi-
nuscole iniziali dellalfabeto latino per denotare i caratteri di V
T
, le minuscole
nali per denotare stringhe di V

T
e le minuscole dellalfabeto greco per indicare
stringhe di V

.
Denizione 2.2 Una regola del tipo , dove V

V
N
V

, prende
il nome di -produzione o -regola.
La derivazione `e il passo formale di base che consente di generare stringhe
utilizzando una grammatica.
Denizione 2.3 Sia data una grammatica ( = V
T
, V
N
, P, S). La derivazio-
ne diretta (rispetto a () `e una relazione su (V

V
N
V

) V

, rappresentata
con il simbolo =
G
e cos` denita: la coppia , ) appartiene alla relazio-
ne, e scriviamo =
G
( deriva direttamente da tramite () se esistono
V

V
N
V

e , , V

tali che = , = e P.
Denizione 2.4 Data una grammatica (, una derivazione (in () `e una
sequenza di stringhe
1
, . . . ,
n
V

tali che i 1, . . . , n 1
i
=
G

i+1
.
La relazione di derivabilit`a (rispetto a () `e la chiusura transitiva e riessiva
della derivazione diretta: essa si rappresenta con la notazione

=
G
. Si osservi
che scrivendo

=
G
esprimiamo lesistenza di (almeno) una derivazione da
a .
Denizione 2.5 Data una grammatica (, si denisce forma di frase (in ()
una qualunque stringa V

tale che S

=
G
.
Denizione 2.6 Il linguaggio generato da una grammatica ( `e linsieme
L(() =
_
x [ x V

T
S

=
G
x
_
.
Il linguaggio generato da una grammatica formale `e dunque un insieme di
stringhe di caratteri terminali, ognuna delle quali si pu`o ottenere a partire
dallassioma mediante lapplicazione di un numero nito di passi di derivazione
diretta. Equivalentemente, possiamo denire il linguaggio generato da una
grammatica come linsieme di tutte e sole le forme di frase composte da soli
simboli terminali.
Quando risulter`a chiaro dal contesto a quale grammatica ci riferiamo,
anziche =
G
o

=
G
scriveremo semplicemente = o

=.
2.1. GRAMMATICHE DI CHOMSKY 39
`
E bene notare che talvolta si scrive
i
= per indicare che la stringa
`e ottenibile da mediante lapplicazione di i (o meno) passi di produzione
diretta.
Esempio 2.2 Si supponga di voler generare il linguaggio
L = a
n
b
n
c
n
[ n 1.
A tal ne si pu`o utilizzare una grammatica ( in cui V
T
= a, b, c e V
N
=
S, B, C, F, G e le regole di P sono le seguenti:
S aSBC
CB BC
SB bF
FB bF
FC cG
GC cG
G .
Per generare la stringa aabbcc si pu`o procedere come segue:
S = aSBC
= aaSBCBC
= aaSBBCC
= aabFBCC
= aabbFCC
= aabbcGC
= aabbccG
= aabbcc.
Ci`o mostra che S

= aabbcc, ed in particolare che S
i
= aabbcc per ogni i 8.
Come `e facile osservare, non `e vero che ogni sequenza di derivazioni dirette
conduce prima o poi ad una stringa del linguaggio generato dalla grammatica.
Esempio 2.3 Se si considera la grammatica dellEsempio 2.2, `e facile trovare una
sequenza di produzioni che genera una stringa in cui sono presenti anche dei non
terminali ed alla quale non possono essere applicate ulteriori produzioni. Ad esempio,
S = aSBC
= aaSBCBC
= aabFCBC
= aabcGBC
= aabcBC.
40 CAPITOLO 2. LINGUAGGI FORMALI
Per lo stesso motivo possono esistere grammatiche che generano il linguaggio
vuoto, che cio`e non generano alcuna stringa di V

T
.
Esempio 2.4 La grammatica ( = a, b, S, A, P, S) con produzioni P
S Ab
A Sa
genera il linguaggio vuoto .
Si osservi che tutti gli enunciati del tipo la grammatica ( genera il linguag-
gio L (dove L viene descritto tramite una propriet`a caratteristica) spesso
introdotti in questo volume dovrebbero essere, almeno in linea di principio,
formalmente dimostrati provando che la grammatica genera tutte e sole le
parole del linguaggio.
Esempio 2.5 Data la grammatica ( = a, b, c, S, A, P, S) con produzioni P
S aSc [ A
A bAc [ ,
dimostriamo che ( genera il linguaggio
L =
_
a
n
b
m
c
n+m
[ n, m 0
_
.
Proviamo dapprima che L(() L. A tale scopo `e immediato vericare che tutte
le forme di frase costruite da ( sono del tipo
a
k
Sc
k
, k 0, oppure
a
k
b
j
Ac
k+j
, k 0 e j 0.
Ne segue che ogni parola z generata da ( `e ottenuta tramite una derivazione del tipo
S
k
= a
k
Sc
k
1
= a
k
Ac
k
j
= a
k
b
j
Ac
k+j
1
= a
k
b
j
c
k+j
= z.
Ogni parola derivata dunque appartiene a L.
Proviamo ora che L L((). A tale scopo basta osservare che ogni stringa di
z L `e del tipo a
n
b
m
c
n+m
e che essa viene generata da ( attraverso la seguente
derivazione:
S
m
= a
m
Sc
m
1
= a
m
Ac
m
n
= a
m
b
n
Ac
m+n
1
= a
m
b
n
c
m+n
= z.
Esiste dunque in ( una derivazione che costruisce z.
Come si `e visto nellesempio precedente, la dimostrazione del fatto che una
grammatica genera un dato linguaggio pu`o essere eccessivamente tediosa, so-
prattutto se si considera che in molti casi (come accade nellesempio stesso)
tale propriet`a della grammatica si pu`o vericare facilmente in modo intuitivo.
Per tale motivo, nel seguito, non forniremo pi` u dimostrazioni formali di tale
2.1. GRAMMATICHE DI CHOMSKY 41
tipo e ci aderemo allintuizione del lettore, il quale potr`a comunque convin-
cersi con facilit`a che le grammatiche date generano eettivamente i linguaggi
voluti.
Esercizio 2.1 Data la grammatica ( = a, S, I, F, M, P, S) con produzioni P
S a [ aa [ IaF
aF Maa [ MaaF
aM Maa
IM Ia [ aa,
provare che ( genera il linguaggio
_
a
2
n
[ n 0
_
.
Esercizio 2.2 Denire una grammatica che il linguaggio a
n
b
m
c
p
[ n = mm = p
e dimostrare la sua correttezza.
In generale uno stesso linguaggio pu`o essere generato da (innite)
grammatiche diverse.
Denizione 2.7 Due grammatiche (
1
e (
2
si dicono equivalenti se L((
1
) =
L((
2
).
Esercizio 2.3 Dimostrare che la grammatica con produzioni
S aS [ b
e la grammatica con produzioni
S b [ Ab
A Aa [ a
sono equivalenti.
Introducendo restrizioni sulla struttura delle produzioni si ottengono vari
tipi di grammatiche. Nel resto di questa sezione vedremo le caratteristiche di
tali grammatiche e la classicazione di linguaggi cui esse danno luogo.
2.1.1 Grammatiche di tipo 0
Le grammatiche di tipo 0, dette anche non limitate, deniscono la classe di
linguaggi pi` u ampia possibile.
1
In esse le produzioni sono del tipo pi` u generale:
, V

V
N
V

, V

.
1
Pi` u ampia nellambito dei linguaggi descrivibili con grammatiche. Esistono tuttavia
linguaggi per cui non esiste una grammatica corrispondente. Questo aspetto sar`a trattato
nel Capitolo 7.
42 CAPITOLO 2. LINGUAGGI FORMALI
Si noti che queste grammatiche ammettono anche derivazioni che accorciano
le forme di frase , come ad esempio quelle che si ottengono applicando le
-produzioni.
Esempio 2.6 Le produzioni
S aSa [ aAb [ aAa [
aAa a [
aaAb b [
appartengono ad una grammatica di tipo 0. Come conseguenza immediata, la
grammatica considerata nellEsempio 2.2 risulta essere di tipo 0.
Esempio 2.7 La grammatica
( = a, b, S, A, P, S),
in cui P `e
S aAb
aA aaAb
A ,
`e anchessa una grammatica di tipo 0 e genera il linguaggio L = a
n
b
n
[ n 1.
I linguaggi generabili da grammatiche di tipo 0 si dicono linguaggi di tipo 0.
2.1.2 Grammatiche di tipo 1
Queste grammatiche, dette anche contestuali o context sensitive (CS), am-
mettono qualunque regola di produzione che non riduca la lunghezza delle
stringhe, cio`e produzioni del tipo:
, V

V
N
V

, V
+
, [ [[ [ .
Esempio 2.8 Le produzioni
S aSa [ aAb [ aAa
aA aa
Ab aab
appartengono ad una grammatica di tipo 1.
I linguaggi generabili da grammatiche di tipo 1 si dicono linguaggi di tipo 1,
o contestuali , o context sensitive (CS).
Esempio 2.9 Come si `e potuto vedere, in base allEsempio 2.2, il linguaggio
a
n
b
n
c
n
[ n 1 `e certamente di tipo 0. Lo stesso linguaggio pu`o venir gene-
rato da una grammatica di tipo 1 equivalente avente le produzioni S aBSc [ abc,
Ba aB, Bb bb. Dunque il linguaggio a
n
b
n
c
n
[ n 1 `e contestuale.
2.1. GRAMMATICHE DI CHOMSKY 43
Il termine linguaggio contestuale, deriva dal fatto che, storicamente, questi
linguaggi sono stati deniti da Chomsky come la classe dei linguaggi generabili
da grammatiche aventi produzioni contestuali del tipo

1
A
2

1

2
, A V
N
,
1
,
2
V

, V
+
,
in cui si esprime il fatto che la produzione A pu`o essere applicata solo se
A si trova nel contesto
1
,
2
). Ad esempio, nella grammatica per il linguaggio
a
n
b
n
c
n
[ n 1 riportata nellEsempio 2.9, la produzione Bb bb ha la
struttura suddetta, cio`e il carattere B pu`o essere rimpiazzato dal carattere b
solo se alla sua destra `e presente il contesto b.
Esercizio 2.4 Mostrare che le grammatiche con produzioni contestuali possono ge-
nerare tutti e soli i linguaggi di tipo 1.
[Suggerimento: Ridursi a una grammatica con produzioni senza simboli terminali nel-
le parti sinistre e sostituire ciascuna produzione non avente la struttura contestuale
suddetta con un insieme di produzioni contestuali equivalente.]
2.1.3 Grammatiche di tipo 2
Queste grammatiche, dette anche non contestuali o context free (CF), ammet-
tono produzioni del tipo:
A , A V
N
, V
+
cio`e produzioni in cui ogni non terminale A pu`o essere riscritto in una stringa
indipendentemente dal contesto in cui esso si trova.
Esempio 2.10 Il linguaggio generato dalla grammatica dellEsempio 2.7 pu`o essere
generato anche dalla grammatica equivalente di tipo 2 con produzioni:
S aSb [ ab.
Esempio 2.11 Un esempio di grammatica non contestuale `e costituito dalla gram-
matica che, a partire dallassioma E, genera espressioni aritmetiche di somme e
moltiplicazioni in una variabile i, con le seguenti produzioni:
E E +T [ T
T T F [ F
F i [ (E).
I linguaggi generabili da grammatiche di tipo 2 vengono detti linguaggi di
tipo 2 o non contestuali o context free (CF).
Esempio 2.12 Il linguaggio delle parentesi ben bilanciate `e di tipo 2. Esso pu`o essere
generato dalla grammatica ( = (, ), S, P, S), dove P `e linsieme delle produzioni
S ()
S SS
S (S).
44 CAPITOLO 2. LINGUAGGI FORMALI
Esercizio 2.5 Denire una grammatica non contestuale per generare tutte le stringhe
palindrome, cio`e quelle che risultano uguali se lette da destra verso sinistra o da
sinistra verso destra.
2.1.4 Grammatiche di tipo 3
Queste grammatiche, dette anche lineari destre o regolari , ammettono
produzioni del tipo:
A , A V
N
, (V
T
V
N
) V
T
.
Il termine regolare deriva dal fatto che, come vedremo pi` u avanti (ve-
di Sezione3.6, tali linguaggi sono rappresentabili per mezzo di espressioni rego-
lari. Il termine lineare deriva dal fatto che al lato destro di ogni produzione
compare al pi` u un simbolo non terminale.
I linguaggi generabili da grammatiche di tipo 3 vengono detti linguaggi di
tipo 3 o regolari .
Esempio 2.13 La grammatica denita da
( = a, b, S, P, S)
in cui P contiene le produzioni
S aS
S b
`e una grammatica di tipo 3 e genera il linguaggio regolare L = a
n
b [ n 0.
Esercizio 2.6 Denire una grammatica regolare per il linguaggio delle stringhe
sullalfabeto a, b che contengono un numero dispari di a.
Esercizio 2.7 Con riferimento allEsercizio 1.24 e alla Figura 1.6, denire una gram-
matica regolare che generi le stringhe corrispondenti a tutti i percorsi, anche passanti
pi` u volte per uno stesso nodo, tra A e B.
In modo del tutto analogo, i linguaggi regolari si possono denire anche
mediante grammatiche lineari sinistre caratterizzate da regole del tipo:
A , A V
N
, (V
N
V
T
) V
T
.
Esempio 2.14 Come si `e visto nellEsercizio 2.3, il linguaggio a
n
b [ n 0 pu`o
anche essere generato attraverso le produzioni
S Ab [ b
A Aa [ a.
Vedremo nel seguito (Esercizio 3.11) che per ogni grammatica lineare destra
ne esiste una lineare sinistra equivalente e viceversa.
2.1. GRAMMATICHE DI CHOMSKY 45
2.1.5 Gerarchia di Chomsky
Si verica immediatamente che per ogni 0 n 2, ogni grammatica di tipo
n + 1 `e anche di tipo n, e pertanto linsieme dei linguaggi di tipo n contiene
tutti i linguaggi di tipo n+1, formando quindi una gerarchia, detta Gerarchia
di Chomsky. Peraltro `e possibile mostrare che il contenimento `e stretto, come
illustrato in Figura 2.1.
Tipo 3
Tipo 2
Tipo 1
Tipo 0
Figura 2.1 Relazioni tra i tipi di linguaggi.
Denizione 2.8 Un linguaggio L viene detto strettamente di tipo n se esiste
una grammatica ( di tipo n che genera L e non esiste alcuna grammatica (

di tipo m > n che possa generarlo.


Esempio 2.15 Il linguaggio L = a
n
b
n
[ n 1 pu`o essere generato sia dalla gram-
matica dellEsempio 2.7, che `e di tipo 0, perche ammette -produzioni, sia dalla gram-
matica dellEsempio 2.10 che `e una grammatica non contestuale, per cui il linguaggio
`e di tipo 2. Tuttavia `e possibile dimostrare che non esiste nessuna grammatica di
tipo 3 che lo pu`o generare (vedi Teorema 3.5): pertanto esso `e strettamente di tipo 2.
Le propriet`a di inclusione stretta delle varie classi di linguaggi, tra cui quelle
citate nellesempio precedente, saranno arontate successivamente.
Per comodit`a del lettore la classicazione delle grammatiche viene ripor-
tata nella Tabella 2.1. Le grammatiche di tipo 3, le pi` u povere, permettono
di generare linguaggi molto limitati. Ad esempio, con queste grammatiche
`e possibile generare il linguaggio L = a
n
b [ n 0, mentre non si pu`o
generare il linguaggio L = a
n
b
n
[ n 0, per il quale, come vedremo nella
Sezione 3.4, `e invece necessaria una grammatica di tipo 2.
46 CAPITOLO 2. LINGUAGGI FORMALI
TIPO PRODUZIONI DOVE
TIPO 0
non limitate
V

V
N
V

, V

TIPO 1
contestuali

[ [[ [,
V

V
N
V

, V
+
TIPO 2
non contestuali
A A V
N
, V
+
TIPO 3
regolari
A A V
N
, (V
T
(V
T
V
N
))
Tabella 2.1 Classicazione delle grammatiche secondo Chomsky.
Le grammatiche non contestuali consentono di generare strutture sin-
tattiche anche piuttosto articolate come quelle utilizzate dai linguaggi di
programmazione (vedi Sezione 2.4).
Ovviamente le grammatiche di tipo 1 sono ancora pi` u potenti e permettono
di descrivere linguaggi ancora pi` u complessi, come ad esempio il linguaggio
a
n
b
n
c
n
[ m 0, che `e strettamente di tipo 1.
Esempio 2.16 La seguente grammatica contestuale genera il linguaggio ww [ w
(a +b)
+
.
S aAS [ bBS [ A
0
a [ B
0
b (2.1)
Aa aA
Ab bA
Ba aB
Bb bB
(2.2)
AA
0
A
0
a
BA
0
A
0
b
AB
0
B
0
a
BB
0
B
0
b
(2.3)
A
0
a
B
0
b
(2.4)
2.1. GRAMMATICHE DI CHOMSKY 47
Consideriamo ad esempio una possibile derivazione, in questa grammatica, della
stringa abbabb:
S = aAS = aAbBS = aAbBB
0
b
= aAbB
0
bb = abAB
0
bb = abB
0
abb
= abbabb.
(2.5)
Lultimo esempio verr`a utilizzato per mostrare come un linguaggio pu`o essere
generato da grammatiche di tipo diverso.
Esempio 2.17 Il linguaggio
L =
_
(x#)
+
[ x = permutazione di a, b, c)
_
permette di generare stringhe costituite dalla concatenazione di un numero qualunque,
maggiore di 0, di permutazioni dei terminali a, b, c, terminate dal carattere #.
`
E
semplice descrivere una grammatica di tipo 1 in grado di generare questo linguaggio:
essa `e la grammatica
( = a, b, c, #, S, A, B, C, P, S),
dove P contiene le produzioni
S ABC#S [ ABC#
AB BA
AC CA
BC CB
A a
B b
C c.
Per lo stesso linguaggio si pu`o denire la seguente grammatica di tipo 2:
(

= a, b, c, #, S, E, P

, S),
dove P

contiene le produzioni
S E#S [ E#
E abc [ acb [ cba [ bac [ bca [ cab.
Si pu`o inne trovare anche una grammatica regolare che genera lo stesso linguaggio,
come la seguente:
(

= a, b, c, #, S, R, X, Y, Z, X

, Y

, Z

, X

, Y

, Z

, P

, S),
48 CAPITOLO 2. LINGUAGGI FORMALI
dove P

contiene le produzioni
S aX [ bY [ cZ
X bX

[ cX

cR
X

bR
Y aY

[ cY

cR
Y

aR
Z aZ

[ bZ

bR
Z

aR
R #S [ #.
Come si vede, a parit`a di linguaggio, lutilizzazione di una grammatica di tipo pi` u
alto pu`o comportare la necessit`a di un numero maggiore di produzioni.
Esercizio 2.8 Cosa succederebbe se considerassimo permutazioni di 4, 5, . . . , n ca-
ratteri anziche 3? Come varierebbe il numero delle produzioni necessarie nelle tre
grammatiche?
2.2 Grammatiche con -produzioni
In base alle denizioni date nora, non `e possibile generare la stringa vuota
con grammatiche di tipo 1, 2 o 3. Daltra parte in molti casi `e possibile genera-
re linguaggi contenenti anche la stringa vuota senza ricorrere allintero potere
generativo delle grammatiche di tipo 0. Come vedremo, tali linguaggi posso-
no essere generati apportando lievi modiche al tipo di produzioni ammesse
per le grammatiche non contestuali e regolari. Queste modiche consistono
semplicemente nellaggiunta di opportune -produzioni. Inoltre, `e interessante
valutare limpatto determinato dallintroduzione di -produzioni anche per le
grammatiche contestuali.
Innanzi tutto possiamo mostrare che, dato un qualunque linguaggio di
tipo 1, 2 o 3, `e possibile modicare la grammatica che lo genera in modo
da ottenere lo stesso linguaggio arricchito della sola stringa vuota; a tal ne
basta semplicemente limitare le -produzioni al solo assioma, procedendo come
descritto di seguito.
Se una grammatica ( = V
T
, V
N
, P, S) di tipo 1, 2 o 3 genera un linguaggio
L, per poter generare il linguaggio L `e suciente utilizzare la grammatica
(

=

V
T
, V
N
S

, P

, S

_
,
dove
P

= P S

[ S P.
2.2. GRAMMATICHE CON -PRODUZIONI 49
Esempio 2.18 Consideriamo le produzioni della grammatica ( = V
T
, V
N
, P, S), gi`a
introdotta nellEsempio 2.9,
S aBSc [ abc
Ba aB
Bb bb.
Risulta L(() = a
n
b
n
c
n
[ n 1.
`
E immediato vericare che la grammatica
(

= V
T
, V
N
S

, P

, S

) con produzioni P

aBSc [ abc [
S aBSc [ abc
Ba aB
Bb bb
genera a
n
b
n
c
n
[ n 0.
Come si pu`o osservare, le -produzioni si possono anche aggiungere diretta-
mente allassioma delle grammatiche di tipo 1, 2 o 3 (senza introdurre un
nuovo assioma, come fatto sopra), senza che questo abbia conseguenze par-
ticolarmente signicative, purche lassioma non appaia mai al lato destro di
una produzione. In eetti, `e interessante osservare che tale condizione `e es-
senziale per limitare le conseguenze dellinserimento di -produzioni. Infatti,
consideriamo ad esempio la grammatica con produzioni
S Ub
U ab [ S
che genera le stringhe del tipo ab

bb. Se aggiungiamo la -produzione S


`e immediato vericare che la nuova grammatica non solo genera la stringa
vuota, ma anche tutte le stringhe del tipo bb

.
Esaminiamo ora, pi` u in generale, le conseguenze provocate dalla presenza
indiscriminata di -produzioni allinterno di una grammatica. A tal proposito,
si pu`o mostrare che la situazione `e diversa a seconda che si trattino grammati-
che di tipo 1, 2 o 3. Vediamo innanzi tutto come, nel primo caso, laggiunta non
controllata di -produzioni aumenti in modo sostanziale il potere generativo
della grammatica.
Esempio 2.19 Si consideri una grammatica
( = V
T
, V
N
, P, S)
che abbia tutte produzioni di tipo 1 tranne una sola regola del tipo con
[ [[ [: sia essa la regola AB C. Si pu`o costruire allora la grammatica
(

= V
T
, V
N
H, P

, S) con produzioni o di tipo 1 o -produzioni, che rispetto a


( ha un non terminale in pi` u ed un insieme di regole di produzione P

:
P

= P AB C AB CH, H .
50 CAPITOLO 2. LINGUAGGI FORMALI
Osservando che alla singola derivazione AB=
G
C corrisponde la sequenza di deriva-
zioni AB
=
G

CH
=
G

C, e che lintroduzione del simbolo non terminale H non estende


linsieme delle stringhe generabili, ne deriva che L(() = L((

).
Mediante una semplice generalizzazione dellesempio precedente possiamo di-
mostrare il seguente teorema.
Teorema 2.1 Data una grammatica ( = V
T
, V
N
, P, S) di tipo 0, esiste
una grammatica (

, ottenuta estendendo con opportune -produzioni una


grammatica di tipo 1, equivalente a (.
Dimostrazione. La grammatica (

= V

T
, V

N
, P

, S

) `e caratterizzata da:
V

T
= V
T
, V

N
= V
N
X, con X , V
N
, S

= S e P

ottenuto da P aggiungendo
la produzione X e sostituendo ad ogni produzione con [ [>[
[> 0 la produzione
X . . . X
. .
|||| volte
.
`
E semplice vericare che con la grammatica (

sono derivabili tutte e sole le


stringhe di V

T
derivabili con la grammatica (. 2
Nel caso di grammatiche di tipo 2 o 3 abbiamo invece che laggiunta indi-
scriminata di -produzioni non altera il potere generativo delle grammatiche.
Infatti si pu`o dimostrare che data una grammatica del tipo suddetto estesa con
-produzioni, ne possiamo sempre costruire una equivalente, dello stesso tipo,
che usa -produzioni solo a partire dallassioma (nel caso che appartenga
al linguaggio da generare) o non ne usa aatto (in caso contrario). Vediamo
innanzi tutto, mediante due esempi, come ci`o sia possibile.
Esempio 2.20 Nella grammatica regolare avente le produzioni
S bX [ aB
B cX
X
la produzione vuota si pu`o eliminare riscrivendo le produzioni nella forma
S b [ aB
B c
in cui la -produzione `e completamente scomparsa.
Esempio 2.21 Nella grammatica non contestuale
S AB [ aB [ B
A ab [ aB
B cX [ X
X
2.2. GRAMMATICHE CON -PRODUZIONI 51
la -produzione si pu`o far migrare verso lassioma sostituendola allindietro e
ottenendo prima le produzioni
S AB [ aB [ B
A ab [ aB
B c [
e poi, ripetendo il procedimento, le produzioni
S AB [ A [ aB [ a [ B [
A ab [ aB [ a
B c.
Non `e dicile fornire anche una dimostrazione formale di quanto detto.
Teorema 2.2 Data una grammatica ( = V
T
, V
N
, P, S) il cui insieme di pro-
duzioni P comprende soltanto produzioni di tipo non contestuale e produzioni
vuote, esiste una grammatica non contestuale (

tale che L((

) = L(() .
Dimostrazione. Il primo passo della dimostrazione consiste nel costruire
(

= V
T
, V
N
, P

, S). A tale scopo determiniamo innanzi tutto linsieme N


V
N
dei simboli che si annullano, cio`e i non terminali da cui `e possibile derivare
tramite (. Ci`o pu`o essere fatto applicando lAlgoritmo 2.1. Tale algoritmo
costruisce una sequenza N
0
, N
1
, . . . , N
k
= N di sottoinsiemi di V
N
, ponendo
inizialmente N
0
= A V
N
[ A P e costruendo N
i+1
a partire da
N
i
nel modo seguente:
N
i+1
= N
i

_
B V
N
[ (B P) ( N
+
i
)
_
.
Lalgoritmo termina quando N
k+1
= N
k
, k 0. Si noti che L(() se e solo
se S N. Per costruire linsieme P

delle produzioni di (

si pu`o applicare
input grammatica ( = V
T
, V
N
, P, S);
output insieme N V
N
dei simboli che si annullano;
begin
N := A V
N
[ A P;
repeat

N := N;
N :=

N
_
B V
N
[ (B P) (

N
+
)
_
until N =

N
end.
Algoritmo 2.1: Determina Simboli Annullabili
52 CAPITOLO 2. LINGUAGGI FORMALI
lAlgoritmo 2.2, il quale esamina ciascuna produzione A di P, con
lesclusione delle -produzioni. Se nessun simbolo di si annulla lalgoritmo
inserisce la produzione A in P

; altrimenti contiene k > 0 simboli che


si annullano. In tal caso lalgoritmo aggiunge a P

tutte le possibili produzioni


ottenute da A eliminando da uno dei sottoinsiemi di simboli che
si annullano: i simboli di che si annullano sono considerati con la propria
molteplicit`a. Ad esempio, se N = S, A, B ed esiste in P la produzione
A BCBA, allora vengono inserite in P

le produzioni A BCBA,
A CBA, A BCA, A BCB, A CA, A CB, A BC
e A C. Fa eccezione, nel caso k =[ [ (in cui cio`e tutti i simboli a
destra nella produzione si annullano), il sottoinsieme di cardinalit`a [ [, la
cui eliminazione darebbe luogo ad una -produzione, che non viene aggiunta.
Dunque, in corrispondenza alla produzione A , lalgoritmo aggiunge
a P

min2
||
1, 2
k
produzioni.
La procedura viene ripetuta per ciascuna produzione non vuota di P. Per
input grammatica ( = V
T
, V
N
, P, S), insieme N V
N
dei simboli che si annullano;
output insieme P

delle produzioni di (

;
begin
P

:= ;
for each A P con ,= do
begin
sia = Z
1
, . . . , Z
t
;
J := i [ Z
i
N;
for each J

2
J
do
if J

,= 1, . . . , t then
begin
sia la stringa ottenuta eliminando da ogni Z
i
con i J

;
P

:= P

A
end
end
end.
Algoritmo 2.2: Elimina -produzioni
provare che L((

) = L(() basta mostrare, per induzione sulla lunghezza


della derivazione, che A V
N
e w V
+
T
:
A

=
G
w (w ,= A

=
G

w).
Tale dimostrazione `e lasciata al lettore come esercizio (Esercizio 2.9). 2
Si osservi che, nel caso in cui L(() contiene , si pu`o ottenere da (

una gram-
matica equivalente a ( tramite la semplice introduzione di una -produzione
sullassioma di (

, applicando la tecnica vista nellEsempio 2.18.


2.2. GRAMMATICHE CON -PRODUZIONI 53
Esempio 2.22 Consideriamo la grammatica ( = a, b, S, A, B, P, S), le cui pro-
duzioni P sono:
S A [ SSa
A B [ Ab [
B S [ ab [ aA.
Applicando la tecnica descritta nella dimostrazione del Teorema 2.2 costruiamo ini-
zialmente gli insiemi N
0
= A, N
1
= S, A e N = N
2
= S, A, B. La grammatica
(

= a, b, S, A, B, P

, S) che genera L(() ha le seguenti produzioni P

:
S A [ SSa [ Sa
A B [ Ab [ b
B S [ ab [ aA [ a.
Una grammatica equivalente a ( senza -produzioni (se non al pi` u sullassioma) `e
dunque a, b, T, S, A, B, P

T S, T , T).
Esercizio 2.9 Completare la dimostrazione del Teorema 2.2.
Nel caso particolare in cui la grammatica `e regolare `e possibile dimostrare
un risultato analogo.
Teorema 2.3 Data una grammatica ( = V
T
, V
N
, P, S) il cui insieme di pro-
duzioni P `e partizionabile in un sottoinsieme di produzioni di tipo regola-
re e in un sottoinsieme di produzioni vuote, esiste una grammatica regolare
(

= V
T
, V
N
, P

, S) tale che L((

) = L(() .
Dimostrazione. Innanzi tutto notiamo che L(() se e solo se S
P, per cui per dimostrare il teorema basta provare che (

= V
T
, V
N
, P

, S) `e
equivalente alla grammatica (

= V
T
, V
N
, P S , S). Sebbene la di-
mostrazione del Teorema 2.2 possa essere facilmente adattata al caso in esame,
preferiamo qui procedere con una tecnica che sfrutta al meglio le peculiarit`a
delle produzioni di tipo regolare.
Costruiamo dunque linsieme P

delle produzioni di (

. Inseriamo inizial-
mente in P

tutte le produzioni non vuote presenti in P. Quindi, per ciascuna


produzione A P S , consideriamo tutte le produzioni in P
del tipo B aA, con B V
N
e a V
T
: per ciascuna di queste inseriamo in
P

la produzione B a.
Per completare la dimostrazione del teorema `e suciente mostrare che
A V
N
e w V

T
A

=
G

w A

=
G

w.
Ci`o pu`o essere facilmente provato per induzione sulla lunghezza della deriva-
zione. 2
54 CAPITOLO 2. LINGUAGGI FORMALI
Esercizio 2.10 Data la seguente grammatica,
S ASB [ XL [ ASCL
X AB [
C b
B b
A a
L a [ .
Eliminare, se possibile, le -produzioni in essa presenti.
Nel seguito si adotter`a la classicazione delle grammatiche formali, e dei
corrispondenti linguaggi generati, proposta da Chomsky, con la modica, alla
luce di quanto visto nella presente sezione, che nel caso di grammatiche di
tipo 2 e 3 `e consentita la presenza di -produzioni, mentre nel caso di gram-
matiche di tipo 1 `e ammessa la presenza di -produzioni solo sullassioma, a
condizione che questo non compaia mai nella parte destra di una produzione.
2.3 Linguaggi lineari
Nella Sezione 4.1 mostreremo che tutti i linguaggi non contestuali possono
essere generati mediante grammatiche in cui il lato destro di una produzione
contiene al pi` u due non terminali. Una interessante restrizione della classe dei
linguaggi CF `e rappresentata dai linguaggi generati da grammatiche CF in cui
ogni produzione ha al pi` u un simbolo non terminale nella parte destra.
Denizione 2.9 Si dice lineare una grammatica non contestuale in cui la
parte destra di ogni produzione contenga al pi` u un non terminale.
Chiaramente, come visto nella Sezione 2.1, le grammatiche di tipo 3 sono tutte
grammatiche lineari: in particolare esse sono lineari destre se le produzioni
sono del tipo A aB e lineari sinistre se le produzioni sono del tipo A
Ba.
La classe dei linguaggi lineari `e la classe dei linguaggi generabili con gram-
matiche lineari. Si pu`o dimostrare che questa classe `e strettamente contenuta
in quella dei linguaggi non contestuali e contiene strettamente quella dei lin-
guaggi regolari, come indicato in Figura 2.2. Il seguente esempio mostra una
grammatica lineare per un linguaggio che, come vedremo, `e strettamente non
contestuale.
Esempio 2.23 La grammatica con produzioni
S aSb
S ab
`e una grammatica lineare. Essa genera il linguaggio L = a
n
b
n
[ n 1.
2.4. FORMA NORMALE DI BACKUS E DIAGRAMMI SINTATTICI 55
Regolari
Lineari
Context free
Figura 2.2 Relazione tra linguaggi lineari, regolari e context free.
Esercizio 2.11 Dimostrare che se consideriamo grammatiche che ammettono sia
produzioni lineari destre che produzioni lineari sinistre possiamo generare tutti e soli
i linguaggi lineari.
2.4 Forma Normale di Backus e diagrammi sintattici
Nelle sezioni precedenti abbiamo visto che le grammatiche formali sono stru-
menti di tipo generativo per la denizione di linguaggi. In particolare es-
se possono essere utilizzate per la denizione di linguaggi di programmazio-
ne, consentendo cos` di caratterizzare un linguaggio di programmazione come
linsieme di tutte le stringhe (programmi) derivabili dalla grammatica.
Per la denizione sintattica dei linguaggi di programmazione vengono adot-
tate grammatiche non contestuali, tradizionalmente rappresentate median-
te una notazione specica, particolarmente suggestiva, denominata Forma
Normale di Backus (Backus Normal Form, BNF, detta anche Backus-Naur
Form).
La BNF `e una notazione per grammatiche context free resa pi` u espressiva e
succinta mediante i seguenti accorgimenti (alcuni dei quali vagamente ispirati
alle espressioni regolari):
1. I simboli non terminali sono sempre costituiti da stringhe che denomi-
nano delle categorie sintattiche racchiuse tra parentesi acute <...> (ad
es.: <espressione>);
2. Il segno di produzione () viene sostituito dal simbolo ::= in modo da
56 CAPITOLO 2. LINGUAGGI FORMALI
non confonderlo con i simboli , =, e :=, che sono simboli terminali
usati in vari linguaggi di programmazione.
3. Le parentesi grae . . . vengono impiegate per indicare literazione illi-
mitata (0, 1, 2, . . . , n, . . . volte). Analogamente con . . .
n
si pu`o indica-
re literazione per un numero di volte pari al pi` u ad n. Ad esempio, le
produzioni:
A ::= bA [ a
possono essere cos` riscritte:
A ::= b a
e le produzioni:
A ::= x [ xy [ xyy [ xyyy [ xyyyy [ xyyyyy
possono essere cos` riscritte:
A ::= x y
5
4. Le parentesi quadre [. . .] vengono utilizzate per indicare lopzionalit`a
(possibile assenza di una parte di stringa). Ad esempio, le produzioni:
A ::= xy [ y
possono essere cos` riscritte:
A ::= [x] y
5. Le parentesi tonde (. . .) vengono utilizzate per indicare la fattorizzazione,
vale a dire la messa in comune di una sottoespressione. Ad esempio, le
produzioni:
A ::= xu [ xv [ xy
possono essere cos` riscritte:
A ::= x
_
u [ v [ y
_
Esempio 2.24 Possiamo esprimere la struttura di un identicatore nel linguaggio
Pascal, denito informalmente come una sequenza di al pi` u n > 0 caratteri alfa-
numerici di cui il primo necessariamente alfabetico, tramite la BNF nel seguente
modo:
2.4. FORMA NORMALE DI BACKUS E DIAGRAMMI SINTATTICI 57
<identificatore> ::= <alfabetico> < alfanumerico >
n1
<alfanumerico> ::= <alfabetico> [ <cifra>
<alfabetico> ::= A [ B [ [ Z [ a [ b [ [ z
<cifra> ::= 0 [ 1 [ [ 9
Esempio 2.25 Riportiamo di seguito un frammento della BNF per il linguaggio
Pascal:
<programma> ::= <intestazione> ; <blocco>.
<intestazione> ::= program <identificatore> [ <lista par.> ]
<lista par.> ::= <lista identif.>
<lista identif.> ::= <identificatore> {, <identificatore> }
<blocco> ::= [< sezione dichiarazione etichette >]
[< sezione definizione costanti >]
[< sezione definizione tipi >]
[< sezione dichiarazione variabili >]
[< sezione dichiarazione procedure e funzioni >]
[< sezione istruzioni >]

<sezione definizione tipi> ::= type <identificatore>=<tipo>
; < identificatore > = < tipo >

<proposizione-while> ::= while <predicato> do <proposizione>
<proposizione-if> ::= if <predicato> then <proposizione>
else <proposizione>

<predicato> ::= <espressione-booleana>
<proposizione> ::= <proposizione-semplice> [
<proposizione-composta>
<proposizione composta> ::= begin <proposizione>
; < proposizione > end
<proposizione-semplice> ::= <assegnazione> [
<proposizione-if> [
58 CAPITOLO 2. LINGUAGGI FORMALI
<proposizione-while>
<assegnazione> ::= <identificatore> := <espressione>
Unaltra notazione molto utilizzata per descrivere i linguaggi di program-
mazione `e costituita dai diagrammi sintattici , anchessi riconducibili ad un
meccanismo di tipo generativo, ma inuenzati dal concetto di automa (vedi
Sezione 3.1).
Tali diagrammi sono sostanzialmente dei gra orientati con un ingresso ed
unuscita, e i cui nodi sono collegati da archi etichettati con uno o pi` u caratteri
terminali o non terminali. I caratteri terminali vengono usualmente inclusi in
un cerchio o in una forma di tipo ellittico e quelli non terminali vengono
inclusi in un rettangolo: ad ogni simbolo non terminale corrisponde a sua
volta un diagramma sintattico. Quando un arco di un diagramma sintattico
`e etichettato con un simbolo non terminale si deve immaginare che tale arco
sia sostituito dal diagramma sintattico corrispondente al non terminale stesso.
Ogni cammino in un diagramma sintattico denisce una forma di frase.
Esempio 2.26 Il diagramma sintattico dato in Figura 2.3 equivale alla grammatica:
A aABc [ aBc
B bB [ b
a
B
c
A
b B
A :
B :
Figura 2.3 Diagramma sintattico di un semplice linguaggio.
Esercizio 2.12 Fornire la forma di Backus e i diagrammi sintattici per il linguaggio
delle espressioni aritmetiche (vedi Esempio 2.11).
2.5 Accettazione e riconoscimento di linguaggi
Le grammatiche formali introdotte in questa sezione costituiscono uno stru-
mento generativo per la rappresentazione e la classicazione di linguaggi. Esse
2.5. ACCETTAZIONE E RICONOSCIMENTO DI LINGUAGGI 59
non consentono tuttavia di impostare in modo algoritmico il problema del rico-
noscimento di un linguaggio, e cio`e il problema di decidere, dato un linguaggio
L e una stringa x, se x L. Tale problema riveste importanza fondamentale:
si ricorda, a tal proposito, che il problema di stabilire se un programma scrit-
to in un linguaggio di programmazione sia sintatticamente corretto pu`o essere
formalizzato come il problema di decidere se una particolare stringa (appunto,
il programma sorgente) appartenga o meno a un determinato linguaggio (ad
esempio, il Pascal, visto come linsieme dei programmi Pascal sintatticamente
corretti), denito per mezzo di una opportuna grammatica (ad esempio, la
denizione del Pascal in BNF).
Notiamo inoltre che limportanza di arontare i problemi di riconoscimento
di linguaggi deriva anche dal fatto che ogni problema decisionale, cio`e un
qualunque problema consistente nel determinare se una certa propriet`a sia
vericata o meno sullistanza fornita in input, pu`o essere visto come problema
di riconoscimento di un particolare linguaggio (ad esempio, il problema di
decidere se un dato numero intero sia un numero primo pu`o essere espresso
come il problema di riconoscere tutte le stringhe di 0 e 1 che costituiscono la
rappresentazione binaria di un numero primo).
2.5.1 Automi e computazioni
Il concetto fondamentale per quanto riguarda il riconoscimento di linguaggi `e
il concetto di automa, inteso come dispositivo astratto che, data un stringa
x fornitagli in input, pu`o eseguire una computazione ed eventualmente, se la
computazione termina, restituisce, secondo una qualche modalit`a, un valore
che, nel caso del problema del riconoscimento, sar`a booleano. In generale, la
x
yes
no
Figura 2.4 Schema generale di automa.
struttura di un automa comprende un dispositivo interno, che ad ogni istante
assume uno stato in un possibile insieme predenito: lo stato rappresenta
essenzialmente linformazione associata al funzionamento interno.
Inoltre, un automa pu`o utilizzare uno o pi` u dispositivi di memoria, sui
quali `e possibile memorizzare delle informazioni, sotto forma di stringhe di
caratteri da alfabeti anchessi predeniti. In genere si assume che tali dispo-
sitivi di memoria siano nastri , sequenze cio`e di celle, ognuna delle quali pu`o
contenere un carattere: uno tra tali nastri contiene inizialmente linput fornito
60 CAPITOLO 2. LINGUAGGI FORMALI
allautoma. I caratteri vengono letti o scritti per mezzo di testine che possono
muoversi lungo i nastri, posizionandosi sulle diverse celle (vedi Figura 2.5).
Come si vedr`a nei capitoli successivi, diversi tipi di automi possono essere de-
niti facendo ipotesi diverse sulle capacit`a di movimento, lettura e scrittura
delle testine sui vari nastri. Il funzionamento di un automa `e denito rispetto



q
.
.
.
Figura 2.5 Schema particolareggiato di automa.
ai due concetti di congurazione e di funzione di transizione.
Una congurazione rappresenta linsieme delle informazioni che determi-
nano, in un certo istante, il comportamento (o linsieme di comportamenti,
nel caso degli automi non deterministici introdotti nella Sezione 2.5.2) fu-
turo dellautoma: se si considera nuovamente lo schema generale di automa
in Figura 2.5, ne risulta che una congurazione `e composta dalle seguenti
informazioni:
1. stato interno dellautoma;
2. contenuto di tutti i nastri di memoria;
3. posizione di tutte le testine sui nastri.
La denizione di un automa permette, come vedremo, di associare ad una
stringa in input una ed una sola congurazione, detta congurazione iniziale,
che rappresenta la situazione complessiva in cui si trova lautoma allinizio, nel
momento in cui la stringa di input gli viene sottoposta.
Esempio 2.27 In Sezione 3.1 verr`a introdotto un particolare tipo di automa, detto
Automa a stati niti . Gli automi di questo tipo non possono memorizzare informa-
zioni, a parte la stringa di input; inoltre, il nastro contenente la stringa di input pu`o
essere scandito dalla relativa testina una sola volta, dallinizio alla ne della stringa
stessa. Per tali automi una congurazione `e rappresentata dalle seguenti componenti:
1. la stringa x di input;
2. la posizione del carattere di x che viene attualmente letto;
2.5. ACCETTAZIONE E RICONOSCIMENTO DI LINGUAGGI 61
3. lo stato interno dellautoma.
In tali automi, un particolare stato q
0
`e specicato essere lo stato iniziale. La
congurazione iniziale associata alla stringa di input x `e allora data da:
1. la stringa x;
2. la prima posizione della stringa;
3. lo stato q
0
.
La funzione di transizione, che `e parte della denizione della struttura dellau-
toma, induce una relazione di transizione tra congurazioni, che associa ad
una congurazione unaltra (o pi` u di una) congurazione successiva.
2
Lappli-
cazione della funzione di transizione ad una congurazione si dice transizione
o mossa o passo computazionale dellautoma. In generale, per ogni automa /,
date due congurazioni c
i
, c
j
di /, useremo nel seguito la notazione c
i
A
c
j
per indicare che c
i
e c
j
sono correlate dalla relazione di transizione, vale a dire
che c
j
deriva da c
i
per eetto dellapplicazione della funzione di transizione di
/.
3
Esempio 2.28 La funzione di transizione, nel caso di automi a stati niti, associa ad
una coppia stato attuale - carattere letto un nuovo stato. Tale funzione consente
di associare ad una congurazione la congurazione successiva nel modo seguente. Se
la funzione associa lo stato q
j
alla coppia composta dallo stato q
i
e dal carattere a
allora, data una congurazione composta da:
1. la stringa x;
2. la posizione i-esima;
3. lo stato q
i
;
dove li-esimo carattere di x `e il carattere a, la congurazione successiva sar`a composta
da:
1. la stringa x;
2. la posizione i + 1-esima;
3. lo stato q
j
.
Alcune congurazioni, aventi strutture particolari e dipendenti dalla struttura
dellautoma, sono inoltre considerate come congurazioni di accettazione. Tut-
te le altre congurazioni sono denite come Congurazioni di non accettazione,
o di riuto.
2
Come vedremo nei capitoli successivi, la funzione di transizione, pur consentendo di asso-
ciare congurazioni a congurazioni, non `e denita sullinsieme delle possibili congurazioni,
ma su domini e codomini che rappresentano parti di congurazioni, quelle che eettivamente
determinano e sono determinate dalla transizione.
3
Se lautoma cui si fa riferimento `e chiaro dal contesto potremo anche usare la notazione
semplicata ci cj.
62 CAPITOLO 2. LINGUAGGI FORMALI
Esempio 2.29 Nel caso di automi a stati niti viene denito, dato un automa, un
insieme F di stati, detti nali . Una congurazione di accettazione corrisponder`a
allora alla situazione in cui lautoma, letta tutta la stringa di input, si trova in uno
stato nale. Ne deriva quindi che una congurazione di accettazione ha la struttura:
1. la stringa x;
2. la prima posizione successiva alla stringa;
3. uno stato nale q F.
Una congurazione non di accettazione corrisponder`a, al contrario, alla situazione in
cui lautoma non ha letto tutta la stringa di input oppure, se lha letta, non si trova
in uno stato nale. Una congurazione di riuto ha quindi la struttura
1. la stringa x
2. posizione su un carattere della stringa
3. uno stato qualunque q Q,
o la struttura
1. la stringa x
2. la prima posizione successiva alla stringa
3. uno stato non nale q , F.
Un automa esegue una computazione applicando iterativamente, ad ogni istan-
te, la propria funzione di transizione alla congurazione attuale, a partire dalla
congurazione iniziale.
Possiamo quindi vedere una computazione eseguita da un automa / a
partire da una congurazione iniziale c
0
come una sequenza di congurazioni
c
0
, c
1
, c
2
, . . . tale che, per i = 0, 1, . . ., si ha c
i
A
c
i+1
. Indicheremo anche nel
seguito con la notazione

A
la chiusura transitiva e riessiva della relazione
A
.
`
E facile allora rendersi conto che, dato un automa /e due congurazioni
c
i
, c
j
di /, si ha c
i

A
c
j
se e solo se esiste una computazione che porta / da
c
i
a c
j
.
Se la sequenza di congurazioni c
0
, c
1
, c
2
, . . . , c
n
ha lunghezza nita e se `e
massimale, nel senso che non esiste nessuna congurazione c tale che c
n
A
c,
allora diciamo che la computazione termina: in tal caso, diciamo che essa `e
una computazione di accettazione se termina in una congurazione di accet-
tazione, mentre, nel caso contrario in cui termini in una congurazione non di
accettazione, diremo che `e una computazione di riuto.
2.5. ACCETTAZIONE E RICONOSCIMENTO DI LINGUAGGI 63
2.5.2 Automi deterministici e non deterministici
In questa sezione introdurremo due concetti importanti, relativi alle struttura
degli automi. Tali concetti, che saranno successivamente ripresi e ridiscussi in
modo estensivo per i vari tipi di automi che saranno considerati, sono quelli di
determinismo e non determinismo, ed hanno una grande rilevanza per quanto
riguarda la classicazione dei linguaggi.
Al ne di introdurre questi concetti, osserviamo che, per quanto esposto
nella sezione precedente, possiamo considerare un automa come un dispositivo
che, data una stringa di input, associa ad essa (una o pi` u) computazioni.
Un automa, in particolare, `e detto deterministico se ad ogni stringa di input
associa una sola computazione, e quindi una singola sequenza di congurazioni
(vedi Figura 2.6). Possiamo anche dire che un automa deterministico, data una
stringa di input, pu`o eseguire una sola computazione: se tale computazione
termina in una congurazione di accettazione, allora la stringa viene accettata.
c
0
c
1
c
2
c
3
c
4

Figura 2.6 Computazione di un automa deterministico.
Esercizio 2.13 Dimostrare che condizione necessaria e suciente anche un automa
sia deterministico `e che la relativa funzione di transizione sia una funzione dallinsieme
delle possibili congurazioni in se stesso.
Dato un automa deterministico / e data una stringa x di input ad /,
se indichiamo con c
0
(x) la congurazione iniziale di / corrispondente alla
stringa x, avremo che / accetta x se e solo se esiste una congurazione di
accettazione c di / per la quale c
0
(x)

A
c. Il linguaggio accettato da / sar`a
allora linsieme L(/) di tutte le stringhe x accettate da /.
Nel caso in cui si verichi inoltre che per ogni stringa la computazione ese-
guita dallautoma / sulla stringa stessa termina, e quindi se ogni stringa viene
o accettata o riutata, allora diciamo che il linguaggio L(/) `e riconosciuto (
o deciso) da /.
Un automa `e, al contrario, detto non deterministico se esso associa ad
ogni stringa di input un numero qualunque, in generale maggiore di uno, di
computazioni.
4
Automi di questo tipo corrispondono al caso generale in cui
la funzione di transizione associa a qualche congurazione c pi` u di una con-
gurazione successiva: in tal modo, per ogni computazione che conduce alla
4
Si osservi che un automa deterministico risulta quindi essere un caso particolare di
automa non deterministico.
64 CAPITOLO 2. LINGUAGGI FORMALI
congurazione c sono denite continuazioni diverse, che deniscono diverse
computazioni.
Indichiamo con il termine grado di non determinismo di un automa il mas-
simo numero di congurazioni che la funzione di transizione associa ad una con-
gurazione. Ci`o evidentemente corrisponde al massimo numero di congura-
zioni dierenti che si possono raggiungere in un singolo passo di computazione
a partire da una stessa congurazione.
Esempio 2.30 In Figura 2.7 viene riportato il caso in cui, per eetto della funzione
di transizione che associa alla congurazione c
3
la coppia di congurazioni c
4
, c
5
, la
computazione c
0
, c
1
, c
2
, c
3
ha due distinte possibili continuazioni, dando luogo quindi
alle due computazioni c
0
, c
1
, c
2
, c
3
, c
4
, c
5
, . . . e c
0
, c
1
, c
2
, c
3
, c
6
, c
7
, . . ..
c
0
c
1
c
2
c
3
c
4
c
5
c
6
c
7


Figura 2.7 Continuazioni diverse di una stessa computazione in un automa
non deterministico.
Esercizio 2.14 Dimostrare che due qualunque computazioni associate da un automa
non deterministico ad una stessa stringa di input devono necessariamente avere un
presso uguale.
Un diverso modo di introdurre il non determinismo, che citiamo qui
ma non considereremo nel seguito, consiste nel prevedere la presenza di -
transizioni, transizioni cio`e che un automa pu`o eseguire senza leggere alcun
carattere in input. Ci si pu`o rendere conto facilmente che il fatto che da una
congurazione c una automa possa passare o meno in unaltra congurazione
c

senza leggere caratteri in input introduce due diverse possibili continuazioni


della computazione attuale, luna da c e laltra da c

.
Esempio 2.31 Si consideri la situazione in Figura 2.8, in cui si assume che la con-
gurazione attuale sia c
0
e che il prossimo carattere in input sia il carattere a. Si
assuma inoltre che, per denizione della funzione di transizione dellautoma, la lettu-
ra di a fa passare dalla congurazione c
0
alla congurazione c
3
, e che `e per`o denita
una possibile -transizione da c
0
a c
1
, da cui la lettura di a fa passare lautoma nella
congurazione c
2
.
2.5. ACCETTAZIONE E RICONOSCIMENTO DI LINGUAGGI 65
Come si pu`o osservare ci`o d`a luogo a due diverse continuazioni: la prima attraverso
c
3
, nel caso in cui la -transizione non viene eseguita, la seconda attraverso c
1
e c
2
,
nel caso in cui essa venga eseguita.
c
0
c
1
c
2
c
3


a
a
Figura 2.8 Esempio di non determinismo introdotto da -transizione.
Dalle osservazioni precedenti, possiamo osservare che, mentre un automa de-
terministico associa alla stringa di input una computazione avente struttura
lineare, un automa non deterministico associa ad essa una struttura pi` u com-
plessa, ad albero, con i nodi che rappresentano congurazioni dellautoma
(con la radice associata alla congurazione iniziale) e gli archi che indicano
la possibile transizione tra congurazioni. In questa struttura, detta albero di
computazione, ogni computazione corrisponde ad un cammino avente origine
dalla radice stessa (vedi Figura 2.9).
Lautoma non deterministico pu`o quindi eseguire una qualunque compu-
tazione, associata ad una sequenza di scelte su quale transizione applicare in
corrispondenza ad ogni applicazione della funzione di transizione. Lautoma
accetta la stringa di input se, tra tutte le computazioni possibili, ne esiste
almeno una di accettazione, vale a dire se esiste, nellalbero di computazione,
un cammino dalla radice ad un nodo rappresentante una congurazione di
accettazione.
Si osservi la asimmetria tra accettazione e riuto di una stringa, introdotta
dal non determinismo: infatti, nel caso deterministico la stringa viene accet-
tata se la singola computazione denita `e di accettazione, e riutata se essa
termina in una congurazione non di accettazione. Al contrario, nel caso non
deterministico la stringa viene accettata se una qualunque delle computazioni
denite `e di accettazione, mentre non lo viene se tutte le possibili computazioni
che terminano non sono di accettazione.
Un modo alternativo, a cui faremo a volte riferimento nel seguito, di vedere
il comportamento di un automa non deterministico, consiste nel considerare
che lautoma esegua una sola computazione non deterministica, per la quale, ad
ogni passo, assume non una sola, ma un insieme di congurazioni, transitando,
66 CAPITOLO 2. LINGUAGGI FORMALI
ad ogni passo, non da congurazione a congurazione ma da un insieme di
congurazioni ad un insieme di congurazioni.
c
0
c
1
c
2
c
3
c
4
c
5
c
6
c
7
c
8
c
9






Figura 2.9 Albero di computazione di un automa non deterministico.
Esempio 2.32 Lalbero di computazione riportato in Figura 2.9 denisce le sin-
gole computazioni aventi come pressi le sequenze di congurazioni c
0
, c
1
, c
4
, . . .;
c
0
, c
1
, c
5
, . . .; c
0
, c
1
, c
6
, . . .; c
0
, c
2
, c
7
, . . .; c
0
, c
3
, c
8
, . . .; c
0
, c
3
, c
9
, . . . corrispondenti per
lappunto ai cammini con origine nella radice c
0
dellalbero. Si osservi che il grado
di non determinismo di un automa `e pari al massimo grado di uscita per un nodo
dellalbero di computazione relativo allautoma stesso. Il massimo grado di non deter-
minismo nellalbero in Figura 2.10 `e pari a 3 (congurazioni c
0
e c
1
): ne deriva quindi
che il grado di non determinismo dellautoma a cui si riferisce lalbero di computazione
`e almeno pari a 3.
Il concetto di non determinismo, che qui incontriamo per la prima volta, non
deve essere confuso con il non determinismo presente nel mondo reale. Nella
realt`a, in varie circostanze, accade che un osservatore, in base alla conoscenza
dello stato attuale di un sistema e di eventuali stimoli, non sia in grado di
determinare univocamente in quale stato il sistema si trover`a. Ci`o pu`o veri-
carsi o per caratteristiche intrinseche del sistema, come accade nel caso di
fenomeni quantistici, oppure perche losservatore non ha un modello adeguato
a rappresentare la complessit`a del fenomeno osservato e quindi a tener conto
di tutti i diversi fattori che inuenzano levoluzione del sistema, come accade
ad esempio nei sistemi termodinamici o, pi` u banalmente, nella complessit`a
della vita quotidiana. In tali casi si usa supplire alle carenze di conoscenza del
sistema facendo ricorso al concetto di probabilit`a.
2.5. ACCETTAZIONE E RICONOSCIMENTO DI LINGUAGGI 67
Il non determinismo che abbiamo qui introdotto, e che introdurremo nel
corso della trattazione seguente nei vari modelli di calcolo che considereremo
per modicarne il potere computazionale, ha caratteristiche del tutto diverse.
Nel nostro caso il non determinismo `e sostanzialmente un articio matematico
che ci consente di rappresentare un calcolo, anziche come una traiettoria in uno
spazio di stati, come un albero di traiettorie, analogamente a come possono
essere previste evoluzioni diverse di una vicenda in una narrazione a nale
multiplo. In particolare, come visto, ci`o che ci interessa `e poter denire un
concetto di accettazione legato al fatto che almeno uno dei rami dellalbero
conduca ad uno stato nale.
c
0
c
1
c
2
c
3
c
4
c
5
c
6
c
7
c
8
c
9
c
10
c
11
c
12
Figura 2.10 Esempio di computazione di un automa non deterministico.
2.5.3 Automi e classi di linguaggi
Una prima osservazione riguardante il rapporto fra generazione di linguaggi
e problemi decisionali `e gi`a stata fatta nella Sezione 1.3.4 dove, sulla base di
semplici considerazioni di cardinalit`a, abbiamo mostrato che esistono inniti
linguaggi per cui non esistono algoritmi (ne automi) di riconoscimento.
5
Una
5
Si noti che le considerazioni relative alla numerabilit`a dellinsieme degli algoritmi si
applicano anche agli automi. In eetti, un automa pu`o essere visto come un particolare tipo
di algoritmo.
68 CAPITOLO 2. LINGUAGGI FORMALI
considerazione analoga pu`o essere fatta in relazione alle grammatiche: poiche
una grammatica pu`o essere rappresentata essa stessa come una stringa nita di
caratteri, linsieme delle grammatiche di tipo 0 `e un insieme numerabile. Poi-
che daltra parte linsieme dei linguaggi ha la cardinalit`a del continuo esistono
inniti linguaggi a cui non corrisponde alcuna grammatica.
A tal proposito, secondo una terminologia consolidata, un problema de-
cisionale (o un linguaggio) viene detto decidibile se esiste un algoritmo che
risolve ogni istanza del problema. In alcune situazioni, come vedremo meglio
nei prossimi capitoli, non esistono algoritmi di decisione ma solo algoritmi in
grado di riconoscere correttamente unistanza positiva del problema. In queste
situazioni si parla di semidecidibilit`a.
Denizione 2.10 Un problema decisionale (o un linguaggio) `e detto decidi-
bile se esiste un algoritmo (in particolare, un automa) che per ogni istanza
del problema risponde correttamente vero oppure falso. In caso contrario il
problema `e detto indecidibile.
Denizione 2.11 Un problema decisionale (o un linguaggio) `e detto semide-
cidibile se esiste un algoritmo (in particolare, un automa) che per tutte e sole
le istanze positive del problema risponde correttamente vero.
Possiamo n da ora anticipare che, come vedremo nei capitoli successivi
i linguaggi di tipo 1, 2 e 3 sono decidibili, mentre quelli di tipo 0 sono semi-
decidibili. Nei capitoli successivi infatti introdurremo vari tipi di automi che
possono essere utilizzati per risolvere problemi di decisione relativi alle diverse
classi di linguaggi.
In particolare vedremo che:
Per i linguaggi di tipo 3 esistono dispositivi di riconoscimento che
operano con memoria costante e tempo lineare (Automi a stati niti ).
Per i linguaggi strettamente di tipo 2, il riconoscimento pu`o avvenire
sempre in tempo lineare ma con dispositivi di tipo non deterministico
6
dotati di una memoria a pila (Automi a pila non deterministici ).
Per i linguaggi strettamente di tipo 1, lesigenza di tempo e di memoria
`e ancora maggiore. Per essi si pu`o mostrare che il riconoscimento pu`o
essere eettuato con una macchina non deterministica che fa uso di una
quantit`a di memoria che cresce linearmente con la lunghezza della stringa
da esaminare (Macchina di Turing non deterministica linear bounded,
o Automa lineare).
Inne, per i linguaggi strettamente di tipo 0, si far`a riferimento a un
dispositivo di calcolo costituito da un automa che opera con quantit`a di
tempo e di memoria potenzialmente illimitate (Macchina di Turing).
6
Vedremo nel seguito (Sezione 2.5.2) cosa tale termine stia a signicare.
2.5. ACCETTAZIONE E RICONOSCIMENTO DI LINGUAGGI 69
Nei Capitoli 3 e 4 ci soermeremo sui metodi di riconoscimento e sulle propriet`a
delle due classi di linguaggi che hanno maggiore attinenza con i linguaggi di
programmazione, cio`e i linguaggi di tipo 3 e di tipo 2.
Alle macchine di Turing ed alla caratterizzazione del loro potere compu-
tazionale sar`a dedicato il Capitolo 5 e, in quel contesto, sar`a ripreso anche lo
studio delle propriet`a dei linguaggi di tipo 0 e di tipo 1.
70 CAPITOLO 2. LINGUAGGI FORMALI
Capitolo 3
Linguaggi regolari
I linguaggi di tipo 3 costituiscono una classe particolarmente interessante per
diversi motivi. Innanzi tutto, i componenti sintattici pi` u elementari di un lin-
guaggio di programmazione identicatori, costanti, parole chiave, ecc.
sono generalmente denibili con grammatiche di tipo 3. In secondo luogo, no-
nostante lestrema semplicit`a delle grammatiche di tale tipo, si pu`o mostrare
che la classe di linguaggi che esse generano gode di numerose propriet`a algebri-
che. In particolare, tali propriet`a consentono di associare ad ogni linguaggio
di tipo 3 unespressione regolare che ne descrive le stringhe.
Nel corso di questa sezione introdurremo innanzi tutto i dispositivi di
riconoscimento per i linguaggi di tipo 3, detti automi a stati niti, e suc-
cessivamente discuteremo le principali propriet`a della classe dei linguaggi
regolari.
3.1 Automi a stati niti
La tipologia pi` u semplice di dispositivo per il riconoscimento di linguaggi che
prenderemo in esame, `e costituita dai cosiddetti Automi a stati niti (ASF).
Questi automi, gi`a introdotti in modo informale in Sezione 2.5, si possono
pensare come dispositivi che, mediante una testina, leggono la stringa di input
scritta su un nastro e la elaborano facendo uso di un elementare meccanismo
di calcolo e di una memoria nita e limitata. Lesame della stringa avviene un
carattere alla volta, mediante una sequenza di passi di computazione, ognu-
no dei quali comporta lo spostamento della testina sul carattere successivo
e laggiornamento dello stato della memoria (Figura 3.1). In questa sezione
caratterizzeremo, in particolare, gli Automi a stati niti deterministici : nella
successiva Sezione 3.2 tratteremo il caso pi` u generale degli Automi a stati niti
non deterministici .
72 CAPITOLO 3. LINGUAGGI REGOLARI
a
1
a
2
a
3
a
4
a
5
a
6

Testina
Nastro unidirezionale
Funzione di
transizione
Stati
Q

Figura 3.1 Schema di automa a stati niti.


Denizione 3.1 Un automa a stati niti deterministico (ASFD) `e una quin-
tupla / = , Q, , q
0
, F), dove = a
1
, . . . , a
n
`e l alfabeto di input,
Q = q
0
, . . . , q
m
`e un insieme nito e non vuoto di stati, F Q `e un
insieme di stati nali, q
0
Q `e lo stato iniziale e : Q Q `e la funzione
(totale) di transizione che ad ogni coppia stato, carattere in input) associa
uno stato successivo.
Il comportamento dellautoma cos` denito `e caratterizzato in particolare dal-
la funzione di transizione. Essa `e una funzione con dominio nito, per cui
pu`o venire rappresentata mediante una tabella, detta tabella di transizione (o,
equivalentemente, matrice di transizione), alle cui righe vengono associati gli
stati, alle colonne i caratteri in input, ed i cui elementi rappresentano il risul-
tato dellapplicazione della allo stato identicato dalla riga ed al carattere
associato alla colonna della tabella.
a b
q
0
q
0
q
1
q
1
q
2
q
2
q
2
q
2
q
2
Tabella 3.1 Esempio di tabella di transizione di un ASFD.
Unaltra rappresentazione, molto pi` u evocativa, `e costituita dal cosiddetto
diagramma degli stati , (o grafo di transizione) in cui lautoma `e rappresentato
mediante un grafo orientato: i nodi rappresentano gli stati, mentre gli archi
rappresentano le transizioni, per cui sono etichettati con il carattere la cui
lettura determina la transizione. Gli stati nali sono rappresentati da nodi
con un doppio circolo, mentre quello iniziale `e individuato tramite una freccia
3.1. AUTOMI A STATI FINITI 73
q
0
q
2
q
1
b
a
a, b
a, b
Figura 3.2 Diagramma degli stati dellASFD di Tabella 3.1.
entrante. Essenzialmente, un ASFD esegue una computazione nel modo se-
guente: a partire dalla situazione in cui lo stato attuale `e q
0
, lautoma ad ogni
passo legge il carattere successivo della stringa in input ed applica la funzione
alla coppia formata dallo stato attuale e da tale carattere per determinare
lo stato successivo. Terminata la lettura della stringa, essa viene accettata se
lo stato attuale `e uno stato nale, riutata altrimenti.
1
Al ne di formalizzare
meglio il modo di operare di un ASFD, possiamo osservare, ricordando quanto
detto nella Sezione 2.5, che il comportamento futuro di un automa a stati ni-
ti deterministico dipende esclusivamente dallo stato attuale e dalla stringa da
leggere. Da ci`o, e da quanto esposto sopra, conseguono le seguenti denizioni.
Denizione 3.2 Dato un automa a stati niti / = , Q, , q
0
, F), una
congurazione di / `e una coppia (q, x), con q Q e x

.
Denizione 3.3 Una congurazione q, x), q Q ed x

, di /, `e detta:
iniziale se q = q
0
;
nale se x = ;
accettante se x = e q F.
La funzione di transizione permette di denire la relazione di transizione
tra congurazioni, che associa ad una congurazione la congurazione
successiva, nel modo seguente.
Denizione 3.4 Dato un ASFD / = , Q, , q
0
, F) e due congurazioni
(q, x) e (q

, y) di /, avremo che (q, x)


A
(q

, y) se e solo se valgono le due


condizioni:
1. esiste a tale che x = ay;
2. (q, a) = q

.
1
Si noti che un ASFD termina sempre le sue computazioni.
74 CAPITOLO 3. LINGUAGGI REGOLARI
A questo punto possiamo dire che, dato un automa a stati niti determini-
stico / = , Q, , q
0
, F), una stringa x

`e accettata da / se e solo se
(q
0
, x)

A
(q, ), con q F, e possiamo denire il linguaggio riconosciuto
2
da
/ come
L(/) =
_
x

[ (q
0
, x)

A
(q, ), q F
_
.
Esempio 3.1 La stringa aab `e accettata dallautoma a stati niti deterministico
descritto in Figura 3.2. Infatti, a partire dalla congurazione iniziale (q
0
, aab) lauto-
ma raggiunge la congurazione di accettazione (q
1
, ) per mezzo della computazione
(q
0
, aab) (q
0
, ab) (q
0
, b) (q
1
, ).
Un modo alternativo ed ampiamente utilizzato di descrivere il comportamento
di un automa a stati niti deterministico e di denire il linguaggio da esso
riconosciuto utilizza una estensione della funzione di transizione da caratteri
a stringhe.
Denizione 3.5 La funzione di transizione estesa di un automa a stati niti
deterministico / = , Q, , q
0
, F) `e la funzione : Q

Q, denita nel
seguente modo:
(q, ) = q
(q, xa) =
_
(q, x), a
_
,
dove a , x

.
Dalla denizione precedente, avremo quindi che, dato uno stato q ed una strin-
ga di input x

, lo stato q

`e tale che q

= (q, x) se e solo se la computazione


eseguita dallautoma a partire da q ed in conseguenza della lettura della strin-
ga x conduce lautoma stesso nello stato q

. Pi` u formalmente, possiamo anche


dire che q

= (q, x) se e solo se esiste y

tale che (q, xy)



(q

, y).
Di conseguenza, avremo che una stringa x

`e accettata da un ASFD
/ = , Q, , q
0
, F) se e solo se (q
0
, x) F.
`
E allora possibile introdurre la seguente denizione di linguaggio ricono-
sciuto da un ASFD.
Denizione 3.6 Il linguaggio riconosciuto da un automa a stati niti deter-
ministico / `e linsieme
L(/) =
_
x

[ (q
0
, x) F
_
.
2
Si osservi che, dato che ogni computazione di un ASFD termina, ogni automa a stati
niti deterministico riconosce un linguaggio.
3.1. AUTOMI A STATI FINITI 75
Esempio 3.2 Al ne di vericare che la stringa aab `e accettata dallASFD di
Figura 3.2, deriviamo il valore di (q
0
, aab) nel modo seguente:
(q
0
, aab) =
_
(q
0
, aa), b
_
=
_

_
(q
0
, a), a
_
, b
_
=
_

_
(q
0
, ), a
_
, a
_
, b
_
=
= ( ( (q
0
, a) , a) , b) = ( (q
0
, a) , b) = (q
0
, b) = q
1
.
Esercizio 3.1 Si consideri il linguaggio L = a
n
b [ n 0. Come sappiamo, questo
linguaggio `e generato dalla grammatica ( le cui produzioni sono:
S aS [ b.
Si dimostri che il linguaggio L `e il linguaggio riconosciuto dallautoma di Figura 3.2.
Esempio 3.3 Si consideri il linguaggio delle parole sullalfabeto a, b che conten-
gono un numero pari di a o un numero pari di b. Un automa che riconosce tale
linguaggio `e lautoma / = a, b, q
0
, q
1
, q
2
, q
3
, , q
0
, q
0
, q
1
, q
2
), dove la funzione
di transizione `e rappresentata in Tabella 3.2.
a b
q
0
q
1
q
2
q
1
q
0
q
3
q
2
q
3
q
0
q
3
q
2
q
1
Tabella 3.2 Tabella di transizione di un ASFD che riconosce parole con un
numero pari di a o di b.
La funzione di transizione `e inoltre rappresentata, sotto forma di grafo di
transizione, in Figura 3.3.
Esempio 3.4 Un altro semplice esempio di automa a stati niti deterministico `e dato
dallautoma che riconosce gli identicatori di un linguaggio di programmazione, dove
un identicatore `e denito come una stringa di lunghezza arbitraria avente come primo
carattere un carattere alfabetico, ed i cui restanti caratteri siano tutti alfanumerici.
Un automa / che riconosce tali identicatori ha alfabeto = a, . . . , z, 0, . . . , 9
e tre stati, due di quali, q
0
e q
1
, usati rispettivamente per accettare il primo carattere
ed i caratteri successivi al primo, ed il terzo, lo stato q
2
, che riveste il ruolo di stato
di errore. Il grafo di transizione di questo automa `e riportato in Figura 3.4.
Esercizio 3.2 Denire un ASFD che riconosce le stringhe su a, b caratterizzate dal
fatto che il secondo carattere `e b.
76 CAPITOLO 3. LINGUAGGI REGOLARI
q
0
q
1
q
2
q
3
a
a
a
a
b b b b
Figura 3.3 Diagramma degli stati di un ASFD che riconosce parole con un
numero pari di a o di b.
q
0
q
1
q
2
a, . . . , z
0, . . . , 9
a, . . . , z
0, . . . , 9
a, . . . , z
0, . . . , 9
Figura 3.4 Diagramma degli stati di un ASFD che riconosce identicatori.
3.2. AUTOMI A STATI FINITI NON DETERMINISTICI 77
Esercizio 3.3 Denire un ASFD che riconosce le stringhe su a, b caratterizzate dal
fatto che il penultimo carattere `e b.
Con riferimento alla Denizione 3.1 di ASFD, ricordiamo che la funzione
di transizione deve essere una funzione totale.
3
Tuttavia, se rilassiamo il
vincolo di totalit`a della ammettendo che possa essere parziale, non viene
modicata sostanzialmente lespressivit`a del modello di macchina in quanto
ogni ASFD con funzione di transizione : Q Q non totale pu`o essere
trasformato in un ASFD con funzione di transizione totale ed equivalente

: Q q Q q denita nel modo seguente:


1. Se (q, a) `e denito allora

(q, a) = (q, a);


2. Se (q, a) non `e denito allora

(q, a) = q;
3.

(q, a) = q per ogni carattere a .


Esercizio 3.4 Dimostrare che, dato un ASFD con funzione di transizione parziale,
lASFD con funzione di transizione totale, costruito come sopra illustrato, riconosce
lo stesso linguaggio.
Consideriamo ora linsieme 1 dei linguaggi riconoscibili da automi a stati
niti deterministici, cio`e linsieme
1 = L [ L

ed esiste un automa / tale che L = L(/).


Nel seguito studieremo varie propriet`a dei linguaggi contenuti nellinsie-
me 1. In particolare, dimostreremo che questa classe di linguaggi coincide
con quella dei linguaggi generati dalle grammatiche di tipo 3 e con quella dei
linguaggi deniti da espressioni regolari. Il nome di linguaggi regolari , gene-
ralmente attribuito ai linguaggi di tipo 3, deriva appunto da queste propriet`a.
3.2 Automi a stati niti non deterministici
In questa sezione prenderemo in esame la classe pi` u estesa degli automi a stati
niti, costituita dalla classe degli automi a stati niti non deterministici , che
risulter`a particolarmente utile per studiare le propriet`a dei linguaggi regola-
ri. Tale estensione si ottiene, coerentemente con quanto esposto nella Sezio-
ne 2.5.2, denendo linsieme delle transizioni non mediante una funzione, ma
attraverso una relazione o, equivalentemente, come una funzione nellinsieme
3
Queste considerazioni possono essere immediatamente applicate anche al caso di automi
a stati niti non deterministici.
78 CAPITOLO 3. LINGUAGGI REGOLARI
delle parti dellinsieme degli stati. In altre parole tali automi sono caratteriz-
zati dal fatto che, ad ogni passo, una applicazione della funzione di transizione
denisce pi` u stati anziche uno solo.
Denizione 3.7 Un automa a stati niti non deterministico (ASFND) `e
una quintupla /
N
= , Q,
N
, q
0
, F), in cui = a
1
, . . . , a
n
`e l alfabeto
di input, Q = q
0
, . . . , q
m
`e linsieme nito e non vuoto degli stati in-
terni, q
0
Q `e lo stato iniziale, F Q `e linsieme degli stati nali, e

N
: Q T(Q) `e una funzione (parziale), detta funzione di transizione,
che ad ogni coppia stato, carattere) su cui `e denita associa un sottoinsieme
di Q (eventualmente vuoto).
4
Esempio 3.5 In Tabella 3.3 viene presentata la funzione di transizione di un automa
a stati niti non deterministico: come si pu`o osservare, in corrispondenza ad alcune
coppie stato-carattere (segnatamente le coppie (q
0
, b) e (q
1
, a)) la funzione fornisce
pi` u stati, corrispondenti a diverse possibili continuazioni di una computazione.

N
a b
q
0
q
0
q
0
, q
1

q
1
q
2
, q
3
q
3

q
2
q
3

q
3

Tabella 3.3 Esempio di tabella di transizione di un ASFND.
Un automa a stati niti non deterministico pu`o essere anchesso descritto,
cos` come un ASFD, per mezzo di un grafo di transizione: in questo caso, per
eetto del non determinismo, esisteranno archi uscenti dal medesimo nodo
etichettati con il medesimo carattere.
Esempio 3.6 In Figura 3.5 `e riportato il grafo di transizione corrispondente allau-
toma a stati niti non deterministico la cui funzione di transizione `e descritta nella
Tabella 3.3. La presenza del non determinismo fa s` che dal nodo etichettato q
1
escano
due archi etichettati con il carattere b, cos` come dal nodo etichettato q
2
escono due
archi etichettati con il carattere a.
Dalla sua stessa denizione deriva che un automa a stati niti non determini-
stico denisce quindi, data una stringa in input, un insieme di computazioni.
4
Si osservi che anche in questo caso si applicano le considerazioni fatte nella sezione
precedente a proposito della possibilit`a di denire funzioni di transizione parziali. Comunque,
`e del tutto equivalente dire che la funzione di transizione non `e denita per un dato stato q
e per un dato carattere di input a, o che essa `e denita e N(q, a) = .
3.2. AUTOMI A STATI FINITI NON DETERMINISTICI 79
q
0
q
1
q
2
q
3
b
a, b
a a
a, b
Figura 3.5 Grafo di transizione dellASFND in Tabella 3.3.
Alternativamente, come visto in Sezione 2.5.2, possiamo considerare che lau-
toma esegua una sola computazione non deterministica, nel corso della quale,
per ogni carattere letto, assume non uno solo, ma un insieme di stati attuali
e transita, ad ogni nuovo carattere, non da stato a stato ma da un insieme di
stati ad un insieme di stati.
5
Esempio 3.7 Lautoma in Figura 3.5 denisce, in corrispondenza alla stringa in
input bba, le tre computazioni:
- (q
0
, bba) (q
0
, ba) (q
0
, a) (q
0
, );
- (q
0
, bba) (q
0
, ba) (q
1
, a) (q
2
, );
- (q
0
, bba) (q
0
, ba) (q
1
, a) (q
3
, ).
Inoltre, il presso bb della stringa di input d`a luogo anche alla computazione:
- (q
0
, bb) (q
1
, b) (q
3
, );
la quale per`o non presenta continuazioni possibili. Lalbero di computazione in
Figura 3.6 mostra il complesso di tali computazioni.
Alternativamente, possiamo considerare che lautoma denisca la computazione
non deterministica:
- (q
0
, bba) (q
0
, q
1
, ba) (q
0
, q
1
, q
3
, a) (q
0
, q
2
, q
3
, ).
Ricordando quanto detto nella Sezione 2.5.2, diciamo che una stringa viene
accettata da un automa a stati niti non deterministico se almeno una delle
computazioni denite per la stringa stessa `e di accettazione. In modo sintetico,
utilizzando il concetto di computazione non deterministica, possiamo dire che
una stringa x `e accettata se (q
0
, x)

(Q, ), dove Q Q e Q F ,= .
Esercizio 3.5 Deniamo un -ASFND come un ASFND avente funzione di transizione

N
: Q( ) T(Q), vale a dire per il quale sono ammesse -transizioni. Si
dimostri che il modello degli -ASFND `e equivalente a quello degli ASFND.
[Suggerimento: Denire ed utilizzare una funzione c : Q T(Q) di -chiusura, che
associa ad ogni stato linsieme degli stati raggiungibili con sequenze di -transizioni,
per derivare da ogni ASFND un -ASFND equivalente.]
5
Anche se in modo improprio, useremo comunque la notazione per indicare la
transizione tra insiemi di congurazioni nellambito di una computazione non deterministica.
80 CAPITOLO 3. LINGUAGGI REGOLARI
(q
0
, bba)
(q
0
, ba)
(q
1
, ba) (q
3
, a)
(q
1
, a)
(q
0
, a) (q
0
, )
(q
2
, )
(q
3
, )
Figura 3.6 Albero di computazione relativo allEsempio 3.7.
Esempio 3.8 Nel caso dellEsempio 3.7, la stringa bba viene accettata in quanto una
delle computazioni conduce alla congurazione di accettazione (q
3
, ). Laccettazione
di bba deriva anche dal fatto che al termine della computazione non deterministica
lautoma, nita di leggere la stringa, si trovi nellinsieme di stati q
0
, q
2
, q
3
, e che
q
3
F.
Possiamo allora denire il linguaggio L(/) accettato da un ASFND / nel
modo seguente:
L(/) =
_
x

[ (q
0
, x)

(Q, ), Q F ,=
_
.
Esercizio 3.6 Dimostrare che per ogni ASFND esiste un ASFND equivalente avente
[ F [= 1.
[Suggerimento: Utilizzare quanto mostrato nellEsercizio 3.5.]
Un modo alternativo di denire il linguaggio accettato da un ASFND
richiede, analogamente a quanto fatto nel caso degli ASFD, di estendere alle
stringhe la denizione di funzione di transizione.
Denizione 3.8 Dato un ASFND, la funzione di transizione estesa `e la
funzione
N
: Q

T(Q), denita nel seguente modo

N
(q, ) = q
3.2. AUTOMI A STATI FINITI NON DETERMINISTICI 81

N
(q, xa) =
_
p
N
(q,x)

N
(p, a)
dove a , x

, p Q.
Dalla denizione precedente, avremo quindi che, dato uno stato q ed una
stringa di input x, lo stato q

appartiene allinsieme
N
(q, x) se e solo se esiste
una computazione dellautoma la quale, a partire da q ed in conseguenza della
lettura della stringa x, conduce allo stato q

.
Deniamo ora la classe di linguaggi accettati dagli ASFND.
Denizione 3.9 Il linguaggio accettato da un ASFND /
N
`e linsieme
L(/
N
) =
_
x

[
N
(q
0
, x) F ,=
_
.
Successivamente ci porremo il problema di stabilire la relazione esistente fra
tale classe e quella dei linguaggi riconosciuti dagli ASFD.
Esempio 3.9 Si consideri il linguaggio, denito su = a, b, delle parole terminanti
con bb, o ba o baa. Lautoma non deterministico /
N
che riconosce tale linguaggio ha
Q = q
0
, q
1
, q
2
, q
3
, F = q
3
, e la relativa funzione di transizione `e rappresentata
come tabella di transizione in Tabella 3.3 e come grafo di transizione in Figura 3.5.
Si consideri ora, ad esempio, la stringa abba: possiamo allora vericare che, dopo
1 passo di computazione, linsieme degli stati attuali `e q
0
, dopo 2 passi q
0
, q
1
,
dopo 3 passi q
0
, q
1
, q
3
, dopo 4 passi q
0
, q
2
, q
3
; la stringa `e accettata in quanto uno
di questi stati (q
3
) `e nale.
q
0
q
0
q
0
q
1
q
0
q
1
q
3
q
0
q
2
q
3

q
0
q
3

Figura 3.7 Albero delle transizioni seguite dallautoma dellEsempio 3.5 con
input abbaa.
Esempio 3.10 Consideriamo lASFND dellEsempio 3.9. In Figura 3.7 viene pre-
sentato lalbero delle traiettorie seguite dallautoma nello spazio degli stati quando
esso riceve in ingresso la stringa abbaa.
Come si vede, in questo caso un solo ramo dellalbero, quello iniziante in q
0
e
terminante in q
3
(riportato in modo pi` u marcato) conduce ad uno stato nale, ma ci`o
`e suciente perche la stringa sia accettata.
82 CAPITOLO 3. LINGUAGGI REGOLARI
Si osservi anche che, nellEsempio 3.10, una eventuale conoscenza di quale
transizione eseguire in corrispondenza ad ogni scelta non deterministica (passi
2, 3 e 4 della computazione) permetterebbe anche ad un automa deterministico
di indovinare il cammino accettante: infatti, ad ogni passo per il quale la
funzione di transizione fornisce un insieme di pi` u stati, lautoma sarebbe in
grado di scegliere uno stato sul cammino che conduce ad uno stato nale.
Tale conoscenza pu`o essere rappresentata da una opportuna stringa di
scelta di 5 caratteri (uno per ogni passo di computazione) sullalfabeto
1, 2, dove il simbolo 1 indica che lo stato successivo `e il primo tra quelli
(al massimo 2) specicati dalla funzione di transizione, mentre il simbolo 2 in-
dica che lo stato successivo `e il secondo. Quindi, il cammino di computazione
accettante `e specicato dalla stringa 11211: tale stringa pu`o essere interpre-
tata come una dimostrazione che abbaa appartiene al linguaggio accettato
dallautoma. Tali considerazioni saranno riprese nel Capitolo 9 in cui vengono,
tra laltro, considerati i linguaggi accettabili ecientemente (in termini di lun-
ghezza della computazione) da dispositivi di calcolo pi` u potenti e complessi,
quali le Macchine di Turing non deterministiche.
Esempio 3.11 Si consideri il linguaggio denito dallespressione regolare
_
(a
+
a +b)ba
_

_
b +bb +a
+
(b +a +ab)
_
.
In Figura 3.8 `e riportato il grafo di transizione dellautoma /
N
che riconosce tale
linguaggio.
q
0
q
1
q
2
q
3
q
4
a
b
a
b
a
b
b
a
Figura 3.8 Esempio di ASFND.
Esercizio 3.7 Costruire lautoma non deterministico che riconosce il linguaggio delle
stringhe su a, b in cui il penultimo carattere `e una b.
3.3. RELAZIONI TRA ASFD, ASFND E GRAMMATICHE DI TIPO 3 83
3.3 Relazioni tra ASFD, ASFND e grammatiche di tipo 3
In base alle denizioni date si potrebbe pensare che gli ASFND siano disposi-
tivi pi` u potenti degli ASFD, nel senso che riconoscono una classe di linguaggi
pi` u ampia. In realt`a, anche se in altri tipi di macchine astratte il non determi-
nismo accresce eettivamente il potere computazionale, nel caso degli automi
a stati niti non `e cos`: infatti si pu`o dimostrare che gli ASFD e gli ASFND
riconoscono la medesima classe di linguaggi.
Teorema 3.1 Dato un ASFD che riconosce un linguaggio L, esiste corrispon-
dentemente un ASFND che riconosce lo stesso linguaggio L; viceversa, dato
un ASFND che riconosce un linguaggio L

, esiste un ASFD che riconosce lo


stesso linguaggio L

.
Dimostrazione. La dimostrazione si divide in due parti: la prima `e il pas-
saggio dallautoma deterministico a quello non deterministico, la seconda il
passaggio inverso.
La prima parte della dimostrazione `e banale, perche la simulazione di un
ASFD mediante un ASFND si riduce alla costruzione di un automa non de-
terministico con stessi insiemi , Q e F e in cui q Q, a abbiamo che
(q, a) = q

implica
N
(q, a) = q

.
La seconda parte della dimostrazione `e pi` u complessa. Dato un ASFND
il cui insieme di stati `e Q, essa si basa sullidea di costruire un ASFD il cui
insieme degli stati `e in corrispondenza biunivoca con linsieme delle parti di
Q. Pi` u precisamente, dato lautoma non deterministico
/
N
= , Q,
N
, q
0
, F)
si costruisce un automa deterministico equivalente
/

, Q

, q

0
, F

_
procedendo come nel modi seguente.
Si pone

= .
Si denisce un insieme di stati Q

tale che [ Q

[=[ T(Q) [ e lo si po-


ne in corrispondenza biunivoca con T(Q). Lelemento di Q

che corri-
sponde al sottoinsieme q
i
1
, . . . , q
i
k
di Q sar`a indicato con la notazione
[q
i
1
, . . . , q
i
k
], in cui, per convenzione, i nomi degli stati di Q sono ordinati
lessicogracamente. Quindi Q

risulta cos` denito:


Q

=
_
[q
i
1
, . . . , q
i
k
][q
i
1
, . . . , q
i
k
T(Q)
_
.
Si noti che [ Q

[= 2
|Q|
.
Si pone q

0
= [q
0
].
84 CAPITOLO 3. LINGUAGGI REGOLARI
Si denisce F

come linsieme degli stati di Q

corrispondenti a sottoin-
siemi di Q che contengono almeno un elemento di F, cio`e:
F

= [q
i
1
, . . . , q
i
k
] [ q
i
1
, . . . , q
i
k
T(Q) q
i
1
, . . . , q
i
k
F ,= .
La funzione

`e denita nel seguente modo:


q
i
1
, . . . , q
i
k
Q, a ,

([q
i
1
, . . . , q
i
k
], a) = [q
j
1
, . . . , q
j
h
],
se e solo se
N
(q
i
1
, a). . .
N
(q
i
k
, a) = q
j
1
, . . . , q
j
h
, con k > 0 e h 0.
Inoltre si assume che a

([ ], a) = [ ].
Si deve ora dimostrare che ad ogni computazione eettuata dallautoma /

ne corrisponde una equivalente dellautoma /


N
e viceversa. Per farlo bisogna
mostrare in sostanza che per ogni x

([q
0
], x) = [q
j
1
, . . . , q
j
h
]
N
(q
0
, x) = q
j
1
, . . . , q
j
h
.
Ci`o pu`o essere provato per induzione sulla lunghezza di x.
Nel passo base, essendo [ x [= 0, vale necessariamente x = , per cui
abbiamo
N
(q
0
, ) = q
0
e

([q
0
], ) = [q
0
].
Supponiamo ora che lasserto valga per [ x [= m e proviamo che esso
continua a valere per [ x [= m + 1. Poniamo x = x

a, con [ x

[= m. Per
N
abbiamo:

N
(q
0
, x

a) =
_
p
N
(q
0
,x

N
(p, a).
Supponendo che
N
(q
0
, x

) = q
i
1
, . . . , q
i
k
e che
N
(q
i
1
, a) . . .
N
(q
i
k
, a) =
q
j
1
, . . . , q
j
h
otteniamo

N
(q
0
, x

a) = q
j
1
, . . . , q
j
h
.
Per

vale invece:

(q
0
, x

a) =

([q
0
], x

), a).
Essendo [ x

[= m possiamo sfruttare lipotesi induttiva, il che ci consente di


scrivere:

([q
0
], x

), a) =

([q
i
1
, . . . , q
i
k
], a),
che, per costruzione, vale proprio [q
j
1
, . . . , q
j
h
].
La prova `e completata osservando che

([q
0
], x) F

esattamente quando

N
(q
0
, x) contiene uno stato di Q che `e in F. 2
3.3. RELAZIONI TRA ASFD, ASFND E GRAMMATICHE DI TIPO 3 85
q
0
q
1
b
a, b
Figura 3.9 ASFND che riconosce le stringhe in a, b

terminanti con b.
Esempio 3.12 Si consideri lautoma non deterministico /
N
che accetta tutte le
stringhe in a, b

che terminano con b. Il suo grafo di transizione `e riportato in


Figura 3.9. Lautoma deterministico /

corrispondente si pu`o costruire seguendo i


passi della dimostrazione precedente (vedi Figura 3.10).
Lalfabeto di /

coincide con quello di /, cio`e

= a, b.
/

ha 2
|Q|
= 4 stati, due dei quali non signicativi, in quanto non raggiungibili
dallo stato iniziale.
Lo stato iniziale `e [q
0
].
La funzione

`e determinata considerando i 4 possibili stati di /

ed applicando
a ciascuno di essi il procedimento descritto nel teorema precedente.

_
[ ], a
_
= [ ]

_
[ ], b
_
= [ ]

_
[q
0
], a
_
= [q
0
]

_
[q
0
], b
_
= [q
0
, q
1
]

_
[q
1
], a
_
= [ ]

_
[q
1
], b
_
= [ ]

_
[q
0
, q
1
], a
_
= [q
0
]

_
[q
0
, q
1
], b
_
= [q
0
, q
1
];
Come si vede, dei quattro possibili stati solo due (gli stati [q
0
] e [q
0
, q
1
]) so-
no raggiungibili da [q
0
], e quindi sono gli unici ad essere rappresentati in
Figura 3.10.
Linsieme F

`e linsieme degli stati raggiungibili che contengono un elemento di


F; nel caso in esame F

=
_
[q
0
, q
1
]
_
.
Come evidenziato nellesempio precedente, quando si realizza la trasformazione
da un automa non deterministico con [ Q [ stati ad un automa deterministico,
non sempre tutti i 2
|Q|
stati generati sono raggiungibili. In tal caso, possiamo
86 CAPITOLO 3. LINGUAGGI REGOLARI
dire che linsieme degli stati dellautoma deterministico `e costituito dai soli
stati raggiungibili. Per tale motivo, il procedimento di costruzione dellautoma
non deterministico pu`o essere reso pi` u eciente costruendo la funzione di
transizione a partire dallo stato iniziale [q
0
], generando i soli stati raggiungibili.
Si noti comunque che, in base al metodo generale di costruzione dellASFD
[q
0
] [q
0
,q
1
]
b
a
a b
Figura 3.10 ASFD che riconosce le stringhe in a, b

terminanti con b.
equivalente ad un dato ASFND, si vericano situazioni in cui `e necessario
introdurre un numero di stati esponenziale nel numero degli stati dellautoma
non deterministico. Gli automi non deterministici hanno infatti il pregio di
essere a volte molto pi` u concisi di quelli deterministici equivalenti. Vediamo
innanzi tutto un esempio in cui lASFD ha pi` u stati dellASFND equivalente.
Esempio 3.13 Si consideri lautoma di Figura 3.11, che riconosce le stringhe date
dallespressione regolare (a +b)

b(a +b). Procedendo come visto nellesempio prece-


q
0
q
1
q
2
b
a, b
a, b
Figura 3.11 ASFND che riconosce le stringhe date da (a +b)

b(a +b).
dente si ottiene un ASFD con quattro stati, due dei quali sono nali, come illustrato
in Figura 3.12.
Generalizzando lesempio al caso delle stringhe (a +b)

b(a +b)
k
si pu`o vedere
che mentre lASFND che riconosce tali stringhe ha in generale k + 2 stati,
lASFD equivalente ne ha O(2
k
).
Esercizio 3.8 Costruire lASFND e lASFD che riconoscono le stringhe (a +b)

b(a +
b)
k
, per k = 2, 3 e 4 e valutare come cresce la dimensione dei due automi al crescere
di k.
3.3. RELAZIONI TRA ASFD, ASFND E GRAMMATICHE DI TIPO 3 87
[q
0
] [q
0
,q
1
] [q
0
,q
2
]
[q
0
,q
1
,q
2
]
b
a
b
a
a
b
Figura 3.12 ASFD che riconosce le stringhe date da (a +b)

b(a +b).
Una rilevante conseguenza della equivalenza tra ASFD e ASFND `e data
dal seguente risultato.
Denizione 3.10 Data una stringa x = a
1
a
r
deniamo stringa riessa di
x la stringa x = a
r
a
1
.
Teorema 3.2 Dato un linguaggio L riconosciuto da un ASF esiste un ASF
che riconosce il linguaggio x [ x L.
Esercizio 3.9 Dimostrare il Teorema 3.2
Dopo avere mostrato lequivalenza tra ASFD e ASFND, possiamo ora
considerare la relazione esistente tra automi a stati niti e grammatiche. Come
gi`a anticipato, la classe dei linguaggi accettati da automi a stati niti coincide
con quella dei linguaggi generabili per mezzo di grammatiche di tipo 3.
Teorema 3.3 Data una grammatica regolare ( = V
T
, V
N
, P, S), esiste un
ASFND /
N
= , Q,
N
, q
0
, F) che riconosce il linguaggio che essa gene-
ra. Viceversa, dato un ASFND esiste una grammatica regolare che genera
il linguaggio che esso riconosce.
Dimostrazione. La dimostrazione si divide in due parti: la prima consiste
nel dimostrare che per ogni grammatica regolare si pu`o trovare un ASFND
equivalente, la seconda nel dimostrare il passaggio inverso.
Consideriamo una grammatica regolare ( = V
T
, V
N
, P, S); assumiamo,
senza perdita di generalit`a, che lunica possibile -produzione sia S .
Per costruire lASFND /
N
a partire da ( si procede come segue.
Si pone: = V
T
.
88 CAPITOLO 3. LINGUAGGI REGOLARI
Ad ogni non terminale si associa uno degli stati di Q e si aggiunge inoltre
un ulteriore stato q
F
. Si pone, cio`e:
Q = q
I
[ I V
N
q
F
.
Lo stato iniziale viene scelto corrispondente allassioma, per cui si pone:
q
0
= q
S
.
Linsieme F degli stati nali si sceglie come
F =
_
q
0
, q
F
se S P
q
F
altrimenti
La funzione di transizione
N
si denisce, per a e q
B
Q, come

N
(q
B
, a) =
_
q
C
[ B aC P q
F
se B a P
q
C
[ B aC P altrimenti.
Ovviamente lautoma `e non deterministico perche ad ogni non terminale
possono essere associate pi` u produzioni aventi la parte destra iniziante
con lo stesso terminale.
La dimostrazione che lautoma /
N
riconosce lo stesso linguaggio generato
dalla grammatica ( pu`o essere data mostrando che x

S

= x se e
solo se
N
(q
S
, x) include uno stato nale. Nel caso x = ci`o `e immediato per
costruzione.
Nel caso x
+
proveremo dapprima, per induzione sulla lunghezza di x,
che esiste una derivazione S

=xZ se e solo se q
Z

N
(q
S
, x).
Sia [ x [= 1. Supponiamo x = a, con a : allora abbiamo che S
aZ P, e quindi S=aZ se e solo se, per costruzione dellautoma, q
Z

N
(q
S
, a).
Sia [ y [= n 1 e x = ya, con a . Per lipotesi induttiva il risultato si
assume valido per y, cio`e S

= yZ se e solo se q
Z

N
(q
S
, y). Mostriamo che
esso `e valido anche per la stringa x. Infatti, osserviamo che una derivazione
S

=xZ

esiste se e solo se esiste Z V


N
tale che S

=yZ =yaZ

= xZ

;
per induzione ci`o `e equivalente ad assumere che esista q
Z
Q tale che
q
Z

N
(q
S
, y) e q
Z

N
(q
Z
, a),
e ci`o ovviamente avviene se e solo se
q
Z

_
p
N
(q
S
,y)

N
(p, a),
3.3. RELAZIONI TRA ASFD, ASFND E GRAMMATICHE DI TIPO 3 89
cio`e q
Z

N
(q
S
, x).
Osserviamo ora che S

= x se e solo se esistono Z V
N
, y

e
Z a P tali che x = ya e S

= yZ

= ya = x. Da quanto detto sopra,
ci`o `e vero se e solo se q
Z

N
(q
S
, y) e q
F

N
(q
Z
, a), e quindi se e solo se
q
F

N
(q
S
, ya) =
N
(q
S
, x).
In base alla denizione di F si pu`o dimostrare che esiste una derivazione
S=x se e solo se
N
(q
S
, x) F ,= .
Mostriamo ora che, dato un automa a stati niti (che, senza perdita
di generalit`a, possiamo assumere deterministico), `e possibile costruire una
grammatica di tipo 3 che genera lo stesso linguaggio da esso riconosciuto.
Sia , Q, , q
0
, F) lautoma dato: supponendo per il momento che q
0
, F,
deniamo la seguente grammatica.
1

V
T
= ;
2

V
N
= A
i
[ per ogni q
i
Q;
3

S = A
0
;
4

per ogni regola di transizione (q


i
, a) = q
j
abbiamo la produzione A
i

aA
j
, e se q
j
F anche la produzione A
i
a.
Se q
0
F cio`e se il linguaggio riconosciuto dallautoma contiene anche
la stringa vuota arricchiamo V
T
con un nuovo non terminale A

0
, per ogni
produzione A
0
aA
i
aggiungiamo la produzione A

0
aA
i
e introduciamo
inne la produzione A

0
. In tal caso lassioma sar`a A

0
anziche A
0
.
Dimostriamo ora che una stringa x `e derivabile mediante la grammatica se
e solo se essa `e accettata dallautoma. Consideriamo innanzi tutto il caso in
cui la stringa x `e di lunghezza nulla. In tal caso necessariamente q
0
F e per
costruzione lassioma `e A

0
ed esiste la produzione A

0
. Nel caso in cui la
lunghezza di x `e maggiore di 0 possiamo dimostrare che esiste la derivazione
A
i

= xA
j
se e solo se (q
i
, x) = q
j
e che esiste anche la derivazione A
i

= x
se e solo se q
j
F.
La dimostrazione procede per induzione.
Se x = a abbiamo A
i
= aA
j
se e solo se (q
i
, a) = q
j
(e inoltre abbiamo
che A
i
=a se e solo se q
j
F). Assumiamo ora che la propriet`a sia valida per
ogni stringa y di lunghezza n e mostriamo che essa `e valida per ogni stringa
x di lunghezza n + 1. Infatti, per lipotesi induttiva abbiamo A
i

= yA
k
se
e solo se (q
i
, y) = q
k
, inoltre per costruzione abbiamo A
k
= aA
j
se e solo
se (q
k
, a) = q
j
. Pertanto abbiamo A
i

= yA
k
= yaA
j
(= xA
j
) se e solo
se (q
i
, x) = (q
i
, ya) = ((q
i
, y), a) = q
j
e q
k
= (q
i
, y). Analogamente, se
90 CAPITOLO 3. LINGUAGGI REGOLARI
q
i
F, abbiamo A
i

= x se e solo se (q
i
, x) = q
j
. In particolare, abbiamo
A
0

= x (o A

= x se q
0
F) se e solo se (q
0
, x) = q
j
e q
j
F. 2
Esempio 3.14 Si consideri il linguaggio L rappresentato dallespressione regolare
a(a +ba)

a. Tale linguaggio `e generato dalla grammatica


( = a, b, S, B, P, S)
in cui P `e dato da
S aB
B aB [ bS [ a.
Lautoma /
N
= , Q,
N
, q
0
, F) che riconosce il linguaggio L `e denito nel modo
seguente (vedi Figura 3.13).
= V
T
.
Q = q
S
, q
B
, q
F
.
q
0
= q
S
come stato iniziale.
F = q
F
.

N
`e denita come segue

N
(q
S
, a) = q
B

N
(q
B
, a) = q
B
, q
F

N
(q
B
, b) = q
S
.
q
S
q
B
q
F
a
b
a
a
Figura 3.13 Automa non deterministico che riconosce il linguaggio L
rappresentato dallespressione regolare a(a +ba)

a.
In base al procedimento visto nella dimostrazione del Teorema 3.1, ed esemplicato
nellEsempio 3.12, da questo automa si ricava lautoma deterministico corrispondente,
riportato in Figura 3.14. A partire dallautoma di Figura 3.14 `e possibile derivare la
grammatica
(

= a, b, A
0
, A
1
, A
2
, A
3
, P, A
0
)
3.3. RELAZIONI TRA ASFD, ASFND E GRAMMATICHE DI TIPO 3 91
q
0
q
1
q
2
q
3
a
b
a
b
a
b
a, b
Figura 3.14 Automa deterministico che riconosce il linguaggio L
rappresentato dallespressione regolare a(a +ba)

a.
con le seguenti produzioni (si noti che le ultime tre produzioni sono inutili, in quanto
corrispondenti alle transizioni relative allo stato di errore q
2
).
A
0
aA
1
A
1
bA
0
A
1
aA
3
A
1
a
A
3
aA
3
A
3
a
A
3
bA
0
A
2
aA
2
A
2
bA
2
A
0
bA
2
Esercizio 3.10 Si consideri la grammatica regolare avente le seguenti produzioni:
S 0A [ 1B [ 0S
A aB [ bA [ a
B bA [ aB [ b.
Si generino lautoma non deterministico e lautoma deterministico che riconoscono
il linguaggio generato da tale grammatica. A partire dallautoma deterministico,
generare poi la grammatica corrispondente.
Si osservi che la procedura, descritta nella seconda parte della dimo-
strazione del Teorema 3.3, utilizzata per costruire una grammatica regolare
equivalente ad un dato automa a stati niti deterministico pu`o essere appli-
92 CAPITOLO 3. LINGUAGGI REGOLARI
cata anche qualora tale automa sia non deterministico, con la sola modi-
ca che per ogni transizione
N
(q
i
, a) = q
j
1
, . . . , q
j
h
abbiamo le produzioni
A
i
aA
j
1
[ aA
j
2
[ . . . [ aA
j
h
e, se almeno uno fra gli A
j
l
(l = 1, . . . , h)
appartiene ad F, abbiamo anche la produzione A
i
a. Lassunzione del
determinismo ha tuttavia consentito di semplicare la dimostrazione.
Esercizio 3.11 Dimostrare che, per ogni grammatica lineare sinistra, esiste una gram-
matica regolare equivalente.
[Suggerimento: Utilizzare quanto mostrato in Esercizio 3.5.]
3.4 Il pumping lemma per i linguaggi regolari
Un risultato fondamentale sulla struttura dei linguaggi regolari `e dato dal
seguente teorema, noto nella letteratura specializzata come pumping lemma.
Questo risultato essenzialmente ci dice che ogni stringa sucientemente
lunga appartenenente ad un linguaggio regolare ha una struttura che presenta
delle regolarit`a, nel senso, in particolare, che contiene una sottostringa che
pu`o essere ripetuta quanto si vuole, ottenendo sempre stringhe del linguaggio.
Teorema 3.4 (Pumping lemma per i linguaggi regolari) Per ogni lin-
guaggio regolare L esiste una costante n tale che se z L e [ z [ n allora
possiamo scrivere z = uvw, con [ uv [ n, [ v [ 1 e ottenere che uv
i
w L,
per ogni i 0.
Dimostrazione. Dato un linguaggio regolare L esiste un ASFD che lo ri-
conosce. Sia / = , Q, , q
0
, F) lautoma che riconosce L avente il minimo
numero possibile di stati n =[ Q [.
Sia z una stringa appartenente ad L, con [ z [ n. In tal caso, deve ne-
cessariamente valere (q
0
, z) F: supponiamo senza perdita di generalit`a che
q
i
0
, q
i
1
, . . . , q
i
|z|
sia la sequenza di stati attraversata da / durante il riconosci-
mento di z, con q
i
0
= q
0
e q
i
|z|
F. Dal momento che [ z [ n deve esistere,
per il pigeonhole principle, almeno uno stato in cui lautoma si porta almeno
due volte durante la lettura di z: sia j il minimo valore tale che q
i
j
viene attra-
versato almeno due volte, sia u il pi` u breve presso (eventualmente nullo) di
z tale che (q
0
, u) = q
i
j
e sia z = ux. Ovviamente, [ u [< n e (q
i
j
, x) = q
i|z|
.
Sia inoltre v il pi` u breve presso (non nullo) di x tale che (q
i
j
, v) = q
i
j
e sia
x = vw; vale ovviamente [ uv [ n e (q
i
j
, w) = q
i
|z|
(vedi Figura 3.15).
Per ogni i 0 abbiamo allora
(q
0
, uv
i
w) =
_
(q
0
, u), v
i
w
_
=
_
q
i
j
, v
i
w
_
3.4. IL PUMPING LEMMA PER I LINGUAGGI REGOLARI 93
=
_
(q
i
j
, v), v
i1
w
_
=
_
q
i
j
, v
i1
w
_
= . . .
= (q
i
j
, w)
= q
i
|z|
il che mostra che ogni stringa del tipo uv
i
w appartiene ad L. 2
q
i
0
q
i
j
q
i
|z |
u w
v
Figura 3.15 Comportamento dellASFD che accetta la stringa z nel pumping
lemma.
Il pumping lemma evidenzia uno dei principali limiti degli automi niti: essi
non possiedono la capacit`a di contare. Infatti essi possono memorizzare me-
diante i propri stati solo un numero nito di diverse situazioni, mentre non pos-
sono memorizzare numeri arbitrariamente grandi o quantit`a arbitrariamente
crescenti di informazione.
Si osservi che il pumping lemma fornisce soltanto una condizione necessa-
ria perche un linguaggio sia regolare. Esso non pu`o essere quindi utilizzato
per mostrare la regolarit`a di un linguaggio, ma viene generalmente usato per
dimostrare la non regolarit`a del linguaggio, come si pu`o vedere nel seguente
teorema.
Teorema 3.5 Il linguaggio L = a
n
b
n
[ n 0 non `e regolare.
Dimostrazione. Si assuma, per assurdo, che L sia regolare: in tal caso il
pumping lemma varr`a per tutte le strighe in L di lunghezza maggiore o uguale
di un opportuno n. Consideriamo ora una stringa z = a
m
b
m
L, m > n: in
base al pumping lemma, dovrebbero esistere stringhe u, v, w tali che z = uvw,
[ uv [ n, [ v [ 1 e per ogni i 0 uv
i
w L. Poiche m > n e poiche deve
essere [ uv [ n, si deve avere v = a
h
per un intero positivo h. In tal caso, L
dovrebbe per`o contenere anche stringhe del tipo a
mh
a
hi
b
m
, i = 0, 1, . . .. Ci`o
mostra che lipotesi che il linguaggio L sia regolare `e falsa. 2
Esercizio 3.12 Si consideri il linguaggio L = w w [ w a, b

, ove si `e indicata
con w la stringa ottenuta invertendo i caratteri presenti in w. Dimostrare, utilizzando
il pumping lemma, che tale linguaggio non `e regolare.
94 CAPITOLO 3. LINGUAGGI REGOLARI
3.5 Propriet`a di chiusura dei linguaggi regolari
In questa sezione mostreremo come la classe dei linguaggi regolari sia chiu-
sa rispetto ad un insieme signicativo di operazioni, insieme che include
le operazioni di unione, complementazione, intersezione, concatenazione e
iterazione.
Le dimostrazioni di tali propriet`a presentano tutte uno stesso schema, in
cui, a partire dagli ASFD che riconoscono i linguaggi regolari dati, viene deriva-
to un automa (deterministico o non deterministico) che riconosce il linguaggio
risultante.
Teorema 3.6 Dati due linguaggi regolari L
1
e L
2
, la loro unione L
1
L
2
`e
un linguaggio regolare.
Dimostrazione. Siano dati due qualunque automi deterministici /
1
=

1
, Q
1
,
N
1
, q
0
1
, F
1
) e /
2
=
2
, Q
2
,
N
2
, q
0
2
, F
2
), che accettano i linguaggi
L
1
= L(/
1
) e L
2
= L(/
2
), rispettivamente. Mostriamo ora come sia pos-
sibile, a partire da /
1
e /
2
, costruire un automa / = , Q,
N
, q
0
, F che
riconosce il linguaggio L = L(/) = L(/
1
) L(/
2
).
La costruzione procede nel modo seguente:
=
1

2
.
Q = Q
1
Q
2
q
0
.
F = F
1
F
2
, oppure F = F
1
F
2
q
0
se uno dei due automi /
1
, /
2
riconosce anche la stringa vuota.
La funzione di transizione
N
viene denita come segue:

N
(q, a) =
N
1
(q, a) se q Q
1
, a
1

N
(q, a) =
N
2
(q, a) se q Q
2
, a
2

N
(q
0
, a) =
N
1
(q
0
1
, a)
N
2
(q
0
2
, a), a .
Si pu`o vericare immediatamente che lautoma cos` denito accetta tutte e
sole le stringhe in L(/
1
) o in L(/
2
). 2
Si noti che anche se gli automi di partenza /
1
e /
2
sono deterministici, lau-
toma / costruito secondo la procedura teste descritta potr`a risultare non
deterministico.
3.5. PROPRIET
`
A DI CHIUSURA DEI LINGUAGGI REGOLARI 95
Esempio 3.15 Si consideri lautoma
/
1
= a, b, q
0
, q
1
,
1
, q
0
, q
1
),
il cui grafo di transizione `e rappresentato in Figura 3.16; si consideri inoltre lautoma
/
2
:
/
2
= a, b, q
2
, q
3
,
2
, q
2
, q
2
),
il cui grafo di transizione `e rappresentato in Figura 3.17.
q
0
q
1
b
a
a
Figura 3.16 Automa /
1
dellEsempio 3.15.
q
2
q
3
b
a
a
Figura 3.17 Automa /
2
dellEsempio 3.15.
Lautoma / = , Q,
N
, q

0
, F) che accetta lunione dei linguaggi accettati da
/
1
e da /
2
, si costruisce come segue.
= a, b.
Q = q

0
, q
0
, q
1
, q
2
, q
3
, dove q

0
`e il un nuovo stato iniziale.
F = q
1
, q
2
q

0
(perche il secondo automa riconosce anche la stringa vuota).
La funzione di transizione
N
`e data da

N
(q

0
, a) =
_

1
(q
0
, a)
_

N
(q

0
, b) =
_

1
(q
0
, b),
2
(q
2
, b)
_

N
(q
0
, a) =
_

1
(q
0
, a)
_

N
(q
0
, b) =
_

1
(q
0
, b)
_

N
(q
1
, a) =
_

1
(q
1
, a)
_

N
(q
2
, b) =
_

2
(q
2
, b)
_

N
(q
3
, a) =
_

2
(q
3
, a)
_

N
(q
3
, b) =
_

2
(q
3
, b)
_
.
96 CAPITOLO 3. LINGUAGGI REGOLARI
q

0
q
0
q
1
q
2
q
3
a
b
a
a
b
b
a
a
b
Figura 3.18 Automa che riconosce lunione tra L(/
1
) e L(/
2
).
Il grafo di transizione dellautoma / `e rappresentato in Figura 3.18.
Teorema 3.7 Dato un linguaggio regolare L, il suo complemento L `e un
linguaggio regolare.
Dimostrazione. Sia
/ = , Q, , q
0
, F)
un automa deterministico che riconosce il linguaggio L = L(/): si pu`o allora
costruire lautoma
/ = , Q, , q
0
, QF);
che riconosce il linguaggio L(/). Infatti, ogni stringa che porta lautoma /
in uno stato nale porta lautoma / in uno stato non nale e, viceversa, ogni
stringa che porta / in uno stato nale porta / in uno stato non nale, per
cui
L(/) =

L(/) = L(/).
2
Si noti che, per applicare la costruzione mostrata nel teorema precedente `e
necessario assumere che la funzione di transizione dellautoma dato sia totale.
3.5. PROPRIET
`
A DI CHIUSURA DEI LINGUAGGI REGOLARI 97
q
0
q
1
q
2
c
b
a
c
a
c
Figura 3.19 Esempio di automa.
Esempio 3.16 Si consideri il linguaggio L(/), dove / `e lautoma
/ = a, b, c, q
0
, q
1
, q
2
, , q
0
, q
1
, q
2
)
il cui grafo di transizione `e riportato in Figura 3.19. Per costruire lautoma / che
riconosce il linguaggio L(/), in questo caso si pu`o procedere come segue.
Prima di tutto, osservando che lautoma dato ha una funzione di transizione
parziale , `e necessario trasformarlo in un automa con funzione di transizione totale,
aggiungendo il nuovo stato q
3
e le transizioni (q
0
, b) = q
3
, (q
1
, a) = q
3
, (q
2
, b) = q
3
.
Per tutte le altre transizioni, = .
Quindi, si procede come previsto dalla dimostrazione del teorema e si ottiene cos`
lautoma seguente.
Si introduce il nuovo stato nale d.
Si pone:
(q
0
, a) = (q
0
, a)
(q
0
, c) = (q
0
, c)
(q
1
, b) = (q
1
, b)
(q
1
, c) = (q
1
, c)
(q
2
, a) = (q
2
, a)
(q
2
, c) = (q
2
, c).
Si pone:
(q
0
, b) = q
3
(q
1
, a) = q
3
(q
2
, b) = q
3
.
Si pone
(d, a) = q
3
(d, b) = q
3
98 CAPITOLO 3. LINGUAGGI REGOLARI
(d, c) = q
3
.
Si ottiene cos` lautoma
/ =

a, b, c, q
0
, q
1
, q
2
, q
3
, , q
0
, q
0
, q
3

_
il cui grafo di transizione `e riportato in Figura 3.20.
q
0
q
1
q
2
q
3
c
b
a
c
a
c
b
a c
Figura 3.20 Automa che accetta il complemento del linguaggio accettato
dallautoma di Figura 3.19.
In conseguenza dei due risultati precedenti, possiamo mostrare immediata-
mente che i linguaggi regolari sono chiusi anche rispetto allintersezione.
Teorema 3.8 Dati due linguaggi regolari L
1
e L
2
, la loro intersezione L =
L
1
L
2
`e un linguaggio regolare.
Dimostrazione.
`
E suciente osservare che, per la legge di De Morgan,
L = L
1
L
2
L
1
L
2
.
2
Consideriamo ora la chiusura dellinsieme dei linguaggi regolari rispetto alla
concatenazione.
Teorema 3.9 Dati due linguaggi regolari L
1
e L
2
, la loro concatenazione L =
L
1
L
2
`e un linguaggio regolare.
3.5. PROPRIET
`
A DI CHIUSURA DEI LINGUAGGI REGOLARI 99
Dimostrazione. Si considerino gli automi deterministici
/
1
=
1
, Q
1
,
1
, q
01
, F
1
)
/
2
=
2
, Q
2
,
2
, q
02
, F
2
),
che riconoscono, rispettivamente, i linguaggi L
1
= L(/
1
) ed L
2
= L(/
2
). Sia
/ = , Q,
N
, q
0
, F) un automa non deterministico tale che:
=
1

2
;
Q = Q
1
Q
2
;
F =
_
F
2
se , L(/
2
),
F
1
F
2
altrimenti;
q
0
= q
01
;
la
N
`e denita come segue:

N
(q, a) =
1
(q, a), q Q
1
F
1
, a
1

N
(q, a) =
1
(q, a)
2
(q
02
, a), q F
1
, a

N
(q, a) =
2
(q, a), q Q
2
, a
2
.
Per costruzione, lautoma / accetta tutte e sole le stringhe di L = L
1
L
2
. 2
Esempio 3.17 Si consideri lautoma /
1
denito da
/
1
= a, b, q
0
, q
1
,
1
, q
0
, q
1
),
ed il cui grafo di transizione `e quello di Figura 3.16; si consideri inoltre lautoma /
2
denito da
/
2
= a, b, q
2
, q
3
,
2
, q
2
, q
2
),
ed il cui grafo di transizione `e quello di Figura 3.17. Per costruire lautoma / che
eettua la concatenazione L(/
2
) L(/
1
) si procede come segue.
Si pone = a, b.
Si pone Q = q
0
, q
1
, q
2
, q
3
.
Si sceglie q
2
come stato iniziale.
Si pone F = q
1
(perche /
1
non accetta la stringa vuota).
La funzione di transizione si ricava come segue. Per gli stati appartenenti a
Q
2
F
2
si ha:

N
(q
3
, a) =
2
(q
3
, a).
100 CAPITOLO 3. LINGUAGGI REGOLARI
Per gli stati appartenenti ad F
2
si ha:

N
(q
2
, a) =
1
(q
0
, a)

N
(q
2
, b) =
2
(q
2
, b)
1
(q
0
, b).
Per gli stati appartenenti a Q
1
si ha:

N
(q
0
, a) =
1
(q
0
, a)

N
(q
0
, b) =
1
(q
0
, b)

N
(q
1
, a) =
1
(q
1
, a).
Il grafo di transizione dellautoma / `e riportato in Figura 3.21.
q
0
q
1
q
2
q
3
b
a
a
a
b
a
b
a
Figura 3.21 Automa che accetta la concatenazione dei linguaggi accettati
dagli automi di Figura 3.16 e Figura 3.17.
Inne, mostriamo come la classe dei linguaggi regolari sia chiusa anche rispetto
alliterazione.
Teorema 3.10 Dato un linguaggio regolare L, anche L

`e un linguaggio
regolare.
Dimostrazione. Per dimostrare questa propriet`a, si consideri lautoma
deterministico
/ = , Q, , q
0
, F)
che riconosce L = L(/). A partire da questo, deriviamo un automa /

=
, Q q

0
,

, q

0
, F q

0
), che riconosce L

= (L(/))

, ponendo

(q, a) = (q, a), q QF

(q, a) = (q, a) (q
0
, a), q F

(q

0
, a) = (q
0
, a).
3.5. PROPRIET
`
A DI CHIUSURA DEI LINGUAGGI REGOLARI 101
Per costruzione lautoma /

`e in grado di accettare tutte e sole le stringhe di


L

. 2
Esercizio 3.13 Mostrare che in eetti lautoma /

denito nella dimostrazione del


Teorema 3.10 accetta tutte e sole stringhe di L

.
q
0
q
1
q
2
b, c
a
b
a
c
Figura 3.22 Esempio di automa.
Esempio 3.18 Si consideri lautoma / di Figura 3.22.
Per costruire lautoma che riconosce literazione di L(/) si procede come segue.
Si pone

= .
Si pone Q

= Q q

0
, dove q

0
`e il nuovo stato iniziale.
Si pone F

= F q

0
.
La funzione di transizione `e denita al seguente modo. Per gli stati appartenenti
a QF si ha:

(q
0
, b) = (q
0
, b)

(q
1
, a) = (q
1
, a)

(q
1
, b) = (q
1
, b).
Per gli stati appartenenti ad F si ha:

(q
2
, a) = (q
2
, a)

(q
2
, b) = (q
0
, b)

(q
2
, c) = (q
2
, c) (q
0
, c).
Inoltre si ha

(q

0
, b) = (q
0
, b)

(q

0
, c) = (q
0
, c).
Lautoma /

che si ottiene `e riportato in Figura 3.23.


102 CAPITOLO 3. LINGUAGGI REGOLARI
q

0
q
0
q
1
q
2
b
b, c
a
b
a, c
c
Figura 3.23 Iterazione dellautoma di Figura 3.22.
Esercizio 3.14 Dati i linguaggi L
1
e L
2
generati dalle seguenti grammatiche
S aA [ bS [ a
A aS [ bA
e
S bB [ aS [
B bS [ aB
determinare gli ASFND che accettano L
1
L
2
, L
1
L
2
e L

2
.
Linsieme dei linguaggi regolari presenta la propriet`a di chiusura anche ri-
spetto ad altre operazioni, oltre quelle considerate in questa sezione. Ad esem-
pio, abbiamo gi`a visto che se il linguaggio L `e regolare anche il linguaggio delle
stringhe riesse di L `e regolare (Teorema 3.2). Il seguente esercizio introduce
una ulteriore operazione rispetto a cui i linguaggi regolari sono chiusi.
Esercizio 3.15 Dimostrare che i linguaggi regolari sono chiusi rispetto alla seguente
operazione: sia = a
1
, . . . , a
n
lalfabeto e siano L
1
, . . . , L
n
n linguaggi regolari.
Dato il linguaggio L loperazione costruisce il linguaggio L

nel seguente modo: per


ogni stringa a
i1
, . . . , a
in
L, L

contiene il linguaggio L
i1
L
in
.
3.6 Espressioni regolari e grammatiche regolari
Nelle sezioni precedenti si `e visto che le grammatiche di tipo 3 e gli automi a
stati niti deniscono la stessa classe di linguaggi e cio`e i linguaggi regolari.
Inoltre, si `e anche accennato al fatto che le espressioni regolari rappresentano
linguaggi regolari. In questa sottosezione la caratterizzazione dei linguaggi
regolari verr`a completata mostrando formalmente le propriet`a che legano i
linguaggi regolari e le espressioni regolari.
Teorema 3.11 Tutti i linguaggi deniti da espressioni regolari sono regolari.
Dimostrazione. Basta dimostrare che ogni espressione regolare denisce
un linguaggio regolare. Ci`o appare evidente dalla denizione delle espressioni
3.6. ESPRESSIONI REGOLARI E GRAMMATICHE REGOLARI 103
regolari, che rappresentano linguaggi a partire dai linguaggi regolari niti ,
a, b, . . . , mediante le operazioni di unione, concatenazione e iterazione
ripetute un numero nito di volte (vedi Tabella 1.3). Poiche `e stato dimostrato
che per i linguaggi regolari vale la propriet`a di chiusura per tutte le operazioni
citate (vedi Teoremi 3.6, 3.9 e 3.10), si pu`o concludere che le espressioni regolari
deniscono solamente linguaggi regolari. 2
Si osservi che applicando in maniera opportuna le operazioni di composizione
di ASF descritte nelle dimostrazioni dei Teoremi 3.6, 3.9 e 3.10, `e possibile
anche, data una espressione regolare r, costruire un ASFND / tale che L(/) =
L(r), tale cio`e da riconoscere il linguaggio denito da r.
Mostriamo ora limplicazione opposta, che cio`e le espressioni regolari sono
sucientemente potenti da descrivere tutti i linguaggi regolari. Faremo ci`o
in due modi alternativi, mostrando prima come derivare, a partire da una
grammatica ( di tipo 3, una espressione regolare che descrive il linguaggio
generato da (. Quindi, mostreremo come derivare, a partire da un ASFD /,
una espressione regolare che descrive il linguaggio riconosciuto da /. Entrambi
questi risultati implicano che tutti i linguaggi regolari sono denibili mediante
espressioni regolari.
Teorema 3.12 Data una grammatica ( di tipo 3, esiste una espressione re-
golare r tale che L(() = L(r), che descrive cio`e il linguaggio generato da
(.
Dimostrazione. Consideriamo una grammatica ( di tipo 3 ed il linguaggio
L da essa generato, che per semplicit`a assumiamo non contenga la stringa
vuota . Se cos` non fosse, applichiamo le considerazioni seguenti al linguaggio
L , anchesso regolare: una volta derivata unespressione regolare r che
lo denisce, lespressione regolare che denisce L sar`a chiaramente r +.
Trascurando alcuni dettagli formali e limitandoci alla sola intuizione, alla
grammatica ( possiamo far corrispondere un sistema di equazioni su espres-
sioni regolari, nel seguente modo. Innanzi tutto estendiamo con variabili
A, . . . , Z il linguaggio delle espressioni regolari, associando una variabile ad
ogni non terminale in (. Tali variabili potranno assumere valori nellinsieme
delle espressioni regolari. Pertanto, se il valore dellespressione regolare A `e,
ad esempio, (00 + 11)

, lespressione estesa A(0 + 1) indica tutte le stringhe


del tipo (00 + 11)

(0 + 1).
Raggruppiamo ora tutte le produzioni che presentano a sinistra lo stesso
non terminale. Per ogni produzione del tipo
A a
1
B
1
[ a
2
B
2
[ . . . [ a
n
B
n
[ b
1
[ . . . [ b
m
creiamo unequazione del tipo
A = a
1
B
1
+a
2
B
2
+. . . +a
n
B
n
+b
1
+. . . +b
m
.
104 CAPITOLO 3. LINGUAGGI REGOLARI
Come si vede, unequazione pu`o essere impostata come lattribuzione ad
una variabile del valore di unespressione regolare estesa.
Risolvere un sistema di equazioni su espressioni regolari estese signica
dunque individuare i valori, cio`e le espressioni regolari normali, prive delle va-
riabili che deniscono a loro volta espressioni regolari, che, una volta sostituiti
alle variabili, soddisfano il sistema di equazioni.
`
E facile osservare che ad una
grammatica regolare corrisponde un sistema di equazioni lineari destre, in cui
ogni monomio contiene una variabile a destra di simboli terminali.
Ad esempio, la grammatica
A aA [ bB
B bB [ c
corrisponde al sistema di equazioni
_
A = aA+bB
B = bB +c.
Per risolvere un sistema di tale genere utilizzeremo, oltre alle trasfor-
mazioni algebriche applicabili sulle operazioni di unione e concatenazione
(distributivit`a, fattorizzazione, ecc.), le seguenti due regole.
Sostituzione di una variabile con unespressione regolare estesa. Con
riferimento allesempio precedente abbiamo
_
A = aA+b(bB +c) = aA+bbB +bc
B = bB +c.
Eliminazione della ricursione. Lequazione B = bB + c si risolve in
B = b

c. Infatti, sostituendo a destra e sinistra abbiamo


b

c = b(b

c) +c = b
+
c +c = (b
+
+)c = b

c.
Pi` u in generale abbiamo che unequazione del tipo
A =
1
A+
2
A+. . . +
n
A+
1
+
2
+. . . +
m
si risolve in
A = (
1
+
2
+. . . +
n
)

(
1
+
2
+. . . +
m
),
dove
1
, . . . ,
n
,
1
, . . . ,
m
sono espressioni regolari estese.
3.6. ESPRESSIONI REGOLARI E GRAMMATICHE REGOLARI 105
Applicando le due regole suddette possiamo risolvere ogni sistema di equa-
zioni (lineari destre) su espressioni regolari estese corrispondente ad una
grammatica, e quindi individuare le espressioni regolari che corrispondono
al linguaggio generato dai rispettivi non terminali della grammatica e, in
particolare, al linguaggio generato a partire dallassioma. 2
Esempio 3.19 Data la grammatica regolare
A

0
[ aA
1
[ a
A
0
aA
1
[ a
A
1
bA
3
[ bA
2
A
2
aA
2
[ bA
0
[ b
A
3
bA
3
[ aA
2
.
si ottiene il seguente sistema lineare
_

_
A

0
= +aA
1
+a
A
0
= aA
1
+a
A
1
= bA
3
+bA
2
A
2
= aA
2
+bA
0
+b
A
3
= bA
3
+aA
2
che pu`o essere risolto tramite i seguenti passaggi.
_

_
A

0
= +aA
1
+a
A
0
= aA
1
+a
A
1
= bA
3
+bA
2
A
2
= aA
2
+bA
0
+b
A
3
= b

aA
2
per eliminazione della ricursione su A
3
.
_

_
A

0
= +aA
1
+a
A
0
= aA
1
+a
A
1
= bA
3
+bA
2
A
2
= a

(bA
0
+b)
A
3
= b

aA
2
per eliminazione della ricursione su A
2
.
_

_
A

0
= +aA
1
+a
A
0
= aA
1
+a
A
1
= bA
3
+bA
2
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
106 CAPITOLO 3. LINGUAGGI REGOLARI
per sostituzione di A
2
nellequazione relativa ad A
3
.
_

_
A

0
= +aA
1
+a
A
0
= aA
1
+a
A
1
= b(b

aa

(bA
0
+b)) +b(a

(bA
0
+b))
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per sostituzione di A
2
e A
3
nellequazione relativa ad A
1
.
_

_
A

0
= +aA
1
+a
A
0
= aA
1
+a
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per fattorizzazione nellequazione relativa ad A
1
.
_

_
A

0
= +aA
1
+a
A
0
= a(b(b

aa

+a

)(bA
0
+b)) +a
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per sostituzione di A
1
nellequazione relativa ad A
0
.
_

_
A

0
= +aA
1
+a
A
0
= ab(b

aa

+a

)bA
0
+ab(b

aa

+a

)b +a
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per fattorizzazione nellequazione relativa ad A
0
.
_

_
A

0
= +aA
1
+a
A
0
= (ab(b

aa

+a

)b)

(ab(b

aa

+a

)b +a)
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per eliminazione della ricursione su A
0
.
3.6. ESPRESSIONI REGOLARI E GRAMMATICHE REGOLARI 107
_

_
A

0
= a(b(b

aa

+a

)(bA
0
+b)) +a +
A
0
= (ab(b

aa

+a

)b)

(ab(b

aa

+a

)b +a)
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per sostituzione di A
1
nellequazione relativa ad A

0
.
_

_
A

0
= ab(b

aa

+a

)(b((ab(b

aa

+a

)b)

(ab(b

aa

+a

)b +a))
+b) +a +
A
0
= (ab(b

aa

+a

)b)

(ab(b

aa

+a

)b +a)
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per sostituzione di A
0
nellequazione relativa ad A

0
.
_

_
A

0
= ((ab(b

+)a

b)

+)(ab(b

a +)a

b +a) +
A
0
= (ab(b

aa

+a

)b)

(ab(b

aa

+a

)b +a)
A
1
= b(b

aa

+a

)(bA
0
+b)
A
2
= a

(bA
0
+b)
A
3
= b

aa

(bA
0
+b)
per fattorizzazione nellequazione relativa ad A

0
.
Nel caso di -produzioni presenti nella grammatica regolare conviene opera-
re delle sostituzioni per eliminarle preliminarmente, mantenendo al pi` u una
produzione S , dove S `e lassioma.
Esempio 3.20 Data la grammatica regolare avente le produzioni
S aS [ bA [
A aA [ bS [
eliminando la produzione A la si pu`o trasformare nella grammatica regolare
equivalente
S aS [ bA [ [ b
A aA [ bS [ a.
Per ricavare lespressione regolare corrispondente abbiamo:
A = a

(bS +a) eliminando la ricursione su A


e, per sostituzione,
S = (a +ba

b)S +ba

a +b +.
Eliminando anche la ricursione rispetto ad S si ottiene
S = (a +ba

b)

(ba

a +b +).
108 CAPITOLO 3. LINGUAGGI REGOLARI
Esercizio 3.16 Si consideri la seguente grammatica:
A aB [ bC [ a
B aA [ bD [ b
C ab [ aD [ a
D aC [ bB [ b
che genera le stringhe contenenti un numero dispari di a o un numero dispari di b. Si
costruisca lespressione regolare corrispondente.
Vediamo ora come sia possibile costruire una espressione regolare corri-
spondente al linguaggio accettato da un automa a stati niti deterministico.
Teorema 3.13 Dato un ASFD /, esiste una espressione regolare r tale che
L(/) = L(r), che descrive cio`e il linguaggio riconosciuto da /.
Dimostrazione. Sia / = , Q, , q
0
, F) un ASFD e sia L il linguaggio da
esso riconosciuto. Assumiamo, per semplicit`a e senza perdere generalit`a che
F = q
F
.
Sia n =[ Q [ e sia q
0
, . . . , q
n1
) un qualunque ordinamento degli stati
tale che q
n1
= q
F
. Deniamo ora come R
k
ij
, 0 i, j n 1, k max(i, j),
linsieme delle stringhe tali da portare / da q
i
a q
j
senza transitare per nessuno
stato q
h
con h k.
Abbiamo cio`e che x = a
1
, . . . , a
m
R
k
ij
se e solo se:
1. (q
i
, x) = q
j
;
2. Se (q
i
, a
1
. . . a
l
) = q
i
l
allora i
l
< k, per 1 l m1.
Osserviamo che, per k = 1, si ha:
R
1
ij
=
_
a tali che (q
i
, a) = q
j
, se ne esiste almeno uno;
altrimenti.
Per k > 1 possiamo osservare che se x R
k+1
ij
`e una stringa che conduce da
q
i
a q
j
senza transitare per nessuno stato q
h
con h k +1, possono vericarsi
due casi:
1. x conduce da q
i
a q
j
senza transitare per q
k
, dal che deriva che x R
k
ij
.
2. x conduce da q
i
a q
j
transitando per q
k
. In tal caso la sequenza degli
stati attraversati pu`o essere divisa in varie sottosequenze:
(a) una prima sequenza, da q
i
a q
k
senza transitare per nessuno stato
q
h
con h > k, la corrispondente sottostringa di x apparterr`a quindi
a x R
k
ik
;
3.6. ESPRESSIONI REGOLARI E GRAMMATICHE REGOLARI 109
(b) r 0 sequenze, ognuna delle quali inizia e termina in q
k
senza tran-
sitare per nessuno stato q
h
con h k, la corrispondente sottostringa
di x apparterr`a quindi a x R
k
kk
;
(c) una sequenza nale, da q
k
a q
j
senza transitare per nessuno stato
q
h
con h k, la corrispondente sottostringa di x apparterr`a quindi
a x R
k
kj
.
In conseguenza di ci`o, deriva la relazione R
k+1
ij
= R
k
ij
R
k
ik
(R
k
kk
)

R
k
kj
.
Dalle osservazioni precedenti deriva che `e possibile costruire tutti gli insiemi
R
k
ij
a partire da k = 1 e derivando poi, man mano i successivi. Osserviamo
anche che L = R
n
0(n1)
.
Notiamo ora che ogni insieme di stringhe R
k
ij
pu`o essere descritto per mezzo
di una opportuna espressione regolare r
k
ij
, infatti abbiamo che, per k = 1,
r
1
ij
=
_
a
i
1
+. . . +a
i
l
dove (q
i
, a
i
k
) = q
j
, k = 1, . . . , l;
se l = 0.
Mentre, per k > 1, abbiamo che, dalla relazione tra R
k+1
ij
, R
k
ik
, R
k
kk
e R
k
kj
,
deriva che r
k+1
ij
= r
k
ij
+r
k
ik
(r
k
kk
)

r
k
kj
.
Quindi, il linguaggio L sar`a descritto dallespressione regolare r
n
0(n1)
. 2
Esempio 3.21 Consideriamo ad esempio lASFD di Figura 3.14. Applicando la co-
struzione del Teorema 3.13 con lordinamento q
1
= q
0
, q
2
= q
1
, q
3
= q
3
, q
4
= q
2
tra gli
stati, abbiamo che:
r
0
00
= ; r
0
01
= a; r
0
02
= b; r
0
03
= ;
r
0
10
= b; r
0
11
= ; r
0
12
= ; r
0
13
= a;
r
0
20
= ; r
0
21
= ; r
0
22
= a +b; r
0
23
= ;
r
0
30
= b; r
0
31
= ; r
0
32
= ; r
0
33
= a;
r
1
00
= ; r
1
01
= a; r
1
02
= b; r
1
03
= ;
r
1
10
= b; r
1
11
= ba; r
1
12
= bb; r
1
13
= a;
r
1
20
= ; r
1
21
= ; r
1
22
= a +b; r
1
23
= ;
r
1
30
= b; r
1
31
= ba; r
1
32
= bb; r
1
33
= a;
r
2
00
= a(ba)

b; r
2
01
= a +a(ba)

ba; r
2
02
= b +a(ba)

bb; r
2
03
= a(ba)

a;
r
2
10
= b +ba(ba)

b; r
2
11
= ba +ba(ba)

ba; r
2
12
= bb +ba(ba)

bb; r
2
13
= a +ba(ba)

a;
110 CAPITOLO 3. LINGUAGGI REGOLARI
r
2
20
= ; r
2
21
= ; r
2
22
= a +b; r
2
23
= ;
r
2
30
= b +ba(ba)

b; r
2
31
= ba +ba(ba)

ba; r
2
32
= bb +ba(ba)

bb; r
2
33
= a +ba(ba)

a;
.
.
.
Esercizio 3.17 Completare la costruzione delle espressioni regolari r
k
ij
dellE-
sempio 3.21 e mostrare che in eetti lautoma riconosce il linguaggio a(a +
ba)

a.
Sia dal Teorema 3.12 che dal Teorema 3.13 `e quindi immediato derivare
il seguente corollario.
Corollario 3.14 La classe dei linguaggi regolari coincide con la classe dei
linguaggi rappresentati da espressioni regolari.
In conclusione, sulla base dei risultati visti precedentemente e delle propriet`a di
chiusura studiate nella Sezione 3.5, `e possibile dimostrare il seguente teorema.
Teorema 3.15 La classe dei linguaggi regolari su di un alfabeto =
a
1
, . . . , a
n
costituisce la pi` u piccola classe contenente il linguaggio vuo-
to e tutti i linguaggi a
1
, . . . , a
n
, che sia chiusa rispetto ad unione,
concatenazione e iterazione.
Dimostrazione. La dimostrazione viene lasciata come esercizio. 2
Esercizio 3.18 Dimostrare il Teorema 3.15.
3.7 Predicati decidibili sui linguaggi regolari
Le propriet`a dei linguaggi regolari viste nelle sezioni precedenti possono esse-
re sfruttate per dimostrare la verit`a o falsit`a di predicati relativi a specici
linguaggi regolari. I primi e pi` u signicativi di tali predicati sono quelli che
fanno riferimento alla cardinalit`a di un linguaggio regolare.
Teorema 3.16
`
E possibile decidere se il linguaggio accettato da un dato
automa a stati niti `e vuoto, nito oppure innito.
Dimostrazione. Mostriamo innanzi tutto che se un automa con n stati ac-
cetta qualche stringa, allora accetta una stringa di lunghezza inferiore ad n.
Infatti, detta z la stringa pi` u breve accettata dallautoma, se fosse [ z [ n al-
lora, in base al pumping lemma (Teorema 3.4), z potrebbe essere scritta come
uvw e anche la stringa uw, pi` u breve di z, sarebbe accettata dallautoma.
3.7. PREDICATI DECIDIBILI SUI LINGUAGGI REGOLARI 111
Dato quindi un automa / con n stati, per decidere se L(/) = basta
vericare se esso accetta almeno una delle

n1
i=0
[ [
i
stringhe di lunghezza
inferiore ad n.
In modo analogo, mostriamo che L(/) `e innito se e solo se / accetta una
stringa z, con n [ z [< 2n. Infatti se / accetta una z lunga almeno n allora,
in virt` u del pumping lemma, accetta innite stringhe. Daltra parte, se L(/)
`e innito, allora esiste z L(/) tale che [ z [ n. Se [ z [< 2n lasserto `e
provato; se invece [ z [ 2n allora, per il pumping lemma, z pu`o essere scritta
come uvw, con 1 [ v [ n e uw L(/) e da ci`o segue che esiste una stringa
x = uv L(/) tale che n [ x [< 2n.
Per decidere dunque se L(/) `e innito basta vericare se / accetta una
delle

2n1
i=n
[ [
i
stringhe di lunghezza compresa fra n e 2n 1. 2
In denitiva per vericare se il linguaggio accettato da un automa sia nito,
vuoto o innito, si osserva il comportamento dellautoma su tutte le stringhe
di lunghezza non superiore a 2n:
se nessuna viene accettata allora il linguaggio `e vuoto;
se tutte quelle accettate hanno lunghezza inferiore ad n, allora il
linguaggio `e nito;
se tra le stringhe accettate ve ne sono alcune la cui lunghezza sia
superiore o uguale ad n allora il linguaggio `e innito.
Si osservi che questo metodo, seppur utile per mostrare la decidibilit`a dei
problemi considerati, risulta fortemente ineciente, in quanto richiede di esa-
minare una quantit`a di stringhe pari a

2n1
i=0
[ [
i
= O(2
n
), vale a dire
esponenziale rispetto ad n.
Metodi pi` u ecienti per determinare se L(/) `e vuoto, nito o innito
considerano la struttura della funzione di transizione di / e, in particolare,
il relativo grafo di transizione. Non `e dicile rendersi conto che valgono le
propriet`a seguenti:
a) Se non esiste un cammino nel grafo dallo stato iniziale q
0
ad un qualche
stato nale q F, allora L(/) = (e viceversa).
b) Se esiste un cammino nel grafo dallo stato iniziale q
0
ad un qualche stato
nale q F che attraversa almeno due volte uno stesso stato, e quindi
include un ciclo, allora L(/) `e innito (e viceversa).
Esercizio 3.19 Dimostrare formalmente le propriet`a a) e b).
Quindi, `e possibile vericare se L(/) `e vuoto o innito semplicemente
vericando se, nel grafo di transizione di /, esistono cammini tra particolari
coppie di nodi, nel primo caso, o cicli che sono inclusi in tali cammini, nel
112 CAPITOLO 3. LINGUAGGI REGOLARI
secondo: tali propriet`a, su un grafo orientato, sono determinabili in tempo
lineare (nel numero di nodi e di archi) applicando opportunamente i classici
metodi di visita di gra.
Esercizio 3.20 Scrivere un algoritmo che, dato un automa, determini, per mezzo di
una visita del relativo grafo di transizione, se il linguaggio accettato `e vuoto, innito
o nito.
Il Teorema 3.16 consente di dimostrare altre propriet`a di decidibilit`a sui
linguaggi regolari.
Teorema 3.17 Il problema dellequivalenza di due linguaggi regolari `e deci-
dibile.
Dimostrazione. Per dimostrare lequivalenza di due linguaggi, basta dimo-
strare che la loro intersezione coincide con la loro unione, cio`e che la loro
dierenza simmetrica (lunione dellintersezione del primo con il complemento
del secondo e dellintersezione del secondo con il complemento del primo) `e il
linguaggio vuoto. Facendo riferimento agli automi /
1
e /
2
che riconoscono
L
1
ed L
2
, basta dimostrare che
L(/
1
) L(/
1
) =
_
L(/
1
) L(/
2
)
_

_
L(/
1
) L(/
2
)
_
=
_
L(/
1
) L(/
2
)
_

_
L(/
1
) L(/
2
)
_
= .
dove il simbolo denota loperazione di dierenza simmetrica tra insiemi.
Tale propriet`a `e vericabile considerando il corrispondente automa, che
`e possibile costruire a partire da /
1
e /
2
applicando le tecniche, illustrate
in Sezione 3.5, per derivare automi che riconoscano il linguaggio unione ed il
linguaggio complemento. 2
A B
Figura 3.24 Dierenza simmetrica tra insiemi (ombreggiata).
3.8. IL TEOREMA DI MYHILL-NERODE 113
La decidibilit`a dellequivalenza di due linguaggi `e caratteristica dei soli linguag-
gi regolari, nellambito della gerarchia di Chomsky. Infatti, tale propriet`a `e
indecidibile gi`a per i linguaggi di tipo 2. Nel caso dei linguaggi regolari essa `e
molto importante anche perch`e consente di realizzare un banale algoritmo per
minimizzare il numero degli stati di un automa. Uno stesso linguaggio, infatti,
pu`o venire accettato da automi diversi, per cui si pu`o desiderare di costruire
lautoma che riconosca lo stesso linguaggio di un automa dato, ma che abbia
il minimo numero di stati necessario allaccettazione. Dato un automa ad n
stati che riconosce un certo linguaggio L, `e possibile, in linea di principio, ge-
nerare tutti gli automi con m < n stati e controllare se qualcuno `e equivalente
allautoma dato.
In pratica, per costruire lASF minimo che riconosce un dato linguaggio
non si procede in tal modo ma si procede, in modo pi` u eciente, partizionando
linsieme Q degli stati in classi di equivalenza, come illustrato nella sezione che
segue.
3.8 Il teorema di Myhill-Nerode
Dato un linguaggio L deniamo la relazione binaria R
L
su

come segue:
xR
L
y (z

xz L yz L).
La R
L
`e palesemente una relazione di congruenza (vedi Denizione 1.36) e
il teorema che segue stabilisce una condizione necessaria e suciente sullindice
di tale relazione anche L sia regolare.
Teorema 3.18 (Myhill-Nerode) Un linguaggio L

`e regolare se e solo
se la relazione R
L
ha indice nito.
Dimostrazione. Supponendo che L sia regolare, sia / = , Q, , q
0
, F) un
ASFD che lo riconosce. Consideriamo la relazione binaria R
A
su

denita
come
xR
A
y (q
0
, x) = (q
0
, y),
in cui due stringhe sono in relazione se e solo se, partendo dallo stato iniziale,
esse portano lautoma nello stesso stato. Come `e possibile immediatamente
vericare, questa relazione gode delle seguenti propriet`a.
i) R
A
`e una relazione di equivalenza;
ii) xR
A
y = z

xzR
A
yz;
iii) R
A
ha indice nito, pari al pi` u al numero di stati dellautoma /, poiche
ad ogni stato raggiungibile da q
0
si pu`o associare una dierente classe di
equivalenza;
114 CAPITOLO 3. LINGUAGGI REGOLARI
iv) R
A
induce un partizionamento di

in un numero di classi non infe-


riore al numero di classi dovute ad R
L
, perche se xR
A
y allora, per la
denizione di R
A
e per la propriet`a ii),
(q
0
, xz) = (q
0
, yz) Q, z

,
per cui in particolare xz L yz L e quindi xR
L
y.
Dato che, per la propriet`a iv) la R
A
costituisce al pi` u un ranamento della
R
L
, cio`e
ind(R
A
) ind(R
L
)
e la R
A
ha indice nito, allora anche la R
L
ha indice nito.
Supponiamo ora che sia data la relazione R
L
ed essa abbia indice ni-
to. Possiamo allora denire un automa a stati niti deterministico /

=
, Q

, q

0
, F

) nel seguente modo: Q

`e costruito in maniera tale da asso-


ciare a ogni classe [x] di

uno stato q
[x]
, q

0
= q
[]
, F

= q
[x]
[x L,

(q
[x]
, a) = q
[xa]
a .
`
E possibile mostrare facilmente, per induzione sul-
la lunghezza delle stringhe, che /

riconosce L, che pertanto `e un linguaggio


regolare. 2
Il teorema di Myhill-Nerode consente di ribadire la propriet`a, gi`a incontrata
precedentemente, secondo cui il potere computazionale di un automa a stati
niti `e limitato proprio alla classicazione di stringhe in un numero nito di
classi: proprio da ci`o discende limpossibilit`a di usare un automa a stati niti
per riconoscere linguaggi del tipo a
n
b
n
per i quali si rende necessaria, in un
certo senso, la capacit`a di contare.
Esercizio 3.21 Dimostrare che per il linguaggio L = a
n
b
n
[ n 1 la relazione R
L
non ha indice nito.
Il teorema di Myhill-Nerode ha anche unaltra importante applicazione.
Esso pu`o essere utilizzato per minimizzare un dato ASFD /, vale a dire per
costruire lautoma equivalente avente il minimo numero di stati: lautoma /

introdotto nella dimostrazione del Teorema 3.18 gode infatti di tale propriet`a,
valendo le seguenti disuguaglianze:
[Q[ ind(R
A
) ind(R
L
) = [Q

[,
il che mostra che / non pu`o avere un numero di stati inferiore a quello degli
stati di /

. Tale automa /

gode inoltre della ulteriore propriet`a di essere


unico (a meno di una ridenominazione degli stati), propriet`a che tuttavia non
proveremo in questa sede.
3.8. IL TEOREMA DI MYHILL-NERODE 115
3.8.1 Minimizzazione di automi a stati niti
Dalla dimostrazione del Teorema 3.18 scaturisce un semplice algoritmo di mi-
nimizzazione di un automa a stati niti deterministico / = , Q, , q
0
, F).
Denotiamo con la relazione su Q
2
tale che
q
i
q
j
(x

(q
i
, x) F (q
j
, x) F).
Si tratta, come `e ovvio, di una relazione di equivalenza. Gli stati q
i
, q
j
tali che q
i
q
j
sono detti indistinguibili ; nel caso invece esista una stringa
x

per cui (q
i
, x) F e (q
j
, x) QF (o viceversa) diremo che q
i
e q
j
sono distinguibili tramite x.
Per minimizzare un ASFD `e in pratica suciente individuare tutte le
coppie di stati indistinguibili sfruttando un semplice algoritmo di marcatu-
ra delle coppie distinguibili. Ci`o fatto, lautoma minimo `e ottenuto uni-
cando gli stati equivalenti, eliminando quelli non raggiungibili e modicando
opportunamente la funzione di transizione.
Le considerazioni che seguono vengono svolte assumendo che tutti gli stati
di /siano raggiungibili dallo stato iniziale, altrimenti sar`a necessario eettuare
un passo preliminare di eliminazione degli stati irraggiungibili.
Esercizio 3.22 Costruire un algoritmo che, dato un ASFD /, individui tutti gli stati
irraggiungibili dallo stato iniziale. Si noti che il miglior algoritmo per questo problema
richiede un numero di passi proporzionale a [ Q[ [ [.
Per marcare le coppie di stati distinguibili conviene utilizzare una tabella
contenente una casella per ciascuna coppia (non ordinata) di stati di Q. Le
caselle vengono usate per marcare le coppie di stati distinguibili e per elencare,
in una lista associata, tutte le coppie che dovranno essere marcate qualora la
coppia a cui `e associata la casella venga marcata.
La procedura inizia con la marcatura delle coppie distinguibili tramite la
stringa (tutte e sole le coppie costituite da uno stato nale e da uno non
nale). Quindi, per ogni coppia (p, q) non ancora marcata, si considerano, per
ogni a , tutte le coppie (r, s), con r = (p, ) e s = (q, a).
Se nessuna delle coppie (r, s) `e gi`a stata riconosciuta come coppia di stati
distinguibili allora si inserisce (p, q) nella lista associata ad ognuna di esse, ec-
cetto che nel caso in cui tale coppia risulti essere nuovamente (p, q). Altrimenti
p e q vengono riconosciuti distinguibili e la corrispondente casella viene mar-
cata; qualora questa contenga una lista di coppie si procede (ricorsivamente)
con la marcatura delle relative caselle.
In maniera pi` u formale possiamo considerare il seguente algoritmo di mar-
catura. Non `e dicile dimostrare che, per ogni coppia di stati p, q di Q, essi
sono distinguibili se e solo se, al termine dellesecuzione dellAlgoritmo 3.1, la
casella relativa alla coppia (p, q) risulta marcata: la dimostrazione `e lasciata
al lettore come esercizio (vedi Esercizio 3.23).
116 CAPITOLO 3. LINGUAGGI REGOLARI
input automa a stati niti / = , Q, , q
0
, F);
output coppie di stati distinguibili di Q;
begin
for p F and q QF do
marca (p, q) e (q, p);
for each coppia non marcata di stati distinti do
if a : ((p, a), (q, a)) distinguibili then
begin
marca (p, q);
marca ricorsivamente tutte le coppie non ancora marcate sulla lista
di (p, q) e su quelle delle coppie marcate a questo passo
end
else
for a do
if (p, a) ,= (q, a)and (p, q) ,= ((p, a), (q, a)) then
aggiungi (p, q) alla lista di ((p, a), (q, a))
end.
Algoritmo 3.1: Marca Stati Distinguibili
Esercizio 3.23 Dato un automa a stati niti deterministico / = , Q, , q
0
, F),
dimostrare che due stati p e q appartenenti a Q sono distinguibili se e solo se lAlgo-
ritmo 3.1 marca la casella relativa alla coppia (p, q).
[Suggerimento: Eettuare una induzione sulla lunghezza della minima stringa che
consente di distinguere i due stati distinguibili.]
Una volta identicate le coppie di stati indistinguibili, ricordando che la re-
lazione di indistinguibilit`a `e una relazione di equivalenza, lautoma equivalente
con il minimo numero di stati `e dato evidentemente da /

= , Q

, q

0
, F

),
in cui:
Q

`e costruito selezionando uno ed un solo stato di Q (rappresentante)


per ogni insieme di stati indistinguibili;
F

`e costituito da tutti i rappresentanti appartenenti ad F;


`e ottenuta da mediante restrizione al dominio Q

ed inoltre,
per ogni (q
i
, a) = q
j
, con q
i
Q

e q
j
Q, poniamo

(q
i
, a) = q
k
,
dove q
k
Q

`e il rappresentante dellinsieme di stati indistingubili che


include q
j
(chiaramente, se q
j
Q

allora `e esso stesso un rappresentante


e dunque q
k
= q
j
).
Esempio 3.22 Si consideri lautoma deterministico dato in Figura. 3.25 La proce-
dura di minimizzazione inizia con la costruzione di una tabella contenente una cella
per ciascuna coppia (non ordinata) di stati. Le celle vengono usate per marcare le
3.8. IL TEOREMA DI MYHILL-NERODE 117
q
0
q
1
q
2
q
3
q
4
q
5
q
6
a a
b
b
a
a
b
a
b
b
a
b
b
a
Figura 3.25 Automa a stati niti da minimizzare.
coppie di stati (q
i
, q
j
) tali che esiste una stringa x per cui (q
i
, x) F e (q
j
, x) , F, o
viceversa (q
i
e q
j
si dicono in tal caso distinguibili ). A tal ne si iniziano a marcare le
coppie (q
i
, q
j
) tali che q
i
F e q
j
, F o q
i
, F e q
j
F. In Figura 3.26 queste coppie
sono le 10 coppie per cui q
i
q
0
, q
1
e q
j
q
2
, q
3
, q
4
, q
5
, q
6
: le celle corrispondenti
vengono quindi marcate tramite una X, come mostrato in Figura 3.26. Lapplicazione
0 1 2 3 4 5
6
5
4
3
2
1
X X
X X
X X
X X
X X
Figura 3.26 Marcatura delle coppie di stati immediatamente distinguibili.
dellAlgoritmo 3.1 porta inizialmente a distinguere gli stati q
0
e q
1
, che sono nali, da
tutti gli altri: da ci`o risulta la situazione in Figura 3.26.
Osserviamo ora il comportamento dellalgoritmo assumendo che esso consideri le
coppie di stati scandendo le celle da sinistra verso destra e dallalto verso il basso.
La prima coppia (q
0
, q
1
) risulta distinguibile se lo `e la coppia (q
2
, q
5
), in quanto
118 CAPITOLO 3. LINGUAGGI REGOLARI
(q
0
, b) = q
2
e (q
1
, b) = q
5
: quindi, lelemento (0, 1) viene inserito nella lista associata
alla cella (2, 5).
La coppia successiva, (q
2
, q
3
), risulta distinguibile in quanto (q
2
, a) = q
4
,
(q
3
, a) = q
0
, e la coppia (q
0
, q
4
) `e distinguibile, come si pu`o vericare osservando
che la cella (0, 4) `e marcata: ne deriva che lalgoritmo marca anche la cella (2, 3).
Proseguendo, lalgoritmo determina che:
- la coppia (q
2
, q
4
) `e distinguibile se lo `e la coppia (q
3
, q
6
): (2, 4) `e inserito nella
lista della cella (3, 6);
- la coppia (q
3
, q
4
) `e distinguibile: la cella viene marcata;
- la coppia (q
2
, q
5
) `e distinguibile se lo sono le coppie (q
2
, q
4
) e (q
3
, q
6
): (2, 5) `e
inserito nelle liste delle celle (2, 4) e (3, 6);
- la coppia (q
3
, q
5
) `e distinguibile: la cella viene marcata;
- la coppia (q
4
, q
5
) non `e distinguibile;
- la coppia (q
2
, q
6
) `e distinguibile: la cella non viene marcata;
- la coppia (q
3
, q
6
) `e distinguibile se lo `e la coppia (q
0
, q
1
): (3, 6) `e inserito nella
lista della cella (0, 1);
- la coppia (q
4
, q
6
) `e distinguibile: la cella viene marcata;
- la coppia (q
5
, q
6
) `e distinguibile: la cella viene marcata;
Al termine della sua esecuzione, lalgoritmo fornisce la tabella nale in Figura 3.27, la
quale ci dice che le coppie di stati (q
0
, q
1
), (q
2
, q
4
), (q
2
, q
5
), (q
4
, q
5
), (q
3
, q
6
) non sono
distinguibili: ne deriva che linsieme degli stati dellautoma `e partizionato nelle 3
classi di equivalenza q
0
, q
1
, q
2
, q
4
, q
5
e q
3
, q
6
. Lautoma equivalente col minimo
numero di stati risultante dal procedimento `e quindi mostrato in Figura 3.28, in cui
lo stato q
0
corrisponde alla classe dequivalenza q
0
, q
1
, lo stato q
1
corrisponde alla
classe q
3
, q
6
e lo stato q
3
, inne, corrisponde alla classe q
2
, q
4
, q
5
.
3.8. IL TEOREMA DI MYHILL-NERODE 119
0 1 2 3 4 5
6
5
4
3
2
1
X X X X X
X X X
X X X
X X X
X X
(3,6)
(2,5)
(0,1)
(2,4)
(2,5)
Figura 3.27 Tabella di tutte le coppie di stati distinguibili.
q
0
q
1
q
2
a
b
a
b b
a
Figura 3.28 Automa minimo equivalente allautoma di Figura 3.25.
120 CAPITOLO 3. LINGUAGGI REGOLARI
Capitolo 4
Linguaggi non contestuali
I linguaggi non contestuali (o context free, o di tipo 2) sono particolarmente
interessanti per vari motivi. Innanzi tutto, da un punto di vista storico, `e
interessante notare che le grammatiche context free sono state introdotte dal
linguista Noam Chomsky come un primo strumento per denire le strutture
sintattiche del linguaggio naturale.
Un classico esempio di struttura di questo tipo `e quella che caratterizza
molte frasi del linguaggio naturale, come la sequenza di un sostantivo e di
un predicato, in cui un predicato pu`o essere un verbo o un verbo seguito da
un complemento oggetto; questa struttura grammaticale si pu`o rappresentare,
mediante le notazioni viste, per mezzo della grammatica
F SP
P V [ V C.
Anche se le grammatiche di Chomsky si sono rivelate inadeguate allo stu-
dio del linguaggio naturale, luso di modelli del tipo delle grammatiche non
contestuali rimane uno strumento concettuale utile per descrivere strutture
linguistiche sucientemente semplici.
Daltra parte, lapplicazione delle grammatiche di Chomsky ai linguaggi
di programmazione ha dato risultati molto pi` u validi, consentendo alle gram-
matiche non contestuali di assumere un ruolo fondamentale in quellambito.
Uno dei principali strumenti per la descrizione formale dei linguaggi di pro-
grammazione, la Forma di Backus (BNF), `e nientaltro che un formalismo per
denotare una grammatica di tipo 2 (vedi Sezione 2.4). Anche i diagrammi sin-
tattici, nonostante per alcuni aspetti appaiano simili ad automi a stati, sono
in eetti riconducibili a strutture grammaticali di tipo non contestuale (vedi
Sezione 2.4).
Luso cos` estensivo di tale classe di linguaggi `e essenzialmente dovuto al
fatto che, come vedremo, i linguaggi non contestuali hanno alcune propriet`a
122 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
di riconoscibilit`a particolarmente semplici. In particolare, i linguaggi gene-
ralmente usati nella programmazione dei calcolatori sono sostanzialmente un
sottoinsieme proprio dei linguaggi non contestuali, e sono accettabili in tempo
lineare con dispositivi piuttosto elementari, che utilizzano una memoria ge-
stita come una pila. Questa condizione `e utile perche, nel caso dei linguaggi
di programmazione, lanalisi sintattica (o, con termine inglese, il parsing) di
un programma e la sua traduzione in un linguaggio pi` u elementare richiedo-
no che, oltre a decidere se una stringa appartiene al linguaggio, venga anche,
in caso positivo, determinato come la stringa stessa sia derivata nella corri-
spondente grammatica. Infatti, la conoscenza della struttura della derivazione
di un programma in un linguaggio ad alto livello `e necessaria per eettuare
correttamente la sua traduzione in linguaggio macchina.
Tra le caratteristiche pi` u interessanti dei linguaggi di tipo 2 c`e la pos-
sibilit`a di associare le derivazioni a strutture ad albero, note come alberi di
derivazione, o alberi sintattici .
Esempio 4.1 Data la grammatica ( avente le produzioni
S aSbA [ ab
A cAd [ cd
la stringa aaabbcdbcd L(() pu`o essere cos` derivata:
S=aSbA=aaSbAbA=aaabbAbA=aaabbcdbA=aaabbcdbcd.
Questo processo di derivazione pu`o essere utilmente rappresentato dallalbero dato
in Figura 4.1 Si noti che usando tale rappresentazione non si determina univocamente
S
a
S b A
a
S b A
c
d
b
a
d
c
Figura 4.1 Esempio di albero di derivazione di una stringa.
un ordine con cui le produzioni debbono essere applicate. Al tempo stesso, lalbero di
derivazione fornisce la descrizione pi` u sintetica della struttura sintattica della stringa.
4.1. FORME RIDOTTE E FORME NORMALI 123
4.1 Forme ridotte e forme normali
Come si `e detto precedentemente, le grammatiche di tipo 2 ammettono pro-
duzioni del tipo A , ove `e unarbitraria stringa di terminali e non
terminali. Al ne di studiare alcune propriet`a dei linguaggi generati da que-
ste grammatiche, `e utile considerare grammatiche ristrette, comprendenti
soltanto produzioni con struttura particolare.
`
E importante, quindi, dimo-
strare preliminarmente che i linguaggi non contestuali possono essere generati
mediante tali tipi di grammatiche.
Prima di poter mostrare quali forme ristrette possono assumere le gram-
matiche per i linguaggi non contestuali, `e necessario introdurre le grammatiche
non contestuali in forma ridotta.
Denizione 4.1 Una grammatica ( `e in forma ridotta se
1. non contiene -produzioni (se non, eventualmente, in corrispondenza al-
lassioma, ed in tal caso lassioma non compare mai al lato destro di una
produzione),
2. non contiene produzioni unitarie, cio`e produzioni del tipo
A B, con A, B V
N
,
3. non contiene simboli inutili, cio`e simboli che non compaiono in nessuna
derivazione di una stringa di soli terminali.
La trasformazione di una grammatica ( = V
T
, V
N
, P, S) di tipo 2 in una
grammatica equivalente in forma ridotta pu`o essere eettuata nel modo
seguente.
1. A partire da (, si costruisce una grammatica (
1
di tipo 2 senza
-produzioni che genera L(() .
2. A partire da (
1
si costruisce una grammatica (
2
di tipo 2 senza
-produzioni e senza produzioni unitarie che genera L((
1
).
3. A partire da (
2
si costruisce una grammatica (
3
di tipo 2 senza -
produzioni, senza produzioni unitarie e senza simboli inutili che genera
L((
2
).
4. La grammatica (
4
, di tipo 2, equivalente a ( coincide con (
3
se , L(();
altrimenti, (
4
`e ottenuta da (
3
introducendo un nuovo assioma ed un
opportuno insieme di produzioni su tale simbolo.
Abbiamo gi`a visto nella Sezione 2.2 che, per eettuare il passo 1, si possono
applicare gli Algoritmi 2.1 e 2.2 presentati nella dimostrazione del Teorema 2.2.
Per quanto riguarda il passo 2, consideriamo il seguente teorema.
124 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Teorema 4.1 Per ogni grammatica ( di tipo 2 senza -produzioni, esiste
sempre una grammatica (

di tipo 2 senza -produzioni, priva di produzioni


unitarie ed equivalente a (.
Dimostrazione. Sia, per ogni A V
N
, U(A), il sottoinsieme di V
N
A
comprendente tutti i non terminali derivabili da A applicando una sequenza
di produzioni unitarie, ovvero U(A) = B V
N
A [ A

=B. Conside-
riamo lAlgoritmo 4.1 che, data la grammatica ( = V
T
, V
N
, P, S), opera nella
maniera seguente. Lalgoritmo costruisce linsieme P

delle produzioni di (

inserendo dapprima in P

tutte le produzioni non unitarie in P. Quindi, per


ogni non terminale A e per ogni B U(A), inserisce in P

una produzione
A se e solo se esiste in P una produzione non unitaria B .
input Grammatica non contestuale ( = V
T
, V
N
, P, S) priva di -produzioni;
output Grammatica non contestuale (

= V
T
, V
N
, P

, S) priva di -produzioni e
di produzioni unitarie equivalente a (;
begin
P

:= A P [ , V
N
;
for each A V
N
do
P

:= P

A [ (B P) (B U(A)) ( , V
N
)
end.
Algoritmo 4.1: Elimina Produzioni Unitarie
Per costruzione P

non contiene produzioni unitarie ed `e inoltre facile


provare che ogni stringa derivabile in ( `e anche derivabile in (

e viceversa. 2
Esercizio 4.1 Costruire un algoritmo che, data una grammatica ( di tipo 2 senza
-produzioni e dato un non terminale A della grammatica, determini linsieme U(A).
Per quanto riguarda il passo 3, la possibilit`a di eliminare i simboli inutili
`e assicurata dal seguente teorema.
Teorema 4.2 Per ogni grammatica ( = V
T
, V
N
, P, S) di tipo 2 senza -
produzioni e senza produzioni unitarie, esiste sempre una grammatica (

di
tipo 2 senza -produzioni, priva di produzioni unitarie e di simboli inutili ed
equivalente a (.
Dimostrazione. Osserviamo che, anche un simbolo A V
N
non sia
inutile, `e necessario che nella grammatica ( si abbia che:
- A sia un simbolo fecondo, vale a dire che da esso siano generabili stringhe
di terminali, cio`e w V
+
T
tale che A

=w;
4.1. FORME RIDOTTE E FORME NORMALI 125
- A sia generabile dallassioma in produzioni che non contengano simboli
non fecondi, cio`e S

=A con , (V
T
V
N
)

e, per ogni B V
N
in
o , valga la propriet`a precedente.
Equivalentemente, un simbolo A V
N
non `e inutile se esiste una derivazione
S

= A

= w V
+
T
.
Per eliminare i simboli non fecondi, basta osservare che un non terminale
A `e fecondo se e solo se vale una delle due condizioni seguenti:
1. esiste w V
+
T
tale che A w P;
2. esiste (V
N
V
T
)

tale che A P e tutti i simboli non terminali


in sono fecondi.
LAlgoritmo 4.2 applica questa propriet`a per eliminare dalla grammatica tutti
i non terminali non fecondi, nonche tutte le produzioni che li generano, otte-
nendo cos` una grammatica ridotta

( =
_
V
T
,

V
N
,

P, S
_
priva di -produzioni,
di produzioni unitarie ed equivalente a (, contenente tutti non terminali da
cui `e possibile derivare delle stringhe di soli terminali.
`
E facile convincersi
che, in realt`a, lAlgoritmo 4.2 elimina i simboli non fecondi anche se ( con-
tiene produzioni unitarie.
`
E necessario a questo punto vericare che i simboli
input Grammatica non contestuale ( = V
T
, V
N
, P, S), priva di -produzioni
e di produzioni unitarie;
output Grammatica non contestuale

( =
_
V
T
,

V
N
,

P, S
_
priva di -produzioni,
di produzioni unitarie e di simboli non fecondi, equivalente a (;
begin
Q := V
T
;
R := V
N
;

V
N
:= ;
while A R per cui esiste A P, con Q

do
begin

V
N
:=

V
N
A;
Q := Q A;
R := R A
end;

P := A [ A P, A

V
N
, Q

end.
Algoritmo 4.2: Algoritmo per leliminazione dei non terminali non fecondi
rimasti siano generabili a partire dallassioma. Ci`o pu`o essere eettuato sem-
plicemente, in modo iterativo, osservando che A `e generabile a partire da S se
vale una delle due condizioni seguenti:
126 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
1. esistono , (

V
N
V
T
)

tali che S A

P;
2. esistono , (

V
N
V
T
)

e B

V
N
, generabile a partire da S, tali che
B A

P.
LAlgoritmo 4.3 applica questa propriet`a per eliminare dalla grammatica tutti
i non terminali non generabili dallassioma. Dal fatto che lapplicazione dei
input Grammatica non contestuale

( =
_
V
T
,

V
N
,

P, S
_
priva di -produzioni,
di produzioni unitarie e di simboli non fecondi;
output Grammatica non contestuale (

= V
T
, V

N
, P

, S) priva di -produzioni,
di produzioni unitarie, di simboli non fecondi, di simboli non generabili da S,
equivalente a

(;
begin
Q :=

V
N
S;
for each A

V
N
Q do
for each (V
T


V
N
)

tale che A

P do
for each B Q che appare in do
Q := QB;
V

N
:=

V
N
Q;
P

:= A [ A

P, A V

N
, (V

N
V
T
)

end.
Algoritmo 4.3: Algoritmo per leliminazione dei non terminali non generabili
due algoritmi elimina tutti e soli i simboli inutili deriva immediatamente che
nellambito di (

vengono generate tutte le stringhe di terminali generabili in


(. 2
Inne, per quanto riguarda il passo 4, ricordiamo (vedi Sezione 2.2) che, in
generale, una grammatica ( = V
T
, V
N
, P, S) pu`o essere estesa in una gram-
matica (

= V
T
, V

N
, P

, S

) che generi anche la stringa vuota nel modo


seguente:
1. V

N
= V
N
T, dove T , V
N
;
2. P

= P T T [ S P;
3. S

= T.
Esercizio 4.2 Dimostrare che la grammatica (

genera il linguaggio L(() .


A conclusione delle considerazioni precedenti, e dei Teoremi 2.2, 4.1 e 4.2,
possiamo enunciare il seguente risultato.
4.1. FORME RIDOTTE E FORME NORMALI 127
Teorema 4.3 Per ogni grammatica ( = V
T
, V
N
, P, S) di tipo 2 esiste una
grammatica (

di tipo 2 in forma ridotta, equivalente a (.


Si osservi che, al ne di eliminare i simboli inutili (non fecondi e non generabili
da S) `e necessario applicare i due algoritmi nellordine dato: eliminare prima i
simboli non generabili e poi quelli non fecondi pu`o far s` che non tutti i simboli
inutili vengano rimossi dalla grammatica. Infatti, si consideri la seguente
grammatica
S AB [ a
A a.
Se procedessimo prima alleliminazione dei simboli non derivabili dallas-
sioma e poi alleliminazione di quelli non fecondi, otterremmo le seguenti
grammatiche:
S AB [ a
A a
e successivamente
S a
A a.
che non `e in forma ridotta. Se invece si procede come indicato nel teorema
si ottengono le due grammatiche
S a
A a
e successivamente S a.
Esempio 4.2 Sia data la grammatica
1 S aUV b [ TZ
2 Z aZ
3 U bU [ b
4 V W
5 V aY
6 Y bY [ b
7 W cWd [ cd
8 T tT [ tz.
Leliminazione delle produzioni unitarie porta ad escludere la produzione 4 e ad
aggiungere una terza produzione alla 1. Leliminazione di simboli non fecondi porta
ad escludere la produzione 2 e la seconda produzione della 1. Leliminazione dei
simboli non raggiungibili porta inne ad escludere la produzione 8.
Si ottiene quindi la grammatica
S aUV b [ aUWb
U bU [ b
V aY
Y bY [ b
W cWd [ cd.
128 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Esercizio 4.3 Data la seguente grammatica:
S H [ Z
H A [
Z bZb
A bbABa [ a
B cB [ BZY [
Y Y b [ b.
Trasformarla in una grammatica equivalente in forma ridotta.
Mostriamo ora come per qualunque grammatica non contestuale ne esista
unaltra equivalente con una struttura delle produzioni particolarmente sem-
plice. Considereremo due possibili strutture delle produzioni, che danno luogo
a due forme normali per le grammatiche context free e che sono entrambe
semplici generalizzazioni delle produzioni di una grammatica regolare: la pri-
ma consiste in produzioni che generano o un solo terminale o una coppia di
non terminali, la seconda in produzioni che generano un terminale seguito da
una sequenza (eventualmente vuota) di non terminali.
Denizione 4.2 Una grammatica di tipo 2 si dice in Forma Normale di
Chomsky (CNF) se tutte le sue produzioni sono del tipo A BC o del
tipo A a, con A, B, C V
N
ed a V
T
.
Teorema 4.4 Data una grammatica ( non contestuale tale che , L(G),
esiste una grammatica equivalente in CNF.
Dimostrazione. Costruiamo innanzi tutto una grammatica (

in forma ri-
dotta equivalente a (, come indicato nel Teorema 4.3: si ricordi in particolare
che in (

non abbiamo produzioni unitarie.


Mostriamo ora come derivare da (

una grammatica equivalente (

in CNF.
Sia A
i
1
. . .
in
una produzione di (

non in CNF. Si possono vericare


due casi:
1. n 3 e
i
j
V
N
, j = 1, . . . , n. In tal caso, introduciamo n 2 nuovi
simboli non terminali Z
1
, . . . , Z
n2
e sostituiamo la produzione A

i
1
. . .
i
n
con le produzioni
A
i
1
Z
1
Z
1

i
2
Z
2
. . .
Z
n2

i
n1

i
n
.
2. n 2 e
i
j
V
T
per qualche j 1, . . . , n. In tal caso per ciascun

i
j
V
T
introduciamo un nuovo non terminale Z
i
j
, sostituiamo Z
i
j
a
i
j
4.1. FORME RIDOTTE E FORME NORMALI 129
nella produzione considerata e aggiungiamo la produzione Z
i
j

i
j
.
Cos` facendo o abbiamo messo in CNF la produzione considerata (se
n = 2) o ci siamo ricondotti al caso precedente (se n 3).
2
Esercizio 4.4 Mostrare che le grammatiche (

e (

nella dimostrazione del


Teorema 4.4 sono equivalenti.
Come si pu`o vedere, la minore complessit`a nella struttura delle produzioni,
caratteristica della Forma Normale di Chomsky, viene pagata in generale, in
termini quantitativi, dalla necessit`a di utilizzare una maggiore quantit`a di
simboli non terminali e di produzioni per descrivere lo stesso linguaggio.
Esempio 4.3 Si consideri la grammatica di tipo 2 che genera il linguaggio a
n
b
n
[
n 1 con le produzioni
S aSb
S ab
Applicando il metodo visto nella dimostrazione del Teorema 4.4 e osservando che la
grammatica `e gi`a in forma ridotta, otteniamo una nuova grammatica avente i non
terminali S, Z
1
, Z
1
, Z
2
, Z
3
e Z
4
, e linsieme di produzioni
S Z
1
Z
1
Z
1
SZ
2
S Z
3
Z
4
Z
1
a
Z
2
b
Z
3
a
Z
4
b
Esercizio 4.5 Data una grammatica ( = V
T
, V
N
, P, S) con al pi` u k simboli nella
parte destra di ogni produzione, determinare la massima cardinalit`a possibile degli
insiemi V

N
e P

della corrispondente grammatica in CNF.


Il secondo tipo di forma normale che consideriamo risulta particolarmente
interessante in quanto, oltre a permettere di caratterizzare i linguaggi context
free in termini di accettabilit`a per mezzo di un opportuno modello di calcolo
(gli Automi a pila non deterministici , che saranno introdotti nella Sezione 4.5)
fornisce una struttura delle produzioni che `e alla base di varie tecniche di
analisi sintattica dei linguaggi non contestuali.
Denizione 4.3 Una grammatica di tipo 2 si dice in Forma Normale di Grei-
bach (GNF) se tutte le sue produzioni sono del tipo A a, con A V
N
,
a V
T
, V

N
.
130 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Si noti come anche una grammatica in GNF abbia produzioni con una
struttura che `e una generalizzazione della struttura delle produzioni di una
grammatica regolare (nel qual caso [ [ 1 per tutte le produzioni).
Al ne di mostrare che ogni grammatica di tipo 2 pu`o essere trasformata
in una grammatica equivalente in GNF, osserviamo innanzi tutto le seguenti
propriet`a.
Denizione 4.4 Sia data una grammatica non contestuale ( = V
T
, V
N
, P, S)
e sia A V
N
. Deniamo come A-produzioni tutte le produzioni in P del tipo
A , con (V
N
V
T
)

.
Lemma 4.5 (Sostituzione) Sia ( una grammatica di tipo 2 le cui produ-
zioni includono
A
1
B
2
B
1
[ . . . [
n
,
(
1
,
2
V

) e in cui non compaiono altre B-produzioni oltre a quelle indicate.


La grammatica (

in cui la produzione A
1
B
2
`e stata sostituita dalla
produzione
A
1

2
[ . . . [
1

2
`e equivalente alla grammatica (.
Dimostrazione. Ogni derivazione in (

comprendente il passo

1
A
2
=
G

2
pu`o essere sostituita da una derivazione in ( contenente i due passi

1
A
2
=
G

1
B
2

2
=
G

2
.
Al contrario, si osservi che ogni derivazione in ( che applica la produzione
A
1
B
2
deve anche applicare, successivamente, una delle produzioni
B
1
[ . . . [
n
, e quindi dovr`a essere del tipo:
S =
G
=
G

1
A
2
=
G
=
G

1
B
2

2
=
G

=
G

2
=
G
=
G
w V

T
.
Chiaramente, riordinando la sequenza di applicazioni delle produzioni nella
derivazione, possiamo osservare che la stessa stringa w pu`o essere derivata nel
modo seguente:
S=
G
=
G

1
A
2
=
G

1
B
2

2
=
G

2
=
G
=
G
w V

T
.
4.1. FORME RIDOTTE E FORME NORMALI 131
A tale derivazione corrisponder`a, in (

, la derivazione
S=
G

=
G


1
A
2
=
G

2
=
G

w V

T
.
2
Denizione 4.5 Data una grammatica ( = V
T
, V
N
, P, S) di tipo 2 e dato un
non terminale A V
N
, diciamo che in ( esiste una ricursione sinistra rispetto
al non terminale A se esiste una produzione A A, con (V
N
V
T
)

.
Lemma 4.6 (Eliminazione della ricursione sinistra) Sia ( una gram-
matica con ricursione sinistra sul non terminale A e sia
A A
1
[ . . . [ A
m
[
1
[ . . . [
n
,
linsieme dell A-produzioni in (, dove nessuna delle stringhe
i
inizia per
A. La grammatica (

in cui le A-produzioni in ( sono state sostituite dalle


produzioni:
A
1
A

[ . . . [
n
A

[
1
. . . [
n
A


1
A

[ . . . [
m
A

[
1
. . . [
m
`e equivalente a ( e non presenta ricursione sinistra rispetto al non terminale
A.
Dimostrazione. Basta osservare che tutte le stringhe derivabili in ( a par-
tire da A sono del tipo del tipo (
1
+. . . +
n
)(
1
+. . . +
m
)

: `e immediato
vericare che lo stesso `e vero in (

. 2
A questo punto, possiamo mostrare come per ogni grammatica non contestuale
ne esista una equivalente in GNF.
Teorema 4.7 Ogni linguaggio non contestuale L tale che , L pu`o essere
generato da una grammatica di tipo 2 in GNF.
Dimostrazione. La dimostrazione si basa sulla derivazione, a partire da una
grammatica ( in CNF che genera L (ottenuta in base al Teorema 4.4), di una
grammatica equivalente (

in GNF. Tale derivazione `e eettuata mediante una


ripetuta esecuzione dei due passi fondamentali, sostituzione ed eliminazione
della ricursione sinistra, di cui si `e vista la struttura e dimostrata la correttezza
nei due lemmi precedenti. La derivazione di (

avviene applicando lAlgorit-


mo 4.4. Non `e dicile vericare che la grammatica (

ottenuta `e in GNF ed
`e equivalente a (. 2
132 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
input Grammatica non contestuale ( in CNF;
output Grammatica non contestuale (

in GNF;
begin
Sia A
1
, . . . , A
n
un ordinamento arbitrario tra i non terminali di (;
for k := 2 to n do
begin
for j := 1 to k 1 do
Applica il Lemma 4.5 ad ogni produzione del tipo A
k
A
j
;
Applica il Lemma 4.6 ad ogni produzione del tipo A
k
A
k

end;
// Siano B
1
. . . , B
l
i non terminali aggiunti;
// A questo punto le produzioni sono tutte di uno tra i tipi:
// (a) A
k
A
j
, con j > k, (V
N
B
1
, . . . , B
l
)

;
// (b) A
k
a, con a V
T
, (V
N
B
1
, . . . , B
l
)

;
// (c) B
k
, con V
N
(V
N
B
1
, . . . , B
l
)

.
// Inoltre, se k = n le A
k
-produzioni sono tutte del tipo (b),
// e se k = mh sono del tipo (b) o del tipo (a), con k < j n.
for h := n 1 down to 1 do
for j := n down to h do
Applica il Lemma 4.5 ad ogni produzione del tipo A
h
A
j
;
// A questo punto le produzioni sono tutte del tipo (b) o (c).
for i := 1 to l do
for j := 1 to m do
Applica il Lemma 4.5 ad ogni produzione del tipo B
i
A
j
;
end.
Algoritmo 4.4: Algoritmo per la riduzione in Forma Normale di Greibach
Esercizio 4.6 Mostrare che le grammatiche ( e (

nella dimostrazione del Teorema 4.7


sono equivalenti.
[Suggerimento: Mostrare che ogni applicazione dei Lemmi 4.5 e 4.6 non altera il
linguaggio generato.]
Esempio 4.4 Data una grammatica avente le produzioni
S AB [ b
A b [ BS
B a [ BA [ AS,
il procedimento illustrato nella dimostrazione del Teorema 4.7 costruisce una gram-
matica equivalente in GNF nel modo seguente (si noti che la grammatica iniziale `e
gi`a in CNF).
1. Consideriamo, in modo arbitrario, il seguente ordinamento fra i non terminali:
S, A, B.
4.1. FORME RIDOTTE E FORME NORMALI 133
2. Sostituiamo alla produzione B AS la coppia di produzioni B bS [ BSS,
ottenendo le B-produzioni:
B a [ bS
B BA [ BSS.
A questo punto non vi sono pi` u produzioni del tipo A
k
A
j
con j < k, e
quindi non sono applicabili altre sostituzioni.
3. Interveniamo quindi per eliminare la ricursione sinistra nelle B-produzioni. In
base al Lemma 4.6 le produzioni suddette sono equivalenti alle
B a [ bS [ aB

[ bSB

A [ SS [ AB

[ SSB

.
4. Eettuiamo ora le sostituzioni nelle produzioni del tipo A
k
A
j
con k < j.
Alla produzione A BS sostituiamo le produzioni
A aS [ bSS [ aB

S [ bSB

S
ed alla produzione S AB sostituiamo le produzioni
S aSB [ bSSB [ aB

SB [ bSB

SB [ bB.
5. Alle produzioni B

A [ SS [ AB

[ SSB

sostituiamo ora le produzioni


B

aS [ bSS [ aB

S [ bSB

S [ b [
aSBS [ bSSBS [ aB

SBS [ bSB

SBS [ bSB [ bS [
aSB

[ bSSB

[ aB

SB

[ bSB

SB

[ bB

[
aSBSB

[ bSSBSB

[ aB

SBSB

[ bSB

SBSB

[ bBSB

[ bSB

.
Si `e giunti, in conclusione, alla seguente grammatica in GNF:
S aSB [ bSSB [ aB

SB [ bSB

SB [ bB [ b
B a [ bS [ aB [ bSB

aS [ bSS [ aB

S [ bSB

S [ b
asBS [ bSSBS [ aB

SBS [ bSB

SBS [ bSB [ bS [
aSB

[ bSSB

[ aB

SB

[ bSB

SB

[ bB

[
aSBSB

[ bSSBSB

[ aB

SBSB

[ bSB

SBSB

[ bBSB

[ bSB

.
Si noti che sono state omesse le A produzioni, in quanto tale non terminale non `e pi` u
derivabile a partire da S.
Esercizio 4.7 Sia data la seguente grammatica:
S AbA [ b
A SaS [ a.
Derivare una grammatica in GNF equivalente ad essa.
134 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Esercizio 4.8 Utilizzando il procedimento sopra illustrato, mostrare che una gram-
matica lineare sinistra genera un linguaggio regolare.
4.2 Il pumping lemma per i linguaggi context free
Cos` come per i linguaggi regolari, `e possibile mostrare come anche i linguaggi
non contestuali presentino delle regolarit`a, nel senso che lappartenza di
una stringa sucientemente lunga ad un linguaggio CF implica lappartenenza
allo stesso linguaggio di un insieme (innito) di altre stringhe strutturalmente
simili ad essa.
Teorema 4.8 (Pumping lemma per i linguaggi CF) Sia L V

T
un
linguaggio non contestuale. Esiste allora una costante n tale che se z L
e [ z [ n allora esistono 5 stringhe u, v, w, x, y V

T
tali che
i) uvwxy = z
ii) [ vx [ 1
iii) [ vwx [ n
iv) i 0 uv
i
wx
i
y L.
Dimostrazione. Consideriamo una grammatica ( = V
T
, V
N
, P, S) in CNF
che genera L = L(() e sia k =[ V
N
[ il numero di simboli non terminali in (.
Si osservi che qualunque albero sintattico A(x) relativo ad una stringa x V

T
derivata in ( sar`a tale da avere tutti i nodi interni (corrispondenti a simboli
non terminali) di grado 2, eccetto quelli aventi foglie dellalbero come gli, che
hanno grado 1.
`
E allora facile vericare che, se h(x) `e laltezza di A(x) (numero massimo
di archi in un cammino dalla radice ad una foglia), abbiamo [ x [ 2
h(x)
: in
conseguenza di ci`o, se [ x[> 2
|V
N
|
allora h(x) >[ V
N
[ e, quindi, deve esistere un
cammino dalla radice ad una foglia che attraversa almeno [ V
N
[ +1 nodi interni.
Per il pigeonhole principle, (almeno) due di questi nodi saranno associati ad
uno stesso non terminale, ad esempio A. Indichiamo con r il nodo pi` u vicino
alla radice associato al simbolo A, e con s il nodo associato ad A pi` u vicino
alla foglia (vedi Figura 4.2).
Come si pu`o osservare, dalle due occorrenze di A in r ed s derivano stringhe
diverse (indicate come vwx e w, rispettivamente), di cui, in particolare, luna
occorre come sottostringa nellaltra. Si osservi anche che, avendo almeno un
nodo sul cammino da r ad s grado 2, ne segue che [ vx[ 1. Considerando che
gli alberi in Figura 4.3 possono essere sostituiti luno allaltro allinterno di un
qualunque albero sintattico, abbiamo che anche la stringa uwy `e generata dalla
grammatica (sostituendo nellalbero di Figura 4.2 allalbero di Figura 4.3(b)
4.2. IL PUMPING LEMMA PER I LINGUAGGI CF 135
u v w x y
A
A
s
r
S
Figura 4.2 Non terminale ripetuto due volte in un ramo.
quello di Figura 4.3(a)), cos` come anche la stringa uvvwxxy (sostituendo
nellalbero di Figura 4.2 allalbero di Figura 4.3(a) quello di Figura 4.3(b)): si
noti che, iterando questo tipo di sostituzione, si pu`o mostrare che qualunque
stringa uv
i
wx
i
y appartiene al linguaggio. 2
w u w x
A
A
A
(a) (b)
Figura 4.3 (a) sottoalbero che genera w.
(b) sottoalbero che genera vwx.
Come nel caso dei linguaggi regolari, il pumping lemma `e una condizione
necessaria ma non suciente anche un linguaggio appartenga alla classe, e
quindi, in questo caso, sia non contestuale.
1
Ci`o signica che possono esistere
1
Esiste in eetti un risultato, detto Lemma di Ogden, che in questa sede non viene
riportato e che costituisce una condizione necessaria e suciente anche un linguaggio sia
136 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
linguaggi non di tipo 2 che tuttavia soddisfano le condizioni poste dal lemma.
In eetti, il pumping lemma viene normalmente applicato in senso
negativo, per dimostrare che un determinato linguaggio non `e di tipo 2.
Esempio 4.5 Il linguaggio a
n
b
n
c
n
[ n 1 non `e di tipo 2.
Per mostrare che il linguaggio non `e di tipo 2, verichiamo che esso non soddisfa
il pumping lemma. Mostriamo quindi che per ogni valore di n esiste una strina z,
con [ z [= n, che non `e decomponibile nelle 5 stringhe u, v, w, x, y aventi le propriet`a
richieste dal lemma.
Sia z = a
n
b
n
c
n
= uvwxy. Allora se v ed x contengono almeno due diversi simboli,
la stringa uv
2
wx
2
y conterr`a simboli mescolati. Se viceversa v ed x contengono un solo
simbolo, uv
2
wx
2
y non ha pi` u la propriet`a che le stringhe del linguaggio contengono
un ugual numero di a, di b e di c.
Esercizio 4.9 Usando il Pumping Lemma dimostrare che i seguenti linguaggi non
sono context free:
a
n
b
m
c
p
[ 1 n m p
a
2
n
[ n 1
a
i
b
j
c
i
d
j
[ i, j 1
ww [ w 0, 1
+

4.3 Chiusura di operazioni su linguaggi context free


Il fatto che il linguaggio a
n
b
n
c
n
[ n 1 non sia context free, visto nellEsem-
pio 4.5, ha alcune conseguenze molto interessanti che riguardano le propriet`a
di chiusura dei linguaggi non contestuali.
Corollario 4.9 I linguaggi non contestuali non sono chiusi rispetto allinter-
sezione.
Dimostrazione. Sia a
n
b
n
c
m
[ n, m 1 che a
m
b
n
c
n
[ n, m 1 sono non
contestuali, ma la loro intersezione, che coincide appunto con il linguaggio
a
n
b
n
c
n
[ n 1 non lo `e. 2
Questultimo risultato ci permette di osservare subito unimportante dieren-
za tra i linguaggi regolari ed i non contestuali. Non essendo questi ultimi
chiusi rispetto allintersezione, la tecnica con cui, nella dimostrazione del Teo-
rema 3.17, abbiamo mostrato che si pu`o decidere lequivalenza di due linguaggi
non contestuale.
4.3. CHIUSURA DI OPERAZIONI SU LINGUAGGI CF 137
regolari non `e estendibile ai linguaggi non contestuali. In eetti, come vedre-
mo successivamente, lequivalenza di linguaggi non contestuali, cos` come altre
propriet`a dei linguaggi stessi, come ad esempio lambiguit`a, non `e decidibile.
Mostriamo qui di seguito alcune operazioni rispetto alle quali la classe dei
linguaggi non contestuali possiede invece la propriet`a di chiusura.
Teorema 4.10 I linguaggi non contestuali sono chiusi rispetto allunione.
Dimostrazione. Dati due linguaggi context free L
1

1
e L
2

2
, siano
(
1
=
1
, V
N1
, P
1
, S
1
) e (
2
=
2
, V
N2
, P
2
, S
2
) due grammatiche di tipo 2 tali
che L
1
= L((
1
) e L
2
= L((
2
).
Mostriamo ora che il linguaggio L = L
1
L
2
potr`a allora essere generato
dalla grammatica di tipo 2 ( =
1

2
, V
N1
V
N2
S, P, S), dove P =
P
1
P
2
S S
1
[ S
2
.
Chiaramente, ogni stringa in w L
1
derivabile in (
1
mediante una deriva-
zione S
1

=w sar`a derivabile in ( mediante la derivazione S =S


1

=w ot-
tenuta dalla precedente anteponendo lapplicazione della produzione S S
1
,
e lo stesso avverr`a per qualunque stringa v L
2
: da ci`o segue che L
1
L
2

L(().
Al contrario, qualunque stringa x ( sar`a derivata mediante una deriva-
zione del tipo S = S
1

= x o del tipo S = S
2

= x, in quanto le sole
produzioni con lassioma S nella parte sinistra sono S S
1
e S S
2
:
nel primo caso la stringa `e derivabile in (
1
e nel secondo `e derivabile in (
2
, e
quindi si ha che L(() L
1
L
2
, dal che consegue il teorema. 2
Teorema 4.11 I linguaggi non contestuali sono chiusi rispetto alla concate-
nazione.
Dimostrazione. Dati due linguaggi context free L
1

1
e L
2

2
, siano
(
1
=
1
, V
N1
, P
1
, S
1
) e (
2
=
2
, V
N2
, P
2
, S
2
) due grammatiche di tipo 2 tali
che L
1
= L((
1
) e L
2
= L((
2
).
Mostriamo che il linguaggio L = L
1
L
2
`e generato dalla grammatica di tipo
2 denita come ( =
1

2
, V
N1
V
N2
S, P, S), dove P = P
1
P
2
S
S
1
S
2
.
Si osservi che ogni stringa in w L
1
L
2
ha la struttura w = w
1
w
2
, dove
w
1
L
1
`e derivabile in (
1
mediante una derivazione S
1

= w
1
e w
2
L
2
`e derivabile in (
2
mediante una derivazione S
2

= w
2
. La stringa w sar`a
allora derivabile in ( mediante la derivazione S = S
1
S
2

= w
1
S
2

= w
1
w
2
ottenuta anteponendo lapplicazione della produzione S S
1
, alla deriva-
zione di w
1
da S
1
e, quindi, alla derivazione di w
2
da S
2
: da ci`o segue che
L
1
L
2
L(().
138 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Al contrario, qualunque stringa x ( sar`a derivata mediante una deriva-
zione del tipo S = S
1
S
2

= x, in quanto questa `e la sola produzione con


lassioma S nella parte sinistra: da ci`o consegue che x sar`a necessariamente
composta dalla concatenazione di una prima stringa derivata da S
1
, e quindi
in L
1
, con una seconda stringa derivata da S
2
, e quindi in L
2
. In conseguenza
di ci`o, x L
1
L
2
, L(() L
1
L
2
, e il teorema deriva. 2
Teorema 4.12 I linguaggi non contestuali sono chiusi rispetto alliterazione.
Dimostrazione. La dimostrazione `e lasciata come esercizio. 2
Esercizio 4.10 Dimostrare il Teorema 4.12.
Esercizio 4.11 Dimostrare che la classe dei linguaggi non contestuali non `e chiusa
rispetto alla complementazione.
4.4 Predicati decidibili sui linguaggi context free
Una prima applicazione delle considerazioni eettuate nella dimostrazione del
pumping lemma permette di evidenziare come sia possibile determinare, me-
diante opportuni algoritmi, se una grammatica non contestuale genera un
linguaggio innito, nito non vuoto, o vuoto.
Teorema 4.13 Data una grammatica ( di tipo 2 `e decidibile stabilire se
L(G) = .
Dimostrazione. Si assuma, senza perdita di generalit`a (vedi Teorema 4.4),
che ( = V
T
, V
N
, P, S) sia una grammatica di tipo 2 in Forma Normale di
Chomsky e si ponga n =[ V
N
[.
Ricordiamo che, per il pumping lemma per i linguaggi non contestuali
(Teorema 4.8), se esiste una stringa z = uvwxy L(() con [ z [> 2
n
, allora
esiste una stringa z

= uwy L(() con [ z

[ 2
n
.
In conseguenza di ci`o, se L(() ,= allora esiste qualche stringa di lunghezza
al pi` u 2
n
che fa parte del linguaggio. Dato che in una grammatica in CNF ogni
applicazione di una produzione o incrementa di uno la lunghezza della forma
di frase (se la produzione `e del tipo A BC) o sostituisce un terminale a un
non terminale (se `e del tipo A a), ne consegue che una stringa di lunghezza
k `e generata da una derivazione di lunghezza 2k 1, per cui, per vericare se
una qualche stringa di lunghezza al pi` u 2
n
`e generabile dalla grammatica, `e
suciente considerare tutte le derivazioni di lunghezza al pi` u 2
n+1
1, il cui
numero `e limitato superiormente dal valore [ P [ 2
|V
N
|+1
. 2
4.5. AUTOMI A PILA E LINGUAGGI CF 139
Il metodo anzidetto `e molto ineciente ed `e stato qui citato perche richiama
quello utilizzato per dimostrare la decidibilit`a dellanaloga propriet`a per i lin-
guaggi regolari. Un metodo pi` u eciente per vericare se un non terminale
genera stringhe terminali consiste nellapplicare lAlgoritmo 4.2 che elimina
i non terminali non fecondi, vericando poi che lassioma S non sia stato
eliminato.
Teorema 4.14 Data una grammatica ( di tipo 2 `e decidibile stabilire se L(()
`e innito.
Dimostrazione. Analogamente a quanto fatto nella dimostrazione del Teo-
rema 4.13, assumiamo, senza perdita di generalit`a (vedi Teorema 4.4), che
( = V
T
, V
N
, P, S) sia una grammatica di tipo 2 in Forma Normale di Chomsky
e si ponga n =[ V
N
[.
Ancora per il pumping lemma per i linguaggi non contestuali (Teore-
ma 4.8), osserviamo che, se esiste una stringa z = uvwxy L(() con
2
n
<[ z [ 2
2n
, allora esistono innite stringhe z
i
= uv
i
wx
i
y L((), con
i 0.
Analogamente a quanto fatto nel Teorema 4.13, `e suciente considerare
tutte le derivazioni di lunghezza al pi` u 2
2(n+1)
1, il cui numero `e limitato
superiormente dal valore [ P [
_
2
(2|V
N
|+1)
_
, e vericare se qualcuna di esse d`a
origine ad una stringa di terminali. 2
Anche questo metodo risulta fortemente ineciente. Un metodo pi` u ecien-
te, di costo polinomiale rispetto alla dimensione della grammatica (in forma
ridotta e priva di -produzioni), `e basato sulla visita del grafo G = (N, A)
costruito come segue. Linsieme dei nodi N `e in corrispondenza biunivoca con
quello dei non terminali della grammatica; esiste inoltre un arco dal nodo n
i
al nodo n
j
se e solo se dal non terminale associato a n
i
`e possibile derivare
una stringa contenente il non terminale associato al nodo n
j
.
`
E possibile determinare se la grammatica genera un linguaggio innito sem-
plicemente vericando se il grafo introdotto `e ciclico: tale propriet`a `e vericabi-
le in tempo lineare (nel numero di nodi e di archi) applicando opportunamente
i classici metodi di visita di gra.
4.5 Automi a pila e linguaggi context free
Analogamente a quanto visto nel caso dei linguaggi regolari, per i quali sono
stati introdotti gli automi a stati niti, anche nel caso dei linguaggi non conte-
stuali possiamo introdurre una macchina astratta che consente laccettazione
di tutti e soli i linguaggi di tale tipo. Questa macchina `e chiamata automa a
pila.
140 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Denizione 4.6 Un automa a pila (o automa push-down) `e denito come
una settupla / = , , Z
0
, Q, q
0
, F, ) dove `e l alfabeto di input, `e
l alfabeto dei simboli della pila, Z
0
`e il simbolo iniziale di pila, Q `e
un insieme nito e non vuoto di stati, q
0
Q] `e lo stato iniziale, F Q `e
linsieme degli stati nali, : Q ( ) Q

`e la funzione
(parziale) di transizione.
Osserviamo che lautoma sopra introdotto non `e deterministico, in quanto,
come gi`a visto in Sezione 2.5.2, la presenza di -transizioni pu`o comportare che
esistano continuazioni diverse di una stessa computazione anche in presenza
di uno stesso carattere letto.
Per ottenere un comportamento deterministico dobbiamo fare lulteriore
ipotesi che se, per una coppia q Q, Z , `e denita (q, , Z) allora la
funzione di transizione (q, a, Z) non deve essere denita per nessun a .
2
Dalla denizione della funzione di transizione deriva che ad ogni passo
lautoma, a partire dallo stato attuale, dal carattere letto sul nastro di input
e dal carattere aorante sulla pila, sostituisce il simbolo aorante nella pila
con una stringa di caratteri
3
e si porta in un nuovo stato. La rappresentazione
graca degli automi a pila prevede quindi che venga anche riportata la pila ed
i simboli in essa contenuti, come ad esempio in Figura 4.4.
Esempio 4.6 Se un automa a pila si trova in uno stato q
1
, legge il carattere a
dal nastro, ed il simbolo A aora sulla pila, e se la funzione di transizione `e
tale che (q
1
, a, A) = (q
3
, BA), ne deriva che lautoma va nello stato q
3
sostituendo al
simbolo A sulla pila la stringa BA. Tale transizione `e riportata in Figura 4.5.
Esempio 4.7 Se un automa a pila si trova in uno stato q
1
, legge il carattere a
dal nastro, ed il simbolo A aora sulla pila, e se la funzione di transizione `e
tale che (q
1
, a, A) = (q
3
, ), ne deriva che lautoma va nello stato q
3
cancellando il
simbolo A aorante sulla pila. Tale transizione `e riportata in Figura 4.6.
Per rappresentare la funzione di transizione di un automa a pila utilizzeremo
una semplice estensione della tabella di transizione usata per gli automi a stati
niti, in cui le righe corrispondono agli stati dellautoma ed ogni colonna cor-
risponde ad una coppia composta dal carattere letto in ingresso e dal carattere
aorante sulla pila.
Come si pu`o osservare il comportamento futuro di un automa a pila `e
determinato esclusivamente dallo stato attuale, dalla stringa da leggere e dal
contenuto della pila. Da ci`o, ricordando quanto detto nella Sezione 2.5, deriva
la seguente denizione.
2
Una caratterizzazione precisa degli automi a pila deterministici, sar`a fornita successiva-
mente, nella Sezione 4.6.
3
La convenzione `e che il primo carattere della stringa diventi il simbolo di pila aorante.
Si noti che se la stringa che viene inserita nella pila `e la stringa vuota, ci`o equivale a dire
che il simbolo precedente aorante nella pila `e stato cancellato.
4.5. AUTOMI A PILA E LINGUAGGI CF 141
A
A
B
B
.
.
.
a b b a a

Nastro di input
Q

Pila
A
A
B
B
.
.
.
Figura 4.4 Struttura di un automa a pila.
A
D
.
.
.
c a b
q
1
A
D
.
.
.
B
A
D
.
.
.
c a b
q
3
B
A
D
.
.
.
Figura 4.5 Esempio di transizione di un automa a pila per
(q
1
, a, A) = (q
3
, BA).
142 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
A
D
.
.
.
c a b
q
1
A
D
.
.
.
D
.
.
.
c a b
q
3
D
.
.
.
Figura 4.6 Esempio di transizione di un automa a pila per
(q
1
, a, A) = (q
3
, ).
Denizione 4.7 Dato un automa a pila / = , , Z
0
, Q, q
0
, F, ), una
congurazione di / `e data dalla tripla q, x, ), dove q Q, x

.
La funzione di transizione permette di denire la relazione di transizione
, che associa ad una congurazione la congurazione successiva, nel modo
seguente.
Denizione 4.8 Sia / = , , Z
0
, Q, q
0
, F, ) un automa a pila e due con-
gurazioni (q, x, ) e (q

, x

) di /, avremo che (q, x, )


M
(q

, x

) se e
solo se valgono le tre condizioni:
1. esiste a tale che x = ax

;
2. esistono Z e ,

tali che = Z e

= ;
3. (q, a, Z) = (q

, ).
Come enunciato nella Sezione 2.5, una computazione `e allora denita come
una sequenza c
0
, . . . , c
k
di congurazioni di / tale che c
i
M
c
i+1
.
Possiamo denire due diverse modalit`a di accettazione di stringhe da parte
di un automa a pila.
Denizione 4.9 (Accettazione per pila vuota) Sia / un automa a pila.
Una congurazione (q, x, ) di / `e di accettazione se x = = . Secondo tale
denizione, una stringa x `e quindi accettata da / se e solo se al termine della
scansione della stringa la pila `e vuota. Indichiamo con N(/) il linguaggio
accettato per pila vuota dallautoma /.
4.5. AUTOMI A PILA E LINGUAGGI CF 143
Denizione 4.10 (Accettazione per stato nale) Sia / un automa a
pila. Una congurazione (q, x, ) di / `e di accettazione se x = e q F.
Secondo tale denizione, una stringa x `e quindi accettata da / se e solo se
al termine della scansione della stringa lautoma si trova in uno stato nale.
Indichiamo con L(/) il linguaggio accettato per stato nale dallautoma /.
Come vedremo, i due concetti sopra esposti consentono, almeno nel caso di
automi a pila non deterministici che ora andiamo ad introdurre, di denire la
stessa classe di linguaggi.
Forniamo ora la denizione pi` u usuale di automa a pila non deterministico,
che continueremo ad utilizzare nel seguito.
Denizione 4.11 Un automa a pila non deterministico `e denito come una
settupla / = , , Z
0
, Q, q
0
, F, ) dove `e l alfabeto di input, `e l alfabeto
dei simboli della pila, Z
0
`e il simbolo iniziale di pila, Q `e un insieme
nito e non vuoto di stati, q
0
Q] `e lo stato iniziale, F Q `e linsieme degli
stati nali, : Q ( ) T(Q

) `e la funzione (parziale) di
transizione.
Coerentemente alla denizione generale di automa non deterministico, un au-
toma a pila non deterministico associa ad una congurazione un insieme di
congurazioni successive, e quindi un insieme di continuazioni diverse per la
computazione in corso.
A dierenza del caso degli automi a stati niti, per i quali il non determini-
smo non introduce maggiore potere computazionale (in quanto sia gli automi
a stati deterministici che quelli non deterministici riconoscono la stessa classe
di linguaggi, i linguaggi regolari), nel caso degli automi a pila la presenza del
non determinismo comporta una aumento del potere computazionale: infatti,
mentre gli automi a pila non deterministici riconoscono la classe dei linguaggi
non contestuali, gli automi a pila deterministici riconoscono un sottoinsieme
proprio di tali linguaggi, la classe dei linguaggi non contestuali deterministici.
Esempio 4.8 Consideriamo il caso dellaccettazione del linguaggio non contestuale
w w [ w a, b
+
, dove ricordiamo che w indica la stringa riessa di w.
Nellaccettazione per pila vuota, si ha che la pila `e vuota quando nisce la stringa
x se e solo se x L. La funzione di transizione riportata in Tabella 4.1 descrive un
automa a pila non deterministico che riconosce il linguaggio w w [ w a, b
+
per
pila vuota. Lo stesso linguaggio `e accettato per stato nale dallautoma a pila non
deterministico la cui funzione di transizione `e descritta in Tabella 4.2 e q
2
F.
Esercizio 4.12 Realizzare gli automi a pila che riconoscono per pila vuota e per stato
nale il linguaggio a
n
b
m
[ 1 n m.
Lequivalenza, nel caso di automi a pila non deterministici, tra i due
modelli di accettazione, per pila vuota e per stato nale, `e mostrata dai due
seguenti teoremi.
144 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
A B Z
0
a b a b a b
(q
0
, BA) (q
0
, BA) (q
0
, AB) (q
0
, BB) (q
0
, A) (q
0
, B)
q
0
(q
1
, ) (q
1
, )
q
1
(q
1
, ) (q
1
, )
Tabella 4.1 Tabella di transizione dellautoma a pila che accetta per pila vuota
il linguaggio w w [ w a, b
+
.
A B Z
0
a b a b a b
(q
0
, AA) (q
0
, BA) (q
0
, AB) (q
0
, BB) (q
0
, AZ
0
) (q
0
, BZ
0
)
q
0
(q
1
, ) (q
1
, )
q
1
(q
1
, ) (q
1
, ) (q
2
, )
Tabella 4.2 Tabella di transizione dellautoma a pila che accetta per stato
nale il linguaggio w w [ w a, b
+
.
4.5. AUTOMI A PILA E LINGUAGGI CF 145
Teorema 4.15 Dato un automa a pila non deterministico / che accetta un
linguaggio per stato nale, esiste un automa a pila non deterministico /

che
accetta lo stesso linguaggio per pila vuota, vale a dire tale che L(/) = N(/

).
Dimostrazione. Sia dato / = , , Z
0
, Q, q
0
, F, ): mostriamo come co-
struire lautoma /

, Z

0
, Q

, q

0
, ,

). Intuitivamente /

operer`a
similmente a /, secondo lo schema seguente:
1. Allinizio /

ha nella pila un simbolo speciale X non appartenente a


ed inserisce al di sopra di X il simbolo Z
0
;
2. Quindi, /

esegue gli stessi passi di /. Si noti che nel corso di tale fase
la pila di /

non sar`a mai vuota;


3. Se, alla ne della stringa di input, / raggiunge uno stato nale, /

provvede ad eliminare tutti i simboli presenti in pila, incluso X.


In base a quanto anticipato, possiamo porre

= ,

= X (X non in
), Z

0
= X, Q

= Q q

0
, q
f
(q

0
e q
f
non in Q) e, per quanto riguarda la
funzione di transizione

:
1. q Q, a , Z ,

(q, a, Z) = (q, a, Z);


2. q QF, Z

(q, , Z) = (q, , Z);


3. q F, Z

(q, , Z) = (q, , Z) (q
f
, );
4.

(q

0
, , X) = (q
0
, Z
0
X);
5. Z

(q
f
, , Z) = (q
f
, ).
Per eetto delle prime tre condizioni /

simula perfettamente / se questo


non si trova in una stato nale. Altrimenti /

pu`o eseguire tutte le transi-


zioni denite per / con lulteriore possibilit`a di eettuare una -transizione
verso il suo stato q
f
lasciando la pila immutata. La quarta condizione fa s`
che il simbolo X rimanga in fondo alla pila mentre lautoma /

eettua la
simulazione di /, mentre la quinta condizione assicura lo svuotamento della
pila di /

nel caso in cui / raggiunga uno stato nale.


`
E facile vericare che il linguaggio accettato per stato nale da / coincide
con quello accettato per pila vuota da /

. 2
Teorema 4.16 Dato un automa a pila non deterministico / che accetta un
linguaggio per pila vuota, esiste un automa a pila non deterministico /

che
accetta lo stesso linguaggio per stato nale, vale a dire tale che N(/) =
L(/

).
146 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Dimostrazione. La tecnica di dimostrazione `e analoga a quella utilizzata
nel teorema precedente. Sia dato / = , , Z
0
, Q, q
0
, , ): mostriamo co-
me costruire lautoma /

, Z

0
, Q

, q

0
, q
f
,

). Intuitivamente /

operer`a similmente a /, secondo lo schema seguente:


1. Allinizio /

ha nella pila un simbolo speciale X non appartenente a


ed inserisce Z
0
al di sopra di X;
2. Quindi, /

esegue gli stessi passi di /. Si noti che nel corso di tale fase
la pila di /

non sar`a mai vuota;


3. Se, alla ne della stringa di input, / raggiunge la condizione di pila
vuota, /

entra nello stato nale q


f
.
In base a quanto anticipato, possiamo porre

= ,

= X (X non in
), Z

0
= X, Q

= Q q

0
, q
f
(q

0
e q
f
non in Q) e, per quanto riguarda la
funzione di transizione

:
1. q Q, a , Z ,

(q, a, Z) = (q, a, Z);


2. q Q,

(q, , X) = (q
f
, X);
3.

(q

0
, , X) = (q
0
, Z
0
X).
Per eetto della prima condizione /

simula perfettamente / se la pila di


questo non `e vuota. Altrimenti, per eetto della seconda condizione, /

eettua una -transizione verso il suo stato nale q


f
lasciando la pila immutata.
La terza condizione fa s` che il simbolo X rimanga in fondo alla pila mentre
lautoma /

eettua la simulazione di /.
`
E facile vericare che il linguaggio accettato per pila vuota da / coincide
con quello accettato per stato nale da /

. 2
Lintroduzione del modello di accettazione per pila vuota, che risulta meno
intuitivo rispetto a quello di accettazione per stato nale, deriva dal fatto che
esso `e particolarmente utile nella dimostrazione di teoremi di caratterizzazione
del potere computazionale degli automi a pila, come si vedr`a nel seguito della
sezione.
Introduciamo ora due teoremi che mostrano lequivalenza tra i linguaggi
accettati da automi a pila e linguaggi generati da grammatiche non contestua-
li. Come su vedr`a, in entrambi i casi faremo riferimento alla condizione di
accettazione mediante pila vuota.
Teorema 4.17 Se un linguaggio `e generato da una grammatica ( non
contestuale, esiste un automa a pila / tale che L(() = ^(/).
Dimostrazione. La dimostrazione `e costruttiva: a partire da ( derivia-
mo / e mostriamo poi lequivalenza. Consideriamo dapprima il caso in cui
4.5. AUTOMI A PILA E LINGUAGGI CF 147
, L((). A partire da (, costruiamo una grammatica (

= , V

N
, P

, S

)
equivalente a (, ma in Forma Normale di Greibach. Poniamo = V

N
,
Q = q
0
, Z
0
= S

. Per ogni produzione A a, (V

N
)

introduciamo
la regola (q
0
, a, A) = (q
0
, ).
Proviamo ora il seguente asserto generale:
(q, x, S

)

(q, , ) (4.1)
se e solo se S


=x, dove q Q, x (

e (V

N
)

.
Mostriamo dapprima, per induzione su i, numero di passi della computa-
zione, che
se (q, x, S

)
i
(q, , ) allora S


=x.
Passo base (i = 1)
Se (q, x, S

) (q, , ) allora, per come `e stato costruito lautoma a


pila, deve esistere in P

una produzione S

x, con x .
Passo induttivo (i > 1)
In tal caso, posto x = ya, con a , possiamo riscrivere le derivazioni
nel seguente modo:
(q, ya, S

)
i1
(q, a, ) (q, , ),
da cui
(q, y, S

)
i1
(q, , ).
Per ipotesi induttiva vale S


=y. Daltra parte la transizione
(q, a, ) (q, , )
implica che = A, = , per un certo (V

N
)

, (V

N
)

e A V

N
e che in P

vi `e la produzione A a. Possiamo perci`o concludere che


S


=y=ya = x.
Mostriamo ora, per induzione sul numero di passi della derivazione, che vale
anche la seguente implicazione:
se S

i
=x allora (q, x, S

)

(q, , ).
148 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Passo base (i = 1)
Se S

=x (con x ) deve esistere in P

la produzione S


x: allora, per costruzione, esiste una transizione dellautoma tale che
(q, x, S

) (q, , ).
Passo induttivo (i > 1)
Posto x = ya, con a , supponiamo di avere la derivazione sinistra
S

i1
=yA=ya, (4.2)
con = ed , (V

N
)

. Per ipotesi induttiva vale allora


(q, y, S

)

(q, , A);
ne segue che vale anche (q, ya, S

)

(q, a, A). Poiche A a
`e una produzione in P

(vedi la (4.2)) segue, per costruzione, che


(q, a, A) (q, , ). Da ci`o deriva che
(q, x, S)

(q, a, A) (q, , ).
Si osservi ora che, come caso particolare dellasserto sopra dimostrato, abbiamo
che, ponendo nella (4.1) = otteniamo
S

=x se e solo se (q, x, S

)

(q, , ).
e quindi lenunciato del teorema risulta dimostrato per ogni stringa x ,= .
Osserviamo inne che se L(() possiamo facilmente costruire una gram-
matica (

in GNF che genera il linguaggio L((

) = L(() e quindi applicare


la procedura descritta per ottenere un automa a pila , , Z
0
, , q
0
, ) che
riconosce L((

). Da questo `e facile arrivare ad un automa che riconosce L(():


basta aggiungere uno stato q

0
, che diventa lo stato iniziale, su cui sar`a denita
la transizione (q

0
, , Z
0
) = (q

0
, ), (q
0
, Z
0
). 2
Il prossimo risultato ci permette di vericare che gli automi a pila non deter-
ministici caratterizzano effettivamente i linguaggi di tipo 2. Infatti, in esso si
dimostra che ogni linguaggio accettato da un automa a pila non deterministico
`e non contestuale.
Teorema 4.18 Sia L un linguaggio accettato mediante pila vuota da un au-
toma a pila / = , , Q, , Z
0
, q
0
, ), allora esiste una grammatica non
contestuale ( che lo genera, cio`e L = N(/) = L(().
4.5. AUTOMI A PILA E LINGUAGGI CF 149
Dimostrazione. La dimostrazione `e costruttiva, e consiste nel provare che il
linguaggio generato dalla grammatica ( = , V
N
, P, S), denita come appres-
so specicato, `e proprio L. Lalfabeto `e scelto uguale a quello dellautoma
a pila.
Deniamo
V
N
= [q, A, p] [ per ogni q, p Q, A S.
Deniamo le produzioni P al seguente modo
S [q
0
, Z
0
, p], per ogni p Q;
per ogni (q, a, A) e per ogni (q
1
, B
1
. . . B
m
) (q, a, A), in cui q, q
1
Q,
A, B
1
, . . . , B
m
, a , introduciamo le produzioni
[q, A, q
m+1
] a[q
1
B
1
q
2
] . . . [q
m
B
m
q
m+1
] se m > 0,
[q, A, q
1
] a altrimenti ;
dove q
2
, . . . , q
m+1
Q.
Per comprendere la dimostrazione si pu`o osservare che la denizione della
grammatica `e tale che una derivazione di una stringa x simula il compor-
tamento di un automa a pila che accetta la stringa x. In particolare, se da
[q, A, p] deriviamo x, vuole dire che, a seguito di una sequenza di transizioni,
la lettura della stringa x comporta la cancellazione del non terminale A dalla
pila.
Pi` u formalmente, dobbiamo dimostrare che
[q, A, p]

=x se e solo se (q, x, A)

(p, , )
da cui otteniamo come caso particolare, che [q
0
, Z
0
, p]

=x se e solo se
(q
0
, x, Z
0
)

(p, , ) per qualche p, cio`e se e solo se lautoma accetta la
stringa x per pila vuota.
Proviamo dapprima per induzione sul numero di passi che se (q, x, A)
i
(p, , ), allora [q, A, p]

=x.
Passo base (i = 1)
Se (q, x, A) (p, , ) allora deve esistere per costruzione la produzione
[q, A, p] x.
Passo induttivo (i > 1)
Sia x = ay e supponiamo che (q
1
, B
1
. . . B
m
) (q, a, A), per cui
(q, ay, A) (q
1
, y, B
1
. . . B
m
)
i1
(p, , )
150 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Sia y = y
1
. . . y
m
dove ogni y
i
determina la cancellazione di B
i
dalla pila.
Esistono stati q
1
, q
2
, . . . , q
m
tali che
(q
1
, y
1
, B
1
)
k
1
(q
2
, , )
(q
2
, y
2
, B
2
)
k
2
(q
3
, , )
.
.
.
(q
m
, y
m
, B
m
)
km
(q
m+1
, , )
(con k
j
i 1 vedi Figura 4.7). Per induzione a ciascuna di queste
q
1
q
2
q
3
q
4
q
m+1
= p
y
1
y
2
y
3
y
m
B
1
B
2
B
3
.
.
.
B
m
altezza della pila
stringhe
in lettura
Figura 4.7 Altezza della pila durante la lettura della stringa y = y
1
. . . y
m
..
computazioni deve corrispondere una derivazione:
[q
1
, B
1
, q
2
]

= y
1
.
.
.
[q
m
, B
m
, q
m+1
]

= y
m
e quindi, poiche abbiamo anche la produzione
[q, A, p] a[q
1
, B
1
, q
2
] . . . [q
m
, B
m
, p]
otteniamo
[q, A, p]

=ay
1
. . . y
m
= ay = x.
4.5. AUTOMI A PILA E LINGUAGGI CF 151
Proviamo ora, sempre per induzione sul numero di passi, che vale anche:
se [q, A, p]
i
=x allora (q, x, A)

(p, , ).
Passo base (i = 1)
In questo caso abbiamo la produzione [q, A, p] x che, per costruzione,
comporta lesistenza di (p, ) (q, x, A).
Passo induttivo (i > 1)
Per applicare linduzione possiamo osservare che la derivazione di
lunghezza i [q, A, p]
i
=x pu`o essere riscritta come:
[q, A, p]=a[q
1
B
1
q
2
] . . . [q
n1
B
n1
q
n
][q
n
B
n
q
n+1
]
i1
=x,
con q
n+1
= p. Decomponiamo ora x in n stringhe x
1
, . . . , x
n
tali che
[q
j
B
j
q
j+1
]
k
j
=x
j
, con k
j
i 1, j = 1, 2, . . . , n.
Per ipotesi induttiva valgono le relazioni seguenti:
(q
j
, x
j
, B
j
)

(q
j+1
, , ), j = 1, . . . , n
e, quindi, anche le
(q
j
, x
j
, B
j
. . . B
n
)

(q
j+1
, , B
j+1
. . . B
n
), j = 1, . . . , n. (4.3)
Dal primo passo nella derivazione di x sappiamo che
(q, x, A) (q
1
, x
1
. . . x
n
, B
1
. . . B
n
).
In base alla relazione 4.3 possiamo scrivere che
(q
1
, x
1
. . . x
n
, B
1
. . . B
n
)

(q
2
, x
2
. . . x
n
, B
2
. . . B
n
)




(q
n
, x
n
, B
n
)

(p, , ),
il che conclude la prova.
2
152 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Esempio 4.9 Consideriamo lautoma a pila avente la funzione di transizione seguen-
te:
(q
0
, 0, Z
0
) = (q
0
, XZ
0
)
(q
0
, 0, X) = (q
0
, XX)
(q
0
, 1, X) = (q
1
, )
(q
1
, 1, X) = (q
1
, )
(q
1
, , X) = (q
1
, )
(q
1
, , Z
0
) = (q
1
, )
Tale automa riconosce il linguaggio 0
n
1
m
[ n m 1.
Applicando il metodo illustrato nella dimostrazione del Teorema 4.18, otteniamo
la seguente grammatica non contestuale che genera lo stesso linguaggio:
S [q
0
Z
0
q
0
] (non feconda)
S [q
0
Z
0
q
1
]
[q
0
Z
0
q
0
] 0[q
0
Xq
0
][q
0
Z
0
q
0
] (non feconda)
[q
0
Z
0
q
0
] 0[q
0
Xq
1
][q
1
Z
0
q
0
] (non feconda)
[q
0
Z
0
q
1
] 0[q
0
Xq
0
][q
0
Z
0
q
1
] (non feconda)
[q
0
Z
0
q
1
] 0[q
0
Xq
1
][q
1
Z
0
q
1
]
[q
0
Xq
0
] 0[q
0
Xq
0
][q
0
Xq
0
] (non feconda)
[q
0
Xq
0
] 0[q
0
Xq
1
][q
1
Xq
0
] (non feconda)
[q
0
Xq
1
] 0[q
0
Xq
0
][q
0
Xq
1
] (non feconda)
[q
0
Xq
1
] 0[q
0
Xq
1
][q
1
Xq
1
]
[q
0
Xq
1
] 1
[q
1
Xq
1
] 1
[q
1
Xq
1
]
[q
1
Z
0
q
1
] .
Vericando se i non terminali sono raggiungibili e/o fecondi possiamo giungere
alla forma ridotta seguente:
S [q
0
Z
0
q
1
]
[q
0
Z
0
q
1
] 0[q
0
Xq
1
][q
1
Z
0
q
1
]
[q
0
Xq
1
] 0[q
0
Xq
1
][q
1
Xq
1
] [ 1
[q
1
Xq
1
] 1 [
[q
1
Z
0
q
1
]
4.6. AUTOMI A PILA DETERMINISTICI 153
ed eliminando la produzione unitaria:
S 0[q
0
Xq
1
][q
1
Z
0
q
1
]
[q
0
Xq
1
] 0[q
0
Xq
1
][q
1
Xq
1
] [ 1
[q
1
Xq
1
] 1 [
[q
1
Z
0
q
1
] .
Applicando le produzioni possiamo vedere come viene simulato lautoma. Supponiamo
di dover generare la stringa 00011.
Generazione
S
0 . . . . . . . . . . . . . . . . . . . . [q
0
Xq
1
][q
1
Z
0
q
1
]
00 . . . . . . . . . . . [q
0
Xq
1
][q
1
Xq
1
][q
1
Z
0
q
1
]
000 . . . [q
0
Xq
1
][q
1
Xq
1
][q
1
Xq
1
][q
1
Z
0
q
1
]
0001 . . . . . . . . . [q
1
Xq
1
][q
1
Xq
1
][q
1
Z
0
q
1
]
00011 . . . . . . . . . . . . . . . [q
1
Xq
1
][q
1
Z
0
q
1
]
00011. . . . . . . . . . . . . . . . . . . . . . . [q
1
Z
0
q
1
]
00011. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accettazione
stato caratteri letti caratteri da leggere pila
q
0
0 Z
0
q
0
0 0 XZ
0
q
0
00 0 XXZ
0
q
0
000 1 XXXZ
0
q
1
0001 1 XXZ
0
q
1
00011 XZ
0
q
1
00011 Z
0
q
1
00011
Esercizio 4.13 Denire un automa a pila non deterministico che riconosca il linguag-
gio
_
w w [ w a, b

_
e costruire la grammatica che lo genera in base al metodo
indicato nel teorema precedente.
4.6 Automi a pila deterministici
Il modello degli automi a pila `e stato denito come non deterministico e in
eetti, come abbiamo visto nei Teoremi 4.17 e 4.18, lequivalenza tra linguaggi
154 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
non contestuali e linguaggi accettati da automi a pila `e stata dimostrata ap-
punto considerando automi non deterministici. Il modello degli automi a pila
deterministici, che qui introduciamo, risulta comunque di grande rilevanza in
quanto, pur non consentendo di riconoscere tutti i linguaggi context free, vie-
ne ampiamente utilizzato quale modello di riferimento nellanalisi sintattica di
programmi (vedi Sezione 4.7).
Denizione 4.12 Un automa a pila deterministico `e un automa a pila / =
, , Z
0
, Q, q
0
, F, ) tale che, a , Z , q Q
[ (q, a, Z) [ + [ (q, , Z) [ 1. (4.4)
La condizione che deve essere soddisfatta dalla funzione di transizione di un
automa a pila anche questo risulti deterministico ha natura duplice: anzi-
tutto, la cardinalit`a di (q, a, Z) non deve essere superiore a 1 e, in secondo
luogo, se `e denita una -transizione su un certo stato e per un certo simbolo di
pila aorante non deve essere contemporaneamente denita altra transizione
per quello stato e quel simbolo di pila. Sebbene in questa sede non appro-
fondiamo lo studio degli automi a pila deterministici, `e bene chiarire, anche
se informalmente, come tali dispositivi eettuano il calcolo. In particolare, la
computazione di un automa a pila deterministico va intesa come una sequenza
massimale di congurazioni, nel senso che essa procede ntanto che esistono
transizioni denite. Una stringa `e accettata da un automa a pila determi-
nistico se e solo se essa d`a luogo ad una computazione che termina in una
congurazione q, , w), con q F e w

.
4
Si pu`o vericare che gli automi
a pila deterministici hanno un potere computazionale strettamente inferiore a
quello degli automi a pila non deterministici osservando quanto segue.
1. Poiche la denizione di automa a pila deterministico `e una specializza-
zione della denizione di automa a pila non deterministico la classe dei
linguaggi accettati da automi a pila non deterministici include quella dei
linguaggi accettati da automi a pila deterministici.
2. La classe dei linguaggi di tipo 2, vale a dire dei linguaggi accet-
tati da automi a pila non deterministici, non `e chiusa rispetto alla
complementazione (vedi Esercizio 4.11).
3. La classe dei linguaggi accettati da automi a pila deterministici `e
chiusa rispetto alla complementazione. Al ne di mostrare tale pro-
priet`a descriviamo come, per ogni automa a pila deterministico / =
, , Z
0
, Q, q
0
, F, ), sia possibile costruirne uno che accetta il linguaggio

L(/).
4
`
E possibile dimostrare che, nel caso di automi a pila deterministici, le due modalit`a di
accettazione viste, per stato nale e per pila vuota, non sono equivalenti: in particolare,
esistono linguaggi accettabili da automi a pila deterministici per stato nale e che non sono
accettati da alcun automa a pila deterministico per pila vuota.
4.7. ANALISI SINTATTICA E LINGUAGGI CF DETERMINISTICI 155
Osserviamo che, data una stringa x di input, lautoma / pu`o accet-
tare x, riutarla o eseguire indenitamente un ciclo di -transizioni.
`
E
tuttavia facile vericare che, per ogni automa a pila deterministico /,
ne esiste uno equivalente che termina ogni sua computazione. Assu-
meremo dunque, senza perdita di generalit`a, che / accetti o riuti
ogni stringa che gli viene sottoposta. Possiamo allora costruire lauto-
ma /

= , , Z
0
, Q

, q
0
, F

) che accetta

L(/) semplicemente
ponendo Q

= Q q
F
, q
F
, Q, F

= Q

F e, per ogni a ,
A , q Q:
(a)

(q, a, A) = (q
F
, A), se (q, a, A) `e indenita,
(b)

(q, a, A) = (q, a, A), altrimenti,


e ponendo inoltre

(q
F
, a, A) = (q
F
, A).
La classe dei linguaggi accettati da automi a pila deterministici dun-
que non coincide con quella dei linguaggi di tipo 2. Intuitivamente, un
linguaggio separatore `e dato da L = w w [ w a, b
+
, gi`a preceden-
temente considerato (vedi Esempio 4.8). Tale linguaggio, di tipo 2, non
pu`o essere accettato da alcun automa a pila deterministico. Infatti, in-
tuitivamente, durante la scansione dellinput, non `e possibile individuare
a priori, in maniera deterministica, dove termina la stringa w ed inizia
w.
Da quanto osservato si evince che la classe dei linguaggi accettati da automi a
pila deterministici `e propriamente contenuta in quella dei linguaggi di tipo 2.
Esercizio 4.14 Dimostrare che la classe dei linguaggi context free deterministici non
`e chiusa rispetto a intersezione ed unione.
4.7 Analisi sintattica e linguaggi non contestuali deterministici
Come gi`a osservato nella Sezione 2.4, la sintassi dei linguaggi di programma-
zione pu`o essere specicata tramite una grammatica e ci`o che viene tipicamen-
te indicato come programma sintatticamente corretto altro non `e che una
stringa del linguaggio generato da tale grammatica. Daltra parte, il processo
di traduzione di un programma consiste sostanzialmente, come `e noto, nella
costruzione del programma oggetto o eseguibile che corrisponde a un program-
ma sorgente dato, tipicamente scritto in un linguaggio di programmazione ad
alto livello. Lautomazione di tale processo, argomento non approfondito in
questo volume, richiede la conoscenza della grammatica formale che denisce
il linguaggio di programmazione utilizzato.
Tralasciando vari dettagli implementativi, possiamo assumere che la tradu-
zione di un programma consista in una attivit`a preliminare di analisi e in una
156 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
successiva attivit`a di generazione del codice. Nella fase di analisi (si parla in
eetti di analisi sintattica, o parsing) viene esaminata la struttura sintattica
del programma; in pratica, oltre a risolvere il problema del riconoscimento del
programma come parola del linguaggio di programmazione, viene ricostruito
lalbero di derivazione del programma, individuando una sequenza di produ-
zioni della grammatica associata a tale linguaggio, la cui applicazione permette
di generare il programma stesso a partire dallassioma. A valle di tale analisi
si procede con la generazione del codice, resa possibile proprio dalla conoscen-
za della struttura sintattica del programma, sotto forma del relativo albero
sintattico.
I linguaggi di programmazione di interesse pratico possono essere conside-
rati, in prima approssimazione, linguaggi di tipo 2. In realt`a ci sono alcuni
elementi sintattici, quali ad esempio la obbligatoriet`a e lunicit`a della dichia-
razione di una variabile, che non possono essere espressi con produzioni di
tipo 2: formalmente, essi rendono tali linguaggi di tipo 1. Lanalisi sintattica
di una stringa di un linguaggio di tipo 1 `e tuttavia un problema assai comples-
so, la cui soluzione comporta generalmente computazioni assai onerose. Per
fortuna, `e possibile individuare ed isolare gli aspetti contestuali della sintassi
dei linguaggi di programmazione, in modo da suddividere la fase di parsing
in due sottoprocessi (che tuttavia non lavorano in modo necessariamente se-
quenziale): nel primo si considerano solo le regole di tipo 2, nel secondo si
prendono esplicitamente in esame gli aspetti contestuali utilizzando tecniche
algoritmiche ad hoc.
`
E importante osservare che il linguaggio di tipo 2 suddetto deve essere de-
terministico: questa caratteristica rende possibile la costruzione di algoritmi
ecienti per il parsing; per i linguaggi di tipo 2 non deterministici il problema
`e gi`a troppo complesso. Infatti, un linguaggio di tipo 2 deterministico pu`o
essere accettato da un automa a pila deterministico in un numero lineare di
passi, mentre, come vedremo nella Sezione 4.9, in generale gli algoritmi per il
riconoscimento di un linguaggio context free possono richiedere tempo cubi-
co. Anche se il problema dellanalisi sintattica appare pi` u complesso, rimane
tuttavia possibile costruire algoritmi che eettuano tale analisi operando una
sola scansione del testo in ingresso, limitandosi a considerare in ogni momento
un numero costante pressato di simboli.
Il parsing dei linguaggi non contestuali deterministici `e un problema clas-
sico nellambito dei linguaggi formali, e per esso sono state sviluppate varie
tecniche algoritmiche, normalmente basate sullidea di disporre di grammati-
che le cui produzioni, oltre ad essere non contestuali, hanno una struttura pre-
denita che pu`o essere sfruttata in pratica al ne di ricostruire ecientemente
lalbero di derivazione del programma.
Nel seguito illustreremo, a titolo puramente esemplicativo e senza alcuna
pretesa di completezza, i due metodi pi` u classici di analisi sintattica: lanalisi
discendente e lanalisi ascendente.
Esempio 4.10 Un analizzatore sintattico a discesa ricorsiva `e un algoritmo di par-
4.7. ANALISI SINTATTICA E LINGUAGGI CF DETERMINISTICI 157
sing che costruisce un albero di derivazione con metodo discendente (top-down) si-
mulando lintero processo di derivazione. In particolare, lalgoritmo legge uno o pi` u
caratteri della stringa da analizzare e individua quale sia la prima produzione da
applicare allassioma allo scopo di generare la stringa. Quindi, dopo lapplicazione
di tale produzione, lalgoritmo legge altri caratteri della stringa e determina quale
sia la produzione successiva, da applicare al non terminale pi` u a sinistra
5
presente
nella forma di frase corrente. La tecnica viene quindi reiterata no al termine della
scansione dellinput, quando la ricostruzione dellalbero sintattico `e completa.
Una grammatica non contestuale `e detta grammatica LL(k)
6
se esiste un analiz-
zatore sintattico a discesa ricorsiva tale che lesame dei prossimi k caratteri dellinput
consente il riconoscimento della produzione da applicare alla forma di frase corrente.
Un linguaggio non contestuale `e detto linguaggio LL(k) se ammette una grammatica
non contestuale LL(k). La denominazione analisi a discesa ricorsiva `e dovuta al
fatto che, data una grammatica LL(k), `e possibile scrivere un programma ricorsivo
che, esaminando ad ogni passo i prossimi k caratteri dellinput, costruisce, a partire
dallassioma, una derivazione sinistra della stringa in esame se questa appartiene al
linguaggio o la riuta se essa non appartiene al linguaggio; in tal caso lanalizzatore
`e in grado di fornire anche qualche precisazione (diagnostica) sul motivo del riuto.
Data ad esempio la grammatica ( = a, b, c, S, , P, S) le cui regole di
produzione sono
S aSa
S bSb
S c
`e evidente che essa genera il linguaggio L(() = wc w [ w a, b

. Data allora la
stringa x = abcba `e facile convincersi che un analizzatore a discesa ricorsiva individua
la seguente derivazione sinistra per x esaminando un carattere alla volta:
S = aSb = abSba = abcba
( `e dunque una grammatica LL(1). Si noti che la stessa propriet`a non `e goduta dalla
seguente grammatica (

= a, b, c, S, , P

, S) equivalente a (:
S aaAaa [ abAba [ T [ aca [ bcb [ c
T bbBbb [ baBab [ S
A S [ aca [ bcb [ c
B T [ aca [ bcb [ c
Per tale grammatica si rende necessario lesame di due caratteri alla volta allo scopo
di individuare la produzione da applicare. Perci`o, benche L((

) sia LL(1), risulta che


(

`e LL(2).
5
Poiche molte sono le derivazioni dierenti associate a uno stesso albero sintattico, nella
sua ricostruzione top-down `e utile considerare la cosiddetta derivazione sinistra, in cui ad
ogni passo si applica una produzione al non terminale pi` u a sinistra. Sotto opportune
ipotesi (vedi Sezione 4.8) esiste una corrispondenza biunivoca tra derivazioni sinistre ed
alberi sintattici.
6
La notazione LL `e dovuta al fatto che la stringa in input `e analizzata da sinistra verso
destra (Left-to-right) e che viene ricostruita la derivazione sinistra (Leftmost derivation).
158 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Concludiamo precisando che lunione dei linguaggi LL(k), per tutti i k > 0 `e un
sottoinsieme proprio della classe dei linguaggi non contestuali deterministici; in altre
parole, esistono linguaggi non contestuali deterministici che non sono LL(k) per alcun
k. A titolo di esempio, possiamo considerare la seguente grammatica:
S lSar [ lSbr [ lar [ lbr
che produce stringhe del tipo l
n
((a+b)r)
n
, in cui cio`e compare una sequenza di n 0
caratteri l, seguita da una sequenza di n coppie di caratteri, in cui il primo `e a o b e
il secondo `e r. Allo scopo di determinare quale sia la prima produzione da applicare
per generare una data stringa, `e necessario conoscere il carattere (a o b) di posizione
3n 1. Dunque, per ogni k ssato, nessun parser LL(k) pu`o riconoscere stringhe di
lunghezza maggiore di k + 1.
Esercizio 4.15 Vericare che la grammatica delle espressioni aritmetiche denita
nellEsempio 4.14 non `e LL(k) per nessun k.
Esempio 4.11 Gli analizzatori sintattici pi` u potenti e diusi in pratica sono basa-
ti su tecniche di analisi ascendente (bottom-up). Tali tecniche mirano a ricostruire
lalbero sintattico partendo dalle foglie e procedendo verso lalto. In altre parole,
se la stringa appartiene al linguaggio, essi ricostruiscono la sua derivazione destra
7
,
determinandone le relative produzioni in ordine inverso.
Corrispondentemente a quanto avviene per lanalisi discendente, anche in questo
caso si possono introdurre classi di linguaggi analizzabili ecientemente con tecniche
di analisi ascendente: i linguaggi LR(k).
8
Questi linguaggi ammettono grammatiche
LR(k), le quali consentono di eettuare lanalisi ascendente esaminando k simboli
dellinput alla volta.
In particolare, un parser LR(k) utilizza una pila in cui pu`o inserire simboli ter-
minali e non terminali. Ad ogni passo, assumendo che abbia gi`a ricostruito le ultime
r produzioni nella derivazione destra, il parser osserva i prossimi k caratteri in input,
oltre al contenuto della pila. Utilizzando tale informazione, esso determina se, per
un qualche h > 0, gli h simboli aoranti nella pila costituiscono la parte destra della
r + 1-esima produzione nella derivazione destra scandita al contrario. In tal caso, se
X `e tale produzione, il parser sostituisce sulla pila a tali simboli il non terminale
X. In caso contrario, il primo dei k caratteri osservati viene inserito in pila.
Si osservi che la grammatica introdotta alla ne dellEsempio 4.10 risulta essere
LR(0).
Esercizio 4.16 Vericare lultima aermazione, vale a dire che la grammatica alla
ne dellEsempio 4.10 `e LR(0).
7
Nella derivazione destra ad ogni passo si applica una produzione al non terminale pi` u
a destra. Anche in questo caso, sotto opportune ipotesi (vedi Sezione 4.8), esiste una
corrispondenza biunivoca tra derivazioni destre ed alberi sintattici.
8
Left-to-right, Rightmost derivation. Si pu`o dimostrare che la classe dei linguaggi LR(1)
e quella dei linguaggi di tipo 2 deterministici coincidono.
4.8. GRAMMATICHE E LINGUAGGI AMBIGUI 159
4.8 Grammatiche e linguaggi ambigui
Qualunque sia la tecnica algoritmica utilizzata per lanalisi sintattica `e impor-
tante che la stringa da analizzare sia associabile ad un unico albero sintattico.
Ci`o, sebbene alquanto ragionevole, non `e sempre assicurato.
Denizione 4.13 Una grammatica ( si dice ambigua se esiste una stringa
x in L(() derivabile con due diversi alberi sintattici.
Poiche lalbero sintattico di una stringa corrisponde in qualche modo al si-
gnicato della stringa stessa, lunivocit`a di questo albero `e importante per
comprendere senza ambiguit`a tale signicato. Nel caso dei linguaggi di pro-
grammazione, il problema dellambiguit`a `e evidentemente cruciale: per con-
sentire la corretta interpretazione, e traduzione, di un programma scritto in
un linguaggio ad alto livello, `e necessario che la grammatica che denisce il
linguaggio di programmazione sia non ambigua.
Esempio 4.12 Si consideri la grammatica
E E +E E E [ E E [ E/E [ (E) [ a.
Essa genera tutte le espressioni aritmetiche sulla variabile a, ma come si vede facil-
mente la stessa espressione pu`o essere derivata con alberi di derivazione diversi. Ad
esempio la stringa a + a a pu`o venire derivata mediante i due alberi di Figura 4.8,
corrispondenti a due diverse interpretazioni dellespressione.
E
E + E
a
E

E
a a
E
E

E
E + E
a
a a
Figura 4.8 Alberi sintattici diversi per la stringa a +a a.
Leliminazione dellambiguit`a `e uno dei principali problemi nello studio dei
linguaggi di programmazione e dei metodi di analisi sintattica. In questa
sede dedichiamo solo qualche breve considerazione accennando ai due metodi
fondamentali per leliminazione dellambiguit`a: luso di parentesi e luso di
precedenza tra gli operatori.
Le parentesi sono uno strumento molto utile per rendere esplicita la
struttura dellalbero di derivazione di una stringa.
160 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Esempio 4.13 Supponiamo di modicare la grammatica precedente nel seguente
modo:
E (E +E) (E E) [ (E E) [ (E/E) [ (E) [ a.
I due diversi alberi di derivazione che davano origine alla stessa stringa, danno ora
origine alle due stringhe
(a + (a a))
((a +a) a).
Come `e noto dalluso dellaritmetica elementare, in luogo delle parentesi si pu`o
assumere una particolare regola di precedenza, che induce una lettura univoca
delle stringhe. Ad esempio, la precedenza del sul + fa s` che la stringa
a + a a sia univocamente interpretata come (a + (a a)). In alcuni casi `e
possibile modicare la grammatica in modo tale che essa rappresenti al suo
interno la regola di precedenza introdotta.
Esempio 4.14 La seguente grammatica fornisce una denizione non ambigua delle
espressioni aritmetiche utilizzabili in un programma. La grammatica rappresenta
nella sua struttura le relazioni di precedenza denite tra gli operatori (nellordine non
decrescente +,-,*,/) e in tal modo consente di utilizzare le parentesi soltanto quando
esse strettamente necessario. Per semplicit`a assumiamo ancora di avere un unico
simbolo di variabile: il simbolo a.
E E +T [ E T [ T
T T F [ T/F [ F
F (E) [ a
Il primo problema che nasce in relazione allambiguit`a, data una grammati-
ca ( non contestuale, `e stabilire se ( `e ambigua. Purtroppo tale problema
non ammette soluzione poiche, come vedremo nella Sezione 4.8.1, il proble-
ma dellambiguit`a di una grammatica non contestuale `e indecidibile. In altre
parole non esiste un algoritmo che, data una grammatica ( non contestuale,
stabilisca se ( `e ambigua o meno.
Un secondo problema di interesse in relazione allambiguit`a `e, data una
grammatica ambigua (
A
, stabilire se esiste una grammatica non ambigua
equivalente a (
A
.
Tale problema assume particolare rilevanza in quanto esistono linguaggi
per cui tutte le grammatiche sono ambigue.
Denizione 4.14 Un linguaggio di tipo 2 si dice inerentemente ambiguo se
tutte le grammatiche che lo generano sono ambigue.
Anche il problema dellinerente ambiguit`a di un linguaggio `e indecidibile. Pos-
siamo tuttavia mostrare un esempio di linguaggio inerentemente ambiguo per
il quale questa sgradevole propriet`a non solo pu`o essere dimostrata, ma risulta
sucientemente intuitiva da poter essere compresa anche senza dimostrazione
formale.
4.8. GRAMMATICHE E LINGUAGGI AMBIGUI 161
Esempio 4.15 Il linguaggio
a
n
b
n
c
m
[ n, m 1 a
m
b
n
c
n
[ m, n 1
`e inerentemente ambiguo. Infatti `e facile comprendere che, qualunque grammatica
venga utilizzata, le stringhe del tipo a
n
b
n
c
n
che fanno parte del linguaggio possono
sempre essere generate in due modi diversi.
4.8.1 Indecidibilit`a del problema dellambiguit`a di una grammatica
Al ne di mostrare la indecidibilit`a del problema in esame, consideriamo un
nuovo problema, anchesso indecidibile, noto come problema delle corrispon-
denze di Post (PCP), dal nome del logico matematico che lo ha denito. Il
problema consiste nello stabilire se, dato un alfabeto e date due sequenze di
k parole X = x
1
, . . . , x
k
e Y = y
1
, . . . , y
k
costruite su assegnato, esiste una
sequenza di m 1 interi i
1
, i
2
, . . . , i
m
tale che risulti
x
i
1
x
i
2
. . . x
im
= y
i
1
y
i
2
. . . y
im
.
La sequenza i
1
, i
2
, . . . , i
m
viene detta soluzione dellistanza (X, Y ) del pro-
blema.
Esempio 4.16 Consideriamo le due sequenze 1, 10111, 10 e 111, 10, 0 costruite sul-
lalfabeto 0, 1.
`
E immediato vericare che la sequenza di interi 2, 1, 1, 3 costituisce
una soluzione alla istanza di PCP considerata.
Esercizio 4.17 Date le sequenze 10, 011, 101 e 101, 11, 011 costruite sullalfabeto
0, 1, si verichi che il PCP denito da tali sequenze non ammette soluzione.
Lindecidibilit`a del PCP pu`o essere dimostrata per assurdo, provando che
nellipotesi che esista un algoritmo risolutivo per PCP questo potrebbe essere
sfruttato per risolvere problemi gi`a noti come indecidibili su dispositivi di cal-
colo pi` u generali degli automi a pila (come ad esempio per risolvere il problema
della terminazione per le Macchine di Turing, studiate nel Capitolo 5).
Teorema 4.19 Il problema delle corrispondenze di Post `e indecidibile, ovve-
ro, non esiste un algoritmo che, date due sequenze di k parole x
1
, . . . , x
k
e
y
1
, . . . , y
k
costruite su un alfabeto ssato, stabilisce se esiste una sequenza
di m 1 interi i
1
, i
2
, . . . , i
m
tale che risulti
x
i
1
x
i
2
. . . x
i
m
= y
i
1
y
i
2
. . . y
i
m
.
Dimostrazione. Omessa. 2
Una tecnica simile consente di provare lindecidibilit`a della ambiguit`a di una
grammatica di tipo 2. Infatti, si sfrutta lidea di mostrare che, se per assurdo
potessimo decidere lambiguit`a di una grammatica di tipo 2, allora potremmo
facilmente ottenere un algoritmo che risolve PCP, il che `e assurdo.
162 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Teorema 4.20 Data una grammatica ( di tipo 2, il problema di stabilire se
( sia ambigua o meno `e indecidibile.
Dimostrazione. Supponiamo per assurdo che esista un algoritmo che decide
il problema e proviamo come potremmo sfruttare tale algoritmo per risolvere
il PCP. Sia allora A = x
1
, . . . , x
k
e B = y
1
, . . . , y
k
una istanza (generica) di
PCP su un alfabeto .
Dato lalfabeto a
1
, a
2
, . . . , a
k
, con a
i
, i = 1, . . . , k, consideriamo
il linguaggio L

= L
A
L
B
denito su , in cui:
- L
A
= x
i
1
x
i
2
x
i
m
a
i
m
a
i
m1
a
i
1
[ m 1
- L
B
= y
i
1
y
i
2
y
i
m
a
i
m
a
i
m1
a
i
1
[ m 1.
Consideriamo ora la grammatica di tipo 2
(

= S, S
A
, S
B
, a
1
, . . . , a
k
, P, S),
con produzioni P, per i = 1, . . . , k:
S S
A
[ S
B
S
A
x
i
S
A
a
i
[ x
i
a
i
S
B
y
i
S
B
a
i
[ y
i
a
i
.
`
E immediato vericare che tale grammatica genera il linguaggio L

prece-
dentemente denito.
Dimostriamo ora che listanza (A, B) di PCP ha soluzione se e solo se (

`e
ambigua.
Sia i
1
, . . . , i
m
una soluzione di PCP, per un certo m 1. In tale ipotesi ri-
sulta ovviamente x
i
1
x
im
a
im
a
i
1
= y
i
1
x
im
a
im
a
i
1
. Tale stringa, ap-
partenente a L

, ammette due dierenti alberi sintattici: il primo corrisponde


alla derivazione
S = S
A
= x
i
1
S
A
a
i
1
= x
i
1
x
i
2
S
A
a
i
2
a
i
1

= x
i
1
x
im
a
im
a
i
1
,
mentre il secondo `e associato alla derivazione
S = S
B
= y
i
1
S
B
a
i
1

= y
i
1
y
im
a
im
a
i
1
= x
i
1
x
im
a
im
a
i
1
.
(

risulta dunque ambigua (vedi Denizione 4.13).


Per mostrare limplicazione opposta, assumiamo che (

sia ambigua, e sia


z = wa
im
a
i
1
, m 1, una stringa di L

che ammette due distinti alberi


sintattici: vogliamo ora provare che i
1
, . . . , i
m
`e una soluzione dellistanza
(A, B) di PCP.
A causa della particolare struttura delle produzioni di (

, possiamo asserire
che i simboli a
j
dettano le produzioni, ovvero per generare il simbolo a
j
`e necessario usare una fra le produzioni S
A
x
j
S
A
a
j
e S
B
y
j
S
B
a
j
(o
4.9. ALGORITMI DI RICONOSCIMENTO DI LINGUAGGI CF 163
S
A
x
j
a
j
e S
B
y
j
a
j
, qualora a
j
sia il primo dei simboli a
i
presenti nella
parola generata). Ne segue che anche z ammetta due dierenti derivazioni
`e necessario che queste usino rispettivamente le produzioni su S
A
e su S
B
.
Lulteriore conseguenza `e che la sottostringa w che costituisce presso di z pu`o
essere scritta sia come x
i
1
x
i
m
sia come y
i
1
y
i
m
. La sequenza i
1
, . . . , i
m
`e dunque soluzione dellistanza (A, B) di PCP. 2
La tecnica utilizzata nella prova del teorema precedente `e potente e generale, e
viene spesso utilizzata per dimostrare risultati di indecidibilit`a. Essa consiste
nel ridurre un problema, gi`a noto come indecidibile, al problema in esame,
ovvero nel mostrare come un ipotetico algoritmo per la soluzione del proble-
ma in esame consentirebbe per assurdo di risolvere un problema indecidibile.
Utilizzando ad esempio la tecnica di riduzione, in una maniera molto simile a
quanto eettuato nella prova del teorema precedente, si pu`o mostrare indeci-
dibile il problema di stabilire se, date due grammatiche di tipo 2, lintersezione
dei linguaggi da esse generate sia vuota o meno.
Esercizio 4.18 Date due grammatiche di tipo 2 (
A
e (
B
, mostrare che il problema
di stabilire se L((
A
) L((
A
) sia vuoto o meno `e indecidibile.
Un tale risultato negativo ci consente di provare in maniera alternativa
che la classe dei linguaggi di tipo 2 non `e chiusa rispetto allintersezione (vedi
Corollario 4.9. Infatti, se lintersezione di due linguaggi di tipo 2 fosse di
tipo 2, visto che `e possibile decidere se un linguaggio di tipo 2 `e vuoto o meno
(vedi Teorema 4.13), potremmo allora decidere anche se lintersezione di due
linguaggi di tipo 2 sia vuota o meno, il che `e invece indecidibile.
4.9 Algoritmi di riconoscimento di linguaggi non contestuali
Come visto nella Sezione 4.5, il modello di calcolo degli automi a pila determi-
nistici non `e sucientemente potente da consentire il riconoscimento dellin-
tera classe dei linguaggi non contestuali e che, a tal ne, si rende necessario
utilizzare modelli di calcolo non deterministici. Ci`o, apparentemente, ren-
de il problema del riconoscimento di tali linguaggi impossibile dal punto di
vista pratico, in un contesto in cui possiamo fare riferimento a soli modelli
deterministici.
In questa sezione mostriamo come una diversa estensione degli automi a
pila deterministici permetta di ottenere un modello di calcolo ancora determi-
nistico in grado di riconoscere i linguaggi non contestuali. Lestensione consiste
nel rilassare i vincoli, imposti dalla politica LIFO, sulle possibilit`a di accesso
ai dati memorizzati, permettendo ad ogni istante laccesso diretto a uno qua-
lunque di essi; in altre parole, si sostituisce alla pila un array di dimensione
potenzialmente illimitata.
164 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
In questa sezione introduciamo un algoritmo deterministico per il rico-
noscimento dei linguaggi di tipo 2 che, utilizzando un array bidimensionale,
sfrutta le caratteristiche del nuovo modello.
Tale algoritmo, introdotto da Cocke, Younger e Kasami e denominato
CYK, data una grammatica non contestuale in forma normale di Chomsky
( = V
T
, V
N
, P, S) ed una stringa x V

T
(con [ x[= n), determina in tempo
O(n
3
) se x `e derivabile in ( o meno.
Lalgoritmo, che applica il paradigma della Programmazione Dinamica, si
basa sulle seguenti osservazioni:
1. Data x = a
1
, a
2
, . . . , a
n
V
+
T
, sia x
i,j
(1 i n, 1 j n i + 1) la
sua sottostringa a
i
, a
i+1
, . . . , a
i+j1
di lunghezza j che inizia dalli-esimo
carattere di x. Sia inoltre A
i,j
V
N
linsieme dei simboli non terminali
in ( da cui `e possibile derivare x
i,j
:
A
i,j
= A V
N
[ A

=
G
x
i,j

2. Per ogni i (1 i n) `e immediato determinare A


i,1
= A V
N
[ A
a
i
per ispezione di P.
3. Per ogni coppia i, j (1 i n, 1 < j n i + 1) un non terminale A
appartiene ad A
i,j
se e solo se esiste k (1 k j 1) tale che:
(a) esiste A

A
i,k
;
(b) esiste A

A
i+k,jk
;
(c) esiste una produzione A A

P.
Infatti, in tal caso la stringa x
i,j
`e derivabile da A applicando dapprima
la produzione A A

e derivando quindi separatamente i suoi primi


k caratteri (la sottostringa x
i,k
) da A

e gli altri j k (la sottostringa


x
i+k,jk
) da A

(Figura 4.9).
Al ne di costruire linsieme A
i,j
(1 i n, 1 < j ni) `e necessario quindi
far variare il valore k tra 1 e j1 esaminando via via gli insiemi A
i,k
e A
i+k,jk
:
`e chiaro che, per poter far ci`o, dovremo assumere che siano disponibili tutti
gli insiemi A
r,k
, con 1 k j 1 e 1 r i +j k.
Inne, si noti che x `e derivabile in ( se e solo se S A
1,n
.
Passiamo ora ad esaminare in maggiore dettaglio la struttura dellalgoritmo
CYK: lalgoritmo opera riempiendo un array T di dimensioni nn, in cui nella
locazione T[i, j] viene rappresentato linsieme A
i,j
, e vericando, alla ne di
tale processo, se S compare nella locazione T[1, n].
`
E utile notare che la
matrice T `e triangolare, in quanto non risultano deniti gli insiemi A
i,j
per
j > ni+1, e che lalgoritmo costruisce la matrice stessa per colonne.
`
E facile
rendersi conto che lAlgoritmo 4.5, ssata una grammatica ( = 1
T
, 1
N
, T, o),
4.9. ALGORITMI DI RICONOSCIMENTO DI LINGUAGGI CF 165
A
A

i,k

i+k,jk

i,j
Figura 4.9 Derivazione di x
i,j
.
esegue, per riconoscere una stringa x, un numero di passi pari a O([ x [
3
). Se
invece ( `e considerata come parte integrante dellinput, allora il numero di
passi risulta pari a O([ x [
3
[ V
N
[
2
[ P [).
Esempio 4.17 Consideriamo il linguaggio L delle stringhe palindrome di lunghezza
pari sullalfabeto 0, 1. Una grammatica in forma normale di Chomsky per tale
linguaggio ha le seguenti produzioni:
S Z

Z [ U

U [ ZZ [ UU
Z

ZS
U

US
Z 0
U 1
Vogliamo vericare, applicando lalgoritmo CYK, se la stringa 0110 appartiene ad L.
Lalgoritmo costruisce una matrice T 44, colonna per colonna, da sinistra verso
destra. La prima colonna, corrispondente al caso j = 1, viene riempita median-
te lispezione delle produzioni che generano un terminale, risultando nella seguente
situazione:
Z
U
U
Z
Ci`o deriva dal fatto che i simboli 0 che compaiono come primo
e quarto carattere sono derivati a partire soltanto da Z, mentre i restanti simboli 1
sono derivati soltanto a partire da U.
166 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
input Grammatica (, stringa x = a
1
, . . . , a
n
V

T
;
output Boolean;
begin
for i := 1 to n do
begin
T[i, 1] := ;
for each A a P do
if a = a
i
then T[i, 1] = T[i, 1] A
end;
for j := 2 to n 1 do
for i := 1 to n j + 1 do
begin
T[i, j] := ;
for k := 1 to j 1 do
for each B T[i, k] do
for each C T[i +k, j k] do
for each D V
N
do
if D BC P then T[i, j] := T[i, j] D
end
if S T[1, n] then
return vero
else return falso
end.
Algoritmo 4.5: Algoritmo CYK di riconoscimento di linguaggi CF
Il riempimento della seconda colonna, corrispondente al caso j = 2, risulta in:
Z
U S
U
Z
Tale situazione rappresenta il fatto che non esistono non ter-
minali a partire dai quali `e possibile derivare le sottostringhe 01 (corrispondente al-
lelemento T[1, 2]) e 10 (corrispondente allelemento T[3, 2]) e che la sottostringa 11
(corrispondente allelemento T[2, 2]) pu`o essere derivata a partire da S. In questul-
timo caso, lalgoritmo considera la decomposizione della stringa 11 associata alle-
lemento T[2, 2] nelle due sottostringhe corrispondenti agli elementi T[2, 1] e T[3, 1],
ciascuna delle quali `e derivabile dal simbolo U, e, osservando che esiste la produzione
S UU, determina che S va inserito in T[2, 2].
Il riempimento della terza colonna, corrispondente al caso j = 3, risulta in:
Z Z

U S
U
Z
Tale situazione rappresenta il fatto che non esistono non ter-
minali a partire dai quali `e possibile derivare la sottostringa 110 (corrispondente al-
4.9. ALGORITMI DI RICONOSCIMENTO DI LINGUAGGI CF 167
lelemento T[2, 3]) e che la sottostringa 011 (corrispondente allelemento T[1, 3]) pu`o
essere derivata a partire da Z. Lalgoritmo, in questo caso, determina che, in cor-
rispondenza alla decomposizione della stringa 011 associata allelemento T[1, 3] nelle
due sottostringhe corrispondenti agli elementi T[1, 1] e T[2, 2], la prima sottostringa
`e derivabile dal simbolo Z e la seconda `e derivabile dal simbolo S, ed osserva inoltre
che esiste la produzione Z

ZS, determinando quindi che che Z

va inserito in
T[1, 3].
Inne, il riempimento della quarta colonna, corrispondente al caso j = 4, risulta
in:
Z Z

S
U S
U
Z
Tale situazione rappresenta il fatto che lintera stringa, corri-
spondente allelemento T[1, 4], pu`o essere derivata a partire da S. Lalgoritmo veri-
ca ci`o osservando che, data la decomposizione della stringa nelle due sottostringhe
corrispondenti agli elementi T[1, 3] e T[4, 1], la prima sottostringa `e derivabile dal
simbolo Z

e la seconda `e derivabile dal simbolo Z, e, osservando inoltre che esiste la


produzione S Z

Z, determina quindi che che S va inserito in T[1, 4].


A questo punto, la presenza, una volta riempita la matrice, del simbolo S in
T[1, 4] consente di determinare che in eetti la stringa `e derivabile a partire da S ed
appartiene quindi al linguaggio.
Esercizio 4.19 Mostrare, applicando lalgoritmo CYK, che la stringa aaacbbbdedaba
`e derivabile nella grammatica non contestuale:
S AS [ BS [ A [ B
A aAb [ c
B dBd [ e
168 CAPITOLO 4. LINGUAGGI NON CONTESTUALI
Capitolo 5
Macchine di Turing e calcolabilit`a
secondo Turing
Le Macchine di Turing (MT) sono il modello di calcolo di riferimento fonda-
mentale sia nellambito della teoria della calcolabilit`a sia in quello della teoria
della complessit`a computazionale.
Quando il logico inglese A. M. Turing ha introdotto questo modello di cal-
colo (vedi Appendice A) egli si poneva lobiettivo di formalizzare il concetto
di calcolo allo scopo di stabilire lesistenza di metodi algoritmici per il ricono-
scimento dei teoremi nellambito dellAritmetica. Nonostante il fatto che ci`o
peraltro accadesse in un periodo in cui i primi elaboratori elettronici non erano
ancora stati progettati, il modello denito da Turing ha assunto un ruolo mol-
to importante per lo studio dei fondamenti teorici dellinformatica perche in
tale modello si associa una elevata semplicit`a di struttura e di funzionamento
ad un potere computazionale che `e, no ad oggi, ritenuto il massimo potere
computazionale realizzabile da un dispositivo di calcolo automatico.
Cos` come gli automi a stati niti e gli automi a pila, di cui rappresen-
ta unestensione in termini di capacit`a operative, la macchina di Turing `e
denita come un dispositivo operante su stringhe contenute su una memoria
esterna (nastro) mediante passi elementari, deniti da una opportuna funzione
di transizione.
In questa sezione presenteremo dapprima la versione pi` u semplice della
macchina di Turing e successivamente versioni pi` u complesse utili per appro-
fondire aspetti particolari del concetto di calcolo. Inoltre deniremo le nozioni
di calcolabilit`a e di decidibilit`a indotte dal modello della macchina di Turing.
170 CAPITOLO 5. MACCHINE DI TURING
5.1 Macchine di Turing a nastro singolo
Nella sua versione pi` u tradizionale una macchina di Turing si presenta come
un dispositivo che accede ad un nastro potenzialmente illimitato diviso in
celle contenenti ciascuna un simbolo appartenente ad un dato alfabeto dato,
ampliato con il carattere speciale b (blank) che rappresenta la situazione di
cella non contenente caratteri. La macchina di Turing opera su tale nastro
tramite una testina, la quale pu`o scorrere su di esso in entrambe le direzioni,
come illustrato in Figura 5.1. Su ogni cella la testina pu`o leggere o scrivere
caratteri appartenenti allalfabeto oppure il simbolo b.
a b b a

Testina
Nastro
Funzionedi
transizione
Stati
Q

Figura 5.1 Macchina di Turing.


Ad ogni istante la macchina si trova in uno stato appartenente ad un insie-
me nito Q ed il meccanismo che fa evolvere la computazione della macchina
`e una funzione di transizione la quale, a partire da uno stato e da un carat-
tere osservato sulla cella del nastro su cui `e attualmente posizionata la testina,
porta la macchina in un altro stato, determinando inoltre la scrittura di un
carattere su tale cella ed eventualmente lo spostamento della testina stessa.
Analogamente a quanto fatto per i vari tipi di automi presentati nei
capitoli precedenti, procediamo ora a denire in modo formale la versione
deterministica del modello di calcolo che stiamo considerando.
Denizione 5.1 Una macchina di Turing deterministica (MTD) `e una se-
stupla / = , b, Q, q
0
, F, ), dove `e l alfabeto dei simboli di nastro, b ,
`e un carattere speciale denominato blank, Q `e un insieme nito e non vuoto
di stati, q
0
Q `e lo stato iniziale, F Q `e linsieme degli stati nali e `e la
funzione (parziale) di transizione, denita come
: (QF) ( b) Q( b) d, s, i
in cui d, s e i indicano, rispettivamente, lo spostamento a destra, lo
spostamento a sinistra e lassenza di spostamento della testina.
Ad esempio, la Figura 5.2 illustra la transizione denita da (q
3
, b) = (q
4
, a, d).
5.1. MACCHINE DI TURING A NASTRO SINGOLO 171
a b b a
a b a a

q
3

q
4
Figura 5.2 Transizione determinata da (q
3
, b) = (q
4
, a, d).
Nel seguito, dato un alfabeto tale che b , , si indicher`a con

linsie-
me b. Le macchine di Turing deterministiche possono venire utilizzate
sia come strumenti per il calcolo di funzioni, sia per riconoscere o accettare
stringhe su un alfabeto di input , cio`e per stabilire se esse appartengano
ad un certo linguaggio oppure no. Si noti che, in realt`a, anche questo secondo
caso pu`o essere visto come il calcolo di una particolare funzione, la funzione
caratteristica del linguaggio, che, denita da

a 0, 1, assume valore 1 per


ogni stringa del linguaggio e 0 altrimenti.
Le macchine usate per accettare stringhe vengono dette di tipo riconoscito-
re, mentre quelle usate per calcolare funzioni vengono dette di tipo trasduttore.
In entrambi i casi, allinizio del calcolo, solo una porzione nita del nastro con-
tiene simboli diversi da blank che costituiscono linput del calcolo stesso. Di
ci`o si parler`a pi` u estesamente nelle Sezioni 5.1.2 e 5.2.
Introduciamo ora i concetti di congurazione e di transizione fra congura-
zioni per le macchine di Turing (sia deterministiche che non deterministiche).
5.1.1 Congurazioni e transizioni delle Macchine di Turing
La congurazione istantanea (o pi` u semplicemente congurazione) di una mac-
china di Turing `e linsieme delle informazioni costituito dal contenuto del
nastro, dalla posizione della testina e dallo stato corrente.
Una possibile rappresentazione di una congurazione `e data da una strin-
ga di lunghezza nita contenente tutti i caratteri presenti sul nastro, oltre a
172 CAPITOLO 5. MACCHINE DI TURING
un simbolo speciale corrispondente allo stato interno, posto immediatamente
prima del carattere individuato dalla posizione della testina.
Infatti, anche se la macchina di Turing `e denita come un dispositivo
operante su di un nastro innito, come si `e detto, in ogni momento solo una
porzione nita di tale nastro contiene simboli diversi da b. Per tale ragione, si
conviene di rappresentare nella congurazione la pi` u piccola porzione (nita)
di nastro contenente tutti i simboli non b includendo obbligatoriamente la
cella su cui `e posizionata la testina, come illustrato in Figura 5.3.
b b b a b b b b a b b b b b b b b
q
i
a b b b b q
i
a b b b b b
. .
Figura 5.3 Esempio di congurazione istantanea.
Ci`o premesso, deniamo il concetto di congurazione nel modo seguente.
Denizione 5.2 Si denisce congurazione istantanea o congurazione di
una macchina di Turing con alfabeto di nastro ed insieme degli stati Q, una
stringa c = xqy, con:
1. x

;
2. q Q;
3. y

b.
Linterpretazione data ad una stringa xqy `e che xy rappresenti il contenuto
della sezione non vuota del nastro, che lo stato attuale sia q e che la testina
sia posizionata sul primo carattere di y. Nel caso in cui x = abbiamo che
a sinistra della testina compaiono solo simboli b, mentre se y = b sulla cella
attuale e a destra della testina compaiono soltanto simboli b.
Nel seguito, per brevit`a, indicheremo con L

il linguaggio

delle
stringhe che possono comparire a sinistra del simbolo di stato in una congu-
razione, e con 1

il linguaggio

b delle stringhe che possono comparire


alla sua destra.
Esercizio 5.1 Dati = a, b e Q = q
0
, q
1
, q
2
, costruire un automa a stati niti
che riconosca tutte le stringhe che rappresentano congurazioni di una macchina di
Turing con alfabeto ed insieme degli stati Q.
5.1. MACCHINE DI TURING A NASTRO SINGOLO 173
Un particolare tipo di congurazione `e rappresentato dalla congurazione
iniziale. Indichiamo con tale termine una congurazione che, data una qua-
lunque stringa x

, rappresenti stato e posizione della testina allinizio di


una computazione su input x. Per quanto riguarda lo stato, ricordiamo che
per denizione esso dovr`a essere q
0
, mentre, prima di denire la posizione della
testina, `e opportuno stabilire una convenzione sulla maniera di specicare lin-
put x

su cui la macchina deve operare. La convenzione universalmente


adottata prevede che allinizio della computazione la macchina abbia il nastro
contenente tale input su una sequenza di [ x [ celle contigue, che tutte le altre
celle siano poste a b e che la testina sia inizialmente posizionata sul primo
carattere di x. Queste considerazioni ci portano alla seguente denizione.
Denizione 5.3 Una congurazione c = xqy si dice iniziale se x = , q = q
0
,
y
+
b.
Altro tipo di congurazione di interesse `e quella nale.
Denizione 5.4 Una congurazione c = xqy, con x L

, y 1

si dice
nale se q F.
Quindi, una macchina di Turing si trova in una congurazione nale se il suo
stato attuale `e uno stato nale, indipendentemente dal contenuto del nastro
e dalla posizione della testina.
1
Chiaramente, una congurazione descrive in
modo statico la situazione in cui una macchina di Turing si trova in un certo
istante. Per caratterizzare il comportamento dinamico di una macchina di
Turing, che determina il suo passaggio da congurazione a congurazione,
dobbiamo fare riferimento alla relativa funzione di transizione.
Osserviamo che, come nel caso degli automi visti nei capitoli preceden-
ti, una funzione di transizione pu`o essere rappresentata mediante matrici di
transizione e gra di transizione.
Nel caso della macchina di Turing, le colonne della matrice di transizione
corrispondono ai caratteri osservabili sotto la testina (elementi di

) e le righe
ai possibili stati interni della macchina (elementi di Q), mentre gli elementi
della matrice (nel caso di macchina di Turing deterministica) sono triple che
rappresentano il nuovo stato, il carattere che viene scritto e lo spostamento
della testina.
In Figura 5.1 `e riportata una possibile matrice di transizione per una mac-
china di Turing deterministica con alfabeto di nastro = 0, 1, , $ ed insieme
degli stati Q = q
0
, q
1
, q
2
, q
3
, q
4
, q
5
, q
6
, q
F
, dove q
F
`e lunico stato nale.
Nella rappresentazione della funzione di transizione mediante grafo i nodi
sono etichettati con gli stati e gli archi con una tripla composta dal carattere
letto, il carattere scritto e lo spostamento della testina. Pi` u precisamente,
nel grafo di transizione esiste un arco dal nodo q
i
al nodo q
j
, e tale arco `e
etichettato con la tripla a, b

, m s, d, i se e solo se (q
i
, a) = (q
j
, b, m).
1
Per denizione della funzione di transizione, una macchina di Turing che si trovi in una
congurazione nale non pu`o eettuare ulteriori passi di computazione.
174 CAPITOLO 5. MACCHINE DI TURING
0 1 * $ b
q
0
(q
1
, , d) (q
2
, $, d) - - (q
F
, b, i)
q
1
(q
1
, 0, d) (q
1
, 1, d) - - (q
3
, b, d)
q
2
(q
2
, 0, d) (q
2
, 1, d) - - (q
4
, b, d)
q
3
(q
3
, 0, d) (q
3
, 1, d) - - (q
5
, 0, s)
q
4
(q
4
, 0, d) (q
4
, 1, d) - - (q
6
, 1, s)
q
5
(q
5
, 0, s) (q
5
, 1, s) (q
0
, 0, d) - (q
5
, b, s)
q
6
(q
6
, 0, s) (q
6
, 1, s) - (q
0
, 1, d) (q
6
, b, s)
q
F
- - - - -
Tabella 5.1 Matrice di transizione.
In Figura 5.4 `e riportato il grafo di transizione corrispondente alla matrice
di Tabella 5.1.
Data una congurazione c, una applicazione della funzione di transizione
della macchina di Turing deterministica / su c permette di ottenere la
congurazione successiva c

secondo le modalit`a seguenti:


1. Se c = xqay, con x L

, y

, a

, e se (q, a) = (q

, a

, d), allora
c

= xa

y;
2. Se c = xqa, con x L

, a

, e se (q, a) = (q

, a

, d), allora c

= xa

b;
3. Se c = xaqby, con xa

, y

, b

, e se (q, b) = (q

, b

, s),
allora c

= xq

ab

y;
4. Se c = qby, con y

, b

, e se (q, b) = (q

, b

, s), allora
c

= q

bb

y;
5. Se c = xqay, con x L

, a

, e se (q, a) = (q

, a

, i),
allora c

= xq

y.
Come gi`a fatto per i modelli di macchina visti nei capitoli precedenti, la rela-
zione tra c e c

(detta denerelazione di transizione) viene indicata per mezzo


della notazione c
M
c

.
`
E chiaro a questo punto che il comportamento di una macchina di Turing
`e denito dalle regole di transizione che fanno passare da una congurazione
ad unaltra. Si noti che tali regole possono essere interpretate come regole di
riscrittura del nastro.
Ad esempio la regola (q
1
, a) = (q
2
, b, s) applicata alla congurazione
abbbbq
1
abbbbb
5.1. MACCHINE DI TURING A NASTRO SINGOLO 175
q
0
q
1
q
2
q
3
q
4
q
5
q
6
q
F
0 [ [ d
0 [ 1 [ i
b [ b [ d
0 [ 1 [ i
b [ 0 [ s
0 [ 1 [ i
[ 0 [ d
1 [ $ [ d
0 [ 1 [ i
b [ b [ d
0 [ 1 [ i
0 [ 1 [ s
0 [ 1 [ i
$ [ 1 [ d
b [ b [ i
Figura 5.4 Grafo di transizione corrispondente alla matrice in Tabella 5.1.
176 CAPITOLO 5. MACCHINE DI TURING
porta alla congurazione
abbbq
2
bbbbbbb.
Esercizio 5.2 Considerata la macchina di Turing deterministica denita in Tabella 5.1
e in Figura 5.4 e assumendo la congurazione iniziale q
0
10:
1. indicare le prime dieci congurazioni che vengono raggiunte;
2. dire quale congurazione nale viene raggiunta;
3. descrivere informalmente il comportamento della macchina su un input
generico.
5.1.2 Computazioni di Macchine di Turing
Le macchine di Turing deterministiche rappresentano uno strumento teorico
potente e generale per arontare in maniera adeguata il problema del rico-
noscimento di linguaggi. In tale contesto si parla delle macchine di Turing
come di dispositivi riconoscitori. Si noti che, dato un alfabeto di input ,
una macchina di Turing pu`o essere vista come un dispositivo che classica le
stringhe in

in funzione del tipo di computazione indotto.


Denizione 5.5 Data una macchina di Turing deterministica / con alfabeto
e stato iniziale q
0
, e dato un alfabeto di input , una stringa x

`e accettata (riutata) da / se esiste una computazione di accettazione (di


riuto) di / con c
0
= q
0
x.
Esercizio 5.3 Denire una macchina di Turing deterministica con alfabeto di input
0, 1 che accetta tutte le stringhe di lunghezza dispari e riuta tutte le altre.
In realt`a, la Denizione 5.5 non esaurisce linsieme dei possibili esiti delle
computazioni eseguite da /. Infatti, a dierenza di quanto si verica per i
modelli di automa visti nei capitoli precedenti, nel caso di una macchina di
Turing pu`o accadere che per essa non esista alcuna computazione massimale
con c
0
= q
0
x; in altre parole pu`o accadere che la computazione di / su input
x non termini.
Si osservi inoltre che, mentre per ipotesi `e possibile vericare in tempo
nito (semplicemente osservando la computazione eseguita) se / accetta o
riuta una stringa x, la verica di questo terzo caso si presenta di soluzione
meno immediata. Infatti, in tal caso losservazione di / non ci `e di aiuto, in
quanto, dopo una qualunque computazione non massimale di lunghezza nita,
non possiamo sapere se tale computazione terminer`a in un qualche istante
futuro o meno.
5.1. MACCHINE DI TURING A NASTRO SINGOLO 177
In eetti, per risolvere tale problema sarebbe necessario avere a disposi-
zione una diversa macchina di Turing /

la quale sia in grado di determinare


in un tempo nito, date / e x, se la computazione eseguita da / su input
x termina o meno. Come vedremo pi` u avanti, tale problema, detto problema
della terminazione, non `e risolubile, nel senso che non esiste alcuna macchina
di Turing con questa capacit`a.
Visto che una computazione di una macchina di Turing pu`o terminare op-
pure no, appare necessario fornire alcune precisazioni che chiariscano lambito
e la modalit`a con cui un linguaggio pu`o essere riconosciuto. Per prima cosa
occorre distinguere fra riconoscimento e accettazione di un linguaggio da parte
di una macchina di Turing.
Denizione 5.6 Sia / = , b, Q, q
0
, F, ) una macchina di Turing determi-
nistica. Diciamo che / riconosce (decide) un linguaggio L

(dove )
se e solo se per ogni x

esiste una computazione massimale q


0
x

M
wqz,
con w

, z

b, e dove q F se e solo se x L.
La denizione precedente non esprime alcuna condizione per il caso x ,

:
`e facile per`o osservare che potrebbe essere estesa introdotta una macchina di
Turing /

che verichi inizialmente se la condizione x

`e vera, ed operi
poi nel modo seguente:
se x

, si comporta come /;
altrimenti, se individua in x loccorrenza di un qualche carattere in ,
termina la propria computazione in un qualche stato non nale.
Si noti che data una macchina di Turing deterministica / non `e detto che
esista un linguaggio deciso da /: infatti ci`o `e possibile se e solo se / si ferma
per qualunque input x.
Denizione 5.7 Sia / = , b, Q, q
0
, F, ) una macchina di Turing determi-
nistica. Diciamo che / accetta un linguaggio L

(dove ) se e solo
se L = x

[ q
0
x

M
wqz, con w

, z

b, e q F.
Esercizio 5.4
i) Denire una macchina di Turing deterministica che riconosce il linguaggio L =
w w [ w a, b
+
.
ii) Denire una macchina di Turing deterministica che accetta il linguaggio L
sopra denito e che per qualche stringa x a, b

L cicla indenitamente.
Vale la pena segnalare che le convenzioni poste nellambito dei problemi
di riconoscimento di linguaggi non sono le uniche possibili.
178 CAPITOLO 5. MACCHINE DI TURING
Esercizio 5.5 Si consideri una denizione di accettazione o riuto di stringhe denita
come segue: esistono due soli stati nali q
1
, q
2
, tutte le computazioni massimali
terminano in uno stato nale ed una stringa x `e accettata se q
0
x

M
wq
1
z, mentre
`e riutata se q
0
x

M
wq
2
z.
Mostrare che questa denizione `e equivalente a quella data.
Esercizio 5.6 Si consideri una denizione di accettazione o riuto di stringhe sul-
lalfabeto denita come segue: esiste un solo stato nale q
F
, lalfabeto di nastro
contiene due simboli speciali , ^ , , tutte le computazioni massimali terminano
nello stato nale ed una stringa x `e accettata se q
0
x

M
q
F
, mentre `e riutata se
q
0
x

M
q
F
^.
Mostrare che questa denizione `e equivalente a quella data.
5.2 Calcolo di funzioni e Macchine di Turing deterministiche
Consideriamo ora le macchine di Turing deterministiche come trasduttori, cio`e
come dispositivi generali capaci di realizzare il calcolo di funzioni parziali,
denite su domini qualunque.
Consideriamo innanzi tutto il caso in cui si vogliano denire trasduttori
per il calcolo di funzioni su stringhe.
Denizione 5.8 Dato un trasduttore / = , b, Q, q
0
, F, ) ed una funzione
f :

( ), / calcola la funzione f se e solo se per ogni x

:
1. se x

e f(x) = y allora q
0
x

M
xbqy, con q F;
2. se x ,

oppure se x

e f(x) non `e denita, allora, assumendo


la congurazione iniziale q
0
x, o non esistono computazioni massimali o
esistono computazioni massimali che non terminano in uno stato nale.
Esempio 5.1 La macchina di Turing deterministica rappresentata in Figura 5.4 cal-
cola la funzione identit`a, vale a dire essa realizza la computazione q
0
x

xbq
F
x,
x 0, 1

.
Nel caso pi` u generale in cui si vogliano denire funzioni da un arbitrario domi-
nio T ad un arbitrario codominio ( ci si pu`o ricondurre ai trasduttori operanti
su stringhe individuando opportune codiche degli elementi di tali domini
sotto forma di stringhe di caratteri.
Nel caso del calcolo di una funzione intera f, ad esempio, si pu`o stabilire
che lalfabeto sia 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ma si pu`o usare un qualunque altro
5.2. CALCOLO DI FUNZIONI E MT DETERMINISTICHE 179
alfabeto e codicare i numeri interi in base [ [. Pertanto per il calcolo del
valore m = f(n) la congurazione iniziale sar`a q
0
x, dove x `e la codicazione
dellintero n nellalfabeto prescelto. Per quanto riguarda la rappresentazione
delloutput sul nastro, la congurazione nale sar`a xbqy, con q F, dove y `e
la codicazione di m nellalfabeto .
2
Esercizio 5.7 Si consideri la funzione d : IN IN tale che d(n) = 2n. Denire due
macchine di Turing che calcolano d assumendo che i naturali siano rispettivamente
rappresentati in notazione binaria e in notazione decimale.
Quanto detto si applica naturalmente anche al caso del calcolo di funzioni
con pi` u argomenti. A tal ne `e suciente osservare che una funzione a pi` u
argomenti, ad esempio da T
1
T
2
(, pu`o essere vista come una funzione ad
un solo argomento denita su un opportuno prodotto cartesiano, ad esempio
linsieme T = T
1
T
2
.
Una semplice codica per gli elementi del dominio cos` ottenuto potr`a esse-
re costituita dalla concatenazione delle codiche dei diversi argomenti separate
da un opportuno simbolo appositamente introdotto.
Esercizio 5.8 Denire una macchina di Turing che calcola la somma di due numeri na-
turali rappresentati in notazione binaria e separati dal simbolo #. Ad esempio, parten-
do dalla congurazione iniziale q
0
10#111, la macchina termina nella congurazione
nale 10#111bq1001.
Un caso particolarmente signicativo di calcolo di funzioni parziali si pre-
senta quando il codominio della funzione `e di cardinalit`a due. Tale caso in-
fatti pu`o essere interpretato come il calcolo del valore di verit`a di un predi-
cato o, come gi`a visto nella sezione precedente, come il riconoscimento di un
linguaggio.
Esercizio 5.9 Denire una macchina di Turing che, dati due naturali in notazione
binaria, separati dal simbolo #, calcola la funzione:
min(n
1
, n
2
) =
_
T se n
1
< n
2
F se n
1
n
2
2
Successivamente, nel Capitolo 8, vedremo come nella Teoria della Complessit`a assuma
rilevanza anche considerare codiche non prolisse, che rappresentino cio`e largomento del
calcolo di una funzione mediante stringhe di lunghezza sucientemente limitata rispetto al
valore dellargomento. Ad esempio, vedremo che non `e opportuno utilizzare la notazione
unaria per rappresentare i numeri naturali in quanto essa `e ridondante dato che richiede un
numero di simboli esponenziale rispetto a una notazione in base maggiore o eguale a due.
180 CAPITOLO 5. MACCHINE DI TURING
5.3 Calcolabilit`a secondo Turing
Come gi`a osservato, le macchine di Turing sono state introdotte con lo scopo
di fornire una denizione formale del concetto di calcolo. Ci`o ha permesso
di denire in particolare le nozioni di linguaggio riconosciuto da una mac-
china di Turing e di funzione calcolata da una macchina di Turing. Avendo
a disposizione quindi un concetto formale di algoritmo, possiamo riprendere
le denizioni introdotte nella Sezione 2.5 e riformularle con riferimento alle
macchine di Turing, sfruttando le denizioni date nella sezione precedente.
Denizione 5.9 Un linguaggio `e detto decidibile secondo Turing ( T-decidi-
bile) se esiste una macchina di Turing che lo riconosce.
Come abbiamo visto nellEsercizio 5.4 i linguaggi costituiti da stringhe
palindrome sono T-decidibili.
In modo naturale la denizione di T-decidibilit`a pu`o essere estesa ai pro-
blemi di decisione. Ad esempio, tenendo conto che gli automi a stati niti
sono evidentemente macchine di Turing di tipo particolare, possiamo dire che
il problema dellappartenenza di una stringa ad un linguaggio di tipo 3 `e un
problema decidibile. Esempi di problemi non T-decidibili verranno forniti nel
seguito.
Osserviamo inne una ulteriore estensione del concetto di T-decidibilit`a,
che pu`o essere applicata alla valutazione di predicati, vale a dire di funzioni
con codominio vero, falso. Ad esempio, date una qualunque grammatica
( di tipo 3 e una qualunque stringa x denita sullalfabeto di (, il predi-
cato Appartiene((, x) che risulta vero se x L(G) e falso altrimenti `e
T-decidibile.
Come detto nella Sezione 5.1, le macchine di Turing possono anche non ar-
restarsi su particolari valori dellinput. In tal caso `e opportuno fare riferimento
al concetto di semidecidibilit`a.
Denizione 5.10 Un linguaggio `e detto semidecidibile secondo Turing ( T-
semidecidibile) se esiste una macchina di Turing che lo accetta.
Si noti che, poiche ogni linguaggio riconosciuto da una MT risulta anche accet-
tato da essa, ogni linguaggio T-decidibile `e anche T-semidecidibile. Il viceversa
non `e tuttavia vero: esempi di linguaggi T-semidecidibili ma non T-decidibili
saranno illustrati nel Capitolo 7.
Naturalmente, anche il concetto di T-semidecidibilit`a pu`o essere esteso ai
problemi decisionali e ai predicati.
Esercizio 5.10 Date due stringhe x ed y, deniamo il predicato Pi` uLunga(x, y), che
risulta vero se [ x [>[ y [ e falso altrimenti. Dimostrare, denendo unopportuna
MT, che il predicato Pi` uLunga `e T-decidibile.
Concetti analoghi possono essere deniti considerando le macchine di
Turing non come riconoscitori ma come trasduttori.
5.4. MACCHINE DI TURING MULTINASTRO 181
Denizione 5.11 Una funzione `e detta calcolabile secondo Turing ( T-
calcolabile)se esiste una macchina di Turing che la calcola.
Ad esempio, la funzione illustrata nellEsempio 5.4 `e T-calcolabile.
Esercizio 5.11 Dimostrare, denendo unopportuna MT, che la funzione f :

tale che f(x) =



(x) `e T-calcolabile.
Si noti che, in base alla Denizione 5.8, una funzione T-calcolabile non `e
necessariamente una funzione totale.
Inoltre, come detto nella sezione precedente, adottando opportune rappre-
sentazioni dellinput e delloutput, ovvero degli argomenti e del valore della
funzione, il concetto di T-calcolabilit`a pu`o essere riferito a funzioni n-arie de-
nite su domini e codomini arbitrari, ad esempio funzioni booleane, funzioni
sui naturali, ecc.
`
E interessante osservare che i concetti di decidibilit`a e di calcolabilit`a basati
sul modello di calcolo introdotto da Turing hanno una validit`a che travalica
il modello stesso. Pi` u precisamente, come viene descritto in Appendice A,
tutti i tentativi fatti nellambito della logica matematica e dellinformatica
teorica di denire concetti di calcolo basati su modelli e paradigmi alternativi
alle macchine di Turing (come ad esempio quelli che introdurremo nei capitoli
successivi, vale a dire le macchine a registri, le funzioni ricorsive, ecc.) hanno
condotto a caratterizzare classi di insiemi decidibili e di funzioni calcolabili
equivalenti a quelle introdotte da Turing. Questa circostanza ha condotto alla
formulazione di un postulato che, seppure indimostrabile,
3
`e unanimemente
ritenuto valido: tale postulato, noto come Tesi di Church-Turing, aerma che
ogni procedimento algoritmico espresso nellambito di un qualunque modello
di calcolo `e realizzabile mediante una macchina di Turing. In base alla tesi di
Church-Turing in generale `e dunque possibile parlare di insieme decidibile e di
funzione calcolabile senza fare esplicito riferimento alla macchina di Turing.
5.4 Macchine di Turing multinastro
Il modello di macchina di Turing introdotto precedentemente, poiche estrema-
mente elementare, risulta in molti casi di non agevole utilizzazione nello studio
della risolubilit`a dei problemi. Ad esempio, se confrontiamo un automa a pila
con una macchina di Turing ci rendiamo conto che nel primo caso esiste una
chiara separazione tra il nastro di input e la memoria di lavoro, cosa che non
si verica nel secondo caso.
Unutile variante della macchina di Turing classica `e rappresentata dalla
macchina di Turing a pi` u nastri o multinastro (MTM), in cui si hanno pi` u
3
Una dimostrazione di tale postulato richiederebbe infatti che venisse dimostrata
lequivalenza rispetto alle macchine di Turing di tutti i possibili modelli di calcolo.
182 CAPITOLO 5. MACCHINE DI TURING
nastri contemporaneamente accessibili in scrittura e lettura che vengono con-
sultati e aggiornati tramite pi` u testine (una per nastro). Ad esempio, nel
caso del riconoscimento delle stringhe palindrome risulta utile disporre di due
nastri su entrambi i quali `e riportata la stringa in ingresso, poiche la verica
della palindromia pu`o essere ecientemente eettuata leggendo un nastro da
sinistra verso destra e laltro da destra verso sinistra.
Anche se una macchina di Turing multinastro, come vedremo, non aggiunge
potere computazionale al modello delle macchine di Turing, essa consente di
arontare determinate classi di problemi in modo particolarmente agile.
Una tipica situazione di interesse, nella quale si rivela lutilit`a della mac-
china multinastro, prevede la presenza di un nastro di input a sola lettura,
vari nastri di lavoro utilizzabili in lettura ed in scrittura ed inne un nastro
di output a sola scrittura: i nastri di input e di output sono accessibili in una
sola direzione.
5.4.1 Descrizione e funzionamento delle MTM
Denizione 5.12 Una macchina di Turing a k nastri (k 2) `e una sestupla
/
(k)
=
_
, b, Q, q
0
, F,
(k)
_
4
dove =

k
i=1

i
`e lunione dei k alfabeti di na-
stro
1
, . . . ,
k
non necessariamente distinti, Q, q
0
ed F hanno lo stesso signi-
cato che nel caso della macchina di Turing ad 1 nastro (vedi Denizione 5.1).
La funzione di transizione
(k)
`e inne denita come

(k)
: (QF)

1
. . .

k
Q

1
. . .

k
d, s, i
k
.
Il senso di questa denizione di
(k)
`e che la macchina esegue una transi-
zione a partire da uno stato interno q
i
e con le k testine una per na-
stro posizionate sui caratteri a
i
1
, . . . , a
i
k
, cio`e se
(k)
(q
i
, a
i
1
, . . . , a
i
k
) =
(q
j
, a
j
1
, . . . , a
j
k
, z
j
1
, . . . , z
j
k
) si porta nello stato q
j
, scrive i caratteri a
j
1
, . . . , a
j
k
sui rispettivi nastri e fa compiere alle testine i rispettivi spostamenti a de-
stra, a sinistra o nessuno spostamento, come specicato dagli z
j

d, s, i,
= 1, . . . , k.
Uno schema di massima per la macchina di Turing multinastro `e illustrato
nella Figura 5.5.
5.4.2 Congurazioni, transizioni e computazioni di una MTM
Nel caso di macchina multinastro la congurazione istantanea deve descrivere,
analogamente al caso di macchina a un nastro (vedi Sezione 5.1.1), lo stato
interno, i contenuti dei nastri e le posizioni delle testine. A volte, per comodit`a,
si usano macchine in cui i diversi nastri adottano alfabeti fra loro dierenti.
4
Si noti che, per semplicare la notazione, utilizzeremo lapice (k) che indica il numero di
nastri di una macchina di Turing multinastro solo quando ci`o sia reso necessario dal contesto.
5.4. MACCHINE DI TURING MULTINASTRO 183
T
1
T
2
T
k


.
.
.

Figura 5.5 Macchina di Turing a pi` u nastri.


In ogni caso per ciascun nastro si rappresenta, come per le macchine di
Turing ad un solo nastro, la minima porzione contenente caratteri distinti da
b.
Sia data la macchina di Turing multinastro /
(k)
=
_
, b, Q, q
0
, F,
(k)
_
,
con =

k
i=1

i
.
Denizione 5.13 Una congurazione istantanea di una macchina di Turing
multinastro `e una stringa del tipo
q #
1

1
#
2

2
#s #
k

k
in cui, coerentemente al caso di macchine di Turing ad un solo nastro,
i

i
e
i

i
b, per i = 1, . . . , k, essendoil simbolo che indica la
posizione di ogni testina e # un separatore non appartenente al alcun

i
che
marca linizio di ogni stringa
i

i
.
Per il concetto di congurazione nale possiamo estendere in modo naturale
la denizione data nel caso di macchina di Turing ad un solo nastro.
Denizione 5.14 Una congurazione q #
1

1
#
2

2
#s #
k

k
si
dice nale se q F.
Il concetto di congurazione iniziale di una macchina di Turing multinastro
richiede invece qualche precisazione.
`
E naturale pensare che allinizio della
184 CAPITOLO 5. MACCHINE DI TURING
computazione la macchina di Turing multinastro contenga linput x su di un
nastro ad esempio il primo, assumendo quindi che x

1
e che tutti
gli altri nastri contengano solo simboli b. Tuttavia risulta comodo adottare la
convenzione che tali nastri contengano un simbolo iniziale Z
0
,

k
i=1

i
sem-
pre presente allinizio di una computazione. Le posizioni iniziali delle testine
saranno tali che sul primo nastro il carattere osservato sia il primo carattere
della stringa di input x e che sugli altri nastri il carattere osservato sia sempre
Z
0
.
Allora, ridenendo

i
, i = 2, . . . , k, come segue:

i
=
i
b, Z
0

e tenendo conto di tale nuovo signicato in tutte le denizioni date preceden-


temente possiamo introdurre il concetto di congurazione iniziale.
Denizione 5.15 Una congurazione q #
1

1
#
2

2
#s #
k

k
si
dice iniziale se
i
= , i = 1, . . . , k,
1

1
,
i
= Z
0
, i = 2, . . . , k e q = q
0
.
Denizione 5.16 Lapplicazione della funzione di transizione
(k)
ad una
congurazione si dice transizione o mossa o passo computazionale di una
macchina di Turing multinastro.
Per indicare la transizione fra congurazioni si user`a la stessa notazione
M
denita in Sezione 5.1.1 per le macchine di Turing.
Il concetto di computazione per una macchina di Turing multinastro `e
del tutto analogo a quello delle macchine di Turing, per cui vale quanto det-
to in Sezione 5.1.2. Valgono inoltre le considerazioni svolte in Sezione 5.1.2
a proposito di macchine usate come dispositivi riconoscitori. Per il caso di
dispositivi trasduttori, si pu`o estendere facilmente quanto scritto nella Sezio-
ne 5.2 specicando quale sia la convenzione da adottare sul tipo desiderato di
congurazione nale (vedi Denizione 5.8).
Ad esempio, per una macchina di Turing multinastro / a k nastri,
possiamo dire che / calcola la funzione f
M
(x) denita come
q
0
# x# Z
0
#s # Z
0
M
q # x# f
M
(x) # b #s # b
dove q F.
Inne, osserviamo che nel caso particolare di macchina di Turing multina-
stro con un nastro di input a sola lettura monodirezionale, h nastri di lavoro
e un nastro di output a sola scrittura monodirezionale, si indicano spesso con
lalfabeto (del nastro) di input, con lalfabeto (dei nastri) di lavoro (as-
sumendo cio`e =
1
= s =
h
) e con O lalfabeto (del nastro) di output. In
questo caso si fa uso del simbolo iniziale Z
0
solo sui nastri di lavoro, in quanto
il nastro di output `e del tipo a sola scrittura.
5.4. MACCHINE DI TURING MULTINASTRO 185
Esercizio 5.12 Come `e possibile semplicare la denizione della funzione di transizione
nel caso di macchina di Turing multinastro con nastro di input unidirezionale a sola
lettura, nastro di output unidirezionale a sola scrittura e h 0 nastri di lavoro?
Concludiamo la presente sezione con un dettagliato esempio di macchina di
Turing multinastro che riconosce una classe particolare di stringhe palindrome.
Esempio 5.2 Come esempio di macchina di Turing multinastro, consideriamo il caso
di una macchina in grado di riconoscere stringhe del tipo xc x, dove x a, b
+
.
Possiamo osservare che da un punto di vista algoritmico il riconoscimento `e fa-
cilitato dalla presenza del carattere c che, non appartenendo allalfabeto su cui `e
costruita la sottostringa x, marca la ne di x e linizio di x.
Per riconoscere questo tipo di stringa si pu`o usare una macchina con due nastri
(Figura 5.6), uno di input, monodirezionale e a sola lettura, ed uno di lavoro, utilizzato
come pila.
La macchina funziona nel modo seguente: viene dapprima scandito linput copian-
dolo sul nastro di lavoro no a quando si incontra il separatore c. Quindi continua la
scansione dellinput, mentre ora il nastro di lavoro viene scandito in direzione opposta
alla precedente, e si confrontano i caratteri in input con quelli presenti sul nastro di
lavoro.
a a
b
c v a a
INPUT
Z
0 LAVORO

q
Figura 5.6 Macchina di Turing multinastro per riconoscere stringhe
palindrome.
Lalfabeto del nastro di input (o, pi` u brevemente, alfabeto di input) della mac-
china `e = a, b, c, mentre quello del nastro di lavoro `e = a, b, perche occorre
scrivere x sulla nastro di lavoro per poterla poi vericare quando si legge x. La
congurazione iniziale della macchina `e allora data da q
0
# xc x# Z
0
.
La macchina ha tre stati. Il primo, q
0
, usato per la scansione della sottostringa x,
il secondo, q
1
, per la scansione di x e il terzo, q
2
, come stato nale. Abbiamo quindi
Q = q
0
, q
1
, q
2
e F = q
2
.
Passiamo ora a descrivere le regole di transizione. Una prima coppia di regole
riguarda il caso in cui la testina del nastro di lavoro `e situata sul simbolo iniziale Z
0
e
la testina del nastro di input `e posizionata sul primo carattere; ci si trova ovviamente
186 CAPITOLO 5. MACCHINE DI TURING
in fase di copiatura. Se il primo carattere della stringa di input `e a, allora la testina
del nastro di input si deve spostare di una cella a destra, mentre sul nastro di lavoro
si deve sostituire Z
0
con a e ci si deve spostare a destra, come in Figura 5.7.
a a
b
c
b
a a
INPUT
Z
0
a
LAVORO

q
Figura 5.7 Lettura del primo carattere della stringa palindroma.
La regola risultante `e quindi
(q
0
, a, Z
0
) = (q
0
, a, d),
in cui il codominio della ha arit`a 3 poiche, a causa delle caratteristiche della mac-
china, che ad ogni passo di computazione sposta invariabilmente la testina del nastro
di input a destra, `e suciente specicare le sole azioni relative al nastro di lavoro. Se
invece il primo carattere della stringa di input `e b si ha lanaloga regola
(q
0
, b, Z
0
) = (q
0
, b, d).
Dopo aver letto il primo carattere della stringa di input, si `e sostituito il simbolo
iniziale del nastro di lavoro, e la testina di lavoro `e necessariamente posizionata su un
simbolo b. Si hanno quindi due regole del tutto analoghe alle precedenti, con la sola
dierenza che il carattere del nastro di lavoro che viene sostituito `e b anziche Z
0
:
(q
0
, a, b) = (q
0
, a, d)
(q
0
, b, b) = (q
0
, b, d).
Le quattro regole appena descritte consentono di leggere tutta la stringa x no al
carattere c escluso, copiandola sul nastro di lavoro. Non appena si legge il carattere
c, si deve passare dalla fase di copiatura, in cui lo stato `e q
0
, alla fase di verica
(Figura 5.8), in cui lo stato `e q
1
. Ci`o `e espresso dalla regola
(q
0
, c, b) = (q
1
, b, s).
Durante la fase di verica, la macchina di Turing continua a scorrere il nastro di
input da sinistra verso destra, mentre al tempo stesso esamina le celle del nastro di
lavoro da destra verso sinistra. Ad ogni passo, viene vericato che i caratteri letti sui
5.4. MACCHINE DI TURING MULTINASTRO 187
a a
b
c
b
a a
INPUT
Z
0
a a
b LAVORO

q
Figura 5.8 Fase di verica dopo la lettura del carattere c.
due nastri siano uguali.
`
E facile rendersi conto che la stringa `e palindroma se e solo
se tale condizione `e vera no a quando linput non `e stato letto completamente e se a
ne lettura la stringa copiata sul nastro di lavoro durante la prima fase `e stata riletta
completamente.
Nel generico passo della scansione di verica, in cui la stringa costruita sul nastro
di lavoro viene scandita a ritroso, si possono presentare due situazioni diverse.
La prima situazione corrisponde al caso in cui i due caratteri letti sul nastro di
input e sul nastro di lavoro siano uguali, dal che deriva che la sottostringa potrebbe
essere palindroma e che la verica va continuata. Ci`o viene rappresentato dalle due
regole
(q
1
, a, a) = (q
1
, a, s)
(q
1
, b, b) = (q
1
, b, s),
che, per lappunto, fanno s` che la verica continui sui caratteri successivi e dalla
regola
(q
1
, b, b) = (q
2
, b, i),
che corrisponde alla verica del fatto che la lettura dellinput e della stringa sul
nastro di lavoro sono terminate contemporaneamente. La conseguente accettazione
della stringa `e rappresentata dalla transizione nello stato nale q
2
.
Laltra situazione possibile corrisponde al caso in cui i caratteri siano diversi,
e si possa quindi immediatamente dedurre che la stringa non sia palindroma: tale
eventualit`a viene gestita non denendo le corrispondenti transizioni e facendo s`quindi
che la macchina di Turing termini la sua computazione in q
1
, F.
188 CAPITOLO 5. MACCHINE DI TURING
A titolo esemplicativo, si riportano di seguito le computazioni massimali
corrispondenti ai due input bacab e acb.
q
0
# bacab # Z
0
q
0
#bacab #bb
q
0
#bacab #bab
q
1
#bacab #ba
q
1
#bacab # ba
q
1
#bacabb # bba
q
2
#bacabbb # bba
q
0
# acb # Z
0
q
0
#acb #ab
q
1
#acb # a
Si osservi che mentre la prima computazione termina con una congurazione nale,
per cui `e una computazione accettante, la seconda termina con una congurazione
non nale, per cui `e una computazione riutante.
Esercizio 5.13 Denire una macchina di Turing multinastro che riconosce le strin-
ghe palindrome del tipo x x, dove x a, b
+
. Si noti che in questo caso non si
hanno separatori che consentono di individuare linizio della sottostringa x, per cui
ogni carattere letto dopo il primo potrebbe essere il primo carattere di x. Ne segue
che non `e possibile utilizzare una macchina come quella dellesempio precedente per
riconoscere tali stringhe.
5.4.3 Equivalenza tra MTM e MT
Si `e accennato sopra al fatto che le macchine di Turing multinastro hanno
lo stesso potere computazionale delle macchine a un solo nastro. In questa
sezione viene presentata la traccia della dimostrazione di come una macchina
di Turing multinastro possa venir simulata tramite una macchina di Turing
ad un solo nastro.
Nella simulazione si fa riferimento a macchine di Turing multitraccia. Tali
dispositivi sono macchine di Turing ad un nastro aventi il nastro stesso sud-
diviso in tracce: queste ultime possono essere immaginate disposte sul nastro
come le piste di un registratore multipista (vedi Figura 5.9. Cos`, se la mac-
china ha m tracce, la testina con una singola operazione pu`o accedere, per
leggere e/o scrivere, agli m caratteri disposti sulle tracce in corrispondenza
della testina stessa.
`
E molto semplice modicare una macchina di Turing in modo che simuli
una macchina con nastro ad m tracce. Se assumiamo, per generalit`a, che sulle
tracce si usino rispettivamente gli alfabeti

1
,

2
, . . . ,

m
, basta adottare per
la macchina un alfabeto

tale che [

[=[

1
s

m
[, denendo una funzione
5.4. MACCHINE DI TURING MULTINASTRO 189
t
1
t
2
t
k

.
.
.

Figura 5.9 Macchina di Turing multitraccia.


iniettiva dallinsieme

1
s

m
allinsieme

: tale funzione assumer`a in
particolare il simbolo b di

alla m-pla (b, b, . . . , b). Una notazione utile per
indicare gli elementi di

che corrispondono a elementi di

1
s

m
, e che
sar`a usata pi` u avanti nel volume, `e la seguente:
_

_
a
i
1
a
i
2
.
.
.
a
i
m
_

_
dove a
i
j

j
.
Passiamo ora a dimostrare il seguente teorema.
Teorema 5.1 Data una macchina di Turing / =
_
, b, Q, q
0
, F,
(k)
_
a k
nastri, esiste una macchina a un nastro che simula t passi di / in O(t
2
)
transizioni usando un alfabeto di dimensione O((2 [ [)
k
).
Dimostrazione. La dimostrazione `e costruttiva e consiste nel denire una
macchina di Turing /

, b, Q

, q

0
, F

) che simula /.
/

`e una macchina a un solo nastro diviso in 2k tracce: di queste k sono


destinate a contenere i caratteri presenti nei k nastri di / e le rimanenti a
marcare con il carattere le posizioni delle k testine sui k nastri di /. La
situazione `e esemplicata in Figura 5.10.
`
E chiaro che questo nastro multitraccia consente di rappresentare il con-
tenuto di ciascun nastro di / (nelle tracce di posizione pari) e la posizione
di ciascuna delle sue testine (nelle tracce di posizione dispari). La struttura
190 CAPITOLO 5. MACCHINE DI TURING






.
.
.


b
b
b
b
b
b
.
.
.
b
f
b
b
b
b
b
d
.
.
.
b
f
b
b
b
b

e
.
.
.
b
g
b
a
b
b
b
d
.
.
.
b
h

a
b
d
.
.
.
b
g
b
b
b
b
b
e
.
.
.

b
b
a
b
c
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b






.
.
.


t
1
t
2
t
3
t
4
t
5
t
6
t
2k1
t
2k
Figura 5.10 Nastro della macchina di Turing multitraccia che simula una
macchina di Turing multinastro a k nastri.
di una singola cella del nastro di /

, con le 2k tracce messe in evidenza, `e


illustrata in Figura 5.11.
Come osservato sopra, `e allora suciente adottare un alfabeto di nastro

di cardinalit`a opportuna e ssare una corrispondenza iniettiva dalle 2k-ple di


caratteri di una cella sul nastro multitraccia agli elementi di

per ottenere
una macchina di Turing con nastro rappresentante le 2k tracce desiderate. La
situazione del nastro di /

allinizio della computazione `e rappresentata in


Figura 5.12.
La funzione di transizione della / ha elementi

(k)
(q
i
, a
i
1
, . . . , a
i
k
) = (q
j
, a
j
1
, . . . , a
j
k
, z
j
1
, . . . , z
j
k
)
con z
j
1
, . . . , z
j
k
d, s, i. La corrispondente

deve, in corrispondenza di
ogni elemento della
(k)
, individuare lo stato corrente e la posizione del mar-
catore per ogni traccia per poi eettuare la transizione, cio`e scrivere caratteri,
spostare marcatori in base alla
(k)
e passare ad un altro stato interno.
Passiamo ora a valutare i costi della simulazione in termini di tempo (nu-
mero di transizioni) e in termini di cardinalit`a dellalfabeto della macchina
/

.
Ad ogni passo di /, la macchina di Turing /

deve eseguire una sequenza


di passi che consiste nel percorrere la porzione di nastro compresa tra i due
marcatori pi` u lontani. Dal momento che ad ogni passo ogni marcatore si sposta
al pi` u di una casella, per cui i marcatori si possono allontanare reciprocamente
al pi` u di due caselle, dopo t passi di /i marcatori si possono essere allontanati
5.4. MACCHINE DI TURING MULTINASTRO 191
c
i
1
b,
a
i
1

1
b
c
i
2
b,
a
i
2

2
b, Z
0

c
i
3
b,
a
i
3

3
b, Z
0

.
.
.
c
i
k
b,
a
i
k

k
b, Z
0

t
1
t
2
t
3
t
4
t
5
t
6
t
2k1
t
2k
Figura 5.11 Struttura della singola cella di nastro di /

.






.
.
.


b
b
b
b
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b

Z
0

Z
0
.
.
.

Z
0
b
b
b
b
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b
b
a
b
b
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b
b
b
b
b
b
b
.
.
.
b
b






.
.
.


t
1
t
2
t
3
t
4
t
5
t
6
t
2k1
t
2k
Figura 5.12 Situazione iniziale sul nastro della

/ per linput x = abbba.
192 CAPITOLO 5. MACCHINE DI TURING
al pi` u di 2t caselle, spostandosi a destra o a sinistra: quindi se / esegue t
passi, /

ne esegue al pi` u 2

t
i=1
i = (t
2
+t) = O(t
2
).
Per quanto riguarda invece il costo della simulazione in termini del numero
di caratteri, abbiamo, osservando che [

1
[=[
1
[ +1 e che [

i
[=[
i
[ +2
per 2 i k, e moltiplicando le cardinalit`a degli alfabeti in giuoco (vedi
Figura 5.11)
[

[= 2
k
([
1
[ +1)
k

i=2
([
i
[ +2) = O((2 max
1ik
[
i
[)
k
) (5.1)
Si noti che in caso di macchina di Turing multinastro con nastro di output
monodirezionale e a sola scrittura, come anche in altre varianti di macchine
di Turing multinastro (pi` u nastri a sola lettura e/o scrittura, pi` u nastri mo-
nodirezionali, etc.), lEquazione 5.1 rimane asintoticamente valida, subendo
variazioni solo nelle costanti. 2
Come conseguenza del teorema precedente, possiamo asserire che, data una
macchina di Turing a pi` u nastri che riconosce o accetta un linguaggio L (o,
operando come trasduttore, calcola una funzione f), esiste una macchina di
Turing a un nastro che consegue lo stesso risultato computazionale, cio`e ri-
conosce o accetta lo stesso linguaggio L (ovvero calcola la stessa funzione f).
5.5 Macchine di Turing non deterministiche
Cos` come per gli altri tipi di automi considerati in precedenza, una importan-
te variante nella struttura delle macchine di Turing `e oerta dallintroduzione
del non determinismo. Come visto nei Capitoli 3 e 4, il non determinismo pu`o
in alcuni casi accrescere il potere computazionale di un dispositivo di calco-
lo, mentre in altri ci`o non avviene. Ad esempio, gli automi a stati niti non
deterministici hanno lo stesso potere computazionale degli automi determini-
stici (vedi Teorema 3.1), mentre gli automi a pila non deterministici sono pi` u
potenti di quelli deterministici (vedi Sezione 4.5).
Nel caso delle macchine di Turing vedremo che, se non abbiamo limi-
tazioni nelle risorse (tempo, memoria) utilizzate dalla macchina, il modello
non deterministico `e equivalente dal punto di vista computazionale a quello
deterministico.
Come vedremo nel Capitolo 9, in alcuni casi in cui abbiamo invece limita-
zioni di risorse, come ad esempio nel caso di macchine di Turing che operano in
tempo polinomiale, la determinazione della relazione tra il potere computazio-
nale della macchina non deterministica e di quella deterministica rappresenta
tuttora un importante problema aperto.
Nella trattazione che seguir`a le macchine di Turing non deterministiche
saranno considerate solo come dispositivi per problemi decisionali.
5.5. MACCHINE DI TURING NON DETERMINISTICHE 193
5.5.1 Descrizione e funzionamento delle MTND
Nel caso di macchina di Turing non deterministica (MTND) la funzione di
transizione
N
`e denita, coerentemente con le Denizioni 3.7 (per gli automi
a stati niti) e 4.11 (per gli automi a pila), come funzione (parziale) sullinsieme
delle parti del codominio della funzione di transizione deterministica.
Denizione 5.17 Una Macchina di Turing non deterministica / `e una
sestupla / = , b, Q, q
0
, F,
N
), in cui `e l alfabeto dei simboli di na-
stro, b , `e un carattere speciale denominato blank, Q `e un insieme -
nito e non vuoto di stati, q
0
Q `e lo stato iniziale, F Q `e linsie-
me degli stati nali e la funzione di transizione
N
`e una funzione parziale

N
: Q

T(Q

d, s, i).
Esempio 5.3 Si consideri la macchina di Turing non deterministica / con =
a, b, c, d, Q = q
0
, q
1
, q
2
, q
3
, q
4
, q
5
, q
6
, q
7
, q
8
, q
9
, q
10
, F = q
10
e la funzione
N
denita come segue:
a b c d b
q
0
(q
0
, a, d), (q

, c, d) (q
0
, b, d), (q

, c, d)
q
1
(q
1
, a, d), (q

, d, s) (q
1
, b, d)
q
2
(q
2
, a, d) (q
2
, b, d), (q

, d, s)
q
3
(q
3
, a, s) (q
3
, b, s) (q
4
, c, d)
q
4
(q
6
, c, d) (q
7
, c, d)
q
5
(q
5
, a, d) (q
5
, b, d) (q
7
, d, d)
q
6
(q
6
, a, d) (q
6
, b, d) (q
8
, d, d)
q
7
(q
9
, d, s) (q
7
, d, d)
q
8
(q
9
, d, s) (q
8
, d, d)
q
9
(q
3
, a, s) (q
3
, b, s) (q
10
, x, i) (q
9
, d, s)
q
10

La macchina di Turing /, che ha grado di non determinismo (/) = 2, data
una stringa di input x a, b

, la accetta se e solo se esiste una stringa y a, b

con [ y [ 2 tale che x = uyyv, con u, v a, b

.
Date due congurazioni c, c

, indicheremo ancora con c


M
c

il fatto che c
e c

siano legate dalla relazione di transizione denita dalla macchina non


deterministica /, o, in altre parole, la possibilit`a di ottenere c

in corri-
spondenza ad una scelta di applicazione di
N
su c. Ad esempio, nel caso
della macchina di Turing non deterministica dellEsempio 5.3, abbiamo che,
mediante applicazione della
N
, aabq
2
bbab
M
aaq
3
bdbab. Inoltre, abbiamo
anche aabq
2
bbab
M
aabbq
2
bab.
Alla luce di quanto detto, possiamo estendere alle macchine di Tu-
ring non deterministiche i concetti di computazione, computazione massima-
le, computazione di accettazione e computazione di riuto introdotti nella
Sezione 2.5.
194 CAPITOLO 5. MACCHINE DI TURING
Esempio 5.4 Con riferimento alla macchina di Turing non deterministica vista nel-
lEsempio 5.3 si pu`o osservare che a partire dalla congurazione iniziale q
0
abab essa
d`a luogo alle seguenti computazioni.
1. q
0
abab
M
cq
1
bab
M
cbq
1
ab
M
cq
3
bdb
M
q
3
cbdb
M
cq
4
bdb
M
ccq
5
db
M
ccdq
7
b
M
ccq
9
dd
M
ccq
10
dd
2. q
0
abab
M
cq
1
bab
M
cbq
1
ab
M
cbaq
1
b
M
cbabq
1
b
3. q
0
abab
M
aq
0
bab
M
acq
2
ab
M
acaq
2
b
M
acq
3
ad
M
aq
3
cad
M
acq
4
ad
M
accq
6
d
M
accdq
8
b
4. q
0
abab
M
aq
0
bab
M
acq
2
ab
M
acaq
2
b
M
acabq
2
b
5. q
0
abab
M
aq
0
bab
M
abq
0
ab
M
abcq
1
b
M
abcbq
1
b
6. q
0
abab
M
aq
0
bab
M
abq
0
ab
M
abaq
0
b
M
abacq
1
b
7. q
0
abab
M
aq
0
bab
M
abq
0
ab
M
abaq
0
b
M
ababq
0
b.
Naturalmente, come nel caso degli automi a stati niti e degli automi a pila
non deterministici, anche il comportamento di una MTND pu`o essere descritto
mediante un albero, i cui rami sono costituiti da tutte le computazioni che la
macchina realizza a partire dalla congurazione iniziale. In Figura 5.13 lin-
sieme delle computazioni elencate nellEsempio 5.3 viene rappresentato come
albero di computazione.
Sia / = , b, Q, q
0
, F,
N
) una macchina di Turing non deterministica.
Denizione 5.18 Dato un alfabeto , una stringa x

`e accettata
dalla macchina / se esiste una computazione accettante c
0
, . . . , c
n
di /, con
c
0
= q
0
x.
Denizione 5.19 Dato un alfabeto , una stringa x

`e riutata
dalla macchina /se tutte le computazioni di /, a partire dalla congurazione
q
0
x, sono riutanti.
Esempio 5.5 Come si pu`o vedere, la stringa abab `e accettata dalla MTND dellE-
sempio 5.3 in quanto una delle computazioni (la numero 2, in particolare), termina
in una congurazione di accettazione.
Esempio 5.6 La stringa ab `e riutata dalla MTND dellEsempio 5.3 poiche, a partire
dalla congurazione iniziale q
0
ab, tutte le computazioni sono riutanti.
1. q
0
ab
M
aq
0
b
M
aq
0
bb
2. q
0
ab
M
cq
1
b
M
cbq
1
b
5.5. MACCHINE DI TURING NON DETERMINISTICHE 195
q
0
abab
cq
1
bab
aq
0
bab
cbq
1
ab
acq
2
ab
abq
0
ab
cq
3
bdb
cbaq
1
b
acaq
2
b
abcq
1
b
abaq
0
b
ccq
10
dd
cbabq
1
b
acq
3
ad accdq
8
b
acabq
2
b
abcbq
1
b
ababq
0
b


Figura 5.13 Albero di computazione della MTND dellEsempio 5.3 su input
abab.
3. q
0
ab
M
aq
0
b
M
acq
2
b
Si osservi, come al solito, la asimmetria delle condizioni di accettazione e
di riuto di una stringa: nel primo caso, `e suciente raggiungere una con-
gurazione nale, nel secondo caso, `e necessario che si giunga, nel corso della
computazione, solo a congurazioni che non siano nali e sulle quali, al tempo
stesso, non sia applicabile la funzione di transizione
N
. Le implicazioni di tale
asimmetria risulteranno pi` u chiare nei Capitoli 8 e 9, nei quali considereremo
il problema di caratterizzare il numero di transizioni richieste da macchine di
Turing, deterministiche e non, per accettare o riutare stringhe. In quella sede
vericheremo quali problemi insorgano per operare tale caratterizzazione nel
caso di macchine non deterministiche.
Come annunciato precedentemente, non prendiamo in considerazione in
questa sede lutilizzazione di MTND come trasduttori, cio`e come dispositivi
per il calcolo di funzioni. Infatti, come si pu`o comprendere tenendo conto
del funzionamento di una macchina non deterministica, un trasduttore non
deterministico pu`o pervenire a dierenti risultati operando diverse scelte nel-
lalbero delle computazioni, dando cos` luogo al calcolo di funzioni multivalore,
argomento che esula dagli scopi del presente volume.
196 CAPITOLO 5. MACCHINE DI TURING
5.5.2 Equivalenza tra MT ed MTND
Si `e visto nella Sezione 5.4.3 che il tentativo di rendere le macchine di Turing
pi` u potenti tramite laggiunta di un numero arbitrario di nastri ha avuto lesito
di renderle pi` u ecienti, ma non computazionalmente pi` u potenti. Lo stesso
vale per le macchine di Turing non deterministiche: benche queste possano
essere notevolmenti pi` u ecienti delle macchine di Turing deterministiche, esse
non sono computazionalmente pi` u potenti, poiche una macchina di Turing pu`o
simulare una macchina di Turing non deterministica.
La simulazione si ottiene facendo in modo che la macchina di Turing vi-
siti tutti i nodi dellalbero delle computazioni. Come vedremo, la visita deve
venir condotta in ampiezza e non in profondit`a, per evitare che la macchi-
na di Turing, visitando un ramo innito, non possa esaminare altri cammini
nellalbero. Consideriamo per semplicit`a, ma senza perdere generalit`a, la si-
mulazione di una macchina di Turing non deterministica / ad 1 nastro: per
la simulazione si pu`o usare una macchina di Turing deterministica /
D
con tre
nastri, uno di input e due di lavoro, di cui il primo per memorizzare i possibili
percorsi dalla radice no ad un generico nodo e il secondo per la simulazione
vera e propria (vedi Figura 5.14). Ad ogni transizione, /
D
controlla lo stato
di / raggiunto: se esso `e nale si ferma, altrimenti procede nella visita.
INPUT
POSSIBILI PERCORSI
SIMULAZIONE

/
D
Figura 5.14 Macchina di Turing deterministica che simula una macchina di
Turing non deterministica
Teorema 5.2 Per ogni macchina di Turing non deterministica / esiste una
macchina di Turing deterministica /
D
a 3 nastri equivalente.
Dimostrazione. Esaminiamo luso dei 3 nastri di /
D
. Nel primo nastro di
/
D
viene copiata la congurazione iniziale di /.
5.5. MACCHINE DI TURING NON DETERMINISTICHE 197
Il secondo nastro di /
D
viene usato in modo pi` u articolato. In gene-
rale, per ogni coppia stato-simbolo di / esiste un certo numero, limitato
da d = (/), di scelte per il passo successivo e quindi di congurazioni
deterministiche successive.
Per ogni i > 0, un cammino di computazione di lunghezza i si pu`o quindi
individuare mediante una sequenza di i interi compresi tra 1 ed d, ciascuno dei
quali determina la transizione da scegliere tra le al pi` u d alternative possibili
ad ogni passo.
5
Sul secondo nastro vengono allora generate, in ordine lessi-
cograco, tutte le stringhe di lunghezza via via crescente prima la stringa
di lunghezza zero, poi tutte quelle di lunghezza uno, poi tutte quelle di lun-
ghezza due, ecc. composte di interi compresi tra 1 ed d. Ogni possibile
computazione di / `e rappresentata da una di tali stringhe.
Si osservi che, in generale, non tutte queste stringhe rappresentano cam-
mini di computazione: ci`o `e determinato dal fatto che non `e detto che per ogni
congurazione deterministica attraversata siano possibili tutte le d scelte per
il passo di computazione successivo.
Sul terzo nastro di /
D
viene eseguita la simulazione vera e propria, ed
inizialmente esso contiene solo simboli b.
La simulazione procede per fasi, una fase per ogni sequenza generata sul
nastro 2. Assumendo che i
1
, i
2
, . . . , i
k
sia la sequenza contenuta su tale nastro,
vengono eseguite le seguenti azioni:
1. linput x `e copiato dal nastro 1 al nastro 3;
2. si pone j = 1;
3. se [
N
(q, a)[< i
j
la fase termina con esito negativo;
4. altrimenti, detta (q

, a

, r) la i
j
-esima terna (nellordinamento arbitrario
pressato) in
N
(q, a), si applica la corrispondente transizione sul nastro
3;
5. si incrementa j di 1;
6. se j < k, si torna al passo 2;
7. se j = k e si `e raggiunta una congurazione nale, si termina con esito
positivo, altrimenti la fase termina con esito negativo.
Assumiamo che in / esista un cammino che porta ad una congurazione na-
le e sia l la sua lunghezza: esiste allora sicuramente una fase della simulazione
che `e associata a una sequenza, di lunghezza l, sul secondo nastro che indivi-
dua tale cammino. La simulazione di questa sequenza porter`a ad uno stato
nale. Se, viceversa, un siatto cammino non esiste, allora /
D
non potr`a mai
raggiungere uno stato nale.
5
A tale scopo `e suciente introdurre un ordinamento (arbitrario) sugli elementi di Q

{d, s, i}.
198 CAPITOLO 5. MACCHINE DI TURING
Se la macchina non deterministica / accetta una stringa in k 0 passi,
allora /
D
esegue al pi` u

k
j=0
jd
j
passi. Tenendo conto del fatto che
k

j=0
d
j
=
d
k+1
1
d 1
e che, derivando entrambi i membri delleguaglianza rispetto a d, si ottiene
k

j=1
jd
j1
=
kd
k+1
(k + 1)d
k
+ 1
(d 1)
2
abbiamo che

k
j=0
jd
j
= d

k
j=1
jd
j1
= O(kd
k
). 2
Come si vede, la simulazione fornita nel teorema precedente comporta un
aumento esponenziale del tempo di accettazione di una stringa rispetto al
tempo richiesto dalla macchina non deterministica. Attualmente non `e noto
se esista una simulazione signicativamente pi` u eciente di quella presentata.
Come vedremo nel Capitolo 9, ci sono valide ragioni per ritenere che non
sia possibile simulare una macchina di Turing non deterministica tramite una
macchina di Turing deterministica con un numero di passi sub-esponenziale.
Tuttavia ci`o non `e mai stato dimostrato, e la verit`a o meno di tale congettura
rappresenta un importante problema aperto nellinformatica teorica.
La dimostrazione del Teorema 5.2 ci permette di introdurre una ulterio-
re interpretazione del non determinismo. Da tale dimostrazione possiamo
osservare che una macchina di Turing deterministica `e in grado di simulare
ecientemente una macchina di Turing non deterministica se `e in possesso di
una informazione aggiuntiva (la stringa di caratteri in 1, . . . , d) che la guida
verso una congurazione di accettazione, se tale congurazione esiste.
Se L `e il linguaggio accettato da una macchina di Turing non deterministica
/ allora, per ogni stringa x L, una sequenza di scelte c 1, . . . , d

che
conduca / con input x ad una congurazione di accettazione pu`o essere vista
come una prova dellappartenenza di x ad L.
Tutto ci`o ci permette di concludere che, mentre per determinare se una
stringa x verica una determinata propriet`a (cio`e se x L) appare necessario
cercare lesistenza di una opportuna prova c, data una stringa c, la verica
che essa costituisce una prova dellappartenenza di x a L pu`o essere eettuata
in tempo sensibilmente inferiore. Una discussione pi` u approfondita di questi
aspetti sar`a svolta nel Capitolo 9.
Esercizio 5.14 Formalizzare il concetto di macchina di Turing multinastro non de-
terministica e dimostrare che le macchine di Turing multinastro non deterministiche
sono equivalenti alle macchine di Turing multinastro.
5.6. RIDUZIONE DELLE MACCHINE DI TURING 199
5.6 Riduzione delle Macchine di Turing
Dopo aver visto che macchine di Turing deterministiche con un solo nastro pos-
sono simulare macchine non deterministiche e/o a pi` u nastri, apparentemente
pi` u potenti, osserviamo che, addirittura, le macchine di Turing possono essere
semplicate ulteriormente senza che si perda nulla in potere computazionale.
Una prima semplicazione si ottiene limitando le caratteristiche del nastro
di una macchina di Turing: non pi` u innito in entrambe le direzioni bens` nito
in una direzione ed innito nellaltra. Si parla in questo caso di macchina di
Turing con nastro semi-innito.
Teorema 5.3 Per ogni macchina di Turing / = , b, Q, q
0
, F, ) esiste una
macchina di Turing /

equivalente con nastro semi-innito.


Dimostrazione. Sia /

, b, Q

, q

0
, F

). Si assuma un determinato
punto sul nastro di / come origine e, di conseguenza, si consideri il nastro
come suddiviso in due nastri semi-inniti, comprendenti luno tutte le celle a
destra e laltro tutte le celle a sinistra dellorigine. Questa sar`a scelta in modo
che, nella congurazione iniziale, linput x sia contenuto nelle prime [ x[ celle
del nastro di destra, mentre laltro nastro `e vuoto.
Il nastro di /

viene organizzato in modo da rappresentare i due nastri


in cui abbiamo suddiviso quello di / e la posizione della testina. A tal ne,
consideriamo il nastro di /

diviso in tre tracce di cui la superiore rappresenta


il seminastro sinistro di /, la inferiore il seminastro destro e la centrale la
posizione della testina (vedi Figura 5.15). La prima cella del nastro di /

contiene un simbolo speciale che segnala linizio del nastro, ad esempio b in


corrispondenza della tracce superiore e inferiore e in corrispondenza di quella
centrale. Inoltre sulla traccia centrale tutte le altre celle conterranno il simbolo
b, eccetto che in corrispondenza della cella osservata dalla testina di /, dove
sar`a presente il carattere . Allinizio della computazione la traccia inferiore
contiene linput di /, quella superiore solo una sequenza di b, mentre quella
centrale contiene tutti b fatta eccezione per la prima cella, ove `e presente il
simbolo , e per la seconda cella, ove `e presente il simbolo .
Linsieme degli stati Q

contiene due stati q

i
e q

i
per ciascuno stato q
i
Q.
Se /a un certo istante si trova nello stato q
i
allora /

durante la simulazione
di / si trover`a nello stato q

i
o in q

i
, a seconda che il carattere osservato in
/ sia rappresentato, rispettivamente, sulla traccia superiore o inferiore del
nastro di /

. Linsieme Q

contiene anche 2 [ Q[
2
stati del tipo q

i,j
e q

i,j
in
cui /

transisce provvisoriamente durante la simulazione della transizione di


/ da q
i
a q
j
, che /

deve eettuare in due passi. In base a quanto detto,


per lo stato iniziale si ha q

0
= q

0
.
Per ogni regola (q
h
, a
i
) = (q
j
, a
k
, d) in /, in /

sono denite le
200 CAPITOLO 5. MACCHINE DI TURING
transizioni:

_
_
_q

h
,
_

_
a
i

c
_

_
_
_
_ =
_
_
_q

h,j
,
_

_
a
k
b
c
_

_, s
_
_
_ c

_
_
_q

h,j
,
_

_
c

b
c

_
_
_
_ =
_
_
_q

j
,
_

_
c

_, i
_
_
_ c

, c



,
che simulano la transizione di / nel caso in cui a si trovi sulla traccia
superiore,

_
_
_q

h
,
_

_
c

a
i
_

_
_
_
_ =
_
_
_q

h,j
,
_

_
c
b
a
k
_

_, d
_
_
_ c

_
_
_q

h,j
,
_

_
c

b
c

_
_
_
_ =
_
_
_q

j
,
_

_
c

_, i
_
_
_ c

, c



,
che simulano la transizione di /nel caso in cui a si trovi sulla traccia inferiore,

_
_
_q

h,j
,
_

_
b
*
b
_

_
_
_
_ =
_
_
_q

j
,
_

_
b

b
_

_, d
_
_
_

_
_
_q

h,j
,
_

_
b
*
b
_

_
_
_
_ =
_
_
_q

j
,
_

_
b

b
_

_, d
_
_
_,
che simulano transizioni di /che portano la testina da una cella rappresentata
sulla traccia superiore di /

ad una cella rappresentata sulla traccia inferiore


(o viceversa).
Analoghe transizioni vanno introdotte in corrispondenza a regole del tipo
(q
h
, a
i
) = (q
j
, a
k
, s).
Nel caso invece di regole del tipo (q
h
, a
i
) = (q
j
, a
k
, i), in /

sono denite
le transizioni:

_
_
_q

h
,
_

_
a
i

c
_

_
_
_
_ =
_
_
_q

j
,
_

_
a
k

c
_

_, i
_
_
_ c

_
_
_q

h
,
_

_
c

a
i
_

_
_
_
_ =
_
_
_q

j
,
_

_
c

a
k
_

_, i
_
_
_ c

5.6. RIDUZIONE DELLE MACCHINE DI TURING 201


Linsieme degli stati nali di /

, inne, `e denito come F

= q

i
, q

i
[ q
i
F.
2
Esercizio 5.15 Dimostrare, per induzione sulla lunghezza della computazione, che
/

simula correttamente /.
a a
b
c a
b
b
a a
*

c a
b
b
b b
b




-3 -2 -1 0 1 2
-1 -2 -3
0 1 2
(a)
(b)
Figura 5.15 (a) Nastro di una macchina di Turing e (b) nastro semi- innito
a tre tracce usato per la sua simulazione.
Una seconda versione di macchina di Turing semplicata si ottiene ridu-
cendo la dimensione dellalfabeto. Tenendo conto della possibilit`a di codicare
qualunque carattere di un alfabeto nito utilizzando due soli simboli, `e sempli-
ce mostrare che `e possibile ridurre la cardinalit`a dellalfabeto a 1 e, quindi,
la cardinalit`a di [

[ a 2. Data una macchina / = , b, Q, q


0
, F, ), si pu`o in-
fatti costruire la macchina equivalente /

, b, Q

, q

0
, F

), con [

[= 1,
denendo una opportuna codica dei caratteri di

tramite quelli di

. Ad
esempio, possiamo codicare linsieme

= a, b, c, d, b tramite

= 1, b
come illustrato in Tabella 5.2.
Inoltre, per ogni regola di transizione della macchina /, prevediamo una
serie di regole di transizione della macchina /

che svolgono le seguenti azioni:


determinazione del carattere originario osservato;
eventuale modica di tale carattere;
eventuale spostamento della testina in corrispondenza della codica del
carattere pi` u a destra o pi` u a sinistra di quello osservato correntemente.
202 CAPITOLO 5. MACCHINE DI TURING
b = bbb
a = bb1
b = b1 b
c = b11
d = 1 bb
Tabella 5.2 Esempio di codica per ridurre la cardinalit`a dellalfabeto di una
macchina di Turing.
Ad esempio, assumendo sempre la codica vista in Tabella 5.2, la regola
(q
i
, a) = (q
k
, b, d) della macchina / d`a luogo, nella macchina /

, alle
seguenti regole:

(q
i
, b) = (q
i,b
, b, d)

(q
i,b
, b) = (q
i,bb
, b, d)

(q
i,bb
, 1) = (q
i,bb1
, b, s)

(q
i,bb1
, b) =
_
q

i,bb1
, b, s
_

_
q

i,bb1
, b
_
=
_
q

i,bb1
, b, d
_

_
q

i,bb1
, 1
_
=
_
q

i,bb1
, 1, d
_

_
q

i,bb1
, b
_
= (q
k
, b, d) ,
dove il signicato degli stati utilizzati `e il seguente:
1. /

in q
i
: / in q
i
con la testina di/

sul primo carattere della codica


del carattere corrente di /;
2. /

in q
i,b
: come sopra, ma la testina di /

, dopo aver letto il simbolo


b, si trova sul secondo carattere della codica del carattere corrente di
/;
3. /

in q
i,bb
: come sopra, ma la testina di /

, dopo aver letto la coppia


di simboli bb, si trova sul terzo ed ultimo carattere della codica del
carattere corrente di /;
4. /

in q
i,bb1
: come sopra, ma la testina di /

, dopo aver letto i tre


simboli bb1, ha aggiornato il terzo carattere della codica del carattere
corrente di /;
5.7. DESCRIZIONE LINEARIZZATA DELLE MT 203
5. /

in q

i,bb1
: come sopra, ma la testina di /

, dopo aver letto i tre


simboli bb1, ha aggiornato il secondo carattere della codica del carattere
corrente di /;
6. /

in q

i,bb1
: come sopra, ma la testina di /

, dopo aver letto i tre


simboli bb1, ha aggiornato tutti i caratteri della codica del carattere
corrente di /;
7. /

in q

i,bb1
: come sopra, si `e aggiornato il contenuto del nastro e si deve
spostare la testina una cella a destra;
8. /

in q
k
: la transizione `e stata simulata, / si trova in q
i
con la testina
di/

sul primo carattere della codica del carattere corrente di /.


`
E possibile dunque giungere alla dimostrazione del seguente teorema.
Teorema 5.4 Per ogni macchina di Turing / = , b, Q, q
0
, F, ) esiste una
macchina di Turing /

, b, Q

, q

0
, F

), con [

[= 1, equivalente a /.
Esercizio 5.16 Completare nei dettagli la dimostrazione precedente.
Come si `e visto in questo risultato, la riduzione del numero dei caratteri
comporta un aumento del numero di stati. Non `e dicile vericare che una
relazione di questo genere si presenta frequentemente nelle macchine a stati.
Una situazione analoga si `e presentata nellambito dello studio degli automi
a pila, quando si `e visto (vedi Teorema 4.17) che `e possibile realizzare, per
ogni linguaggio CF, un automa a pila con un solo stato, a patto di aumentare
considerevolmente il numero di simboli di pila utilizzati.
5.7 Descrizione linearizzata delle Macchine di Turing
Nella trattazione delle macchine di Turing svolta no a questo punto, non
abbiamo mai sfruttato la possibilit`a di creare macchine pi` u complesse a par-
tire da macchine pi` u elementari gi`a denite. Questa possibilit`a, non molto
dissimile da quella di realizzare automi a stati niti pi` u complessi tramite lo-
perazione di concatenazione di automi pi` u semplici, si rivela utile nellanalisi
delle propriet`a delle MT che vedremo nel resto di questo capitolo.
Il concetto che `e alla base delluso di macchine pi` u elementari nella sintesi
di nuove macchine `e quello di composizione per diramazione condizionata.
Essa consiste nel far subentrare ad una macchina arrestatasi in un stato nale
altre macchine, a seconda del carattere osservato nello stato nale dalla prima
macchina.
Supponiamo di avere a disposizione le seguenti tre macchine: la prima, /
(vedi Figura 5.16), che fa passare dalla congurazione q
0
xa
i
alla congurazione
xq
F
a
i
con a
i
= 0, 1 e x

.
204 CAPITOLO 5. MACCHINE DI TURING
q
0
q
F
0/0/d
1/1/d
b/ b/ s
/
Figura 5.16 Macchina /.
La seconda, /
1
(vedi Figura 5.17), che semplicemente scrive il carattere
1.
q
0
q
F
1/1/i
0/1/i
b/1/i
/
1
Figura 5.17 Macchina /
1
.
La terza, /
2
(vedi Figura 5.18), che semplicemente scrive il carattere 0.
q
0
q
F
1/0/i
0/0/i
b/0/i
/
2
Figura 5.18 Macchina /
2
.
Orbene, se vogliamo far subentrare la macchina /
1
quando la macchina
/ si arresta, non abbiamo da fare altro che collegare lo stato nale di / con
lo stato iniziale di /
1
mediante la transizione
-
0/0/i
1/1/i
Se invece vogliamo collegare a scelta /
1
o /
2
a seconda che il carattere
a
i
sia 0 o 1, possiamo comporre tali macchine costruendo il diagramma in
Figura 5.19
5.7. DESCRIZIONE LINEARIZZATA DELLE MT 205
q
0
q
F
0/0/d
1/1/d
b/ b/ s
q
01
q
F1
1/1/i
0/1/i
b/1/i
q
0
2
q
F
2
1/0/i
0/0/i
b/0/i
1/1/i
0/0/i
q
0
q
F
0/0/d
1/1/d
b/ b/ s
q
01
q
F1
1/1/i
0/1/i
b/1/i
q
0
2
q
F
2
1/0/i
0/0/i
b/0/i
Figura 5.19 Composizione delle macchine /, /
1
, /
2
.
La composizione di /, /
1
, /
2
`e rappresentabile anche come
/

3
Q
Qs
/
1
/
2
1
0
Gli stati nali della macchina cos` ottenuta sono q
F1
e q
F2
, mentre q
0
`e lo
stato iniziale.
Questa nozione intuitiva di composizione di macchine pu`o essere formaliz-
zata come segue.
Denizione 5.20 Siano / = , b, Q, q
0
, F, ) e /
i
=
i
, b, Q
i
, q
0i
, F
i
,
i
),
i 1, . . . , n, 1 i n macchine di Turing tali che =
1
= =
n
=
a
1
, . . . , a
r
e QQ
h
= Q
i
Q
j
= , per 1 h n e 1 i < j n.
6
Diremo
che /

, b, Q

, q

0
, F

) `e ottenuta tramite composizione per diramazione


condizionata da /, /
1
, . . . , /
n
se valgono le seguenti propriet`a:

= ,
Q

= Q Q
1
Q
n
, q

0
= q
0
, F

= F
1
F
n
,

(q, a) = (q, a)
q Q F,

(q, a) =
i
(q, a) q Q
i
, 1 i n,

(q, a
j
) = (q
0h
j
, a
j
, i),
1 h
j
n, 1 j r, q F.
La macchina /

pu`o essere cos` rappresentata:


6
Se tali propriet`a non valgono possono essere semplicemente imposte poiche se gli
stati interni non sono disgiunti, essi possono essere ridenominati e se gli alfabeti non sono
coincidenti possiamo estenderli banalmente al minimo alfabeto che li include tutti.
206 CAPITOLO 5. MACCHINE DI TURING
/

3
/
h1 a
1
-
/
h2
A
A
A
AU
/
hr
a
r
.
.
.
`
E chiaro che pu`o accadere che alcune delle macchine /
1
, /
2
, . . . , /
r
coin-
cidano fra loro. Inoltre, nel caso particolare n = 1 abbiamo /

= //
1
,
ove lindicazione della diramazione condizionata scompare. Un altro caso
particolare interessante `e quando una delle macchine verso cui / si dira-
ma coincide con / stessa e tutte le altre coincidono fra loro. In tal caso, la
rappresentazione graca diventa:
/

=//
1

1
In quanto segue vogliamo mostrare come alcune macchine elementari, com-
poste per diramazione, permettano di sintetizzare tutte le macchine di Turing
ad un nastro e due caratteri. Poiche sappiamo che le macchine di Turing ad
un nastro e due caratteri possono simulare macchine di Turing di tipo pi` u ge-
nerale, ne consegue la possibilit`a di esprimere qualunque macchina di Turing
come un diagramma in cui gurano solo macchine elementari.
Denizione 5.21 Chiamiamo macchine di Turing elementari le macchine [,
2, d, s, /
0
denite sullalfabeto = 1 nel modo seguente:
q
0
q
F
1/1/i
b/1/i
: [ scrive il carattere 1
q
0
q
F
1/b/i
b/b/i
:
scrive il carattere b
q
0
q
F
1/1/d
b/b/d
:
d sposta la testina a destra
q
0
q
F
1/1/s
b/b/s
: s sposta la testina a sinistra
q
0
q
F
1/1/i
b/b/i
: /
0
non esegue alcuna operazione.
5.7. DESCRIZIONE LINEARIZZATA DELLE MT 207
Esempio 5.7 Sintetizziamo con macchine elementari la macchina ( che realizza la
computazione
7
q
0
bxb

bxq
F
bx, dove x 1

.
d d d [ s s [ /
0
1 1 1 1
b
1
Teorema 5.5 Ogni macchina di Turing `e rappresentabile come composizione
per diramazione delle macchine elementari e, viceversa, ogni diagramma di
composizione di macchine elementari `e una rappresentazione di una macchina
di Turing.
Dimostrazione. La seconda parte `e del tutto ovvia poiche, come abbiamo
visto, componendo diagrammi di stato di macchine di Turing, si ottengono
ancora diagrammi di stato di macchine di Turing. Per dimostrare la prima
parte osserviamo che ad ogni stato non nale di una macchina di Turing pos-
siamo associare un piccolo diagramma che utilizza le macchine elementari. Sia
q
i
un generico stato e siano (q
i
, 1) = (q
h
, a
h
, t
h
) e (q
i
, b) = (q
k
, a
k
, t
k
) dove
a
h
, a
k
1, b e t
h
, t
k
s, d, i i relativi valori della funzione di transizione.
A tale stato possiamo far corrispondere il diagramma:
/
0

3
Q
Qs
S
h
T
h
S
k
T
k
b
1
dove
e
S

=
_
_
_
[ se a

= 1
2 se a

= b
T

=
_

_
d se t

= d
s se t

= s
/
0
se t

= i
ed = h o, rispettivamente, = k. Il diagramma corrispondente allo stato q
i
dovr`a poi collegarsi ai diagrammi corrispondenti agli stati q
h
e q
k
. Ripetendo
per ogni stato lo stesso ragionamento e connettendo i diagrammi otteniamo lo
schema generale:
7
Si noti che, per evitare di indicare esplicitamente gli stati delle macchine ottenute per
composizione di macchine elementari, nel rappresentare le congurazioni iniziali e nali di
una computazione ci limiteremo ad indicare con una sottolineatura il simbolo osservato dalla
testina. Scriveremo dunque:
xa
i
y

ua
j
v anziche : xq0aiy

uqF ajv.
208 CAPITOLO 5. MACCHINE DI TURING
/

3
1
S
h
T
h
b
Q
Qs
S
k
T
k
q
0
q
1
. . .
-
q
k
-
q
h
q
i
. . .
q
n
Per quanto riguarda gli stati nali, ad essi potr`a essere associata semplicemente
la macchina /
0
. 2
Si noti che dalla dimostrazione segue che per realizzare una macchina con
n stati, occorrono al pi` u 5n macchine elementari. Inoltre, se ogni stato non
nale viene rappresentato nella forma linearizzata:
/
0
S
k
T
k
S
h
T
h
q
k
q
h
1
si vede intuitivamente che ogni macchina di Turing pu`o essere rappresentata
da un diagramma linearizzato in cui le connessioni sono stabilite mediante salti
condizionati o incondizionati.
Luso dei diagrammi linearizzati per le macchine di Turing ci consente
di individuare con un identicatore A una determinata macchina e di usare
tale identicatore nella sintesi di macchine pi` u complesse, in luogo del dia-
gramma linearizzato della stessa macchina A. Si noti che, in questo contesto,
deniremo il comportamento delle macchine di Turing che introdurremo sem-
plicemente fornendo la congurazione iniziale e quella nale. Nel caso che
le macchine venissero avviate su una congurazione iniziale dierente, il loro
comportamento non sarebbe predeterminato.
Esempio 5.8
i) macchina T: cerca il primo spazio a destra.
T = d /
0
1
La macchina T realizza la seguente computazione:
q
0
1 . . . 1 b

1 . . . 1 q
F
b
(il simbolo indica un carattere che `e indierentemente 1 o b)
5.7. DESCRIZIONE LINEARIZZATA DELLE MT 209
ii) macchina o: cerca il primo spazio a sinistra.
o =
s /
0
1
La macchina o realizza la seguente computazione:
b 1 . . . 1 q
0

bq
F
1 . . . 1
iii) macchina W: copia una stringa appartenente ad 1

.
d T T [ o o [ /
0 W =
b
1
La macchina J realizza la seguente computazione:
q
0
b
n
..
1 . . . 1 b

b
n
..
1 . . . 1 q
F
b
n
..
1 . . . 1
iv) macchina +: somma due interi rappresentati in notazione unaria.
+ = T W o o d T T T [ o o o [ T T /
0
b
1
La macchina + realizza la seguente computazione:
q
0
b 1 . . . 1
. .
n+1
b 1 . . . 1
. .
m+1
b

b 1 . . . 1
. .
n+1
b 1 . . . 1
. .
m+1
b 1 . . . 1
. .
m+n+1
q
F
b
Esercizio 5.17 Dare la descrizione linearizzata delle macchine che calcolano la sottra-
zione e il prodotto. Si adottino le medesime convenzioni per la congurazione iniziale
e per la congurazione nale adottate nellEsempio 5.8 iv).
210 CAPITOLO 5. MACCHINE DI TURING
5.8 La macchina di Turing universale
Nelle pagine precedenti abbiamo introdotto la macchina di Turing come un
dispositivo astratto, dotato di un meccanismo estremamente elementare e
abbiamo denito i concetti di riconoscimento e accettazione di linguaggi e di
calcolo di funzioni mediante macchine di Turing. Da questa sezione in poi
cercheremo di caratterizzare la potenza delle macchine di Turing individuan-
do prima una funzione estremamente potente che `e calcolabile secondo Turing
e successivamente una funzione non calcolabile secondo Turing. Inne dimo-
streremo che i linguaggi di tipo 0 coincidono con i linguaggi accettati dalle
macchine di Turing.
Innanzitutto ricordiamo il concetto di calcolo di una funzione da parte di un
trasduttore fornito nella Denizione 5.8 ed estendiamo tale concetto a funzioni
di pi` u argomenti. Sia m : (

)
n

. Diciamo che la macchina / calcola


la funzione m se essa realizza la computazione q
0
x
1
b . . . bx
n

M
x
1
b . . . bx
n
bqy
con q stato nale se e solo se m(x
1
, . . . , x
n
) = y.
Denizione 5.22 Una macchina di Turing | = , b, Q

, q

0
, F

) si dice
macchina di Turing universale se essa calcola una funzione u : (

)
(
n +1)

con la seguente propriet`a: data una qualunque macchina di Turing / =


, b, Q, , q
0
, F) che calcola la funzione m : (

)
n

esiste una stringa


c
M

(codicazione di /) tale che


u(c
M
, x
1
, . . . , x
n
) = m(x
1
, . . . , x
n
).
Una macchina di Turing universale `e dunque in grado di simulare ogni
altra macchina di Turing. Al ne di dimostrare lesistenza di una macchina di
Turing universale, nonche fornirne una descrizione, procederemo nel seguente
modo:
1. Innanzi tutto prenderemo in considerazione MT con nastro semi-innito
e alfabeto costituito dagli unici due simboli 1 e b. Ci`o non costituisce
una perdita di generalit`a in quanto ad ogni MT possiamo dapprima ap-
plicare il risultato del Teorema 5.3 che consente di ricavare una macchina
equivalente con nastro semi-innito e quindi applicare a questultima il
risultato del Teorema 5.4 che permette di ridurre lalfabeto ad un solo
simbolo.
2. In secondo luogo proveremo che `e possibile fornire una descrizione li-
nearizzata di ogni MT del tipo suddetto utilizzando tre soli tipi di MT
elementari e composizione per diramazione sul simbolo 1. A tal ne,
introdurremo una nuova macchina e mostreremo nel successivo Lem-
ma 5.6 come ognuna delle macchine elementari introdotte nella sezione
precedente sia denibile come composizione delle macchine , s e /

,
utilizzando la composizione per diramazione solo sul simbolo 1.
5.8. LA MACCHINA DI TURING UNIVERSALE 211
3. Inne, mostreremo come la descrizione linearizzata di una MT possa
essere rappresentata essa stessa mediante una stringa sullalfabeto 1, b
e come possa essere denita una macchina che, assumendo in input tale
descrizione, simuli il comportamento della macchina descritta.
Lemma 5.6 Indichiamo con la macchina che, qualunque sia il carattere
letto, 1 o b, lo inverte e sposta a destra la testina come di seguito illustrato:
/
0
[ d /
0 =
1
1
Si considerino inoltre le macchine elementari s ed /

.
`
E possibile fornire una
descrizione linearizzata delle macchine [, 2 e d che utilizza solo le macchine
, s ed /

e sfrutta la composizione per diramazione solo sul simbolo 1.


Dimostrazione. Le descrizioni linearizzate di d e 2 sono le seguenti.
d = s /
0
=
s /
0
1
La descrizione linearizzata della macchina [ viene lasciata per esercizio. 2
Esercizio 5.18 Fornire la descrizione linearizzata della macchina [ utilizzando solo le
macchine , s ed /

e sfruttando la diramazione per composizione solo sul simbolo


1.
Per semplicare ulteriormente la descrizione linearizzata delle MT basata
su macchine elementari possiamo agire nel seguente modo. Innanzi tutto con-
veniamo che la macchina /

venga sempre eliminata: quando si trova tra due


descrizioni pu`o essere chiaramente soppressa; al termine di una descrizione
linearizzata, si pu`o assumere per convenzione che essa sia sempre presente. In
tal modo le macchine elementari si riducono a ed s.
In secondo luogo, possiamo normalizzare i salti e ridurci ai salti condizio-
nati su 1, nel seguente modo:

1

2

3 diventa

1 [

2

3
b 1 1
1
212 CAPITOLO 5. MACCHINE DI TURING

1

2

3 diventa

1 [

2

3
1, b
1
1
1
A seguito delle trasformazioni precedenti, la descrizione linearizzata di una
qualunque MT /operante su simboli 1 e b consiste in una sequenza di simboli
ed s intercalati da salti condizionati sul simbolo 1. Tale sequenza pu`o essere
assimilata ad un programma basato sulle sole istruzioni ed s e su salti
condizionati sul simbolo 1.
Potremo ora rappresentare una tale sequenza come una parola c
M
sullalfabeto 1, b procedendo come segue:
Le istruzioni s e saranno rispettivamente codicate con le stringhe
1 e 11.
Una istruzione di salto condizionato sul simbolo 1 alla istruzione
n-esima sar`a codicata mediante la stringa 1
n+3
.
Il codice di una istruzione `e separato da b dal codice dellistruzione
successiva.
La stringa 1
3
rappresenta la ne della sequenza di istruzioni.
Quanto abbiamo visto ci ha consentito di costruire il codice c
M
di una data
macchina / (operante su nastro semi-innito) in termini di una stringa sul-
lalfabeto 1, b. La macchina universale assumer`a in input il codice c
M
di una
macchina data seguito dalla sequenza x
1
, . . . , x
n
su cui la macchina / `e de-
stinata ad operare. Essa dovr`a fornire come risultato la stringa m(x
1
, . . . , x
n
);
per tale motivo, nella congurazione nale non dovr`a pi` u comparire il codice
c
M
.
Per realizzare tale computazione la macchina universale | dovr`a utilizzare
alcuni caratteri speciali, ad esempio 1

e b

, per segnare sul codice c


M
quale
istruzione della macchina / vada simulata e per indicare sulla stringa corri-
spondente al nastro della macchina / su quale carattere essa sia posizionata.
Per ottenere larresto della computazione si conviene che esso sia determinato
da un salto ad una istruzione non presente.
Le congurazioni della macchina universale si presentano dunque nel
seguente modo:
- congurazione iniziale
c
M
..
1 . . . 1 b 1 . . . 1 b . . . b 1 . . . 1 b 111 b
x
1
,...,xn
..

5.8. LA MACCHINA DI TURING UNIVERSALE 213
- congurazioni intermedie
1 . . . 1 b 1

. . . 1 b . . . b 1 . . . 1 b 111 b . . .

. . .
- congurazione nale
b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b b . . . . . .
. .
m(x)
b . . . b
Utilizzando la costruzione precedentemente esposta si perviene al seguente
risultato.
Teorema 5.7 Esiste una macchina di Turing | =

, b, Q

, q

0
, F

) tale che
data ogni macchina di Turing / = 1, b, Q, , q
0
, F):
u(c
M
, x) = m(x) x 1, b

.
Dimostrazione. Per la dimostrazione completa del risultato si rende neces-
sario denire il comportamento della macchina | che, scandendo via via le
istruzioni presenti nel programma c
M
, esegue le operazioni corrisponden-
ti sulla porzione di nastro che corrisponde al nastro della macchina /. La
denizione dettagliata del comportamento di | viene lasciata al lettore. 2
Esercizio 5.19 Costruire la macchina |.
Si noti che, per omogeneit`a di trattazione e per coerenza con il concetto di
universalit`a si `e chiesto che la descrizione della macchina c
M
venga cancellata
al termine dellelaborazione. Tuttavia ci`o non corrisponde a quanto accade
nellinterpretazione di una macchina universale come un interprete di un
linguaggio di programmazione. Tale interpretazione `e, tuttavia, abbastanza
suggestiva ed ha un preciso corrispondente nellambito dei linguaggi di pro-
grammazione (si consideri ad esempio la funzione EVAL nel LISP). In tal caso
la distruzione del programma non solo non viene eettuata ma, anzi, viene
accuratamente evitata.
Come ulteriore osservazione `e opportuno notare che qualora la macchina
/ riceva in input una n-pla di argomenti la macchina universale potr`a essere
modicata in modo che calcoli la funzione:
u(c
M
, x
1
, . . . , x
n
) = m(x
1
, . . . , x
n
).
214 CAPITOLO 5. MACCHINE DI TURING
5.9 Il problema della terminazione
Il potere computazionale delle macchine di Turing `e stato discusso nella Se-
zione 5.3, in cui sono stati introdotti i concetti di funzione T-calcolabile e di
linguaggio T-decidibile. Al ne di illustrare i limiti del potere computazio-
nale di una macchina di Turing mostriamo ora un esempio di funzione non
T-calcolabile. Si consideri il problema decisionale seguente, noto come proble-
ma della terminazione (halting problem): date una macchina di Turing / e
una stringa x, stabilire se / termina la computazione avendo x come input.
Si noti che tale problema ha un notevole impatto applicativo. Dal punto di
vista pratico infatti sarebbe di grande interesse disporre di un algoritmo in
grado di decidere, dato un programma in un qualsiasi linguaggio di program-
mazione e dato un particolare input, se il programma termina su tale input.
Il risultato che vedremo in questa sezione mostra invece che non essendo il
problema risolubile con una macchina di Turing, esso non potr`a essere risolto
con alcun metodo algoritmico.
Teorema 5.8 [Indecidibilit`a del problema della terminazione
8
] Siano dati un
alfabeto ed una codicazione che associa ad ogni macchina di Turing / =
, b, Q, , q
0
, F) una sua codica c
M

. La funzione
h(c
M
, x) =
_
_
_
1 se / termina su input x
0 se / non termina su input x
non `e T-calcolabile.
Dimostrazione. Supponiamo per assurdo che esista una macchina di Turing
H capace di calcolare la funzione h. Possiamo allora costruire una macchina
di Turing H

che calcola la funzione h

tale che:
h

(c
M
) =
_
_
_
1 se / termina su input c
M
0 se / non termina su input c
M
`
E facile osservare che la macchina H

`e la composizione di una macchina ( che


duplica una stringa in input e della macchina H (vedi Esercizio 5.20).
A questo punto possiamo denire una nuova macchina H

risultante dalla
composizione della macchina H

e di una macchina c che cicla se la macchina


H

termina con la testina posizionata sul carattere 1 e si arresta senza eet-


tuare alcuna operazione se la macchina H

termina con la testina posizionata


sul carattere 0 (vedi Esercizio 5.20). La macchina H

pertanto calcola una


funzione h

tale che h

(c
M
) = 0 se e solo se la macchina / su input c
M
non termina; se al contrario la macchina / su input c
M
termina, allora la
macchina H

non termina.
8
Questo risultato `e noto anche come indecidibilit` a del predicato della terminazione.
5.10. LINGUAGGI DI TIPO 0 E MT 215
Verichiamo ora che se forniamo in input alla macchina H

la propria
descrizione c
H
otteniamo in ogni caso una contraddizione. Infatti la macchina
H

con input c
H
dovrebbe arrestarsi proprio nel caso in cui la computazione
che essa eettua non termina, e viceversa.
Lassurdo ottenuto implica che la macchina H

ottenuta componendo le
macchine (, H ed c non pu`o esistere e da ci`o si deriva immediatamente che la
macchina H non pu`o esistere e pertanto la funzione h non `e T-calcolabile. 2
Esercizio 5.20 Costruire le macchine ( ed c.
Come gi`a accennato, lindecidibilit`a del problema della terminazione ha
delle importanti conseguenze nellambito della teoria della programmazione.
In particolare, esso indica chiaramente che non `e possibile costruire un perfetto
sistema di debugging che sia in grado di determinare se un programma
termini o meno sullinput dato.
Si noti che il problema della terminazione, pur non essendo decidibile,
risulta semidecidibile.
Esercizio 5.21 Dimostrare la semidecidibilit`a del problema della terminazione.
Nel Capitolo 7 vedremo ulteriori esempi di funzioni non calcolabili e di
problemi non decidibili ed approfondiremo ulteriormente questi concetti. Si
ricordi inoltre che un primo esempio di problema indecidibile (lambiguit`a della
grammatiche non contestuali) `e gi`a stato presentato nella Sezione 4.8.1.
5.10 Linguaggi di tipo 0 e MT
Dopo aver studiato le propriet`a delle macchine di Turing mostriamo ora un
risultato che `e stato preannunciato nella Sezione 2.5.3, e cio`e che le macchine di
Turing hanno un potere computazionale necessario e suciente per consentire
laccettazione dei linguaggi di tipo 0.
Dimostriamo separatamente la necessit`a e la sucienza.
Teorema 5.9 Se ( `e una grammatica di tipo 0, e L = L(() `e il linguaggio da
essa generato, esiste una macchina di Turing non deterministica a due nastri
/
L
che accetta L.
Dimostrazione. La dimostrazione viene solamente accennata. Sia ( =
V
N
, V
T
, P, S). La macchina /
L
opera nel seguente modo. Data una stringa
w V

T
, la congurazione iniziale di /
L
`e q
0
#w#S.
Ad ogni passo, in modo non deterministico /
L
applica sulla forma di frase
presente sul secondo nastro tutte le possibili produzioni in P, rimpiazzando
con una nuova forma di frase

derivabile da . Quindi verica se

coincide
216 CAPITOLO 5. MACCHINE DI TURING
con w: solo se la verica d`a esito positivo la macchina entra in uno stato nale
di accettazione. 2
Esercizio 5.22 Esemplicare la costruzione della macchina /
L
su una grammatica
per w w [ w V

T
.
Si noti che il metodo utilizzato dalla macchina /
L
`e assimilabile al metodo
di analisi sintattica discendente illustrato nel caso dei linguaggi di tipo 2 (vedi
Sezione 4.7).
Chiaramente, dal teorema precedente deriva immediatamente il seguente
corollario.
Corollario 5.10 I linguaggi di tipo 0 sono semidecidibili secondo Turing.
Dimostriamo ora che il potere computazionale delle macchine di Turing `e
suciente per il riconoscimento dei linguaggi di tipo 0.
Teorema 5.11 Se / `e una macchina di Turing che accetta il linguaggio L
allora esiste una grammatica (
L
di tipo 0 tale che L = L((
L
).
Dimostrazione. Sia / = , b, Q, , q
0
, F) la macchina di Turing che ac-
cetta il linguaggio L

, con . Ci`o signica che per ogni x

, la
macchina / termina in uno stato q F se e solo se x L. Assumiamo per
semplicit`a che L non contenga la stringa vuota.
La grammatica (
L
che genera L opera intuitivamente nel seguente modo:
1. Produce una forma di frase che codica una stringa x

.
2. Simula il comportamento che la macchina / avrebbe con input x.
3. Genera la stringa x se e solo se x `e stata accettata da / nel corso della
simulazione.
La grammatica (
L
utilizza un alfabeto di simboli terminali V
T
= e un
alfabeto V
N
di simboli non terminali che contiene lassioma S, alcuni simboli
ausiliari A
1
, . . . , A
5
, un simbolo
_
q
_
per ogni q Q,
nonche simboli che rappresentano coppie di caratteri in b

e che, per
facilitare lintuizione, rappresenteremo nel seguente modo:
_
a
i
b
j
_
ove a
i
b e b
j


.
Tale rappresentazione ci permetter`a di costruire forme di frase interpretabili
come due piste di un unico nastro. Per illustrare le produzioni mostriamo pi` u
in dettaglio come opera la grammatica.
5.10. LINGUAGGI DI TIPO 0 E MT 217
Fase 1 Per ogni stringa x = a
i
1
. . . a
in

la grammatica genera una rappre-


sentazione della congurazione iniziale q
0
x di /. Tale rappresentazione
`e strutturata nel seguente modo:
A
1
_
q
0
_ _
a
i
1
a
i
1
_

_
a
in
a
i
n
_
A
3
Fase 2 In questa fase vengono generati su entrambe le piste un numero ar-
bitrario di b, sia verso destra sia verso sinistra, ottenendo cos` forme di
frase del tipo
A
1
_
b
b
_

_
b
b
_ _
q
0
_ _
a
i
1
a
i
1
_

_
a
in
a
in
_ _
b
b
_

_
b
b
_
A
3
Fase 3 Osserviamo che, per costruzione, il contenuto della pista inferiore cor-
risponde al contenuto del nastro della macchina / che deve accettare
o meno la stringa x. In questa fase, quindi, viene attuata la simula-
zione della macchina / applicando, sulla pista inferiore, le regole di
transizione della macchina stessa.
Fase 4 Si passa dalla Fase 3 alla Fase 4 se la macchina / accetta la stringa
x, cio`e entra in una congurazione nale del tipo b
1
. . . b
k
q

b
k+1
. . . b
m
,
con b
i


, i 1, . . . , m, q

F. La forma di frase che corrisponde a


tale congurazione nale sar`a del seguente tipo:
A
1
_
b
b
_

_
b
b
_ _
c
1
b
1
_

_
c
k
b
k
_ _
q

_ _
c
k+1
b
k+1
_

_
c
m
b
m
_ _
b
b
_

_
b
b
_
A
3
ove c
i
b, i 1, . . . , m, e la stringa x `e una sottostringa di
c
1
. . . c
m
. A questo punto, mediante unopportuna serie di produzioni,
dalla forma sentenziale viene generata la stringa x eliminando tutti i
simboli non terminali.
La Fase 1 si realizza mediante le seguenti produzioni:
1. S A
1
_
q
0
_
A
2
2. A
2

_
a
a
_
A
2
per ogni a
3. A
2
A
3
.
La Fase 2 si realizza mediante le seguenti produzioni:
218 CAPITOLO 5. MACCHINE DI TURING
4. A
3

_
b
b
_
A
3
5. A
1
A
1
_
b
b
_
.
Per la Fase 3 occorrono le seguente produzioni, basate sulle regole di
transizione della macchina /:
6.
_
q
i
_ _
c
1
b
j
_ _
c
l
b
j
_

_
c
l
b
k
_ _
q
h
_
per ogni c
i
b ed ogni b
j
, q
i
, b
k
, q
h
tali che (q
i
, b
j
) = (q
h
, b
k
, d)
7.
_
c
r
b
s
_ _
q
i
_ _
c
l
b
j
_

_
q
h
_ _
c
r
b
s
_ _
c
l
b
k
_
per ogni c
r
, c
l
b, b
s


ed ogni b
j
, q
i
, b
k
, q
h
tali che (q
i
, b
j
) =
(q
h
, b
k
, s)
8.
_
q
i
_ _
c
l
b
j
_

_
q
h
_ _
c
l
b
k
_
per ogni c
l
b ed ogni b
j
, q
i
, b
k
, q
h
tali che (q
i
, b
j
) = (q
h
, b
k
, i).
9.
_
q
l
_
A
4
A
5
per ogni q

F
10.
_
c
i
b
l
_
A
4
c
i
per ogni c
i
e per ogni b
l

11.
_
b
b
l
_
A
4
A
4
per ogni b
l

12.
_
c
i
b
l
_
c
i
A
5
per ogni c
i
e per ogni b
l

13.
_
b
b
l
_
A
5
per ogni b
l

14. A
1
A
4

15. A
5
A
3
.
5.11. LINGUAGGI DI TIPO 1 E AUTOMI LINEARI 219
Si lascia al lettore il compito di modicare la grammatica per tener conto
del caso in cui la macchina M accetti la stringa vuota (v. Esercizio 5.23).
Non `e dicile vericare che tale grammatica genera x se e solo se x `e accettato
dalla macchina /. 2
Esercizio 5.23 Modicare la grammatica introdotta nella dimostrazione precedente in
modo da tener conto anche del caso in cui L.
5.11 Linguaggi di tipo 1 e automi lineari
Nel corso della trattazione svolta nora, abbiamo visto che, come preannuncia-
to nella Sezione 2.5.3, per varie classi di linguaggi denite in base alla gerarchia
di Chomsky `e possibile individuare un dispositivo di riconoscimento caratte-
rizzante. In particolare abbiamo visto che gli automi a stati niti riconoscono
esattamente i linguaggi regolari, gli automi a pila non deterministici quelli
non contestuali e le macchine di Turing consentono di accettare tutti e soli i
linguaggi di tipo 0. In questa sezione vedremo come `e possibile individuare
un automa che caratterizza la classe dei linguaggi contestuali. A tale scopo
vedremo come le dimostrazioni date nella sezione precedente, che ci hanno
permesso di associare ad una grammatica di tipo 0 una MT che accetta il
linguaggio da essa generato e viceversa, possono essere specializzate nel caso
in cui la grammatica sia di tipo 1. Ci`o ci permetter`a di dimostrare innanzi
tutto che i linguaggi di tipo 1 sono decidibili e successivamente di denire un
automa in grado di riconoscere tutti e soli i linguaggi di tipo 1.
Teorema 5.12 Se ( `e una grammatica di tipo 1 che genera il linguaggio
L = L(() esiste una macchina di Turing /
L
che riconosce L.
Dimostrazione. La dimostrazione si ispira a quella del Teorema 5.9. Da-
ta la grammatica ( costruiamo una macchina di Turing non deterministica
/ simile a quella introdotta nella dimostrazione del teorema suddetto, e cio`e
una macchina a due nastri uno dei quali contiene la stringa in input e laltro
(nastro di lavoro) conterr`a le forme sentenziali derivabili dalla grammatica che
vengono via via generate dalla macchina. Questa sar`a per`o modicata nel mo-
do seguente. Innanzi tutto, sul nastro di lavoro, vengono inseriti due simboli
speciali che delimitano lo spazio di lavoro eettivamente utilizzabile e che `e
pari alla lunghezza della stringa in input. Ogni volta che, applicando le produ-
zioni della grammatica, si tenta di generare una forma sentenziale di lunghezza
superiore allo spazio a disposizione, la computazione termina in uno stato non
nale. Infatti, data la caratteristica delle grammatiche di tipo 1, da tale forma
sentenziale non sarebbe possibile derivare la stringa in input. Inoltre, poiche
si pu`o vericare che la forma sentenziale generata rimanga sempre della stessa
lunghezza a causa dellapplicazione ciclica di una sequenza di produzioni, sar`a
220 CAPITOLO 5. MACCHINE DI TURING
necessario prevedere che anche in questo caso la computazione termini in uno
stato non nale. In particolare, se ( ha un alfabeto V di simboli terminali e
non terminali, e se la stringa in input ha lunghezza n, la computazione dovr`a
terminare in uno stato non nale dopo che per [ V [
n
passi consecutivi la lun-
ghezza della forma sentenziale `e rimasta costante. In tal modo la macchina /
terminer`a sempre le proprie computazioni, o in uno stato nale (accettazione)
o in uno stato non nale (riuto).
La macchina /
L
che riconosce il linguaggio L potr`a essere ottenuta co-
struendo una macchina deterministica che simula la macchina / (cfr. Eser-
cizio 5.14) e quindi riconosce una stringa x se e solo se essa `e generata dalla
grammatica (. 2
Come abbiamo visto, nella dimostrazione precedente abbiamo imposto che
la macchina di Turing non deterministica / utilizzi su entrambi i nastri,
se non si tiene conto dei simboli di delimitazione, un numero di celle al pi` u
pari alla lunghezza della stringa data in input. Vedremo ora che `e possibi-
le denire una macchina di Turing non detreministica con lo stesso potere
computazionale che utilizza un solo nastro della stessa lunghezza.
Denizione 5.23 Un automa lineare ( linear bounded automaton) `e una set-
tupla / = , b, $, Q, q
0
, F,
N
) che corrisponde ad una macchina di Turing
non deterministica ad un nastro con le seguenti varianti. Il simbolo $ non
appartiene a ed `e utilizzato per delimitare lo spazio di lavoro a disposizio-
ne della macchina. La macchina viene attivata nella congurazione iniziale
$q
0
x$ e il simbolo speciale $ non pu`o essere cancellato ne scavalcato dalla
testina della macchina.
Teorema 5.13 Se ( `e una grammatica di tipo 1 che genera il linguaggio
L = L(() esiste un automa lineare B
L
che riconosce L.
Dimostrazione. Per dimostrare lenunciato `e suciente modicare la dimo-
strazione del teorema precedente adattandola nel modo seguente. Deniamo
la macchina B
L
in modo simile alla macchina /
L
, ma anziche prevedere due
nastri facciamo uso di un unico nastro, diviso in quattro tracce. Come richie-
sto dalla denizione di automa lineare, lo spazio disponibile su tale nastro sar`a
delimitato dai simboli $ e sar`a pari alla lunghezza della stringa in input. Le
quattro tracce del nastro di B
L
sono utilizzate per rappresentare il contenuto
dei due nastri di /
L
(tracce pari) e la posizione delle rispettive testine (tracce
dispari). Come si vede, la tecnica `e la stessa della dimostrazione del Teore-
ma 5.1. Il numero di celle usate dalla macchina B
L
sar`a pari a quello delle
celle usate dalla macchina /
L
. 2
Nel prossimo teorema vedremo che non solo gli automi lineari consentono
il riconoscimento di tutti i linguaggi di tipo 1, ma che per ogni automa lineare
che riconosce un dato linguaggio L esiste una grammatica di tipo 1 che genera
L.
5.11. LINGUAGGI DI TIPO 1 E AUTOMI LINEARI 221
Teorema 5.14 Se B `e un automa lineare che accetta il linguaggio L allora
esiste una grammatica (
L
di tipo 1 tale che L = L((
L
).
Dimostrazione. Anche questa dimostrazione si ispira alla analoga dimo-
strazione per i linguaggi di tipo 0 (Teorema 5.11). In particolare il nostro
intendimento sar`a di generare stringhe di caratteri e simulare il comporta-
mento di un automa lineare su di esse, generando come sequenze di simboli
terminali solo quelle stringhe che saranno accettate dallautoma lineare.
Esaminando le produzioni nella dimostrazione del Teorema 5.11, possiamo
osservare che quattro di esse non sono di tipo 1 (9, 10, 11 e 12) e dunque
rendono la grammatica corrispondente strettamente di tipo 0. In particola-
re, le produzioni 9 e 10 vengono utilizzate quando la computazione eseguita
dalla macchina di Turing ha utilizzato una quantit`a di nastro superiore alla
lunghezza della stringa in input. Poiche nel caso degli automi lineari ci`o non
potr`a mai vericarsi tali produzioni non saranno necessarie nella grammatica
che dobbiamo denire. Per lo stesso motivo, le produzioni 4 e 5, che generano
un arbitrario numero di blank a destra e a sinistra della stringa in esame, non
saranno pi` u necessarie. Rimane pertanto da risolvere il problema costituito
dalle produzioni 11 e 12, che eliminano i delimitatori A
1
e A
3
quando la com-
putazione della macchina di Turing ha raggiunto lo stato nale. Per poter
eettuare queste trasformazioni senza utilizzare produzioni strettamente di ti-
po 0 modicheremo la dimostrazione del Teorema 5.11 utilizzando caratteri
organizzati su quattro piste anziche su due. Oltre alle due piste gi`a presenti
nella suddetta dimostrazione, che ora chiameremo piste 3 e 4, utilizzeremo una
pista (pista 2) per rappresentare la posizione della testina della macchina e lo
stato in cui essa si trova ed una pista (pista 1) per rappresentare i due simboli
$ che delimitano a destra e sinistra lo spazio di lavoro a disposizione dellau-
toma lineare. Inoltre la pista 2 sar`a utilizzata anche per simboli di servizio
necessari durante lultima fase della costruzione.
In denitiva, quindi, le produzioni della grammatica (
L
saranno otte-
nute modicando opportunamente quelle della grammatica costruita nella
dimostrazione del Teorema 5.11, per tener conto della nuova struttura dei
caratteri.
Illustriamo ora le fasi attraverso cui avviene la generazione di una stringa
del linguaggio L mediante la grammatica (
L
.
Fase 1 Per ogni stringa x = a
i
1
. . . a
i
n

la grammatica genera una rap-


presentazione della congurazione iniziale $q
0
x$ di B, cos` strutturata:
_
$
q
0
_
a
i
1
a
i
1
_ _
a
i
2
a
i
2

_
$
_
a
i
n
a
i
n
Fase 2 In questa fase viene attuata la simulazione della macchina B ap-
plicando, sulla pista inferiore, le regole di transizione della macchina
stessa.
222 CAPITOLO 5. MACCHINE DI TURING
Fase 3 Si passa dalla Fase 2 alla Fase 3 se la macchina B accetta la stringa
x, cio`e entra in una congurazione nale del tipo $b
1
. . . b
k
q

b
k+1
. . . b
n
$,
con b
i


, i 1, . . . , n, q

F. La forma sentenziale che corrisponde


a tale congurazione nale sar`a del seguente tipo:
_
$
_
a
i
1
b
1

_
q

_
a
i
k+1
b
k+1

_
$
_
a
i
n
b
n
A questo punto, mediante unopportuna serie di produzioni, dalla forma
sentenziale viene generata la stringa x eliminando tutti i simboli non
terminali.
La denizione delle produzioni che realizzano le tre fasi di generazione di
una stringa del linguaggio L vengono lasciate al lettore (cfr. Esercizio 5.24).
2
Esercizio 5.24 Denire le produzioni di tipo 1 della grammatica (
L
introdotta nella
dimostrazione del Teorema 5.14. Per quanto riguarda la Fase 3, si suggerisce di
utilizzare la pista 1 per gestire la propagazione di opportune marche che svolgono
un ruolo analogo a quello svolto dai non terminali A
4
ed A
5
nella dimostrazione del
Teorema 5.11.
Capitolo 6
Modelli di Calcolo Imperativi e
Funzionali
6.1 Introduzione
Il modello di calcolo creato da Turing per denire il concetto di calcolabilit`a
`e stato introdotto senza che vi fosse alcun riferimento alla struttura ed al
funzionamento dei calcolatori elettronici che, come `e noto, hanno visto la luce
pochi anni dopo.
Come si `e gi`a detto (vedi Appendice A), nonostante lappellativo di mac-
chine, i dispositivi astratti deniti da Turing corrispondono solo ad una for-
malizzazione dei procedimenti di calcolo umani e farebbe certamente sorridere
lipotesi di realizzare un eettivo calcolatore basandosi su tale modello. La
stessa considerazione vale anche per altri modelli di calcolo introdotti nello
stesso periodo da altri matematici: lambda-calcolo, sistemi di riscrittura di
Post, algoritmi di Markov.
Il fatto che tali modelli formali siano stati concepiti nellambito della logica
matematica, indipendentemente dagli studi che stavano accompagnando la
nascita dei primi calcolatori, non vuol dire per`o che, a posteriori, essi non si
siano rivelati, per linformatica, validi strumenti di formalizzazione di aspetti
e propriet`a del calcolo automatico. Ad esempio, i sistemi di riscrittura di Post
hanno ispirato i modelli grammaticali di Chomsky, utili per lo studio delle
propriet`a sintattiche dei programmi e le stesse macchine di Turing continuano
ancor oggi ad essere adottate come modello di riferimento per lo studio e la
misura della complessit`a di risoluzione di problemi.
In questo capitolo prenderemo in esame invece due classi di modelli che,
pur essendo anchessi modelli astratti, hanno per`o un diretto riferimento ai
calcolatori e ai linguaggi di programmazione e consentono di formalizzare i
processi di esecuzione di programmi e di confrontare i relativi paradigmi di
programmazione: i modelli di calcolo imperativi e i modelli di calcolo funzio-
224 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
nali. I primi saranno proposti attraverso lintroduzione di macchine astratte
(le macchine a registri) basate sulla struttura classica degli elaboratori e pro-
grammabili con linguaggi simili ai linguaggi assemblativi, anche se molto pi` u
semplici; ai secondi giungeremo attraverso un approccio che, partendo da una
denizione matematica delle funzioni calcolabili (funzioni ricorsive), ci per-
metter`a di introdurre caratteristiche e propriet`a di un semplice linguaggio di
programmazione basato sul paradigma funzionale (formalismo di McCarthy).
6.2 Macchine a registri
I modelli di calcolo imperativi sono direttamente collegati allarchitettura dei
primi calcolatori elettronici, architettura che verso la met`a degli anni 40 si
`e denitivamente consolidata secondo un modello che ha preso il nome di
modello di von Neumann, dal nome del matematico ungherese che ha avuto
un ruolo fondamentale nella sua concezione.
Per il suo stretto legame con il modello di von Neumann, il paradigma
imperativo caratterizza da sempre il linguaggio di macchina e i linguaggi as-
semblativi dei calcolatori reali (che ancora oggi sono fondamentalmente ispirati
a tale modello) e anche la maggior parte dei linguaggi di programmazione ad
alto livello, dai pi` u antichi come il Fortran e il Cobol ai pi u recenti come C e
Java.
In un modello di calcolo imperativo un algoritmo viene descritto mediante
una sequenza nita di istruzioni (programma), i dati da elaborare sono conte-
nuti in un insieme nito di celle (memoria) e il calcolo viene realizzato da una
macchina che esegue sequenzialmente le istruzioni, modicando via via, secon-
do quanto richiesto dalle stesse, il contenuto della memoria. Tipiche istruzioni
di un linguaggio imperativo sono le istruzioni di lettura dei dati (da tastiera o
da un supporto esterno), di trasferimento dei dati da una cella ad unaltra, di
esecuzione di operazioni aritmetiche o logiche elementari (somme e prodotti
aritmetici o logici etc.), di visualizzazione dei risultati (su schermo o su un
supporto esterno).
In un tale modello di calcolo assume un ruolo fondamentale il concetto di
stato, rappresentato in questo caso dal contenuto della memoria in un deter-
minato istante. Ogni istruzione di un linguaggio di tipo imperativo comporta
il passaggio da uno stato ad un altro e lesecuzione di un programma impera-
tivo si pu`o rappresentare quindi come una sequenza di stati, analogamente a
una computazione eseguita da una macchina di Turing che `e anchessa, come
visto, riconducibile ad una sequenza di congurazioni istantanee.
Per discutere caratteristiche e propriet`a computazionali del modello di cal-
colo imperativo introdurremo un tipo particolare di macchina astratta: la
macchina a registri (detta anche RAM, Random Access Machine).
Una macchina a registri, `e chiamata cos` perche la sua memoria consiste
in una sequenza di un numero nito, ma arbitrario, di registri , celle di me-
moria ciascuna delle quali `e in grado di contenere un intero grande a piacere.
6.2. MACCHINE A REGISTRI 225
I registri sono accessibili direttamente, in base al loro numero dordine. Un
registro particolare, chiamato accumulatore, `e destinato a contenere via via,
uno degli operandi su cui agiscono le istruzioni della macchina. Un altro regi-
stro, chiamato contatore delle istruzioni (CI) contiene il numero dordine della
prossima istruzione che dovr`a essere eseguita. La macchina scambia informa-
zioni con il mondo esterno mediante due nastri di ingresso e uscita consistenti
di sequenze di celle, ciascuna delle quali ancora capace di contenere un intero
grande a piacere. La macchina, inne, `e dotata di una unit`a centrale capace di
eseguire le istruzioni del linguaggio di programmazione. La Figura 6.1 fornisce
una rappresentazione di una macchina a registri.

CI CI
Output
Input
Programma
Accumulatore
R1
R2
R3
R4
Accumulatore
R1
R2
R3
R4
.
.
.
Figura 6.1 Rappresentazione sica di una macchina a registri.
Un programma per RAM consiste in una sequenza di istruzioni di vario
tipo (di trasferimento, aritmetiche, di controllo, di I/O). In genere unistru-
zione agisce su operandi contenuti nei registri, che in tal caso vengono indicati
semplicemente con il numero dordine del registro (ad esempio 3 indica il conte-
nuto del registro 3). Quando un operando viene indirizzato in modo indiretto
tramite il contenuto di un altro registro esso viene indicato con il numero del
registro contenuto fra parentesi (ad esempio (3) indica il contenuto del regi-
stro indirizzato dal registro 3). Inne un operando pu`o essere direttamente
costituito dal dato su cui si vuole operare; in tal caso il dato viene preceduto
da # (ad esempio #3 indica che loperando `e lintero 3).
Di seguito forniamo una semplice descrizione in BNF del linguaggio delle
macchine a registri. Da tale descrizione `e possibile determinare, per ciascuna
istruzione, il tipo di operandi che essa ammette.
<programma> ::= <istruzione> <istruzione>
<istruzione> ::= LOAD [#]<operando> [ (<operando>) [
STORE <operando> [ (<operando>) [
226 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
ADD [#]<operando> [ (<operando>) [
SUB [#]<operando> [ (<operando>) [
MULT [#]<operando> [ (<operando>) [
DIV [#]<operando> [ (<operando>) [
READ <operando> [ (<operando>) [
WRITE [#]<operando> [ (<operando>) [
JUMP <etichetta> [
JGTZ <etichetta> [
JZERO <etichetta> [
HALT
<operando> ::= <intero>
<etichetta> ::= <intero>
Vediamo ora il signicato delle varie istruzioni disponibili.
Le istruzioni di trasferimento (LOAD e STORE) permettono di trasferire
il contenuto di un registro nellaccumulatore e viceversa.
Le istruzioni aritmetiche (ADD, somma, SUB, sottrazione, MULT, molti-
plicazione, DIV, parte intera della divisione) permettono di eseguire le quattro
operazioni tra il contenuto dellaccumulatore ed il contenuto di un registro. Il
risultato rimane nellaccumulatore. Nota che listruzione SUB d`a risultato 0
se si tenta di sottrarre un numero maggiore da un numero minore.
Le istruzioni vengono sempre eseguite sequenzialmente tranne nei casi in
cui la sequenza di esecuzione non venga alterata da una istruzione di controllo
e cio`e una istruzione di HALT o una istruzione di salto. Quando si incontra
listruzione HALT lesecuzione del programma si arresta; in tal caso diremo
che il calcolo `e terminato.
Le istruzioni di salto sono salti incondizionati (JUMP) o condizionati in
base al contenuto dellaccumulatore (JGTZ, JZERO cio`e salta se laccumula-
tore contiene un intero maggiore di zero, o rispettivamente, uguale a zero);
loperando di unistruzione di salto `e il numero dordine dellistruzione alla
quale eventualmente si eettua il salto. Nel caso in cui si eettui un salto
ad una istruzione inesistente, vale a dire se il valore contenuto nel contato-
re delle istruzione `e uguale a 0 o superiore alla lunghezza del programma, il
programma si arresta e in tal caso diremo che il calcolo non `e denito.
Inne le due istruzioni di I/O (READ e WRITE) consentono di leg-
gere un numero intero sul nastro di ingresso e trasferirlo in un registro e,
rispettivamente, di scrivere il contenuto di un registro sul nastro di uscita.
Come si vede il signicato delle istruzioni `e molto intuitivo e corrisponde
a quello di analoghe istruzioni che fanno parte di tutti i principali linguaggi
Assembler.
1
La principale dierenza tra una RAM e un calcolatore reale con-
1
Si noti che nei linguaggi Assembler reali si fa tipicamente uso di istruzioni a due operandi
anziche ad uno solo, e ci si giova di un numero elevato di registri sui quali eettuare le
operazioni.
6.2. MACCHINE A REGISTRI 227
siste nel fatto che il programma della RAM non `e contenuto in memoria ma
`e, per cos` dire, cablato. In altre parole la RAM non prevede le fasi di fet-
ch e di interpretazione delle istruzioni ma ogni istruzione viene direttamente
eseguita secondo quello che potremmo denire un microprogramma che spe-
cica formalmente come essa agisce sullo stato della macchina (determinato
dal contenuto di accumulatore, registri e contatore di istruzioni). Mostriamo a
titolo di esempio come si pu`o denire formalmente il comportamento di alcune
istruzioni.
Indichiamo con R[i] il contenuto del registro i-esimo, con R[0] il contenuto
dellaccumulatore e con CI il contenuto del contatore delle istruzioni e con
n 0 un generico intero non negativo.
LOAD #n R[0] := n
CI := CI + 1
ADD (n) R[0] := R[0] + R[R[n]]
CI := CI + 1
JZERO n if R[0] = 0 then CI := n else CI := CI + 1
Il comportamento delle altre istruzioni si pu`o denire in modo del tutto
analogo.
Esercizio 6.1 Denire il microprogramma corrispondente alle istruzioni DIV n,
MULT #n, JGTZ n.
Per descrivere compiutamente il comportamento di un programma per
macchine a registri dobbiamo fare alcune ulteriori assunzioni. In particolare
dobbiamo supporre che allinizio le informazioni da elaborare siano fornite
nellopportuno ordine sul nastro di ingresso e che il contatore delle istruzioni
sia inizializzato ad 1.
Mostriamo ora un semplice esempio di programma per RAM per il calcolo
dellesponenziale.
Esempio 6.1 Supponiamo che due interi x > 0 e y 0 siano forniti sul nastro di
ingresso. Il seguente programma d`a in uscita il valore x
y
.
READ 1
READ 2
LOAD #1
STORE 3
5 LOAD 2
JZERO 14
LOAD 1
MULT 3
STORE 3
LOAD 2
228 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
SUB #1
STORE 2
JUMP 5
14 WRITE 3
HALT
Esercizio 6.2 Denire un programma per RAM per il calcolo della parte intera di
log
2
x, x 1.
Esercizio 6.3 Denire un programma per RAM per il calcolo di x!, x 0.
Per la loro anit`a con la struttura e il funzionamento di un calcolatore
reale, le RAM sono un modello estremamente interessante sia nellambito di
studi di calcolabilit`a sia con riferimento agli aspetti di complessit`a compu-
tazionale. Dal primo punto di vista vedremo come la RAM ci consente di
denire la classe delle funzioni intere calcolabili e di confrontarla con la classe
delle funzioni calcolabili secondo Turing. Dal punto di vista della comples-
sit`a vedremo che, sotto opportune ipotesi, le RAM sono fondamentali nella
caratterizzazione della classe dei problemi computazionalmente trattabili.
6.2.1 Modelli per il costo di esecuzione di programmi RAM
Prima di poter correlare il comportamento delle RAM con altri modelli di
calcolo come le macchine di Turing `e necessario chiarire come si valuta il costo
di esecuzione di un programma per RAM.
Un metodo semplice, ma gi`a abbastanza signicativo, per analizzare il co-
sto di un programma per RAM, chiamato modello a costi uniformi consiste
nellattribuire un costo unitario a tutte le istruzioni e limitarsi a contare quan-
te volte ogni istruzione viene eseguita in funzione dellinput del programma.
Riprendiamo in esame lesempio precedente; possiamo vederlo diviso in tre
parti; lettura dellinput e inizializzazione, esecuzione del ciclo, terminazione.
La prima e lultima parte hanno rispettivamente un costo pari a 4 e a 2, in-
dipendentemente dal valore dellinput. Il corpo del programma, cio`e il ciclo,
consta di 9 istruzioni che vengono eseguite y volte. Inoltre le prime due istru-
zioni del ciclo vengono eseguite una volta in pi` u, quando il valore y diventa
uguale a zero e si eettua il salto allistruzione 14. In denitiva il costo di
esecuzione del programma `e pari a 4 + 9y + 2 + 2 = 9y + 8. Utilizzando la
notazione asintotica il costo `e dunque O(y).
Chiaramente il modello a costi uniformi `e un modello di analisi dei costi
troppo idealizzato, perche in esso si fanno due ipotesi eccessivamente sem-
plicative: che il costo di esecuzione di unistruzione sia indipendente dalla
taglia degli operandi e che laccesso ad un registro abbia un costo unitario
indipendentemente dal numero di registri accessibili.
6.2. MACCHINE A REGISTRI 229
Per ottenere un modello piu realistico, invece, `e ragionevole pensare che il
costo di esecuzione delle istruzioni dipenda dalla taglia degli operandi. Infatti
i registri di una RAM possono contenere interi arbitrariamente grandi (a die-
renza delle celle di memoria di un calcolatore, che in genere contengono interi
rappresentabili con 32 o 64 bit) e quindi se si opera su un intero n contenuto
in un registro si assume di pagare un costo dellordine di log n. Inoltre il costo
di accesso alla memoria deve dipendere, in qualche modo, dalla quantit`a di
memoria che si vuole indirizzare.
Sulla base di quanto detto, possiamo introdurre il modello a costi logarit-
mici , nel quale il costo di esecuzione di unistruzione si pu`o determinare nel
seguente modo. Sia l(n) denito come l(n) = if n = 0 then 1 else log
2
n|+1.
Per valutare il costo di unistruzione si mettono in conto i seguenti contributi:
1. lelaborazione di un operando n ha costo l(n),
2. ogni accesso ad un registro i ha costo l(i).
I costi delle istruzioni sono dunque dati dalla seguente tabella:
LOAD op c(op)
STORE op c

(op) +l(R[0])
ADD op c(op) +l(R[0])
SUB op c(op) +l(R[0])
MULT op c(op) +l(R[0])
DIV op c(op) +l(R[0])
READ op c

(op) +l(input)
WRITE op c(op)
JGTZ et l(R[0])
JZERO et l(R[0])
JUMP et 1
HALT 1
dove c(op) e c

(op) dipendono dalla forma delloperando op, e precisamen-


te: c(#n) = l(n), c(i) = l(i) + l(R[i]), c((i)) = l(i) + l(R[i]) + l(R[R[i]]) e
c

(i) = l(i), c

((i)) = l(i) + l(R[i]). Inoltre, con l(input) si intende il valore


della funzione l applicata allintero contenuto nella cella del nastro di input
correntemente in lettura.
Si noti che, per quanto riguarda la moltiplicazione, assumere un costo
logaritmico `e, in un certo senso, una forzatura; infatti ad oggi non `e noto
alcun metodo che consenta di eseguire la moltiplicazione di due interi di n bit
con un costo computazionale o(nlog n). Tuttavia adottare il costo logaritmico
indicato nella tabella consente di ottenere una ragionevole approssimazione
con una trattazione molto pi` u semplice.
Vediamo ora quale risulta, da un punto di vista asintotico, il costo di ese-
cuzione del programma dellEsempio 6.1 secondo il modello a costi logaritmici,
230 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
istruzione per istruzione, tenendo conto del valore massimo allocato in ogni
registro e di quante volte ogni istruzione viene eseguita (ultima colonna). (Si
ricordi che nel registro 1 viene inserito lintero x, nel registro 2 viene inserito
lintero y e nel registro 3 viene costruito il risultato x
y
).
READ 1 l(1) +l(x) O(log x) 1
READ 2 l(2) +l(y) O(log y) 1
LOAD #1 l(1) O(1) 1
STORE 3 l(3) +l(1) O(1) 1
5 LOAD 2 l(2) +l(y) O(log y) y + 1
JZERO 14 l(y) O(log y) y + 1
LOAD 1 l(1) +l(x) O(log x) y
MULT 3 l(3) +l(x) +l(x
y
) O(log x +y log x) y
STORE 3 l(3) +l(x
y
) O(y log x) y
LOAD 2 l(2) +l(y) O(log y) y
SUB #1 l(1) +l(y) O(log y) y
STORE 2 l(2) +l(y) O(log y) y
JUMP 5 1 O(1) y
14 WRITE 3 l(3) +l(x
y
) O(y log x) 1
HALT 1 O(1) 1
In totale abbiamo che il costo di esecuzione del programma `e:
O(1) + O(log x) + O(log y) + O((y + 1) log y) + O(y log x) + O(y
2
log x) +
O(y log y) + O(y) = O(y
2
log x).
Esercizio 6.4 Determinare il costo di esecuzione del programma per il calcolo di x!
(Esercizio 6.3) sia con il modello a costi uniformi sia con il modello a costi logaritmici.
6.3 Macchine a registri e macchine di Turing
Analogamente a quanto si `e fatto per le Macchine di Turing `e possibile denire
un concetto di funzione calcolabile con macchine a registri.
Denizione 6.1 Una funzione f : IN
n
IN `e calcolabile con macchine a
registri se esiste un programma P per RAM tale che, se f(x
1
, . . . , x
n
) = y
allora il programma P, inizializzato con x
1
, . . . , x
n
sul nastro di input, termina
con y sul nastro di output e se f(x
1
, . . . , x
n
) non `e denita allora il programma
P non termina.
Nel seguito vedremo che le RAM sono in grado di calcolare tutte e sole le
funzioni calcolabili secondo Turing. Infatti, anche se il modello delle macchine
a registri `e orientato al calcolo di funzioni numeriche, non `e dicile mostrare,
mediante delle simulazioni, che le RAM hanno lo stesso potere computazionale
delle Macchine di Turing.
6.3. MACCHINE A REGISTRI E MACCHINE DI TURING 231
Vediamo innanzitutto come una Macchina di Turing pu`o essere simulata
da una RAM. Per semplicit`a assumiamo che la macchina abbia un solo nastro
semi-innito e abbia come alfabeto i due soli simboli 0 e 1, ma si pu`o facilmente
generalizzare la dimostrazione al caso di Macchine di Turing a pi` u nastri e con
un alfabeto qualunque, purche nito.
Teorema 6.1 Data una qualunque Macchina di Turing / con nastro semi-
innito e con alfabeto di nastro = 0, 1, esiste una RAM con relativo
programma P tale che se / realizza la transizione dalla congurazione iniziale
q
0
x alla congurazione nale q
F
y e se la RAM `e inizializzata con la stringa
x nei registri 2, . . . , [ x [ +1, al termine della computazione la macchina a
registri avr`a nei registri 2, . . . , [ y [ +1 la stringa y. Inoltre se la macchina
/ opera in tempo T la RAM opera, nel modello a costi logaritmici, in tempo
O(T log T).
Dimostrazione. Per realizzare la simulazione consideriamo che alla cella i-
esima del nastro di / corrisponda il registro i + 1 della RAM e che esso
contenga 0 o 1 a seconda del contenuto della i-esima cella. Inoltre il registro
1 sar`a utilizzato per indirizzare la cella correntemente letta dalla testina della
macchina /. Poiche la macchina / allinizio `e posizionata sulla prima cella,
allinizio il registro 1 indirizzer`a il registro 2. Per ogni stato della macchina
/ il programma P conterr`a una sequenza di istruzioni. Ad esempio, se in
corrispondenza dello stato p la macchina prevede le seguenti due regole di
transizione (p, 0) = (q, 1, d) e (p, 1) = (p, 1, s), il programma P dovr`a pre-
vedere il seguente frammento (che per facilitare lintuizione supponiamo inizi
con letichetta p):
. . .
p LOAD (1)
JGTZ p
LOAD #1
STORE (1)
LOAD 1
ADD #1
STORE 1
JUMP q
p LOAD 1
SUB #1
STORE 1
JUMP p
. . .
`
E facile vedere, dunque, che ad ogni transizione della macchina di Turing la
RAM fa corrispondere lesecuzione di al pi` u 8 istruzioni ciascuna delle quali
232 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
ha un costo che `e O(log i
MAX
) dove i
MAX
indica il massimo numero di celle
usate da /. Poiche, se la macchina / esegue T passi, abbiamo i
MAX
T+1
segue che il costo complessivo di esecuzione del programma P `e O(T log T). 2
Similmente possiamo mostrare che una macchina di Turing `e in grado di simu-
lare una RAM. In questo caso, per comodit`a e senza restrizione di generalit`a
utilizziamo una macchina di Turing dotata di nastro di input, nastro di output
e tre nastri di lavoro.
Teorema 6.2 Data una macchina a registri con programma P che calcola la
funzione f esiste una macchina di Turing /tale che se f(x
1
, . . . , x
n
) = y e sul
nastro di input sono memorizzati in binario gli interi x
1
, . . . , x
n
, la macchina
/ termina con la rappresentazione binaria di y sul nastro di output e se
f(x
1
, . . . , x
n
) non `e denita la macchina / non termina in una congurazione
nale. Inoltre, se nel modello a costi logaritmici la RAM ha un costo T, /
opera in tempo O(T
2
).
Dimostrazione. I tre nastri di lavoro della macchina / sono usati nel se-
guente modo. Sul nastro T
1
sono memorizzati in binario tutti i contenuti dei
registri eettivamente utilizzati dalla RAM, ciascuno preceduto dal numero
dordine del registro stesso, sempre rappresentato in binario. Sul nastro T
2
`e rappresentato in binario il contenuto dellaccumulatore. Inne il nastro T
3
`e utilizzato come nastro di lavoro (Figura 6.2). Per ogni istruzione prevista
dalla RAM la macchina / avr`a alcuni stati che consentono di eseguire le ope-
razioni corrispondenti. Se si tratta di istruzioni di salto si deve solo vericare
se il contenuto dellaccumulatore soddisfa la condizione del salto ed eseguire le
opportune transizioni. Se si tratta di operazioni che non alterano il contenuto
dei registri (LOAD, WRITE, istruzioni aritmetiche) `e suciente:
cercare sul nastro T
1
il registro con il quale si deve operare,
eseguire loperazione prevista tra il contenuto del registro e laccumu-
latore o il nastro di output, modicando di conseguenza il contenuto
dellaccumulatore o del nastro di output.
Nel caso che si debba fare unoperazione di READ o di STORE e si renda
quindi necessario modicare il contenuto di un registro, si deve:
trascrivere dal nastro T
1
al nastro T
3
il contenuto del nastro T
1
a destra
del registro che si deve modicare,
eseguire loperazione prevista, modicando il contenuto del registro
cercato,
ricopiare di nuovo dal nastro di lavoro sul nastro T
1
la parte del nastro
che non `e stata modicata.
6.3. MACCHINE A REGISTRI E MACCHINE DI TURING 233
$ $ i
1 $ [i
1
] $ $

$ $ i
k $ [i
k
] $ $ T
1
[accumulatore] T
2
T
3

M
input output
memoria di lavoro
Figura 6.2 Macchina di Turing che simula una macchina a registri.
Le transizioni che la macchina / deve eseguire in corrispondenza di ogni
istruzione della RAM nel caso peggiore costano un tempo pari alla massima
lunghezza t
MAX
raggiunta dal nastro T
1
. Daltra parte, nel modello a costi
logaritmici, se il nastro T
1
`e lungo t
MAX
vuol dire che la macchina a registri ha
dovuto pagare un costo almeno uguale durante la sua computazione. Infatti, se
sul nastro T
1
compare il numero dordine i di un registro, vuol dire che la RAM
ha eettuato un accesso a tale registro ed ha quindi pagato almeno una volta
un costo pari a l(i). Analogamente, se compare sul nastro T
1
il contenuto di
un registro R[i] vuol dire che la RAM ha utilizzato come operando il contenuto
di tale registro ed ha quindi pagato almeno una volta un costo pari a l(R[i]).
Pertanto, in denitiva, se la macchina a registri opera con un costo T abbiamo
che la Macchina di Turing opera in tempo O(T t
MAX
) e poiche t
MAX
T il
costo totale `e O(T
2
). 2
Grazie ai due teoremi precedenti possiamo aermare che qualunque funzione
calcolabile secondo Turing `e anche calcolabile mediante RAM e, viceversa, se
sappiamo scrivere un programma RAM per una funzione essa `e anche cal-
colabile secondo Turing. Questo risultato ci ore una ulteriore occasione di
vericare la validit`a della tesi di Church-Turing.
Oltre a stabilire lequivalenza del potere computazionale di macchine di
Turing e RAM, un risultato di per se molto signicativo, i teoremi precedenti
presentano un altro aspetto interessante, legato al costo con cui le simulazioni
vengono eettuate. Infatti, poiche un problema (riconoscimento di un linguag-
234 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
gio, calcolo di una funzione etc.) viene generalmente considerato trattabile,
cio`e risolubile in pratica, se esso `e risolubile in tempo polinomiale, il fatto che
macchine di Turing e RAM a costi logaritmici si possano simulare reciproca-
mente in tempo polinomiale signica che, al ne di determinare la trattabilit`a
di un problema possiamo equivalentemente utilizzare macchine di Turing o
RAM. A questo ne il fatto che si utilizzi un modello a costi logaritmici `e
fondamentale.
`
E possibile infatti dimostrare il seguente risultato.
Teorema 6.3 Nel modello a costi uniformi una RAM con loperazione di mol-
tiplicazione pu`o calcolare in tempo polinomiale una funzione che richiede tempo
esponenziale per essere calcolata da una Macchina di Turing.
Esercizio 6.5 Dimostrare il teorema precedente.
[Suggerimento: Considerare i costi necessari a calcolare la funzione f(n) = 2
2
n
su
una RAM a costi uniformi dotate di operatore di moltiplicazione e su Macchine di
Turing].
Ci`o signica, dunque, che le RAM a costi uniformi sono un modello di
calcolo pi` u potente delle Macchine di Turing nel senso che esse sono in grado di
eseguire in tempo polinomiale calcoli che richiederebbero tempo esponenziale
con una Macchina di Turing.
Esercizio 6.6 Mostrare che una RAM con tre soli registri pu`o simulare una Macchina
di Turing con un unico nastro di lavoro potenzialmente illimitato.
[Suggerimento: Assumere che il nastro di lavoro abbia un alfabeto binario e che il
suo contenuto venga rappresentato con una coppia di interi in notazione binaria.]
6.4 Macchine a registri e linguaggi imperativi
Come si `e detto precedentemente le macchine a registri sono un modello di
calcolo particolarmente interessante perche il loro linguaggio di programma-
zione `e basato sulle istruzioni fondamentali di un qualunque linguaggio di
programmazione imperativo: istruzioni di input/output, trasferimenti tra re-
gistri, istruzioni aritmetiche elementari, etc. Di conseguenza i risultati e le
propriet`a che valgono per le RAM si possono facilmente estendere a macchi-
ne astratte programmate con linguaggi di programmazione pi` u complessi ma
sostanzialmente basati sulle stesse istruzioni.
Consideriamo, ad esempio, le tipiche istruzioni di un linguaggio assembla-
tivo con istruzioni a due indirizzi (come ad esempio il linguaggio assemblativo
della famiglia INTEL):
istruzioni di trasferimento tra registri e memoria o tra registri di inter-
faccia di ingresso/uscita e memoria (ad esempio: MOV <locazione>
6.4. MACCHINE A REGISTRI E LINGUAGGI IMPERATIVI 235
<registro>, MOV <registro> <locazione>, IN <porta> <registro>
etc.);
istruzioni aritmetiche (ad esempio ADD <locazione> <registro>, SUB
<locazione> <registro>) eventualmente con operando immediato o con
operando indiretto;
istruzioni logiche (ad esempio AND <locazione> <registro>) o di rota-
zione e shift del contenuto di un registro (ad esempio ADL <registro>,
che eettua lo shift circolare a sinistra del contenuto del registro);
istruzioni di controllo (salti condizionati e non, arresto, reset etc.).
`
E evidente che, in modo del tutto analogo a come abbiamo denito la calco-
labilit`a mediante RAM, possiamo denire le funzioni calcolabili con macchine
programmate con questo tipo di linguaggio.
`
E altrettanto chiaro per`o che,
attraverso un procedimento di traduzione dei programmi cos` costruiti in pro-
grammi RAM, tutte le funzioni calcolabili con questo secondo modello sono
calcolabili anche con le RAM.
Consideriamo ora un linguaggio ad alto livello, di tipo imperativo (Pascal,
Fortran, C etc.). Ancora una volta potremo denire le funzioni calcolabili co-
me quelle funzioni per le quali `e possibile costruire un programma di calcolo
in uno dei suddetti linguaggi. Tuttavia, anche in questo caso, lesistenza di
compilatori capaci di tradurre in linguaggio assemblativo i programmi scrit-
ti in tali linguaggi ci mostra immediatamente che le funzioni calcolabili con
un linguaggio ad alto livello sono calcolabili con un programma assembler e,
quindi, in denitiva, con un programma RAM.
Queste considerazioni forniscono unaltra conferma della tesi di Church-
Turing. Infatti, dopo aver visto che, rispetto al calcolo di funzioni, le RAM
e le macchine di Turing hanno lo stesso potere computazionale e dopo avere
osservato che un qualunque programma in linguaggio imperativo pu`o essere
tradotto in un programma per RAM, possiamo dire a questo punto che un
qualunque linguaggio di programmazione imperativo ha al pi` u lo stesso potere
delle macchine di Turing. Prima di concludere questa sezione desideriamo
introdurre ancora un modello di calcolo basato su macchina a registri, ma
questa volta si tratta di un modello molto elementare, in cui la semplicazione
del linguaggio di programmmazione `e spinta allestremo limite: la macchina a
registri elementare (MREL).
Una macchina a registri elementare, `e dotata di un numero nito, ma
arbitrario, di registri , celle di memoria che possono contenere un intero grande
a piacere. I registri sono accessibili direttamente, in base al loro numero
dordine. A dierenza della RAM la macchina non prevede accumulatore.
Invece, come nel caso della RAM, `e previsto un contatore delle istruzioni (CI)
che contiene il numero dordine della prossima istruzione che dovr`a essere
eseguita.
236 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
La macchina non ha nastri di ingresso e uscita ma per convenzione (e per
semplicit`a) si assume che:
i valori degli argomenti della funzione da calcolare x
1
, . . . , x
n
siano forniti
allinizio del calcolo nei registri R1, . . . , Rn,
tutti gli altri registri contengano il valore 0 allinizio dellesecuzione del
programma,
il valore della funzione f(x
1
, . . . , x
n
) calcolata dal programma, al termine
dellesecuzione del programma stesso si trovi in R1.
La Figura 6.3 fornisce una rappresentazione di una MREL.

CI CI
Programma
R1
R2
R3
R4
R1
R2
R3
R4
.
.
.
Figura 6.3 Rappresentazione sica di una macchina a registri elementare.
Un programma per MREL consiste in una sequenza di istruzioni di tre soli
tipi: incremento del contenuto di un registro, decremento del contenuto di un
registro, salto condizionato in base al contenuto di un registro.
Di seguito forniamo una semplice descrizione in stile BNF del linguaggio
delle MREL.
<programma> ::= <istruzione> <istruzione>
<istruzione> ::= R<intero positivo> := R<intero positivo> + 1 [
R<intero positivo> := R<intero positivo> 1 [
IF R<intero positivo> = 0 THEN GOTO <etichetta>
<etichetta> ::= <intero>
Si noti che, poiche il contenuto di un registro `e un intero non negativo quando
si decrementa il contenuto di un registro che `e gi`a pari a 0 il contenuto rimane
0.
Inoltre listruzione di salto condizionato IF Ri = 0 THEN GOTO <eti-
chetta> viene interpretata nel seguente modo: se il contenuto del registro
Ri `e uguale a 0 allora si salta allistruzione il cui numero dordine `e dato
dalletichetta, altrimenti si prosegue con lesecuzione dellistruzione seguente.
6.5. FUNZIONI RICORSIVE 237
Per convenzione il programma termina se si eettua un salto allistruzione 0.
In ogni altra circostanza (cio`e quando il programma cicla o il programma salta
ad unistruzione non esistente ma diversa da 0) diciamo che il calcolo non `e
denito.
Esempio 6.2 Vediamo un esempio di programma MREL per il calcolo della somma
di due interi f(x, y) = x +y:
IF R2 = 0 THEN GOTO 0
R2 := R2 1
R1 := R1 + 1
IF R3 = 0 THEN GOTO 1
Come si vede il fatto che il registro R3 sia inizializzato a zero ci consente di simulare
un salto incondizionato.
Esercizio 6.7 Denire programmi per MREL corrispondenti ai seguenti programmi
per RAM:
LOAD 1
ADD 2
STORE 1
LOAD 1
MULT 2
STORE 1
Con considerazioni analoghe a quelle fatte precedentemente non `e dicile
convincersi che se una funzione `e calcolabile con una macchina a registri essa
`e calcolabile anche con una MREL. Infatti ogni passo di una RAM pu`o essere
sostituito da uno o pi` u passi di una MREL. Daltra parte `e interessante os-
servare che un linguaggio estremamente elementare come quello delle MREL
continua ancora a possedere lo stesso potere computazionale di una Macchina
di Turing o di un programma C.
Nella Sezione 6.6 utilizzeremo ancora le macchine a registri elementari per
formalizzare in modo preciso i concetti di stato, computazione, etc. e fornire
una sorta di forma normale per le funzioni calcolabili.
6.5 Funzioni ricorsive
La caratterizzazione delle funzioni calcolabili `e stata data, no a questo punto,
attraverso la denizione delle classi di macchine (macchine di Turing, macchi-
ne a registri etc.) che vengono utilizzate per il loro calcolo. In questa sezione
238 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
introduciamo il formalismo delle funzioni ricorsive, che consente di dare una
caratterizzazione matematica delle funzioni calcolabili attraverso lindividua-
zione di alcune funzioni base (funzioni calcolabili estremamente elementari)
e la costruzione di nuove funzioni calcolabili, ottenute applicando opportuni
operatori a funzioni denite precedentemente.
Le funzioni ricorsive sono state introdotte da Godel e Kleene negli anni
30 (vedi Capitolo A), ma il loro studio si `e sviluppato anche successivamente
allavvento dei primi calcolatori e dei primi linguaggi di programmazione ad
alto livello nche, alla ne degli anni 50, esse hanno ispirato direttamente i
primi linguaggi di programmazione funzionale.
Nel seguito del capitolo vedremo da un lato la relazione delle funzioni
ricorsive con i modelli di calcolo basati sulle macchine a registri e con i re-
lativi linguaggi di tipo imperativo e, dallaltro lato, come esse sono collegate
a modelli e linguaggi di tipo funzionale, come il formalismo di McCarthy e il
LISP.
In questa sezione, per descrivere in modo esatto la denizione di una fun-
zione, si far`a uso della notazione lambda, che permette di specicare lin-
sieme delle variabili sulle quali la funzione si intende denita. Per mezzo
di tale formalismo, una funzione di n variabili x
1
, x
2
, . . . , x
n
, associata ad
una espressione algebrica f(x
1
, . . . , x
n
) in forma chiusa, sar`a descritta come
x
1
x
2
. . . x
n
.f(x
1
, . . . , x
n
). Ad esempio, per indicare una corrispondenza
che ad ogni coppia di valori x
1
, x
2
associa la somma degli stessi, scriveremo
x
1
x
2
.x
1
+x
2
.
Consideriamo ora linsieme di tutte le funzioni intere:
T = f [ f : IN
n
IN, n 0
In generale con la notazione f
(n)
intendiamo esplicitare che il numero di ar-
gomenti della funzione f `e n. Se n = 0 la funzione `e una costante. Per
individuare allinterno dellinsieme T classi di funzioni che corrispondano ad
un concetto intuitivo di calcolabilit`a procederemo nel seguente modo: de-
niremo anzitutto alcune funzioni base cos` elementari che apparir`a del tutto
naturale supporre di poterle calcolare, noti i valori degli argomenti. Successi-
vamente deniremo degli operatori , ovvero, con termine pi` u informatico, dei
costrutti , che consentiranno di denire nuove funzioni a partire dalle funzioni
gi`a disponibili.
Denizione 6.2 Deniamo come funzioni base le seguenti funzioni:
i) 0
(n)
= x
1
. . . x
n
.0, n 0, funzioni zero,
ii) S = x.x + 1, funzione successore,
iii) U
(n)
i
= x
1
. . . x
n
.x
i
, funzioni identit`a o selettive.
La prima classe di funzioni che deniamo `e la classe delle funzioni ricorsive
primitive.
6.5. FUNZIONI RICORSIVE 239
Denizione 6.3 La classe delle funzioni ricorsive primitive T `e la pi` u piccola
classe che contiene le funzioni base e inoltre:
i) se le funzioni h
(m)
, g
(n)
1
, . . . , g
(n)
m
sono ricorsive primitive allora anche la
funzione f
(n)
denita mediante loperatore di composizione:
f(x
1
, . . . , x
n
) = h(g
1
(x
1
, . . . , x
n
), . . . , g
m
(x
1
, . . . , x
n
))
`e ricorsiva primitiva;
ii) se le funzioni h
(n+2)
, g
(n)
sono ricorsive primitive allora anche la funzione
f
(n+1)
denita mediante loperatore di ricursione primitiva:
- f(x
1
, . . . , x
n
, 0) = g(x
1
, . . . , x
n
),
- f(x
1
, . . . , x
n
, y + 1) = h(x
1
, . . . , x
n
, y, f(x
1
, . . . , x
n
, y))
`e ricorsiva primitiva.
Esempio 6.3 Le seguenti funzioni sono ricorsive primitive:
1. incr2 = xy.x + 2. Tale funzione pu`o essere espressa utilizzando le funzioni
base e la sola composizione come incr2= S(S(U
(2)
1
).
2. somma = xy.x + y. Tale funzione pu`o essere espressa, utilizzando la
ricursione primitiva, nel modo seguente:
- somma(x, 0) = x
- somma(x, y + 1) = somma(x, y) + 1
In questo caso la funzione g della Denizione 6.3 ha un solo argomento e coin-
cide con la funzione selettiva U
(1)
1
; la funzione h ha tre argomenti ed `e la fun-
zione x
1
x
2
x
3
.S(U
(3)
3
(x
1
, x
2
, x
3
)), ottenuta per composizione della funzione
successore e della funzione selettiva U
(3)
3
.
Esercizio 6.8 Dimostrare che la funzione prodotto xy.x y `e ricorsiva primitiva.
Esercizio 6.9 Dimostrare che la funzione predecessore x.x 1, che si assume
restituisca il valore 0 se x = 0, `e ricorsiva primitiva.
Esercizio 6.10 Sia p una funzione ricorsiva primitiva con valori 0 e 1 e siano g ed
h due funzioni ricorsive primitive, dimostrare che la funzione f denita per casi nel
seguente modo:
f(x) =
_
se p(x) = 1 allora g(x)
altrimenti h(x)
`e ricorsiva primitiva.
240 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
Si noti che frequentemente la denizione di una funzione in termini ri-
corsivi ha una struttura pi` u semplice, ed `e basata sul seguente schema. Se le
funzioni h
(2)
, g
(1)
sono ricorsive primitive e c `e una costante, allora anche la
funzione f
(1)
denita come:
- f(0) = c
- f(x + 1) = h(g(x), f(x))
`e ricorsiva primitiva.
Esercizio 6.11 Dimostrare lasserzione precedente, e cioe che una funzione denita
secondo lo schema semplicato `e in eetti ricorsiva primitiva.
Esercizio 6.12 Dimostrare, applicando lo schema semplicato, che la funzione
fattoriale x.x! `e ricorsiva primitiva.
Esercizio 6.13 Dimostrare, applicando lo schema semplicato, che la funzione
esponenziale x.2
x
`e ricorsiva primitiva.
Come si vede, la denizione di ricursione primitiva `e abbastanza compren-
siva; tuttavia esistono funzioni per le quali `e possibile dare una denizione di
tipo ricorsivo (che permette quindi una univoca sequenza di passi di calcolo)
ma che non rientrano nella classe T. Un esempio `e la funzione di tre argomenti
cos` denita:
f(x, y, 0) = x +y
f(x, y, 1) = x y
f(x, y, 2) = x
y
e, per n 2,
f(x, y, n + 1) =
_

_
1 se y = 0
y volte
..
f(x, f(x, . . . , f( x, 0, n), . . . , n), n) altrimenti
Il metodo di denizione della funzione precedente `e basato su una dop-
pia ricursione: infatti, come si vede, per ogni valore di n la funzione
xy.f(x, y, n) `e ricorsiva primitiva rispetto alla variabile y, ed inoltre la
funzione xy.f(x, y, n+1) `e costruita utilizzando la funzione xy.f(x, y, n).
Ad esempio, la funzione
f(x, y, 3) =
_
_
_
1 se y = 0
x
x
.
.
.
x
_
y volte
altrimenti
6.5. FUNZIONI RICORSIVE 241
`e una funzione ricorsiva primitiva ottenuta per iterazione dellesponenziale
(corrispondente a xy.f(x, y, 2)).
La denizione in termini niti di f `e, per ogni x 0, y 0, n 0:
f(x, 0, 0) = x
f(x, y + 1, 0) = f(x, y, 0) + 1
f(x, 0, 1) = 0
f(x, 0, n + 2) = 1
f(x, y + 1, n + 1) = f(x, f(x, y, n + 1), n)
`
E possibile dimostrare che la funzione f sopra denita, detta funzione di
Ackermann, non `e ricorsiva primitiva, pur essendo essa stessa denita in ter-
mini ricorsivi. Da ci`o deriva che la ricursione primitiva non `e sucientemente
potente da descrivere tutte le funzioni denibili in modo ricorsivo.
Introduciamo quindi ora un nuovo operatore che ci permetta di estendere
la classe delle funzioni ricorsive primitive e di cogliere in modo pi` u ampio il
concetto di calcolabilit`a.
Denizione 6.4 Data una funzione g
(n+1)
, la funzione f
(n)
si dice denita
mediante loperatore di minimalizzazione se f(x
1
, . . . , x
n
) assume come va-
lore il minimo t tale che g(x
1
, . . . , x
n
, t) = 0; se g(x
1
, . . . , x
n
, t) ,= 0 per tutti i
valori di t, allora f(x
1
, . . . , x
n
) `e indenita.
Utilizzeremo la notazione f = x
1
. . . x
n
.t(g(x
1
, . . . , x
n
, t) = 0) per indicare
che la funzione f `e denita applicando loperatore di minimalizzazione sulla
funzione g.
Denizione 6.5 La classe delle funzioni ricorsive (dette anche ricorsive gene-
rali o ricorsive parziali) 1 `e la pi` u piccola classe che contiene le funzioni base,
ed `e chiusa rispetto a composizione, ricursione primitiva e minimalizzazione.
Esempio 6.4 La funzione n.

n `e ricorsiva in quanto pu`o essere denita come

n =
t((n + 1) (t + 1) (t + 1) = 0).
Si noti che anziche utilizzare il predicato g(x
1
, . . . , x
n
, t) = 0 per determinare
il valore no al quale deve essere incrementata la variabile t, possiamo utiliz-
zare un qualunque altro predicato T(x
1
, . . . , x
n
, t), purche esista una funzione
ricorsiva g per cui T(x
1
, . . . , x
n
, t) `e vero se e solo se g(x
1
, . . . , x
n
, t) = 0.
Esempio 6.5 i) La funzione n.

n pu`o essere cos` denita:

n = t((t + 1) (t + 1) > n)
ii) La funzione n.md(n) che associa ad ogni intero n il minimo intero maggiore di
1 che divide n pu`o essere cos` denita:
md = t((t > 1) resto(n, t) = 0)
242 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
Esercizio 6.14 Utilizzando loperatore , dimostrare che la seguente funzione `e
ricorsiva: n.n-esimo numero primo.
Esercizio 6.15 Sia g(x, t) una funzione che, per ogni valore di x, si annulla per alcuni
valori di t > 0 e sia t(x) il minimo di tali valori. Denire una funzione primitiva
ricorsiva g

(x, t) tale che g

(x, t) = 0 se t < t(x) e g

(x, t) 1 altrimenti.
Esercizio 6.16 Sia g(x, t) una funzione che, per ogni valore di x, si annulla per alcuni
valori di t > 0 e sia t(x) il minimo di tali valori. Denire una funzione primitiva
ricorsiva g

(x, t) tale che g

(x, t) = 1 se t = t(x) e g

(x, t) = 0 altrimenti.
Esercizio 6.17 Dimostrare che se le funzioni g e h sono ricorsive primitive lo `e anche
la funzione f denita nel seguente modo (operatore limitato):
f = x
1
. . . x
n
.t h(x
1
, . . . , x
n
)(g(x
1
, . . . , x
n
, t) = 0) cio`e f(x
1
, . . . , x
n
) assume
come valore il minimo valore di t tale che g(x
1
, . . . , x
n
, t) = 0 se esiste un valore
di t h(x
1
, . . . , x
n
) tale che g(x
1
, . . . , x
n
, t) = 0; se per nessun valore di t
h(x
1
, . . . , x
n
)g(x
1
, . . . , x
n
, t) = 0, allora f(x
1
, . . . , x
n
) assume un valore di default,
ad esempio 0.
[Suggerimento: Utilizzare i due esercizi precedenti].
Le funzioni ricorsive sono dunque funzioni numeriche che hanno la ca-
ratteristica o di essere estremamente elementari (funzioni zero, successore,
selettive) o di essere ottenibili mediante un numero nito di applicazioni de-
gli operatori di composizione, di ricursione primitiva, di minimalizzazione a
partire dalle funzioni base. Come si vede immediatamente la parzialit`a delle
funzioni ricorsive deriva dallutilizzazione delloperatore , infatti mentre gli
altri operatori portano da funzioni totali a funzioni totali, utilizzando lope-
ratore pu`o accadere che il valore della funzione non sia denito per alcuni
valori degli argomenti.
6.6 Funzioni ricorsive e linguaggi imperativi
Come si `e visto, la denizione delle funzioni ricorsive si basa su costruzioni
di tipo matematico che, almeno esplicitamente, non fanno riferimento a par-
ticolari modelli di macchina. Daltra parte, per chi abbia dimestichezza con
la programmazione risulta subito evidente che le funzioni ricorsive sono calco-
labili con le macchine a registri. Per vericare questa propriet`a `e suciente
mostrare come si possono calcolare le funzioni ricorsive utilizzando un linguag-
gio ad alto livello (ad esempio C) e ricordare quanto detto precedentemente
sulla possibilit`a di compilare il codice di un programma scritto in un linguaggio
imperativo ad alto livello per una macchina a registri.
6.6. FUNZIONI RICORSIVE E LINGUAGGI IMPERATIVI 243
Teorema 6.4 Data una qualunque funzione ricorsiva `e possibile denire un
programma C che la calcola.
Esercizio 6.18 Dimostrare il precedente enunciato. Nota bene: al ne di rendere
pi` u signicativo lesercizio si raccomanda di utilizzare solo i costrutti fondamentali
del C (if-else, while, do-while) e di utilizzare solo funzioni che non facciano uso della
ricursione.
Quanto sopra ci dice dunque che le funzioni ricorsive possono essere calco-
late con macchine a registri. Pi` u complesso `e dimostrare il risultato opposto e
cio`e che ogni funzione calcolata da una macchina a registri `e ricorsiva. Quando
avremo dimostrato questultimo risultato avremo stabilito che eettivamente
le funzioni calcolabili con macchine a registri e linguaggi di programmazione
imperativi coincidono con le funzioni ricorsive.
Per giungere a questo obiettivo in modo pi` u facilmente comprensibile, fare-
mo riferimento, anziche a RAM, a macchine a registri elementari, e mostreremo
come sia possibile codicare mediante interi gli stati assunti da una macchina
a registri elementare, oltre che le computazioni da essa eseguite.
Introduciamo anzi tutto le seguenti funzioni di creazione di n-ple e di
estrazione di elementi da una n-pla, che ci consentiranno di esprimere mediante
numeri interi i suddetti concetti di stato e di computazione. In particolare
indichiamo come funzioni di creazione di n-ple le funzioni P
k
che associano
biunivocamente un intero ad una n-pla di interi, e che sono cos` denite:
P
n
= x
1
. . . x
n
[2
x
1
. . . p
n
x
n
]
dove p
n
`e ln-esimo numero primo (p
1
= 2).
Deniamo inoltre le funzioni di estrazione di elementi da una n-pla come
K
i
= z[esponente di p
i
nella decomposizione in fattori primi di z]
dove, ancora, p
i
`e li-esimo numero primo (p
1
= 2).
Per tali funzioni useremo la notazione x
1
, . . . , x
n
) = P
n
(x
1
, . . . , x
n
) e
(z)
i
= K
i
(z), rispettivamente; inoltre introduciamo la notazione
M(t) = if t = 0 then 0 else maxn [ p
n
divide t
per indicare lindice del massimo numero primo che divide un intero dato.
Valgono le propriet`a:
K
i
(P
n
(x
1
, . . . , x
n
)) = x
i
se i n, 0 altrimenti;
P
n
(K
1
(z), . . . , K
n
(z)) = z se n = M(z).
Esercizio 6.19 Dimostrare che P
n
e K
i
sono ricorsive primitive, per ogni n ed ogni
i.
A questo punto, utilizzando la notazione introdotta, possiamo denire
formalmente lo stato e la computazione eettuata da una macchina a registri
elementare.
244 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
Denizione 6.6 Uno stato di una macchina a registri elementare con pro-
gramma , il quale utilizza m registri ed `e costituito da l istruzioni, `e
rappresentato da un intero:
s = i, r
1
, . . . , r
m
))
dove i (0 i l) `e il numero dordine dellistruzione da eseguire, e
r
1
, . . . , r
m
0 sono gli interi contenuti nei registri.
Esempio 6.6 Gli stati attraversati dalla computazione del programma della somma
(Esempio 6.2) con input 3 e 2, sono codicati nel seguente modo:
s
1
1, 3, 2, 0)) = 2 3
2
3
3
2
= 2 3
72
s
2
2, 3, 2, 0)) = 2
2
3
72
s
3
3, 3, 1, 0)) = 2
3
3
2
3
3
= 2
3
3
24
s
4
4, 4, 1, 0)) = 2
4
3
2
4
3
= 2
4
3
48
s
5
1, 4, 1, 0)) = 2 3
48
s
6
2, 4, 1, 0)) = 2
2
3
48
s
7
3, 4, 0, 0)) = 2
3
3
2
4
= 2
3
3
16
s
8
4, 5, 0, 0)) = 2
4
3
2
5
= 2
4
3
32
s
9
1, 5, 0, 0)) = 2 3
32
s
10
0, 5, 0, 0)) = 2
32
.
Consideriamo ora una computazione eseguita da una macchina a registri ele-
mentare con m registri r
1
, . . . , r
m
, programma ed input x
1
, . . . , x
n
(n m),
ed assumiamo che tale computazione sia data dalla sequenza di stati s
1
, . . . , s
t
.
Lo stato iniziale della computazione `e s
1
= 1, x
1
, . . . , x
n
, 0, . . . , 0) e gli stati
successivi nella computazione devono essere correlati tra loro da una funzione
R

con valori 0, 1, dipendente dal programma , e cos` denita: R

(s
p
, s
q
) = 1,
dove s
p
= i
p
, r
p
1
, . . . , r
p
m
)) ed s
q
= i
q
, r
q
1
, . . . , r
q
m
)), se e solo se valgono le
seguenti propriet`a.
a) se i
p
corrisponde allistruzione Rj = Rj + 1
allora i
q
= i
p
+ 1 ed r
q
k
=
_
r
p
k
+ 1 se k = j
r
p
k
altrimenti
b) se i
p
corrisponde allistruzione Rj = Rj

1
allora i
q
= i
p
+ 1 ed r
q
k
=
_
r
p
k

1 se k = j
r
p
k
altrimenti
c) se i
s
: IF Rj = 0 GOTO h
allora i
q
=
_
h se r
p
j
= 0
i
p
+ 1 altrimenti
ed r
q
k
= r
p
k
per ogni k.
6.6. FUNZIONI RICORSIVE E LINGUAGGI IMPERATIVI 245
d) Se i
p
`e un numero maggiore del numero di istruzione del programma
allora i
q
= i
p
ed r
q
k
= r
p
k
per ogni k.
(si noti che questo ultimo caso comporta lesecuzione di un ciclo innito).
Chiaramente, una computazione `e nita se e solo se il programma si arresta
in modo legale, vale a dire se si verica un salto allistruzione 0. In tal caso si
ha uno stato nale:
s
F
= 0, r
F
1
, . . . , r
F
m
))
e il valore della funzione calcolata `e r
F
1
.
Denizione 6.7 Sia s
1
, . . . , s
t
una computazione nita eseguita da un mac-
china a registri elementare con programma . Tale computazione pu`o essere
codicata mediante un intero c = 2
s
1
3
s
2
. . . p
s
t
t
.
Esempio 6.7 La computazione del programma della somma (Esempio 6.2) con input
3 e 2, `e codicata nel seguente modo:
2
(23
72
)
3
(2
2
3
72
)
5
(2
3
3
24
)
7
(2
4
3
48
)
. . . 29
(2
32
)
Dimostriamo ora il seguente Lemma.
Lemma 6.5 Dato un programma , la funzione T

2
cos` denita:
T

(x
1
, . . . , x
n
, c) =
_

_
1 se c = s
1
, . . . , s
F
) e s
1
, . . . , s
F
`e la
computazione di con input
x
1
, . . . , x
n
;
0 altrimenti
`e ricorsiva primitiva.
Dimostrazione. Deniamo anzitutto le seguenti funzioni con valori 0, 1, che
corrispondono rispettivamente alla verica che la computazione c inizi in uno
stato iniziale e termini in uno stato nale.
A) I

(x
1
, . . . , x
n
, s) = 1 se e solo se s = 1, x
1
, . . . , x
n
)).
B) F

(s) = 1 se e solo se (s)


1
= 0, cioe se s `e uno stato nale.
2
Il predicato corrispondente alla funzione T `e generalmente denominato predicato di
Kleene.
246 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
Ricordando la denizione della funzione R

introdotta precedentemente,
possiamo a questo punto denire la funzione T

nel seguente modo:


T

(x
1
, . . . , x
n
, c) = I

(x
1
, . . . , x
n
, (c)
1
)
M(c)1

p=1
R

((c)
p
, (c)
p+1
) F

((c)
M(c)
)
In altre parole, dato t si deve controllare che tutti gli esponenti della sua
decomposizione in primi, (c)
1
, (c)
2
, . . . , (c)
p
, (c)
p+1
, . . . , (c)
M(c)
, costituiscano
una sequenza di calcolo di con input x
1
, . . . , x
n
.
Essendo ricorsive primitive le funzioni: , M, P
n
, K
i
, segue che T

`e
ricorsiva primitiva. 2
Si noti che I

dipende da solo nel numero di registri di cui si deve vericare


la corretta inizializzazione; F

non dipende aatto da . Al contrario, R

dipende pesantemente dalle singole istruzioni di .


Esercizio 6.20 Completare la dimostrazione vericando che tutte le funzioni consi-
derate nella dimostrazione stessa sono ricorsive primitive.
Esempio 6.8 La funzione T

associata al programma di somma introdotto


nellEsempio 6.2 `e ottenuta prendendo:
I

(x
1
, x
2
, s) =
_
_
_
1 se (s)
1
= 1 & ((s)
2
)
1
= x
1
& ((s)
2
)
2
= x
2
0 altrimenti
F

(a) = 1

(a)
1
R

(a, b) = 1 se solo se M(a) = M(b) = 2, M((a)


2
) = M((b)
2
) = 2 e se:
(a)
1
= 1 [((a)
2
)
2
) = 0 & (b)
1
= 0] [((a)
2
)
2
,= 0 & (b)
1
= 2]
((a)
2
)
1
= ((b)
2
)
1
((a)
2
)
2
= ((b)
2
)
2
((a)
2
)
3
= ((b)
2
)
3
oppure se:
(a)
1
= 2 ((a)
2
)
1
= ((b)
2
)
1
((a)
2
)
2

1 = ((b)
2
)
2
((a)
2
)
3
= ((a)
2
)
3
(b)
1
= 3
oppure se:
(a)
1
= 3 ((a)
2
)
1
+ 1 = ((b)
2
)
1
((a)
2
)
2
= ((b)
2
)
2
((a)
2
)
3
= ((b)
2
)
3
(b)
1
= 4
6.7. FUNZIONI RICORSIVE E LINGUAGGI FUNZIONALI 247
oppure se:
(a)
1
= 4 (((a)
2
)
3
= 0 & (b)
1
= 1) (((a)
2
)
3
,= 0 & (b)
1
= 5)
((a)
2
)
1
= ((b)
2
)
1
((a)
2
)
2
= ((b)
2
)
2
((a)
2
)
3
= ((b)
2
)
3
Nellesempio risulta chiaramente che I

, R

, F

sono funzioni ricorsive primitive.


A questo punto possiamo formulare il teorema seguente.
Teorema 6.6 Dato un programma per una macchina a registri elementare,
la funzione x
1
. . . x
n
.f(x
1
, . . . , x
n
) calcolata da `e una funzione ricorsiva
parziale.
Dimostrazione. Sia T

la funzione denita nel Lemma precedente, in cor-


rispondenza al programma assegnato. Possiamo denire la funzione f nel
seguente modo:
f(x
1
, . . . , x
n
) = U(c[T

(x
1
, . . . , x
n
, c) = 1])
dove U(c) = (((c)
M(c)
)
2
)
1
`e la funzione che estrae s
F
= (c)
M(c)
da c ed estrae
x
F
1
da s
F
. 2
Il teorema precedente `e particolarmente interessante per vari motivi. Innan-
zitutto consente di dimostrare che la classe delle funzioni ricorsive coincide
con la classe delle funzioni calcolabili mediante RAM, e quindi con quella del-
le funzioni calcolabili secondo Turing, orendo ancora una ulteriore conferma
della testi di Church-Turing. Inoltre, esso ore una particolare caratterizzazio-
ne delle funzioni ricorsive (e quindi delle funzioni calcolabili in generale), mo-
strando come esse siano ottenibili combinando in modo opportuno due funzioni
ricorsive primitive e utilizzano una sola volta loperatore di minimalizzazione.
6.7 Funzioni ricorsive e linguaggi funzionali
La teoria delle funzioni ricorsive, oltre a costituire un signicativo approccio
al concetto di calcolabilit`a, alternativo a quelli basati su modelli di macchina,
quali le Macchine di Turing e le Macchine a registri, ha avuto un impatto
importante sullo sviluppo dei linguaggi di programmazione. In particolare,
vari concetti impliciti nel modello delle funzioni ricorsive sono stati adottati
nella denizione dei linguaggi di programmazione funzionali. Tali linguaggi,
similmente a quanto avviene nel modello delle funzioni ricorsive, permettono
di descrivere funzioni senza fare riferimento esplicito ai modelli di macchina
che eseguono il calcolo. In tale contesto, il concetto di esecuzione di una
computazione viene sostituito da quello di valutazione di una espressione, cos`
248 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
come avviene quando una funzione viene descritta mediante una espressione
matematica in forma chiusa.
Nella presente sezione introduciamo un semplice linguaggio di program-
mazione funzionale il quale, come mostreremo, consente la denizione di tutte
le funzioni ricorsive. Al ne di introdurre il linguaggio stesso, presentiamo
un formalismo, detto formalismo di McCarthy, che descrive in modo parti-
colarmente sintetico ed ecace la struttura sintattica che linguaggi di tipo
funzionale possono avere, e che `e alla base sia del linguaggio di programma-
zione funzionale che descriveremo in questa sezione, che del pi` u noto di tali
linguaggi, il linguaggio LISP.
Siano dati i seguenti insiemi di simboli:
X = x
1
, x
2
, . . .: insieme, eventualmente innito, di simboli di variabile
B = b
1
, b
2
, . . .: insieme, eventualmente innito, di simboli di funzione
base
F = F
1
, F
2
, . . .: insieme, eventualmente innito, di simboli di variabile
funzione
a : IN
+
IN : arit`a delle funzioni in B
A : IN
+
IN
+
: arit`a delle funzioni in F.
Utilizzando gli insiemi suddetti e le arit`a delle funzioni, possiamo introdurre
la seguente denizione.
Denizione 6.8 Un termine su < X, B, F > pu`o essere denito induttiva-
mente nel modo seguente:
1. se x X allora x `e un termine
2. se b
j
B, con arit`a a(j) = n 0, e t
1
, . . . , t
n
sono termini, allora
b(t
1
, . . . , t
n
) `e un termine
3. se F
i
F, con arit`a A(i) = m > 0, e t
1
, . . . , t
m
sono termini
4. allora F
i
(t
1
, . . . , t
m
) `e un termine.
Se la arit`a di una funzione base b
k
() `e a(k) = 0, allora tale funzione viene
detta costante e viene rappresentata semplicemente come b
k
.
A questo punto possiamo denire il concetto di schema di programma su X,
B, F.
Denizione 6.9 Dati tre insiemi X, B, F, uno schema di programma sulla
terna < X, B, F > `e costituito da una sequenza nita di coppie di termini del
tipo
F
i
(x
1
, . . . , x
n
) t
j
6.7. FUNZIONI RICORSIVE E LINGUAGGI FUNZIONALI 249
dove F
i
F e t
j
`e un generico termine su < X, B, F >, seguita da un termine
del tipo
F
h
(b
1
, . . . , b
m
)
dove F
h
F, A(h) = m e b
1
, . . . , b
m
B sono costanti.
Nellinterpretazione pi` u naturale di uno schema di programma la sequenza
di coppie pu`o essere vista come una sequenza di dichiarazioni di funzioni,
mentre il termine contenente la costante b pu`o essere visto come la richiesta
di determinare il valore della funzione F
h
sugli argomenti b
1
, . . . , b
m
.
Esempio 6.9 Siano b
1
, b
2
, b
3
, b
4
rispettivamente di arit`a 3, 1, 1, 0, ed F
1
, F
2
di arit`a
2, 1. Un esempio di schema di programma su X = X
1
, X
2
, B = b
1
, b
2
, b
3
, b
4
ed
F = F
1
, F
2
`e il seguente:
F
1
(x
1
, x
2
) b
1
(x
1
, F
2
(b
2
(x
2
)), x
1
)
F
2
(x
1
) b
2
(F
1
(x
1
, b
3
(x
1
)))
F
2
(b
4
)
Per passare dal formalismo astratto di McCarthy a un linguaggio specico
`e suciente denire linsieme delle funzioni base che deve essere messo in
corrispondenza con i simboli dellinsieme B. In tal modo, possiamo denire
un semplice linguaggio di tipo funzionale, denominato SLF, per la denizione
di funzioni intere, scegliendo le funzioni base come segue.
Sia B = ^ S, P, if-then-else, in cui ^ rappresenta tutti i simboli di
costante corrispondenti ai naturali, e indichiamo con S la funzione successore
(di arit`a 1), con P la funzione predecessore (di arit`a 1) e con if-then-else
lusuale costrutto di alternativa (di arit`a 3), denito nel modo seguente
if-then-else (t
1
, t
2
, t
3
) = t
2
se il valore di t
1
`e 0, t
3
altrimenti.
Esempio 6.10 Un programma per il calcolo della sottrazione tra due interi non
negativi, ad esempio gli interi 4 e 3, pu`o essere formulato, nel linguaggio SLF, nel
modo seguente:
sub(x, y) if-then-else(y, x, P(sub(x, P(y))))
sub(4, 3)
Come mostrato dal teorema seguente, il potere computazionale del linguaggio
SLF `e equivalente a quello di qualunque altro formalismo per il calcolo delle
funzioni ricorsive (macchina di Turing, RAM, linguaggi di programmazione
imperativi, etc.).
Teorema 6.7 Il linguaggio SLF consente la denizione di tutte le funzioni
ricorsive.
Dimostrazione. Le funzioni base possono essere espresse in SLF; infatti, il
successore fa parte delle funzioni base di SLF, mentre le funzioni zero, 0
(n)
i
, e
selettive, U
(n)
i
, possono essere denite rispettivamente come segue:
F(x
1
, . . . , x
n
) 0
250 CAPITOLO 6. MODELLI IMPERATIVI E FUNZIONALI
F(x
1
, . . . , x
n
) x
i
Se la funzione F `e denita per composizione delle funzioni h, g
1
, . . . , g
m
,
essa pu`o essere denita in SLF come segue:
F(x
1
, . . . , x
n
) h(g
1
(x
1
, . . . , x
n
), . . . , g
m
(x
1
, . . . , x
n
))
Se la funzione F `e denita per ricursione primitiva a partire dalle funzioni
g ed h, essa pu`o essere denita in SLF come segue:
F(x
1
, . . . , x
n
, y)
if-then-else(y, g(x
1
, . . . , x
n
), h(x
1
, . . . , x
n
, y, F(x
1
, . . . , x
n
, P(y)))
Se la funzione F `e denita per minimalizzazione a partire dalla funzione
g, essa pu`o essere denita in SLF come segue:
F(x
1
, . . . , x
n
) G(x
1
, . . . , x
n
, 0)
G(x
1
, . . . , x
n
, y) if-then-else(g(x
1
, . . . , x
n
, t), t, G(x
1
, . . . , x
n
, S(t)))
2
Esercizio 6.21 Fornire un programma SLF per il calcolo di 4!.
Il formalismo di McCarthy e il linguaggio SLF `e lanello di raccordo tra il
formalismo delle funzioni ricorsive e i reali linguaggi di programmazione funzio-
nali che ne sono stati derivati. In particolare, il linguaggio di programmazione
LISP pu`o essere ottenuto a partire dal formalismo di McCarthy assumendo co-
me funzioni base le operazioni di manipolazione di liste adottando una diversa
interpretazione dellinsieme dei simboli delle funzioni base, e cio`e assumendo
le funzioni base di manipolazione di liste.
Capitolo 7
Teoria generale della calcolabilit`a
7.1 Tesi di Church-Turing
Quanto si `e visto nel capitolo precedente ha due aspetti interessanti: il primo
`e che dierenti formulazioni del concetto di calcolabilit`a, corrispondenti a di-
verse nozioni di algoritmo e di dispositivo di calcolo, portano a denire tutte
la stessa classe di funzioni; il secondo `e che le tecniche di simulazione di una
macchina da parte di unaltra permettono di introdurre concetti fondamentali
per una teoria della programmazione, come quelli di congurazione, di sequen-
za di calcolo e di aritmetizzazione. Vedremo, nelle prossime sezioni, come il
concetto di aritmetizzazione ci permette di formulare una teoria astratta della
calcolabilit`a, uniforme rispetto alla classe di macchine che esegue il calcolo.
In questa sezione faremo invece alcune considerazioni sulla equivalenza delle
varie nozioni di calcolabilit`a.
Durante gli anni 30 e allinizio degli anni 40 hanno visto la luce tutte
le pi` u importanti caratterizzazioni delle funzioni calcolabili: quella di Turing,
basata sulle macchine omonime, quella di Kleene, basata sulle equazioni fun-
zionali, quella di Church, basata sul -calcolo, quella di Markov, basata sugli
algoritmi normali e quella di Post, basata sui sistemi combinatori (si vedano
le note storiche al termine del capitolo). Lestrema semplicit`a delle assunzio-
ni, operazioni base e meccanismi di calcolo dotati di struttura estremamente
elementare, hanno portato i vari autori a formulare lipotesi che la loro nozio-
ne di calcolabilit`a fosse la pi` u generale possibile e che non potessero esistere
procedimenti algoritmici di calcolo non esprimibili nel loro formalismo. In par-
ticolare, i nomi di Church e di Turing sono stati legati a questo punto di vista:
infatti, con il nome di Tesi di Church-Turing ci si riferisce alla congettura che
ogni funzione calcolabile rispetto ad una qualunque intuitiva nozione di algo-
ritmo sia calcolabile secondo Turing. Dato che, come abbiamo visto, la classe
delle funzioni ricorsive coincide con la classe delle funzioni calcolabili secondo
Turing, ne consegue che, in generale e nel seguito di questo testo, il termine
252 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
funzioni ricorsive viene utilizzato come sinonimo di funzioni calcolabili.
La constatazione dellequivalenza dei vari meccanismi algoritmici non ha
fatto altro che corroborare lidea che le funzioni ricorsive siano la pi` u generale
classe di funzioni per le quali si possa comunque dare un metodo di calcolo
intuitivamente algoritmico. La tesi di Church-Turing `e diventata cos` il prin-
cipio fondante della ricorsivit`a ed `e ora indiscussamente accettata, anche se la
sua indimostrabilit`a `e peraltro evidente.
Una volta ammessa la validit`a della tesi di Church-Turing `e quindi pos-
sibile utilizzare descrizioni informali (purche rigorose) di algoritmi al ne di
dimostrare la calcolabilit`a di certe funzioni senza dovere esibire una macchi-
na di Turing (o un programma per macchina a registri) che le calcola. Luso
della tesi di Church-Turing consente di esprimere rapidamente e suggestiva-
mente risultati che un approccio pi` u formale permetterebbe di raggiungere pi` u
faticosamente.
Ad esempio, usando la tesi di Church-Turing possiamo agevolmente denire
la funzione:
f

(x, z) =
_

_
y se il programma con input x restituisce il
valore y con un calcolo lungo al pi` u z passi;
0 altrimenti
e dire che essa `e ricorsiva anche senza fornire esplicitamente lalgoritmo che la
calcola (il quale richiederebbe, ad esempio, una denizione formale del modello
di calcolo adottato, nonche del relativo concetto di numero di passi).
7.2 Enumerazione di funzioni ricorsive
In questa sezione mostreremo come per le macchine a registri elementari e
per le macchine di Turing si possa stabilire una corrispondenza biunivoca
con linsieme dei numeri naturali: tale corrispondenza viene chiamata arit-
metizzazione.
1
Vedremo poi come ci`o consenta di ottenere una enumerazione
delle funzioni ricorsive e di formulare una teoria generale della calcolabilit`a,
indipendente dal particolare modello di calcolo assunto.
7.2.1 Enumerazione delle macchine a registri elementari
Nella Sezione 6.6 abbiamo visto come ogni funzione calcolata mediante un
programma elementare per macchine a registri sia una funzione ricorsiva. Ci`o
`e stato dimostrato introducendo il concetto di codica di una computazione,
e realizzando tale codica mediante lassociazione di numeri naturali agli stati
della macchina e alle sequenze nite di stati. In questa sezione intendiamo
1
Un termine usato alternativamente per tale corrispondenza `e quello di godelizzazione, in
quanto tale approccio fu introdotto da K. Godel per realizzare una corrispondenza biunivoca
tra formule logiche e numeri naturali.
7.2. ENUMERAZIONE DI FUNZIONI RICORSIVE 253
mostrare che anche i programmi per macchine a registri elementari possono
essere codicati con numeri naturali.
Ricordiamo anzitutto che ogni programma elementare `e costituito da un
numero nito di istruzioni del tipo:
Ri = Ri + 1 i 1, n 0
Ri = Ri

1
IF Ri = 0 GOTO n
Linformazione di cui abbiamo bisogno per caratterizzare ogni istruzione `e,
dunque, il suo posto nella sequenza, il suo tipo e i naturali i ed n che essa
contiene. Un modo per codicare queste informazioni `e il seguente:
Ri = Ri + 1 3 (i

1) + 1
Ri = Ri

1 3 (i

1) + 2
IF Ri = 0 GOTO n 3 J(i

1, n)
dove J `e la biiezione ININ IN
+
:
J(x, y) =
(x +y + 1)(x +y)
2
+x + 1. (7.1)
simile alla funzione coppia di Cantor gi`a denita nellEsempio 1.11.
Il codice dellistruzione m-esima viene poi usato come esponente per il
numero primo p
m
(p
1
= 2), e quindi se il programma consta di m istruzioni il
suo codice sar`a, coerentemente con la notazione introdotta nella Sezione 6.6,
y
1
, . . . , y
m
) dove y
1
, . . . , y
m
sono i codici delle rispettive istruzioni.
Esempio 7.1 Il seguente programma di somma viene cos` codicato:
IF R2 = 0 GOTO 0 3 J(1, 0) = 9
R2 = R2

1 3 1 + 2 = 5
R1 = R1 + 1 3 0 + 1 = 1
IF R3 = 0 GOTO 1 3 J(2, 1) = 27
e ad esso corrisponde il codice 2
9
3
5
5
1
7
27
.
Poiche sia la codicazione delle istruzioni che la codicazione del programma
sono biunivoche (in virt` u dellunicit`a della decomposizione in primi e del quo-
ziente e resto della divisione per tre), come ad ogni programma corrisponde
un intero, maggiore o uguale a 2, cos` ad ogni intero:
x = 2
y
1
. . . p
m
ym
dove y
i
_
0 se 1 i m
> 0 se i = m
corrisponde un programma costituito da m istruzioni in cui la j-esima istruzio-
ne `e ottenuta decodicando y
j
, vale a dire dividendo y
j
per 3 ed individuando
resto e quoziente.
254 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
Esempio 7.2 Al numero 600 corrisponde la decomposizione 2
3
3 5
2
e quindi il
programma:
IF R1 = 0 GOTO 0
R1 = R1 + 1
R1 = R1

1.
Tale programma calcola la funzione:
f(x) =
_
se x = 0 allora 0
indenita altrimenti
infatti il programma si arresta regolarmente se e solo se il contenuto del registro R1
`e 0.
Si noti anche che, mentre la codicazione di un programma in un naturale
produce solo naturali x tali che, se 2
y
1
. . . p
m
y
m
`e la decomposizione in fattori
primi di x, allora y
1
, . . . , y
m
> 0, in generale decodicando un numero naturale
per ricavare il programma ci imbatteremo in situazioni in cui allistruzione j-
esima corrisponde y
j
= 0. Come si pu`o vericare, allo 0 non `e associata
alcuna istruzione. Introdurremo perci`o una istruzione NOPE (con codice 0)
di non-operazione che ha lunico eetto di passare il controllo allistruzione
successiva.
Cos` al numero naturale 2
9
5
5
7
1
11
27
corrisponde una sequenza uguale
a quella del programma di somma visto precedentemente, ma con una NOPE
inserita fra la prima e la seconda istruzione.
Avendo stabilito una corrispondenza biunivoca tra naturali e macchine a
registri elementari, possiamo pensare che esista una macchina a registri ele-
mentare che riceve in input il numero naturale che codica unaltra macchina
e ne simula il comportamento.
In altre parole, analogamente a quanto fatto nella Sezione 5.8 per le
macchine di Turing, possiamo introdurre il concetto di macchina a registri
universale.
Esercizio 7.1 Denire una macchina a registri (non elementare) U che, dati in input
due naturali x e y, determina loutput che la macchina a registri elementare M
x
con
codica x ottiene su input y.
[Suggerimento: La macchina U deve eettuare la decomposizione di x in fattori pri-
mi, decodicare gli esponenti della decomposizione per individuare a che istruzione
corrispondano, ed eseguire via via tali istruzioni. Si suggerisce di estendere la deni-
zione di macchina a registri includendo istruzioni complesse quali quella che calcola
lesponente del numero primo i-esimo nella decomposizione del naturale j, o quelle
che consentono di determinare x e y dato J(x, y).]
7.2.2 Enumerazione delle macchine di Turing
Che le macchine di Turing siano uninnit`a numerabile `e gi`a stato osservato,
ed `e unovvia conseguenza del fatto che esse possono essere descritte mediante
7.2. ENUMERAZIONE DI FUNZIONI RICORSIVE 255
stringhe di lunghezza nita su di un opportuno alfabeto nito. Nel seguito
vedremo un particolare modo con cui si pu`o realizzare una corrispondenza
biunivoca tra le macchine di Turing ed i numeri naturali.
Supponiamo inizialmente che siano dati un alfabeto ed un insieme di
stati Q, e mostriamo come sia possibile enumerare linsieme delle macchine di
Turing con alfabeto di nastro ed insieme degli stati Q.
Si ricorda, dalla Sezione 5.1, che la funzione di transizione di una macchina
di Turing deterministica / = , b, Q, q
0
, F, ) `e denita come una funzione
parziale : (QF) ( b) Q( b) d, s, i.
Il metodo che utilizzeremo per codicare una macchina di Turing consiste
nellelencare in modo lessicograco le quintuple che ne costituiscono la fun-
zione di transizione: a tal ne, ogni coppia (q, a) per la quale la funzione di
transizione non `e denita sar`a codicata con la quintupla (q, a, , , ), dove
il simbolo non appartiene a .
Per poter eettuare unenumerazione lessicograca `e necessario introdurre
un ordinamento arbitrario sugli insiemi Q , b, , s, d, i, : tale
ordinamento induce un ordinamento tra le quintuple, il quale, a sua volta,
induce un ordinamento lessicograco tra sequenze di quintuple, e quindi tra
codiche di macchine di Turing.
Si noti che lordinamento sopra denito si applica ad insiemi di macchine
di Turing denite su una pressata coppia di insiemi , Q. Al ne di ottene-
re lenumerazione di tutte le macchine di Turing, denite quindi su qualun-
que alfabeto di nastro e qualunque insieme degli stati, `e necessario estendere
opportunamente il procedimento.
Esercizio 7.2 Completare al caso generale la denizione dellenumerazione delle mac-
chine di Turing sopra introdotta.
[Suggerimento: Assumere che esista un alfabeto tale che, per ogni Q, i nomi
degli stati in Q e dei simboli in b, siano rappresentati mediante stringhe
nite in

. Dimostrare quindi che linsieme di tutte le coppie (, Q) `e numerabi-


le. Inne, utilizzare il procedimento introdotto nel Teorema 1.4 per completare la
dimostrazione]
Come si pu`o facilmente comprendere, il metodo di enumerazione visto
non `e lunico possibile. Ad esempio, utilizzando la descrizione linearizzata
delle macchine di Turing, `e possibile derivare una diversa enumerazione delle
macchine stesse.
Esercizio 7.3 Denire una corrispondenza biunivoca tra i naturali e le macchine di
Turing basata sulla descrizione linearizzata.
7.2.3 Enumerazione delle funzioni ricorsive
I metodi di enumerazione delle macchine introdotti nelle sottosezioni prece-
denti, oltre a denire delle biiezioni fra i numeri naturali e le macchine stesse,
256 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
determinano anche una corrispondenza tra numeri naturali e funzioni ricorsive.
Sia ad esempio c : IN / una biiezione tra IN e le descrizioni delle
macchine di Turing. Con la notazione /
x
indichiamo la macchina c(x), cio`e
la (x+1)-esima nellenumerazione. Data una qualunque codica ( dei naturali
su un opportuno alfabeto, consideriamo ora la funzione ricorsiva parziale cos`
denita:

x
(y) =
_

_
z IN se inizializzata nella congurazione iniziale
q
0
((y) la macchina /
x
si arresta nella
congurazione nale ((y) bq
F
((z)
indenita altrimenti.
In tal modo, a anco della enumerazione delle macchine, otteniamo una
enumerazione delle funzioni ricorsive ad un argomento e, in particolare, la
funzione precedentemente denita `e la x + 1-esima di tale enumerazione.
Si noti che mentre la funzione c `e una biiezione, la corrispondenza tra
naturali e funzioni ricorsive ad un argomento non lo `e, a causa del fatto che ogni
funzione `e calcolata da pi` u macchine di Turing. Lestensione al caso generale
di funzioni n-arie di quanto detto con riferimento alle funzioni ricorsive ad un
argomento, pu`o essere semplicemente ottenuta ricordando che una funzione n-
aria pu`o essere posta in corrispondenza con una funzione unaria, il cui unico
argomento codica gli n argomenti della funzione data.
Le stesse considerazioni valgono per qualunque altra enumerazione di qua-
lunque altro tipo di macchine, ed in particolare per lenumerazione delle
macchine a registri elementari introdotta nella Sottosezione 7.2.1.
Il valore x associato alla funzione
x
viene detto indice indice della funzione
(calcolata dalla macchina /
x
). Dato che x `e il numero naturale che codica
la macchina /
x
, viene anche chiamato, con un piccolo abuso di terminologia,
il programma che calcola la funzione
x
.
7.3 Propriet`a di enumerazioni di funzioni ricorsive
Lintroduzione del concetto di enumerazione delle funzioni ricorsive ci consen-
te di formulare i risultati fondamentali della teoria della ricorsivit`a in modo
machine independent. In altri termini, tutta linformazione relativa ad una
particolare classe di macchine o di programmi (e ad un particolare modo di
codicare input e output) rimane racchiusa negli indici delle funzioni e d`a
luogo a una enumerazione che potr`a anche essere diversa da quelle introdotte
precedentemente, ma che ne condivider`a le propriet`a generali. In tal modo,
una dimostrazione fornita assumendo una enumerazione corrispondente ad un
generico modello di calcolo, automaticamente diviene una dimostrazione vali-
da per qualunque enumerazione associata ad una altro modello di calcolo (e
ad una qualunque altra codicazione dellinput e delloutput).
7.3. PROPRIET
`
A DI ENUMERAZIONI DI FUNZIONI RICORSIVE 257
Nel seguito, illustriamo alcune propriet`a fondamentali che valgono per ogni
enumerazione delle funzioni ricorsive.
La prima di tali propriet`a consiste nella esistenza di una funzione universale
corrispondente alla funzione calcolata dalla macchina universale. Il teorema
seguente consiste nella aermazione della esistenza della funzione universale
nella sua forma pi` u generale.
Teorema 7.1 (Esistenza della funzione universale) Sia data una qua-
lunque enumerazione delle funzioni ricorsive. Per ogni k IN esiste z tale
che, per ogni x
1
, . . . , x
k
:

z
(x
1
, . . . , x
k
, y) =
_

y
(x
1
, . . . , x
k
) se essa `e denita
indenita, altrimenti.
Dimostrazione. La dimostrazione `e soltanto accennata. Anzitutto, non `e
dicile vericare che una funzione universale con le caratteristiche suddette
esiste nel caso delle macchine a registri: in tal caso, infatti, `e suciente realiz-
zare la codica dei k argomenti in un unico numero naturale e fare ricorso alla
macchina universale vista nellEsercizio 7.1. Al ne di estendere tale propriet`a
ad enumerazioni associate ad altri modelli di calcolo, osserviamo che, dati due
modelli di calcolo /(
1
, /(
2
dotati di potere computazionale equivalente alle
macchine di Turing, esiste una funzione calcolabile che associa al codice di una
macchina in /(
1
il codice di una macchina in /(
2
. Quindi, lesistenza di
una funzione universale in /(
2
implica lesistenza di una funzione universale
in /(
1
. 2
Esercizio 7.4 Dimostrare lultima aermazione contenuta nella dimostrazione del
teorema precedente, vale a dire che, nelle condizioni ivi indicate, lesistenza di una
funzione universale in /(
2
implica lesistenza di una funzione universale in /(
1
.
Il secondo risultato, detto Teorema s-m-n, consente di eettuare in modo
algoritmico la trasformazione da un programma che ammette come input i
dati x
1
, . . . , x
n
ed y
1
, . . . , y
m
, ad un insieme di programmi che inglobano in se
i dati y
1
, . . . , y
m
come parametri.
Teorema 7.2 (s-m-n) Sia data una qualunque enumerazione delle funzioni
ricorsive. Per ogni m, n 1 esiste una funzione ricorsiva s tale che per ogni
x, y
1
, . . . , y
m
, z
1
, . . . , z
n
:

x
(y
1
, . . . , y
m
, z
1
, . . . , z
n
) =
s(x,y
1
,...,y
m
)
(z
1
. . . z
n
) .
Dimostrazione. Assumiamo per semplicit`a m = n = 1 e dimostriamo che,
nel caso della enumerazione associata alle macchine a registri, esiste s tale che

x
(y, z) =
s(x,y)
(z). Dati x e y, un modo per calcolare il valore s(x, y) `e il
seguente: generiamo la macchina a registri di indice x e la trasformiamo in
258 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
una nuova macchina la quale, dopo avere, con la sua prima istruzione, inserito
il valore y nel primo registro, si comporta esattamente come la precedente.
Inne, determiniamo il codice di tale nuova macchina x

= s(x, y).
Si comprende facilmente che lestensione della dimostrazione a valori di
m ed n qualunque `e immediata. Per quanto riguarda lestensione del risulta-
to a tutte le enumerazioni, ricordiamo quanto detto nella dimostrazione del
Teorema 7.1. 2
Esercizio 7.5 Completare la dimostrazione precedente, mostrando in particolare come
lesistenza della corrispondenza tra modelli di calcolo equivalenti alle macchine di
Turing consenta di estendere il teorema s-m-n a tutte le enumerazioni di funzioni
ricorsive.
Esempi di applicazione del teorema s-m-n saranno forniti nelle sezioni
successive.
Un ultimo risultato interessante basato sulla enumerazione delle funzioni
ricorsive `e il teorema seguente.
Teorema 7.3 (Forma Normale di Kleene) Data una qualunque enume-
razione delle funzioni ricorsive, esistono una funzione ricorsiva U e un insieme
di funzioni ricorsive T
k
tali che, per ogni k IN, tutte le funzioni ricorsive di
k argomenti sono esprimibili nel seguente modo:

i
(x
1
, . . . , x
k
) = U(t[T
k
(i, x
1
, . . . , x
k
, t) = 0]).
Dimostrazione. Dimostriamo inizialmente il risultato nel caso in cui lenu-
merazione considerata sia quella derivante dallenumerazione delle macchine a
registri elementari (vedi Sezione 7.2.1). Nel Teorema 6.6 abbiamo dimostrato
che dato ogni programma siamo in grado di fornire una funzione ricorsiva
T

tale che se f `e la funzione calcolata mediante , allora:


f(x
1
, . . . , x
k
) = U(t[T

(x
1
, . . . , x
k
, t) = 0]).
Sia ora
i
il programma per macchine a registri elementari che calcola la fun-
zione
i
. In base alla denizione della funzione T

non `e dicile comprendere


che tale funzione pu`o essere costruita a partire dal codice del programma , e
che tale costruzione pu`o essere eettuata in modo algoritmico. In altre parole,
dato k, esiste una funzione ricorsiva T
k
che, assumendo in input il codice i
di un programma
i
, determina tale programma e, dati i valori x
1
, . . . , x
k
, t,
eettua i controlli previsti nel Lemma 6.5 e calcola il valore T

i
(x
1
, . . . , x
k
, t).
La generalizzazione del risultato ad una qualunque enumerazione di funzioni
ricorsive `e lasciata al lettore. 2
Esercizio 7.6 Completare la dimostrazione precedente, mostrando che il risultato vale
per qualunque enumerazione di funzioni ricorsive.
7.4. FUNZIONI NON CALCOLABILI 259
Il Teorema della Forma Normale di Kleene mostra che il calcolo di una
qualunque funzione ricorsiva pu`o essere ricondotto al calcolo di due funzioni
elementari: la prima (predicato di Kleene) consistente nel vericare che una
computazione soddis dei requisiti di ammissibilit`a e la seconda che si limita
a decodicare il codice della computazione per estrarre il risultato del calcolo.
7.4 Funzioni non calcolabili
Nel Capitolo 5 abbiamo introdotto le nozioni di funzione calcolabile, di funzio-
ne non calcolabile, di insieme decidibile, di insieme semidecidibile ecc. Aven-
do ora introdotto il concetto di enumerazione di funzioni ricorsive, possiamo
riprendere in modo indipendente dal modello di calcolo quanto visto con rife-
rimento specico alle macchine di Turing, e fornire ulteriori esempi di funzioni
non calcolabili.
Mostriamo innanzi tutto come si possa riformulare, in modo machi-
ne independent, la dimostrazione della non decidibilit`a del problema della
terminazione.
Teorema 7.4 Sia data una qualunque enumerazione delle funzioni ricorsive.
Non esiste allora alcuna funzione ricorsiva g tale che per ogni x e y:
g(x, y) =
_
1 se
x
(y) `e denita
0 altrimenti
Dimostrazione. Non `e dicile vericare che, se la funzione g fosse ricorsiva,
lo sarebbe anche la funzione:
f(x) =
_
1 se g(x, x) = 0
indenita altrimenti
Si noti che la funzione f `e costruita appositamente per fornire un controesem-
pio, come gi`a la macchina di Turing H

nella dimostrazione del Teorema 5.8:


infatti se ora assumiamo che e sia un indice per la funzione f e applichiamo
la f al proprio indice, abbiamo:
f(e) =
e
(e) = 1 se e solo se g(e, e) = 0
ma contemporaneamente, per denizione della g :
g(e, e) = 0 se e solo se
e
(e) non `e denita.
Ad una analoga contraddizione si perviene nel caso in cui
f(e) =
e
(e) = 0
In conclusione, si pu`o desumere che la funzione g non pu`o essere ricorsiva. 2
260 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
Si noti che, utilizzando la stessa tecnica di dimostrazione, otteniamo il seguente
risultato.
Teorema 7.5 Non esiste una funzione ricorsiva g

tale che per ogni x :


g

(x) =
_
1 se
x
(x) `e denita
0 altrimenti
Una conseguenza immediata di tali risultati `e rappresentata dal seguente
corollario.
Corollario 7.6 Data una qualunque enumerazione delle funzioni ricorsive,
gli insiemi
K = x [
x
(x) `e denita
e
K

= x, y) [
x
(y) `e denita
non sono decidibili.
Quanto visto implica che il problema di decidere se un generico programma
si arresta su un input generico non `e pi` u dicile del caso particolare in
cui ci si chiede se un generico programma termina quando gli viene fornito
in input il proprio codice. Si pu`o anzi osservare, come enunciato nel teorema
seguente, che anche nel caso in cui linput fornito ad un programma `e pressato
(ad esempio viene fornito in input il valore costante 0), il problema della
terminazione rimane indecidibile.
Prima di fornire lenunciato del teorema seguente, osserviamo che la dimo-
strazione del teorema stesso utilizzer`a la tecnica gi`a vista nella Sezione 4.8.1
e cio`e si baser`a sulla riduzione del problema della terminazione al proble-
ma in esame. Inoltre in essa si far`a uso del teorema s-m-n (Teorema 7.2)
precedentemente enunciato.
Teorema 7.7 Data una qualunque enumerazione delle funzioni ricorsive, non
esiste una funzione ricorsiva g tale che per ogni x :
g(x) =
_
1 se
x
(0) `e denita
0 altrimenti
Dimostrazione. Supponiamo per assurdo che la funzione g fosse ricorsiva:
in tal caso potremmo denire una funzione ricorsiva g

capace di decidere per


ogni x se
x
(x) `e denita o no. Sia:
f(x, y) =
_
0 se
x
(x) `e denita
indenita altrimenti
7.4. FUNZIONI NON CALCOLABILI 261
Chiaramente, la funzione f `e ricorsiva e, in base al teorema s-m-n (Teore-
ma 7.2) esiste s tale che:
s(x)
(y) = f(x, y). In base alla denizione della
funzione f, si pu`o osservare che le funzioni
s(x)
costituiscono, al variare di
x IN una sequenza innita di funzioni ognuna delle quali o `e identicamente
nulla, o `e sempre indenita. In particolare, se
x
(x) `e denita, allora
s(x)
`e
identicamente nulla, mentre se
x
(x) `e indenita, allora `e sempre indenita la
funzione
s(x)
.
Se ora consideriamo g

= g s abbiamo che:
g

(x) = g(s(x)) =
_
1 se
s(x)
(0) `e denita
0 altrimenti
e quindi:
g

(x) =
_
1 se
x
(x) `e denita
0 altrimenti
Poiche tale g

non pu`o essere ricorsiva, se ne deve dedurre che non `e ricorsiva


neanche la funzione g. 2
Lasciamo per esercizio la dimostrazione del seguente teorema, che specializza
il teorema precedente al caso delle macchine di Turing.
Teorema 7.8 Data una qualunque enumerazione delle macchine di Turing,
la funzione
b(x) =
_
1 se /
x
termina su nastro b
0 altrimenti
(7.2)
non `e calcolabile.
Esercizio 7.7 Dimostrare il Teorema 7.8.
Applicando la tecnica utilizzata nella dimostrazione del Teorema 7.7, `e
possibile derivare i seguenti risultati.
Teorema 7.9 Data una qualunque enumerazione delle funzioni ricorsive, non
esiste una funzione ricorsiva g tale che, per ogni x, si ha che:
g(x) =
_
1 se
x
`e costante
0 altrimenti
Dimostrazione. Come nella dimostrazione del Teorema 7.7, consideriamo
le funzioni
f(x, y) =
_
0 se
x
(x) `e denita
indenita altrimenti
262 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
e
s(x)
(y) = f(x, y). Anche in questo caso, la funzione
g

(x) = g(s(x)) =
_
1 se
s(x)
`e costante
0 altrimenti
risolverebbe il problema della fermata: infatti `e chiaro che
s(x)
`e costante (ed
uguale a 0) se e solo se
x
(x) `e denita. 2
Teorema 7.10 Data una qualunque enumerazione delle funzioni ricorsive,
non esiste una funzione ricorsiva g tale che, per ogni x, y, z:
g(x, y, z) =
_
1 se
x
(y) = z
0 altrimenti
Dimostrazione. Si avrebbe, in caso contrario:
g

(x) = g(s(x), 0, 0) =
_
1 se
s(x)
(0) = 0
0 altrimenti
e g

risolverebbe il problema della fermata. 2


Teorema 7.11 Data una qualunque enumerazione delle funzioni ricorsive,
non esiste una funzione ricorsiva g tale che, per ogni x e y :
g(x, y) =
_
1 se
x
=
y
0 altrimenti .
Dimostrazione. Sia e un indice per la funzione x[0]. Avremmo ancora
che:
g

(x) = g(s(x), e) =
_
1 se
s(x)
=
e
0 altrimenti
risolverebbe il problema della terminazione. 2
Esercizio 7.8 Mostrare che non esiste una funzione ricorsiva g tale che, per ogni x,
g(x) =
_
1 se
x
`e totale
0 altrimenti
Esercizio 7.9 Mostrare che non esiste una funzione ricorsiva g tale che, per ogni x,
g(x) =
_
1 se
x
`e crescente
0 altrimenti
7.5. INDECIDIBILIT
`
A IN MATEMATICA ED INFORMATICA 263
In realt`a, come vedremo nella Sezione 7.6, `e possibile dimostrare che non so-
lo sono indecidibili le propriet`a suddette, ma ogni altra propriet`a non banale
relativa alla funzione calcolata mediante un programma x.
Il metodo introdotto sopra, in cui ci si riconduce alla indecidibilit`a del pro-
blema della terminazione, non `e in eetti lunico utilizzabile per dimostrare
risultati di indecidibilit`a. Un ulteriore metodo consiste nellutilizzare diretta-
mente una diagonalizzazione, cos` come si `e fatto proprio nella dimostrazione
dellindecidibilit`a del problema della terminazione (Teorema 7.4).
Come esempio di applicazione di questo ulteriore metodo, forniamo una
nuova dimostrazione dellindecidibilit`a del problema di vericare se la funzione
calcolata da un programma `e totale.
Teorema 7.12 Data una qualunque enumerazione delle funzioni ricorsive,
non esiste una funzione ricorsiva g tale che, per ogni x,
g(x) =
_
1 se
x
`e totale
0 altrimenti
Dimostrazione. Supponiamo per assurdo che la funzione g sia calcolabile.
In tal caso sarebbe calcolabile anche la funzione
f(x) =
_

x
(x) + 1 se g(x) = 1, cio`e se
x
`e totale
0 altrimenti
Chiaramente, la funzione f sarebbe totale. Se e fosse un suo indice si avrebbe
allora la contraddizione seguente:

e
(e) = f(e) =
e
(e) + 1
In conclusione, la funzione g non pu`o essere calcolabile. 2
7.5 Indecidibilit`a in matematica ed informatica
Oltre ai problemi indecidibili gi`a illustrati nelle sezioni precedenti esistono nu-
merosi altri esempi di problemi indecidibili che si incontrano in diversi settori
della matematica e dellinformatica.
Nel campo della teoria dei linguaggi formali, ad esempio, abbiamo gi`a
visto (vedi Sezione 4.8.1) che il problema della ambiguit`a di una grammatica
context free `e indecidibile. Altri esempi di problemi indecidibili nella teoria
dei linguaggi formali sono i seguenti.
Date due grammatiche context free (
1
, (
2
, L((
1
) = L((
2
)?
Date due grammatiche context free (
1
, (
2
, L((
1
) L((
2
) = ?
264 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
Data una grammatica contestuale (, il linguaggio L(() `e vuoto?
Nellambito della teoria della programmazione, i risultati di indecidibilit`a
gi`a incontrati nelle sezioni precedenti hanno implicazioni molto signicative
per la teoria stessa. Infatti, facendo riferimento ad uno specico linguaggio
di programmazione, anziche ad un generico modello di calcolo, tali risultati
possono essere interpretati in termini di indecidibilit`a dei seguenti problemi.
Un programma contenente la dichiarazione di una particolare procedura
chiamer`a, nel corso della sua esecuzione, la procedura stessa?
Una variabile denita allinterno di un programma assumer`a un partico-
lare valore, durante lesecuzione del programma stesso? In particolare,
un predicato utilizzato come test di uscita da un ciclo assumer`a il valore
vero?
Un programma, in corrispondenza di un particolare input, fornisce un
determinato output?
Due programmi sono equivalenti, ovvero calcolano la medesima funzione?
Oltre ai problemi precedenti, che riguardano limpossibilit`a di decidere
in merito al comportamento di un programma, sono anche indecidibili, in
conseguenza del teorema di Rice (vedi Teorema 7.15), i problemi seguenti, ed
in generale qualunque propriet`a non banale
2
relativa alla funzione calcolata
da un programma.
Un programma calcola una funzione costante, ovvero il suo output `e
indipendente dallinput?
Un programma calcola una funzione totale, ovvero termina per ogni
input?
Un programma calcola una funzione crescente?
Nel campo della matematica, e pi` u precisamente della logica, hanno par-
ticolare importanza anche da un punto di vista storico, in quanto allorigine
degli studi sulla calcolabilit`a, i seguenti problemi.
Data una formula del calcolo dei predicati, tale formula `e un teorema?
Data una formula dellaritmetica, tale formula `e un teorema della teoria?
Un altro celebre problema che `e stato mostrato indecidibile `e il problema
delle equazioni diofantee, che pu`o essere cos` formulato.
2
Una proprie`a `e non banale se `e valida per un insieme non vuoto di istanze, ma non per
lintero universo delle istanze stesse.
7.5. INDECIDIBILIT
`
A IN MATEMATICA ED INFORMATICA 265
Dato un sistema di equazioni lineari a coecienti ed esponenti interi,
come ad esempio lequazione x
2
+y
2
= z
2
, il sistema ammette soluzioni
intere?
Un ulteriore problema indecidibile, di natura combinatoria, `e il seguente
problema di pavimentazione (o tiling).
Dato un insieme di mattonelle quadrate con il bordo colorato, ciascuna
suddivisa in quattro triangoli come in Figura 7.1, e disponibili in numeri
arbitrario, `e possibile pavimentare un pavimento di qualsiasi forma?
3
(a)
(b)
Figura 7.1 Due insiemi di base di mattonelle. (a) Caso in cui `e possibile
pavimentare. (b) Caso in cui non `e possibile.
Inne, osserviamo come esistano anche circostanze in cui un una funzione
`e calcolabile, ma non siamo in grado di conoscere il programma che la calcola.
Un esempio di funzione di tale tipo `e il seguente.
Consideriamo la funzione F(x) denita come:
F(x) =
_
1 se il problema del continuo ha soluzione positiva
0 altrimenti
dove si ricorda che il problema del continuo `e stato denito nella
Sezione 1.1.8.
La funzione F(x) coincide o con la funzione 0(x) = 0 o con la 1(x) = 1; in
entrambi i casi si tratta di funzioni costanti e quindi chiaramente calcolabili,
3
Con pavimentazione si intende una disposizione delle mattonelle in cui due mattonelle
vengono accostate, verticalmente o orizzontalmente, solo se i loro bordi hanno lo stesso
colore.
266 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
ma noi non saremo in grado di determinare quale sia lalgoritmo corretto per
calcolare la F no a che non si sapr`a se il problema del continuo ha soluzione
positiva o negativa.
Analogamente la funzione
g(x) =
_

_
1 se nellespansione di esistono almeno
x 5 consecutivi
0 altrimenti
`e sicuramente calcolabile. Infatti si presentano due casi:
1. esiste un k tale che per x > k non esistono x 5 consecutivi;
2. per ogni x esistono almeno x cinque consecutivi.
In ogni caso, la funzione `e calcolabile; tuttavia non sappiamo quale sia
lalgoritmo corretto per calcolarla.
Inne, ricordiamo che esistono tuttora funzioni di cui non `e noto se siano
calcolabili o non calcolabili. Consideriamo ad esempio la seguente funzione.
g

(x) =
_

_
1 se nellespansione di esistono esatta-
mente x 5 consecutivi
0 altrimenti
In questo caso la funzione g

pu`o essere calcolabile ma nulla esclude che si


possa dimostrare che essa non `e calcolabile.
7.6 Teoremi di Kleene e di Rice
In questa sezione presentiamo due risultati di notevole importanza per la
conoscenza delle propriet`a delle funzioni calcolabili.
Il primo `e noto come teorema di ricursione (o teorema di Kleene).
Teorema 7.13 (Ricursione) Sia data una enumerazione delle funzioni ri-
corsive. Se t `e una funzione calcolabile totale, allora esiste e IN tale
che

e
=
t(e)
Prima di procedere con la dimostrazione del teorema osserviamo che il teorema
stesso `e anche chiamato teorema del punto sso. In generale, dati un insieme S
ed una trasformazione : S S, si denisce punto sso di un valore s S
tale che (s) = s. Il teorema di ricursione mostra che, data una funzione
ricorsiva totale t, la trasformazione : R R (R insieme delle funzioni
ricorsive) denita come (
i
) =
t(i)
, ammette un punto sso
e
=
t(e)
=
(
e
).
7.6. TEOREMI DI KLEENE E DI RICE 267
Dimostrazione. Senza perdita di generalit`a, dimostriamo il teorema per
una qualunque enumerazione delle macchine di Turing: la sua estensione al ca-
so di enumerazioni qualunque di funzioni `e immediata. Consideriamo una enu-
merazione delle macchine di Turing e deniamo M[u] una famiglia di macchine
con parametro u avente il seguente comportamento:
con input x la macchina M[u] calcola z =
u
(u) e se
u
(u) `e denita calcola

z
(x).
In altre parole M[u] calcola la funzione parziale

g(u)
(x) =
_

u
(u)
(x) se
u
(u) `e denita
indenita altrimenti
Sia ora v IN un valore tale che
v
= x.t(g(x)). In altre parole, per in-
dividuare v, generiamo la macchina / che calcola la funzione x.t(g(x)) e
determiniamo lindice di /. Abbiamo pertanto che, per ogni x IN,

g(v)
(x) =

v
(v)
(x) =
t(g(v))
(x)
Ponendo e = g(v) abbiamo
e
=
t(e)
. 2
Il teorema di ricursione `e uno strumento molto importante ai ni della
dimostrazione di risultati che riguardano le funzioni calcolabili. Mostriamo
ad esempio un interessante risultato, la cui dimostrazione si basa sul risultato
precedente, e che pu`o essere interpretato come segue: in ogni modello di calcolo
esiste un programma che fornisce costantemente in output il proprio codice.
Corollario 7.14 Data una enumerazione delle funzioni ricorsive, esiste un
indice i tale che, per ogni x IN,
i
(x) = i.
Dimostrazione. Consideriamo la funzione di proiezione f(x, y) = x. Poi-
che in base al Teorema s-m-n esiste una funzione ricorsiva totale s tale che

s(x)
(y) = f(x, y) = x, utilizzando il teorema di ricursione possiamo aermare
che esiste un valore i per cui, per ogni y,
i
(y) =
s(i)
(y) = i. 2
Esercizio 7.10 Dimostrare che per ogni enumerazione dei programmi di un linguaggio
di programmazione esiste un valore i IN tale che li-esimo programma e l(i +
1)-esimo programma calcolano la medesima funzione.
Tra le applicazione del teorema di ricursione la pi` u rilevante `e il teorema di
Rice, che asserisce che qualunque propriet`a non banale delle funzioni calcolabili
`e indecidibile.
Teorema 7.15 (Rice) Sia data una qualunque enumerazione delle funzioni
ricorsive e sia F un insieme di funzioni calcolabili. Linsieme S = x [
x

F `e decidibile se e solo se F = oppure F coincide con lintera classe delle
funzioni calcolabili.
268 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
Dimostrazione. Senza perdita di generalit`a, dimostriamo il teorema nel ca-
so di una enumerazione delle macchine di Turing. In tal caso linsieme S
contiene dunque tutti gli indici delle macchine che calcolano funzioni appar-
tenenti ad F. Supponiamo che F ,= ed F, al tempo stesso, non coincidente
con lintera classe delle funzioni calcolabili, e che, per assurdo, S sia decidibile.
Siano i e j rispettivamente il primo indice appartenente ad S ed il primo indice
non appartenente ad S. Consideriamo la seguente funzione:
C(x) =
_
i se x , S
j altrimenti
Poiche la funzione C `e totale, per il teorema di ricursione esiste e tale che

C(e)
=
e
. Per denizione, se C(e) = i allora e , S e quindi
e
, F, ma
poiche per ipotesi i S e
i
F abbiamo anche
C(e)
=
i
=
e
F e ci`o
determina una contraddizione. Daltra parte `e immediato vericare che anche
nel caso C(e) = j si ottiene una contraddizione. 2
Nella Sezione 7.4 abbiamo mostrato diversi esempi di funzioni non cal-
colabili che possono essere interpretati come esempi di indecidibilit`a di
corrispondenti insiemi di programmi. Ad esempio, dimostrare che la funzione
g(x) =
_
1 se
x
`e costante
0 altrimenti
non `e calcolabile, come fatto in quella sezione, equivale a dimostrare la non
decidibilit`a dellinsieme S = x [
x
F, dove F `e linsieme delle funzioni
calcolabili totali con valore costante. Come si pu`o facilmente osservare, que-
sto risultato non `e che una semplice applicazione del Teorema di Rice. Tale
teorema consente in eetti di dimostrare in termini generali risultati di non de-
cidibilit`a per ciascuno dei quali si renderebbero altrimenti necessarie tecniche
ad hoc.
Linterpretazione del Teorema di Rice in termini di teoria della program-
mazione `e particolarmente signicativa. Infatti, in tale contesto, dal teorema
consegue limpossibilit`a di provare speciche propriet`a (costanza, crescenza
ecc.) delle funzioni calcolate da programmi. In particolare, uninteressante
applicazione, la cui verica viene lasciata al lettore, `e quella che permette di
stabilire lindecidibilit`a della correttezza di un programma.
Esercizio 7.11 Data una enumerazione delle funzioni ricorsive e data una funzione
ricorsiva f, dimostrare che la funzione
p(x) =
_
1 se
x
= f
0 altrimenti
non `e calcolabile.
7.7. INSIEMI DECIDIBILI E SEMIDECIDIBILI 269
7.7 Insiemi decidibili e semidecidibili
In questa ultima sezione esamineremo alcune importanti propriet`a degli in-
siemi decidibili e semidecidibili. I concetti di decidibilit`a e semidecidibilit`a
sono stati introdotti nella Sezione 5.3 con riferimento alla T-calcolabilit`a. Ve-
dremo ora come tali nozioni possono essere riformulate astraendo rispetto al
modello di calcolo adottato. In questo ambito prenderemo in considerazione
fondamentalmente insiemi di interi ma, chiaramente, tutti i concetti formulati
potranno essere applicati anche ad altre tipologie di insiemi, come ad esempio
i linguaggi deniti su opportuni alfabeti.
Innanzi tutto presentiamo due nuove denizioni che ci consentono di ca-
ratterizzare gli insiemi decidibili e semidecidibili mediante le propriet`a di
opportune funzioni ad essi associate.
Denizione 7.1 Un insieme A IN viene detto ricorsivo se la sua funzione
caratteristica (
A
:
(
A
(x) =
_
1 se x A
0 altrimenti
`e ricorsiva totale.
Denizione 7.2 Un insieme A IN viene detto ricorsivamente enumerabile
(r.e.) se A = o se esiste una funzione ricorsiva totale f : IN IN tale che
A = imm(f). In tal caso diciamo che la funzione f enumera linsieme A.
Nel seguito mostreremo che le classi degli insiemi ricorsivi e degli insiemi
ricorsivamente enumerabili coincidono rispettivamente con le classi degli insie-
mi decidibili e semidecidibili e, di conseguenza, la classe degli insiemi ricorsivi
`e strettamente contenuta nella classe degli insiemi ricorsivamente enumerabili.
Prima di dimostrare questi risultati discutiamo brevemente alcuni esempi ed
alcune elementari propriet`a di tali classi di insiemi.
Esempio 7.3 Linsieme dei numeri pari `e ricorsivo, poich`e la funzione che ci consente
di decidere se un numero `e pari o meno `e ricorsiva totale.
Esempio 7.4 Linsieme x [ x `e un numero primo `e ricorsivamente enumerabile.
Infatti si pu`o facilmente mostrare che la funzione
p(x) =
_
2 se x = 0
p
x+1
altrimenti
dove p
i
rappresenta li-esimo numero primo, `e una funzione ricorsiva totale che
enumera linsieme stesso.
Esempio 7.5 Linsieme y, t) [
y
(y) si arresta in meno di t passi `e ricorsivo (basta
eseguire t passi di
y
(y) e vericare).
270 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
Esercizio 7.12 Dimostrare che linsieme i, x, t) [ t `e il codice della computazione
eseguita dalla MT di indice i con input x `e ricorsivo.
Lesempio che segue illustra invece casi di insiemi non ricorsivi.
Esempio 7.6 Consideriamo i seguenti insiemi.
(a) Linsieme K = y [
y
(y) `e denita non `e ricorsivo (Corollario 7.6).
(b) Linsieme Z = x, y, z) [
x
(y) = z non `e ricorsivo (Corollario 7.10).
(c) Linsieme T = x [
x
`e totale non `e ricorsivo (Teorema 7.12).
Con riferimento agli esempi precedenti, possiamo osservare che nel caso del-
linsieme dei numeri primi, linsieme stesso `e anche ricorsivo. Al contrario, gli
insiemi K e Z costituiscono esempi di insiemi non ricorsivi ma ricorsivamente
enumerabili. Per poter dimostrare tali asserzioni sar`a tuttavia necessario uti-
lizzare tecniche pi` u ranate che illustreremo successivamente. Inne, vedre-
mo che linsieme T non solo non `e ricorsivo, ma non `e neanche ricorsivamente
enumerabile.
Consideriamo ora alcune propriet`a degli insiemi ricorsivi. In particolare,
la prima propriet`a che dimostriamo `e lequivalenza del concetto di decidibilit`a
e di ricorsivit`a di un insieme.
Teorema 7.16 Un insieme S IN `e ricorsivo se e solo se esso `e decidibile.
Dimostrazione.
`
E suciente osservare che la funzione caratteristica (
A
di
un insieme A `e ricorsiva e totale se e solo se esiste una MT che accetta ogni
input x per cui la funzione (
A
(x) = 1 e riuta ogni altro input. 2
Teorema 7.17 Se un insieme A `e ricorsivo allora linsieme complemento

A =
INA `e anchesso ricorsivo.
Dimostrazione. (
A
(x) = 1 (
A
(x). 2
Teorema 7.18 Se gli insiemi A e B sono ricorsivi allora anche gli insiemi
A B e A B sono ricorsivi.
Dimostrazione. Si osservi infatti che:
(
AB
(x) = (
A
(x) (
B
(x)
(
AB
(x) = (
A
(x) (
B
(x)
dove denota la somma logica, denita come x y = 1 se x = 1 o y = 1, e
x y = 0 altrimenti. 2
7.7. INSIEMI DECIDIBILI E SEMIDECIDIBILI 271
Esercizio 7.13 Vericare che linsieme degli insiemi ricorsivi `e unalgebra di Boole.
Per quanto riguarda gli insiemi ricorsivamente enumerabili, possiamo in-
nanzi tutto mostrare, con il teorema seguente, quale sia la loro relazione con
gli insiemi semidecidibili.
Teorema 7.19 Sia dato un insieme S IN: le seguenti aermazioni sono
equivalenti.
1. S `e ricorsivamente enumerabile;
2. S `e semidecidibile;
3. S `e il dominio di denizione di una funzione g
S
parziale calcolabile;
4. S `e limmagine di una funzione h
S
parziale calcolabile.
Dimostrazione. La dimostrazione sar`a fornita mostrando che ogni aerma-
zione `e implicata dalla precedente e che laermazione 4 implica a sua volta
la 1.
1. 2. Per ipotesi, o S = oppure esiste una funzione f
S
: IN IN
che lo enumera. Nel primo caso, linsieme `e ovviamente semidecidibile,
mentre, nel secondo caso, possiamo denire una macchina di Turing /
che opera nel seguente modo: dato un input x la macchina / enumera
linsieme S calcolando via via la funzione f
S
sugli argomenti 0, 1, 2, . . . e
vericando se x viene generato dallapplicazione della funzione f
S
ad un
qualche argomento y IN. In tal caso, e solo in tal caso, / accetta x.
2. 3. Sia / una macchina di Turing che accetta S. Possiamo allora
denire la funzione g
S
nel seguente modo:
g
S
(x) =
_
1 se / accetta x
indenito altrimenti.
Chiaramente, la funzione parziale g
S
`e calcolabile e il suo dominio di
denizione coincide con S.
3. 4. Sia g
S
una funzione parziale calcolabile con dominio di de-
nizione S. Possiamo allora denire la funzione h
S
nel seguente
modo:
h
S
(x) =
_
x se g
s
(x) = 1
indenito altrimenti.
Chiaramente, la funzione parziale h
S
`e anchessa calcolabile e la sua
immagine coincide con S.
272 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
4. 1. Supponiamo che S contenga almeno un elemento; in caso con-
trario linsieme `e ricorsivamente enumerabile per denizione. Sia /
S
una macchina di Turing che calcola la funzione parziale h
S
avente per
immagine linsieme S. Deniamo ora una macchina di Turing / che
opera, per fasi, nel seguente modo: in corrispondenza alla fase i-esima
(i > 0), / simula i passi delle computazioni eettuate da /
S
sugli
input 0, . . . , i 1. Per ogni computazione che termina (in al pi` u i passi),
restituendo quindi un valore y imm(h
S
), la macchina di Turing /
restituisce lo stesso valore y.
Possiamo allora denire la funzione f
S
che enumera S nel modo seguente:
f
S
(x) = y se y `e l(x + 1)-esimo valore restituito da /
Chiaramente la funzione cos` denita `e una funzione totale calcolabile e
la sua immagine coincide, per costruzione, con linsieme S.
2
Una immediata conseguenza del risultato precedente `e che i linguaggi di
tipo 0 sono ricorsivamente enumerabili. Infatti, come mostrato nel Corolla-
rio 5.10, essi sono semidecidibili. Una ulteriore conseguenza `e che, dato che
gli insiemi ricorsivi sono decibili (vedi Teorema 7.16) e la classe degli insiemi
decidibili `e strettamente inclusa nella classe degli insiemi semidecidibili, allora
ogni insieme ricorsivo `e anche ricorsivamente enumerabile ed esistono insiemi
ricorsivamente enumerabili ma non ricorsivi.
Esempio 7.7 Linsieme K = x [
x
(x) `e denita `e ricorsivamente enumerabile,
ma non ricorsivo. Infatti, linsieme K non `e ricorsivo, come deriva dal Corollario 7.6,
mentre, per mostrare che esso `e ricorsivamente enumerabile `e suciente osservare che
K = dom() se si denisce:
(x) =
_
1 se
x
(x) `e denita
indenita, altrimenti.
Esercizio 7.14 Mostrare che un insieme innito A IN `e enumerabile in ordine
crescente se e solo se esso `e ricorsivo.
Osserviamo ora che esistono insiemi non ricorsivamente enumerabili.
Teorema 7.20 Linsieme T = x [
x
`e totale non `e ricorsivamente
enumerabile.
Dimostrazione. Supponiamo, per assurdo, che linsieme sia ricorsivamen-
te enumerabile e che f sia la sua funzione enumeratrice. Potremmo allora
costruire una funzione:
h(x) =
f(x)
(x) + 1.
7.7. INSIEMI DECIDIBILI E SEMIDECIDIBILI 273
Sia y un suo indice. Poiche h `e totale deve esistere x tale che f(x) = y. Allora
si ha nuovamente la contraddizione:
h(x) =
y
(x) e h(x) =
y
(x) + 1.
2
Un elementare ragionamento basato sulla cardinalit`a ci pu`o convincere del
fatto che la classe degli insiemi non ricorsivamente enumerabili corrisponde
alla quasi totalit`a della classe degli insiemi di interi. Infatti, la classe di tutti
gli insiemi di interi ha cardinalit`a 2
IN
mentre linsieme delle funzioni ricorsive
parziali ha cardinalit`a IN e quindi le funzioni ricorsive totali, che sono un
sottoinsieme di quelle ricorsive parziali, avranno anchesse al pi` u cardinalit`a
IN.
Prima di mostrare ulteriori esempi di insiemi non ricorsivamente enumera-
bili, esaminiamo rispetto a quali operazioni insiemistiche la classe degli insiemi
ricorsivamente enumerabili risulti chiusa.
Teorema 7.21 Se gli insiemi A IN e B IN sono ricorsivamente
enumerabili allora anche gli insiemi A B e A B sono ricorsivamente
enumerabili.
Dimostrazione.
`
E suciente osservare che, se A = dom(
A
), B =
dom(
B
), allora basta denire:
g
AB
(x) =
_
1 se
A
(x) `e denito o
B
(x) `e denito
indenita, altrimenti
g
AB
(x) =
_
1 se
A
(x) `e denito e
B
(x) `e denito
indenita, altrimenti
per avere A B = dom(g
AB
) e A B = dom(g
AB
). 2
La propriet`a di chiusura, contrariamente al caso degli insiemi ricorsivi,
non vale invece per loperazione di complementazione. Questo fatto deriva dal
risultato seguente.
Teorema 7.22 Sia A IN un insieme ricorsivamente enumerabile e sia
ricorsivamente enumerabile anche il suo complemento

A; allora A `e ricorsivo.
Dimostrazione. Se A = dom(
A
) ed

A = dom(
A
) possiamo denire la
funzione caratteristica di A :
f
A
(x) =
_
1 se
A
(x) `e denita
0 se
A
(x) `e denita
e poiche una delle due alternative si verica sicuramente, f
A
`e ricorsiva totale.
2
274 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A
Come conseguenza immediata del teorema precedente, se un insieme `e ricor-
sivamente enumerabile, ma non ricorsivo, allora il suo complemento non pu`o
essere ricorsivamente enumerabile.
Esempio 7.8 Linsieme
K = x [
x
(x) non `e denita
non `e ricorsivamente enumerabile. Infatti sappiamo che K `e semidecidibile e quin-
di ricorsivamente enumerabile. Daltra parte esso non `e ricorsivo e quindi il suo
complemento non pu`o essere ricorsivamente enumerabile.
Il Teorema 7.22 mette sostanzialmente in luce che il complemento di un in-
sieme ricorsivamente enumerabile, ma non ricorsivo, ha delle propriet`a di
indecidibilit`a pi` u elevate dellinsieme stesso.
A conferma di questo fatto possiamo vericare che, ad esempio, per ri-
spondere alla domanda x appartiene a K? dobbiamo vericare se esiste y
tale che
x
(x) si arresta in meno di y passi, per rispondere alla domanda x
appartiene a K? dobbiamo vericare se per ogni y,
x
(x) richiede pi` u di y
passi: `e chiaro che nel primo caso una risposta aermativa pu`o essere data in
un tempo nito, mentre nel secondo caso ci`o non pu`o avvenire.
`
E interessante osservare, peraltro, che in tutti e due i casi il predicato di cui
si richiede la verica, cio`e i predicati
x
(x) richiede meno di y passi e
x
(x)
richiede pi` u di y passi, sono decidibili, mentre il predicato esiste y tale che

x
(x) richiede meno di y passi `e ricorsivamente enumerabile, e il predicato
per ogni y
x
(x) richiede pi` u di y passi `e addirittura non ricorsivamente
enumerabile.
In eetti, si pu`o vericare che tale fenomeno vale in generale, come
mostrato dai seguenti teoremi.
Teorema 7.23 Sia A IN un insieme non vuoto. A `e allora ricorsivamente
enumerabile se e solo se esiste un insieme ricorsivo B IN
2
tale che x A
se e solo se y[(x, y) B].
Dimostrazione. Sia f la funzione che enumera A; deniamo B = x, y [
f(y) = x. B `e chiaramente ricorsivo poiche f `e totale. Ci`o prova che il fatto
che A `e ricorsivamente enumerabile `e condizione suciente per lesistenza
dellinsieme ricorsivo B. Per dimostrare che la condizione `e anche necessaria,
supponiamo che sia dato un qualunque insieme ricorsivo B IN
2
e che f
B
sia
la sua funzione caratteristica. Abbiamo allora che se deniamo la funzione g
A
nel seguente modo:
g
A
(x) =
_
1 se esiste y tale che f
B
(x, y) = 1
indenita, altrimenti.
allora A = dom(g
A
). 2
7.7. INSIEMI DECIDIBILI E SEMIDECIDIBILI 275
Teorema 7.24 Sia A IN. A `e allora il complemento di un insieme ricorsi-
vamente enumerabile se e solo se esiste un insieme ricorsivo B IN
2
tale che
x A se e solo se y[(x, y) B].
Dimostrazione. La dimostrazione viene lasciata come esercizio (vedi Eser-
cizio 7.15). 2
Esercizio 7.15 Dimostrare il Teorema 7.24.
Quanto mostrato nei Teoremi 7.23 e 7.24 pu`o essere esteso al caso in cui
vengano utilizzati pi` u quanticatori esistenziali ed universali alternati, secondo
le seguenti denizioni.
Denizione 7.3 Per ogni insieme A IN, A
k
se e solo se esi-
ste un predicato ricorsivo P(x, y
1
, . . . , y
k
) tale che x A se e solo se
y
1
y
2
. . . Qy
k
P(x, y
1
, . . . , y
k
), dove Q = per k dispari, Q = per k pari.
Denizione 7.4 Per ogni insieme A IN, A
k
se e solo se esi-
ste un predicato ricorsivo P(x, y
1
, . . . , y
k
) tale che x A se e solo se
y
1
y
2
. . . Qy
k
P(x, y
1
, . . . , y
k
), dove Q = per k dispari, Q = per k pari.
Denizione 7.5 Per ogni insieme A IN, A
k
se e solo se A
k
e
A
k
.
Dalle denizione precedenti deriva immediatamente che, dato un insieme
A IN, A
n
se e solo se A
n
.
Linsieme delle classi
k
e
k
viene chiamato gerarchia aritmetica (o
gerarchia di Kleene).
Chiaramente la classe
0
e
0
della gerarchia aritmetica coincidono con la
classe degli insiemi ricorsivi, mentre la classe
1
coincide con la classe degli
insiemi ricorsivamente enumerabili e la classe
1
coincide con la classe degli
insiemi che sono complemento di insiemi ricorsivamente enumerabili.
Due propriet`a fondamentali della gerarchia aritmetica sono le seguenti:
i) i [
i

/
i+1
] e i [
i

/
i+1
]
ii) i [
i

i

i+1

i+1
].
Possiamo utilizzare la gerarchia aritmetica per caratterizzare il livello di
indecidibilit`a cui appartiene un insieme. Ad esempio, linsieme T = x [
x
`e totale coincide con linsieme x [ yk[
x
(y) richiede meno di k passi],
e quindi linsieme delle funzioni ricorsive totali appartiene a
2
. Una
illustrazione dei primi livelli della gerarchia aritmetica `e data in Figura 7.2.
276 CAPITOLO 7. TEORIA GENERALE DELLA CALCOLABILIT
`
A

0
=
0
=
1
B(x)
(insiemi ricorsivi)

1
yB(x, y)
(insiemi r.e.)

1
yB(x, y)
(complementi di
insiemi r.e.)

2
y
1
y
2
B(x, y
1
, y
2
)

1
y
1
y
2
B(x, y
1
, y
2
)
Figura 7.2 Gerarchia di Kleene.
Capitolo 8
Teoria della Complessit`a
Come si `e visto nei capitoli precedenti, la Teoria della Calcolabilit`a si interessa
dellesistenza o meno di algoritmi per la soluzione di specici problemi, oltre
che della relazione (in termini di possibilit`a o meno di soluzione dei problemi
stessi) tra i diversi modelli di calcolo. Una volta che un problema `e stato
riconosciuto come risolubile da un determinato modello di calcolo - tipicamen-
te da macchine di Turing - la Teoria della Calcolabilit`a non `e interessata a
determinare il costo di soluzione del problema in termini di risorse di calco-
lo utilizzate. Ad esempio, un determinato problema pu`o risultare risolubile
ma richiedere, almeno su certe istanze, un tempo intollerabilmente lungo per
il calcolo della soluzione, risultando cos` non risolubile in pratica, se non su
istanze particolarmente semplici.
In questo senso, la Teoria della Calcolabilit`a si limita a considerare aspetti
qualitativi della risolubilit`a di problemi, limitandosi, nellambito di un dato
modello di calcolo, a distinguere ci`o che `e risolubile da ci`o che non lo `e.
La Teoria della Complessit`a, al contrario, si occupa della caratterizzazione
e della classicazione dei problemi (risolubili, per ipotesi) dal punto di vista
della quantit`a di risorse di calcolo necessarie per risolverli. In particolare,
la Teoria della Complessit`a investiga la quantit`a di risorse necessarie (lower
bound) e/o sucienti (upper bound) per risolvere i vari problemi.
Le pi` u naturali risorse di calcolo considerate nellambito della Teoria della
Complessit`a sono il tempo e la memoria utilizzati da un algoritmo per la
risoluzione di un problema.
Naturalmente, la quantit`a precisa di risorse utilizzate in pratica nella ri-
soluzione dipender`a dal modello di calcolo considerato e dalle caratteristi-
che strutturali e tecnologiche delle macchine utilizzate per lesecuzione di un
algoritmo.
Al ne di poter disporre di una classicazione dei problemi basata sul-
la loro intrinseca dicolt`a, sar`a quindi necessario fare riferimento a modelli
278 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
astratti, che permettano di prescindere da caratteristiche realizzative (come
ad esempio la RAM che, come abbiamo visto, `e una ragionevole astrazione
di un usuale calcolatore). In questo modo potremo classicare i problemi in
termini di risorse di calcolo richieste per la loro soluzione su un modello di
calcolo particolare. Potremo fare ad esempio riferimento ai problemi risolu-
bili con macchine di Turing non deterministiche in spazio lineare (si ricordi
che tale classe include il riconoscimento di linguaggi di tipo 1) o ai problemi
risolubili in tempo cubico con una RAM.
Tra i risultati pi` u importanti che la Teoria della Complessit`a intende perse-
guire c`e in particolare la caratterizzazione dei problemi computazionalmente
trattabili: problemi cio`e che possono essere ecientemente risolti con algoritmi
che richiedono un tempo di calcolo polinomiale. Come vedremo, un problema
pu`o essere classicato come trattabile senza fare riferimento ad un particolare
modello di calcolo.
Ci`o `e reso possibile dal fatto che molti modelli generali di computazione
danno luogo, in larga misura e per la maggior parte dei casi pi` u interessanti,
alla medesima classicazione. Per tale motivo nel seguito si far`a uso, come
modello di calcolo di riferimento, della Macchina di Turing a pi` u nastri intro-
dotta nella Sezione 5.4, sfruttando, a tal ne, una versione particolare della
Tesi di Church-Turing, che asserisce che ogni dispositivo di calcolo natura-
le pu`o essere simulato da una macchina di Turing a pi` u nastri con un costo
per la simulazione di ogni operazione al pi` u polinomiale nella dimensione del
problema. Un esempio di tale relazione `e stato dato in Sezione 6.3, dove si
`e illustrato come macchine di Turing deterministiche e RAM siano simulabili
tra loro in tempo polinomiale.
8.1 Valutazioni di complessit`a
Lobiettivo principale della Teoria della Complessit`a `e dunque la caratterizza-
zione di insiemi di problemi in funzione delle risorse di calcolo (spazio, tempo)
necessarie alla loro risoluzione: questi insiemi prendono il nome di classi di
complessit`a.
Indichiamo con

t
A
(x) il tempo di esecuzione dellalgoritmo A su input x,
inteso come numero di passi elementari eettuati . Il tempo di esecuzione nel
caso peggiore (worst case) di A sar`a allora il tempo utilizzato da A sullistanza
pi` u dicile e sar`a espresso come t
A
(n) = max

t
A
(x) [ x : [ x[ n, dove [ x[
indica la dimensione di x, intesa come lunghezza della descrizione dellistanza
stessa. Quindi t
A
(n) rappresenta il tempo di esecuzione di A sullistanza di
lunghezza al pi` u n (secondo una qualche codica) per il quale tale tempo di
esecuzione `e massimo.
Corrispondentemente, sia s
A
(x) lo spazio di memoria utilizzato dallalgorit-
mo A su input x. Lo spazio di esecuzione nel caso peggiore di A, denito come
lo spazio utilizzato da A sullistanza peggiore, `e dato da s
A
(n) = max s
A
(x) [
x : [ x[ n.
8.1. VALUTAZIONI DI COMPLESSIT
`
A 279
Nel caso di complessit`a spaziale si far`a sempre riferimento allo spazio di
lavoro addizionale, cio`e alla quantit`a di celle di nastro (in una macchina di
Turing) o di locazioni di memoria utilizzate per eseguire la computazione,
non considerando lo spazio richiesto per la descrizione iniziale dellistanza in
questione. A tal ne, assumiamo che la descrizione dellistanza sia rappresen-
tata su una memoria di sola lettura (read-only) la cui dimensione non viene
considerata nella valutazione della complessit`a spaziale, e a cui sia possibile
accedere in modo one-way, muovendosi cio`e dallinizio alla ne, in modo tale
che la descrizione dellinput possa essere letta una sola volta, per mezzo di
ununica scansione.
Data una istanza di un problema, la lunghezza cui si fa riferimento in
Teoria della Complessit`a `e denita come il numero di caratteri necessari per
descrivere tale istanza nellambito di un qualche metodo di codica predenito.
In tal modo, naturalmente, sia la lunghezza associata ad una istanza che la
complessit`a di un algoritmo operante sullistanza stessa saranno dipendenti
dal metodo di codica adottato.
Denizione 8.1 Dato un problema T con insieme I
P
delle possibili istanze,
e dato un alfabeto , deniamo come schema di codica di T una funzione
e : I
P

che mappa ogni istanza di T in una corrispondente stringa di


simboli in

.
Diciamo che uno schema di codica `e ragionevole se non vi sono istanze la cui
descrizione `e articiosamente lunga. Ci`o signica, ad esempio:
- considerare codiche in base k 2 dei valori numerici interessati;
- rappresentare insiemi mediante enumerazione delle codiche dei loro
elementi;
- rappresentare relazioni e funzioni mediante enumerazione delle codiche
dei relativi elementi (coppie e n-ple);
- rappresentare gra come coppie di insiemi (di nodi ed archi).
In generale, tra tutti gli schemi di codica ragionevoli vale la seguente
condizione di correlazione polinomiale.
Denizione 8.2 Due schemi di codica e, e

per un problema T sono poli-


nomialmente correlati se esistono due polinomi p, p

tali che, per ogni x


I
P
:
- [ e(x)[[ p

(e

(x))[
- [ e

(x)[[ p(e(x))[
280 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Essenzialmente, quindi, e ed e

sono polinomialmente correlati se per ogni


istanza le lunghezze delle relative codiche nei due schemi sono non troppo
diverse. Si pu`o comprendere, gi`a a livello intuitivo, come un algoritmo che
utilizza tempo (o spazio) polinomiale per risolvere un problema T le cui istan-
ze siano codicate per mezzo di e utilizzi tempo (o spazio) polinomiale per
risolvere T anche nel caso in cui le istanze siano codicate per mezzo di e

.
Esempio 8.1 Luso di schemi di codica non ragionevoli pu`o portare a valutazioni
di complessit`a paradossali.
Ad esempio, si consideri il problema di decidere, dato un naturale x, se esso `e
primo. Il semplice algoritmo consistente nel tentare di dividere x per tutti i naturali
i < x (e dedurre che x `e primo se per tutti questi valori la divisione fornisce resto non
nullo) esegue O(x) passi (assumendo, per semplicit`a, che una divisione sia eseguita in
tempo costante rispetto al valore dei relativi operandi) e risulta quindi esponenziale
per una codica ragionevole, quale ad esempio quella pi` u naturale consistente nel
rappresentare x per mezzo di log
2
(x + 1)| bit.
Consideriamo, al contrario, luso di una codica non ragionevole, quale ad esempio
quella unaria, che utilizza un alfabeto di un solo carattere [ e rappresenta lintero n
per mezzo di una stringa di n caratteri [. In tal caso, lalgoritmo precedente risulta
avere complessit`a polinomiale (lineare, addirittura).
Si osservi che le due codiche non sono polinomialmente correlate.
Dalla propriet`a di correlazione polinomiale valida tra tutti gli schemi di codi-
ca ragionevoli deriva che la complessit`a di un algoritmo risulta invariante (a
meno di un polinomio) al variare dello schema utilizzato. Per tutti i problemi
che saranno considerati in seguito, tutti gli schemi di codica pi` u naturali ri-
sultano ragionevoli, per cui, in generale, si assumer`a implicitamente di far uso
di uno di tali schemi e non si far`a riferimento ad aspetti relativi alla codica
di istanze.
Inne, osserviamo che in generale lanalisi della complessit`a di un dato pro-
blema ha luogo mediante valutazioni separate delle quantit`a di risorse neces-
sarie (lower bound) e sucienti (upper bound) per la risoluzione del problema
stesso. Soltanto nel momento in cui, eventualmente, queste misure dovessero
coincidere avremmo una valutazione esatta della complessit`a stessa.
Inoltre, per semplicit`a, lanalisi viene eettuata asintoticamente, vale a dire
che quel che interessa caratterizzare `e come la complessit`a di risoluzione del
problema cresca al tendere allinnito della dimensione delle relative istanze.
Da tali considerazioni deriva la seguente denizione.
Denizione 8.3 Dato un problema T diciamo che:
1. T ha delimitazione superiore di complessit`a temporale (upper bound)
O(g(n)) se esiste un algoritmo A che risolve T tale che

t
A
(n) = O(g(n));
2. T ha delimitazione inferiore di complessit`a temporale (lower bound)
(g(n)) se per ogni algoritmo A che risolve T si ha

t
A
(n) = (g(n));
3. T ha complessit`a temporale (esatta) (g(n)) se ha upper bound O(g(n))
e lower bound (g(n)).
8.2. TIPI DI PROBLEMI 281
Denizioni simili possono essere introdotte per lo spazio utilizzato.
Esempio 8.2 Se consideriamo ad esempio il classico problema dellordinamento di
una sequenza di n interi, abbiamo che esso presenta, come noto, un upper bound sulla
complessit`a temporale O(nlog n) e lower bound sulla stessa complessit`a (nlog n),
per cui la complessit`a temporale esatta di tale problema `e (nlog n).
8.2 Tipi di problemi
Come detto poco sopra, la Teoria della Complessit`a si interessa in genera-
le della dicolt`a di soluzione di problemi o, alternativamente, di calcolo di
funzioni. Ai ni di un miglior trattamento formale, risulta per`o conveniente
introdurre una prima classicazione di tali problemi che tenga conto del tipo
di questione posta da ogni specico problema.
Si noti, ad esempio, che per ogni funzione (eventualmente multivalore)
f : 1 2
O
, si possono porre almeno quattro specici problemi:
- dati x 1, si vuole determinare se esiste y f(x)
- dato x 1, si vuole un qualche y f(x).
- dato x 1, si vuole conoscere [ f(x)[.
- dato x 1, si vuole la y f(x) migliore secondo una qualche misura
data.
Da tali considerazioni deriva una caratterizzazione dei problemi in ter-
mini di problemi di decisione, ricerca, enumerazione ed ottimizzazione,
rispettivamente.
I problemi di decisione rappresentano la tipologia di problemi pi` u sempli-
ci, nel senso che la loro caratterizzazione richiede il minor numero di concetti
introdotti.
Deniamo un problema di decisione T
D
per mezzo di:
1. un insieme di istanze I
P
D
;
2. un predicato : I
P
D
vero, falso che determina una partizione
I
P
D
= Y
P
D
N
P
D
, Y
P
D
N
P
D
= , in un insieme Y
P
D
di istanze positive,
tali cio`e che x Y
P
D
se e solo se (x) = vero, ed in un insieme N
P
D
di
istanze negative, tali che x N
P
D
se e solo se (x) = falso.
Si noti come tutti i problemi consistenti nel riconoscimento di un linguaggio L
studiati in precedenza siano problemi di decisione, dove I
P
D
=

e Y
P
D
= L.
Se consideriamo inoltre una qualsiasi codica e delle istanze di T
D
median-
te stringhe su un qualche alfabeto , possiamo poi associare a T
D
il problema
equivalente di riconoscere il linguaggio L = a

[ x Y
P
D
, a = e(x)
costituito da tutte le stringhe che descrivono istanze positive di T
D
.
282 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Si noti come linsieme di stringhe

L comprenda sia le descrizioni


di istanze negative di T
D
che stringhe che non rappresentano descrizioni di
istanze x I
P
D
. In generale, comunque, queste ultime stringhe possono essere
assunte come facilmente riconoscibili: possiamo assumere cio`e che il problema
di decidere, data una stringa a

, se essa sia descrizione di una istanza


di T
D
mediante lo schema di codica e sia un problema risolubile in modo
eciente (in un numero di passi polinomiale nella lunghezza della stringa).
Un algoritmo per un problema di decisione T
D
calcola il predicato pren-
dendo in input una istanza x I
P
D
, o pi` u esattamente la sua descrizione
secondo uno schema di codica pressato, e restituendo in output un valore
vero, falso corrispondente a (x) = T o (x) = F, rispettivamente.
Esempio 8.3 Il problema di decisione Cricca `e denito come segue
1
:
Cricca
Istanza: Grafo G = (V, E), intero K > 0.
Predicato: Esiste V

V con [ V

[ K e tale che per ogni coppia u, v V

(u, v) E?
Dato un grafo G ed un intero positivo K, un algoritmo per Cricca restituir`a quindi
il valore vero se esistono almeno K nodi in G tutti mutuamente collegati tra loro,
altrimenti lalgoritmo restituir`a il valore falso.
Si pu`o osservare come il predicato associato ad un problema di decisione in
generale sia relativo allesistenza o meno di una qualche struttura, dipendente
dallistanza in questione, che gode di determinate propriet`a. Indichiamo tale
struttura come la soluzione dellistanza.
Esempio 8.4 Nel caso di Cricca, la struttura in questione `e rappresentata da un
sottoinsieme V

V che soddisfa il predicato associato al problema.


Si noti come, mentre in un problema di decisione ci si chiede se esiste o
meno una soluzione per una istanza x, `e possibile anche porsi lobiettivo di
determinare tale soluzione, se essa esiste (se cio`e x Y
P
D
).
Tale situazione `e formalizzata per mezzo della denizione della classe dei
problemi di ricerca.
Deniamo un problema di ricerca T
R
per mezzo di:
1. un insieme di istanze I
P
R
;
2. un insieme di soluzioni S
P
R
;
3. una propriet`a di ammissibilit`a, che deve valere per tutte le soluzioni
di una istanza: tale propriet`a induce una relazione R I
P
R
S
P
R
,
1
Nel seguito, presenteremo i vari problemi omettendo di specicare che, in eetti, le rela-
tive istanze sono da considerare codicate secondo un qualche schema di codica ragionevole:
parleremo cioe ad esempio di grafo e non di codica di grafo.
8.2. TIPI DI PROBLEMI 283
detta relazione di ammissibilit`a. Data una istanza x I
P
R
, linsieme
Sol(x) = y S
P
R
[ x, y) R viene detto insieme delle soluzioni
ammissibili di x.
Il problema di ricerca T
R
ha un problema di decisione associato T
D
con I
P
D
=
I
P
R
e con il predicato denito come Esiste y S
P
R
tale che x, y) R?
Un algoritmo per un problema di ricerca T
R
calcola una funzione (parziale)
: I
P
R
S
P
R
tale che (x) `e denita se e solo se esiste almeno una soluzione
y = (x) per la quale x, y) R. Lalgoritmo prende quindi in input una
istanza x I
P
R
, o pi` u esattamente la sua descrizione secondo uno schema di
codica pressato, e restituisce in output la codica di una soluzione y Sol(x)
(se una soluzione esiste).
Esempio 8.5 Il problema di ricerca Ricerca Cricca `e denito come segue:
Ricerca Cricca
Istanza: Grafo G = (V, E), intero K > 0
Soluzione: Insieme di nodi V

Ammissibilit` a: V

V , [ V

[ K, u, v V

(u, v) E
Dato un grafo G ed un intero positivo K, un algoritmo per Ricerca Cricca
restituir`a quindi, se esiste, un sottoinsieme V

di V che soddisfa la propriet`a di


ammissibilit`a, per il quale cio`e vale il predicato denito in Cricca.
I problemi di enumerazione sono fortemente correlati ai problemi di ricerca,
in quanto fanno riferimento ad una medesima denizione. Infatti anche un
problema di enumerazione T
E
pu`o essere denito mediante:
1. un insieme di istanze I
P
E
;
2. un insieme di soluzioni S
P
E
;
3. una propriet`a di ammissibilit`a, che induce la relazione di ammissibilit`a
R I
P
E
S
P
E
.
Un algoritmo per un problema di enumerazione T
E
calcola una funzione :
I
P
E
IN tale che per ogni x I
P
E
, (x) =[ Sol(x) [. Il valore restituito
dallalgoritmo su input x `e quindi il numero di soluzioni ammissibili dellistanza
x.
Esempio 8.6 Il problema di enumerazione Enumera Cricche viene denito allo
stesso modo di Ricerca Cricca, ma quel che si vuole in questo caso `e restituire un
valore intero n pari al numero di soluzioni ammissibili distinte, pari cio`e al numero di
sottoinsiemi distinti V

che soddisfano il predicato denito in Cricca.


Un problema di ottimizzazione T
O
richiede per ogni istanza x I
P
O
la resti-
tuzione della soluzione migliore associata ad x, rispetto ad una qualche misura
di qualit`a denita sullinsieme delle coppie istanzasoluzione.
Pi` u formalmente, deniamo un problema di ricerca T
O
per mezzo di:
284 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
1. un insieme di istanze I
P
O
;
2. un insieme di soluzioni S
P
O
;
3. una propriet`a di ammissibilit`a, rappresentata dalla relazione di ammis-
sibilit`a R I
P
O
S
P
O
;
4. una funzione di misura : I
P
O
S
P
O
IN tale che per ogni x I
P
O
,
y S
P
O
, (x, y) `e denita se e solo se y Sol(x);
5. un criterio di scelta c Min, Max.
Il problema richiede, per ogni istanza x, la soluzione y Sol(x) tale che per
ogni z Sol(x), (x, y) (x, z) se c = Min e (x, y) (x, z) se c = Max.
Esempio 8.7 Il problema di ottimizzazione Massima Cricca `e denito come.
Massima Cricca
Istanza: Grafo G = (V, E)
Soluzione: Insieme di nodi V

Ammissibilit` a: V

V , u, v V

(u, v) E
Misura: [ V

[
Criterio: Max
8.3 Complessit`a temporale e spaziale
Come vedremo, buona parte della Teoria della Complessit`a sar`a introdotta
facendo riferimento ai problemi di decisione ed ai linguaggi ad essi associati.
Ci`o `e dovuto a diversi motivi:
Ogni problema di decisione pu`o essere visto, indipendentemente dalla
struttura delle sue istanze (numeri, stringhe, gra, etc.), come il proble-
ma di discriminare tra due insiemi di stringhe: da una parte le codiche
di istanze in Y
P
e, dallaltra, sia le stringhe che rappresentano istanze
in N
P
che le stringhe le quali non rappresentano istanze di T. Come
osservato sopra, dato un qualche criterio di codica (ad esempio, nu-
meri in rappresentazione binaria, insiemi come sequenze di identicatori
associati ai relativi elementi, etc.), vericare che una data stringa rap-
presenti una istanza di un problema T nellambito di quel criterio di
codica `e un compito semplice, che pu`o essere risolto da un algoritmo
eciente. Questa caratteristica permette un trattamento formale unico
di tutti i problemi di decisione in termini di problemi di riconoscimento
di linguaggi.
8.3. COMPLESSIT
`
A TEMPORALE E SPAZIALE 285
Dato che un problema di decisione ha un solo bit (vero o falso) come
output, nellanalisi di complessit`a non c`e bisogno di prestare attenzione
al costo di restituzione del risultato. Tutti i costi hanno una origine com-
pletamente computazionale e non hanno nulla a che fare con la quantit`a
di informazione in output e con il tempo necessario a restituirla.
Possiamo quindi ora denire formalmente i concetti di tempo e di spazio di
computazione, facendo riferimento al riconoscimento di linguaggi da parte di
macchine di Turing.
Deniamo dapprima laccettazione di una stringa da parte di una data mac-
china di Turing (deterministica o non deterministica), in un numero limitato
di passi.
Denizione 8.4 Dato un alfabeto , una macchina di Turing (deterministica
o non deterministica) / = (, b, Q, q
0
, F, ) (con ) ed un intero > 0,
una stringa x

`e accettata da / in passi se esiste una computazione


q
0
x
M
c composta da r passi, con c congurazione nale e r .
Possiamo quindi denire, per una macchina di Turing deterministica, la
condizione di riuto di una stringa.
Denizione 8.5 Dato un alfabeto , una macchina di Turing deterministica
/
D
= (, b, Q, q
0
, F, ) (con ) ed un intero > 0, una stringa x

`e riutata da /
D
in passi se esiste una computazione q
0
x
M
D
c composta
da r passi, con c congurazione massimale e non nale, e r .
A partire dalle denizioni precedenti, introduciamo quindi la propriet`a di ac-
cettabilit`a di un linguaggio in tempo limitato da parte di una macchina di
Turing (deterministica o non deterministica).
Denizione 8.6 Dato un alfabeto , una macchina di Turing (deterministica
o non deterministica) / = (, b, Q, q
0
, F, ) (con ) e una funzione
t : IN IN, diciamo che / accetta L

in tempo t(n) se, per ogni x

,
/ accetta x in tempo al pi` u t([ x[) se x L, mentre, se x , L, allora / non
la accetta.
Inne, introduciamo la propriet`a di decidibilit`a in un numero di passi limitato
di un linguaggio da parte di una macchina di Turing deterministica.
Denizione 8.7 Dato un alfabeto , una macchina di Turing deterministica
/
D
= (, b, Q, q
0
, F, ) (con ) e una funzione t : IN IN, diciamo
che /
D
riconosce L

in tempo t(n) se, per ogni x

, /
D
accetta x
in tempo al pi` u t([ x[) se x L e riuta x, ancora in tempo al pi` u t([ x[), se
x , L.
286 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Diciamo quindi che un linguaggio L `e accettabile in tempo deterministico t(n)
se esiste una macchina di Turing deterministica /
D
che accetta L in tempo
t(n). Similmente, diciamo che un linguaggio L `e accettabile in tempo non
deterministico t(n) se esiste una macchina di Turing non deterministica /
ND
che accetta L in tempo t(n)
Inne, diciamo che un linguaggio L `e decidibile in tempo t(n) se esiste una
macchina di Turing deterministica /
D
che decide L in tempo t(n).
Per quanto riguarda la denizione della complessit`a spaziale, faremo riferi-
mento al numero di celle di nastro (o nastri, se pi` u di uno) di lavoro accedute
nel corso di una computazione. Assumeremo quindi che la stringa di input
sia contenuta in un nastro aggiuntivo one way, vale a dire un nastro di sola
lettura e su cui sia possibile muovere la testina soltanto verso destra, e non
terremo conto delle celle utilizzate su tale nastro per la rappresentazione del-
linput, mentre conteremo le celle utilizzate sugli altri nastri. In tal modo,
introduciamo le seguenti denizioni, corrispondenti a quelle date sopra per la
complessit`a temporale.
Denizione 8.8 Dato un alfabeto , una macchina di Turing (deterministica
o non deterministica) / = (, b, Q, q
0
, F, ) (con ) ed un intero > 0,
una stringa x

`e accettata da / in spazio se esiste una computazione


q
0
#x
M
c, nel corso della quale vengono accedute v celle di nastro, con c
congurazione nale e v .
Denizione 8.9 Dato un alfabeto , una macchina di Turing deterministica
/
D
= (, b, Q, q
0
, F, ) (con ) ed un intero > 0, una stringa x

`e riutata da /
D
in spazio se esiste una computazione q
0
#x
M
D
c, nel
corso della quale vengono accedute v celle, con c congurazione massimale e
non nale e v .
Denizione 8.10 Dato un alfabeto , una macchina di Turing (deterministi-
ca o non deterministica) / = (, b, Q, q
0
, F, ) (con ) e una funzione
s : IN IN, diciamo che / accetta L

in spazio s(n) se, per ogni x

,
/ accetta x in spazio s([ x [) se x L, mentre, se x , L, allora / non la
accetta..
Denizione 8.11 Dato un alfabeto , una macchina di Turing deterministica
/
D
= (, b, Q, q
0
, F, ) (con ) e una funzione s : IN IN, diciamo
che /
D
riconosce L

in spazio s(n) se, per ogni x

, /
D
accetta x
in spazio s([ x[) se x L e riuta x (ancora in spazio s([ x[)) se x , L.
Diciamo quindi che un linguaggio L `e accettabile in spazio deterministico s(n)
se esiste una macchina di Turing deterministica /
D
che accetta L in spa-
zio s(n), e che `e accettabile in spazio non deterministico s(n) se esiste una
macchina di Turing non deterministica /
ND
che accetta L in spazio s(n).
8.3. COMPLESSIT
`
A TEMPORALE E SPAZIALE 287
Diciamo inne che un linguaggio L `e decidibile in spazio s(n) se esiste una
macchina di Turing deterministica /
D
che decide L in spazio s(n).
In generale, per semplicit`a e per ragioni che saranno pi` u chiare dopo avere
introdotto i teoremi di compressione (nella Sezione 8.4), la complessit`a viene
denita in termini asintotici, non facendo riferimento a costanti moltiplicative
e termini di grado inferiore.
Lobiettivo fondamentale della Teoria della Complessit`a `e essenzialmente
quello di catalogare linsieme di tutti i problemi (in particolare, dei problemi
di riconoscimento) in funzione della quantit`a di risorse di calcolo necessarie
per la relativa risoluzione.
A tale scopo, risulta di primaria rilevanza il concetto di classe di comples-
sit`a intesa come linsieme dei problemi (funzioni) risolubili in un determinato
limite di risorse di calcolo (tipicamente spazio o tempo), nel contesto di uno
specico modello di calcolo. Come vedremo, la denizione di molte ed impor-
tanti classi di complessit`a fa riferimento a problemi di decisione e, quindi, tali
classi sono tipicamente denite in termini di riconoscimento di linguaggi.
Ad esempio, data una funzione f : IN IN, `e possibile denire
immediatamente le classi seguenti:
- DTIME(f(n)) `e linsieme dei linguaggi decisi da una macchina di Turing
deterministica ad 1 nastro in tempo al pi` u f(n);
- DSPACE(f(n)) la classe dei linguaggi decisi da una macchina di Turing
deterministica ad 1 nastro (pi` u un nastro one way di input) in spazio al
pi` u f(n);
- NTIME(f(n)) `e linsieme dei linguaggi accettati da una macchina di
Turing non deterministica ad 1 nastro in tempo al pi` u f(n);
- NSPACE(f(n)) `e linsieme dei linguaggi accettati da una macchina di
Turing non deterministica ad 1 nastro (pi` u un nastro one way di input)
in spazio al pi` u f(n).
Come abbiamo detto in precedenza, nellesposizione dei concetti della Teoria
della Complessit`a e nella denizione delle classi di complessit`a faremo general-
mente uso, come modello di calcolo di riferimento, delle macchine di Turing.
Tuttavia, come vedremo in seguito, tale scelta non `e limitativa, in quanto molti
importanti risultati sono invarianti rispetto al modello di calcolo considerato
(almeno per quanto riguarda i modelli di calcolo pi` u usuali).
Ad esempio, una importante classe di complessit`a `e rappresentata, come
vedremo, dalla classe P, linsieme dei linguaggi decidibili da una macchina di
Turing deterministica ad 1 nastro in tempo polinomiale. Se deniamo ora la
classe P
k
come linsieme dei linguaggi decidibili da una macchina di Turing
deterministica a k nastri in tempo polinomiale, possiamo osservare che ogni
macchina di Turing a k nastri /
k
operante in tempo polinomiale p(n) pu`o
288 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
essere simulata da una macchina di Turing ad 1 nastro / operante in tempo
O((p(n))
2
) (vedi Sezione 5.4.3).
Da ci`o, tenendo conto della banale osservazione che un linguaggio deciso
da una macchina di Turing ad 1 nastro in tempo t(n) `e chiaramente decidibile
da una macchina di Turing a k nastri nello stesso tempo, deriva che P = P
k
:
possiamo quindi identicare con P linsieme dei problemi decidibili in tempo
polinomiale da una macchina di Turing deterministica, indipendentemente dal
numero di nastri utilizzati.
Una relazione dello stesso tipo rispetto a P pu`o essere mostrata anche per
quanto riguarda la decidibilit`a da parte di macchine a registri, in quanto, come
visto nella Sezione 6.3, una macchina di Turing esegue O((p(n))
2
) passi per
simulare una macchina a registri operante in tempo p(n), mentre una macchina
di Turing operante in tempo p(n) pu`o essere simulata da una macchina a
registri mediante lesecuzione di O(p(n) log(p(n))) passi.
Relazioni simili possono essere mostrate anche, in molti casi, per quanto
riguarda classi di complessit`a spaziale.
8.4 Teoremi di compressione ed accelerazione
I cosiddetti teoremi di compressione e di accelerazione, considerati in questa
sezione, mostrano che da qualunque algoritmo con una complessit`a (di tempo
o spazio) (n) `e possibile derivare un algoritmo di complessit`a c(n) per ogni
costante c < 1 predenita.
In conseguenza di tali risultati, sar`a nel seguito possibile e giusticato
caratterizzare la complessit`a di algoritmi e problemi indipendentemente da
costanti moltiplicative.
2
Il primo teorema che introduciamo `e relativo alla
possibilit`a di comprimere lo spazio utilizzato nel corso di una computazione,
adottando un alfabeto di nastro di dimensione sucientemente grande.
Teorema 8.1 (Compressione lineare) Sia / una macchina di Turing a
1 nastro (deterministica o non deterministica) che accetta un linguaggio L in
spazio s(n) e sia c > 0 una costante.
`
E possibile derivare una macchina di
Turing /

ad 1 nastro che accetta L in spazio s

(n) cs(n).
Dimostrazione. Sia k =
1
c
|. Mostriamo come ogni congurazione di
lunghezza m del nastro di / possa essere associata ad una congurazione
compressa, di lunghezza
m
k
| del nastro di /

.
Ogni cella sul nastro di /

corrisponder`a a k celle adiacenti sul nastro


di /. Ci`o viene ottenuto utilizzando per /

un alfabeto di nastro

tale
che [

[=[

[
k
. Si osservi che, dato che una posizione della testina di /

corrisponde a k posizioni consecutive della testina di /, sar`a necessario per


2
Nel dimostrare i teoremi di compressione faremo riferimento a macchine di Turing
ad 1 nastro. I risultati possono essere comunque facilmente estesi a macchine di Turing
multinastro.
8.4. TEOREMI DI COMPRESSIONE ED ACCELERAZIONE 289
/

rappresentare, allinterno dello stato, linformazione su quale di tali k


posizioni sia quella su cui si trova la testina di /.
Ci`o viene reso possibile considerando gli stati di /

come coppie (q, j),


con q Q, 1 j k. Ad ogni istante, /

si trova nello stato (q, j) se e solo


se / si trova nello stato q e la sua testina `e posta sulla j-ma tra le k celle
corrispondenti alla posizione su cui si trova la testina di /

.
La simulazione di / da parte di /

risulta quindi piuttosto semplice,


almeno dal punto di vista concettuale. 2
Come si pu`o notare, il risparmio di spazio (cos` come, successivamente, di tem-
po) deriva esclusivamente da una opportuna modica del modello di calcolo, e
non da miglioramenti nella struttura concettuale dellalgoritmo, rappresentata
dalla funzione di transizione.
Esercizio 8.1 Determinare la struttura di una macchina di Turing /

operante in
spazio pari a 1/2 di quanto utilizzato dalla macchina di Turing /, la cui funzione di
transizione `e rappresentata in Tabella 5.1,
Il Teorema di Accelerazione lineare, introdotto qui di seguito, mostra
poi come un opportuno incremento della dimensione dellalfabeto di nastro
consenta, sfruttando in modo adeguato la conseguente compressione di spazio,
di ridurre anche il numero di passi eseguiti.
Teorema 8.2 (Accelerazione lineare) Sia / una macchina di Turing
(deterministica o non deterministica) che accetta una linguaggio L in tem-
po t(n) e sia > 0 una costante.
`
E possibile allora derivare una macchina di
Turing /

con 2 nastri che accetta L in tempo t

(n) t(n)| + O(n).


Dimostrazione. Indichiamo con T

0
, T

1
i due nastri di /

e con T il nastro
di /. Se la stringa in input w `e denita sullalfabeto e se `e lalfabeto di
nastro di T, deniamo i due alfabeti di nastro di T

0
e di T

1
come

0
=

e

1
=

m
per un intero m > 0 opportuno dipendente da . /

simula / in 2
fasi.
1. Nella prima fase /

scandisce la stringa di input (che assumiamo


contenuta nel nastro T

0
) e la copia, in forma compressa, sul nastro T

1
.
2. Nella seconda fase, /

utilizza il solo nastro T

1
per simulare loperato
di / sul nastro T. Il contenuto di T

1
viene mantenuto, durante la
simulazione, allineato al contenuto di T, nel senso che esso contiene
(ad istanti opportuni) la codica compressa del contenuto di T. La
simulazione opera in modo tale da accettare linput in forma compressa
su T

1
se e solo se / accetta linput originale su T.
La macchina di Turing /

pu`o quindi essere descritta come la concatenazione


di due macchine di Turing /
1
, /
2
, che eseguono le operazioni previste per
le due fasi della computazione.
290 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
1. /
1
legge iterativamente su T

0
, per un valore m dipendente da e che
verr`a determinato in seguito, m caratteri della stringa di input w e li
codica sul nastro T

1
per mezzo di un unico carattere dellalfabeto

0
.
Al termine della codica, la testina di T

1
viene spostata allinizio della
stringa compressa.
`
E facile vericare che il numero di passi di calcolo eseguiti durante questa
fase sar`a al pi` u pari a [ w [ +1 +
|w|
m
| (Esercizio 8.2). Indichiamo con
(w) la stringa contenuta in T

1
al termine di questa fase.
2. /
2
utilizza ora solo T

1
per simulare su (w) la computazione eseguita
da / su w: nel far ci`o simula ogni sequenza di m passi eseguiti da /
in 9 passi, in modo tale che, per ogni intero s 0, il nastro T contenga,
dopo 9s passi di computazione di /
2
, la codica (x) del contenuto x
del nastro di / dopo ms passi di /.
Possiamo considerare lo stato di /
2
dopo 9s passi come una coppia
(q, j), dove q Q `e lo stato di / dopo ms passi e lintero j (1 j m)
indica quale simbolo della sequenza di m simboli di

corrispondente al
simbolo di

1
attualmente scandito su T

1
`e scandito da / sul proprio
nastro T (vedi Figura 8.1). Se ad esempio assumiamo m = 3, allora,

q
/
m m
1 j
m

(q, j)
/
2
Figura 8.1 Simulazione di / da parte di /
2
.
se dopo 6s passi / si trova nella congurazione abbaqbabb, con q Q,
/
2
dopo 18s passi si trover`a nella congurazione (abb)(q, 2)(aba)(bbb),
8.4. TEOREMI DI COMPRESSIONE ED ACCELERAZIONE 291
dove ogni terna di caratteri da

= a, b, b `e in eetti rappresentata da
un singolo carattere su un alfabeto (incluso il simbolo di cella vuota) di
dimensione 27.
La simulazione di una sequenza di 9 passi avviene nel modo seguente:
(a) La testina su T

1
scandisce prima la cella precedente e poi quella
seguente a quella su cui `e posizionata (in 4 passi, muovendosi a
sinistra di una cella, a destra di due e a sinistra di una): in tal
modo /
2
viene a conoscere, e a codicare nel proprio stato, il valore
di una sequenza di 3m simboli sul nastro di / (che denominiamo
stringa attiva), di cui almeno m precedenti ed m seguenti il simbolo
attualmente scandito da /. Si noti che la computazione di /, per
i prossimi m passi, potr`a essere determinata, oltre che dallo stato
attuale, soltanto dai simboli che compaiono nella stringa attiva:
infatti, in m passi di computazione, la testina di / non potr`a
comunque esaminare simboli contenuti in celle pi` u lontane di m
posizioni da quella attualmente scandita.
(b) A questo punto, /
2
`e in grado di predire esattamente i prossimi
m passi eseguiti da / e simularne leetto in un solo passo, per
mezzo di una funzione di transizione rappresentata da una tabella
di dimensione nita e pari a [ Q [[

[
3m
, costruita a partire dalla
funzione di transizione di /.
(c) Dato che la simulazione di m passi di / pu`o al massimo modi-
care i simboli contenuti nella cella attualmente scandita su T

1
, in
quella precedente ed in quella successiva, /
2
aggiorna tali valori
per mezzo di 5 passi aggiuntivi, posizionando quindi la testina di
T

1
sul simbolo che codica la m-pla che sul nastro di / contiene
il simbolo attualmente scandito su T.
Pi` u formalmente, deniamo linsieme degli stati di /
2
come
Q
2
= (Q1, . . . , m) (Q1, . . . , m

3m
1, . . . , 8),
dove linterpretazione di uno stato (q, j) Q 1, 2, . . . , m `e stata
fornita sopra, mentre uno stato (q, j, x, p) Q 1, 2, . . . , m

3m

1, 2, . . . , 8 rappresenta lo stato raggiunto da /


2
dopo una sequenza
di p < 9 passi eseguiti a partire dallo stato (q, j) e con stringa attiva x.
Le 9 transizioni eettuate da /
2
saranno allora, nellipotesi che y sia il
simbolo scandito, x il simbolo precedente, z il simbolo successivo e (q, j)
sia lo stato iniziale della sequenza:
1.
2
((q, j), y) = ((q, j, b
3m
, 1), y, s)
2.
2
((q, j, b
3m
, 1), x) = ((q, j, xb
2m
, 2), x, d)
3.
2
((q, j, b
2m
, 2), y) = ((q, j, xyb
m
, 3), y, d)
4.
2
((q, j, b
m
, 3), z) = ((q, j, xyz, 4), z, s)
292 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Sia ora xyz = uav, dove a `e il simbolo scandito da / (e quindi
[ u[= m + j 1 e [ v [= 2m j) ed assumiamo che uqav
M
u

in
m passi e che u

= x

(con [ x

[=[ y

[=[ z

[= m). Allora i passi


successivi saranno:
5.
2
((q, j

, xyz, 4), y) = ((q, j

, xyz, 5), y, s)
6.
2
((q, j

, xyz, 5), x) = ((q, j

, xyz, 6), x

, d)
7.
2
((q, j

, xyz, 6), y) = ((q, j

, xyz, 7), y

, d)
8.
2
((q, j

, xyz, 7), z) = ((q, j

, xyz, 8), z

, s)
Dove j

=[ u

[ +1.
Inne, per quanto riguarda lultimo passo,
9.
2
((q, j

, xyz, 9), y

) =
_

_
((q

, j

), y

, s) j

m
((q

, j

m), y

, i) m < j

2m
((q

, j

2m), y

, d) 2m < j

Da quanto detto, abbiamo che, se / accetta w (di lunghezza n) in t passi, /

accetta la stessa stringa in 9


t
m
|+n+1+
n
m
| passi. Mostriamo allora che, per
t sucientemente grande, basta porre m 9
1+

per dimostrare lenunciato.


Infatti, se m 9
1+

abbiamo, assumendo che t sia sucientemente grande


da far s` che t > m, che t 9
t+m
m
e quindi t| 9
t
m
|, dal che il teorema
deriva immediatamente. 2
Come detto in precedenza, la dimostrazione si pu`o facilmente estendere al caso
di macchine di Turing multinastro (basta considerare codiche compresse del
contenuto di tutti i nastri). Si osservi per`o che una macchina di Turing con
k > 1 nastri pu`o essere simulata da una macchina di Turing avente anches-
sa k nastri, in quanto non `e necessario un nastro aggiuntivo per eseguire le
operazioni della fase 1 della simulazione.
Essenzialmente, il Teorema 8.2, cos` come il Teorema 8.1, ci esprimono
un concetto del tutto naturale, e cio`e che, aumentando opportunamente la
capacit`a della singola cella di memoria e quindi, in sostanza, la potenza di
calcolo delle operazioni elementari denite nel modello, `e possibile rendere pi` u
eciente (in termini di operazioni elementari eseguite o di celle di memoria
utilizzate) un algoritmo denito su tale modello.
Esercizio 8.2 Dato = 0, 1 e m = 3, determinare la struttura di una macchina di
Turing / a due nastri che eettui le operazioni denite per la fase 1 nella dimostra-
zione del Teorema 8.2. Si richiede cio`e che / legga un stringa w

dal primo
nastro T
0
e restituisca su un nastro T
1
, in un totale di [ w [ +1 passi, una stringa
compressa corrispondente, denita sullalfabeto

= a, b, c, d, e, f, g, h. Si assuma
la codica che pone a in corrispondenza a 000, b a 001, . . ., h a 111.
8.5. CLASSI DI COMPLESSIT
`
A 293
8.5 Classi di complessit`a
Come visto nella sezione precedente, i teoremi di compressione ed accele-
razione permettono di derivare immediatamente che tutte le classi di com-
plessit`a denite rispetto a funzioni asintoticamente equivalenti (a meno di
costanti moltiplicative), sono in realt`a equivalenti. Pi` u precisamente, come
conseguenza del Teorema 8.1 si ha che DSPACE(s(n)) = DSPACE(s

(n))
ed NSPACE(s(n)) = NSPACE(s

(n)) per ogni s

(n) = O(s(n)). Inol-


tre, come conseguenza del Teorema 8.2 abbiamo che, se t(n) = (n), allora
DTIME(t(n)) = DTIME(t

(n)) ed NTIME(t(n)) = NTIME(t

(n)) per ogni


t

(n) = O(t(n)).
Si noti che, in molti casi, non siamo interessati a caratterizzare la comples-
sit`a di un problema in modo molto preciso, introducendo cio`e, ad esempio, per
quale funzione t(n) esso appartenga alla classe DTIME(t(n)); in generale, `e
invece suciente disporre di una classicazione pi` u grossolana, stabilendo ad
esempio se il problema `e risolubile in tempo polinomiale o esponenziale. A
tale scopo deniamo le seguenti classi di complessit`a:
1. la classe dei linguaggi decidibili da una macchina di Turing deterministi-
ca in tempo proporzionale ad un polinomio nella dimensione dellinput:
P =

k=0
DTIME(n
k
);
2. la classe dei linguaggi decidibili da una macchina di Turing deterministi-
ca in spazio proporzionale ad un polinomio nella dimensione dellinput:
PSPACE =

k=0
DSPACE(n
k
);
3. la classe dei linguaggi decidibili da una macchina di Turing determini-
stica in spazio proporzionale al logaritmo nella dimensione dellinput:
LOGSPACE = DSPACE(log n);
4. la classe dei linguaggi decidibili da una macchina di Turing determi-
nistica in spazio proporzionale ad un esponenziale nella dimensione
dellinput: EXPTIME =

k=0
DTIME(2
n
k
);
5. la classe dei linguaggi accettabili da una macchina di Turing non de-
terministica in tempo proporzionale ad un polinomio nella dimensione
dellinput: NP =

k=0
NTIME(n
k
);
6. la classe dei linguaggi accettabili da una macchina di Turing non de-
terministica in spazio proporzionale ad un polinomio nella dimensione
dellinput: NPSPACE =

k=0
NSPACE(n
k
);
7. la classe dei linguaggi accettabili da una macchina di Turing non deter-
ministica in tempo proporzionale ad un esponenziale nella dimensione
dellinput: NEXPTIME =

k=0
NTIME(2
n
k
);
294 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Si noti che tale classicazione permette di individuare molte propriet`a della
complessit`a di problemi che non varrebbero per classi pi` u ranate. Ad esem-
pio, una importante varit`a, che corrisponde alla variante di Tesi di Church
introdotta allinizio del capitolo, un problema si trova in P o in EXPTIME
indipendentemente dal modello di calcolo considerato.
8.6 Teoremi di gerarchia
In molti casi non `e dicile individuare relazioni di contenimento (non stretto)
tra due classi di complessit`a: ad esempio, vedremo nella successiva Sezione 8.7
che DTIME(t(n)) NTIME(t(n)) e DSPACE(t(n)) NSPACE(t(n)), dal
che deriva, ad esempio, che P NP e PSPACE NPSPACE. Molto pi` u
complicato risulta, in generale, mostrare che tali relazioni sono di contenimento
stretto: date due classi di complessit`a (
1
, (
2
tali che (
1
(
2
, al ne di separare
(
1
da (
2
(e quindi mostrare che in eetti (
1
(
2
) `e necessario mostrare
lesistenza di un linguaggio L (
2
(
1
.
Mentre, nei singoli casi, `e necessario individuare tale linguaggio con mo-
dalit`a ad hoc, il metodo pi` u generale per eettuare la separazione di due
classi di complessit`a (
1
e (
2
consiste nellindividuare un linguaggio L (
2
(
1
mediante una opportuna applicazione della tecnica di diagonalizzazione, che `e
stata precedentemente introdotta per individuare problemi indecidibili.
In questa sezione, mostriamo come lapplicazione della tecnica di diagona-
lizzazione dia luogo a due classici teoremi, detti di gerarchia, che consentono,
rispettivamente, la separazione di classi di complessit`a temporale e spaziale.
Tali teoremi si applicano a classi di complessit`a denite su funzioni aventi
particolari propriet`a di costruttivit`a per mezzo di macchine di Turing.
Denizione 8.12 Una funzione non decrescente s : IN IN `e detta space
constructible se esiste una macchina di Turing / che, per ogni n, utilizza
esattamente s(n) celle per ogni istanza di lunghezza n.
In modo equivalente, possiamo anche dire che una funzione s(n) `e space con-
structible se esiste una macchina di Turing che per ogni n marca, ad esempio
scrivendoci dentro un determinato simbolo predenito, esattamente s(n) celle
di nastro, senza utilizzarne altre.
Denizione 8.13 Una funzione non decrescente t : IN IN `e detta time
constructible se esiste una macchina di Turing / che, per ogni n, si ferma
dopo avere eseguito esattamente t(n) passi su ogni istanza di lunghezza n.
Anche in questo caso, pi` u informalmente, possiamo dire che una funzione t(n)
`e time constructible se esiste una macchina di Turing che, per ogni n, conta
esattamente no a t(n), in quanto entra in un certo stato (il suo stato nale)
dopo esattamente t(n) passi di computazione.
8.6. TEOREMI DI GERARCHIA 295
`
E facile rendersi conto che praticamente tutte le funzioni pi` u familiari, e che
crescono sucientemente, sono sia space che time constructible. Ad esempio,
godono di tali propriet`a le funzioni n
k
, k
n
, n!, ed `e inoltre noto che se f, g
sono funzioni space o time constructible cos` sono le funzioni f +g, fg, f
g
.
Esercizio 8.3 Dimostrare che la funzione f(n) = n
k
`e sia space che time constructible
per ogni k 1.
Al tempo stesso, non sono space constructible funzioni s(n) = o(log n),
mentre non sono time constructible funzioni s(n) = o(n).
`
E possibile inoltre
mostrare con tecniche opportune, che non si ritiene per`o opportuno intro-
durre in questa trattazione, lesistenza di ulteriori funzioni non space o time
constructible.
Prima di presentare i due teoremi di gerarchia, introduciamo ora alcuni
lemmi utili. Nel seguente lemma, mostriamo una propriet`a che sar`a utilizzata
nella dimostrazione del teorema di gerarchia rispetto alla complessit`a di spazio.
Tale propriet`a ci dice che, se s(n) `e una funzione che cresce sucientemente,
allora ogni linguaggio accettato in spazio s(n) pu`o anche essere accettato nello
stesso spazio. In altre parole, essa ci permetter`a nel seguito di assumere che,
sotto opportune ipotesi, le macchine di Turing considerate terminino sempre
la loro esecuzione. Il lemma fa riferimento a macchine di Turing ad 1 nastro,
ma `e facile estenderlo al caso di macchine di Turing multinastro.
Lemma 8.3 Data una funzione space constructible s(n) > log(n+1) per ogni
n, sia / una macchina di Turing che usa al pi` u s(n) celle di nastro su input di
lunghezza n. Esiste allora una macchina di Turing /

a 2 nastri che accetta


lo stesso linguaggio di / in spazio s(n), e che si ferma su ogni input.
Dimostrazione. Il numero di congurazioni possibili per una macchina di
Turing operante su input di lunghezza n (che assumiamo contenuto su un
nastro di input di sola lettura) e vincolata su s(n) celle di nastro di lavoro `e
pari a (n + 1)s(n) [ Q[[

[
s(n)
, dove `e lalfabeto di nastro utilizzato e Q `e
linsieme degli stati della macchina: infatti, la testina sul nastro di input pu`o
trovarsi su n + 1 posizioni, la testina sul nastro di lavoro su s(n) posizioni, il
numero di possibili stati `e [ Q[ ed il numero di possibili contenuti diversi delle
s(n) celle del nastro di lavoro `e [

[
s(n)
.
La macchina di Turing /

utilizza sul nastro aggiuntivo T

un alfabeto

tale che [

[
s(n)
> (n + 1)s(n) [ Q[[

[
s(n)
per ogni n > 0: la condizione
s(n) > log(n + 1) garantisce che la scelta [

[>[

[ + [ Q[ +2 rende vericata
tale condizione. /

opera nel modo seguente: dapprima marca


3
s(n) celle
3
Loperazione di marcatura pu`o essere eettuata considerando il nastro T

come un nastro
a due tracce, ed utilizzando la seconda traccia (con alfabeto {1, b}) per rappresentare la
presenza o meno della marca: ci`o comporta (vedi Sezione 5.4.3) che lalfabeto del nastro
T

, per permettere di simulare la presenza di due tracce, dovr` a avere in eetti dimensione
almeno pari a 2((n + 1)s(n) | Q||

|
s(n)
).
296 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
sul nastro aggiuntivo T

(pu`o far ci`o in quanto s(n) `e space constructible),


poi simula / sugli altri nastri. Durante la simulazione, essa conta inoltre il
numero di passi eseguiti, esprimendo tale numero sulle celle marcate del nastro
nastro T

in base [

[.
Si osservi che il pi` u grande numero in base [

[ rappresentabile nelle s(n)


celle marcate sul nastro T

`e pari a [

[
s(n)
1, che viene raggiunto quando
/

ha simulato un numero di passi di / maggiore del numero di possibili


congurazioni di tale macchina.
In tale eventualit`a, per il Pigeonhole Principle, / ha certamente attra-
versato (almeno) due volte una stessa congurazione, e quindi `e entrata in un
ciclo innito.
In denitiva, se /

, dopo avere simulato [

[
s(n)
passi di /, non ha
raggiunto una congurazione terminante per tale macchina, allora essa si pu`o
comunque fermare in uno stato di non accettazione per la stringa in input, in
quanto per quella stessa stringa / entra in una computazione innita. 2
Il lemma seguente, di cui forniamo il solo enunciato, verr`a utilizzato nella
dimostrazione del teorema di gerarchia relativo alla complessit`a di tempo.
Lemma 8.4 Sia / una macchina di Turing a k > 2 nastri con alfabeti di
nastro
1
, . . . ,
k
, che accetta un linguaggio L(/) in tempo t(n). Esiste allora
una macchina di Turing /

a due nastri con alfabeto di nastro 0, 1, che


accetta L(/

) = L(/) in tempo t(n) log t(n).


Passiamo ora ad introdurre il teorema di gerarchia spaziale, che denisce le
condizioni che fanno s` che due classi di complessit`a spaziale dieriscano.
Teorema 8.5 (Teorema di gerarchia spaziale) Siano date due funzioni
s
1
, s
2
: IN IN tali che:
- s
2
(n) > log(n + 1) per ogni n
- s
1
(n) = o(s
2
(n))
- s
2
(n) `e space constructible.
Allora esiste un linguaggio L separatore delle due classi di complessit`a
DSPACE(s
1
(n)) e DSPACE(s
2
(n)), tale cio`e da avere L DSPACE(s
2
(n))
e L , DSPACE(s
1
(n)).
Dimostrazione. Consideriamo uno schema di codica di tutte le macchine
di Turing ad un nastro e con alfabeto di nastro 0, 1 mediante lalfabeto
= 0, 1 (vedi Sezione 7.2.2). Tale codica, dato lindice x di una macchina
di Turing /
x
, associa a tale macchina di Turing tutte le stringhe del tipo
O
i
1x, con i 0.
Si osservi quindi che, tutte le innite stringhe del tipo stringa 0
i
1x con
x 0, 1
+
e i 0 descrivono, se x `e la codica di una macchina di Turing,
8.6. TEOREMI DI GERARCHIA 297
una stessa macchina di Turing /
x
.
4
A partire dalla sequenza di tutte le mac-
chine di Turing ad un nastro e con = 0, 1, ordinate in base alla relativa
codica, possiamo costruire ora, mediante diagonalizzazione, una nuova mac-
china di Turing /a 2 nastri (con alfabeto di nastro 0, 1), avente la seguente
propriet`a: per ogni stringa y = 0
i
1x, con x 0, 1
+
e i 0, che codica una
macchina di Turing /
x
, / accetta y se e solo se /
x
:
1. usa spazio al pi` u s
2
([ y [);
2. riuta y.
Data una stringa di input y, / dapprima verica, in spazio costante, che
y = 0
i
1x per qualche i 0 e che x sia la codica di una macchina di Turing:
in caso contrario riuta y.
Altrimenti, / marca esattamente s
2
([ y [) celle sui nastri T
1
, T
2
, T
3
(pu`o
fare ci`o in quanto la funzione s
2
(n) `e space constructible) e copia la codica
x sul nastro T
1
. Le celle marcate saranno le sole che / utilizzer`a nel seguito
sui tre nastri: quindi, se [ x[> s
2
([ y [) la macchina di Turing / riuta y.
Successivamente, / simula la computazione eseguita da /
x
su input y,
utilizzando la descrizione di /
x
sul nastro T
1
e rappresentando inoltre:
- su T
2
il contenuto del nastro di /
x
;
- su T
3
lo stato attuale di /
x
.
La macchina di Turing / si ferma riutando y non appena la simulazione la
porta ad uscire dallinsieme di celle marcate. Se la simulazione al contrario
termina (allinterno quindi delle zone di nastro marcate), in quanto la compu-
tazione eseguita da /
x
su input y termina, allora / accetta y se e solo se
/
x
riuta y.
Sia L(/) il linguaggio accettato da /: chiaramente, per denizione,
L(/) DSPACE(s
2
(n)).
Mostriamo ora che L(/) , DSPACE(s
1
(n)). Si assuma il contrario, e
sia allora /
t
una macchina di Turing ad un nastro e con alfabeto 0, 1 che
accetta L(/) in spazio s
1
(n).
Si osservi che, per il Lemma 8.3, possiamo assumere che /
t
si fermi su
qualunque input (altrimenti potremmo considerare la macchina di Turing equi-
valente costruita nella dimostrazione del Lemma stesso). Inoltre, dato che
s
1
(n) = o(s
2
(n)) per ipotesi, esiste un intero n tale che s
1
(n) < s
2
(n) per
n > n.
Consideriamo ora il comportamento di / ed /
t
su un input z = 0
i
1t
avente i sucientemente grande da far s` che siano vericate le tre condizioni
seguenti:
- log([ Q
t
[) s
2
([ z [);
4
Si ricorda che non tutte le stringhe in {0, 1}
+
sono delle codiche di macchine di Turing.
298 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
- [ t [ s
2
([ z [);
- s
1
([ z [) s
2
([ z [).
Dalle tre condizioni deriva che / ha suciente spazio da poter rappre-
sentare sia la codica della macchina di Turing /
t
da simulare che, ad ogni
istante, il suo stato attuale che, inne, il contenuto, ad ogni istante, del nastro
di /
t
.
Possiamo allora osservare che, se /
t
accetta z (in spazio al pi` u s
1
([ z [), per
ipotesi) allora / termina la sua simulazione (in quanto anche /
t
termina)
senza uscire dallinsieme delle celle marcate, per cui / riuta z. Se invece
/
t
riuta z (ancora, in spazio al pi` u s
1
([ z [)), nuovamente / termina la
sua simulazione senza uscire dallinsieme delle celle marcate, in questo caso
accettando z.
In denitiva, abbiamo che z viene accettata da /se e solo se viene riutata
dalla macchina di Turing /
t
da essa codicata, per cui L(/) ,= L(/
t
),
contrariamente allipotesi posta. 2
Il teorema seguente denisce le stesse condizioni per classi di complessit`a
temporale.
Teorema 8.6 (Teorema di gerarchia temporale) Siano t
1
, t
2
: IN IN
due funzioni qualunque tali che:
- t
2
(n) > n per ogni n
- t
2
(n) = (t
1
(n) log(t
1
(n)))
- t
2
(n) `e time constructible.
Esiste allora un linguaggio L avente le propriet`a che L DTIME(t
2
(n)) e
L , DTIME(t
1
(n)).
Dimostrazione. La dimostrazione `e simile alla precedente: si considera in
questo caso una codica di macchine di Turing a due nastro con alfabeto 0, 1
simile a quella introdotta nella dimostrazione del Teorema 8.5. Si ricorda che,
in questo caso, una macchina di Turing la cui codica `e rappresentata dalla
stringa x `e rappresentata da tutte le innite stringhe 0
i
1x, con i 0.
Consideriamo una macchina di Turing /, che opera su 5 nastri nel modo
seguente: dato un input z 0, 1
+
, / verica, in tempo [ z [, che z abbia la
forma 0
i
1x e che x sia la codica di una macchina di Turing a due nastri: se
cos` non `e / riuta la stringa z. Nel caso aermativo, detta /
x
la macchina
di Turing a 2 nastri codicata, / copia (in tempo O([ z [)) la codica x sul
nastro T
1
e lintera stringa z sul nastro T
5
.
Indichiamo con / la macchina di Turing associata alla denizione di fun-
zione time constructible (vedi Denizione 8.13) che, ricevuto un input di lun-
ghezza n, esegue esattamente t
2
(n) passi: tale macchina esiste sicuramente, in
quanto t
2
(n) `e time constructible.
8.6. TEOREMI DI GERARCHIA 299
La macchina di Turing / simula /
x
utilizzando il nastro T
2
per rappre-
sentarne lo stato attuale ed i nastri T
3
, T
4
per rappresentare il contenuto dei
due nastri di /
x
. La simulazione viene eettuata eseguendo una serie di passi
nellambito di ognuno dei quali:
1. simula un passo di computazione di /
x
. A tal ne esamina in tempo
log([ Q
x
[), dove Q
x
`e linsieme degli stati di /
x
, il contenuto del nastro
T
2
per determinare lo stato attuale di /
x
. Mediante una scansione
in tempo O([ x [) del contenuto del nastro T
1
viene quindi determinata
lapplicazione della funzione di transizione di /
x
, e lo stato attuale viene
aggiornato in tempo log([ Q
x
[);
2. simula, in tempo costante, un passo di computazione di /.
Dato che [ x[ e [ Q
x
[ sono costanti rispetto a [ z [, ne consegue che la simulazione
di ogni passo di /
x
viene eseguita in tempo costante.
La macchina di Turing /si ferma dopo avere simulato esattamente t
2
([ z [)
passi di /
x
, e quindi dopo avere eseguito O([ z [) + (t
2
([ z [)) = (t
2
([ z [))
passi, accettando la stringa in input se e solo se la stringa non viene accettata
da /
x
nei t
2
([ x[) passi simulati.
Chiaramente L(/) DTIME(t
2
(n)). Come sopra, mostriamo che
L(/) , DTIME(t
1
(n)) per contraddizione, assumendo che esista una qual-
che macchina di Turing a k nastri che accetta L(/) in tempo t
1
(n). Per il
Lemma 8.4, esiste allora una macchina di Turing /
t
a 2 nastri che accetta
L(/) in tempo t
1
(n) log t
1
(n).
Consideriamo, come nella dimostrazione del teorema precedente, un input
z = 0
i
1t avente i sucientemente grande da far s` che sia vericata la condi-
zione t
1
([ z [) log t
1
([ z [) t
2
([ z [). Abbiamo allora che se /
t
accetta z (in
tempo t
1
([ z [) log t
1
([ z [)), allora /, simulando t
1
([ z [) log t
1
([ z [) t
2
([ z [)
passi di /
t
(in tempo (t
2
([ z [)), riuta z. Le stesse considerazioni possono
essere eettuate nel caso in cui /
t
non accetti z (in tempo t
1
([ t [) log t
1
([ z [),
mostrando quindi che L(/) ,= L(/
t
). 2
Il nome utilizzato per i due teoremi precedenti deriva dal fatto che ta-
li teoremi ci permettono di stabilire gerarchie di classi di complessit`a (ri-
spettivamente spaziali e temporali) propriamente contenute le une nelle
altre.
Dal Teorema 8.5 e dal Teorema 8.6 derivano infatti, ad esempio, i seguenti
corollari.
Corollario 8.7 LOGSPACE PSPACE.
Corollario 8.8 P EXPTIME.
Come visto, i teoremi di gerarchia ci dicono essenzialmente che, se consi-
deriamo le classi di complessit`a denite da funzioni sucientemente diverse
300 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
in termini di rapidit`a di crescita asintotica, allora tali classi sono diverse, nel
senso che linsieme dei linguaggi associati alle due classi `e diverso. Al contra-
rio, nel caso di funzioni generali (non space o time constructible) `e possibile
dimostrare che esistono casi patologici, in cui esistono coppie di funzioni so-
stanzialmente diverse a cui corrispondono classi di complessit`a identiche. Tale
fenomeno `e illustrato dal seguente teorema, che forniamo senza dimostrazione.
Teorema 8.9 (Gap theorem) Sia data una qualunque funzione calcolabile
t(n) > n, esiste allora una funzione calcolabile T(n) tale che DTIME(t(n)) =
DTIME(T(t(n))).
Uno stesso risultato `e valido nel caso della complessit`a spaziale.
Ad esempio, se si considera T(n) = 2
n
, il teorema precedente ci dice che
esiste una funzione t(n), evidentemente non costructible, tale che non esi-
ste nessun problema con complessit`a temporale compresa tra DTIME(t(n))
e DTIME(2
t(n)
), vale a dire che esiste un intervallo (gap) di complessit`a
esponenziale allinterno del quale non cade nessun problema.
8.7 Relazioni tra misure diverse
In questa sezione introduciamo alcuni risultati generali che correlano classi di
complessit`a denite rispetto a misure diverse.
Teorema 8.10 Per ogni funzione f : ININ valgono le due propriet`a:
- DTIME(f(n))NTIME(f(n));
- DSPACE(f(n))NSPACE(f(n)).
Dimostrazione. Deriva semplicemente dallosservazione che ogni macchina
di Turing deterministica `e un caso particolare di macchina di Turing non
deterministica. 2
Dal teorema precedente derivano immediatamente i seguenti corollari.
Corollario 8.11 P NP.
Corollario 8.12 PSPACE NPSPACE.
Teorema 8.13 Per ogni funzione f : ININ valgono le due propriet`a:
- DTIME(f(n))DSPACE(f(n));
- NTIME(f(n))NSPACE(f(n)).
Dimostrazione.
`
E suciente notare che in t passi di computazione si
possono utilizzare al pi` u t celle di nastro distinte. 2
8.7. RELAZIONI TRA MISURE DIVERSE 301
I seguenti corollari derivano in modo immediato.
Corollario 8.14 P PSPACE.
Corollario 8.15 NP NPSPACE.
Teorema 8.16 Per ogni coppia di funzioni f, g : ININ, per le quali si ha che
g(n) = O(f(n)), valgono le due propriet`a:
- DSPACE(g(n))DSPACE(f(n));
- NSPACE(g(n)) NSPACE(f(n)).
Dimostrazione. Ricordiamo che, in conseguenza del fatto che g(n) =
O(f(n)), esiste una costante c tale che g(n) cf(n) per n sucientemen-
te grande. Quindi DSPACE(g(n))DSPACE(cf(n)) e NSPACE(g(n))
NSPACE(cf(n)). Lenunciato deriva dallosservazione che, per il Teorema
8.1, si ha che DSPACE(cf(n))= DSPACE(f(n)) e che NSPACE(cf(n)) =
NSPACE(f(n)). 2
Teorema 8.17 Per ogni coppia di funzioni f, g : IN IN, tali che g(n) =
O(f(n)) e f(n) = (n), DTIME(g(n)) DTIME(f(n)) e NTIME(g(n))
NTIME(f(n)).
Dimostrazione. La dimostrazione `e lasciata per esercizio. 2
Esercizio 8.4 Dimostrare il Teorema 8.17.
Teorema 8.18 Per ogni funzione space constructible f : IN IN, tale che
f(n) = (log n), NSPACE(f(n)) DTIME(2
f(n)
).
Dimostrazione. Data una macchina di Turing non deterministica / che
usa spazio f(n), deriviamo una macchina di Turing deterministica /

che
accetta lo stesso linguaggio di / in tempo O(2
f(n)
).
Assumiamo, senza perdere in generalit`a, che ogni volta che / accetta
un input, essa cancelli tutti i simboli dal nastro e posizioni la testina sulla
prima cella del nastro stesso: in tal modo, la macchina / cos` modicata
accetta lo stesso linguaggio ed ha una sola congurazione di accettazione c
a
.
Assumiamo inoltre che / si fermi su ogni input: se cos` non fosse, sarebbe
possibile applicare il Lemma 8.3 per ottenere una macchina di Turing con tale
propriet`a ed equivalente ad /.
Dato un input x di lunghezza n, /

genera linsieme di tutte le con-


gurazioni di / che occupano al pi` u f(n) celle di nastro. Si osservi che tale
insieme di O(2
f(n)
) elementi diversi pu`o essere generato utilizzando etichette
di lunghezza f(n), che /

pu`o generare in quanto f `e space constructible.


Consideriamo ora il grafo orientato G = (C, A) denito nel modo seguente:
302 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
- C `e linsieme delle possibili congurazioni di / che occupano al pi` u
f(n) celle di nastro in computazioni eseguite su input x;
- lunica congurazione accettante c
a
`e la radice di G;
- per ogni coppia di congurazioni c

, c

C, esiste un arco c

, c

) A
se e solo se / pu`o passare da c

a c

su un cammino di computazione a
partire da input x.
Il grafo G ha O(2
f(n)
) nodi e O(2
f(n)
) archi (in quanto da ogni congurazione
si possono eseguire un numero costante di transizioni diverse).
A questo punto, /

pu`o vericare se / raggiunge la congurazione accet-


tante c
a
a partire dalla congurazione iniziale c
i
con input x attraversando il
grafo G per mezzo ad esempio di una visita in profondit`a, che richiede tempo
lineare nella dimensione del grafo. Si osservi che la visita pu`o essere eettua-
ta anche senza avere a disposizione una rappresentazione esplicita del grafo,
vericando la presenza di un arco (u, v) mediante lapplicazione della funzione
di transizione di / tra le congurazioni corrispondenti ad u e v.
Da ci`o deriva che in tempo O(2
f(n)
) /

verica se esiste una computazione


accettante di / su input x. 2
Teorema 8.19 Sia f : IN IN una funzione time constructible, vale allora
la propriet` a NTIME(f(n)) DSPACE(f(n)).
Dimostrazione. Data una macchina di Turing non deterministica / che
usa tempo f(n), deriviamo una macchina di Turing deterministica /

che
accetta lo stesso linguaggio di / in spazio O(f(n)) nel modo seguente.
Per ogni input x di lunghezza n, utilizzando il fatto che f `e time con-
structible, /

simula t(n) passi di tutti i possibili cammini di computazione


a partire dalla congurazione iniziale su input x. Linput viene accettato se
uno dei cammini porta ad una congurazione di accettazione per /.
Per ogni cammino di computazione di /, di lunghezza f(n), /

utiliz-
zer`a necessariamente spazio O(f(n)). Lenunciato segue osservando che lo
stesso spazio pu`o essere utilizzato da /

per simulare tutti i cammini di


computazione di /. 2
Dal teorema precedente deriva il seguente corollario.
Corollario 8.20 NP PSPACE.
Teorema 8.21 Per ogni funzione space constructible f : IN IN, tale che
f(n) = (log n), DSPACE(f(n)) DTIME(2
f(n)
).
Dimostrazione. La dimostrazione `e lasciata per esercizio. 2
8.7. RELAZIONI TRA MISURE DIVERSE 303
Esercizio 8.5 Dimostrare il Teorema 8.21.
Dal teorema precedente derivano i seguenti corollari.
Corollario 8.22 LOGSPACE P.
Corollario 8.23 PSPACE EXPTIME.
Teorema 8.24 Sia f : IN IN una funzione time constructible, allora vale
la propriet` a NTIME(f(n)) DTIME(2
f(n)
).
Dimostrazione. Il risultato deriva immediatamente come corollario del Teo-
rema 5.2, osservando che d
k
= (2
k
) per ogni costante d. Dallesame della
dimostrazione del Teorema 5.2 si pu`o osservare anche che la funzione f(n) deve
essere time constructible, in quanto `e necessario contare no ad f(n) durante
la fase di generazione delle stringhe rappresentanti cammini di computazione.
5
2
Dal teorema precedente deriva il corollario seguente.
Corollario 8.25 NP EXPTIME.
Il Teorema 8.24 mostra come, se si considera il tempo di computazione, il
passaggio da modello non deterministico a modello deterministico comporta
un aumento al pi` u esponenziale del costo di esecuzione di un algoritmo. Come
gi`a osservato quando `e stato dimostrato il Teorema 5.2, nessuna simulazione
in tempo sub esponenziale di una macchina di Turing non deterministica me-
diante macchine di Turing deterministiche `e stata individuata no ad oggi, e si
congettura che in eetti il passaggio da modello non deterministico a modello
deterministico richieda necessariamente un aumento esponenziale del tempo
di computazione.
Il teorema seguente mostra invece come, a dierenza che per il tempo di
computazione, nel caso dello spazio lipotesi di utilizzare un modello determi-
nistico comporta un maggior costo limitato (dellordine del quadrato) rispetto
al caso non deterministico.
Teorema 8.26 (Teorema di Savitch) Sia data f : IN IN una funzione
space constructible tale che per ogni n f(n) log n, allora NSPACE(f(n))
DSPACE((f(n))
2
).
Dimostrazione. Per dimostrare questo Teorema, mostriamo prima un ri-
sultato intermedio relativo al problema Raggiungibilit` a, denito nel modo
seguente.
5
Una dimostrazione alternativa di questo teorema si pu`o ottenere immediatamente dai
Teoremi 8.13 e 8.18.
304 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Raggiungibilit` a
Istanza: Un grafo orientato G = (V, E), una coppia di nodi s, t V .
Predicato: Esiste un cammino orientato da s a t in G?
In particolare, mostreremo che Raggiungibilit` a pu`o essere risolto in spazio
O(log
2
n).
Si osservi che la soluzione pi` u semplice al problema, basata su una visita in
profondit`a di G a partire da s, richiede di memorizzare ogni nodo attraversato
durante la ricerca, risultando in spazio (n).
Una soluzione pi` u eciente, dal punto di vista dello spazio utilizzato, deriva
dalla seguente osservazione. Se noi consideriamo il predicato C(u, v, 2
k
), con
u, v V e k log
2
n| intero, denito come vero se e solo se esiste un cammino
da u a v in G di lunghezza al pi` u 2
k
, allora:
- la soluzione di Raggiungibilit` a `e data da C(s, t, 2
log
2
n
);
- C(u, v, 2
0
) `e facilmente valutabile, in quanto `e vero se e solo se esiste
un arco u, v) in G;
- Dato che ogni cammino di lunghezza 2
k
pu`o essere decomposto in due
cammini concatenati di lunghezza 2
k1
, C(u, v, 2
k
) (per k > 0) `e vero
se e solo se esiste un nodo w V tale che siano veri C(u, w, 2
k1
) e
C(w, v, 2
k1
).
Ci`o fornisce il seguente semplice algoritmo ricorsivo per eettuare la valutazio-
ne di C(u, v, 2
k
). Dal punto di vista dello spazio utilizzato dallAlgoritmo 8.1
input u, v: nodi, k intero;
output boolean;
begin
if k = 0
then if u, v) E then return true
else
begin
for each w V u, v do
if C(u, w, 2
k1
) and C(w, v, 2
k1
) then return true;
return false
end
end.
Algoritmo 8.1: Algoritmo ricorsivo per valutare la funzione C(u, v, 2
k
)
per valutare C(s, t, n) (e quindi per risolvere Raggiungibilit` a), possiamo
osservare che, in ogni istante, esso deve tenere conto di k log
2
n| coppie
8.8. RIDUCIBILIT
`
A TRA PROBLEMI DIVERSI 305
di nodi, u
1
, v
1
), . . . , u
k
, v
k
) con u
1
= s, v
1
= t, e u
i
= u
i1
o v
i
= v
i1
per i = 2, . . . , k, coppie corrispondenti ai cammini che esso sta ricorsivamen-
te considerando. Quindi, lAlgoritmo 8.1 deve rappresentare ad ogni istante
O(log n) nodi, ognuno dei quali necessita a sua volta, per la rappresentazione
della relativa etichetta di O(log n) spazio, per una complessit`a di spazio totale
O(log
2
n).
Lenunciato del Teorema segue quindi osservando che la costruzione nella
dimostrazione del Teorema 8.18 pu`o essere eettuata anche in questo caso.
Consideriamo infatti il grafo G = (C, A), denito in tale dimostrazione, delle
congurazioni di lunghezza al pi` u f(n) di una macchina di Turing non deter-
ministica / che accetta un linguaggio L(/ in spazio O(f(n)). Tale grafo
avr`a O(2
f(n)
) nodi e O(2
f(n)
) archi. Nuovamente, una macchina di Turing de-
terministica /

pu`o determinare se /accetta una stringa x determinando se,


a partire dalla congurazione iniziale, `e possibile raggiungere la congurazione
nale. Da quanto mostrato sopra, /

pu`o eettuare tale compito utilizzando


spazio O(log(2
f(n)
)) = O((f(n))
2
). 2
Dal Teorema di Savitch e dal Teorema 8.10 deriva il corollario seguente.
Corollario 8.27 NPSPACE = PSPACE.
Si osservi come il corollario precedente mostri una relazione di equivalenza
tra modello deterministico e modello non deterministico quando si consideri
computazioni a spazio limitato polinomialmente. Nel caso della complessit`a
temporale, un risultato di tale tipo non `e disponibile, ed anzi la caratterizza-
zione precisa della relazione esistente tra le due classi corrispondenti a quelle
considerate nel Corollario 8.27, vale a dire P ed NP, `e un importante problema
aperto.
A conclusione di questa sezione, in Figura 8.2 sono illustrate gracamen-
te le relazioni di contenimento (stretto o meno) individuate tra le classi di
complessit`a introdotte nella Sezione 8.5.
8.8 Riducibilit`a tra problemi diversi
In molti casi interessanti la complessit`a di soluzione di un problema non `e
nota in modo esatto ne sucientemente approssimato, in quanto il divario
tra upper e lower bound di complessit`a del problema stesso `e estremamente
ampio. Una tipica situazione di questo genere si presenta in molti problemi
di decisione di grande interesse pratico (come ad esempio Soddisfacibilit` a,
che sar`a introdotto nel seguito di questa sezione), per i quali il miglior lower
bound noto `e (nlog n) o (n
2
), mentre il pi` u eciente algoritmo noto per
la loro soluzione ha complessit`a O(c
n
) per qualche c > 1. In tali casi risulta di
interesse caratterizzare la complessit`a di un problema relativamente ad altri
306 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
LOGSPACE
PSPACE=NPSPACE
NP
P
EXPTIME

Figura 8.2 Relazioni tra le classi di complessit`a introdotte.


problemi e, in questo ambito, i concetti di riducibilit`a e di riduzione rappre-
sentano uno strumento di fondamentale importanza per individuare relazioni
tra le complessit`a di problemi diversi.
In generale, una riduzione da un problema T
1
ad un altro problema T
2
fornisce un metodo per risolvere T
1
assumendo di essere in grado di risolvere
T
2
e facendo uso di un algoritmo per T
2
. Se `e possibile far ci`o allora possia-
mo dedurre che risolvere T
2
`e almeno tanto dicile quanto risolvere T
1
(dato
che sappiamo risolvere questultimo nellipotesi di saper risolvere laltro), as-
sunto che applicare la riduzione comporti una computazione sucientemente
semplice.
Possiamo denire tipi diversi di riducibilit`a, sotto diverse ipotesi su come
la soluzione di T
2
possa essere utilizzata per risolvere T
1
.
Denizione 8.14 Un problema di decisione T
1
`e Karpriducibile (o riduci-
bile molti-a-uno) a un problema di decisione T
2
(T
1

m
T
2
) se e solo se esiste
un algoritmo 1 che trasforma ogni istanza x I
P
1
di T
1
in una istanza y I
P
2
di T
2
in modo tale che x Y
P
1
se e solo se y Y
P
2
. 1 `e detta Karpriduzione
da T
1
a T
2
.
Si noti che se esiste una riduzione 1 da T
1
a T
2
e se si conosce un algoritmo
/
2
per T
2
, allora si pu`o ottenere un algoritmo /
1
per T
1
nel modo seguente:
1. data una istanza x I
P
1
, si applica 1 a x e si ottiene y I
P
2
;
2. si applica /
2
a y: se /
2
restituisce vero allora si restituisce vero,
altrimenti (/
2
restituisce falso) si restituisce falso.
Inoltre, dato che t
A
1
([ x [) = t
R
([ x [) + t
A
2
([ y [), se abbiamo anche che
t
R
([ x[) = O(t
A
2
([ y [)) allora ne consegue t
A
1
([ x[) = (t
A
2
([ y [)). Inoltre, per
8.8. RIDUCIBILIT
`
A TRA PROBLEMI DIVERSI 307
quanto riguarda la complessit`a di soluzione dei problemi, la complessit`a di T
1
risulta essere un lower bound della complessit`a di T
2
(e, conseguentemente, la
complessit`a di T
2
`e un upper bound di quella di T
1
).
Un caso particolare di Karp-riducibilit`a, particolarmente rilevante in Teo-
ria della Complessit`a, `e rappresentato dalla Karp-riducibilit`a polinomiale. Di-
ciamo che T
1
`e polinomialmente Karpriducibile a T
2
(T
1

p
m
T
2
) se e solo se
T
1
`e Karpriducibile a T
2
e la riduzione relativa 1 `e un algoritmo calcolabile
in tempo polinomiale.
`
E importante osservare che, se T
1

p
m
T
2
, allora saper risolvere e-
cientemente (in tempo polinomiale) T
2
comporta che anche T
1
pu`o esse-
re risolto ecientemente. Cio`e, T
2
P T
1
P e, conseguentemente,
T
1
, P T
2
, P.
Esempio 8.8 Sia X =x
1
, x
2
, . . . ,x
n
un insieme di variabili booleane e sia T (X)=
x
1
, x
1
, x
2
, x
2
, . . . , x
n
, x
n
il corrispondente insieme di termini. Un assegnamento di
verit`a su X, f : X vero, falso soddisfa, per ogni variabile x
i
X, il termine
x
i
se f(x
i
) = vero e il termine x
i
se f(x
i
) = falso.
Chiamiamo clausola (disgiuntiva) un insieme di termini c = t
1
, t
2
, . . . , t
k

T(X). Una clausola `e soddisfatta da f se e solo se esiste (almeno) un termine t
i
c
soddisfatto da f.
Una formula in CNF (forma normale congiuntiva) `e denita come una collezione
di clausole T = c
1
, c
2
, . . . , c
m
. Una formula in CNF `e soddisfatta da f se e solo se
ogni clausola c
i
, i = 1, . . . , m, `e soddisfatta da f.
Il problema Soddisfacibilit` a `e denito nel modo seguente.
Soddisfacibilit` a
Istanza: Una formula CNF T su un insieme X di variabili booleane
Predicato: Esiste una assegnazione f : X vero, falso che soddisfa T?
Consideriamo inoltre il problema di decisione Programmazione Lineare 0 1
denito nel modo seguente.
Programmazione Lineare 0 1
Istanza: Insieme di variabili Z = z
1
, . . . , z
n
con dominio 0,1, insieme 1 di
disequazioni lineari su Z
Predicato: Esiste una soluzione a 1, cio`e una assegnazione di valori alle variabili
in Z che verica tutte le disequazioni?
Non `e dicile rendersi conto che:
Soddisfacibilit` a
p
m
Programmazione Lineare 0 1.
Infatti, ogni instanza x
SAT
= V, T di Soddisfacibilit` a pu`o essere ridotta ad una
istanza corrispondente x
LP
= Z, 1 di Programmazione Lineare 0 1 nel modo
seguente.
Sia t
j1
, t
j2
, . . . , t
jn
j
la j-ma clausola di T: da tale clausola possiamo derivare
una disequazione corrispondente
j
1
+
j
2
+ +
j
n
j
> 0 per x
LP
, dove
j
k
= z
j
k
se
308 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
t
j
k
= v
j
k
(per qualche v
j
k
V ) e
j
k
= (1 z
j
k
) altrimenti, cio`e se t
j
k
= v
j
k
(per
qualche v
j
k
V ).
`
E immediato vericare che ogni assegnazione di verit`a f : V vero, falso
soddisfa T se e solo se tutte le disequazioni in 1 sono vericate da una assegnazione
di valori f

: Z 0, 1 tale che f

(z
i
) = 1 se e solo se f(v
i
) = vero. Si noti che la
riduzione `e chiaramente calcolabile in tempo polinomiale.
Numerosi altri tipi di riducibilit`a tra problemi, non necessariamente di de-
cisione, possono essere introdotti: tra questi, risulta di particolare rilevanza
la Turingriducibilit`a, che essenzialmente modella la possibilit`a, nello scrivere
un programma per la soluzione di un problema, di usare un sottoprogramma
per risolvere problemi diversi, sottoprogramma che, al momento dellesecuzio-
ne, pu`o essere chiamato tutte le volte che sono necessarie. Tale situazione `e
modellata in Teoria della Complessit`a mediante il concetto di oracolo.
Denizione 8.15 Sia T il problema di calcolare una funzione f : 1
P
o
P
(eventualmente a pi` u valori). Un oracolo per T `e un dispositivo astratto che
per ogni x 1
P
restituisce una soluzione f(x) o
P
. Si assume che loracolo
calcoli e restituisca la soluzione in un solo passo di computazione.
Denizione 8.16 Sia T
1
il problema di calcolare una funzione g : 1
P
1
o
P
1
(eventualmente a pi` u valori). T
1
si dice Turingriducibile ad un problema T
2
(T
1

T
T
2
) se e solo se esiste un algoritmo 1 che risolve T
1
interrogando un
oracolo per T
2
. In tal caso, 1 `e detta Turingriduzione da T
1
a T
2
.
Come per la Karpriducibilit`a, possiamo denire una Turingriducibilit`a po-
linomiale
p
T
, assumendo che T
1

p
T
T
2
se e solo se T
1

T
T
2
e la
Turingriduzione 1 `e calcolabile in tempo (deterministico) polinomiale.
Si noti che la Karpriducibilit`a non `e altro che un caso particolare di
Turingriducibilit`a, corrispondente al caso in cui:
1. T
1
e T
2
sono entrambi problemi di decisione;
2. loracolo per T
2
viene interrogato una sola volta;
3. 1 restituisce lo stesso valore fornito dalloracolo.
In generale, la Karpriducibilit`a `e pi` u debole della Turingriducibilit`a. Ad
esempio, per ogni problema di decisione T, il problema complemento co-T `e
denito in modo tale che I
P
= I
co-P
e, per ogni x I
P
, x Y
co-P
se e solo se
x N
P
. Cio`e, co-T accetta tutte le istanze non accettate in T. Non `e dicile
vedere che T `e Turingriducibile a co-T (e viceversa), mentre ci`o non `e vero
per quanto riguarda la Karpriducibilit`a.
Esercizio 8.6 Mostrare che le relazioni di Karp riducibilit`a, Karp riducibilit`a polino-
miale, Turing riducibilt`a e Turing riducibilit`a polinomiale godono tutte della propriet`a
transitiva.
8.8. RIDUCIBILIT
`
A TRA PROBLEMI DIVERSI 309
Per nire, introduciamo alcune denizioni valide per ogni classe di
complessit`a e per ogni riducibilit`a.
Denizione 8.17 Per ogni classe di complessit`a (, un problema di decisione
T viene detto dicile in ( ((hard) rispetto ad una riducibilit`a
r
se e solo
se per ogni altro problema di decisione T
1
( si ha che T
1

r
T.
Denizione 8.18 Per ogni classe di complessit`a (, un problema di decisione
T viene detto completo in ( ((completo) rispetto ad una riducibilit`a
r
se
T `e (hard (rispetto a
r
) e T (.
Come conseguenza immediata delle denizioni precedenti, abbiamo che, dati
due problemi T
1
, T
2
, se T
1
`e (hard (rispetto a
r
) e T
1

r
T
2
, allora anche
T
2
`e (hard. Inoltre, se T
2
(, T
2
`e (completo.
Non `e dicile vericare che, per ogni coppia di classi di complessit`a (
1
, (
2
tali che (
1
(
2
e (
1
sia chiusa rispetto ad una riducibilit`a
r
, ogni problema
T (
2
completo appartiene a (
2
(
1
. Infatti, per ogni problema T
1
(
2
(
1
,
si ha che T
1

r
T per la completezza di T. Allora, per la chiusura di (
1
,
T (
1
comporterebbe che T
1
(
1
, e si otterrebbe una contraddizione.
Questa osservazione suggerisce che, date due classi di complessit`a (
1
e (
2
,
se (
1
(
2
, allora il miglior approccio per determinare se (
1
(
2
o se, al
contrario, (
1
(
2
`e quello di studiare la complessit`a dei problemi (
2
completi
(rispetto ad una riducibilit`a per la quale (
2
`e chiusa). Infatti, se per un qualche
problema T (
2
completo rispetto a tale riducibilit`a si riesce a mostrare che
T (
1
, allora, come conseguenza, si `e provato che (
1
(
2
; al contrario,
mostrare che T , (
1
implica banalmente che (
1
(
2
.
Denizione 8.19 Una classe di complessit`a ( `e detta chiusa rispetto ad una
riducibilit`a
r
se e solo se per ogni coppia di problemi T
1
, T
2
tali che T
1

r
T
2
,
T
2
( implica T
1
(.
La propriet`a di chiusura di una classe (rispetto ad una riducibilit`a) risulta di
rilevante importanza per derivare risultati di collasso di classi di complessit`a,
per mostrare cio`e che, per due classi (
1
(
2
, si ha (
1
= (
2
.
Lapproccio pi` u immediato per derivare tale risultato `e il seguente:
1. individuare una riducibilit`a
r
tale che (
1
`e chiusa rispetto a
r
;
2. identicare un problema T (
2
completo rispetto a
r
;
3. dimostrare che T (
1
.
Infatti, da ci`o deriva che per ogni T
1
(
2
si ha T
1

r
T (
1
, da cui consegue,
per la chiusura di (
1
, che T
1
(
1
.
Esercizio 8.7 Dimostrare che le classi P, NP, PSPACE, EXPTIME sono tutte
chiuse rispetto alla Karpriducibilit`a polinomiale.
346 CAPITOLO 8. TEORIA DELLA COMPLESSIT
`
A
Indice analitico
A-produzione, 130
-produzione, 38, 107, 123
eliminazione, 4854
-transizione, 64
Accettazione di linguaggi, 5862,
177
per pila vuota, 142, 145146,
154
per stato nale, 143, 145146,
154
Accumulatore, 225
Albero
di computazione, 65, 79
di derivazione, vedi Albero
sintattico
sintattico, 122, 134, 157159,
162
Alfabeto, 25
di input, 171, 176
di nastro, 170
non terminale, 36
terminale, 36
Algebra di Boole, 24
Algoritmo, 277
Algoritmo CYK, 164167
Analisi asintotica, 280
Analisi sintattica, 122, 154158
a discesa ricorsiva, 156
ascendente, 158
bottom up, vedi Analisi sintat-
tica ascendente
discendente, 157
top down, vedi Analisi sintatti-
ca discendente
ASF, vedi Automa a stati niti
ASFD, vedi Automa a stati niti
deterministico
ASFND, vedi Automa a stati niti
non deterministico
Assegnamento di verit`a, 307
Assioma, 37
Automa, 5962
a pila, 139155, 169
deterministico, 153155
non deterministico, 68, 129,
143148
a stati niti, 60, 68, 7192, 169
deterministico, 7177, 8392
minimizzazione, 115
minimo, 113
non deterministico, 7792
deterministico, 63
non deterministico, 63, 6566
pushdown, vedi Automa a pila
BNF, vedi Forma normale di
Backus
Calcolabilit`a, 223
Calcolabilit`a secondo Turing, 181
Cammino accettante, 82
Carattere
non terminale, 36
terminale, 36
Carattere blank, 170, 193
Cardinalit`a di un insieme, 13
transnita, 18
Cella di nastro , 170
Chiusura
dei linguaggi context free, 136
138
dei linguaggi regolari, 94102
347
348 INDICE ANALITICO
di un semigruppo, 23
transitiva, 9
transitiva e riessiva, 9
Chomsky, 36, 43, 121, 128, 223
Church, 251
Classe di complessit`a, 278, 287,
293294
EXPTIME, 293, 299, 303
LOGSPACE, 293, 299, 303
NEXPTIME, 293
NP, 293, 300303
NPSPACE, 293, 300, 301, 305
P, 287, 293, 299301, 303
PSPACE, 293, 299303, 305
chiusa, 309
Clausola, 307
CNF, vedi Forma normale di
Chomsky
Codominio di una funzione, 10
Collasso di classi, 309
Complementazione
di linguaggi, 27
di linguaggi context free, 138
di linguaggi context free deter-
ministici, 154
di linguaggi regolari, 96
Composizione di macchine di Tu-
ring, 203
Computazione, 59, 62, 224
di accettazione, 62
di riuto, 62
di un ASF, 71, 73, 74, 81
di un ASFND, 79
di un automa a pila, 140, 142,
143, 154
di una MT, 170, 173
di una MTND, 193
Concatenazione
di linguaggi, 27
di linguaggi context free, 137
di linguaggi regolari, 98, 103
Congurazione, 60, 63
di accettazione, 61
di MT, 171173
di MTM, 182
di riuto, 61
di un ASF, 73
accettante, 73
nale, 73
iniziale, 73
di un automa a pila, 142
nale, 173
iniziale, 60, 173
successiva, 61, 73, 142, 174
Congruenza, 24, 113
Contatore delle istruzioni, 225, 235
Controimmagine di una funzione,
10
Costo di esecuzione
di programma per RAM, 228
230
Costo di soluzione, 277
Costrutto, vedi Operatore
Decidibilit`a secondo Turing, 180
Derivabilit`a, 38
Derivazione, 38, 157
destra, 158
diretta, 38
sinistra, 157
Determinismo, 63
Diagonalizzazione, 16, 294
Diagramma degli stati
di un ASF, 72
Diagramma linearizzato di macchi-
na di Turing, 208
Diagramma sintattico, 58, 121
Dominio di denizione di una
funzione, 10
Dominio di una funzione, 10
Eliminazione dellambiguit`a, 159
Enumerazione di insiemi, 14
Equazione lineare destra, 104
eliminazione della ricursione,
104
sostituzione di variabili, 104
Equinumerosit`a di un insieme, 13
Equivalenza
INDICE ANALITICO 349
classi, 7
di linguaggi context free, 137
di linguaggi regolari, 112
relazione, 7
tra ASFD e ASFND, 83
tra grammatiche di tipo 3 e
ASF, 87
tra grannatiche di tipo 3 ed
espressioni regolari, 103
Espressione regolare, 29, 102110
Forma di frase, 38, 157
Forma normale
di Chomsky, 128129, 131, 138,
165
di Greibach, 129134, 147, 148
Forma normale congiuntiva, 307
Forma normale di Backus, 5558,
121, 225, 236
Formalismo di McCarthy, 224, 238,
248250
Funzione, 9
n-esimo numero primo, 242
base, 238, 242, 249
biiettiva, 11
calcolabile
con macchina a registri, 230,
233, 247
con macchina a registri ele-
mentare, 237
in un linguaggio imperativo,
235
secondo Turing, 228, 230,
233, 247
caratteristica, 18, 171
costante, 248
di Ackermann, 241
di misura, 284
di transizione, 6061
di un ASFD, 72, 77
di un ASFND, 78
di un automa a pila, 140, 154
di una MT, 170, 173
di una MTD, 170
di una MTND, 193
di transizione estesa
di un ASFD, 74
di un ASFND, 80
esponenziale, 240
fattoriale, 240
identit`a, 238
iniettiva, 11
parziale, 11
predecessore, 239
prodotto, 239
ricorsiva, 237250
parziale, vedi Funzione ricor-
siva
primitiva, 238242
ricorsiva primitiva, 247
somma, 239
space constructible, 294298
successore, 238
suriettiva, 11
T-calcolabile, 181
time constructible, 294299
totale, 11
Turing-calcolabile, 214
zero, 238
Godel, 238
Generatori di un semigruppo, 23
Generazione di linguaggi, 36
Gerarchia di Chomsky, 45, 113
GNF, vedi Forma normale di
Greibach
Grafo
di transizione, 111, 173
non orientato, 8
orientato, 8
Grafo di transizione, vedi Diagram-
ma degli stati, 78
Grafo orientato, 304
Grammatica, 36
ambigua, 159
contestuale, vedi Grammatica
di tipo 1
context free, vedi Grammatica
di tipo 2
350 INDICE ANALITICO
context sensitive, vedi Gram-
matica di tipo 1
di Chomsky, 36
di tipo 0, 215
di tipo 1, 219
formale, 36
lineare, 54
lineare destra, vedi Grammati-
ca di tipo 3
lineare sinistra, 44, 134
LL(k), 157
LR(k), 158
non contestuale, vedi Gramma-
tica di tipo 2
regolare, vedi Grammatica di
tipo 3
tipo 0, 41, 50
tipo 1, 42, 46, 50
tipo 2, 43, 45, 51
in forma normale, 128134
in forma ridotta, 123128
tipo 3, 44, 45, 53, 8392
Grammatiche equivalenti, 41
Greibach, 129
Gruppo, 22
abeliano, 22
quoziente, 25
Halting problem, vedi Problema
della terminazione
Immagine di una funzione, 10
Induzione matematica, 2
Insieme, 1
chiuso, 21
contabile, 13
continuo, 19
delle istanze, 281284
negative, 281
positive, 281
delle parti, 2
delle soluzioni, 282284
ammissibili, 283
innito, 13
non numerabile, 16
numerabile, 13
parzialmente ordinato, 7
vuoto, 2
Intersezione
di linguaggi, 27
di linguaggi context free, 136,
163
di linguaggi context free deter-
ministici, 155
di linguaggi regolari, 98
Istruzione, 225
aritmetica, 226, 235
di controllo, 226, 235
di I/O, 226
di salto, 226
di trasferimento, 226, 234
logica, 235
Iterazione
di linguaggi, 28
di linguaggi context free, 138
di linguaggi regolari, 100, 103
Kleene, 238, 251
Lambda-calcolo, 223
Lemma di Ogden, 135
Linguaggio, 26
accettabile
in spazio deterministico, 286
in spazio non deterministico,
286
in tempo deterministico, 286
in tempo non deterministico,
286
accettato
da ASFND, 81
da automa a pila per pila
vuota, 142
da automa a pila per stato
nale, 143
in spazio limitato, 286
in tempo limitato, 285
assembler, 226, 234
contestuale, vedi Linguaggio di
tipo 1
INDICE ANALITICO 351
context free, vedi Linguaggio di
tipo 2
innito, 139
vuoto, 138
context sensitive, vedi Lin-
guaggio di tipo 1
decidibile, 68
in spazio, 287
in tempo, 286
deciso, vedi Linguaggio ricono-
sciuto
delle macchine a registri, 225
227
di programmazione, 155
di tipo 0, 42, 68, 215219
di tipo 1, 42, 43, 68, 219222,
278
di tipo 2, 43, 68
deterministico, 154
di tipo 3, 44, 68
funzionale, 247250
generato, 38
imperativo, 224, 234235, 242
247, 249
indecidibile, 68
inerentemente ambiguo, 160
lineare, 54
LL(k), 157
LR(k), 158
non contestuale, vedi Linguag-
gio di tipo 2
regolare, vedi Linguaggio di
tipo 3, 77, 134
nito, 110
innito, 110
vuoto, 110
riconosciuto
da ASFD, 74, 77
in spazio limitato, 286
in tempo limitato, 285
semidecidibile, 68
separatore, 296
strettamente di tipo n, 45
T-decidibile, 180, 214
T-semidecidibile, 180
vuoto, 26, 40
LISP, 238, 248, 250
Lower bound, 277, 280, 305
Macchina a registri, 224237, 243,
249, 278, 288
elementare, 235237, 243247
Macchina di Turing, 68, 161, 169
219, 224, 230, 234, 235,
249, 277, 287305
a nastro semi-innito, 199
ad 1 nastro, 170179
ad alfabeto limitato, 201
descrizione linearizzata, 203
209
deterministica, 170192, 196
203
elementare, 206
multinastro, 181192, 278
multitraccia, 188189
non deterministica, 192198,
215219, 278
linear bounded, 68, 219222
universale, 210213
Markov, 223, 251
Matrice di transizione, vedi Tabella
di transizione
McCarthy, 224, 238, 248250
Memoria, 224
Minimizzazione
di ASF, 115
Modello
a costi logaritmici, 229, 234
a costi uniformi, 228, 234
Modello di calcolo, 277
imperativo, 224
Modello di von Neumann, 224
Monoide, 22
quoziente, 25
sintattico, 26
Mossa, vedi Passo computazionale
MREL, vedi Macchina a registri
elementare
MT, vedi Macchina di Turing
352 INDICE ANALITICO
Myhill, 113, 115
Nastro, 59, 170
Nerode, 113, 115
Non determinismo, 63, 6667, 143
grado, 64
Notazione asintotica, 32
Notazione lambda, 238
Ogden, 135
Operatore, 238
limitato, 242
di composizione, 239, 241, 242,
250
di minimalizzazione, 241, 242,
247, 250
di ricursione primitiva, 239,
241, 242, 250
Operazione binaria, 21
Oracolo, 308
Ordine lessicograco, 31
Parola vuota, 23, 26
Parsing, vedi Analisi sintattica
Passo computazionale, 61
PCP, vedi Problema delle corri-
spondenze di Post
Pigeonhole principle, 12, 296
Post, 161, 223, 251
Potenza di un linguaggio, 28
Precedenza tra operatori, 159
Predicato
di Kleene, 245
Problema
Programmazione Lineare
0 1, 307
Raggiungibilit` a, 303
Soddisfacibilit` a, 307
completo, 309
decidibile, 68
dellambiguit`a, 161
della terminazione, 177
delle corrispondenze di Post,
161
di decisione, 68, 281282, 284
di enumerazione, 283
di ottimizzazione, 283284
di ricerca, 282283
hard, 309
indecidibile, 68
semidecidibile, 68
trattabile, 228, 278
Problema della terminazione, 214
215
Prodotto cartesiano, 6
Produzione unitaria, 123
eliminazione, 124
Programma, 224, 236
Programmazione dinamica, 164
Propriet`a di ammissibilit`a, 282284
Pumping lemma
per linguaggi context free, 134
136
per linguaggi regolari, 9294
RAM, vedi Macchina a registri
Registro, 224, 235
Regola
di produzione, 37
di riscrittura, 174
Relazione, 6
dequivalenza, 7
dordine, 7
dordine totale, 7
di ammissbilit`a, 284
di ammissibilit`a, 283
di transizione, 61, 73, 142, 174
Riconoscimento di linguaggi, 36,
5862, 176178
Riconoscitore, 171, 176
Ricursione
doppia, 240
sinistra, 131
eliminazione, 131
Riducibilit`a, 306
Karp, 306
polinomiale, 307
Turing, 308
polinomiale, 308
Riduzione, 306
INDICE ANALITICO 353
Karp, 306
Turing, 308
Risorsa di calcolo, 277
Savitch, 303
Schema
di codica, 279
ragionevole, 279
Schema di programma, 248249
Schemi di codica polinomialmente
correlati, 279
Semianello, 23
Semidecidibilit`a secondo Turing,
180
Semigruppo, 22
libero, 23
quoziente, 25
Simbolo
della pila, 140
di funzione base, 248
di variabile, 248
di variabile funzione, 248
fecondo, 124
generabile, 125
iniziale della pila, 140
inutile, 123
eliminazione, 124126
non fecondo
eliminazione, 125
non generabile, 125
eliminazione, 125
SLF, 249250
Sottoinsieme, 1
Spazio di esecuzione, 278
nel caso peggiore, 278
Stati
distinguibili, 115
indistinguibili, 115, 116
Stato, 59, 72, 170, 193, 224, 244
nale, 72, 140, 170, 193, 245
iniziale, 72, 140, 170, 193
raggiungibile, 86
Stringa, 26
accettata
da ASFD, 74
da ASFND, 79
da automa a pila per pila
vuota, 142
da automa a pila per stato
nale, 143
da MTD, 176
da MTND, 194
in spazio limitato, 286
in tempo limitato, 285
palindroma, 44, 165
riutata
da ASFD, 73
da MTD, 176
da MTND, 194
in spazio limitato, 286
in tempo limitato, 285
riessa, 87, 102, 143
Tabella di transizione
di un ASF, 72
di una MT, 173
per automi a pila, 140
Tecnica di riduzione, 163
Tempo di esecuzione, 278
nel caso peggiore, 278
Teorema di accelerazione, 289
Teorema di compressione, 288
Teorema di Savitch, 303
Teoremi di gerarchia, 296300
Teoria
della calcolabilit`a, 251277
della complessit`a, 277309
Termine, 248
Tesi di Church-Turing, 181, 233,
235, 247, 251252, 278
Testina, 170
Transizione, vedi Passo computa-
zionale
Trasduttore, 171
Turing, 223, 251
Unione
di linguaggi, 27
di linguaggi context free, 137
354 INDICE ANALITICO
di linguaggi context free deter-
ministici, 155
di linguaggi regolari, 94, 103
Unit`a centrale, 225
Upper bound, 277, 280, 305
Visita di gra, 139
von Neumann, 224

Potrebbero piacerti anche