Sei sulla pagina 1di 26

Codifica di programmi

Gianluca Gippetto
1
Studente del CdL in Informatica
Universit degli Studi di Palermo
Anno accademico 2010-11
1
Slide basate sul testo: Davis,Sigal,Weyuker Computability, Complexity and
Languages
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 1 / 26
Indice
1
Metodi di codifica
Funzione coppia
Numeri di Gdel
2
Codifica di programmi
Codica di unistruzione
Codica di un programma
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 2 / 26
La funzione coppia
In matematica, una funzione coppia una funzione biunivoca del tipo
N
2
N, ossia una funzione che codica coppie di numeri naturali in un
singolo numero naturale. Noi utilizzeremo la seguente:
Definizione
Chiameremo funzione coppia la seguente
x, y = 2
x
(2y + 1) 1
Anch la funzione coppia sia eettivamente un buon metodo di codica,
lequazione
x, y = z
deve ammettere ununica soluzione. Proviamo che cos.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 3 / 26
Biunivocit della funzione coppia
Dalla equazione
2
x
(2y + 1) 1 = z
otteniamo la seguente
2y + 1 =
z + 1
2
x
Dovendo essere il II membro un numero naturale dispari, si deduce che x
necessariamente il massimo naturale tale che 2
x
|z + 1. Dal momento che x
univocamente determinato, lo anche y.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 4 / 26
Funzioni l ed r per la decodifica
Lequazione x, y = z denisce quindi le due funzioni:
l(z) = x r(z) = y
(l da left, sinitra) (r da right, destra)
Poich x, y < z + 1, abbiamo che l(z) z ed r(z) z. Questo ci
permette di scrivere:
l(z) = min
xz

(y)
z
(z = x, y)

r(z) = min
yz

(x)
z
(z = x, y)

Le funzioni l ed r sono dunque ricorsive primitive.


G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 5 / 26
Esempio di decodifica
Ricordando che z = x, y = 2
x
(2y + 1) 1.
Sia z = 35. Si ha:
2y + 1 =
36
2
x
Il massimo naturale x tale che 2
x
divide 36 2. Da cui:
2y + 1 =
36
4
= 9 = y = 4
Riassumendo:
2, 4 = 35
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 6 / 26
Riepilogo
Teorema (della funzione coppia)
Le funzioni x, y, l(z), r(z) hanno le seguenti propriet:
1
sono ricorsive primitive
2
l(x, y) = x
3
r(x, y) = y
4
l(z), r(z) = z
5
l(z), r(z) z
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 7 / 26
Numeri di Gdel
Definizione
Chiamiamo numero di Gdel della n-upla (a
1
, . . . , a
n
) il numero
[a
1
, . . . , a
n
] =
n

i=1
p
a
i
i
dove p
i
denota li-esimo numero primo.
Per esempio:
[2, 11, 4, 7, 6] = 2
2
3
11
5
4
7
7
11
6
Dimostreremo dopo che [a
1
, . . . , a
n
] ricorsiva primitiva.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 8 / 26
Bont della codifica
Il teorema fondamentale dellaritmetica, il quale aerma che un intero
esprimibile in un unico modo come prodotto di numeri primi (a meno
dellordine dei fattori), ci assicura che la numerazione di Gdel gode della
propriet di unicit:
[a
1
, . . . , a
n
] = [b
1
, . . . , b
n
] (a
1
, . . . , a
n
) = (b
1
, . . . , b
n
)
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 9 / 26
Unosservazione sulla codifica
Osserviamo per che, data una sequenza s, ogni altra sequenza t ottenuta
da s aggiungendovi uno o pi 0 consecutivi alla ne (a destra), ha il
medesimo numero di Gdel di s:
[a
1
, . . . , a
n
] = [a
1
, . . . , a
n
, 0]
poich p
0
n+1
= 1
Dal momento che
1 = 2
0
= 2
0
3
0
= 2
0
3
0
5
0
= . . .
naturale porre 1 come il numero di Gdel della sequenza vuota di
lunghezza 0.
N.B.: non accade la stessa cosa di sopra aggiungendo degli 0 a sinistra!
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 10 / 26
Ricorsivit primitiva di [a
1
, . . . , a
n
]
Le funzioni che compaiono nella denizione di [a
1
, . . . , a
n
] sono:
produttoria,
elevamento a potenza,
successione p
i
dei numeri primi.
Sappiamo gi che le prime due sono ricorsive primitive, ci rimane da
dimostrare che lo anche la successione p
i
dei numeri primi.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 11 / 26
Ricorsivit primitiva di p
i
(1)
Anch p
i
sia ricorsiva primitiva, deve essere una funzione totale, quindi
denita anche per i = 0: porremo p
0
= 0.
La denizione sar una cosa di questo tipo:

p
0
= 0
p
n+1
= min
tH

Primo(t) t > p
n

Il problema quello di ssare, per ogni n, un H sicuramente maggiore o


uguale di p
n+1
.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 12 / 26
Ricorsivit primitiva di p
i
(2)
Ci viene in aiuto la tecnica utilizzata da Euclide per dimostrare che esistono
inniti numeri primi.
1
Dati i primi n numeri primi, consideriamo il numero:
Q
n
= p
1
. . . p
n
+ 1
2
Q
n
non divisibile per nessuno dei primi n numeri primi; infatti, per
1 i n si ha:
Q
n
p
i
=
p
1
. . . p
n
+ 1
p
i
= p
1
. . . p
i1
p
i+1
. . . p
n
+
1
p
i
3
Concludiamo che Q
n
o primo, oppure divisibile per un numero
primo maggiore di p
n
.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 13 / 26
Ricorsivit primitiva di p
i
(3)
Conseguenze del ragionamento precedente:
esistono inniti numeri primi (ci che voleva trovare Euclide);
Per ogni n, Q
n
q
n+1
(ci che interessa noi in questo momento).
Q
n
dunque un buon limite da imporre alla minimalizzazione limitata.
E a maggior ragione lo il numero p
n
! + 1 Q
n
. Porremo perci:

p
0
= 0
p
n+1
= min
tp
n
!+1

Primo(t) t > p
n

Concludiamo che p
i
ricorsiva primitiva, e di conseguenza ricorsiva
primitiva anche la funzione di Gdel .
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 14 / 26
Decodifica di un numero di Gdel
Vogliamo denire una funzione che applicata al numero di Gdel x ci
fornisca li-esimo termine della n-upla codicata da x, cio tale che se
x = [a
1
, . . . , a
n
], allora:
(x)
i
= ([a
1
, . . . , a
n
])
i
= a
i
E facile convincersi che (x)
i
il massimo esponente k tale che p
k
i
|x.
Possiamo dunque denire (x)
i
come segue:
(x)
i
= min
tx

(p
t+1
i
|x)

La funzione (x)
i
evidentemente ricorsiva primitiva.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 15 / 26
Lunghezza della ennupla codificata
Unaltra cosa che gradiremmo conoscere di un numero di Gdel x la
lunghezza della n-upla che codica.
Essa coincide con lindice i del numero primo pi grande che divide x.
La funzione cercata pu ottenersi nel modo seguente
2
:
Lt(x) = min
ix

(x)
i
= 0 (j)
x
(j i (x)
j
= 0)

Essa evidentemente ricorsiva primitiva.


2
Lt sta per lenght, lunghezza
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 16 / 26
Codifica di programmi
In questa sezione, vedremo come associare a ciascun programma P nel
linguaggio S un numero, che indicheremo con #(P), in modo tale
che P pu essere integralmente ricostruito a partire da #(P).
Naturalmente utilizzeremo i metodi di codica appena visti. In
particolare, dato un programma P:

codicheremo ogni istruzione di P (singolarmente) utilizzando la


funzione coppia;

applicheremo poi alla lista (ordinata) dei codici delle istruzioni cos
ottenuta, la funzione di Gdel , trovando il codice dellintero
programma.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 17 / 26
Codifica di unistruzione: elementi in gioco
Quali elementi caratterizzano una istruzione del linguaggio S a parte la
posizione che essa occupa allinterno del programma?
1
Il tipo di istruzione (incremento, decremento, . . . )
2
La variabile coinvolta
3
Leventuale etichetta
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 18 / 26
Numerazione di variabili ed etichette
Ordiniamo variabili ed etichette come segue:
Y, X
1
, Z
1
, X
2
, Z
2
, X
3
, Z
3
, . . .
A
1
, B
1
, C
1
, D
1
, E
1
, A
2
, B
2
, C
2
, . . .
Denoteremo con #(V ) e con #(L) rispettivamente la posizione della
variabile V e la posizione delletichetta L nellordinamento dato.
Riferendoci agli elenchi sopra, avremo per esempio:
#(X
2
) = 4, #(Z
1
) = 3
#(C
1
) = 3, #(A
2
) = 6
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 19 / 26
Codifica di unistruzione
Sia I unistruzione. Deniamo:
#(I) = a, b, c
dove:
1
Se I ha unetichetta L, allora a = #(L) , altrimenti a = 0.
2
Se la variabile V compare in I, allora c = #(V ) 1
3
Il valore di b varia a seconda del tipo di istruzione:
Tipo istruzione Valore di b
V V 0
V V + 1 1
V V 1 2
if V = 0 goto A #(A) + 2
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 20 / 26
Decodifica di unistruzione
Teorema
Per ogni numero dato q, vi ununica istruzione I tale che #(I) = q.
I tre a, b, c tali che a, b, c = q sono infatti univocamente determinati:
a = l(q), b = l(r(q)), c = r(r(q))
Ottenuti a, b, c, basta seguire al contrario le indicazioni della slide
precedente per trovare listruzione I:
1
se a = 0, I non etichettata,
altrimenti ha la a-esima etichetta della lista;
2
la variabile V coinvolta la (c + 1)-esima della lista;
3
listruzione sar:
V V se b = 0
V V + 1 se b = 1
V V 1 se b = 2
if V = 0 goto A se b > 2 e b 2 = #(A)
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 21 / 26
Codifica di un programma
Dato un programma P, composto dalla sequenza di istruzioni I
1
, . . . , I
n
,
deniamo #(P) come il numero di Gdel della sequenza #(I
1
), . . . , #(I
n
)
diminuito di 1:
#(P) = [#(I
1
), . . . , #(I
n
)] 1
Naturalmente, per ricostruire un programma P a partire da #(P) sar
suciente:
Trovare x = #(P) + 1 = [#(I
1
), . . . , #(I
n
)]
Per j = 1 n:

estrarre il codice della j-esima istruzione del programma: #(I


j
) = (x)
j

decodicare listruzione I
j
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 22 / 26
Esempio di codifica di un programma (1)
Si consideri il seguente programma:
[A] X X + 1 (I
1
)
if X = 0 goto A (I
2
)
Abbiamo #(I
1
) = 1, 1, 1:
a = 1, poich letichetta A occupa la prima posizione.
b = 1, poich listruzione del tipo V V + 1
c = #(X) 1 = 2 1 = 1
Eettuando i calcoli:
1, 1 = 2
1
(2 1 + 1) 1 = 5
1, 5 = 2
1
(2 5 + 1) 1 = 21
#(I
1
) = 21
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 23 / 26
Esempio di codifica di un programma (2)
La seconda istruzione da codicare
if X = 0 goto A
Abbiamo #(I
2
) = 0, 3, 1
a = 0, poich listruzione non etichettata
b = #(A) + 2 = 3
c = #(X) 1 = 1
Eettuando i calcoli:
3, 1 = 2
3
(2 1 + 1) 1 = 23
0, 23 = 2
0
(2 23 + 1) 1 = 46
#(I
2
) = 46
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 24 / 26
Esempio di codifica di un programma (3)
Concludiamo che:
#(P) = [#(I
1
), #(I
2
)] 1
= [21, 46] 1
= 2
21
3
46
1
= 18 586 928 403 505 481 978 329 694 207
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 25 / 26
Zeri e codifica di Gdel
In precedenza, avevamo osservato che, data una sequenza s, ogni altra
sequenza t ottenuta da s aggiungendovi uno o pi 0 consecutivi a destra,
ha il medesimo numero di Gdel di s.
Lambiguit facilmente eliminabile, decretando che nessun programma
pu terminare con listruzione Y Y .
Tale istruzione appunto quella di codice 0, ottenendosi da 0, 0, 0 = 0
a = 0, poich listruzione non etichettata.
b = 0, per il tipo di istruzione.
c = #(Y ) 1 = 1 1 = 0.
G.Gippetto (Studente Unipa) Codifica di programmi A.A. 2010-11 26 / 26