You are on page 1of 41

A.

Funzioni computabili

1. Algoritmi e procedure effettive

Un algoritmo è una sequenza di istruzioni che possono essere eseguite in


modo non ambiguo e ben definito da un’opportuna macchina.
Per risolvere in positivo un problema algoritmico è sufficiente esibire una procedura in un
formalismo accettabile. Per risolverlo in negativo, invece, è necessario avere un’idea chiara di
tutti i possibili algoritmi e mostrare che ciascuno di essi non è in grado di trovare una soluzione.

Una procedura effettiva è un algoritmo che, a partire da un certo input,


produce un certo output in un tempo finito.
La teoria del calcolo studia l’esecuzione di procedure effettive su input e output
numerici.
La teoria del calcolo è stata sviluppata a partire dal 1936 da Alan Turing e Alonzo Church.

Il problema diventa allora quello di formalizzare un opportuno modello di calcolo che, data una
funzione, sappia trovare una procedura effettiva per calcolarla.
Nella storia della teoria del calcolo, sono stati proposti vari modelli, tra cui le Turing Machines (1936), il lambda-calcolo (Church, 1936), le funzioni parziali ricorsive (Gödel-
Kleene, 1936), i sistemi deduttivi canonici (Post, 1945), i sistemi di Markov (1951) e le Unlimited Register Machines (Sheperdson-Sturgis, 1963).

Una funzione si dice computabile in un certo modello di calcolo se è


possibile scrivere una procedura effettiva che la calcoli.
Per esempio, la funzione div x, y  che calcoli se x è divisibile per y è computabile perché esiste una procedura
finita che ce lo dice. Invece, la funzione cpim, n  che calcoli se nello sviluppo di  vi sono almeno m occorrenze
della cifra n , pur essendo matematicamente valida, non è computabile perché, nonostante l’esistenza di un
algoritmo per enumerare le cifre consecutive di  , non possiamo sapere se avrà termine in un tempo finito.
Troveremo che la classe delle funzioni computabili è la stessa per qualunque modello di calcolo.

2. URM

Una URM o Macchina a Registri Illimitati è un array infinito di registri


contenenti interi non negativi.
I registri vengono indicati con R1 , R2 , R3 ,... , mentre i valori contenuti si indicano con r1 , r2 , r3 ,... .

Lo stato di una URM è il contenuto dei suoi registri, cioè il vettore r   .

Un programma URM è una sequenza di istruzioni che operano su una


URM.
La configurazione istantanea di un programma URM è una coppia k , r  , dove k  
rappresenta l’indice dell’istruzione da eseguire, e r è lo stato corrente. La
lunghezza del programma è il numero di istruzioni da cui esso è formato.
La lunghezza del programma viene generalmente indicata con s , mentre le istruzioni sono
indicate con I 1 , I 2 ,..., I s . Esse possono essere di quattro tipi:

1. Reset: Z (n)

Azzera il contenuto del registro Rn ( rn  0 ) e passa all’istruzione seguente;

0 se i  n
Semanticamente, si ha k , r  Z
(n)
 k  1, r  , dove ri   ;
ri altrimenti

2. Successore: S (n)

Incrementa di 1 il contenuto del registro Rn ( rn  rn  1 ) e passa all’istruzione seguente;

r  1 se i  n
Semanticamente, abbiamo k , r  S
(n)
 k  1, r   , dove ri   i ;
ri altrimenti

3. Trasferimento: T ( m, n )

Copia il contenuto del registro Rm sul registro Rn ( rn  rm ) e passa all’istruzione seguente;

r se i  n
Semanticamente, si ha k , r  T k  1, r  , dove ri   m
( m ,n)
;
ri altrimenti

4. Salto condizionato: J ( m, n, q )

Passa alla q -esima istruzione se rm  rn , altrimenti passa all’istruzione seguente;

q se rn  rm
Semanticamente, abbiamo k , r  J k , r  , dove k   
( m, n , q )
 ;
k  1 altrimenti

L’istruzione di salto incondizionato può essere simulata da J(n,n,q).

Dato un programma P di istruzioni I 1 , I 2 ,..., I s e stato iniziale r, definiamo


computazione di P a partire da r la sequenza di configurazioni istantanee
k1 , r1 , k 2 , r2 ,..., ki , ri ,... tali che ki  1 , r1  r e, se ki  s , si ha ki , ri  
I
ki 1 , ri 1  , mentre,
ki

se ki  s , k i , ri  è la configurazione finale.
La computazione di P a partire da r viene indicata con Pr  . Con la notazione Pa1 ,...a n 
a se i  n
indicheremo la computazione Pr  tale che ri   i , cioè considereremo il vettore
0 altrimenti
a1 ,...a n  come input del programma.

Se non esiste una configurazione finale, la computazione è infinita e il programma


si dice non terminante, altrimenti si dice terminante.
Se il programma termina, si considera convenzionalmente come output il contenuto del registro
R1 e scriveremo P  a1 ,..., an   b  b  ri ,1 , dove ri è lo stato della configurazione finale. Se il
programma non si arresta, scriveremo P  a1 ,..., an   .

Se i  j | ki  k j  ri  r j , il programma non si arresta mai; il viceversa non è necessariamente vero.

3. Funzioni URM-computabili
Sia f : A  B una funzione parziale, cioè tale che Dom f   A , e scriveremo f (a )  se f è
definita in a  A , altrimenti scriveremo f (a )  .

Se f , g : A  B sono funzioni parziali, scriveremo f  g , cioè f coincide parzialmente con g , se


sono verificate le seguenti condizioni: 1. a  A f (a )   g (a )  ; 2. a  A | f (a)   f (a)  g (a) .

Dato un programma URM P, sia n  1 ; chiameremo funzione n -aria calcolata da P


se P  a1 ,..., an   b
b
la funzione f P( n )  a1 ,..., an    .
 altrimenti

Una funzione parziale g :    si dice URM-computabile (UC) se esiste


n

un programma URM P tale che g  f . P


( n)

Indichiamo con Cn la classe delle funzioni n -arie UC, e con C (o CURM ) quella di tutte le funzioni

UC di qualsiasi arietà. Dalla definizione si ricava che C   Cn .
n 1

Attenzione: la parzialità/totalità di una funzione sono indipendenti dalla sua computabilità/non-computabilità. Ad


esempio, tra le funzioni viste prima, div x, y  è totale e computabile, mentre cpim, n  , pur essendo totale non è
1
computabile. Un altro esempio di funzione è f ( x )  , che è computabile pur essendo parziale.
x 1

4. Decidibilità

Un predicato n -ario è una funzione M :  n  0,1 , tale cioè che dica se per un
vettore di interi una certa proprietà è vera (1 ) o falsa ( 0 ).
Nella nostra trattazione considereremo solo predicati totali.

1 se M  x  vale
Dato un predicato M , la funzione cM  x    è detta funzione
0 altrimenti
caratteristica (FC) di M .

Un predicato si dice decidibile se la sua FC è computabile.


5. Computabilità su altri domini
Ci chiediamo se il concetto di computabilità possa essere esteso a un dominio generico diverso dall’insieme dei
numeri naturali. La risposta è affermativa solo se possiamo mappare tale dominio completamente su  .

Dato un dominio D , la funzione  : D   è detta codifica effettiva (CE) di D se 


è biiettiva ed effettivamente calcolabile e invertibile. In questo caso diciamo
anche che un oggetto d  D è codificato dal numero naturale  (d ) .

Dato un dominio D , sia  : D   una sua CE e f : D  D una funzione


parziale. Diremo che f è computabile se è solo se la funzione f :    , *

tale che f    f   , è computabile.


* 1

2 z se z  0
Per esempio, una CE di  potrebbe essere  ( z)   .
 2 z  1 altrimenti
1
1
 2 n se n è pari
Infatti possiamo invertirla in  ( n)   .
 1 (n  1) altrimenti
 2

6. Correttezza dei programmi URM

Un programma P si dice parzialmente corretto rispetto alle specifiche di


input  e di output  se, per ogni input che soddisfa  per cui P termina,
l’output soddisfa  .
Un programma P si dice totalmente corretto rispetto alle specifiche di
input  e di output  se, oltre ad essere parzialmente corretto rispetto a
tali specifiche, esso termina sempre.
Per dimostrare la totale correttezza, è sufficiente trovare una misura a valori in
un insieme ben fondato che decresce strettamente ad ogni iterazione. Spesso,
come insieme si può scegliere  .
A partire da ora chiameremo i programmi URM semplicemente programmi, ove non diversamente specificato.
B. generazione di Funzioni computabili

1. Funzioni iniziali

Chiamiamo funzioni iniziali, le seguenti funzioni:


1. funzione identicamente nulla: 0  x1 ,..., xn   0 ;

2. funzione successore: sx   x  1;

3. funzione proiezione: U in  x1 ,..., x n   xi ,1 i  n .

Lemma
Le funzioni iniziali sono computabili
Mostriamo che esistono dei programmi che computano le funzioni iniziali:
1. Z (1) calcola la funzione identicamente nulla;
2. S (1) calcola la funzione successore;
3. T (i,1) calcola la funzione proiezione.

2. Concatenazione di programmi
Concatenare due programmi significa eseguire il secondo non appena il primo è terminato. Ciò pone il problema di
far concludere il primo con un salto alla prima istruzione del secondo e quello di riscrivere le etichette delle
istruzioni di salto del secondo tenendo conto dell’offset dovuto alle istruzioni del primo.

Si dice che un programma di lunghezza s è in forma standard se, per ogni sua
istruzione di tipo J (m, n, q) , vale q  s  1 .

Lemma
Sia P un programma di lunghezza s in forma standard.
All’arresto di P, il contatore di programma vale s  1.

Lemma
Sia P un programma.
Esiste un programma P in forma standard tale che ogni sua computazione è
identica a quella di P , fatta eccezione per il contatore di programma quando
esso termina.
In particolare, a1 ,...,a n , b   P a1 ,...,a n   b  P a1 ,...,a n   b , cioè f P( n )  f P( n ) n   .

 J (m, n, s  1) se I j  J (m, n, q ) e q  s  1
Dato P  I 1 ,..., I s , poniamo P  I 1 ,..., I s , dove I j   .
 I j altrimenti

È facile convincersi che la computazione di P coincide con quella di P .


Dato un programma P , indichiamo con P  l  il programma che si ottiene sostituendo in P
ogni istruzione J (m, n, q ) con J (m, n, q  l ) e lasciando invariate le altre.

Dati due programmi P e Q , il primo di lunghezza s , chiamiamo


concatenazione di P e Q , e la indichiamo con PQ oppure con QP , il
programma le cui prime s istruzioni coincidono con quelle di P e le cui
restanti coincidono con quelle di Q  s  .

Lemma
1. La concatenazione gode della proprietà associativa ( ( PQ) R  P(QR) );
2. Se P e Q sono programmi in forma standard, anche PQ lo è.
Pur risolvendo il problema delle etichette delle istruzioni, la concatenazione così definita pone l’ulteriore questione
della sovrapposizione delle aree di lavoro.

Allo scopo di gestire la concatenazione e risolvere nel contempo le problematiche connesse con
la sovrapposizione dei registri, definiamo la funzione  nel modo seguente:

 Z (n)   n
 S (n)   n
 T (m, n)   max m, n 
 J (m, n, q )   max m, n 
 P    I1 ,..., I s   max  I j 
j 1,..., s

In tal modo, se v   P  , il registro Rv non sarà mai coinvolto in alcuna computazione di P .

Dati l1 ,..., l n  n , indichiamo con 


Rl  f P( n ) Rl1 ,..., Rln  il seguente programma:
T (l1 ,1) 
...  (copia il contenuto registri Rl1 ,..., Rln su quello dei registri R1 ,..., Rn )

T (l n , n)

Z (n  1) 
...  (azzera l’area di lavoro di P )

Z (  P )
P (computa P )

T (1, l ) (pone l’output di P in Rl , come desiderato)


3. Composizione di funzioni

Teorema
Siano f  y1 ,..., y m , g x1 ,..., x n ,..., g m x1 ,..., x n  delle funzioni computabili (e totali).

La funzione hx1 ,..., xn   f g x1 ,..., xn ,..., g m x1 ,..., xn  è computabile (e totale).
Intanto, osserviamo che h x1 ,..., x n   f  y1 ,..., y m  , g  x1 ,..., x n  ,..., g m  x1 ,..., x n   . Quindi la
h sarà totale se e solo se tutte le funzioni dell’ipotesi sono totali.
Siano F , G1 ,..., Gm programmi in forma standard che computano rispettivamente f , g 1 ,..., g m e
sia k  max  F ,  G1 ,...,  Gm , m, n  . Per come è stato definito k , se utilizziamo i registri a
partire dal successivo, non andremo a “toccare” le aree di lavoro di F , G1 ,..., Gm . Di
conseguenza, è banale far vedere che il seguente programma computa h :
T (1, k  1)
...
T (n, k  n)

Rk  n 1  f G(1n ) Rk 1 ,..., Rk  n 


...
Rk  n  m  f G(mn ) Rk 1 ,..., Rk  n 
R1  f F( m )  Rk  n1 ,..., Rk  n m 

Definiamo le seguenti funzioni che operano una sostituzione di variabili a partire da una certa
funzione f :

1. perm f  x1 , x 2   f  x 2 , x1 

2. id f  x   f  x, x 

3. dummy f  x1 , x 2 , x3   f  x 2 , x 3 

Corollario
Sia f  y1 ,..., y m  computabile (e totale) e i1 ,..., im  1,..., n, con possibili ripetizioni. Definiamo
h x1 ,..., x n   f xi ,...x i  .
1 m

La funzione h è computabile (e totale).


 
Basta osservare che h x1 ,...xn   f U in1  x1 ,..., xn ,...,U inm  x1 ,..., xn  . Dal teorema precedente si
dimostra la tesi. È da notare come la funzione h potrebbe essere totale anche se la f non lo è.

Per esempio, la funzione f  x1 , x 2 , x3   x1  x 2  x 3 è computabile perché sappiamo che g  x1 , x 2   x1  x 2 è


computabile e f può essere scritta come g  g  x1 , x 2 , x3  .

Dal corollario si deduce che il teorema precedente vale anche quando le funzioni g non hanno
tutte la stessa arietà.
4. Ricorsione

La ricorsione è una modalità di definizione di una funzione che specifica i nuovi


valori in termini di valori precedentemente definiti e di eventuali altre funzioni
già definite.

Teorema
Siano date le funzioni f  x  e g x,y, z  .

hx,0   f x 
Esiste un’unica funzione hx, y  che soddisfa le equazioni  .
hx, y  1  g x,y, hx, y 

hx,0   f x 
Date le funzioni f x  e g x,y, z  , l’espressione  è detta
hx, y  1  g x,y, hx, y 
definizione per ricorsione di h (a partire) da f e g.
Il teorema precedente ci assicura che h è ben definita.

Le equazioni che costituiscono tale definizione sono dette equazioni ricorsive, di


cui la prima è chiamata base della ricorsione.
Esistono altre forme di definizioni ricorsive più complesse (ad es. più funzioni base, definizioni
che utilizzano più variabili, riferimento a valori precedenti più “profondo”,…). In un contesto più
generale, la ricorsione utilizzata sopra è detta ricorsione primitiva.

h0   a a  
Nel caso in cui l’arietà di x sia nulla, le equazioni ricorsive diventano  .
h y  1  g  y , h y 

Teorema
Siano f x  e g x,y, z  funzioni computabili (e totali) con x  x1 ,..., x n  , e sia hx, y  definita
per ricorsione (primitiva) a partire da f e g .
La funzione h è computabile (e totale).
Siano F e G i programmi in forma standard che computano rispettivamente f e g , e sia
k  max  F ,  G , n  2 . Per come è stato definito k , se utilizziamo i registri a partire dal
successivo, non andremo a “toccare” le aree di lavoro di F e G . Di conseguenza, è facile
convincersi che il seguente programma computa h :
T (1, k  1) S (k  n  2)
 J (1,1, p )
T ( n  1, k  n  1) I q : T ( k  n  3,1)

Rk  n  3  f F  R k  1 ,..., Rk  n 
I p : J ( k  n  1, k  n  2, q )
Rk  n  3  f G  Rk  1 ,..., Rk  n , Rk  n  2 , R k  n  3 
Dall’ipotesi di totalità, per come sono costruite le equazioni ricorsive, ricaviamo la tesi di
totalità.
Adesso elenchiamo un’ampia lista di funzioni computabili, facendo vedere che è possibile definirle per
composizione o ricorsione (primitiva) a partire da quelle già definite:

x  0  x f  x   U 11  x 
(somma) 
 x  ( y  1)  ( x  y )  1 g  x, y, z   s  z 
x  0  0 f  x   0 x 
(prodotto) 
 x  ( y  1)  x  y  x g  x, y, z   x  z

 x 0  1 f  x   s 0 x 
(potenza)  y 1
 x  x y  x g  x, y, z   x  z

0  1  0 a0
(predecessore) 
( y  1)  1  y g  y, z   y

 x  0  x f  x   U11  x 
(differenza naturale) 
 x  ( y  1)  ( x  y )  1 g  x, y, z   z  1

sg 0   0 a0
(segno) 
sg  y  1  1 g  y, z   s  0  z  

 sg  0   1 a 1
(antisegno[1]) 
 sg  y  1  0 g  y, z   0 y , z 

(antisegno[2]) sg  x   1  sg  x 

(differenza assoluta) x  y  ( x  y )  ( y  x)

0! 1 a 1
(fattoriale) 
( y  1)! y! ( y  1) g  y, z   s  y   z

(minimo) min  x, y   x  ( x  y )

(massimo) max  x, y   x  ( y  x )

0% x  0 f  x   0 x 
(modulo) 

( y  1)% x  s  y % x   sg x  s  y % x   g  x, y, z   s  z   sg  x  s  z  

0 / x  0 f  x  0 x
(quoziente) 

( y  1) / x  ( y / x)  sg x  s  y % x   
g  x, y, z   z  sg x  s  y % x  
(codifica binaria)   x, y   2 x (2 y  1)  1

Possiamo anche elencare alcuni predicati decidibili:

(divisibilità) x | y  sg  y % x  [per convenzione 0 | 0  1 ]

even  0   1 a 1
(parità) 
even  y  1  1  even( y ) g  y, z   s  0  x    z

(disparità) odd ( x)  sg  even  x  


Lemma
(definizione per casi)

Siano f1 x ,..., f k x  funzioni computabili e M 1 x ,..., M k x  predicati decidibili tali che


x !i,1  i  k | M i x  è vero.

 f 1 x  se M 1 x  è vero

La funzione g x   ... è computabile.
 f x  se M x  è vero
 k k

Basta osservare che g x   c M 1 x  f1 x   ...  c M k x  f k x  , computabile perché ottenuta mediante


composizione di funzioni computabili.

Teorema
Siano M x  e Qx  due predicati decidibili.
I seguenti predicati sono decidibili:
1. M x 

2. M x   Qx 

3. M x   Qx 
Basta osservare che:
1. cM  x   1  cM  x 

2. c M Q x   c M x   cQ x 

3. c M Q x   sg c M x   cQ x   max c M x , cQ x 

Teorema
Sia f x, z  una funzione computabile (e totale).
Le funzioni di sommatoria limitata  f x, z  e produttoria limitata  f x, z 
z y z y

sono computabili (e totali).


Le funzioni suddette sono definibili per ricorsione (primitiva) nel modo seguente:
 f x, z   0  f x, z   1
 z 0  z 0
 
  f x, z    f x, z   f x, y    f x, z    f x, z   f x, y 
z  y 1 z y z  y 1 z y

Di conseguenza, sono entrambe computabili (e totali).

Corollario
Siano f x, z  e k x, w  due funzioni computabili (e totali).
Le funzioni  f x, z  e  f x, z  sono computabili (e totali).
z  k x , w  z  k  x ,w 

Si dimostra per composizione, sostituendo alla y del teorema precedente la funzione k x, w  .
5. Minimalizzazione

Dato un predicato M x, z  , possiamo definire la funzione


min z  y | M x, z  se  tale z
 z  y M x, z    .
y altrimenti

Il simbolo  z  y è detto operatore di minimalizzazione limitata (OML).

Teorema
Sia f x, z  una funzione computabile e totale.
La funzione  z  y  f x, z   0 è computabile e totale.
Consideriamo la funzione hx, v    sg  f x, u  e sia z 0   z  y  f x, z   0  .
u v

1 se v  z 0
Osserviamo che hx, v    , per cui  z  y  f x, z   0    hx, v  .
0 se z 0  v  y v y

Quindi la funzione definita a partire dall’OML risulterà computabile e totale.

Corollario
Siano f x, z  e k x, w  due funzioni computabili e totali.
L’operatore  z  k x, w   f x, z   0  è computabile e totale.
Si dimostra per composizione, sostituendo alla y del teorema precedente la funzione k x, w  .

Corollario
Sia Rx, y  un predicato decidibile.
1. La funzione f R x, y    z  y Rx, y  è computabile,
2. Il predicato M  x, y   z  y  Rx, z  è decidibile.
3. Il predicato M  x, y    z  y  Rx, z  è decidibile.
 
1. Possiamo scrivere f R  x, y    z  y sg  cR  x, z    0 , da cui la computabilità.

2. La FC di M  può essere definita come c x, y    c R x, y  , da cui la decidibilità.


z y

 
3. La FC di M può essere definita come c x, y   sg   c R x, y  oppure come
 z y 
c x, y   z  y  Rx, z  , da cui la decidibilità.

Corollario
I predicati x y, x y e x y sono decidibili.
Estendiamo la precedente lista di funzioni computabili, definendone altre anche mediante l’OLM:

(divisori) D( x)   z | x 
zx

1 se D( x)  2
(primo) Pr x   
0 altrimenti
 p0  0
( n -esimo primo) 
 pn 1   z   pn ! 1  z  pn  Pr  x   1

(esp di Py nella fattorizz di x ) x  y 


  z  y p yz 1 | x 

Mediante la x  y possiamo codificare una sequenza di interi a1 ,..., a n scrivendo b  p1a1 1  ...  pnan 1 .

.
 
La decodifica si esprime come n   z  b  b  z 1  0 e ai  b i  1, 1  i  n .

Mediante tale codifica, possiamo studiare la ricorsione con più di una base. Ad esempio i numeri di Fibonacci definiti
 f 0   1
 f y
come  f 1  1 , possono essere trattati definendo g  y   2  3 f  y 1 per ricorsione
 f  y  2  f  y   f  y  1

 g 0  6
(osserviamo che  g  y 1  f  y  e  g  y 2  f  y  1 ) :   g  y 2 .
 g  y  1  2  3 g  y 1  g  y 2
Per cui g è computabile e, come conseguenza dell’osservazione, anche f lo è.

L’utilizzo dell’OLM consente di costruire programmi che restituiscono un output in ogni caso.
Infatti l’ipotesi di totalità e computabilità ci consente di calcolare il valore della funzione per il
primo indice, poi per il secondo e così via, fino a trovare, se esiste, il minimo cercato, o
fermandosi al limite indicato dall’operatore, se esso non esiste. Osserviamo che anche per
funzioni non totali, ma computabili, possiamo ricavare una funzione totale definita mediante
OLM se esse sono definite per tutti gli indici inferiori al limite richiesto.
Per affrontare un discorso più generale, è meglio introdurre un operatore che non sia limitato e ci
consenta di trattare anche funzioni non totali. Una funzione scritta mediante tale operatore dovrà
prevedere il caso in cui essa sia non definita.

Data una funzione f x, y  , computabile, possiamo definire la funzione


min y | f x, z   z  y e f x, y   0 se  tale y
 y  f x, y   0    .
 altrimenti

Il simbolo y è detto operatore di minimalizzazione (non limitata)


(OM).
Teorema
Sia f x, y  una funzione computabile e g x    y  f x, y   0  , con x  x1 ,..., x n 

La funzione g è computabile.
Sia F un programma in forma standard che computa f e sia k  max n  1,  F  .
Si evince facilmente che il seguente programma computa g :
T (1, k  1)
...
T (n, k  n)
I p : R1  f F Rk 1 ,..., Rk  n , Rk  n1 
J (1, k  n  2, q )
S (k  n  1)
J (1,1, p )
I q : T (k  n  1,1)

Corollario
min y | R x, y  se  tale y
Sia Rx, y  un predicato decidibile e g x    y Rx, y    .
 altrimenti

La funzione g è computabile.

Basta osservare che g x    y sg c R x, y   0 . 

Per quanto visto, l’OM definito a partire da funzioni totali può generare funzioni non totali, mentre
se partiamo da funzioni totali e utilizziamo composizione e/o ricorsione otterremo ancora
funzioni totali.

6. Funzione di Ackermann

La funzione di Ackermann (FA) è una particolare funzione definita per doppia


 1 se y  0
 
 0, y   2 se y  1
 
ricorsione, nel modo seguente:  y  2 altrimenti .


  x,0  1

  x  1, y  1    x,  x  1, y 

Per comodità, useremo la notazione  x  y     x, y  e  x( n)  y    x  x ... x  y  . Per cui, avremo



nvolte

 x 1  y  1   x  x 1  y    x  x  x 1  y  1   ( 2)
x  x 1  y  1    x 1  y  2   ...   x( y 1)  x 1 0 
( 3)
x

 x( y 1) 1 .
Lemma
È possibile calcolare il valore di  x  y  x, y    2 .
Dalla definizione, considerando i casi base, è evidentemente possibile calcolare  0  y  y   e
 x 0  x   .
Inoltre, per quanto visto, possiamo trovare i valori  1  y  y   ,  2  y  y  , ... arrivando
ai casi base. Perciò è possibile calcolare  x  y   x, y    2 .

Per dimostrare la computabilità della FA, è necessario costruire un insieme di triple connesse al
calcolo dei suoi valori.

Diciamo che un insieme finito S  3 di triple x, y, z  è valido se:

a) 0, y, z   S  z   0  y  ;

b) x,0, z   S  z  1 ;

c)  x  1, y  1, z   S  u   |  x  1, y, u   S   x, u , z   S .

Inoltre, diciamo che un insieme finito S  3 di triple è valido per x, y    2 se


 z   |  x, y, z   S .

Teorema
Data la FA  definita per ricorsione, sia T un insieme valido.
1.  è ben definita dalle equazioni ricorsive;
2. x, y, z   T z    x, y  ;

3. x, y    2 S   3 finito e valido per x, y  .


1. Segue direttamente dal lemma precedente.
2. Basta osservare che le condizioni di validità di un insieme soddisfano perfettamente le
equazioni ricorsive della FA.
3. Sia  x , y    2 . Per induzione abbiamo:
- [BASE] Se x  0 , abbiamo tre casi possibili: (1) y  0  0,0,1 valido per 0,0  ; (2)
y  1  0,1,2 valido per 0,1 ; (3) y  1  0, y , y  2  valido per 0, y  . Se y  0 , abbiamo
che x ,0,1 è valido per  x ,0 .
- [IND] Se x  0, y  0 , sia S1 un insieme finito valido per  x , y  1 e S 2 un insieme finito
valido per  x  1,  x , y  1 (esistono per la proprietà induttiva); allora possiamo costruire
S  S1  S 2   x , y ,  x , y  che è finito e sarà valido per  x, y  .
Introduciamo ora una lista di funzioni computabili e predicati decidibili associati agli insiemi validi, utili a dimostrare
la computabilità della FA:

(codifica effettiva di una tripla) cod x, y, z   2 x  3 y  5 z


( t è il codice di una tripla) is_triple t   i  t t i  0  i  3

(primo elemento di una tripla) first t   t 1 (per comodità: 1t )

(secondo elemento di una tripla) second t   t 2 (per comodità: 2 t )

(terzo elemento di una tripla) third t   t 3 (per comodità: 3t )

(codifica effettiva di un insieme finito) cod A  P u A


u A

( v è il codice di un ins finito di triple) is_set_of_ triples v   i  v v i  0  v i  1  is_triple i 

(la tripla di codice t appartiene

all’insieme di triple di codice v ) in t , v   v t  1


( v è il codice di un insieme di triple

valido per  x, y  ) valid_for v, x, y   is_set_of_ triples v  




  2 i  0  3i  1     
 
  1i  0   2 i  1  3 i  2    ^  
   2  1  3  2  2    
   i i i  
 
 i  v in i, v    2 i  0  3i  1   
  
   1i  0  2 i  0   
   
  
  u  v   in cod  x, y 
 1 , u , v     
      
 
     in cod x  1, u , z , v     
 z  v in cod x, y , z , v 

Teorema
La FA è computabile.
Basta osservare che   x, y    z in cod x, y , z ,  vvalid_for v, x, y  .
Dalla computabilità della funzione cod e dalla decidibilità dei predicati in e valid _for , segue la
tesi.
C. Tesi di church

1. Approcci alla computabilità


Oltre al modello delle macchine URM, sono stati proposti altri approcci per definire delle classi di funzioni
computabili. Il risultato fondamentale, che porterà poi alla Tesi di Church, è che tutte queste classi in realtà
coincidono.

Definiamo la classe delle funzioni primitive ricorsive (PR), e la indichiamo


con PR , come il più piccolo insieme contenente le funzioni iniziali e
tutte le funzioni che si possono ottenere da queste mediante un numero
finito di operazioni di composizione e ricorsione.
Dai teoremi precedenti, vista la chiusura di C rispetto alla composizione e ricorsione, possiamo
affermare che PR  C . Dalla definizione, sappiamo che PR contiene solo funzioni totali, mentre
C ne contiene anche di parziali, quindi avremo, più fortemente, che PR  C .

Indichiamo la classe delle funzioni UC e totali con C . TOT

Considerato che esiste almeno una funzione totale non PR (la FA), possiamo affermare che vale
l’inclusione stretta PR  CTOT . Quindi, anche per quanto visto dai teoremi precedenti, pur
essendo C chiuso rispetto a composizione, ricorsione e minimalizzazione, la classe PR non lo è.

2. Funzioni parziali ricorsive


Questo modello fu introdotto da Gödel, Herbrand e Kleene nel 1936.

Definiamo la classe delle funzioni parziali ricorsive (PAR), e la indichiamo


con R , come il più piccolo insieme contenente le funzioni iniziali e tutte
le funzioni che si possono ottenere da queste mediante un numero finito
di operazioni di composizione, ricorsione e minimalizzazione.
Definiamo la classe delle funzioni µ-ricorsive (µR), e la indichiamo con
R 0come un sottoinsieme della classe R in cui l’utilizzo della
minimalizzazione è consentito solo quando produce funzioni totali.
Indichiamo la classe delle funzioni PAR e totali con RTOT e la classe delle
generiche funzioni totali con TOT .
Per quanto visto sopra, osserviamo che RTOT  R  TOT .
Teorema
R C.
 ) Dalla chiusura di C , per quanto visto prima, si evince immediatamente che R  C .
 ) Data f (x)  C , sia P   I1 ,..., I s  un programma che la computa. Senza perdita di
generalità, possiamo supporre che: (a) P è in forma standard; (b) se I j  J  m, n, q  ,
q  j  1 j  1,..., s  1 .

Consideriamo uno stato r   r1 , r2 ,... dei valori dei registri (al più un numero finito di essi può

essere non nullo). Esso si può codificare in maniera effettiva con cod  r   2r1  3r2  5r3  ...   pi .
i 1
Quindi, possiamo codificare una configurazione istantanea (di una URM che deve eseguire la
j -esima istruzione) con   j , cod  r   .

Si dimostra che  :  2   è biiettiva e indichiamo con  1,  2 :    le inverse che ci


permettono di ricavare la prima e la seconda componente della coppia di partenza:
1  z 1 
 1  z    z  12 e  2  z    1  z   1 .
2 2 
Indichiamo con cP  x, t  la codifica della configurazione della computazione di P  x  dopo t
cP  x, 0    1, cod  x  
passi. Osserviamo che può essere definita per ricorsione  , dove,
cP  x, t  1    j  x, t  , R  x, t  
chiamando jP  x, t   1  cP  x, t   il contatore di programma dopo t passi e
RP  x, t    2  cP  x, t   lo stato dei registri dopo t passi, le funzioni j e R possono essere
definite per casi nel modo seguente:
 ( jP  x, t   1, s  I jP  x, t   J (m, n, q) ) 
 jP  x, t   1 se
  ( I jP  x, t   J (m, n, q)   R  x, t 
P m
  RP  x, t  n )

j  x, t   q se jP  x, t   1, s   I jP  x ,t   J (m, n, q ), 1  q  s   R  x, t    RP  x, t  n
P m


0 altrimenti

 R  x, t  / p  RP  x, t n se jP  x, t   1, s   I jP  x ,t   Z  n 
 P n

 pn  RP  x, t  se jP  x, t   1, s   I jP  x, t   S  n 

R  x, t   
 R  x , t  m  R  x , t  n
 pn P  ( RP  x, t  / pn P ) se jP  x, t   1, s   I jP  x, t   T  m, n 

 RP  x, t  se ( jP  x, t   1, s   I jP  x, t   J  m, n, q  )  jP  x, t   0

Da tutto ciò, segue che cP è PR. Inoltre, se f P (x)  , il programma si ferma esattamente dopo
t passi, dove t   t  j P  x , t   0  , per cui f P (x)   RP  x, t  1 ; invece, se f P (x)  , abbiamo
 t  jP  x , t   0   .

 
In ogni caso vale f (x)  f P (x)  RP x,  t  jP  x, t   0   1
   
  2 cP x,  t  1  cP  x, t    0  , per
1
cui f (x) è PAR  f (x)  R  C  R .
Corollario
RTOT  CTOT .
Segue direttamente dal teorema precedente.

Corollario
RTOT  R0 .

 ) Data f (x)  RTOT  f (x)  R  f (x)  C , sia P un programma che la computa.

Consideriamo le funzioni RP e jP definite precedentemente, che sono PR e totali. Poiché


f (x) , totale per ipotesi, si può ottenere da esse mediante composizione, ricorsione e
minimalizzazione, abbiamo che  t  jP  x, t   0   R0  f (x)  R0  RTOT  R0 .

 ) Sia f (x)  R0 . Dalla definizione di R0 , sappiamo che, in qualunque modo abbiamo


ottenuto f , essa dev’essere necessariamente totale. Quindi f (x)  RTOT  R0  RTOT .

Un predicato si dice primitivo ricorsivo, parzialmente ricorsivo o µ-


ricorsivo se la sua FC è rispettivamente PR, PAR, o µ-ricorsiva.
3. Macchine di Turing
Questo modello fu introdotto da Turing nel 1936. Egli analizzò il processo di calcolo che poteva compiere un operatore umano con carta e penna e concluse che esso può
essere considerato come una sequenza di operazioni quali la lettura, scrittura e cancellazione di un simbolo e il trasferimento dell’attenzione da un simbolo all’altro. La
scelta dell’operazione da compiere ad ogni passo dipende solo dal simbolo che si sta leggendo e dallo stato in cui ci si trova. Il numero di simboli e stati dev’essere finito
perché tale è la condizione dell’esecutore.

Una TM o Turing Machine è un dispositivo dotato di:


1. una lista finita di simboli s0 , s1 ,..., sn , detto alfabeto, di cui il primo simbolo, detto
blank, è sempre presente e si indica con b ;
2. una lista finita di stati possibili q1 ,..., qm , detti stati interni;

3. un nastro infinito, suddiviso in caselle, ciascuna delle quali contiene un simbolo


dell’ alfabeto;

4. un’unità di controllo, che tiene conto dello stato interno corrente, contenente
una testina di lettura/scrittura che tiene traccia della casella su cui avvengono le
operazioni;

5. una lista finita di quadruple, detta controllo finito, del tipo qi , s j ,  , ql , dove
 sk

  R , con 1  i, l  m , 0  j, k  n e R, L  s0 , s1 ,..., sn  .
L

Supporremo che, per ogni coppia  qi , s j  vi sia al più una quadrupla qi , s j ,  , ql , cioè tratteremo
solo TM deterministiche.

Data una TM, definiamo azione specificata dalla quadrupla qi , s j ,  , ql quando essa
si trova nello stato qi e legge il simbolo sj , l’operazione tale che:

1. se   sk , cancella sj e scrive sk al suo posto;

2. se   L , sposta la testina a sinistra;


3. se   R , sposta la testina a destra;
4. passa nello stato ql .

Una configurazione iniziale di una TM è data da un nastro con su scritti i simboli,


che costituiranno il nostro input, una posizione iniziale della testina e uno stato
interno iniziale.
Per quanto visto, emerge che, a differenza di una URM, dove l’hardware erano i registri e il software il programma,
una TM ha dentro di sé sia l’uno che l’altro.

Una computazione di una TM M è specificata dal seguente algoritmo:

- fin quando esiste nel controllo finito una quadrupla qi , s j ,  , ql , dove qi è lo stato
corrente di M e sj è il simbolo letto dalla testina, esegui l’azione specificata da
tale quadrupla;
- altrimenti, fermati.

4. Funzioni Turing-computabili
Per convenzione, allo scopo di rappresentare i numeri naturali, supporremo sempre s1  1 e che i
numeri vengano scritti su nastro in forma “unaria”, quindi il valore di un numero equivarrà al
numero di simboli 1 che vi si trovano meno uno. Perciò, per rappresentare l’input unario x di
una funzione, il nastro apparirà con x  1 simboli 1 :
 b 1 1  1 b 
Invece, per rappresentare l’input k  ario, separeremo gli elementi del vettore con dei blank:

 b 1 1  1 b 1 1  1 b 1  1 b 

Per quanto riguarda l’output, se la computazione termina, scriveremo M  x1 ,..., xk   y , dove y è


il numero di simboli 1 scritti sul nastro, diminuito di un’unità. Se il programma non si arresta,
scriveremo M  x1 ,..., xk   .
Data una TM M , sia k  1 ; chiameremo funzione k -aria calcolata da M la funzione
se M  x1 ,..., xk   y
 y
f M( k )  x1 ,..., xk    .
 altrimenti

Una funzione parziale g :  k


 si dice Turing-computabile (TC) se esiste
una TM M tale che g  f . (k)
M

Indichiamo con TCk la classe delle funzioni k -arie TC, e con TC (o C TUR ) quella di tutte le
funzioni TC di qualsiasi arietà.

Dalla definizione si ricava che TC   TCk .
k 1

Teorema
TC  R .
Si dimostra provando che un programma URM può simulare una TM e viceversa. Per cui,
avremo TC  C e di conseguenza la tesi.

È stato dimostrato che tutte le varianti possibili delle TM (nastri multipli, testine multiple,
controllo finito non deterministico, …) sono computazionalmente equivalenti ad una TM
classica.

5. Tesi di Church
Le considerazioni sull’equivalenza dei vari approcci portano alla conclusione che se noi
riusciamo ad intuire una procedura effettiva per calcolare una funzione, potremo trovare un
qualsiasi modello per computarla effettivamente.

Tesi
(di Church)

La classe delle funzioni parziali intuitivamente ed informalmente calcolabili


coincide con la classe CURM delle funzioni computabili.
Pur essendo solo una tesi, e quindi difettiva di dimostrazione, vi sono alcuni punti a sostegno
della sua veridicità:
1. Il risultato fondamentale della teoria del calcolo mostra che, a partire da qualsiasi modello, si
arriva alla medesima classe di funzioni computabili.

2. È stata trovata un’ampia collezione di funzioni appartenenti a CURM , che può essere espansa
all’infinito tramite composizione, ricorsione e minimalizzazione.
3. I programmi URM ci permettono di scrivere effettivamente gli algoritmi che abbiamo solo
informalmente ideato.
4. Non sono state trovate ancora funzioni effettivamente calcolabili ma non UC.
Ogni volta che, data una funzione, possiamo scrivere un programma che la
computa (o provare indirettamente che tale programma esiste), oppure provare in
maniera rigorosa che esiste un algoritmo, seppur informale, che può calcolarla, per
la Tesi di Church (TdC), potremo considerarla effettivamente computabile.

Nel caso in cui possiamo applicare il secondo metodo suddetto per dimostrare la
computabilità di una funzione, diciamo che l’abbiamo fatto mediante la TdC.
La dimostrazione mediante TdC dev’essere considerata come un’ultima spiaggia per la dimostrazione della
computabilità di una funzione, quando altri metodi non riescono a portarci velocemente e senza ragionevoli dubbi
ad una dimostrazione formale. Quest’ultima dovrà essere comunque utilizzata se espressamente richiesta.
D. Enumerazione di funzioni computabili

1. Enumerazione di programmi

Diciamo che un insieme X è enumerabile (EN) se esiste una biiezione


f : X   . Se inoltre f e f sono effettivamente calcolabili, X si dirà
1

effettivamente enumerabile (EEN).


La nozione di effettiva calcolabilità è stata usata invece di quella di computabilità perché quest’ultima non è stata
formalmente definita per funzioni che vanno da un insieme qualsiasi a quello dei numeri naturali.

Una suriezione g : X   è detta enumerazione di X . Se g è anche iniettiva,


essa di dirà enumerazione senza ripetizioni (ESR).
Possiamo rappresentare l’enumerazione di X con X   x0 , x1 , x2 ,... . Dalle definizioni precedenti,
si ricava che un insieme è EN mediante una funzione se e solo se essa è un’enumerazione senza
ripetizioni.

Teorema
1. 2 è EEN
2.       è EEN
3.   k è EEN
k 0

1. Consideriamo la funzione di codifica binaria  :  2   e le sue inverse  1 e  2 , viste in


precedenza. È chiaro che queste sono effettivamente calcolabili, perciò  è un’ESR e  2 è
EEN.
2. Definiamo  :           |   m, n, q      m  1, n  1 , q  1 . Calcolando l’inversa, si

 
ha  1  x    1  1  x    1,  2  1  x    1,  2  x   1 . Si vede subito che entrambe le funzioni sono
effettivamente calcolabili e quindi         è EEN.
3. Consideriamo  :   k |   a1 ,..., ak   2a1  2 a1  a2 1    2 a1  a2  ak  k 1  1 e siano b1 , , bk gli
k 0

indici dei bit 1 nella rappresentazione binaria del numero x  1 , con 0  b1    bk . Allora,
possiamo calcolare l’inversa  1  x    b1 , b2  b1  1,, bk  bk 1  1 . È evidente che entrambe le
funzioni sono effettivamente calcolabili, perciò 
k 0
k
è EEN.

Denotiamo con I l’insieme di tutte le istruzioni URM e con P l’insieme di tutti i programmi
URM.
Teorema
I e P sono EEN.
Consideriamo  : I   tale che:
  Z (n)   4(n  1)
  S (n)   4(n  1)  1
 T (m, n)   4 (m  1, n  1)  2
  J (m, n, q)   4 (m, n, q)  3
Se rappresentiamo un numero naturale x come 4u  v , possiamo calcolare l’inversa:
 Z (u  1) se v  0
 S (u  1) se v  1

 1  x   
T (m, n) con m   1  u  +1, n   2  u  +1 se v  2

 J (m, n, q) con (m, n, q)   1  u  se v  3

È facile convincersi che  e  1 sono effettivamente calcolabili, per cui I è EEN.
Ora consideriamo  : P   , tale che, se P è un programma le cui istruzioni sono I1 , , I s ,
allora   P       I1  ,,   I s   . Per quanto visto e per come sono costruite,  e  1 sono
effettivamente calcolabili, quindi P è EEN.

Dato PP , il valore   P  è detto numero di Gödel (o codice) di P, e possiamo


scrivere Pn   1  n  .

Per come è stata costruita  , m  n  Pm  Pn , sebbene entrambi i programmi possano


computare la stessa funzione.

Indichiamo con a( n ) la funzione n -aria calcolata dal programma di codice a (cioè a( n )  f P(an ) ),
con Wa( n )  
il suo dominio (cioè Wa( n )  Dom a( n) ) e con Ea( n ) il suo codominio (cioè
 
Ea( n)  Ran a( n ) ). Per brevità, scriveremo a , Wa e Ea per indicare rispettivamente a( n) , Wa( n ) e
( n)
E a .

Data f , funzione unaria computabile, chiamiamo indici di f gli infiniti valori


a | f  a .

Di conseguenza, 0 ,1 ,2 , è un’enumerazione con ripetizioni di tutte le funzioni unarie


computabili; analogamente 0( n ) ,1( n ) ,2( n ) , è un’enumerazione con ripetizioni di tutte le funzioni
n -arie computabili.
Teorema
Cn è EN.
 
Alla luce di quanto visto in precedenza, possiamo scrivere Cn  a( n ) | a   , enumerazione
 fn  0  0

con ripetizioni. Se poniamo  , possiamo costruire
  
 f n  m  1   z z   fn  0 ,,  f n  m
(n) ( n) (n)

l’enumerazione senza ripetizioni  (fnn)0 , (fnn)1 , (fnn)2 , equivalente a quella di partenza perché
fatta da tutte le funzioni computabili n -arie. Perciò Cn è EN.

Osserviamo che la funzione f del teorema non è necessariamente computabile.

Corollario
C è EN.
Essendo C   Cn , per i teoremi precedenti, C è EN.
n 0

Alternativamente, possiamo osservare che un’enumerazione esplicita di C , senza ripetizioni, è


 
l’inversa della funzione   (fnn)m     m, n  1 , dove f è quella definita nel teorema
precedente. Chiaramente,  è una biiezione, quindi C è EN.

2. Metodo diagonale di Cantor e parametrizzazione

Data un’enumerazione di funzioni  0 , 1,  2 , , si dice che abbiamo applicato il


metodo diagonale di Cantor (MDC) per la costruzione di un’altra funzione  se
  i    i  i  , i   . Se l’enumerazione è fatta da sottoinsiemi di numeri naturali,
basta costruire l’insieme  in modo che i    i  i .

Teorema
Esiste una funzione totale e unaria che non è computabile.
  n   1 se n  n  
Applicando il MDC, definiamo f  n    n .
0 altrimenti

Chiaramente f  n n   , quindi non è computabile, pur essendo totale e unaria.

Data f  x, y  computabile, sia a   . Definiamo g a  y   f  a, y  (parametrizzazione della f ).


Essendo questa computabile per definizione, l   | g a  l . I teoremi che vedremo ci
garantiscono che possiamo passare da a a l mediante una funzione computabile e totale.
Teorema
(s-m-n, forma semplice)

Sia f  x, y  computabile.

k  x  , totale e computabile, tale che f  x, y   k  x   y  y   .


Siano F il programma che calcola f e Qa ( a   ) il seguente programma:
T (1,2)
Z (1)
S (1) 
 .
  a volte
S (1) 
F
Si vede subito che tale programma calcola f  a, y  a   , come se fosse una funzione unaria.
Se poniamo k  x     Qx  , per quanto visto in precedenza, avremo che k è totale ed
effettivamente calcolabile. Per la TdC, essa è quindi computabile. Perciò, per costruzione, vale
f  x, y   k  x   y  .

Teorema
(s-m-n, forma generale)

Siano m, n  1, x   x1, xm  , y   y1 , yn  .

snm  z , x  , totale e computabile, tale che z( m  n )  x, y   s( n) z , x   y  y   n .


m
n

Per i  1 , sia Q  i, x  il programma che carica x nel registro Ri :


Z (i )
S (i ) 

  x volte
S (i ) 

Fissati m e n , sia P |   P   z . Definiamo snm  z , x  come il codice del seguente programma:

T ( n, m  n) Q (1, x1 )
T (n  1, m  n  1) Q (2, x2 )
 
T (1, m  1) Q (m, xm )
P
Per costruzione, si ha z( m  n )  x, y   s(mn) z , x   y  ; inoltre snm è computabile per la TdC, in quanto
n

(per come è definita) è totale ed effettivamente calcolabile.

Osserviamo che le funzioni snm sono PR e che la loro dipendenza da n può essere eliminata, cioè
m, n  1 s m :  m 1   | z( m  n )  x, y   s(mn) z , x  y  .
3. Programmi universali

La funzione (n  1) -aria   e, x     x  è detta funzione universale (FU) per


(n)
U
(n)
e

le funzioni n -arie computabili.


Per indicare la FU per le funzioni unarie, scriveremo semplicemente   x, y  . La FU viene
chiamata così perché ponendo, p.e. nel caso unario, g m  y     m, y  , la sequenza g 0 , g1 , g 2 ,
conterrà tutte le funzioni unarie computabili.

Teorema
Sia n  1 .
 U( n ) è computabile.
(dimostrazione informale)

Dati un indice e e una n -upla x , possiamo calcolare  U( n )  e, x  nel modo seguente:

1. Si generi il programma Pe ;

2. Si simuli Pe sull’input x

Per la TdC,  U( n ) è computabile.


(dimostrazione meno informale)

Dati un indice e e una n -upla x , consideriamo  U( n )  e, x  e il programma Pe .

Durante la computazione di Pe , la configurazione corrente può essere codificata con


c    , j  , dove   2r1  3r2  5r3     piri è lo stato corrente dei registri (la codifica è
i 0
possibile perché ad ogni istante solo un numero finito di registri è non nullo) e j è l’indice
dell’istruzione successiva. Osserviamo che valgono ri   i ,    1  c  , j   2  c  .
Dato che i valori  , j (e, di conseguenza, c ) dipendono dal codice di programma e , dall’input
x e, durante la computazione, dal numero di passi effettuati t , possiamo definire:
 n  e, x, t  (stato corrente dei registri nella computazione di Pe  x  dopo t passi, ovvero stato
finale se il programma si ferma prima);
jn  e, x, t  (indice dell’istruzione successiva nella computazione di Pe  x  dopo t passi, ovvero
0 se il programma si ferma prima);
cn  e, x, t     n  e, x, t  , jn  e, x, t   (configurazione corrente nella computazione di Pe  x  dopo
t passi).
Per dimostrare la computabilità di cn , definiamola per ricorsione su t :

  n xi 
c
 n  e, x,0      pi ,1
  i 1  , dove, posti   1  cn  e, x, t   e j   2  cn  e, x, t   ,   e j si
c  e, x, t  1    , j 
 n
ottengono mediante la seguente procedura effettiva:
- se j  0 , poniamo     e j  0 ;

- se j  0 , dopo aver costruito Pe   1  e  e settato i registri mediante codifica inversa di  ,


eseguiamo la j -esima istruzione, e codifichiamo   con lo stato corrente dei registri e
impostiamo j uguale all’indice dell’istruzione successiva da eseguire ( 0 se la computazione è
terminata).
Si dimostra che  n  e, x, t  , jn  e, x, t  sono PR, per cui, data l’effettiva calcolabilità appena
mostrata, per la TdC, cn è computabile.

 
Dato che possiamo scrivere  U( n )  e, x    n e, x,  t  jn  e, x, t   0   , deduciamo che la FU è
1
computabile.

Lemma
Sia n  1 .
1. S n  e, x, y , t   " Pe  x   y in al più t passi" è un predicato decidibile.
2. H n  e, x, t   " Pe  x   in al più t passi" è un predicato decidibile.


1. S n  e, x, y, t   jn  e, x, t   0   n  e, x, t  1  y 
2. H n  e, x, t    jn  e, x, t   0 
Una dimostrazione più formale consente di provare che tali predicati sono anche PR.

Corollario
(1° teorema della forma normale di Kleene (FNK1))

Sia n  1 .
U  y  , funzione computabile, e Tn  e, x, z  , predicato decidibile, tali che:
1. e( n )  x    z | Tn  e, x, z  ;
2. e( n )  x   U   z Tn  e, x, z   .

Poniamo Tn  e, x, z   Sn e, x,  z 1 ,  z 2 . 
 
1. Abbiamo e( n )  x   u, v | Sn  e, x, u, v    z | S n e, x,  z 1 ,  z 2   z | Tn  e, x, z  .

 
2. Si ha anche e( n )  x    z Sn e, x,  z 1 ,  z 2     z T  e, x, z  .
1
n 1

Perciò, ponendo U  y    y 1 , otteniamo la tesi.

Dal fatto che S n è PR, si ricava che anche Tn è PR. Quindi il teorema precedente stabilisce che:

Ciascuna funzione computabile si può ottenere da funzioni PR mediante


al più una sola applicazione dell’OM.
Teorema
Il predicato x  TOT  è indecidibile.
1 se  x  TOT
Scriviamo esplicitamente la FC di x ( g  x   c  x    ) e mostriamo che non è
0 altrimenti
computabile.
  x   1 se x  TOT
Poniamo f  x    x . Essa è totale, ma non computabile in quanto,
0 altrimenti
essendo stata definita mediante MdC, è diversa da qualsiasi x .

  x, x   1 se g  x   1
Osserviamo che f  x    U . Quindi, se g  x  fosse computabile, anche
0 altrimenti

f  x  lo sarebbe e ciò è assurdo. Di conseguenza, x  TOT è indecidibile. 

Teorema
Esiste una funzione totale computabile che non è PR.
Si può verificare che è possibile generare in modo sistematico tutte le funzioni PR, nonché i
codici dei programmi che le computano.
Adottiamo la seguente notazione:
Sub  f , g1 ,, g m  , con f funzione m -aria e gi , 1  i  m funzioni n -arie, indica la funzione
ottenuta per composizione, prendendo le gi come argomento della f ;

Rec  f , g  , con f funzione n -aria e g funzione (n  2) -aria, indica la funzione ottenuta per
ricorsione da f e g .
In tal modo, per ogni funzione, possiamo stabilire un piano di definizione che, utilizzando la
notazione suddetta, parta dalle funzioni iniziali e arrivi passo passo a definirla esattamente. Tale
piano è molto simile ad un programma che calcola effettivamente tale funzione.
Adesso, per semplicità, restringiamo il campo alle sole funzioni unarie. Come per i programmi,
possiamo enumerarne i piani in modo effettivo e chiamiamo i la funzione PR unaria definita
dall’ i -esimo piano di definizione. In tal modo, la sequenza  0 ,1 , 2 , è un’enumerazione
effettiva di tutte le funzioni PR unarie. Essendo esse totali e computabili, sia p  i  il codice del
programma che computa i , cioè i   p (i ) .
Per come è stata definita p , essa è anche totale e computabile, in quanto possiamo costruire
programmi che simulino la sostituzione e la ricorsione (cfr. B3 e B4). Allora, se definiamo la
funzione f  x    x  x   1 , avremo f  x    p  x   x   1   U ( p  x  , x )  1 . Essa è la funzione della
nostra tesi in quanto, per costruzione, è totale e computabile, ma non è PR perchè costruita
mediante MdC e quindi diversa da i , i   .
Analogamente si procede per le funzioni di arietà qualsiasi.
Lemma
Siano date x e  y .

È possibile calcolare in maniera effettiva un indice di x   y .


Sia f  x, y , z   x ( z )   y ( z ) . Allora, f  x, y , z    U ( x, z )  U ( y, z ) e quindi essa è computabile.
Per il teorema s-m-n,  s  x, y  , totale e computabile tale che
f  x, y , z   s  x , y   z   s  x , y   x   y . Di conseguenza, un indice di x   y può essere
effettivamente calcolato a partire da x e y .

Lemma
Sia data x .

g  x , totale e computabile, tale che x   g  x  .


2

Sia s  x, y  la funzione trovata nel lemma precedente e definiamo g  x   s  x, x  .


2
In tal modo, g è ovviamente totale e computabile, e si ha g  x   x  x  x  .

Lemma
(unione dei domini)

 s  x, y  , totale e computabile, tale che Ws  x , y   Wx  Wy .


1 se z  Wx  Wy
Sia f  x, y , z    . Fissati x e y , poniamo g x , y  z   f  x, y, z  . Il suo dominio
 altrimenti
sarà Dom  g x , y   Wx  Wy .

 
Dato che f  x, y , z   1  t  H  x, z , t   H  y, z , t   , segue che f è computabile. Per il teorema
s-m-n,  s  x, y  , totale e computabile, tale che f  x, y , z   s  x , y   z   Ws  x , y   Wx  Wy .

Lemma
(codice dell’inversa)

Sia data x , iniettiva.

k  x  , totale e computabile, tale che x1  k  x  .


Sia g  x, y  una funzione computabile, tale che: (a) g  x, y   y  Ex , (b)
y  Ex  g  x, y   Wx  x  g  x, y    y (si dimostra che esiste).

Per il teorema s-m-n,  k  x  , totale e computabile, tale che g  x, y   k  x   y  . Abbiamo:


y  Wk  x   k  x   y   g  x, y   (per la (a))  y  E x . Per cui Wk  x   Ex x   .

Per l’iniettività, si ha    
Dom x1  Ran x  Ex . Sia y  E x ; per la (b), g  x, y   e
1
 
x  g  x, y    y  x k  x   y   y  k  x   y   x1  y  y  E x . Cioè x   k  x  .
E. Decidibilita’

1. Problemi indecidibili
Vi sono vari modi per dire che un predicato è decidibile.

Dato un predicato, se la sua FC è computabile, possiamo dire che è (oltre che


decidibile) ricorsivo, ricorsivamente decidibile, risolvibile, ricorsivamente
risolvibile, calcolabile o che ha il problema della decisione ricorsivo.

Un algoritmo che calcola la FC di un predicato M è detto procedura di


decisione per M (PdD).
Nella teoria del calcolo esistono vari predicati indecidibili, che sono detti anche “problemi”.

Teorema
Sia dato il predicato I  x    x  Wx  .

I  x è indecidibile.
  
Osserviamo innanzitutto che I  x  è logicamente equivalente ai predicati x  x   , Px  x   , 
  x, x    .
U

1 se x  Wx
Ddc f  x   cI  x    non è computabile. Per assurdo lo sia, e costruiamo la
0 altrimenti
0 se x  Wx 0 se f  x   0
funzione g  x     . È ragionevolmente possibile pensare ad una
 altrimenti  altrimenti
procedura effettiva che, a partire dalla f computabile, calcoli anche la g . Quindi, per la TdC,
essa è computabile.
D’altra parte, x  Dom  g   x  Wx x   , cioè Dom  g   Wx x   . Pertanto, g è diversa
da tutte le funzioni computabili, che è assurdo. L’assurdo nasce dall’aver supposto che la FC di
 
I fosse computabile, quindi il predicato x  Wx è indecidibile.

Questo teorema dice che non esiste alcun metodo generale per stabilire se, dato un certo x ,
x  x  sia definita o meno.

Corollario
h computabile tale che  x  Dom  h  e  x  Ran  h  sono entrambi indecidibili.
 x se x  Wx
Poniamo h  x     
, che è computabile per la TdC (o anche h  x   x  1  U  x, x  ).
 altrimenti
Si ha x  Dom  h   x  Wx  x  Ran  h  x   . Pertanto, i predicati  x  Dom  h   e
 x  Ran  h  sono equivalenti al predicato I del teorema precedente. Quindi sono
indecidibili.
Teorema
(problema della fermata, o dell’arresto)

Sia Halt ( x, y )  x  y    .

Halt ( x, y ) è indecidibile,
Osserviamo innanzitutto che Halt  x, y  è logicamente equivalente ai predicati   y    ,
x

 P  y    ,   x, y    .
x U

Per dimostrare l’indecidibilità di Halt , osserviamo che cI  x   cHalt  x, x  , dove I è il predicato


del teorema precedente. Quindi, se Halt fosse decidibile, anche I lo sarebbe, ma abbiamo
visto in precedenza che cI non è computabile, quindi non lo è neanche cHalt .
La conseguenza più importante di questo teorema è che non esiste alcun metodo generale per
stabilire se un programma termina o meno, dato un certo input.

Molti problemi di indecidibilità possono essere risolti mostrando che essi sono almeno “difficili” quanto un altro di
cui si è già dimostrata l’indecidibilità. Tale tecnica è detta “riduzione”.

Dati due predicati M  x  e (h)


1 , diciamo che il primo è riducibile (RID)
M 2( n )  y 

al secondo se esistono k  x  ,, k  x  , totali e computabili, tali che


1 n

M 1( h )  x   M 2( n )  k1  x  ,, kn  x   x   .
h

Se M 1 è RID a M 2 , ogni PdD per M 2 dà luogo ad una PdD per M 1 . Infatti, se M 2 è


(in)decidibile, cM 2  y  è computabile, perciò lo è anche (per sostituzione)
cM 2  k1  x  ,, kn  x    cM1  x  . Di conseguenza, M 1 è (in)decidibile. Spesso, il teorema s-m-n è uno
strumento potente per applicare la tecnica della riduzione.

Teorema
Il predicato x 0  è indecidibile.
0 se x  Wx
Definiamo f  x, y    , che risulta computabile per la TdC (o anche mostrando che
 altrimenti
  
f  x, y   0  U U12  x, y  ,U12  x, y  ). Per il teorema s-m-n,  k  x  , totale e computabile, tale
che f  x, y   k  x   y  .

Osserviamo che x  Wx  f  x, y   0 y    k  x   y   0 y    k  x   0 . Perciò, abbiamo


ridotto il problema  x W  x al problema  x 
 0 . Di conseguenza, dato che il primo è
indecidibile, lo sarà anche il secondo.
Il significato di questo teorema, generalizzato ad una qualsiasi funzione, è che non esiste alcun
metodo generale per stabilire quale funzione è calcolata da un certo programma.
Corollario
Il predicato x  y  è indecidibile.
Sia c   | c  0 e osserviamo che x  0   x  c .
Avendo ridotto il problema del teorema precedente a quello della tesi (tramite le funzioni
 
k1 ( x)  x e k2 ( x)  c ), ne risulta che x   y è indecidibile.

La conseguenza di questo corollario è che non esiste alcun metodo generale per stabilire se due
programmi computino la medesima funzione.

Teorema
(problemi dell’Input e dell’Output)

Sia c   .
I predicati  c  W  e  c  E  sono indecidibili.
x x

 y se x  Wx
Definiamo f  x, y    , che è computabile per la TdC. Allora, per il teorema s-m-n,
 altrimenti
 k  x  , totale e computabile, tale che f  x, y   k  x   y  .

Osserviamo che x  Wx  f  x, y   y  k  x   y   y y    c  Wk  x   c  Ek  x  ; e abbiamo


anche che x  Wx  f  x, y   k  x   y  y    Wk  x   Ek  x     c  Wk  x   c  Ek  x  .

Quindi abbiamo ridotto il problema x  Wx   a quelli della tesi (mediante le funzioni k ( x)  c e


1


k2 ( x)  k  x  ), perciò c  Wx  e  c  E  sono indecidibili.
x

Il significato di questo teorema è che non esiste alcun metodo generale per stabilire se un certo
input sarà accettato da un programma o se tale programma darà un certo output. Per questo
motivo, tali problemi vengono chiamati anche “problema dell’accettazione” e “problema della
stampa”.

Teorema
(di Rice)

Siano B  C1 non banale ( B  , B  C1 ) e R B  x    x  B .

RB  x è indecidibile.
Per assurdo, sia R B  x  decidibile e sia c B  x  la sua FC. Sia inoltre f  x  x   .

Possiamo supporre SPdG che f  x   B , in quanto, se così non fosse, potremmo sostituire
C1  B al posto di B in quanto cC1 - B  x   sg  c B  x   , che è computabile.

 g  y  se x  Wx
Prendiamo g  B e definiamo f  x, y    , che è computabile per la TdC.
f
   y  altrimenti
Quindi, per il teorema s-m-n,  k  x  , totale e computabile, tale che f  x, y   k  x   y  .

Osserviamo che x  W  k  x   g  k  x   B e x  W  k  x   f  k  x   B . Quindi



abbiamo ridotto x  Wx  a R  x  , per cui quest’ultimo non è decidibile.
B
Il 10° problema di Hilbert, che pone la questione di stabilire se esiste un algoritmo che dica se una data equazione
diofantea ha soluzione è indecidibile (le equazioni diofantee cercano gli zeri interi di un polinomio a molte variabili a
coefficienti interi).
Il problema della validità per logica del 1° ordine è indecidibile.
Il problema della parola per i gruppi è indecidibile.

2. Predicati parzialmente decidibili


1 se M  x  vale
Dato un predicato M , la funzione cM  x    è detta funzione
 altrimenti
caratteristica parziale (FCP) di M .

Un predicato si dice parzialmente decidibile (PD) se la sua FCP è


computabile. Un algoritmo che calcola la FCP di un predicato M è detto
procedura di semi-decisione per M (PdSD).
Dato un predicato, se la sua FCP è computabile, possiamo dire che è (oltre che PD)
parzialmente ricorsivo, semi-computabile, ricorsivamente enumerabile,
parzialmente risolvibile, o che ha il problema della decisione parzialmente
ricorsivo.

Lemma
1. Il predicato I  x  è PD.
2. Il problema della fermata è PD.
3. Il predicato I  x    x  Wx  non è PD.
1 se x  Wx
1. Scriviamo la FCP di I  x  : cI  x    . Essa è computabile per la TdC, ovvero
 altrimenti
 
osservando che cI  x   1  U  x, x  .

1 se  x  y  
2. Scriviamo la FCP di Halt  x, y  : cHalt  x, y    . Essa è computabile per la TdC,
 altrimenti

ovvero osservando che cHalt  x, y   1  U  x, y  .
3. È banale, in quanto x  Dom  cI   x  Wx . Quindi Dom  cI   Wx x   , quindi cI non può
essere computabile.
Lemma
(dell’inclusione)

Sia M un predicato decidibile.


M è PD.
1 se cM  x   1
Per ipotesi, cM è computabile. Definiamo cM  x    , che è computabile per la
 altrimenti
TdC. Ma osserviamo che cM è equivalente alla FCP di M . Quindi M è PD.

Lemma
Sia g  x  computabile.

Il predicato I g  x    x  Dom  g   è PD.


Basta osservare che cI g  x   1  g  x   , che è computabile.

Teorema
(1ª caratterizzazione dei predicati PD)

M x  è PD sse  g  x computabile tale che M  x   x  Dom  g  .

 ) Sia M  x  PD. La sua FCP è computabile e si ha M  x   cM  x   1  x  Dom  cM  . Allora


la CN è provata per g  cM .

 ) Sia g  x  computabile. Dal teorema precedente ricaviamo che M  x   I g  x  computabile.

Teorema
(2ª caratterizzazione dei predicati PD: ricerca non limitata)

Sia dato il predicato M  x  .

M x  è PD sse  R  x, y  decidibile tale che M  x    y | R  x, y  .

 ) Sia M  x  PD. La sua FCP è computabile e, essendo e il codice di un programma che


computa cM e n l’arietà di x , si ha M  x   cM  x   x  Dom  cM    y | H n  e, x, y  .
Essendo H n decidibile, abbiamo che , fissato e , R  H n .

 ) Sia R  x, y  un predicato decidibile tale che M  x    y | R  x, y  . Consideriamo la funzione


f  x    y R  x, y  , che è computabile, e osserviamo che cM  x   1  f  x   . Quindi anche la
FCP di M  x  sarà computabile. Di conseguenza, M  x  è PD.

Il teorema precedente mostra che le PdSD possono essere sempre convertite nella forma di una
ricerca illimitata di un numero avente una proprietà espressa sotto forma di predicato decidibile.
In maniera naturale questa ricerca verrà effettuata provando per 0,1,2, fino a trovare tale numero, se il
programma si ferma. Se tale numero non esiste, il programma non si fermerà e ciò è proprio il significato della
parziale decidibilità di un predicato.
Teorema
(Quantificazione esistenziale dei predicati PD)

Sia M  x, y  un predicato PD.

Il predicato   y | M  x, y  è PD.
Dal teorema precedente,  R  x, y, z  , decidibile, tale che M  x, y    z | R  x, y , z  . Abbiamo
 
y | M  x, y   y  z | R  x, y , z    w | R x,  w 1 ,  w 2 , dove w è una CE della coppia  y, z  .
 
Quindi R  x, w   R x,  w 1 ,  w 2 è decidile e, per il teorema precedente,   y | M  x, y   è PD.

Questo teorema indica che i predicati PD sono chiusi rispetto alla quantificazione esistenziale.

Corollario
Sia M  x, y1 , ym  un predicato PD.

Il predicato   y , y
1 m | M  x, y1, ym   è PD.

Lemma
1. Il predicato  x  E  è PD. ( n)
y

2. Il predicato W    è PD.x

1. Osserviamo che x  E y( n )   z1, zn , t | S n  y, z, x, t  . Per il corollario precedente, il secondo


membro della coimplicazione è PD (perché S n è decidibile, quindi anche PD). Di conseguenza
lo è anche il primo.
2. Osserviamo che Wx( n )    z  Wx( n)   z1 , z n , t | H n  y , z, x  . Per il corollario precedente,
l’ultimo membro della coimplicazione è PD (perché H n è decidibile, quindi anche PD). Di
conseguenza lo è anche il primo.

Teorema
(decidibilità dagli opposti)

M x  è decidibile sse M x  e M  x  sono entrambi PD.


 ) Sia M  x  decidibile. Anche M  x  lo è. Per il lemma dell’inclusione, entrambi sono PD.

 ) Siano M  x  e M  x  entrambi PD. Allora, le loro FCP sono computabili e siano P e P i


rispettivi programmi che le computano. Possiamo scrivere una procedura effettiva che calcoli
cM nel modo seguente:
- si computino contemporaneamente P e P un passo alla volta con lo stesso input x ;
- se si ferma prima P , si ponga cM  x   1 , altrimenti si ponga cM  x   0 .

Per la TdC, risulta che cM è computabile, e quindi M  x  è decidibile.

Il teorema precedente fornisce una dimostrazione alternativa della non parziale decidibilità di I  x  .
Teorema
(predicabilità di una funzione)

Sia f  x  una funzione parziale.

f  x è computabile sse il predicato  f  x   y  è PD.


 ) Sia f  x  computabile. Allora,  e | e( n)  f . Osserviamo che f  x   y  t | Sn  e, x, y, t  .
Essendo il secondo membro della coimplicazione PD, anche il primo membro lo è.
 ) Sia  f x  y  PD. Per il teorema della ricerca non limitata,  R  x, y , t  decidibile tale che
 
f  x   y  t | R  x, y, t  . Poiché f  x    y  t | R  x, y, t  , si ha f  x    z R x,  z 1 ,  z 2 , che
è computabile. Di conseguenza anche f  x  lo è.

3. Insiemi ricorsivi

Dato un predicato unario M , l’insieme x | M  x  vale è detto estensione di M .


1 se x  A
Dato un insieme A , la funzione cA  x    è detta funzione
0 altrimenti
caratteristica (FC) di A.

Un insieme si dice ricorsivo o computabile se la sua FC è computabile,


cioè se il predicato  x  A  è decidibile.
h
Analoghe definizioni valgono per i sottoinsiemi di N , h  1 .

Elenchiamo alcuni insiemi ricorsivi noti:  ,  ,



x | x%2  0 , a0 , a1,, an  , x | Pr  x  . Invece i seguenti


insiemi non sono ricorsivi: x | x  TOT  , x | x W  , x | 
x x 
0 .

Teorema
Siano A e B insiemi ricorsivi.
Gli insiemi A B, A B, A B e A sono ricorsivi,
Siano M A  x    x  A  e M B  x    x  B  . Per ipotesi, essi sono decidibili. Allora, tali saranno
pure M A  x   M B  x    x  A  x  B   M A B  x  , M A  x   M B  x    x  A  x  B   M A B  x  ,
M A  x   M B  x    x  A  x  B   M A  B  x  e M A  x    x  A   M A  x  .

Di conseguenza, gli insiemi A  B , A  B , A  B e A sono ricorsivi.


4. Insiemi ricorsivamente enumerabili
1 se x  A
Dato un insieme A , la funzione cA  x    è detta funzione
 altrimenti
caratteristica parziale di A.

Un insieme si dice ricorsivamente enumerabile (RE), semi-computabile


o semi-ricorsivo se la sua FCP è computabile, cioè se il predicato  x  A  è
PD.
h
Analoghe definizioni valgono per i sottoinsiemi di N , h  1 .

  
Elenchiamo alcuni insiemi RE, ma non ricorsivi, noti: x | x  Wx , x | Wx   , Ran  f  (con f computabile).

Lemma
(dell’inclusione)

Sia A un insieme ricorsivo.


A è RE.
Per ipotesi,  x  A  è decidibile, quindi è anche PD. Di conseguenza, A è RE.

Teorema
(del dominio)

Sia A   .
A è RE sse A è il dominio di una funzione unaria computabile.
A è RE   x  A è PD  (per la 1ª caratterizzazione dei predicati PD) 
 g  C1 |  x  A  x  Dom  g    g  C1 | A  Dom  g  .

Secondo il teorema precedente, possiamo enumerare (con ripetizioni) tutti gli insiemi RE,
enumerando i vari domini W0 , W1 ,W2 , .

Dato A, insieme RE, chiamiamo indici di A gli infiniti valori e   | A  We .

Teorema
Sia A   .
A è RE sse  R  x, y  decidibile tale che x  A   y | R  x, y  .

A è RE   x  A è PD  (per la 2ª caratterizzazione dei predicati PD)   R  x, y 


decidibile tale che  x  A   y | R  x, y   .
Teorema
(Quantificazione esistenziale degli insiemi RE)

Sia M  x, y1 , ym  un predicato PD.

L’insieme x |   y1 , ym | M  x, y1 , ym   è RE.
Per il corollario al teorema sulla quantificazione esistenziale dei predicati PD, anche
 
  y1 , ym | M  x, y1, ym  è PD, per cui x |   y1 , ym | M  x, y1 , ym  è RE.

Teorema
(enumarabilità dagli opposti)

Sia A   .
A è ricorsivo sse A e A sono entrambi RE.
 ) Sia A ricorsivo. Anche A lo è. Per il lemma dell’inclusione, entrambi sono PD.
 ) Siano A e A entrambi RE. Allora  R  x, y  , S  x, y  decidibili, tali che x  A   y | R  x, y 
e x  A   y | S  x, y  . Di conseguenza, x    y | vale R  x, y  o S  x, y  , ma non entrambi.

Quindi, la funzione f  x    y  R  x, y   S  x, y   è computabile e totale. Di conseguenza, il


predicato T  x   R  x, f  x   è decidibile e, dall’osservazione che x  A  T  x  , si ricava che
A è ricorsivo.

Teorema
(Caratterizzazione degli insiemi RE)

Sia A   .
Le seguenti asserzioni sono equivalenti:
a) A è RE
b) A oppure A è il codominio di una funzione unaria computabile e totale
c) A è il codominio di una funzione n -aria computabile (parziale)
a  b) Sia A RE e non vuoto, e sia a  A . Allora,  f | A  Dom  f  e sia e   | f  e .

 x se Pe  x   in al più t passi
Definiamo g  x, t    : nel primo caso, otteniamo x , che
a altrimenti
appartiene ad A perché A  Dom  f  e Pe computa f ; nel secondo caso, a  A per ipotesi.
Quindi, A  Ran  g  , e g è computabile e totale, per com’è definita. Per trovare la funzione
 
della tesi, che chiamiamo h , basta porre h  z   g  z 1 ,  z 2 e osservare che Ran  g   Ran  h  .

b  c) Banale: basta porre n  1 .


c  a) Sia A  Ran  h  , con h :  n   computabile. Si ha x  A   y1 ,, yn | h  y1,, yn   x .
Dato che il predicato  h  y1,, yn   x  è PD, per il corollario al teorema sulla quantificazione
esistenziale, tale sarà anche   y1 ,, yn | h  y1,, yn   x  . Di conseguenza, x  A è PD.
L’equivalenza a  b del teorema precedente è quella che giustifica la denominazione “RE”.
Infatti, la funzione h consente di enumerare in maniera effettiva gli elementi di
A  h  0  , h 1 , h  2  , . Inoltre, possiamo enumerare (con ripetizioni) tutti gli insiemi RE,
enumerando i vari codomini E0 , E1 , E2 , .

Un’altra caratterizzazione informale degli insiemi RE è quella per cui esiste una procedura
effettiva in grado di generare tutti gli elementi. Infatti, se un insieme è così generato, possiamo
definire la funzione f tale che, per ogni i   , f  i  sia l’ (i  1) -esimo elemento generato da tale
procedura. Per la TdC, f è computabile, e avremo A  Ran  f  .

Teorema
Sia Tx  x | x  TOT  .

Tx non è RE.
Per assurdo, Tx sia RE. Allora, per il teorema precedente,  f  C1 | Tx  Ran  f  e poniamo
g  x    f  x   x   1 , che sarà totale e computabile. Per questo motivo,  n   | g   f  n  , e
avremo  f  n  n   g  n    f  n   n   1 , che è assurdo. Quindi Tx non è RE.

Teorema
Siano A e B RE.
A B e A B sono RE.
Ovviamente se A   e B   , A  B e A  B sono entrambi vuoti e quindi RE.
Altrimenti, per il teorema sulla caratterizzazione degli insiemi RE,  f , g  C1 , totali, tali che
A  Ran  f  , B  Ran  g  .

  x
f  2 se x è pari
  
Definiamo h  x    e, dato che h  C1 e A  B  Ran  h  , A  B è RE.
 g  x  1  altrimenti
  2 

Per il teorema del dominio,  f , g  C1 | A  Dom  f  , B  Dom  g  . Allora, A  B  Dom  fg  e,


poiché fg è computabile, avremo che A  B è RE.
Teorema
(Ricorsività degli insiemi infiniti)

Sia A   infinito.
A è ricorsivo sse è il codominio di una funzione unaria, totale e computabile,
crescente.
 ) Sia A ricorsivo. Allora può essere enumerato dalla seguente funzione definita per
 f  0    y  y  A 
ricorsione:  . Essa è ovviamente crescente e unaria, ed è totale
 f  n  1   y  y  A  f  n   y 
e computabile, perché ottenuta mediante composizione e ricorsione, e per la ricorsività di A .
 ) Sia f  C1 | A  Ran  f  , con f totale e crescente, cioè n   f  n   n .

Quindi y  A  y  Ran  f   n  y | f  n   y , che è un predicato decidibile. Quindi A è


ricorsivo.

Teorema
(Ricorsività dei sottoinsiemi)

Sia A   infinito e RE.


B  A infinito e ricorsivo.
Per la caratterizzazione degli insiemi RE,  f  C1  TOT | A  Ran  f  , e definiamo per
 g  0   f  0 
ricorsione  . Per com’è definita, la funzione g è totale,
 
 g  n  1  f  y  f  y   g  n  
computabile e crescente Inoltre Ran  g   Ran  f   A  B  Ran  g  , che è l’insieme cercato.

Diremo che una funzione f è finita se Dom  f  è un insieme finito.

Date due funzioni f e g , diremo che f è la restrizione di g, e scriveremo f g,


se f  x   g  x  x  Dom  f  .

Lemma
Sia f finita.
f è computabile,

Teorema
(di Rice-Shapiro)

Sia A  C1 | x | x  A è RE.

f  C1, f  A    A |   f , con  finita.


Corollario
Sia T  x | x  TOT  e T  x |  x  TOT .
T e T non sono RE.
Siano A   f  C1 | f  TOT  e f  A . Se prendiamo una qualsiasi   f , finita, sarà
necessariamente   A , perchè in A vi sono solo funzioni totali.
Quindi, per il teorema di Rice-Shapiro, T non è RE.
Ora siano A   f  C1 | f  TOT  e f  TOT  f  A . Se prendiamo una qualsiasi   f ,
finita, avremo necessariamente   A perché in A vi sono solo funzioni non totali.
Quindi, per il teorema di Rice-Shapiro, T non è RE.

Bibliografia

D. Cantone, Appunti di Calcolabilità, Dipartimento di Matematica e Informatica, Università


degli Studi di Catania, 2008-09
N.J. Cutland, Computability: an introduction to recursive function theory, Cambridge University
Press, Cambridge - UK, 1986
G. Gallo, Appunti di Computabilità e Complessità, Dipartimento di Matematica e Informatica,
Università degli Studi di Catania, 1991-92
M.D. Davis, R. Sigal, E.J. Weyuker, Computability, Complexity, and Languages: Fundamentals
of Theoretical Computer Science, Academic Press, New York, 1994