Strings vs Natural Numbers
Quindi, mentre domini e codomini delle funzioni parziali ricorsive sono sempre i Numeri Naturali,
le macchine di Turing possono calcolare
funzioni che hanno come dominio (e codominio) qualsiasi insieme i cui elementi
si possano rappresentare come stringhe di caratteri.
I domini (e codomini) delle funzioni calcolabili da macchine di Turing sono quindi tutti quegli
insiemi per i quali sia possibile definire una funzione di codifica e decodifica (vedi Introduzione [CB]).
Brevemente, preso un alfabeto A, una funzione di codifica per un insieme X e' una funzione iniettiva cod: X → A+
Mentre la relativa funzione di decodifica e' una funzione decod: A+ → X ∪ {errore} tale che, per ogni y appartenente ad X, decod(cod(y)) = y Notare che in [CB] la funzione di codifica e' definita su A* e non su A+. Noi utilizziamo questa definizione per semplicita' poiche' praticamente non cambia nulla.
Poiche' i numeri naturali (che indichiamo con N)
si possono codificare con stringhe
sull'alfabeto {0,1}, le macchine di Turing possono lavorare
anche sui numeri naturali, oltre che su molti altri domini e codomini.
Abbiamo gia' avuto occasione di vedere nella sezione 1.3.4 del testo di Ausiello
come, utilizzando la Definizione 1.50, sia possibile definire un isomorfismo
tra A+ (con A qualsiasi diverso dal vuoto) ed N. Per poter considerare solo funzioni sui naturali in teoria della ricorsivita' e per avere la possibilita' di codificare qualsiasi insieme su {0,1}+ (sempre che esista una codifica su un qualche A+ per tale insieme), non e' strettamente indispensabile avere un isomorfismo tra A+ ed N. Sarebbe sufficiente avere una funzione iniettiva tra A+ ed N.
Vediamo come definire una simpatica funzione iniettiva tra i numeri naturali
e l'insieme delle stringhe su un qualsiasi alfabeto di cardinalita' almeno 1.
L'isomorfismo di Cantor tra le coppie di numeri
naturali ed i numeri naturali si definisce nel modo seguente. 0 1 2 3 4 5 6 7 ........ -------------------------------------------....... 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | . | . | . | .
Ogni casella nella tabella sara' identificata quindi da una coppia
di numeri naturali. 0 1 2 3 4 5 6 7 ........ -------------------------------------------....... 0 | 0 | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | . | . | . | . Procediamo poi a riempire la seconda diagonale. 0 1 2 3 4 5 6 7 ........ -------------------------------------------....... 0 | 0 1 | 1 | 2 | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | . | . | . | . Poi la terza diagonale 0 1 2 3 4 5 6 7 ........ -------------------------------------------....... 0 | 0 1 3 | 1 | 2 4 | 2 | 5 | 3 | | 4 | | 5 | | 6 | | 7 | | . | . | . | . e cosi' via per tutte le diagonali. Consideriamo quindi l'intera tabella infinita come se fosse stata riempita tutta in questo modo. 0 1 2 3 4 5 6 7 ........ -------------------------------------------....... 0 | 0 1 3 6 10 15 21 28 36 ...... | 1 | 2 4 7 11 16 22 29 37 ...... | 2 | 5 8 12 17 23 30 38 ..... | 3 | 9 13 18 24 31 ..... | 4 | 14 19 25 32 ....... | 5 | 20 26 33 ....... | 6 | 27 34 ...... | 7 | 35 ....... | . | ...... . | . | .
E' quindi chiaro come tutti i numeri naturali possano venire "sistemati"
nelle caselle di tale tabella infinita. Poiche' ogni casella e' individuata
da una coppia di numeri naturali e ogni casella contiene un numero naturale
diverso da quello di tutte le altre caselle, ecco pronta la nostra
codifica iniettiva e suriettiva su N delle coppie di numeri naturali: una
coppia (n,m) viene codificata con il numero naturale contenuto nella casella identificata dalla
riga n e dalla colonna m.
Vediamo ora come utilizzare l'isomorfismo di Cantor per definire
una funzione iniettiva tra A+ ed N. Se indichiamo quindi con c il numero che rappresenta un carattere c e con (-,-)': NxN -> N l'isomorfismo di Cantor tra coppie di naturali a naturali, la nostra funzione iniettiva tra A+ ed N F: A+ -> N sara' definita come segue: F(c1c2...cn) = ((...(..((c1,c2)',c3)'...)',cn)',n)'
Notare che l'uso finale della lunghezza della stringa serve a far si che
la funzione F tra stringhe e numeri naturali definita in questo modo sia
invertibile sull'immagine di F. Perche'?
Ovviamente quella proposta e' solo una tra le tante possibilita' di
associare stringhe finite con numeri naturali in modo iniettivo. Spesso una qualsiasi funzione iniettiva viene chiamata "codifica".
La cosa simpatica e' che si possono codificare con numeri naturali
(tramite una funzione iniettiva, o addirittura un isomorfismo, come
osservato all'inizio di queste note) anche
le macchine di Turing, o le Funzioni Parziali Ricorsive. Il che implica che e' possibile codificare algoritmi con numeri naturali. |