Cenni sulle Macchine di Turing corrado bonfanti
AS * ( * su un foglio di carta ) area programma * matita gomma finestra nastro cella MACCHINA DI TURING
AS * ( * su un foglio di carta ) area programma * matita gomma finestra nastro cella MACCHINA DI TURING ?
Sembra opportuno qualche approfondimento, per il quale adotteremo un approccio elementare, senza chiamare in causa strumenti più sofisticati quali ad esempio le funzioni ricorsive primitive. In quello che segue, lEsempio, gli Esercizi proposti e le relative Soluzioni possono essere fruiti anche come una sorta di introduzione alla programmazione delle macchine (o automi) a stati finiti. MACCHINA DI TURING AS * ( * su un foglio di carta ) area programma * matita gomma finestra nastro cella ?
ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING (TM: Turing Machine) Nastro: è suddiviso in celle e lo si suppone illimitato (ovvero prolungabile a piacere tanto a destra quanto a sinistra). Ogni cella contiene un solo carattere tra quelli ammessi, compresi nellalfabeto dei caratteri C = {c*,c 1,c 2, … c n } (vedi appresso). Il nastro, dietro apposito comando (vedi appresso), può rimanere fermo oppure scorrere di una cella verso destra o verso sinistra. Nastro Cella
ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING Finestra di lettura/scrittura: individua una cella del nastro detta cella corrente e designata come CC. La finestra è in posizione fissa e il nastro può scorrere sotto di essa. La notazione (CC) designa il simbolo contenuto in CC. Finestra di lettura/scrittura (CC) Nastro CC Cella
Area di Controllo: una zona, designata come AC, destinata a contenere (uno alla volta) i simboli dellinsieme S = {s*,s 1,s 2, … s k }, che designano i cosiddetti stati della TM (vedi appresso). La notazione (AC) designa il simbolo contenuto di AC. (AC) Area di Controllo ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING Finestra di lettura/scrittura (CC) Nastro Cella
Insiemi dei simboli C ed S sono linsieme dei simboli che, uno alla volta, possono comparire rispettivamente in una cella del nastro e nellarea di controllo. cella vuotastop C ed S sono definiti in relazione al compito che una specifica MT deve assolvere, ma devono contenere rispettivamente il simbolo c* (uno pseudosimbolo per la cella vuota) ed s* (stop), o loro equivalenti. I tre simboli di M comandano leventuale scorrimento del nastro: di una cella verso Destra; di una cella verso Sinistra; nastro Fermo. (AC) Area di Controllo ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING Finestra di lettura/scrittura (CC) Nastro Cella Simboli Alfabeto dei caratteri C = {c*,c 1,c 2, … c n } Stati S = {s*,s 1,s 2, … s k } Movimenti M = {D,S,F}
ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING (AC) Area di Controllo Finestra di lettura/scrittura (CC) Nastro Cella Simboli Alfabeto dei caratteri C = {c*,c 1,c 2, … c n } Stati S = {s*,s 1,s 2, … s k } Movimenti M = {D,S,F} s3s3... sksk s1s1 s2s2 c*c* c1c1 c2c2 c,m,s Programma cncn Istruzione con indirizzo c 2, s 2
Programma: tabella a doppia entrata (matrice) in cui - Le colonne sono intestate con tutti i simboli di stato compresi in S = {s*,s 1,s 2, … s k }, con lesclusione di s*. - Le righe sono intestate con tutti i caratteri dellalfabeto C = {c*,c 1,c 2, … c n }. Istruzione: è il contenuto di un elemento della tabella, costituito da una terna ordinata di simboli c,m,s in cui - c è un carattere dellalfabeto C = {c*,c 1,c 2, … c n }. - m è uno dei tre comandi di movimento compresi in M = {D,S,F}. - s è uno degli stati presenti in S = {s*,s 1,s 2, … s k }. ELEMENTI COSTITUTIVI DI UNA MACCHINA DI TURING s3s3... sksk s1s1 s2s2 c*c* c1c1 c2c2 c,m,s Programma Istruzione con indirizzo c 2,s 2 cncn Le coordinate dellelemento della tabella (c 2 e s 2 nella figura) definiscono lindirizzo dellistruzione in esso contenuta.
Listruzione da eseguire (istruzione corrente) è quella che sta scritta allindirizzo (CC),(AC) ovvero c 2,s 2. Lesecuzione consta di tre passi: s1s1 s2s2 c*c* c1c1 c2c2... c 1,S,s 5 AC s2s2 c2c2 c2c2 c3c3 c2c2 c3c3 c1c1 FUNZIONAMENTO DI UNA TM
Listruzione da eseguire (istruzione corrente) è quella che sta scritta allindirizzo (CC),(AC) ovvero c 2,s 2. Lesecuzione consta di tre passi: 1 - Si cancella (CC) e si trascrive c 1 (primo simbolo dellistruzione corrente) in CC. AC s2s2 s2s2 c2c2 c2c2 c3c3 c2c2 c3c3 c1c1 c2c2 c1c1 c3c3 c2c2 c3c3 c1c1 passo 1 s1s1 s2s2 c*c* c1c1 c2c2... c 1,S,s 5 FUNZIONAMENTO DI UNA TM
Listruzione da eseguire (istruzione corrente) è quella che sta scritta allindirizzo (CC),(AC) ovvero c 2,s 2. Lesecuzione consta di tre passi: 1 - Si cancella (CC) e si trascrive c 1 (primo simbolo dellistruzione corrente) in CC. 2 - Si sposta il nastro di una cella verso Sinistra, come indicato dal secondo simbolo dellistruzione corrente. AC s2s2 s2s2 s2s2 c2c2 c2c2 c3c3 c2c2 c3c3 c1c1 c2c2 c1c1 c3c3 c2c2 c3c3 c1c1 passo 1 passo 2 c1c1 c3c3 c2c2 c2c2 c3c3 c1c1 s1s1 s2s2 c*c* c1c1 c2c2... c 1,S,s 5 FUNZIONAMENTO DI UNA TM
Listruzione da eseguire (istruzione corrente) è quella che sta scritta allindirizzo (CC),(AC) ovvero c 2,s 2. Lesecuzione consta di tre passi: 1 - Si cancella (CC) e si trascrive c 1 (primo simbolo dellistruzione corrente) in CC. 2 - Si sposta il nastro di una cella verso Sinistra, come indicato dal secondo simbolo dellistruzione corrente. AC s2s2 s2s2 s5s5 c2c2 c2c2 c3c3 c2c2 c3c3 c1c1 c2c2 c1c1 c3c3 c2c2 c3c3 c1c1 passo 1 passo 2 c1c1 c3c3 c2c2 c2c2 c3c3 c1c1 passo 3 s1s1 s2s2 c*c* c1c1 c2c2... c 1,S,s Si cancella (AC) e si trascrive il terzo simbolo s 5 in AC. La prossima istruzione da eseguire è pertanto quella allindirizzo (CC),(AC) ovvero c 3,s 5 (non presente nella figura). N.b. Se il terzo simbolo fosse stato s*, la TM si sarebbe arrestata. FUNZIONAMENTO DI UNA TM
Adottiamo lalfabeto C = {c*,0,1,2,3,4,5,6,7,8,9} e programmiamo la TM in modo che essa fornisca in output il numero n+1, essendo n 0 il numero intero (input) scritto inizialmente sul nastro e delimitato da almeno una cella vuota a destra e a sinistra. Il tutto nella normale notazione decimale, con partenza e arresto sulla cella che contiene la cifra delle unità. Questo esempio è tratto, con adattamenti del docente, da: M.Italiani, G.Serazzi Elementi di informatica; Etas Kompass, 1973, pp ESEMPIO: la Macchina + 1
Adottiamo lalfabeto C = {c*,0,1,2,3,4,5,6,7,8,9} e programmiamo la TM in modo che essa fornisca in output il numero n+1, essendo n 0 il numero intero (input) scritto inizialmente sul nastro e delimitato da almeno una cella vuota a destra e a sinistra. Il tutto nella normale notazione decimale, con partenza e arresto sulla cella che contiene la cifra delle unità. Il programma qui a fianco risolve il problema con S = {s 1,s 2 } e ponendo inizialmente (AC) = s 1. Si veda qui appresso lo sviluppo completo del caso in cui n = 299. ESEMPIO: la Macchina ,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1
sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 29 9 CC AC s1s1 ESEMPIO: la Macchina + 1 inizio 5 6,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1
sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 29 9 CC AC s1s1 ESEMPIO: la Macchina ,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1
29 9 CC AC s1s1 ESEMPIO: la Macchina + 1 sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 0,D,s 1 5 6,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1
sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 0,D,s s1s CC AC s1s1 ESEMPIO: la Macchina ,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1
sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 0,D,s 1 9,s 1 // 29 0 s1s CC AC s1s1 ESEMPIO: la Macchina + 1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1 5 6,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1
sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 0,D,s 1 9,s 1 // 29 0 s1s CC AC s1s1 … e così avanti, istruzione per istruzione ,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1 ESEMPIO: la Macchina + 1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1
sequenza delle istruzioni da eseguire (indirizzo // istruzione) 9,s 1 // 0,D,s 1 2,s 1 // 3,S,s 2 0,s 2 // 0,S,s 2 c*,s 2 // c*,D,s* 30 0 s2s s2s s*s* 30 0 s2s s1s s1s CC AC s1s1 ESEMPIO: la Macchina + 1 fine 5 6,S,s 2 5,S,s 2 7 8,S,s 2 7,S,s 2 8 9,S,s 2 8,S,s 2 9 0,D,s 1 9,S,s 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 2,S,s 2 1,S,s 2 2 3,S,s 2 2,S,s 2 3 4,S,s 2 3,S,s 2 4 5,S,s 2 4,S,s 2 6 7,S,s 2 6,S,s 2 programma per la Macchina +1 esecuzione del programma +1; inizio con n = 299 e (AC) iniziale = s 1
Esercizi proposti 1 - Sviluppare lesecuzione della Macchina +1, ponendo come input numeri non negativi di vostra scelta. 2 - Costruire lalgoritmo +1 2 per numeri in notazione binaria, ovvero ponendo C = {c*,0,1} e lasciando invariate le altre condizioni date per +1. (Oltre a risultare più compatto, questo algoritmo avrà il pregio di rendere più evidente la logica ad esso sottostante.) 3 - Costruire la Macchina RdS (Riconoscitore di Sequenze): - RdS opera sullalfabeto C = {c*,a,b} - sul nastro è impressa, in celle contigue, una stringa disordinata, non nulla e finita, di simboli a e b, preceduta e seguita da (almeno) una cella vuota; - la CC iniziale è la prima cella di sinistra della stringa; - il compito di RdS consiste nellindividuare, se esiste, la prima occorrenza, entro la stringa, della sequenza di simboli abba in quattro celle contigue; - se tale sequenza viene individuata, RdS si arresta sulla cella di destra della sequenza; se essa non si presenta mai entro la stringa, RdS si arresta sulla prima cella vuota a destra della stringa. Una possibile soluzione di 2 e 3 è data nellAppendice.
La prima idea fondamentale in base alla quale Turing ha concepito la sua macchina consiste nello scomporre lalgoritmo di calcolo nei passi più elementari, si potrebbe dire atomici, a cui si può ridurre il modo di procedere di un calcolatore umano. Questi, reciprocamente, può eseguire il programma-algoritmo senza esplicare alcuna decisione o ragionamento intelligente. Infatti gli si chiede soltanto di armarsi di carta, matita e gomma da cancellare e di attenersi acriticamente alle istruzioni del programma e alle regole di funzionamento. Si tratta quindi di un procedimento puramente meccanico che, in linea di principio, può essere eseguito da una macchina dotata degli opportuni automatismi. Si noti che la descrizione della TM che abbiamo dato nelle slide precedenti (come pure la macchina +1 usata come esempio) è alquanto differente dallimpostazione originaria che Turing ha esposto nei paragrafi 1-5 del suo celebre articolo On Computable Numbers, with an Application to the Entscheidungsproblem. [1] [1] Larticolo (pubblicato nei Proceedings of the London Mathematical Society, vol.42, , pp ) si conclude con unappendice in cui Turing dimostra lequivalenza tra la sua nozione di computabilità e il λ-calcolo che Alonzo Church aveva introdotto in un articolo di poco precedente. Da un lato quindi Turing si metteva allaltezza del già rinomato Church e, dallatro, rivendicava la differenza e loriginalità del proprio approccio. Questa appendice Turing la scrisse durante il suo lungo soggiorno a Princeton (1936-8) durante il quale fu a contatto diretto con lo stesso Church e con altri personaggi delluniversità e dello IAS (p.e. Kleene e von Neumann). Subito dopo, sempre a Princeton, scrisse una breve nota per correggere alcune inesattezze formali che gli erano state segnalate da P. Bernays (la nota è nello stesso volume dei Proceedings, pp ). Commenti
La più appariscente delle differenze che abbiamo introdotto consiste nel fatto che Turing presenta listruzione della TM come una quintupla ordinata, i cui primi due simboli sono quelli che noi abbiamo scorporato dal formato dellistruzione (ridotto quindi a una terna) per usarli come indirizzo dellistruzione stessa. Altri autori propongono varianti ancora diverse; nella moderna teoria della computabilità si usano poi TM configurate con più di un nastro. Turing inoltre non introduce esplicitamente il comando s* (stop) né fa uso della nostra AC (Area di Controllo). Nella concezione originaria, infine, si fa distinzione tra linsieme dei simboli ausiliari (tra i quali il blank della cella vuota) e quello dei simboli significativi (chiamati figures); questultimo insieme è composto dai soli caratteri 0 e 1 (fatto che peraltro non ha alcuna attinenza con luso dellaritmetica binaria: un intero non negativo n viene infatti rappresentato sul nastro da una stringa di n+1 simboli 1 contigui, delimitata da almeno una cella vuota a destra e a sinistra). In ogni caso si tratta di varianti che non ledono la sostanza delle idee di Turing e che si è ritenuto utile adottare a scopo didattico, anche per dare più immediato risalto alla stretta analogia tra la TM e le logiche hardware / software dei computer reali a programma registrato.
La seconda idea fondamentale, il cui sviluppo non esaminiamo in questa sede, consiste nellaver dimostrato che esiste un programma universale che opera su un nastro su cui siano stati scritti (con una apposita codificazione) sia le istruzioni di un programma particolare, del tipo visto nellesempio, e sia i dati di input su cui tale programma deve operare. Il programma universale (che altro non è se non la Macchina Universale di Turing - UTM) produce lo stesso output che sarebbe stato prodotto da quel programma particolare applicato a quei dati di input. In simboli: input per UTM programma particolare P & dati di input per P UTM output di UTM output di (P applicato ai dati di input per P) Lobiettivo dellarticolo di Turing (esposto nel paragrafo finale) era peraltro di natura esclusivamente logica: risolvere (negativamente) il problema dellarresto (Halting Problem) per le TM, che è strettamente analogo al problema della decisione (lentscheidungsproblem, proposto da Hilbert allinizio del Novecento). Sotto questo aspetto, Turing si muoveva sulla stessa linea di pensiero seguita da Kurt Gödel per i suoi teoremi negativi pubblicati nel 1933 (incompletezza; non-decidibilità).
APPENDICE
Soluzione proposta per la Macchina +1 2 Soluzione proposta per la Macchina +1 2 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 0,D,s 1 1,S,s 2 Si assuma (AC) iniziale = s 1 s1s1 s2s2 c* 1,S,s 2 c*,D,s* 0 1,S,s 2 0,S,s 2 1 0,D,s 1 1,S,s 2 Domanda In quale situazione viene eseguita listruzione evidenziata in giallo?
Soluzioni proposte per la Macchina RdS Si osservi che le istruzioni agli indirizzi c*,s 2, c*,s 3 e c*,s 4 sono forse eleganti ma certamente ridondanti; il seguente algoritmo risulta infatti più efficiente Si assuma (AC) iniziale = s 1 s1s1 s2s2 a a,S,s 2 a,S,s 1 a,S,s 1 a,F,s* b b,S,s 1 b,S,s 3 b,S,s 4 b,S,s 1 c* c*,F,s* c*,F,s 1 c*,F,s 1 c*,F,s 1 s3s3 s4s4 s1s1 s2s2 a a,S,s 2 a,S,s 1 a,S,s 1 a,F,s* b b,S,s 1 b,S,s 3 b,S,s 4 b,S,s 1 c* c*,F,s* c*,F, s* c*,F, s* c*,F, s* s3s3 s4s4