FONDAMENTI INFORMATICA_Macchina di Turing

Transcript

FONDAMENTI INFORMATICA_Macchina di Turing
MODULO 07
LA MACCHINA DI TURING
Nel 1936 Alan Turing presenta una definizione di computabilità basata
sull’osservazione del comportamento di un agente umano che sta eseguendo un
calcolo (algoritmo) con carta e penna, nota come macchina di Turing (MdT).
Turing nota che:
1. Per effettuare una computazione è necessario che esista un input e, dopo una
quantità finita di calcoli scritti, viene prodotto un output;
2. Anche se di norma la lettura e la scrittura su un foglio di carta si effettuano in linee
orizzontali o verticali, è possibile semplificare la situazione e immaginare che la
macchina legga o scriva su un nastro lineare;
3. Visto che a priori non poniamo limite alla quantità di carta necessaria per scrivere
i calcoli, anche il nastro è potenzialmente infinito in entrambe le direzioni e
inoltre, dal momento che scriviamo i simboli uno alla volta, lo consideriamo
suddiviso in celle ciascuna contenente un singolo simbolo;
4. Anche se è teoricamente necessario poter disporre di simboli distinti da associare
a infinite entità (ad esempio un simbolo per ogni numero), in genere usiamo
simboli complessi (come le parole) costruiti a partire da un insieme finito di
simboli atomici (come le lettere). La macchina, dunque, è in grado di leggere e
stampare simboli che appartengono a un alfabeto finito;
5. La macchina è dotata di due direzioni di movimento (che corrispondono
all’azione di spostare l’attenzione da una parte all’altra del foglio) lungo il nastro,
di una cella per volta: questa ipotesi è necessaria, sia perché la macchina deve
scrivere simboli in celle differenti, sia perché, in questo modo, resta traccia della
storia del “lavoro“ già svolto sino a un dato istante. Le due direzioni di
spostamento consentono alla macchina di tornare, all’indietro, su una cella che
già contiene un simbolo e di cancellarlo scrivendovi internamente un nuovo
simbolo;
6. Ciascun “passo” dell’algoritmo determina l’azione successiva da compiere (basta
pensare all’algoritmo per effettuare una addizione…), che a sua volta dipende dal
simbolo analizzato in un certo istante e dallo stato (della mente) dell’agente.
Ma lo “stato della mente” coincide col lavoro già fatto sino a un dato istante: in
realtà non è del tutto vero che un agente umano ricorda tutto il lavoro già fatto nel
“portare avanti” un algoritmo; ricorda al più pochi passi precedenti e sa che ogni
passo è stato determinato dall’algoritmo stesso. Insomma, lo stato della mente
dipende dall’algoritmo e dalle operazioni già fatte (probabilmente solo dall’ultima
operazione…).Siccome il numero di stati diversi di un agente umano è finito
anche quello della macchina è finito.
1
7. La macchina lavora automaticamente obbedendo a precise istruzioni, in numero
finito, che la informano su che cosa debba fare quando, trovandosi in uno
specifico stato, analizza (legge) un simbolo del nastro. I simboli provengono
dall’esterno e sono scritti sul nastro al quale la macchina è collegata mediante un
dispositivo (testina) di lettura/scrittura.
A questo punto possiamo illustrare il modello fisico della macchina
Finestra stato corrente
qi
Programma
s0
s1
s2
…
sj
…
sk
s0
s0
s0
nel quale vediamo
•
Il nastro, suddiviso in caselle, infinito a destra e a sinistra. Ogni cella contiene un
simbolo appartenente a un insieme finito S = {s0, s1, … ,sn}. Uno di questi, s0, è
usato per indicare che la cella è priva di simbolo (blank) : lo chiameremo “bianco”.
Si suppone che il nastro sia tutto bianco tranne che per una parte di lunghezza
finita;
•
Un organo di controllo a stati finiti che contiene il programma per la macchina;
•
Una testina di lettura/scrittura che permette al controllo di leggere o scrivere un
simbolo per volta;
In ciascun istante, il simbolo che si trova nella casella corrente esaminata costituisce lo
“stimolo” di ingresso per il controllo.
La macchina reagisce allo stimolo scrivendo nella casella un nuovo simbolo (che può
anche coincidere col precedente), portandosi in nuovo stato e spostandosi sul nastro di
una casella a destra o a sinistra.
In questo modo lo stimolo per il passo (o ciclo operativo) successivo verrà da una
casella differente e potrà essere letto un simbolo scritto in precedenza.
Questo significa che la macchina, oltre alla memoria interna che contiene il programma,
possiede una memoria esterna non indirizzabile.
2
Il comportamento della MdT si può
funzionale,
descrivere con una tabella detta matrice
sj
qi
skqrxt
con tante righe quanti sono gli stati q0, q1, ... ,q m e tante colonne quanti sono i simboli
dell’alfabeto. Una qualunque cella della matrice descrive l’azione della macchina
corrispondente allo stato qi indicato sulla riga e al simbolo sj della colonna corrispondente.
L’azione, specificata da una terna come skqrxt, consiste nelle tre seguenti operazioni:
1. scrivere sulla cella del nastro il simbolo sk ;
2. transire nello stato qr ;
3. spostarsi sul nastro di una casella verso destra o verso sinistra a seconda che xt =
D o xt = S.
In particolare sk può essere uguale a sj e qr uguale a qi : significa che la macchina può
lasciare inalterato il simbolo sul nastro e/o restare nello stesso stato.
Una generica casella della matrice di transizione, corrispondente a una coppia qi sj, può
essere bianca: significa che in quella condizione, cioè quando nello stato qi viene letto il
simbolo sj, la macchina non intraprende alcuna azione ma si ferma arrestando il calcolo.
Per specificare che cosa sia una computazione di una MdT, dobbiamo introdurre la
nozione di descrizione istantanea iniziale, che precisa la situazione iniziale, di partenza,
della macchina.
Una descrizione istantanea iniziale si specifica fornendo:
1. un ingresso finito, cioè un nastro con un numero finito di simboli diversi dal bianco;
2. la posizione della testina di lettura/scrittura rispetto al nastro;
3. lo stato iniziale del controllo.
Dopo ciascun passo, la configurazione del nastro, la posizione della testina e lo stato del
controllo saranno cambiati e, presi insieme, costituiscono la descrizione istantanea (DI)
della macchina.
La descrizione istantanea finale è la descrizione istantanea per quale non esiste, nella
matrice funzionale, una configurazione successiva: nella matrice funzionale, la casella
corrispondente allo stato e al simbolo sotto la testina è vuota.
3
Per computazione di una MdT si intende una sequenza finita di descrizioni
istantanee, di cui la prima iniziale e l’ultima finale, e ognuna ottenuta dalla precedente in
un passo.
Descrizione matematica
Siano S = {s0, s1, ... ,sn} un alfabeto finito di simboli, con s0 simbolo distinto per indicare il
bianco, Q = {q0, q1, ... ,qm} un insieme finito di stati e M = {L, R} quello dei simboli per
rappresentare gli spostamenti (Left, Rigth).
In ogni istante, la configurazione della macchina ovvero la stringa di simboli sul nastro, la
posizione della testina e lo stato, può essererappresentata come una sequenza infinita di
simboli:
... s0, s0, σ1, σ2, ... , σj, qi, sj, σj + 1, ... , s0, s0, ...
(1)
di cui solo un numero finito è diverso da s0; il simbolo qi indica lo stato della macchina e sj,
alla sua destra, il simbolo in lettura (implicitamente la testina è su questo simbolo).
La sequenza (1) corrisponde pertanto a questa situazione:
qi
... s0 s0 σ1 σ2 ... σj sj σj + 1 .… s0 s0 ...
Se S* è l’insieme di tutte le sequenze finite di simboli che appartengono a S, sequenze
come quella indicata in (1) si possono denotare sinteticamente con α q s β, dove α, β ∈ S*
, q∈Q e s∈S; s è il simbolo in lettura. Una stringa come α q s β fornisce una DI della
macchina.
Il funzionamento della MdT è descritto con un insieme di quintuple che specificano il
passaggio da una DI alla successiva determinato da una passo della computazione.
Ciascuna quintupla si presenta come
qi sj sk qr xt
(2)
con qi, qr ∈ Q; sj, sk ∈ S e xt ∈ M, e si interpreta dicendo che se la macchina è nello stato
qi e legge il simbolo sj, allora scrive sk sul nastro, passa nello stato qr e si sposta di una
casella a destra o a sinistra come indicato da xt: notare che k, r e t dipendono da i e j:
questa dipendenza si esprime scrivendo le quintuple anche come qi sj sij qij xij.
Non possono esistere due quintuple con in primi due simboli uguali perché la macchina
opera in modo deterministico.
4
Se in corrispondenza di una coppia qi sj non esiste alcuna quintupla con i primi due
simboli uguali a quelli della coppia, la macchina arresta la computazione e la
configurazione della sequenza (1) assume il significato di DI finale.
Definizione: Macchina di Turing
Una Macchina di Turing Z è una terna (Q, S, P) nella quale:
Q = {q0, q1, ... ,qm} è un insieme finito di stati;
S = {s0, s1, ... ,sn} è un insieme finito di simboli con s0 detto bianco;
P è un sottoinsieme di Q x S x S X S X {L, R}, l’insieme delle quintuple di Z, privo di
due quintuple con le prime due componenti uguali.
Ora vediamo come si possa descrivere un passo di computazione attraverso una
relazione che lega due descrizioni istantanee.
Se indichiamo con ⊢z tale relazione, allora ⊢z ⊆ IDI x IDI dove IDI indica l’insieme delle
descrizioni istantanee e IDI = S∗ • Q • S • S* (‘•’ indica concatenazione) o più
semplicemente IDI = { α qi sj β }.
La relazione ⊢z è definita nel modo che segue:
a) α qi sj β ⊢z α′ qij sLsij β se qi sj sij qij L ∈ P
(sL è il simbolo alla sinistra di sj prima del passo di calcolo, mentre sij è quello scritto al
posto di sj durante il passo)
b) α qi sj β ⊢z α sij qij sR β′ se qi sj sij qij R ∈ P
(sR indica il simbolo alla destra di sj prima del passo di calcolo, mentre sij è quello scritto
al posto di sj durante il passo).
Definizione: Computazione
Una computazione di una MdT Z è una sequenza finita
d0, d1,…, di, di + 1, … , dn
di descrizioni istantanee con (di, di + 1) ∈ ⊢z , i = 0, … , n-1.
Una computazione è terminale se esiste un intero n, tale che dn è terminale e
dn =αn qin sjn βn ; in corrispondenza a dn la macchina si ferma e il valore finale della
computazione è
y = fz (x) = αn sjn βn .
5
Se facciamo partire Z da una configurazione iniziale d0, allora o Z si fermerà, nel qual
caso d0 definisce univocamente la computazione della quale è primo elemento, o Z non si
fermerà mai, nel qual caso Z non ha alcuna computazione della quale d0 è primo
elemento.
La macchina di Turing soddisfa le condizioni richieste da una ragionevole definizione di
algoritmo. Infatti:
a) L’insieme delle quintuple, o la matrice funzionale, della macchina costituisce un
insieme finito di istruzioni;
b) La MdT è l’agente di calcolo che esegue le istruzioni citate in a);
c) La macchina può utilizzare il nastro per memorizzare i risultati intermedi;
d) La macchina opera in modo discreto;
e) Opera in modo deterministico;
f) Non esiste alcuna limitazione sulla lunghezza delle stringhe di ingresso in
quanto il nastro è illimitato;
g) Il nastro costituisce una memoria di capacità illimitata;
h) Le operazioni che la macchina può eseguire sono semplici, di complessità
limitata;
i) Non esiste limite al numero di operazioni che vengono eseguite durante
una computazione in quanto non esiste limite al numero di volte che una
quintupla può essere usata;
l) Esistono descrizioni istantanee iniziali che provocano computazioni che non si
arrestano mai (calcolo di funzioni parziali).
Esempi di MdT
a) Calcolo del successivo di un numero
Si tratta di definire la MdT che legge un numero in base 10 e calcola il suo successivo.
Le operazioni da fare si possono schematizzare come segue:
“esaminare l’ultima cifra del numero, se e` minore di 9 sommarle 1 e stop; altrimenti
(cifra = 9) sostituirla con 0 e passare all’analisi della cifra adiacente a sinistra.”
L’alfabeto è S = {b, 0, 1, ..., 9} (b denota blank); la DI iniziale è data dal numero che si
vuole incrementare scritto sul nastro, dalla testina posizionata sull’ultima cifra a destra e
dal controllo nello stato iniziale q0:
...
b
b
1
4
2
8
b
b
...
q0
6
Una matrice funzionale potrebbe essere
q0
0
1
2
...
1q1D 2q1D 3q1D ... ..
7
8q1D
8
9q1D
9
0q1S
b
1q1D
q1
con due stati q0 e q1 necessari per distinguere due situazioni
i) 1 deve ancora essere sommato (q0)
ii) 1 è già stato sommato (q1).
Se in q0 viene letta un cifra minore di 9, questa viene incrementata di 1 e il nuovo stato
diventa q1; altrimenti, se in q0 viene letto un 9, lo si pone a 0 e si passa a incrementare di 1
la cifra di sinistra restando in stato q0.
Nello stato q0 può essere letto il simbolo bianco e ciò accade quando si deve calcolare il
successore di un numero con tutte le cifre uguali a 9: in questo caso, dopo che tutti i 9
sono stati messi a 0 sarà letto un bianco, il primo alla sinistra del 9 più significativo, nello
stato q0; a quel punto la macchina scriverà 1 e passerà in q1 arrestandosi.
Dalla matrice funzionale ricaviamo facilmente l’insieme delle quintuple
P1
P2
P5
...
...
...
P9
P10
P11
q0 0 1 q1 D
q0 1 2 q1 D
q0 4 5 q1 D
...
...
...
q0 8 9 q1 D
q0 9 0 q0 S
q0 b 1 q1 D
Eercizio
A partire dalla descrizione istantanea iniziale che segue:
142q08
proseguire nella computazione sino all’arresto della macchina.
7
Funzione calcolata da una MdT
A ogni MdT Z puo` essere associata la funzione calcolata da Z, una volta che si siano
fissate delle convenzioni per la codifica dei dati iniziali e del risultato finale.
Ad esempio se si vuole calcolare una funzione f: Nn --> N una codifica degli argomenti
potrebbe essere:
0 --> 1
1 --> 11
.
.
.
n --> 1n+1
e il nastro potrebbe presentarsi come:
...b b β1 0 β2 0 ...0 βn 0 b b...
dove βi rappresenta la codifica binaria dell’argomento i-esimo.
In queste ipotesi diremo che una funzione f: Nn --> N e` Turing-calcolabile, se esiste
una macchina di Turing, Mf, di alfabeto {0, 1, b}, tale che ricevendo in ingresso una n-upla
α in Nn, produce in uscita f(α) :
Mf : 1n1 +1 0 1n2 +1 0 ... 0 1nn +1 0 ↦ 1m + 1 ⇔ f(n1, n2, ..., nn) = m.
Ecco il programma per una MdT che calcola la somma di due naturali rappresentati
secondo la codifica indicata:
1.
2.
3.
4.
5.
6.
(q0, 1, 1, q0 ,R)
(q0, 0, 1, q1 ,R)
(q1, 1, 1, q1 ,R)
(q1, 0, 0, q2 ,L)
(q2, 1, 0, q3 ,L)
(q3, 1, 0, q4 ,L).
Questa macchina calcola la funzione f(m, n) = m+n ; la parte di nastro diversa dal bianco
(b) contiene una sequenza di m+1 ‘1’ seguita da 0 seguita da una sequenza di n+ 1 ‘1’.
8
La macchina esegue nell’ordine
•
•
•
•
•
•
m+1 volte la prima istruzione scorrendo la prima di ‘1’ e restando nello stato
iniziale;
1 volta la seconda istruzione con la quale scrive 1 al posto dello ‘0’ che
separa le due sequenze; la sequenza iniziale viene modificata in una che
contiene m+n+3 simboli ‘1’ e lo stato diventa q1;
n+1 volte la terza istruzione scorrendo in tal modo la seconda sequenza di ‘1’
presente sul nastro;
1 volta la quarta istruzione con la quale passa nello stato q2 e posiziona la
testina di lettura sull’ultimo ‘1’ presente sul nastro;
1 volta la quinta istruzione, con la quale cancella l’ultimo ‘1’ sulla destra
sostituendolo con ‘0’ e transisce nello stato q3 ;
una volta la sesta con la quale cancella l’ultimo ‘1’ corrente sulla destra, lo
sostituisce con ‘0’ e passa nello stato q4 .
Non essendoci istruzioni applicabili in corrispondenza dello stato q4 , la computazione
termina e la sequenza di m+n+1 ‘1’ presente sul nastro rappresenta l’output della
macchina: questa sequenza rappresenta in numero m+n secondo la codifica adoperata.
Esercizio
Data una sequenza di 0 e di1 scritta sul nastro, progettare una MdT che senza
distruggere la sequenza conti il numero di occorrenze di 1 presenti e lo scriva in decimale
alla sua sinistra.
In letteratura, le MdT vengono presentate talvolta con qualche variante rispetto a queste
note. Si dimostra anche che modifiche nella struttura di una MdT : variazione del numero
degli stati, del numero dei simboli dell’alfabeto, aumento del numero delle testine, del
numero dei nastri o uso di nastri multidimensionali, non modificano l’insieme delle
funzioni Turing-calcolabili.
La tesi di Church
La nozione di calcolabilità effettiva sugli interi positivi si basa sul concetto di macchina di
calcolo e si collega alla possibilità di realizzare un sistema fisico che rappresenti
adeguatamente i dati e il cui funzionamento sia una simulazione fisica dei passi di calcolo.
Una questione fondamentale riguarda la possibilità di determinare una macchina (una
classe di macchine) in grado di calcolare qualsiasi funzione calcolabile nel senso
indicato; ovvero una classe di macchine computazionalmente universali.
La proposta di Turing assume un rilievo enorme poiché si è rivelata come “risposta”
costruttiva alla questione precedente.
Dopo poco tempo dalla pubblicazione dell’articolo di Turing nel 1936, Alonzo Church
propose di considerare le macchine di Turing come una classe di macchine
computazionalmente universali formulando una proposta nota, oggi, come “tesi”
9
Tesi di Church
Le macchine di Turing sono una classe di automi computazionalmente
Universali.
L’enunciato di Church non è dimostrato.
Potrebbe essere scoperta una macchina che calcola una funzione non Turingcomputabile.
L’impossibilità di un tale evento non può essere dimostrata matematicamente per il fatto
che nessuna teoria matematica può dimostrare la non-esistenza di un oggetto che non è
matematicamente definito.
Nuove leggi fisiche e nuovi fenomeni, oggi ignoti, potrebbero in futuro ampliare la
nozione di calcolo cosi’ come è, oggi, concepito.
La tesi viene sorretta solo da argomenti informali e non può essere dedotta all’interno di
una teoria formale.
A tutt’oggi non si conoscono smentite alla tesi di Church.
Inoltre tutti i modelli calcolo che sono stati via via proposti : Funzioni Ricorsive, Macchine a
Registri, Funzioni Lambda-definibili, …., si sono dimostrati equivalenti, quanto a potenza di
calcolo, alle macchine di Turing.
10