Macchina di Turing Una macchina di Turing è costituita dai seguenti elementi (vedi fig. 1): a) una unità di memoria, detta memoria esterna, consistente in un nastro illimitato in entrambi i sensi e suddiviso in sezioni dette celle. Ogni cella del nastro può contenere uno dei k+1 simboli s 0, s 1, s 2,..., s k che costituiscono il cosiddetto alfabeto esterno, mediante il quale sono rappresentate le informazioni introdotte nella macchina o che dalla macchina sono prodotte. Tra i simboli dell alfabeto esterno si trova anche un simbolo, ad esempio s 0, che serve a indicare l assenza di simboli e che per semplicità si può supporre contenuto nelle celle prive di informazioni (celle vuote); b) una unità di memoria, detta memoria interna, in grado di immagazzinare i simboli q 0, q 1,..., q m costituenti l alfabeto interno. Tali simboli rappresentano m+1 stati diversi della macchina e sono detti simboli di stato. Uno di essi, ad esempio q 0, sta ad indicare lo stato di arresto della macchina; c) una unità di controllo, consistente in un dispositivo in grado di prendere in esame una cella della memoria esterna, prelevare il simbolo dell alfabeto esterno in essa contenuto, registrarne uno nuovo e comandare il movimento del nastro di una cella verso sinistra o verso destra. All unità di controllo è collegata una memoria detta memoria di controllo, nella quale viene immagazzinato uno dei tre simboli S, D, F, detti simboli di movimento, indicanti rispettivamente i seguenti ordini: S: esaminare la cella immediatamente a sinistra D: esaminare la cella immediatamente a destra F: esaminare la stessa cella; d) una unità logica, avente due ingressi e tre uscite. Ai due ingressi giungono il simbolo dell alfabeto esterno s i contenuto nella cella esaminata dall unità di controllo e il simbolo di stato q i contenuto nella memoria interna. L unità logica fornisce in uscita, per ogni coppia di valori in ingresso, una terna di valori rappresentanti rispettivamente: 1. il simbolo s j che deve essere registrato nella cella esaminata dall unità di controllo 2. il simbolo di stato q j che deve essere registrato nella memoria interna 3. il simbolo di movimento m j (S, D, F), che deve essere trasmesso alla memoria dell unità di controllo. Figura 1 Schema funzionale della macchina di Turing Prof. A. Venia 1
La terna di valori in uscita dall unità logica dipende esclusivamente dalla coppia di valori in ingresso; l unità logica si comporta pertanto come una funzione che associa ad ogni coppia di simboli s i, q i una terna di simboli s j, q j, m j, dove m j indica uno dei tre simboli di movimento. Tale funzione può essere rappresentata mediante una tavola contenente k+1 righe (tante quanti sono i simboli dell alfabeto esterno) ed m colonne (tante quanti sono i simboli di stato della macchina oltre al simbolo di arresto). All incrocio della riga e della colonna corrispondenti ad una determinata coppia di valori s i, q i, si troverà una terna di simboli s j, q j, m j che l unità logica fa corrispondere alla coppia considerata. La tavola ora descritta prende il nome di matrice funzionale della macchina di Turing. Nella tabella adiacente è riportata la matrice funzionale di una macchina di Turing avente tre stati oltre a quello di arresto e un alfabeto esterno di 4 simboli. Il funzionamento di una macchina di Turing è definito dalla matrice funzionale che rappresenta il comportamento della sua unità logica, per cui costruire una macchina di Turing equivalente a determinare la sua matrice funzionale. Funzionamento della macchina di Turing La macchina di Turing inizia il funzionamento a partire da una configurazione di macchina iniziale, cioè una situazione in cui: a) in un numero finito di celle del nastro sono contenuti simboli dell alfabeto esterno diversi dal simbolo vuoto s 0 b) l unità di controllo esamina una determinata cella; c) nella memoria interna si trova un simbolo di stato q i diverso dal simbolo di arresto q 0. Il funzionamento della macchina consiste nella esecuzione di una successione di passi in ciascuno dei quali avvengono le seguenti operazioni: 1. l unità di controllo preleva il simbolo s i contenuto nella cella esaminata e lo invia all unità logica; 2. la memoria interna invia all unità logica il simbolo di stato q i ; 3. l unità logica, in funzione della coppia di simboli in ingresso, fornisce la terna di simboli s j, q j, m j definiti dalla matrice funzionale; 4. il simbolo s j viene registrato nella cella esaminata in sostituzione di quello precedentemente contenuto; 5. il simbolo di stato q j viene registrato nella memoria interna al posto del simbolo precedentemente contenuto; 6. il simbolo di movimento m j viene registrato nella memoria di controllo e l unità di controllo passa ad esaminare la cella immediatamente a sinistra, immediatamente a destra, o esamina nuovamente la stessa cella, a seconda del valore di m j. Al termine di ciascun passo, la macchina di Turing assume quindi una nuova configurazione; se dopo un numero finito di passi la macchina si ferma perché nella memoria interna è stato introdotto il simbolo di stato q 0 (stato di arresto), si dice che la macchina è applicabile all informazione contenuta inizialmente sul nastro e che essa l ha trasformata nell informazione che si trova sul nastro all atto dell arresto. In caso contrario, cioè se la macchina non si ferma mai, si dice che essa è non applicabile all informazione contenuta inizialmente sul nastro. Si supponga ora che sia possibile rappresentare un qualunque problema di una determinata classe mediante un insieme di simboli registrati sul nastro di una macchina di Turing, e che tale macchina sia applicabile all informazione costituita da tali simboli e la trasformi in un altra informazione rappresentante la soluzione del problema. Si dirà allora che quella macchina di Turing può risolvere la classe di problemi considerata. Prof. A. Venia 2
Esempi di funzionamento Esempio 1 Si consideri la seguente classe di problemi: Dato un numero n rappresentato in notazione decimale, determinare la rappresentazione decimale del numero n + 1. Facendo riferimento a quanto si è detto nel paragrafo precedente, si supponga che il numero n sia registrato sul nastro di una macchina di Turing avente il seguente alfabeto esterno: Si supponga, inoltre, che l unità di controllo esamini la cella contenente la cifra meno significativa del numero dato, le cui cifre decimali sono scritte una per cella da sinistra verso destra, mentre le celle rimanenti sono vuote. Se si indica con q 1 il simbolo di stato che si trova nella memoria interna al momento in cui la macchina inizia il suo funzionamento, si verifica facilmente che la matrice funzionale rappresentata nella tabella accanto (costituita da 11 righe e 2 colonne) è applicabile alla informazione iniziale e la trasforma nella soluzione del problema considerato, lasciando sotto esame la cifra meno significativa. Una verifica può essere fatta sullo schema seguente, in cui sono rappresentati gli stati della macchina e il contenuto del nastro al termine di ciascuno dei passi del suo funzionamento, nel caso in cui il contenuto iniziale sia il numero 2599. La cella sotto esame è individuata mediante una freccia e quindi all inizio del funzionamento la macchina considera la cifra meno significativa del numero, che in questo caso è 9. Questa è trasformata in uno zero e la macchina passa a considerare la cella immediatamente a sinistra, dove si trova ancora la cifra 9, che viene pure trasformata in zero. La macchina passa allora a considerare la cella a sinistra, dove si trova una cifra diversa da 9 (5 in questo caso), che viene trasformata nella cifra immediatamente superiore (cioè 6). A questo punto la macchina avrebbe completato la sua funzione, ma la matrice funzionale provvede a farle assumere lo stato q 2 e a far scorrere il nastro in direzione opposta fino ad incontrare una cella vuota (cioè un simbolo s 0 ). Prof. A. Venia 3
La macchina passa allora a considerare la cella a sinistra (che conterrà la cifra meno significativa della soluzione del problema) ed assume lo stato q 0, cioè si arresta. Si osservi che, nel caso in cui la cifra meno significativa del dato iniziale fosse diversa da 9, la macchina, dopo averla sostituita con la cifra immediatamente superiore, potrebbe fermarsi senza verificare se la cella a destra è vuota. È però necessario tener presente che la macchina di Turing non conserva memoria degli stati precedenti e non può pertanto decidere ad un determinato passo se in precedenza ha fatto oppure non ha fatto spostamenti verso sinistra. Esempio 2 Si consideri la seguente classe di problemi: Dati due numeri interi positivi o nulli m ed n, rappresentati rispettivamente da m + 1 cifre 1 e da n + 1 cifre 1, costruire la somma m + n rappresentata da m + n + 1 cifre 1 1. Si supponga che i due numeri siano registrati sul nastro di una macchina di Tu- ring avente il seguente alfabeto esterno: s 0 (simbolo vuoto) 1 (simbolo della notazione unaria) * (simbolo di separazione tra i due numeri) Le n+1 cifre 1 rappresentanti il numero n occuperanno n+1 celle consecutive, separate mediante una cella contenente il simbolo * dalle m+1 celle consecutive contenenti le m+1 cifre 1 rappresentanti il numero m. Le rimanenti celle sono vuote. All inizio del funzionamento la macchina si trova nello stato q 1 e l unità di controllo esamina la cella all estrema sinistra del numero n come è illustrato nella fig. 2.24, in cui si è supposto n=4 ed m=3. La matrice funzionale, rappresentata nella tabella, costituita da 3 righe e 4 colonne, è applicabile alla informazione iniziale considerata e la trasforma nella soluzione del problema, costituita da m+n+1 cifre 1 rappresentanti il numero m+n in rappresentazione unaria. Al termine del funzionamento la macchina si trova nello stato di arresto q 0, mentre l unità di controllo esamina la cella a sinistra della prima cifra del risultato. Il funzionamento della macchina può essere seguito sulla fig. 2.24. Dopo aver cancellato la cifra 1 all estrema sinistra, la macchina si pone nello stato q 2 ed esplora tutte le celle alla destra della prima senza alterarne il contenuto, finché giunge alla prima cella vuota nella quale scrive una cifra 1, ponendosi poi nello stato q 3. In questo stato la macchina scorre verso sinistra tutte le celle senza alterarle fino 1 Questo sistema di rappresentazione prende il nome di sistema unario. In esso lo zero è rappresentato da una cifra (o da un qualsiasi simbolo, per esempio una barra verticale), il numero I da due cifre, il numero 2 da tre cifre e così via. Prof. A. Venia 4
ad incontrare la prima cella vuota, dopo di che si pone nuovamente nello stato q 1 e si sposta a destra, ripetendo la situazione iniziale. A questo punto le situazioni precedenti si ripetono più volte: la macchina si sposta a destra sul nastro trascrivendo la cifra i iniziale, che viene cancellata, alla destra dell ultima cifra 1 del secondo numero. La successione delle operazioni cambia quando la macchina, dopo aver cancellato tutte le cifre 1 che precedono l asterisco, si trova nello stato q 1 ad esaminare la cella contenente l asterisco. Infatti, a questo punto, essa cancella il contenuto ditale cella e si pone nello stato q 4, spostandosi sulla cella adiacente. Anche la cifra 1 contenuta in questa cella viene cancellata (infatti il numero m+n è rappresentato da m+n+1 cifre 1) e la macchina si arresta. Ipotesi fondamentale della teoria degli algoritmi Dalla definizione della macchina di Turing data in precedenza e dagli esempi che sono stati successivamente forniti è facile arguire come una macchina di Tu- ring sia in grado, pur con grande lentezza e pesante inefficienza, di eseguire un algoritmo. Ci si può quindi domandare quanto ampio sia l insieme costituito dai problemi (o meglio, dalle classi di problemi) per i quali esiste una macchina di Turing che li risolve. Le ricerche effettuate sia da Turing che da altri hanno condotto a riconoscere che tale insieme è molto ampio e che tutti gli algoritmi conosciuti possono essere realizzati mediante macchine di Turing dotate di opportune matrici funzionali. Diviene pertanto opportuno avanzare l ipotesi che qualsiasi algoritmo possa essere realizzato mediante una macchina di Turing. Tale ipotesi viene detta ipotesi fondamentale della teoria degli algoritmi e dalla sua accettazione discende che la teoria degli algoritmi coincide con la teoria delle macchine di Turing. Pertanto, il problema dell esistenza o della non esistenza di un algoritmo per risolvere una certa classe di problemi può essere ricondotto alla ricerca o alla dimostrazione delle inesistenza di una macchina di Turing. La validità dell ipotesi fondamentale della teoria degli algoritmi non è essenziale allo sviluppo formale della teoria delle macchine di Turing, che ha una sua validità intrinseca, tuttavia è rilevante il fatto che altri studiosi, utilizzando un approccio completamente diverso, sono giunti a definire il concetto di algoritmo in forme risultate poi equivalenti a quella introdotta da Turing. Tra le teorie sviluppate si possono ricordare, ad esempio, la teoria degli algoritmi normali di Markov e la teoria delle funzioni ricorsive generali di Kleene. Il concetto di macchina di Turing può subire un estensione nel senso che è possibile definire una macchina di Turing universale, in grado di eseguire il lavoro di una macchina di Turing dotata di una matrice funzionale qualsiasi. A tale scopo la macchina di Turing universale sarà dotata di una matrice funzionale in grado di «imitare» il funzionamento di una qualsiasi macchina di Turing. La macchina universale opererà a partire da una configurazione iniziale che prevede la registrazione sul nastro sia della matrice funzionale della macchina da imitare sia della configurazione iniziale di questa. Si osservi, infine, che un moderno calcolatore elettronico può essere paragonato ad una macchina di Turing universale. Nel calcolatore, il ruolo della matrice funzionale da imitare è svolto dal programma registrato nella memoria, che viene interpretato (imitato) dall unità di governo. Nella memoria del calcolatore vengono registrati anche i dati iniziali del problema, che vengono trasformati nelle informazioni costituenti la soluzione. Una differenza essenziale tra macchina di Turing e calcolatore elettronico è ovviamente nella capacità della memoria, che è infinita nella macchina di Turing mentre rimane limitata in un calcolatore, anche se in realtà può essere ampliata senza limitazioni pratiche. Da ELEMENTI DI INFORMATICA di Mario Italiani - Giuseppe Serazzi - ETAS LIBRI Prof. A. Venia 5