Sei sulla pagina 1di 26

Codifica di programmi

Gianluca Gippetto

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

Metodi di codifica
Funzione coppia
Numeri di Gdel

Codifica di programmi
Codifica di unistruzione
Codifica 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
N2 N, ossia una funzione che codifica coppie di numeri naturali in un
singolo numero naturale. Noi utilizzeremo la seguente:

Definizione
Chiameremo funzione coppia la seguente
hx, yi = 2x (2y + 1) 1
Affinch la funzione coppia sia effettivamente un buon metodo di codifica,
lequazione
hx, yi = 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
2x (2y + 1) 1 = z
otteniamo la seguente
z+1
2x
Dovendo essere il II membro un numero naturale dispari, si deduce che x
necessariamente il massimo naturale tale che 2x |z + 1. Dal momento che x
univocamente determinato, lo anche y.
2y + 1 =

G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

4 / 26

Funzioni l ed r per la decodifica

Lequazione hx, yi = z definisce quindi le due funzioni:


l(z) = x
(l da left, sinitra)

r(z) = y
(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 (y)z (z = hx, yi)
xz


r(z) = min (x)z (z = hx, yi)
yz

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 = hx, yi = 2x (2y + 1) 1.


Sia z = 35. Si ha:
36
2y + 1 = x
2
x
Il massimo naturale x tale che 2 divide 36 2. Da cui:
2y + 1 =

36
=9
4

y=4

Riassumendo:
h2, 4i = 35

G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

6 / 26

Riepilogo

Teorema (della funzione coppia)


Le funzioni hx, yi, l(z), r(z) hanno le seguenti propriet:
1

sono ricorsive primitive

l(hx, yi) = x

r(hx, yi) = y

hl(z), r(z)i = z

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 (a1 , . . . , an ) il numero
[a1 , . . . , an ] =

n
Y

pai i

i=1

dove pi denota li-esimo numero primo.


Per esempio:
[2, 11, 4, 7, 6] = 22 311 54 77 116
Dimostreremo dopo che [a1 , . . . , an ] ricorsiva primitiva.

G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

8 / 26

Bont della codifica

Il teorema fondamentale dellaritmetica, il quale afferma 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:
[a1 , . . . , an ] = [b1 , . . . , bn ]

G.Gippetto (Studente Unipa)

(a1 , . . . , an ) = (b1 , . . . , bn )

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 fine (a destra), ha il
medesimo numero di Gdel di s:
[a1 , . . . , an ] = [a1 , . . . , an , 0]
poich p0n+1 = 1
Dal momento che
1 = 20 = 20 30 = 20 30 50 = . . .
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 [a1 , . . . , an ]

Le funzioni che compaiono nella definizione di [a1 , . . . , an ] sono:


produttoria,
elevamento a potenza,
successione pi dei numeri primi.
Sappiamo gi che le prime due sono ricorsive primitive, ci rimane da
dimostrare che lo anche la successione pi dei numeri primi.

G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

11 / 26

Ricorsivit primitiva di pi (1)

Affinch pi sia ricorsiva primitiva, deve essere una funzione totale, quindi
definita anche per i = 0: porremo p0 = 0.
La definizione sar una cosa di questo tipo:
(
p0 = 0


pn+1 = mintH Primo(t) t > pn
Il problema quello di fissare, per ogni n, un H sicuramente maggiore o
uguale di pn+1 .

G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

12 / 26

Ricorsivit primitiva di pi (2)


Ci viene in aiuto la tecnica utilizzata da Euclide per dimostrare che esistono
infiniti numeri primi.
1

Dati i primi n numeri primi, consideriamo il numero:


Qn = p1 . . . pn + 1

Qn non divisibile per nessuno dei primi n numeri primi; infatti, per
1 i n si ha:
p1 . . . pn + 1
1
Qn
=
= p1 . . . pi1 pi+1 . . . pn +
pi
pi
pi

Concludiamo che Qn o primo, oppure divisibile per un numero


primo maggiore di pn .

G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

13 / 26

Ricorsivit primitiva di pi (3)

Conseguenze del ragionamento precedente:


esistono infiniti numeri primi (ci che voleva trovare Euclide);
Per ogni n, Qn qn+1 (ci che interessa noi in questo momento).
Qn dunque un buon limite da imporre alla minimalizzazione limitata.
E a maggior ragione lo il numero pn ! + 1 Qn . Porremo perci:
(
p0 = 0


pn+1 = mintpn !+1 Primo(t) t > pn
Concludiamo che pi 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 definire una funzione che applicata al numero di Gdel x ci


fornisca li-esimo termine della n-upla codificata da x, cio tale che se
x = [a1 , . . . , an ], allora:
(x)i = ([a1 , . . . , an ])i = ai
E facile convincersi che (x)i il massimo esponente k tale che pki |x.
Possiamo dunque definire (x)i come segue:

(x)i = min (pt+1
i |x)
tx

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 codifica.
Essa coincide con lindice i del numero primo pi grande che divide x.
La funzione cercata pu ottenersi nel modo seguente 2 :
h
i
Lt(x) = min (x)i 6= 0 (j)x (j i (x)j = 0)
ix

Essa evidentemente ricorsiva primitiva.

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 codifica appena visti. In
particolare, dato un programma P:
codificheremo 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, . . . )

La variabile coinvolta

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, X1 , Z1 , X2 , Z2 , X3 , Z3 , . . .
A1 , B1 , C1 , D1 , E1 , A2 , B2 , C2 , . . .
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:

G.Gippetto (Studente Unipa)

#(X2 ) = 4,

#(Z1 ) = 3

#(C1 ) = 3,

#(A2 ) = 6

Codifica di programmi

A.A. 2010-11

19 / 26

Codifica di unistruzione
Sia I unistruzione. Definiamo:
#(I) = ha, hb, cii
dove:
1

Se I ha unetichetta L, allora a = #(L) , altrimenti a = 0.

Se la variabile V compare in I, allora c = #(V ) 1

Il valore di b varia a seconda del tipo di istruzione:


Tipo istruzione
V
V
V
if

G.Gippetto (Studente Unipa)

V
V +1
V 1
V 6= 0 goto A

Codifica di programmi

Valore di b
0
1
2
#(A) + 2

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 ha, hb, cii = 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 6= 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 I1 , . . . , In ,


definiamo #(P ) come il numero di Gdel della sequenza #(I1 ), . . . , #(In )
diminuito di 1:
#(P ) = [#(I1 ), . . . , #(In )] 1
Naturalmente, per ricostruire un programma P a partire da #(P ) sar
sufficiente:
Trovare x = #(P ) + 1 = [#(I1 ), . . . , #(In )]
Per j = 1 n:
estrarre il codice della j-esima istruzione del programma: #(Ij ) = (x)j
decodificare listruzione Ij

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
(I1 )
if X 6= 0 goto A (I2 )
Abbiamo #(I1 ) = h1, h1, 1ii:
a = 1, poich letichetta A occupa la prima posizione.
b = 1, poich listruzione del tipo V V + 1
c = #(X) 1 = 2 1 = 1
Effettuando i calcoli:
h1, 1i = 21 (2 1 + 1) 1 = 5
h1, 5i = 21 (2 5 + 1) 1 = 21
#(I1 ) = 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 codificare
if X 6= 0 goto A
Abbiamo #(I2 ) = h0, h3, 1ii
a = 0, poich listruzione non etichettata
b = #(A) + 2 = 3
c = #(X) 1 = 1
Effettuando i calcoli:
h3, 1i = 23 (2 1 + 1) 1 = 23
h0, 23i = 20 (2 23 + 1) 1 = 46
#(I2 ) = 46
G.Gippetto (Studente Unipa)

Codifica di programmi

A.A. 2010-11

24 / 26

Esempio di codifica di un programma (3)

Concludiamo che:
#(P ) = [#(I1 ), #(I2 )] 1
= [21, 46] 1
= 221 346 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 h0, h0, 0ii = 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

Potrebbero piacerti anche