Principio di composizione delle MT

Transcript

Principio di composizione delle MT
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.
Esempio3
Esempio2
!
q0
q1
q q2 2
!
0
D
q#
1 q0
"
1
D
2 q0
2
D
q#
q##
3
D
q##
4 q0
4
D
5 q0
3 q0
5
D
q#
q#
q##
qq
#
6
D
qq#
7 q0
7
D
8 q0
8
D
q# q
q#
q##
q#
q#
9
D
q#
q#
0S
"
S q1
a
D
"Sq2
6 q0
9q0
1 q0
S
q0
D
q1
q2
Dq0
| q1
|
"Dq2
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
q3
q4
q5
0
D
q#
1 q3
1
D
q#
2 q3
2
D
q#
3 q3
3
D
q#
4 q3
4
D
q#
5 q3
5
D
q#
6 q3
6
D
q#
7 q3
7
D
q#
8 q3
8
D
q#
9 q3
9
D
q#
0S
1
S q4
q#
1 q3
D
"Sq5
S
!
Macchina che accetta due serie di sbarre
separate da un carattere *, ne calcola
la somma e trasforma la somma come
numero decimale.
La macchina inizia la sua computazione
sommando sequenze di caratteri |
separati dal carattere *. Lo stato di stop,
individuato dalla coppia con (q0 , *) attiva
la scansione della stringa di caratteri | per
poterli contare
q
0
q
1
Dq
q
2
|q
"
D
|
"Dq
S
D
"q
S
D
*
0
2
3
Tesi di Church-Turing
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 variabile booleana è
vera (while…)
Questo teorema implica 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
s0
s1
s2
...........
sn
!
1
11
111
.........
1n+1
1n+2
q0
q1
1
11
.......
..........
n+2
qY
S
D
F
Codifica dei simboli di nastro
(la potenza si riferisce alla
concatenazione dei simboli)
Codifica degli stati
1
1
11
111
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 x.
Una transizione
!(q , x) = (y, d, q )
i
j
con
d #{S,D,F} e x, y #{0,1, "}
viene codificata nel seguente modo
EN(q ) 0 EN(x) 0 EN(y) 0 EN(d) 0 EN(q )
i
j
simbolo
!
q
0
"
Dq
q
1
q
2
1
0
q
Y
1
Dq
2
q
Y
0
1
"
q
0
q
1
q
2
q
Y
S
D
F
codice
1
11
111
1
11
111
1111
1
11
111
simbolo
Esempio di codifica cont
Pertanto le quattro transizioni indicate nella matrice funzionale sono
così codificate
!(q , ") = (",D,q )
!(q0,0) = 0, F, q 1
!(q1,1) = (1,D,qY)
!(q1,1) = 1, F, q2
2
Y
1 0 111 0 111 0 11 0 11
11 0
1 0 1 0 111 0 1111
11 0 11 0 11 0 11 0 111
111 0 11 0 11 0 111 0 1111
0
1
q
q0
q1
q2
SY
D
F
codice
1
11
111
1
11
111
1111
1
11
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 macchina stessa.
L(Mj) = { w #!" | q w |$ * x q y con q# Z }
0
w
wk . . . . ws
M
Mi
.
.
Mj
0 0 0 1 0 0 1 0 . . . .
. . . . . . . .
0 1 0 0 0 1 0 0 . . . .
Una volta enumerate tutte le stringhe wi di !", 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 si ferma
con input w
"M""w"
H
HALT/accettazione
HALT/rigetto
M non si ferma
con input w
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 si ferma
con input w
"M""w"
H'
LOOP
HALT/rigetto
M non si ferma
con input w
Il passo successivo è quello di combinare la macchina H’ con una macchina Copia che sia
capace di replicare il suo input.
M si ferma
con input M
LOOP
M
COPIA
"M "M"
D
H'
HALT/rigetto
M non si ferma
con input M
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 si ferma
con input D
LOOP
D
COPIA
"D" "D"
D
H'
HALT/rigetto
D non si ferma
con input D
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.
La macchina universale
Una immediata conseguenza della dimostrazione è la seguente
Corollario
il linguaggio LH = {M (w) | M rappresenta una macchina di Turing che si ferma con input w}
sull’alfabeto {0,1}* è un linguaggio non ricorsivo [e quindi non decidibilie].
L in altre parole è costituito dalle stringhe che rappresentano una MT seguita dall’input da
H
essa accettato ovvero che corrispondono ai valori 1 del vettore caratteristico della MT.
Tuttavia è possibile dimostrare il seguente
Teorema: il linguaggio LH è ricorsivamente enumerabile [e quindi semidecidibile].
Sapendo perciò che un linguaggio ricorsivo è anche ricorsivamente numerabile si avrà l’importante
risultato:
Corollario: la classe dei linguaggi ricorsivi è contenuta in modo proprio nella classe dei linguaggi
ricorsivamente enumerabili ovvero LR ! LRE
La dimostrazione del teorema si basa su una macchina universale che lavora secondo il
seguente schema
M si ferma
con input w
"M""w"
U
Accettazione
Loop
M non si ferma
con input w
In sintesi si deve dimostrare che la
macchina universale U simula
perfettamente ogni altra Macchina di Turing
Ricorsiva enumerabilità di LH
La dimostrazione verrà fatta con una macchina a tre nastri. Nel nastro 1 verrà codificato l’input
mentre il nastro 3 verrà usato per effettuare la simulazione dell’esecuzione della macchina M.
Una computazione della macchina U viene ad essere definita nel seguente modo:
1. Se la stringa di input non è della forma “M” “w”, U si muove indefinitivamente verso destra.
2. Viene ricopiata la stringa w sul nastro 3, la testina viene quindi riposizionata a sinistra al primo
carattere, cosicché sul nastro 3 viene ad essere definita la configurazione iniziale di una
computazione di M con input w.
3. viene scritto sul nastro 2 lo stato q (il simbolo 1 nella nostra codifica)
0
4. Passo di simulazione. La transizione di M viene determinata dal simbolo x scandito sul nastro 3
e lo stato qi codificato sul nastro 2.
a) Viene scandito il nastro 1 alla ricerca della coppia EN(qi ) EN (x) se tale transizione non esiste
U si ferma e accetta l’input (configurazione finale).
b) Assunto che il nastro 1 contenga la transizione EN(q ) 0 EN(x) 0 EN(y)0 EN(d) 0 EN(q )
i
j
i) EN(qi) è rimpiazzato da EN(qj) sul nastro 2
ii) il simbolo y è scritto sul nastro 3
iii) la testina del nastro 3 è mossa nella direzione specificata da d
5. si ripete il passo di simulazione (punti 4 e 5)
La simulazione della macchina U accetta stringhe in LH mentre per stringhe in {0,1}* - LH
cicla indefinitivamente. Poiché L = L(U) L è ricorsivamente enumerabile essendo
H
H
ricorsivamente enumerabile L(U).
Indecidibilità del Linguaggio di diagonalizzazione
Ld = tutte le stringhe wi tali che
wi non è in L(Mi)
Ld = { wi ! "* | wi ! L(Mi}
Teorema il linguaggio Ld è non ricorsivamente enumerabile
w
M
wj
ws
Mi
0 0 0 1 0 0 1 0 . . .
.
Mj
0 0 1 0 1 0 0 1
0 1 0 0 0 1 0 0 . . . .
Supponiamo Ld = L(M) per una macchina M,
allora deve esistere una Macchina di Turing nella
enumerazione ovvero un indice i che individua
la macchina Mi che riconosce wi ! Ld
- se wi ! Ld allora Mi accetta wi pertanto per
definizione di Ld wi non è in Ld poiché Ld contiene
solo stringhe wj tale che Mj non accetta wj
- se wi ! Ld allora Mi non accetta wi pertanto per
definizione di Ld wi è in Ld
Evidentemente si ha contraddizione poiché wi non può essere o non essere in Ld