Tipologie di macchine di Turing - Macchina di Turing standard - Macchina di Turing con un nastro illimitato in una sola direzione - Macchina di Turing multinastro - Macchina di Turing non deterministica Si puo mostrare come tutte queste macchine siano tra di loro equivalenti per quanto riguarda la decidibilità. Diverso è il loro comportamento riguardo la complessità computazionale. In realtà questa equivalenza è valida in senso lato se non ci sono limitazioni di risorse. Nel caso in cui ci siano limitazioni di risorse (come ad esempio una limitazione polinomiale), la determinazione della relazione tra potere computazionale della macchina non deterministica e quella deterministica è ancora un problema aperto.
Equivalenza tra MTND e MTD: Simulazione di una MTND con una MTD a tre nastri - Sul primo nastro viene ricopiato l input - Sul secondo nastro vengono generati in ordine lessicografico tutte le stringhe rappresentanti i possibili percorsi (di lunghezza max. k) che dalla radice vanno alle foglie - Sul terzo nastro vengono simulate le computazioni Passo di simulazione supposto essere i 1,i 2,...i k la generica stringa sul nastro 2 1. si ricopia l input dal nastro 1 al nastro 3 2. si pone j =1 3. se! (q,x) < i j,la fase termina con esito negativo 4. altrimenti detta (q, x, r) con r "{S,D,F} la i j -esima terna in! (q,x), si applica la corrispondente transizione sul nastro 3 5. si incrementa j di 1 6. se j! k si torna al passo 3 7. se j > k e si è raggiunta una configurazione finale si termina con esito positivo altrimenti con esito negativo Il passo di simulazione viene ripetuto per ogni stringa sul nastro 2 (ci sono al max. d k stringhe) Se si assume l esistenza di un cammino che porta ad una configurazione finale di lunghezza l esiste allora una fase della simulazione di lunghezza l sul secondo nastro che individua tale cammino. Se la MTND accetta una stringa in k! 0 passi allora la MTD accetta la medesima stringa in O(kd k ) passi, se d è il branching factor dell albero delle computazioni (grado di non determinismo).
Principio di composizione delle MT La definizioni date fanno riferimento a situazioni in cui la macchina sia capace di risolvere problemi singoli. E possibile far sì che macchine progettate per problemi elementari possano essere combinate in modo da svolgere compiti più complessi. Intuitivamente, è possibile far subentrare ad una macchina A che si arresta un altra macchina B a seconda del simbolo osservato nello stato finale della macchina A. Ogni macchina può essere vista come un dispositivo capace di risolvere un problema dato avendo al suo interno il programma di macchina cablato. Volendo fare il parallelo con i moderni calcolatori è come se il programma fosse memorizzato in una memoria ROM.
Esempio di composizione Vengono messe assieme le macchine relative all esempio 2 e all esempio 3. Esempio2! q 0 q 1 q q 2 2 0 D q # 1 q 0 1 D q # 2 q 0 2 D q ## 3 q 0 3 D q ## 4 q 0 4 D q # 5 q 0 5 D q q # qq ### 6 q 0 6 D qq # 7 q 0 7 D q q # 8 q 0 8 D q # q q ### q # 9q 0 9 D q # 0 S " S q 1 q # 1 q 0 a D "Sq 2 S Esempio3! q 0 q 1 q 2 " D Dq 0 q 1 "Dq 2 S D * " q # S D Contatore di una sequenza di caratteri Lo stato di stop della prima macchina viene convertito nello stato iniziale della seconda. Eventualmente si procede ad una ridenominazione degli stati. Somma di due numeri, separati dal carattere *, dati come sequenza di caratteri
Esempio di composizione! q 0 q 1 q 2 q 3 q 4 q 5 Macchina che accetta due serie di sbarre separate da un carattere *, ne calcola la somma e trasforma la somma come numero decimale. 0 D q # 1 q 3 1 D q # 2 q 3 2 D q # 3 q 3 3 D q # 4 q 3 La macchina inizia la sua computazione sommando sequenze di caratteri separati dal carattere *. Lo stato di stop, individuato dalla coppia con (q 0, *) attiva la scansione della stringa di caratteri per poterli contare 4 D q # 5 q 3 5 D q # 6 q 3 6 D q # 7 q 3 7 D q # 8 q 3 8 D q # 9 q 3 9 D q # 0 S " D Dq 0 q 1 S q 4 q # 1 q 3 "Dq 2 S D D "Sq 5 S * " q 3 S D
Tesi di Church- Il principio di Composizione rende possibile la costruzione di macchine che risolvono problemi di notevole complessità. Ipotesi fondamentale della Teoria degli Algoritmi. Tutti gli algoritmi possono essere formulati sotto forma di matrici funzionali e quindi eseguiti dalla corrispondente macchina di Turing. L ipotesi non si riferisce solo agli algoritmi già scoperti, ma anche a tutti quelli che si potranno scoprire nel futuro. Questa ipotesi risulta indimostrabile in quanto alla nozione (vaga) di tutti gli algoritmi corrisponde la nozione (matematica) di Macchina di Turing. Tuttavia 1. Tutti gli algoritmi conosciuti possono essere espressi come matrici funzionali 2. Tutte le definizioni formali di algoritmo (Algoritmi normali di Markov, Funzioni ricorsive di! Kleene e Godel etc.) arrivano alle stesse conclusioni.
Teorema di Jacopini-Bohm In particolare, il Teorema di Jacopini-Bohm (1966) mostra che ogni funzione calcolabile con una macchina di Turing è anche calcolabile con un programma scritto in un linguaggio che compone sottoprogrammi con tre operatori: - esecuzione sequenziale di due sottoprogrammi ( ; ) - scelta dell esecuzione tra due sottoprogrammi a seconda del valore di una condizione booleana (if then else) - esecuzione ripetuta di un sottorogramma fino a che una vairable booleana è vera (while ) Questo teorema implica quindi che tutti i normali linguaggi di programmazione sono TURING-EQUIVALENT, hanno cioè la stessa potenza espressiva delle Macchine di Turing.
Macchina di Turing Universale Per le Macchine di Turing viste fino ad ora si fa l implicita assunzione che siano dispositivi hardware in cui il programma (la matrice funzionale) è cablato al loro interno. E possibile tuttavia costruire una macchina U (Macchina di Turing Universale) capace di accettare in ingresso una macchina di Turing M con il proprio input w e simularne l esecuzione. Cioè: U( M w ) = M(w) M(w) è una stringa che rappresenta il risultato della Macchina M sull ingresso w. In altre parole il comportamento della macchina universale U è tale che essa si ferma se e solo se M si ferma sul input w. La macchina di Turing Universale si comporta analogamente ad un qualunque computer attuale nel senso che accetta in input una stringa M, w che è assimilabile perciò all usuale programma seguito dai propri dati di ingresso. Occorre tuttavia precisare in che modo si possa codificare una Macchina di Turing sul nastro.
(Una) codifica di una Macchina di Turing L obiettivo è quello di esprimere in una stringa binaria ogni possibile macchina di Turing. Lo schema di codifica potrebbe essere il seguente: Simbolo Codice s 0 1 s 1 11 s 2 111...... s n 1 n+1! 1 n+2 Codifica dei simboli di nastro (la potenza si riferisce alla concatenazione dei simboli) q 0 1 q 1 11...... q Y 1 n+2 Codifica degli stati S 1 D 1 1 F 1 1 1 Codifica degli spostamenti
Esempio di Codifica Macchina che accetta stringhe che iniziano con 0 oppure con 11 Si definisce una funzione di codifica EN(x) che codifica il simbolo codice simbolo x.! q q q 0 1 0 1 2 1 11 Una transizione " Dq " 111 1 q 1 0 (q, x) = (y, d, q ) i j 0 q Y q 11 1 con q 1 Dq 2 q 2 111 Y d # {S,D,F} e x, y # {0,1, "} q Y 1111 viene codificata nel seguente modo EN(q i ) 0 EN(x) 0 EN(y) 0 EN(d) 0 EN(q j ) S 1 D 11 F 111
Esempio di codifica cont Pertanto le quattro transizioni indicate nella matrice funzionale sono così codificate simbolo codice 0 1 1 11 " 111 q 0 1 q 1 11 (q, ") = (",D,q ) 1 0 111 0 111 0 11 0 11 0 1 q 2 111 (q 1,0) = 0, F, q Y 11 0 1 0 1 0 111 0 1111 q Y 1111 (q,1) = (1,D,q ) 11 0 11 0 11 0 11 0 111 1 2 S 1 (q,1) = 1, F, q 111 0 11 0 11 0 111 0 1111 2 Y D 11 F 111 Si fa la convenzione che due transizioni siano separate tra di loro dalla coppia 00 e che l inizio e la fine della stringa di codifica della matrice di transizione sia rappresentata da 000, pertanto: 000 101110111011 011 00 1101010111 01111 00 11011 011 0110111 00111011011011101111000 Ne deriva che, ad esempio se vogliamo attivare la macchina M con un input 11, la stringa: 000 101110111011 011 00 1101010111 01111 00 11011 011 0110111 0011101101101110111100011 non è altro che la stringa M w, che può essere interpretata come la macchina con matrice funzionale M applicata alla stringa di input 11.
Enumerazione di Macchine di Turing - Il sistema di codifica di una macchina di Turing ci porta a dire che queste possono essere! enumerate, cioé è possibile costruire una corrispondenza tra le stringhe binarie! che rappresentano le macchine di Turing e i naturali. - E sempre possibile mettere in relazione ciascuna macchina con il proprio input o, detto in altre parole, tutte le stringhe di input accettate dalla MT costituiscono il linguaggio riconosciuto dalla machina stessa. L(Mj) = { w # $* q 0 w % * x q y con q # Z } M w wk.... ws Mi.. Mj 0 0 0 1 0 0 1 0............ 0 1 0 0 0 1 0 0.... Per ogni Mj è possibile definire il suo vettore caratteristico cioé un vettore che ha un 1 in corrispondenza delle stringhe wi che sono accettate dalla macchina Mj e che appartengono quindi al linguaggio L(Mj ).
Problema della terminazione TEOREMA: E indecidibile dire se una macchina di Turing termina la sua computazione La dimostrazione si fa per assurdo. Sia H una Macchina di Turing che risolve il problema, ciò significa che: 1. L input di H è costituito dalla stringa M w 2. Una stringa è accettata da H se la computazione di M termina altrimenti la stringa è rifiutata "M""w" H M si ferma con input w M non si ferma con input w HALT/accettazione HALT/rigetto A partire da H si costruisce la macchina H che effettua le stesse computazioni di H eccetto che H cicla indefinitivamente se H termine in uno stato di accettazione. L idea per la costruzione di H è quella di creare una macchina che si ferma se la macchina di input non si ferma e non si ferma se la macchina di input si ferma. Ciò si può facilmente ottenere se ad esempio si addizionano ad H transizioni che muovono la testina indefinitivamente a destra se H raggiunge lo stato di accettazione.
Problema della terminazione cont. "M""w" H' M si ferma con input w M non si ferma con input w LOOP HALT/rigetto Il passo successivo è quello di combinare la macchina H con una macchina Copia che sia capace di replicare il suo input. M COPIA "M "M" D H' M si ferma con input M M non si ferma con input M LOOP HALT/rigetto La macchina D accetta in input una matrice funzionale ne crea una copia e fornisce la coppia M M in ingresso ad H la cui esecuzione da parte di H produce la stringa M(M) ovvero il risultato della M applicata a se stessa.
Problema della terminazione cont. Poiché è possibile codificare ogni macchina di Turing come stringa binaria anche la macchina D può essere codificata e data in input a D stessa. D COPIA "D" "D" D H' D si ferma con input D D non si ferma con input D LOOP HALT/rigetto Si ha contraddizione in quanto la macchina D si ferma se si verifica la condizione che D non si ferma sull input D. Oppure D non si ferma se D si ferma sull input D.