Precorsi di Informatica Dott. Antonio Cisternino 23-25 Settembre 2003 Funzioni calcolabili Precorsi di Informatica Dott. Antonio Cisternino 23-25 Settembre 2003
Scambiamo 0 e 1 Le regole per la Macchina di Turing Universale sono due e sono analoghe a quelle viste nella prima lezione: B S0S11 S1S01 I
Numeriamo le MdT Con la Macchina di Turing Universale abbiamo imparato ad esprimere il programma di una macchina come una stringa Domanda: è possibile associare un numero in modo univoco ad ogni Macchina possibile? Risposta: è possibile associare un numero naturale ad ogni macchina
Associamo cifre ai simboli Lo schema di codifica che vedremo è uno tra i tanti L’idea è quella di trasformare un programma in cifre e quindi associare alla macchina il numero così ottenuto I simboli necessari a definire le regole (e quindi il programma) sono: {S, 0, 1, N} Associamo quindi i simboli a cifre: {S 2, 0 0, 1 1, N 3, B 4, I 5}
Esempio Associamo quindi un numero al programma visto all’inizio secondo la regola stabilita: B S0S11 S1S01 I = 430311313015 Dato il numero siamo in grado di ottenere la macchina? Certamente: basta usare l’associazione al contrario
Codifichiamo l’input Esempio: T01001001N = 2010010013 Possiamo procedere in modo analogo per associare un numero all’input della nostra macchina: {0 0, 1 1, T 2, N 3} Esempio: T01001001N = 2010010013 Ancora una volta possiamo riottenere l’input dal numero
Osservazioni Siamo in grado di ottenere, data una macchina, un numero. Sappiamo anche tornare indietro a partire dal numero È sempre possibile dato un numero ottenere la macchina corrispondente? La risposta è no, nella codifica che abbiamo usato esistono numeri a cui non è possibile associare una macchina Lo stesso si può dire per l’input
Goëdelizzazione È possibile realizzare codifiche che associano ad ogni numero una macchina o un input sempre invertibili Il procedimento di enumerare tutte le Macchine di Turing è noto col termine di Göedelizzazione ATTENZIONE!!!! Le macchine di Turing sono tante quante i numeri naturali: sappiamo ottenere una macchina dato un numero e viceversa!!!!!
La tesi di Church È giunto il momento di ricordare la tesi di Church La tesi di Church/Turing è la seguente: se una funzione è calcolabile secondo un qualsiasi formalismo esistente e non allora lo è anche con una macchina di Turing Le funzioni calcolabili quindi coincidono (secondo questa tesi) con le macchine di Turing
|{f | f è calcolabile}|??? Quante sono le funzioni calcolabili? Sono di più dei numeri naturali? No, visto che abbiamo associato in modo univoco numeri e macchine Sono più dei numeri interi o razionali? No: entrambi gli insiemi sono enumerabili Sono più dei numeri reali? No!!! I numeri reali sono più di quelli naturali!!!
|{f | f:NN}|??? Quante sono le funzioni da numeri naturali in numeri naturali Sono enumerabili? NO!!! Come possiamo dimostrare che le funzioni da naturali in naturali non sono enumerabili (non possono essere messe in corrispondenza con i numeri interi)? Si procede con un argomento proposto dal Matematico G. Cantor: la diagonalizzazione
Considerazioni preliminari Consideriamo i possibili sottoinsiemi dei numeri naturali: {0}, {0, 1}, {2,5,7}… Per ogni sottoinsieme S di N possiamo costruire una funzione che associa ad ogni elemento di N 1 se questo appartiene ad S, 0 altrimenti Le funzioni da N in N sono quindi almeno quanto i sottoinsiemi di N Quanti sono i possibili sottoinsiemi di N?
I sottoinsiemi di N Supponiamo per assurdo che i sottoinsiemi di N siano enumerabili Consideriamo la seguente tabella: 1 2 3 4 … f0 0 1 1 0 … f1 1 0 0 0 … … fi è la funzione che identifica l’i-esimo insieme
Una funzione speciale Costruiamo la seguente funzione: f x0 x1 x2 x3 … 1 2 3 4 … f x0 x1 x2 x3 … dove xi è 1 se l’i-esimo elemento della diagonale è 0, 0 altrimenti. Questa funzione definisce un sottoinsieme di N ma non può apparire nella tabella!!!! Quindi l’ipotesi che le funzioni che definiscono insiemi siano enumerabili non può essere vera
Funzioni non calcolabili Abbiamo dimostrato che un sottoinsieme delle funzioni da N a N non è numerabile Quindi le funzioni sono più dei numeri naturali Ne consegue che esistono funzioni che non sono calcolabili poiché le macchine di Turing sono quanti i numeri naturali
Il problema della fermata Vediamo un esempio di funzione non calcolabile veramente significativo per gli informatici Il problema che ci poniamo è il seguente: esiste una funzione che, dati in ingresso un programma e un input, è in grado di dire se la macchina di Turing con quel programma terminerà la sua esecuzione su quell’Input?
Il problema della fermata Il problema della fermata non ha una risposta ovvia: in fondo se siamo riusciti a programmare l’interprete universale perché non può esistere una tale funzione? Intuizione: come posso verificare la terminazione? Uso l’interprete universale e se termina bene, altrimenti siamo costretti ad aspettare: chissà!
Diagonalizziamo? Per dimostrare che non può esistere una tale funzione utilizziamo l’argomento della diagonalizzazione Assurdo: supponiamo che esista tale funzione Q Come la costruiamo la tabella? Poiché le MdT sono numerabili associamo ad ogni riga la macchina di Turing corrispondente Ad ogni colonna associamo tutti i possibili input
La tabella La tabella diviene quindi: 1 2 3 4 … 1 y n y y … 1 2 3 4 … 1 y n y y … 2 n n y y … All’incrocio (i, j) scriviamo y se la funzione Q dice che la macchina i termina sull’input j, scriviamo n in caso contrario
L’argomento Come abbiamo già fatto in precedenza costruiamo la funzione (artificiosa) prendendo i valori della diagonale e scambiando y con n e viceversa: n y … Questa funzione non occorre nella tabella (differisce sempre per l’elemento sulla diagonale) La funzione Q quindi non è in grado di esprimersi su tutte le funzioni: ciò contraddice l’ipotesi
Uno sguardo alla funzione Com’è fatta la funzione che abbiamo utilizzato per trovare la contraddizione? È una funzione che ha in posizione i il valore opposto rispetto al valore Q(i, i) Ma cosa significa Q(i, i)? Q(i, i) vale y se la macchina i con input i termina la sua esecuzione, n altrimenti Quindi F(i) = opposto(Q(i, i)) Per opposto intendiamo che cambia y in n e viceversa
Un’altra via per dimostrare Si suppone per assurdo che esista la funzione Q e si costruisce una funzione F(i) che applica la macchina i a sé stessa: se Q(i, i) indica y allora non termina altrimenti termina Un’altra possibile dimostrazione del fatto che la funzione Q non è calcolabile poggia sulla definizione di F(i)
L’assurdo Troviamo quindi un assurdo: cosa vale Q(F, F)? Supponiamo Q(F, F) = y: non si può verificare poiché F termina solo se Q(F, F) non termina Supponiamo Q(F, F) = n: non si può verificare per la stessa ragione Abbiamo quindi un assurdo che non può derivare se non dal fatto che abbiamo postulato l’esistenza di Q: Q non può esistere!
Conclusioni In questa lezione abbiamo visto come esistano limiti al calcolo che non possono essere oltrepassati Questo risultato ci insegna inoltre che i modelli aiutano a comprendere meglio un problema Abbiamo visto poi un importante esempio di uso reale del modello delle Macchine di Turing