Fondamenti di Informatica Università di Camerino Corso di Laurea in Informatica
Teoria della computabilità La teoria della computabilità tratta della definizione formale del concetto di calcolo meccanico. Alcuni importanti formalismi che hanno storicamente condizionato la teoria e l applicazione dei calcolatori sono: Le macchine di Turing Gli schemi ricorsivi di Kleene e McCarthy I sistemi di Post
Teoria della computabilità cont. Uno dei principali risultati della teoria della computabilità è la completa identità delle classi di problemi risolubili nei diversi formalismi. Oggi si ritiene che ogni procedimento di calcolo, purché completamente specificato, sia traducibile in uno qualsiasi dei formalismi. L equivalenza dei formalismi si basa sulla Tesi di Church e la Tesi di Turing Conseguenza Molte proprietà relative, ad esempio, alle macchine di Turing si estendono immediatamente ad un qualsiasi linguaggio di programmazione
Il termine Algoritmo Il termine Algoritmo significa procedimento di calcolo, deriva dal termine latino algorismus che a sua volta deriva dal nome del matematico usbeco Abu Ja far Mohammed ibn-musa al- Khowarismi, vissuto nel IX secolo d.c.
Che cosa è un Algoritmo Un algoritmo è una qualsiasi procedura computazionale ben definita (con un numero finito di regole che conduce al risultato dopo un numero finito di operazioni) che prende un insieme di valori, come input e produce un insieme di valori come output.
Perché parliamo di Algoritmi La teoria degli algoritmi ha iniziato a stabilizzarsi agli inizi del XX secolo, mentre le tecniche di progettazione di algoritmi, di correttezza e efficienza si sono evolute nella seconda metà del XX secolo, grazie alla diffusione dei calcolatori elettronici. Ovunque si impieghi un calcolatore elettronico occorrono algoritmi corretti e efficienti che ne utilizzino al massimo le possibilità Esempi di algoritmi corretti e efficienti: controllo dei voli aerei regolazione reattori nucleari reperimento d informazioni da archivi smistamento di comunicazioni telefoniche gioco degli scacchi controllo della produzione di una catena di montaggio sistemi di puntamento di missili
Correttezza e Efficienza Un algoritmo si dice corretto se, per ogni istanza di input, si ferma con l output corretto Un algoritmo corretto risolve il problema computazionale dato Un algoritmo efficiente risolve il problema computazionale il più velocemente possibile e organizza i dati in modo da usare il minor spazio di memoria possibile
Algoritmi & Programmi Gli algoritmi vengono descritti tramite programmi, che si avvalgono di istruzioni e costrutti dei linguaggi di programmazione per essere eseguiti da calcolatori elettronici Le proprietà degli algoritmi sono fondamentali, generali e robuste da essere indipendenti dalle caratteristiche di specifici linguaggi di programmazione o dai limiti imposti dai calcolatori elettronici a
Metodi Formali I metodi per l analisi della correttezza degli algoritmi I metodi per l analisi dell efficienza degli algoritmi
Definizione di algoritmo Idea empirica Discutiamo le caratteristiche che deve avere un algoritmo partendo dall idea empirica che ne abbiamo: a) Il programma P deve essere di lunghezza finita b) Ci deve essere un agente di calcolo C, capace di eseguire le istruzioni c) L agente di calcolo C ha a disposizione una memoria dove immagazzina i risultati intermedi per poi utilizzarli nelle fasi successive del calcolo d) Il calcolo avviene per passi discreti e) Il calcolo non è probabilistico
Il programma P deve essere di lunghezza finita Ogni algoritmo che sia definibile in pratica, deve essere ricavabile da una quantità finita di informazioni. Esempio Calcolatore con 10 istruzioni-macchina programmato per calcolare l espansione decimale di. Il punto a) è soddisfatto se si considera tale calcolatore come programmato dall algoritmo di lunghezza finita che, dato n, permette di calcolare l n-esima cifra di.
Il calcolo avviene per passi discreti Il punto d) viene soddisfatto se C non ha a disposizione nessun meccanismo di calcolo analogico Il calcolo non è probabilistico Il punto e) è soddisfatto se la modalità di esecuzione del calcolo non è associata a nessuna legge di probabilità
Definizione di algoritmo Caratteristiche discutibili Altre caratteristiche associabili ad un algoritmo sono più discutibili come: f) Non deve esserci alcun limite finito alla lunghezza dei dati di ingresso g) Non deve esserci alcun limite alla quantità di memoria disponibile h) Deve esserci un limite finito al numero e alla complessità delle istruzioni eseguibili da C i) Sono ammesse esecuzioni con un numero di passi illimitato j) Sono ammesse esecuzioni con un numero di passi infinito (cioè esecuzioni che non terminano mai)
Non deve esserci alcun limite finito alla lunghezza dei dati di input Ad esempio somma di n numeri deve essere possibile per un qualsiasi n Non deve esserci alcun limite finito alla quantità di memoria disponibile Ad esempio la moltiplicazione di 2 n x 2 n = 2 2n deve poter essere calcolabile per ogni n
Deve esserci un limite al numero e alla complessità delle istruzioni eseguibili da C Questa condizione è essenziale alla intrinseca finitezza richiesta al nostro sistema formale e quindi deve chiaramente essere soddisfatta. Ciò implica che il numero di celle indirizzabili direttamente con una istruzione-macchina dovrà essere finito. Quindi la memoria illimitata al punto g) non potrà essere tutta indirizzabile direttamente. Ridursi ad indirizzare una cella. Sono ammesse esecuzioni con un numero di passi illimitato Esempio moltiplicazione, il numero di passi cresce al crescere del numero di cifre dei fattori. Si potrà pensare a semplici funzioni della lunghezza dei dati come limiti superiori al numero di passi ammissibili
Algoritmi & Funzioni Sia S un sistema formale, cioè un linguaggio in cui descrivere i nostri algoritmi, più un certo meccanismo di esecuzione. Un algoritmo A definisce quindi una funzione f A avente come dominio l insieme dei possibili dati di input e come codominio l insieme dei possibili risultati. f si dice calcolabile se esiste un algoritmo A tale che f = fa
Esistono algoritmi per tutte le funzioni? Se per alcuni valori dei dati iniziali X un algoritmo non termina, la funzione f A sarà non definita per quei valori. Una funzione che può essere non definita per alcuni valori è detta parziale. Una funzione definita per tutti i valori è detta totale Si noti come ad ogni algoritmo A di S é associata una funzione f=f A, la stessa funzione f può essere associata a più di un algoritmo: f=f A =f A Sia A S l insieme di tutti i possibili algoritmi in S, l insieme F S = {f A A A S } F S è detto l insieme delle funzioni calcolabili in S
Alcune nozioni di logica Completezza: Un sistema formale si dice completo se tutte e sole le verità esprimibili nel linguaggio del sistema sono dimostrabili all interno del sistema stesso. Coerenza: Un sistema formale si dice coerente, se non è possibile ottenere nel sistema una dim. di A e una di non A
Il Teorema di incompletezza di Gödel Gödel logico austriaco nel 1931 affermò che Per ogni formalizzazione coerente dell aritmetica, esistono verità aritmetiche che non possono essere dimostrate, all interno del sistema formale nel quale l aritmetica è rappresentabile o più informalmente L aritmetica non è completamente formalizzabile Esistono proposizioni matematiche di cui non è possibile dimostrare che siano vere o false.
L aritmetizzazione La tecnica usata per dimostrare il teorema di Gödel è particolarmente interessante per noi oggi Si tratta infatti di un metodo che trasformava tutti i simboli e i termini usati nel sistema formale della logica in numeri naturali, in particolare numeri primi
Un altra nozione di logica la decidibilità Un sistema formale è decidibile se esiste un metodo che in un numero finito di passi permette di riconoscere, per ogni formula espressa nel linguaggio del sistema, se è un teorema del sistema o non lo è. Un metodo, quindi, che stabilisca in linea di principio se esiste una dimostrazione per quella formula o no.
Il problema della decidibilità Dopo i risultati di Gödel, restava da risolvere il problema della decisione, che nella formulazione di Turing era posto in questi termini: è possibile avere un metodo meccanico che in un numero finito di passi permetta di riconoscere se una formula espressa nel linguaggio di un sistema formale è o non è un teorema del sistema?
Macchina di Turing Alan Turing introdusse la nozione di MdT nel 1936 come definizione matematica precisa del concetto intuitivo di funzione effettivamente calcolabile per dimostrare l esistenza di problemi indecidibili (tra cui quello della validità logica) Alan Turing pubblicò nel 1936 l articolo: On Computable Numbers with an Application to the decision problem. L idea era di avere una macchina astratta che potesse effettuare ogni tipo di calcolo su numeri e simboli
Macchina di Turing Turing nel 1939 definì così il risultato teorico: Si affermò che una funzione è effettivamente calcolabile se i suoi valori possono essere trovati attraverso un metodo puramente meccanico". Possiamo prendere alla lettera questa asserzione, intendendo per metodo puramente meccanico, un processo che può essere portato a termine da una macchina. E' possibile dare una descrizione matematica delle strutture di queste macchine.
Che vuol dire metodo meccanico? Secondo Turing un metodo meccanico è una procedura eseguita da un dispositivo meccanico, cioè da una macchina Per dimostrare che questo metodo meccanico non esisteva per alcuni problemi, Turing doveva inventare una macchina più generale possibile e mostrare che nemmeno questa era adatta allo scopo
Ma che cos è una macchina di calcolo? E difficile dare una definizione precisa di macchina di calcolo Per Turing è: Lo strumento più generale che si può usare per effettuare calcoli ma I calcoli sono solo manipolazione di simboli allora La macchina è lo strumento più generale e più elementare in grado di manipolare simboli
Una macchina universale Durante la primavera del 1936, Turing inventò la macchina più generale mai concepita, e probabilmente mai concepibile. Il dispositivo era dotato solo di: un nastro bidimensionale diviso in quadrati di lunghezza finita ma illimitata un dispositivo per la lettura, scrittura, eliminazione di simboli e spostamento sul nastro una tavola di istruzioni comprensibile alla macchina che indicava tutte le attività da svolgere senza ambiguità e tutti gli stati in cui la macchina poteva trovarsi
Lo schema di una MdT Dispositivo di lettura/scrittura/cancellazione spostamento sul nastro secondo la tavola delle istruzioni
Il risultato ottenuto da Turing 1. Turing dimostrò che, se un compito era eseguibile da una macchina, allora era simulabile da una MdT 2. Turing dimostrò che esistono calcoli che non possono essere effettuati, manipolazioni di simboli che non vanno a buon fine, procedure che non hanno mai termine anche per una MdT 3. Il problema della decisione è uno dei calcoli che non è possibile effettuare con una MdT
La MdT è una macchina astratta La MdT è un dispositivo astratto, non deve essere realizzabile in pratica E una macchina nella quale non vengono presi in considerazione i vincoli spazio-temporali: Dimensioni della memoria Tempo di calcolo Spazio di calcolo Realizzazione fisica
MdT: descrizioni istantanee 1. Un ingresso finito, cioè un nastro con un numero finito di simboli diversi dal bianco; 2. La posizione della testina di lettura e scrittura 3. Lo stato della macchina 1., 2. e 3. costituiscono la Descrizione Istantanea (DI) iniziale della Mdt Una descrizione Istantanea della MdT è Finale se nella matrice funzionale non esiste configurazione successiva
Introduzione al Modello formale Sia S = {s 0, s n } un alfabeto finito di simboli Q = {q 0, q m } un alfabeto finito rappresentante gli stati, M = {D, S} l insieme dei simboli rappresentante gli spostamenti a destra e sinistra, sia s 0 S il simbolo speciale che denota il bianco. La configurazione di una MdT ad ogni istante (DI) è definita specificando la stringa di simboli sul nastro, la posizione della testina e lo stato della macchina. Questa configurazione può venire rappresentata come una stringa infinita di simboli s 0 s 0 s i1 s i2 s i3 s ik-1 q r s ik s if s 0 s 0 di cui solo un numero finito è diverso da s 0. Il simbolo q r che compare nella stringa specifica lo stato di controllo della macchina e la posizione della testina (si conviene che il simbolo puntato sia quello a destra di q r )
MdT: descrizioni istantanee Se S* è l insieme di tutte le sequenze finite di simboli appartenenti ad S, allora una generica stringa s 0 s 0 s i1 s i2 s i3 s ik-1 q r s ik s if s 0 s 0 Potrà essere rappresentata schematicamente con qs dove, S*, q Q e s S, s rappresenta il simbolo in lettura. Una stringa qs sarà quindi una DI della MdT
MdT: comportamento La Matrice Funzionale rappresenta il comportamento della MdT s j dove: le righe rappresentano gli stati interni q 0, q 1,, q m q i s k q r x t le colonne rappresentano i simboli di ingresso s 0, s 1,, s n.b Mf(q i, s j ) rappresenta l azione che deve essere eseguita dalla macchina nel caso in cui si trovi nello stato q i e legga il simbolo s j. Un passo <s k q r x t > consiste nelle seguenti tre operazioni: 1. scrivere un altro simbolo s k ; 2. modificare lo stato in q r ; 3. spostarsi sul nastro a destra o a sinistra di una casella, a seconda che x t = DESTRA o x t = SINISTRA. In particolare s j può essere uguale a s k, e q i può essere uguale a q r cioè lo stato e il valore contenuti nella casella possono non essere modificati. Casella bianca, termine calcolo.
MdT: comportamento In generale il comportamento di una MdT è descritto da una quintupla che descrive la trasformazione di una DI nella successiva. Ogni trasformazione corrisponde ad un passo della computazione Ogni quintupla è del tipo: q i s j s ij q ij x ij q i,q ij Q, s i,s ij S, x ij M. I primi due simboli rappresentano una possibile situazione in cui la macchina si trova, Gli ultimi tre rappresentano l azione che la macchina deve intraprendere in corrispondenza di tale situazione: cioè la macchina sostituisce nella stringa il simbolo q i con il simbolo q ij, il simbolo s j con il simbolo s ij e sposta q ij di una posizione a destra o a sinistra secondo il valore contenuto in x ij. Esempio: q i s j s ij q ij D s 0 s 0 s 1 s 2 s 3 s j-1 q i s i s k s 0 s 0 s 0 s 0 s 1 s 2 s 3 s j-1 s ij q ij s k s 0 s 0 q i s j s ij q ij S s 0 s 0 s 1 s 2 s 3 s j-1 q i s i s k s 0 s 0 s 0 s 0 s 1 s 2 s 3 q ij s j-1 s ij s k s 0 s 0
Modello matematico della MdT DEF. 1: Una MdT Z è una terna (Q, S, P) in cui: Q è un insieme finito (l insieme degli stati) S è un insieme finito (l insieme dei simboli, un elemento è detto bianco e indicato con s 0 ) P è un sottoinsieme di QxSxSxQx{S,D}, l insieme delle quintuple di Z, ed ha la proprietà che non ci sono due quintuple con i primi due elementi uguali.
Relazione - Introduciamo la relazione - fra DI (Descrizioni Istantanee) di una MdT, che vale quando la seconda DI rappresenta la configurazione ottenuta in un passo da quella rappresentata dalla prima DI DEF. 2: Sia Z=(Q,S,P) una MdT. La relazione - è definita come segue: qs - s q se qss q D P sqs - q ss se qss q S P
Computazione di MdT Z DEF. 3: Una computazione massimale della MdT è una sequenza finita z 0 - z 1 -z 2 - - z m di DI di Z, tale che z m è una DI finale, cioè se z m = qs, allora nessuna quintupla in P inizia con q s ; ed inoltre z j - z j+1 per 0 j m-1. Se facciamo partire Z da una configurazione iniziale z 0, allora o Z si fermerà, nel qual caso z 0 definisce univocamente la computazione massimale della quale z 0 è primo elemento, o Z non si fermerà mai, nel qual caso Z non ha alcuna computazione massimale di cui z 0 è primo elemento.
Chiusura transitiva c1 c2... ci ci+1... Usiamo la chiusura riflessiva e transitiva di, indicata con *, per denotare la relazione tra due configurazioni c e c' che esprime l'esistenza di una computazione che da c porta a c tramite un numero finito (eventualmente 0) di transizioni c * c
MdT Un ulteriore definizione di MdT è la seguente: Def. Macchina di Turing: M=<S,b,Q,q 0,F,d> S alfabeto di simboli b carattere speciale, spazio bianco (blank) Q insieme finito di stati q 0 stato iniziale F insieme di stati finali d funzione di transizione (parziale) d: : Q (S {b}) Q (S {b}) {d,s,i} d,s,i indicano spostamento a destra, a sinistra e immobilita' della testina Sb = S {b}
Computazione massimale Def. Una computazione c1 c2... cn e' massimale se non esiste una DI c tale che cn c NOTA BENE. Una computazione massimale si conclude o con una DI o con una DI finale (lo stato è finale) o con una DI in cui non e' definita la funzione di transizione
Computazione massimale Def. Una computazione massimale <c0, c1,..., cn> e' accettante se c 0 e' iniziale e c n e' finale. Def. Una computazione massimale <c0, c1,..., cn> e' rifiutante se c 0 e' iniziale e c n non e' finale. Convenzioni. Computazione accettante: responso affermativo Computazione rifiutante: responso negativo Computazione infinita: nessun responso
Algoritmo & MdT 1-5 requisiti 1. Il programma P deve essere di lunghezza finita 2. Ci deve essere un agente di calcolo C, capace di eseguire le istruzioni 3. L agente di calcolo C ha a disposizione una memoria dove immagazzina i risultati intermedi per poi utilizzarli nelle fasi successive del calcolo 4. Il calcolo avviene per passi discreti 5. Il calcolo non è probabilistico 1. L insieme di quintuple, o la matrice funzionale, della MdT costituisce un insieme finito di istruzioni. 2. La MdT è l agente di calcolo che esegue le istruzioni di cui al punto 1. 3. La MdT può utilizzare il nastro per memorizzare i risultati intermedi 4. La MdT opera in modo discreto 5. La MdT opera in modo deterministico, in quanto ad ogni condizione corrisponde una sola azione
Algoritmo & MdT 6-10 requisiti 6. Non deve esserci alcun limite finito alla lunghezza dei dati di ingresso 7. Non deve esserci alcun limite alla quantità di memoria disponibile 8. Deve esserci un limite finito al numero e alla complessità delle istruzioni eseguibili da C 9. Sono ammesse esecuzioni con un numero di passi illimitato 10. Sono ammesse esecuzioni con un numero di passi infinito (cioè esecuzioni che non terminano mai) 6. Non esiste nessuna limitazione sulla lunghezza delle stringhe di ingresso, in quanto il nastro è illimitato 7. Il nastro della MdT costituisce una memoria di capacità non limitata 8. Le operazioni che la MdT può eseguire sono molto semplici, quindi di complessità finita 9. Non esiste nessun limite sul numero di istruzioni che vengono eseguite durante una computazione, in quanto non esiste alcun limite al numero di volte che una quintupla può essere usata 10. Poiché esistono DI iniziali che non danno origine ad alcuna computazione mass. Ciò significa che la corrispondente sequenza di DI è infinita.
Calcolabilità Il modello di calcolo delle Macchine di Turing (TM) puo essere utilizzato sia per risolvere problemi di decisione (o accettazione), sia per calcolare funzioni (parziali) su S*.
Funzioni Calcolabili mediante MdT Ad ogni MdT Z può essere facilmente associata la funzione calcolata da Z, una volta che siano fissata una convenzione consistente sia per la codifica dei dati iniziali che del risultato finale. Esempio, data f: N n N una codifica degli argomenti potrebbe essere b b 1 b 2 b b n b b Dove i rappresenta la codifica binaria dell argomento i-mo. Il risultato finale f(x 1, x n ) potrebbe invece essere rappresentato dal numero binario che si trova alla destra della testina alla fine della computazione.
Funzioni calcolabili Def. Macchina di Turing trasduttrice: ogni configurazione finale e' del tipo xbqy, dove x e' il contenuto del nastro all'inizio della computazione Def. Una macchina trasduttrice calcola la funzione f se per tutte e sole le x nel dominio di definizione di f esiste q Q tale che: q 0 x * xbqf(x) Def. Una funzione (parziale) f per la quale esiste una macchina di Turing che la calcola e' detta calcolabile secondo Turing (T-calcolabile).
Esempio MT che calcola f(x) = x per x {0,1}*. M=<{0,1},b,Q,q 0,{q 6 },d> Configurazione iniziale: q 0 10010110 Configurazione finale: 10010110bq 6 10010110 rimpiazza il carattere piu' a sinistra (0 o 1) con una X o, rispettivamente, con una Y Y0010110 (stato q 0 ) si muove a destra verso il primo b (stati q 1 e q 2 ) si muove a destra verso il secondo b e scrive 0 o, rispettivamente, 1 Y0010110b1 (stati q 3 e q 4 ) si muove a sinistra verso la X (o la Y) e la rimpiazza con 0 (1) (stato q 5 ) si muove di una cella a destra sul carattere successivo (stato q 0 ) se in questo ultimo passo trova b allora termina (stato q 6 )
Decidibilità Def. M=<S,b,Q,q 0,F,d> riconosce (decide) un linguaggio L se per ogni x S* esiste q Q tale che q 0 x * q con (S b )* e (S b ) + e la computazione corrispondente e' massimale, x L se e solo se q F Def. Un linguaggio riconosciuto da una macchina di Turing e' detto decidibile. Nota: Con S + denotiamo l'insieme delle stringhe non vuote. Pertanto S * = S + {stringa vuota}
Nota 1 Non e' detto che una macchina di Turing possa sempre riconoscere un linguaggio
ACCETTAZIONE DI LINGUAGGI Informalmente: Una macchina di Turing M riconosce un linguaggio L se per ogni x S*, M e in grado di stabilire se x L o no Una macchina di Turing M accetta un linguaggio L se per tutte e sole le x L, M e in grado di stabilire tale appartenenza, ma se x L, M non garantisce un comportamento prestabilito. Utilizzeremo lo stato finale (gli stati finali) per esprimere che la stringa data in input appartiene al linguaggio.
Semi-decidibilità Def. M=<S,b,Q,q 0,F,D> accetta un linguaggio L se per tutte e sole le x L esiste q F tale che q 0 x * q con (S b )* e (S b ) + In altre parole: Un linguaggio L e' accettato da una macchina di Turing M se: con (S b )*, (S b ) +. L = L(M) = {x x S* q 0 x * q q F} Def. Un linguaggio accettato da una macchina di Turing e' detto semidecidibile.
Nota 2 Se un linguaggio e' decidibile e' anche semidecidibile.
MdT generalizzate Possibili varianti della MdT: Variazione del numero degli stati Variazione del numero dei simboli dell alfabeto Aumento del numero di testine Aumento del numero dei nastri multidimensionali
Equivalenza di MdT La dimostrazione di equivalenza di una MdT modificata con quella di base si basa sul fatto che la MdT di base permette di esprimere qualsiasi operazione che può essere espressa in una MdT modificata. Concretamente ciascuna dimostrazione cercherà una MdT ordinaria che simuli effettivamente il comportamento della MdT di cui vogliamo mostrare l equivalenza
MT NONDETERMINISTICHE (MdT ND ) Def. Macchina di Turing non deterministica: M=<S,b,Q,q0,F, N > S alfabeto di simboli b carattere speciale, spazio bianco Q insieme finito di stati q0 stato iniziale F insieme di stati finali N funzione parziale di transizione N : Q S b P(Q S b {d,s,i}) La macchina di Turing non deterministica puo' eseguire piu' transizioni
Equivalenza tra MT e MdT ND Le MdT ND sono piu' "efficienti" ma non piu' potenti computazionalmente delle MT Teorema. Data una macchina non deterministica M con grado di non-determinismo d esiste una MT M' equivalente che simula k passi di M in O(kd k ) passi
CALCOLABILITA' SECONDO TURING (T-CALCOLABILITA') Le macchine di Turing ci consentono di definire linguaggi decidibili o semidecidibili funzioni (totali o parziali) calcolabili
Tesi di Church Contemporaneamente a Turing anche Alonzo Church ha introdotto un concetto di calcolabilita' ( -definibilita') basato su un sistema formale ( - calcolo). Tale sistema e' stato dimostrato equivalente, dallo stesso Turing. Cio' ha permesso di formulare la cosiddetta Tesi di Church-Turing: "Ogni funzione computabile con qualunque approccio formale e' T-computabile" Tutti i formalismi definiti successivamente hanno confermato la Tesi di Church-Turing.
Macchina di Turing universale E' possibile descrivere una macchina di Turing con una stringa di caratteri e fornire tale descrizione come input ad un'altra macchina di Turing. Esistono vari modi di descrivere una macchina di Turing con una stringa: possiamo fornire la sequenza delle quintuple che costituiscono la funzione di transizione ##d1##d2##... ##dn in cui e' presente la quintupla qi# j#qh# k#t1 se e solo se esiste la regola di transizione (qi,sj)=(qh, k, tl); possiamo sfruttare il fatto che ogni macchina di Turing puo' essere realizzata come composizione di alcune macchine elementari e fornire la descrizione di una macchina come sequenza di tali macchine.
Macchina di Turing universale Sia DM la descrizione della macchina M. Teorema. Esiste una macchina di Turing U, con stato iniziale (detta macchina di Turing universale) q 0U, che, data una qualunque descrizione D M, realizza la computazione q 0U D M #x * q fu, con q fu stato finale, se e solo se la macchina M, con stato iniziale q 0, realizza la computazione q 0 x * q f, con q f stato finale. Dim. La macchina non fa che eseguire una per una le trasformazioni richieste dalle quintuple della macchina M contenute in D M. Al termine cancella dal nastro la descrizione D M.
La MdT è una macchina simulatrice La MdTU emula il comportamento delle altre MdT attraverso una tavola di istruzioni, inserita nella macchina come se fossero i suoi dati La MdTU è perciò una macchina virtuale La MdTU è l insieme di struttura e tavola di istruzioni: Hardware + Software
IL PROBLEMA DELLA TERMINAZIONE (HALTING PROBLEM) Dimostriamo ora l'esistenza di una funzione che non e' calcolabile con una MT. Assumiamo che le macchine di Turing siano macchine ad un nastro, deterministiche con alfabeto S={0,1}.
HALTING PROBLEM (1) Data una MT M=<S,b,Q,q 0,F, > sia D M la codifica di M in S. Per x S* definiamo il predicato della terminazione h(d M,x) =1 se M con input x termina =0 se M con input x non termina Teorema. Il predicato della terminazione delle macchine di Turing non e' T-calcolabile. NOTA BENE. Invece e' T-calcolabile il predicato: h(d M,x) =1 se M con input x termina = indefinito, altrimenti
HALTING PROBLEM (2) Dim. Supponiamo che il predicato sia calcolabile, esista cioe' una macchina di Turing H che calcola h. Costruiamo la macchina H' che calcola il predicato h'(d M ) =1 se M con input D M termina =0 se M con input D M non termina H' non e' altro che la composizione di due macchine: la prima con input D M fornisce D M bd M, la seconda e' la macchina H che prende in input e calcola il predicato della terminazione. In altre parole H' e' la macchina che verifica se una MT termina quando le viene fornito in input il proprio codice. Possiamo ora costruire una nuova macchina H" che prende in input D M e calcola la funzione: h"(d M ) =0 se h'(d M ) = 0 =indefinito altrimenti H", cioe', termina con 1 se H' si e' fermata con 0 e si mette a ciclare, se H' si e' fermata con 1 Cosa accade ora se calcoliamo h"(d H "): h"(d H ") =indefinita se h"(dh") e' definita =0 se h"(d H ") e' indefinita In ogni caso abbiamo una contraddizione. Quindi non puo' esistere la macchina H.
Problemi ricorsivamente insolubili Le funzioni non calcolabili mediante MdT sono associate a problemi che si dicono Ricorsivamente Insolubili Esempi di problemi ricorsivamente insolubili: 1. Decidere se per ogni x, x è una funzione costante o no; 2. Decidere se per ogni x e z, z appartiene al codominio di x ; 3. Decidere se per ogni x1 e x2 x1 = x2 ; 4. Esempi di problemi per i quali è impossibile dimostrare la insolubilità ricorsiva: 1. Ultimo teorema di Fermat (decidere se esistono 4 interi x,y,z, e n con n>2, t.c. x n + y n = z n 2. Il problema dei 4 colori (decidere se sono sufficienti 4 colori per colorare i nodi di un grafo piano in modo tale che due nodi adiacenti non abbiano mai lo stesso colore) 3.