Decidibilità - Dipartimento di Informatica ed Applicazioni
Decidibilità - Dipartimento di Informatica ed Applicazioni
Decidibilità - Dipartimento di Informatica ed Applicazioni
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
DECIDIBILITÀ E INDECIDIBILITÀ<br />
Obiettivo: analizzare i limiti della risoluzione dei problemi me<strong>di</strong>ante<br />
algoritmi.<br />
Stu<strong>di</strong>eremo: il potere computazionale degli algoritmi nella<br />
soluzione dei problemi.<br />
Proveremo che esistono problemi che possono essere risolti<br />
me<strong>di</strong>ante algoritmi e altri no.
Problemi <strong>di</strong> decisione<br />
I problemi <strong>di</strong> decisione sono problemi che hanno come soluzione<br />
una risposta si o no.<br />
Esempi:<br />
◮ PRIMO: Dato un numero x, x è primo?
Problemi <strong>di</strong> decisione<br />
I problemi <strong>di</strong> decisione sono problemi che hanno come soluzione<br />
una risposta si o no.<br />
Esempi:<br />
◮ PRIMO: Dato un numero x, x è primo?<br />
◮ CONNESSO: Dato un grafo G, G è connesso?
Problemi <strong>di</strong> decisione<br />
I problemi <strong>di</strong> decisione sono problemi che hanno come soluzione<br />
una risposta si o no.<br />
Esempi:<br />
◮ PRIMO: Dato un numero x, x è primo?<br />
◮ CONNESSO: Dato un grafo G, G è connesso?<br />
◮ ACCETTAZIONE DI UN DFA: Dato un DFA B e una stringa<br />
w, l’automa B accetta w?
Ricorda: Linguaggi deci<strong>di</strong>bili<br />
Un linguaggio L ⊆ Σ ∗ si <strong>di</strong>ce deci<strong>di</strong>bile se esiste una MdT che<br />
riconosce L e che si ferma su ogni input.<br />
L’ input per una MdT è sempre una stringa. Se vogliamo dare in<br />
input altri oggetti, questi devono essere co<strong>di</strong>ficati come stringhe.
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
Rappresenteremo i problemi <strong>di</strong> decisione me<strong>di</strong>ante linguaggi.
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
Rappresenteremo i problemi <strong>di</strong> decisione me<strong>di</strong>ante linguaggi.<br />
Es.: il linguaggio che rappresenta il problema “CONNESSO” è<br />
{〈G〉 | G è un grafo connesso}<br />
dove 〈G〉 denota una “ragionevole” co<strong>di</strong>fica <strong>di</strong> G me<strong>di</strong>ante<br />
una stringa su un alfabeto Σ.
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
Rappresenteremo i problemi <strong>di</strong> decisione me<strong>di</strong>ante linguaggi.<br />
Es.: il linguaggio che rappresenta il problema “CONNESSO” è<br />
{〈G〉 | G è un grafo connesso}<br />
dove 〈G〉 denota una “ragionevole” co<strong>di</strong>fica <strong>di</strong> G me<strong>di</strong>ante<br />
una stringa su un alfabeto Σ.<br />
Ad esempio possiamo prendere Σ = {0, 1, (, ), #}.<br />
Il grafo<br />
G = ({1, 2, 3}, {(1, 2), (2, 3), (3, 1)})<br />
può essere co<strong>di</strong>ficato come<br />
(1#10#11)#((1#10)#(10#11)#(11#1)).
Es. Grafi Connessi<br />
Sia A un linguaggio <strong>di</strong> stringhe che rappresentano grafi connessi<br />
(non orientati)<br />
Nota: in questo modo esprimiamo un problema computazionale<br />
come un problema <strong>di</strong> riconoscimento <strong>di</strong> linguaggi.<br />
Descriveremo una MdT che decide A
Es. Grafi Connessi<br />
Input 〈G〉, co<strong>di</strong>fica del grafo G<br />
1. Seleziona un nodo <strong>di</strong> G e marcalo<br />
2. Ripeti finchè si trovano nuovi no<strong>di</strong> da marcare:<br />
2.1 Per ogni nodo v in G, se v è connesso ad un nodo marcato<br />
allora marcalo.<br />
3. se tutti i no<strong>di</strong> risultano marcati accetta altrimenti reject
Es. Grafi Connessi: rappresentazione<br />
Grafo rappresentato me<strong>di</strong>ante 2 liste:<br />
– Lista dei no<strong>di</strong> (numeri naturali)<br />
– Lista degli <strong>ed</strong>ges (coppie <strong>di</strong> numeri)<br />
Nota: non specifichiamo l’alfabeto (binario, decimale, ....).<br />
Ignoriamo i dettagli non importanti dell’implementazione.
Es. Grafi Connessi: verifica input<br />
Controlla che l’input sia<br />
◮ una lista <strong>di</strong> no<strong>di</strong> (<strong>di</strong>git) senza ripetizioni<br />
◮ una lista <strong>di</strong> coppie <strong>di</strong> no<strong>di</strong> (<strong>di</strong>git presenti nella lista prec<strong>ed</strong>ente)
Es. Grafi Connessi: implementazione<br />
1) Seleziona un nodo <strong>di</strong> G e marcalo: Marca il primo nodo sulla<br />
lista (es. con un · sul <strong>di</strong>git più a sinistra)<br />
2) Ripeti finchè nuovi no<strong>di</strong> sono marcati<br />
3) Per ogni nodo v in G, se v è connesso ad un nodo marcato<br />
allora marcalo:<br />
3.1) Sottolinea il primo nodo n1 senza · sulla lista (sottolineando il<br />
<strong>di</strong>git più a sinistra)<br />
3.2) Sottolinea il primo nodo n2 con · sulla lista.<br />
3.3) Cerca se esiste <strong>ed</strong>ge (n1, n2)<br />
Se SI allora marca n1 con · e vai a 2)<br />
Se NO, sia n2 il successivo nodo con · sulla lista, sottolinealo<br />
e vai a 3.3)<br />
4) se tutti i no<strong>di</strong> risultano marcati accetta altrimenti reject: Scorri<br />
la lista dei no<strong>di</strong>: se tutti i no<strong>di</strong> hanno · accetta, altrimenti reject
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
“Ragionevole” co<strong>di</strong>fica: un algoritmo che produce una<br />
rappresentazione univoca dell’input me<strong>di</strong>ante una stringa.
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
“Ragionevole” co<strong>di</strong>fica: un algoritmo che produce una<br />
rappresentazione univoca dell’input me<strong>di</strong>ante una stringa.<br />
◮ Diremo che un problema <strong>di</strong> decisione è:<br />
◮ deci<strong>di</strong>bile se il linguaggio associato è deci<strong>di</strong>bile
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
“Ragionevole” co<strong>di</strong>fica: un algoritmo che produce una<br />
rappresentazione univoca dell’input me<strong>di</strong>ante una stringa.<br />
◮ Diremo che un problema <strong>di</strong> decisione è:<br />
◮ deci<strong>di</strong>bile se il linguaggio associato è deci<strong>di</strong>bile<br />
◮ semideci<strong>di</strong>bile se il linguaggio associato è Turing riconoscibile
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
“Ragionevole” co<strong>di</strong>fica: un algoritmo che produce una<br />
rappresentazione univoca dell’input me<strong>di</strong>ante una stringa.<br />
◮ Diremo che un problema <strong>di</strong> decisione è:<br />
◮ deci<strong>di</strong>bile se il linguaggio associato è deci<strong>di</strong>bile<br />
◮ semideci<strong>di</strong>bile se il linguaggio associato è Turing riconoscibile<br />
◮ indeci<strong>di</strong>bile se il linguaggio associato non è deci<strong>di</strong>bile.
Co<strong>di</strong>fica dei problemi <strong>di</strong> decisione<br />
“Ragionevole” co<strong>di</strong>fica: un algoritmo che produce una<br />
rappresentazione univoca dell’input me<strong>di</strong>ante una stringa.<br />
◮ Diremo che un problema <strong>di</strong> decisione è:<br />
◮ deci<strong>di</strong>bile se il linguaggio associato è deci<strong>di</strong>bile<br />
◮ semideci<strong>di</strong>bile se il linguaggio associato è Turing riconoscibile<br />
◮ indeci<strong>di</strong>bile se il linguaggio associato non è deci<strong>di</strong>bile.<br />
◮ Nota. MdT verifica, come passo preliminare, che l’input<br />
corrisponde a una co<strong>di</strong>fica dell’input del problema. Prosegue<br />
la computazione solo in questo caso.
Riepilogando....<br />
◮ M macchina <strong>di</strong> Turing con tre possibili risultati computazione<br />
(accettazione, rifiuto, loop):
Riepilogando....<br />
◮ M macchina <strong>di</strong> Turing con tre possibili risultati computazione<br />
(accettazione, rifiuto, loop):<br />
- Il linguaggio accettato da M è Turing riconoscibile.
Riepilogando....<br />
◮ M macchina <strong>di</strong> Turing con tre possibili risultati computazione<br />
(accettazione, rifiuto, loop):<br />
- Il linguaggio accettato da M è Turing riconoscibile.<br />
- Se il linguaggio accettato è associato a un problema, il<br />
problema è semideci<strong>di</strong>bile.
Riepilogando....<br />
◮ M macchina <strong>di</strong> Turing con tre possibili risultati computazione<br />
(accettazione, rifiuto, loop):<br />
- Il linguaggio accettato da M è Turing riconoscibile.<br />
- Se il linguaggio accettato è associato a un problema, il<br />
problema è semideci<strong>di</strong>bile.<br />
◮ M macchina <strong>di</strong> Turing con due possibili risultati computazione<br />
(accettazione, rifiuto):
Riepilogando....<br />
◮ M macchina <strong>di</strong> Turing con tre possibili risultati computazione<br />
(accettazione, rifiuto, loop):<br />
- Il linguaggio accettato da M è Turing riconoscibile.<br />
- Se il linguaggio accettato è associato a un problema, il<br />
problema è semideci<strong>di</strong>bile.<br />
◮ M macchina <strong>di</strong> Turing con due possibili risultati computazione<br />
(accettazione, rifiuto):<br />
- Il linguaggio accettato da M è deci<strong>di</strong>bile.
Riepilogando....<br />
◮ M macchina <strong>di</strong> Turing con tre possibili risultati computazione<br />
(accettazione, rifiuto, loop):<br />
- Il linguaggio accettato da M è Turing riconoscibile.<br />
- Se il linguaggio accettato è associato a un problema, il<br />
problema è semideci<strong>di</strong>bile.<br />
◮ M macchina <strong>di</strong> Turing con due possibili risultati computazione<br />
(accettazione, rifiuto):<br />
- Il linguaggio accettato da M è deci<strong>di</strong>bile.<br />
- Se il linguaggio accettato è associato a un problema, il<br />
problema è deci<strong>di</strong>bile.
Linguaggi/Problemi deci<strong>di</strong>bili<br />
◮ Sia B un DFA e w una parola. L’automa B accetta w?<br />
(Problema dell’accettazione <strong>di</strong> un DFA)
Linguaggi/Problemi deci<strong>di</strong>bili<br />
◮ Sia B un DFA e w una parola. L’automa B accetta w?<br />
(Problema dell’accettazione <strong>di</strong> un DFA)<br />
◮ Sia A un DFA. Il linguaggio L(A) accettato da A è vuoto?<br />
(Problema del vuoto)
Linguaggi/Problemi deci<strong>di</strong>bili<br />
◮ Sia B un DFA e w una parola. L’automa B accetta w?<br />
(Problema dell’accettazione <strong>di</strong> un DFA)<br />
◮ Sia A un DFA. Il linguaggio L(A) accettato da A è vuoto?<br />
(Problema del vuoto)<br />
◮ Siano A, B due DFA. I due automi sono equivalenti, cioè sono<br />
tali che L(A) = L(B)? (Problema dell’equivalenza)
Problema dell’accettazione <strong>di</strong> un DFA:<br />
Sia B un DFA e w una parola. L’automa B accetta w?
Problema dell’accettazione <strong>di</strong> un DFA:<br />
Sia B un DFA e w una parola. L’automa B accetta w?<br />
Il corrispondente linguaggio è<br />
ADFA = {〈B, w〉 | B è un DFA che accetta la parola w}.
Problema dell’accettazione <strong>di</strong> un DFA:<br />
Sia B un DFA e w una parola. L’automa B accetta w?<br />
Teorema<br />
Il corrispondente linguaggio è<br />
ADFA = {〈B, w〉 | B è un DFA che accetta la parola w}.<br />
ADFA è un linguaggio deci<strong>di</strong>bile.
Problema dell’accettazione <strong>di</strong> un DFA:<br />
Sia B un DFA e w una parola. L’automa B accetta w?<br />
Teorema<br />
Il corrispondente linguaggio è<br />
ADFA = {〈B, w〉 | B è un DFA che accetta la parola w}.<br />
ADFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Costruiamo una MdT<br />
M che decide ADFA: sull’input 〈B, w〉, dove B è un DFA e w è una<br />
parola, M
Problema dell’accettazione <strong>di</strong> un DFA:<br />
Sia B un DFA e w una parola. L’automa B accetta w?<br />
Teorema<br />
Il corrispondente linguaggio è<br />
ADFA = {〈B, w〉 | B è un DFA che accetta la parola w}.<br />
ADFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Costruiamo una MdT<br />
M che decide ADFA: sull’input 〈B, w〉, dove B è un DFA e w è una<br />
parola, M<br />
◮ Simula B sulla stringa w
Problema dell’accettazione <strong>di</strong> un DFA:<br />
Sia B un DFA e w una parola. L’automa B accetta w?<br />
Teorema<br />
Il corrispondente linguaggio è<br />
ADFA = {〈B, w〉 | B è un DFA che accetta la parola w}.<br />
ADFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Costruiamo una MdT<br />
M che decide ADFA: sull’input 〈B, w〉, dove B è un DFA e w è una<br />
parola, M<br />
◮ Simula B sulla stringa w<br />
◮ Se la simulazione termina in uno stato finale <strong>di</strong> B allora M<br />
accetta, altrimenti rifiuta.
Dettagli<br />
Co<strong>di</strong>fica <strong>di</strong> 〈B, w〉: lista le 5 componenti <strong>di</strong> B sul nastro <strong>di</strong> M (una<br />
dopo l’altra)<br />
MdT M verifica che l’input sia corretto. Se NO viene rifiutato<br />
Successivamente M simula la computazione <strong>di</strong> B
Dettagli<br />
M simula la computazione <strong>di</strong> B<br />
◮ Usa · per marcare lo stato iniziale come stato corrente<br />
e · per marcare il primo simbolo <strong>di</strong> w come simbolo corrente<br />
◮ Scorre la sottostringa che rappresenta la funzione <strong>di</strong><br />
transizione <strong>di</strong> B per conoscere la transizione corrispondente a<br />
stato corrente r (con ·) e simbolo corrente x (con ·)<br />
⇒ M conosce nuovo stato q<br />
◮ M sposta · da r allo stato q e da x al simbolo successivo<br />
La proc<strong>ed</strong>ura termina quando la string input <strong>di</strong> B è terminata<br />
◮ Ora M controlla lo stato corrente (con ·) <strong>ed</strong> accetta sse esso è<br />
finale per B
Problema del vuoto: Dato un DFA A, L(A) è vuoto?<br />
Linguaggio corrispondente:<br />
EDFA = {〈A〉 | A è un DFA e L(A) = ∅}.
Problema del vuoto: Dato un DFA A, L(A) è vuoto?<br />
Linguaggio corrispondente:<br />
EDFA = {〈A〉 | A è un DFA e L(A) = ∅}.<br />
Teorema<br />
EDFA è un linguaggio deci<strong>di</strong>bile.
Problema del vuoto: Dato un DFA A, L(A) è vuoto?<br />
Linguaggio corrispondente:<br />
EDFA = {〈A〉 | A è un DFA e L(A) = ∅}.<br />
Teorema<br />
EDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Progettiamo una MdT T che sull’input 〈A〉 dove A è un DFA:
Problema del vuoto: Dato un DFA A, L(A) è vuoto?<br />
Linguaggio corrispondente:<br />
EDFA = {〈A〉 | A è un DFA e L(A) = ∅}.<br />
Teorema<br />
EDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Progettiamo una MdT T che sull’input 〈A〉 dove A è un DFA:<br />
◮ Marca lo stato iniziale q0 <strong>di</strong> A
Problema del vuoto: Dato un DFA A, L(A) è vuoto?<br />
Linguaggio corrispondente:<br />
EDFA = {〈A〉 | A è un DFA e L(A) = ∅}.<br />
Teorema<br />
EDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Progettiamo una MdT T che sull’input 〈A〉 dove A è un DFA:<br />
◮ Marca lo stato iniziale q0 <strong>di</strong> A<br />
◮ Ripeti fino a quando non viene marcato nessun nuovo stato:<br />
Marca tutti gli stati che hanno una transizione entrante da<br />
uno stato marcato<br />
Nota stiamo marcando tutti gli stati q tali che esiste un<br />
cammino dallo stato iniziale q0 <strong>di</strong> A a q nel grafo <strong>di</strong> A
Problema del vuoto: Dato un DFA A, L(A) è vuoto?<br />
Linguaggio corrispondente:<br />
EDFA = {〈A〉 | A è un DFA e L(A) = ∅}.<br />
Teorema<br />
EDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Progettiamo una MdT T che sull’input 〈A〉 dove A è un DFA:<br />
◮ Marca lo stato iniziale q0 <strong>di</strong> A<br />
◮ Ripeti fino a quando non viene marcato nessun nuovo stato:<br />
Marca tutti gli stati che hanno una transizione entrante da<br />
uno stato marcato<br />
Nota stiamo marcando tutti gli stati q tali che esiste un<br />
cammino dallo stato iniziale q0 <strong>di</strong> A a q nel grafo <strong>di</strong> A<br />
◮ Se la lista non contiene stati finali, accetta; altrimenti rifiuta.
Problema dell’equivalenza: Dati due DFA, sono<br />
equivalenti?<br />
Useremo il seguente Lemma<br />
Lemma<br />
Dati due insiemi X , Y , risulta<br />
X = Y ⇔ Z = (X ∩ Y ) ∪ (X ∩ Y ) = ∅
Problema dell’equivalenza<br />
Linguaggio corrispondente:<br />
EQDFA = {〈A, B〉 | A, B sono DFA e L(A) = L(B)}.
Problema dell’equivalenza<br />
Linguaggio corrispondente:<br />
EQDFA = {〈A, B〉 | A, B sono DFA e L(A) = L(B)}.<br />
Teorema<br />
EQDFA è un linguaggio deci<strong>di</strong>bile.
Problema dell’equivalenza<br />
Linguaggio corrispondente:<br />
EQDFA = {〈A, B〉 | A, B sono DFA e L(A) = L(B)}.<br />
Teorema<br />
EQDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Idea: progettare una MdT<br />
M che usa la MdT<br />
T che decide EDFA. Sull’input 〈A, B〉, dove A e B sono DFA, M:
Problema dell’equivalenza<br />
Linguaggio corrispondente:<br />
EQDFA = {〈A, B〉 | A, B sono DFA e L(A) = L(B)}.<br />
Teorema<br />
EQDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Idea: progettare una MdT<br />
M che usa la MdT<br />
T che decide EDFA. Sull’input 〈A, B〉, dove A e B sono DFA, M:<br />
◮ Costruisce il DFA C tale che<br />
L(C) = (L(A) ∩ L(B)) ∪ (L(B) ∩ L(A))
Problema dell’equivalenza<br />
Linguaggio corrispondente:<br />
EQDFA = {〈A, B〉 | A, B sono DFA e L(A) = L(B)}.<br />
Teorema<br />
EQDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Idea: progettare una MdT<br />
M che usa la MdT<br />
T che decide EDFA. Sull’input 〈A, B〉, dove A e B sono DFA, M:<br />
◮ Costruisce il DFA C tale che<br />
L(C) = (L(A) ∩ L(B)) ∪ (L(B) ∩ L(A))<br />
◮ Simula T sull’input 〈C〉
Problema dell’equivalenza<br />
Linguaggio corrispondente:<br />
EQDFA = {〈A, B〉 | A, B sono DFA e L(A) = L(B)}.<br />
Teorema<br />
EQDFA è un linguaggio deci<strong>di</strong>bile.<br />
Dimostrazione.<br />
Idea: progettare una MdT<br />
M che usa la MdT<br />
T che decide EDFA. Sull’input 〈A, B〉, dove A e B sono DFA, M:<br />
◮ Costruisce il DFA C tale che<br />
L(C) = (L(A) ∩ L(B)) ∪ (L(B) ∩ L(A))<br />
◮ Simula T sull’input 〈C〉<br />
◮ Se T accetta, accetta; se T rifiuta, rifiuta.
Estensioni<br />
Nota:<br />
Potremmo formulare i tre prec<strong>ed</strong>enti problemi sostituendo ai DFA<br />
una qualsiasi rappresentazione equivalente (NFA o espressioni<br />
regolari).<br />
Es.:<br />
ANFA = {〈B, w〉 | B è un NFA che accetta la parola w},<br />
AREX = {〈R, w〉 | R è un’espressione regolare e w ∈ L(R)}.<br />
È facile convincersi che questi linguaggi sono deci<strong>di</strong>bili.
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:<br />
◮ Sapere che esistono problemi non risolvibili con un computer
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:<br />
◮ Sapere che esistono problemi non risolvibili con un computer<br />
◮ I problemi indeci<strong>di</strong>bili sono esoterici o lontani dai problemi <strong>di</strong><br />
interesse informatico? NO
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:<br />
◮ Sapere che esistono problemi non risolvibili con un computer<br />
◮ I problemi indeci<strong>di</strong>bili sono esoterici o lontani dai problemi <strong>di</strong><br />
interesse informatico? NO<br />
◮ Esempi <strong>di</strong> problemi indeci<strong>di</strong>bili:
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:<br />
◮ Sapere che esistono problemi non risolvibili con un computer<br />
◮ I problemi indeci<strong>di</strong>bili sono esoterici o lontani dai problemi <strong>di</strong><br />
interesse informatico? NO<br />
◮ Esempi <strong>di</strong> problemi indeci<strong>di</strong>bili:<br />
◮ Il problema generale della verifica del software non è risolvibile<br />
me<strong>di</strong>ante computer<br />
◮ Costruire un perfetto sistema <strong>di</strong> “debugging” per determinare<br />
se un programma si arresta.<br />
◮ Equivalenza <strong>di</strong> programmi: Dati due programmi essi<br />
forniscono lo stesso output?
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:<br />
◮ Sapere che esistono problemi non risolvibili con un computer<br />
◮ I problemi indeci<strong>di</strong>bili sono esoterici o lontani dai problemi <strong>di</strong><br />
interesse informatico? NO<br />
◮ Esempi <strong>di</strong> problemi indeci<strong>di</strong>bili:<br />
◮ Il problema generale della verifica del software non è risolvibile<br />
me<strong>di</strong>ante computer<br />
◮ Costruire un perfetto sistema <strong>di</strong> “debugging” per determinare<br />
se un programma si arresta.<br />
◮ Equivalenza <strong>di</strong> programmi: Dati due programmi essi<br />
forniscono lo stesso output?<br />
◮ Compressione dati ottimale: Trovare il programma più corto<br />
per produrre una immagine data.
Problemi indeci<strong>di</strong>bili<br />
◮ Motivazioni per lo stu<strong>di</strong>o <strong>di</strong> questi problemi:<br />
◮ Sapere che esistono problemi non risolvibili con un computer<br />
◮ I problemi indeci<strong>di</strong>bili sono esoterici o lontani dai problemi <strong>di</strong><br />
interesse informatico? NO<br />
◮ Esempi <strong>di</strong> problemi indeci<strong>di</strong>bili:<br />
◮ Il problema generale della verifica del software non è risolvibile<br />
me<strong>di</strong>ante computer<br />
◮ Costruire un perfetto sistema <strong>di</strong> “debugging” per determinare<br />
se un programma si arresta.<br />
◮ Equivalenza <strong>di</strong> programmi: Dati due programmi essi<br />
forniscono lo stesso output?<br />
◮ Compressione dati ottimale: Trovare il programma più corto<br />
per produrre una immagine data.<br />
◮ In<strong>di</strong>viduazione dei virus: Questo programma è un virus?
Problemi indeci<strong>di</strong>bili<br />
OBIETTIVO: presentare un problema irrisolvibile (linguaggio<br />
indeci<strong>di</strong>bile)
Problemi indeci<strong>di</strong>bili<br />
OBIETTIVO: presentare un problema irrisolvibile (linguaggio<br />
indeci<strong>di</strong>bile)<br />
Il linguaggio consiste delle coppie 〈M, w〉 dove M è una MdT che<br />
accetta la stringa w<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}
Problemi indeci<strong>di</strong>bili<br />
OBIETTIVO: presentare un problema irrisolvibile (linguaggio<br />
indeci<strong>di</strong>bile)<br />
Il linguaggio consiste delle coppie 〈M, w〉 dove M è una MdT che<br />
accetta la stringa w<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}<br />
Teorema<br />
Il linguaggio<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}<br />
non è deci<strong>di</strong>bile.
Strumenti<br />
Car<strong>di</strong>nalità <strong>di</strong> insiemi (infiniti).<br />
Diagonalizzazione: metodo introdotto da Cantor.
Car<strong>di</strong>nalità<br />
Car<strong>di</strong>nalità <strong>di</strong> un insieme: la sua taglia<br />
Due insiemi hanno la stessa car<strong>di</strong>nalità se è possibile stabilire una<br />
corrispondenza tra i loro elementi.<br />
Es: A = {1, 2, 3}, B = {4, 3, 5} ⇒ 1 − 4, 2 − 3, 3 − 5
Car<strong>di</strong>nalità<br />
Car<strong>di</strong>nalità <strong>di</strong> un insieme: la sua taglia<br />
Due insiemi hanno la stessa car<strong>di</strong>nalità se è possibile stabilire una<br />
corrispondenza tra i loro elementi.<br />
Es: A = {1, 2, 3}, B = {4, 3, 5} ⇒ 1 − 4, 2 − 3, 3 − 5<br />
Cosa possiamo <strong>di</strong>re per insiemi infiniti?
Car<strong>di</strong>nalità<br />
Quanti numeri naturali ci sono? INFINITI!
Car<strong>di</strong>nalità<br />
Quanti numeri naturali ci sono? INFINITI!<br />
Quanti numeri reali ci sono? INFINITI!
Car<strong>di</strong>nalità<br />
Quanti numeri naturali ci sono? INFINITI!<br />
Quanti numeri reali ci sono? INFINITI!<br />
La quantità <strong>di</strong> numeri reali è la stessa <strong>di</strong> quella dei numeri naturali?<br />
Come si misura la car<strong>di</strong>nalità <strong>di</strong> insiemi infiniti?
Il Metodo della <strong>di</strong>agonalizzazione<br />
Introdotto da Cantor nel 1973 mentre cercava <strong>di</strong> determinare come<br />
stabilire se, dati due insiemi infiniti, uno è più grande dell’altro.
Il Metodo della <strong>di</strong>agonalizzazione<br />
Introdotto da Cantor nel 1973 mentre cercava <strong>di</strong> determinare come<br />
stabilire se, dati due insiemi infiniti, uno è più grande dell’altro.<br />
- Cantor osservò che due insiemi finiti hanno la stessa<br />
car<strong>di</strong>nalità se gli elementi dell’uno possono essere messi in<br />
corrispondenza uno a uno con quelli dell’altro.
Il Metodo della <strong>di</strong>agonalizzazione<br />
Introdotto da Cantor nel 1973 mentre cercava <strong>di</strong> determinare come<br />
stabilire se, dati due insiemi infiniti, uno è più grande dell’altro.<br />
- Cantor osservò che due insiemi finiti hanno la stessa<br />
car<strong>di</strong>nalità se gli elementi dell’uno possono essere messi in<br />
corrispondenza uno a uno con quelli dell’altro.<br />
- Estese questo concetto agli insiemi infiniti.
Premessa: Funzioni<br />
Definizione<br />
Una funzione f : X → Y è una relazione input-output.<br />
X è l’insieme dei possibili input (dominio),<br />
Y è l’insieme dei possibili output (codominio).<br />
Per ogni input x ∈ X esiste un solo output y = f (x) ∈ Y .
Premessa: Funzioni<br />
Definizione<br />
Una funzione f : X → Y è una relazione input-output.<br />
X è l’insieme dei possibili input (dominio),<br />
Y è l’insieme dei possibili output (codominio).<br />
Per ogni input x ∈ X esiste un solo output y = f (x) ∈ Y .<br />
Definizione<br />
f : X → Y è iniettiva se ∀x, x ′ ∈ X x = x ′ ⇒ f (x) = f (x ′ )
Premessa: Funzioni<br />
Definizione<br />
Una funzione f : X → Y è una relazione input-output.<br />
X è l’insieme dei possibili input (dominio),<br />
Y è l’insieme dei possibili output (codominio).<br />
Per ogni input x ∈ X esiste un solo output y = f (x) ∈ Y .<br />
Definizione<br />
f : X → Y è iniettiva se ∀x, x ′ ∈ X x = x ′ ⇒ f (x) = f (x ′ )<br />
Definizione<br />
f : X → Y è suriettiva se ∀y ∈ Y si ha y = f (x) per qualche<br />
x ∈ X
Premessa: Funzioni<br />
Definizione<br />
Una funzione f : X → Y è una relazione input-output.<br />
X è l’insieme dei possibili input (dominio),<br />
Y è l’insieme dei possibili output (codominio).<br />
Per ogni input x ∈ X esiste un solo output y = f (x) ∈ Y .<br />
Definizione<br />
f : X → Y è iniettiva se ∀x, x ′ ∈ X x = x ′ ⇒ f (x) = f (x ′ )<br />
Definizione<br />
f : X → Y è suriettiva se ∀y ∈ Y si ha y = f (x) per qualche<br />
x ∈ X<br />
Definizione<br />
Una funzione f : X → Y è una funzione biettiva <strong>di</strong> X su Y (o una<br />
biezione tra X e Y ) se f è iniettiva e suriettiva.
Premessa: Funzioni<br />
Esempio f : {1, 2, 5} → {2, 4, 7}<br />
1 → 2, 2 → 2, 5 → 4 è una funzione. Non è nè iniettiva nè<br />
suriettiva.
Premessa: Funzioni<br />
Esempio f : {1, 2, 5} → {2, 4, 7}<br />
1 → 2, 2 → 2, 5 → 4 è una funzione. Non è nè iniettiva nè<br />
suriettiva.<br />
Esempio f : {1, 2, 5} → {2, 4, 7, 9}<br />
1 → 2, 2 → 4, 5 → 7 è una funzione iniettiva ma non<br />
suriettiva.
Premessa: Funzioni<br />
Esempio f : {1, 2, 5} → {2, 4, 7}<br />
1 → 2, 2 → 2, 5 → 4 è una funzione. Non è nè iniettiva nè<br />
suriettiva.<br />
Esempio f : {1, 2, 5} → {2, 4, 7, 9}<br />
1 → 2, 2 → 4, 5 → 7 è una funzione iniettiva ma non<br />
suriettiva.<br />
Esempio f : {1, 2, 5} → {2, 4}<br />
1 → 2, 2 → 4, 5 → 2 è una funzione suriettiva ma non<br />
iniettiva.
Premessa: Funzioni<br />
Esempio f : {1, 2, 5} → {2, 4, 7}<br />
1 → 2, 2 → 2, 5 → 4 è una funzione. Non è nè iniettiva nè<br />
suriettiva.<br />
Esempio f : {1, 2, 5} → {2, 4, 7, 9}<br />
1 → 2, 2 → 4, 5 → 7 è una funzione iniettiva ma non<br />
suriettiva.<br />
Esempio f : {1, 2, 5} → {2, 4}<br />
1 → 2, 2 → 4, 5 → 2 è una funzione suriettiva ma non<br />
iniettiva.<br />
Esempio f : {1, 2, 5} → {2, 4, 7}<br />
1 → 2, 2 → 4, 5 → 7 è una funzione biettiva.
Premessa: Car<strong>di</strong>nalità<br />
Definizione<br />
Due insiemi X e Y hanno la stessa car<strong>di</strong>nalità se esiste una<br />
funzione biettiva f : X → Y <strong>di</strong> X su Y .
Premessa: Car<strong>di</strong>nalità<br />
Definizione<br />
Due insiemi X e Y hanno la stessa car<strong>di</strong>nalità se esiste una<br />
funzione biettiva f : X → Y <strong>di</strong> X su Y .<br />
|X | = |Y | ⇔ esiste una funzione biettiva f : X → Y
Premessa: Car<strong>di</strong>nalità<br />
Definizione<br />
Due insiemi X e Y hanno la stessa car<strong>di</strong>nalità se esiste una<br />
funzione biettiva f : X → Y <strong>di</strong> X su Y .<br />
|X | = |Y | ⇔ esiste una funzione biettiva f : X → Y<br />
Esempio f : {1, 2, 5} → {2, 4, 7} 1 → 2, 2 → 4,<br />
5 → 7.
Premessa: Car<strong>di</strong>nalità<br />
Definizione<br />
Due insiemi X e Y hanno la stessa car<strong>di</strong>nalità se esiste una<br />
funzione biettiva f : X → Y <strong>di</strong> X su Y .<br />
|X | = |Y | ⇔ esiste una funzione biettiva f : X → Y<br />
Esempio f : {1, 2, 5} → {2, 4, 7} 1 → 2, 2 → 4,<br />
5 → 7.<br />
Esempio f : N → {2n | n ∈ N} n → 2n
Insiemi numerabili<br />
Definizione<br />
Un insieme è enumerabile (o numerabile) se ha la stessa car<strong>di</strong>nalità<br />
<strong>di</strong> un sottoinsieme <strong>di</strong> N.<br />
Se A è numerabile possiamo “numerare” gli elementi <strong>di</strong> A e<br />
scrivere una lista (a1, a2, . . .)<br />
cio è per ogni numero naturale i, possiamo specificare l’elemento<br />
i–mo della lista.<br />
Es. Per l’insieme dei numeri naturali pari, l’elemento i-mo della<br />
lista corrisponde a 2i.
Insiemi numerabili<br />
Es. L’insieme dei numeri razionali è numerabile<br />
Mostriamo che possiamo formare una lista <strong>di</strong> tutti i numeri<br />
razionali.<br />
Formiamo un rettangolo infinito:<br />
1/1 1/2 1/3 1/4 . . .<br />
2/1 2/2 2/3 2/4 . . .<br />
3/1 3/2 3/3 3/4 . . .<br />
4/1 4/2 4/3 4/4 . . .<br />
. . . . . . . . . . . . . . .
Insiemi numerabili<br />
Come formiamo la lista <strong>di</strong> tutti i numeri razionali?<br />
Se pren<strong>di</strong>amo prima tutta la prima linea, non arriviamo mai alla<br />
seconda!<br />
1/1 1/2 1/3 1/4 . . .<br />
2/1 2/2 2/3 2/4 . . .<br />
3/1 3/2 3/3 3/4 . . .<br />
4/1 4/2 4/3 4/4 . . .<br />
. . . . . . . . . . . . . . .
Insiemi numerabili<br />
Idea: Listiamo per <strong>di</strong>agonali: I, II, III, IV, V, VI,. . .<br />
1/1, 2/1, 1/2, 3/1, 2/2, 1/3, . . .<br />
1/1 1/2 1/3 1/4 . . .<br />
2/1 2/2 2/3 2/4 . . .<br />
3/1 3/2 3/3 3/4 . . .<br />
4/1 4/2 4/3 4/4 . . .<br />
. . . . . . . . . . . . . . .<br />
Nota: dovremmo eliminare i duplicati (ma è solo una questione<br />
tecnica)
Insiemi numerabili<br />
Σ ∗ è numerabile.:<br />
listiamo prima la stringa vuota, poi le stringhe (in or<strong>di</strong>ne<br />
lessicografico) lunghe 1, poi 2, . . .<br />
Esempio: Σ = {0, 1}, w0 = ɛ, w1 = 0, w2 = 1, w3 = 00, ...
Insiemi numerabili<br />
L’insieme<br />
{〈M〉 | M è una MdT sull’alfabeto Σ}<br />
è numerabile: è possibile co<strong>di</strong>ficare una MdT<br />
M con una stringa su un alfabeto Σ.<br />
Esempio: Σ = {0, 1},<br />
〈M〉 = 111C111C211 . . . 11Cn,<br />
Ct = 0 i 10 j 10 h 10 k 0 m è la co<strong>di</strong>fica <strong>di</strong> δ(qi, aj) = (qh, ak, Dm),<br />
con D1 = L, D2 = R.
L’insieme dei numeri reali non è numerabile.<br />
Sia per assurdo R numerabile, allora possiamo costruire la lista<br />
f (1), f (2), f (3), . . .
L’insieme dei numeri reali non è numerabile.<br />
Sia per assurdo R numerabile, allora possiamo costruire la lista<br />
f (1), f (2), f (3), . . .<br />
Per ogni i ≥ 1 , scriviamo f (i) = f0(i), f1(i)f2(i)f3(i) . . .<br />
Es: se f (1) = 4, 256 . . .<br />
allora f0(1) = 4, f1(1) = 2, f1(1) = 2, f2(1) = 5, f3(1) = 6, . . .
L’insieme dei numeri reali non è numerabile.<br />
Sia per assurdo R numerabile, allora possiamo costruire la lista<br />
f (1), f (2), f (3), . . .<br />
Per ogni i ≥ 1 , scriviamo f (i) = f0(i), f1(i)f2(i)f3(i) . . .<br />
Es: se f (1) = 4, 256 . . .<br />
allora f0(1) = 4, f1(1) = 2, f1(1) = 2, f2(1) = 5, f3(1) = 6, . . .<br />
Organizziamoli in una matrice:<br />
i\f (i) f1 f2 f3 . . . . . . . . .<br />
1 f1(1) f2(1) f3(1) . . . fi(1) . . .<br />
2 f1(2) f2(2) f3(2) . . . fi(2) . . .<br />
3<br />
.<br />
f1(3)<br />
.<br />
f2(3)<br />
.<br />
f3(3)<br />
.<br />
. . .<br />
. ..<br />
fi(3)<br />
.<br />
. . .<br />
.<br />
i<br />
.<br />
f1(i)<br />
.<br />
f2(i)<br />
.<br />
f3(i)<br />
.<br />
. . .<br />
.<br />
fi(i)<br />
.<br />
. . .<br />
. ..
L’insieme dei numeri reali non è numerabile (cont.)<br />
i\f (i) f1 f2 f3 . . . . . . . . .<br />
1 f1(1) f2(1) f3(1) . . . fi(1) . . .<br />
2 f1(2) f2(2) f3(2) . . . fi(2) . . .<br />
3<br />
.<br />
f1(3)<br />
.<br />
f2(3)<br />
.<br />
f3(3)<br />
.<br />
. . .<br />
. ..<br />
fi(3)<br />
.<br />
. . .<br />
.<br />
i<br />
.<br />
f1(i)<br />
.<br />
f2(i)<br />
.<br />
f3(i)<br />
.<br />
. . .<br />
.<br />
fi(i)<br />
.<br />
. . .<br />
. ..<br />
Sia x ∈ (0, 1) il numero x = 0, x1x2x3 . . . xi . . .<br />
ottenuto scegliendo xi = fi(i) per ogni i ≥ 1<br />
Chiaramente x ∈ R.
L’insieme dei numeri reali non è numerabile (cont.)<br />
i\f (i) f1 f2 f3 . . . . . . . . .<br />
1 f1(1) f2(1) f3(1) . . . fi(1) . . .<br />
2 f1(2) f2(2) f3(2) . . . fi(2) . . .<br />
3<br />
.<br />
f1(3)<br />
.<br />
f2(3)<br />
.<br />
f3(3)<br />
.<br />
. . .<br />
. ..<br />
fi(3)<br />
.<br />
. . .<br />
.<br />
i<br />
.<br />
f1(i)<br />
.<br />
f2(i)<br />
.<br />
f3(i)<br />
.<br />
. . .<br />
.<br />
fi(i)<br />
.<br />
. . .<br />
. ..<br />
Sia x ∈ (0, 1) il numero x = 0, x1x2x3 . . . xi . . .<br />
ottenuto scegliendo xi = fi(i) per ogni i ≥ 1<br />
Chiaramente x ∈ R. Risulta x nella lista?
L’insieme dei numeri reali non è numerabile (cont.)<br />
i\f (i) f1 f2 f3 . . . . . . . . .<br />
1 f1(1) f2(1) f3(1) . . . fi(1) . . .<br />
2 f1(2) f2(2) f3(2) . . . fi(2) . . .<br />
3<br />
.<br />
f1(3)<br />
.<br />
f2(3)<br />
.<br />
f3(3)<br />
.<br />
. . .<br />
. ..<br />
fi(3)<br />
.<br />
. . .<br />
.<br />
i<br />
.<br />
f1(i)<br />
.<br />
f2(i)<br />
.<br />
f3(i)<br />
.<br />
. . .<br />
.<br />
fi(i)<br />
.<br />
. . .<br />
. ..<br />
Sia x ∈ (0, 1) il numero x = 0, x1x2x3 . . . xi . . .<br />
ottenuto scegliendo xi = fi(i) per ogni i ≥ 1<br />
Chiaramente x ∈ R. Risulta x nella lista?<br />
Se x = f (j) allora il suo j-mo <strong>di</strong>git sod<strong>di</strong>sfa xj = fj(j);<br />
Ma xj = fj(j) (per def. <strong>di</strong> x), contrad<strong>di</strong>zione!<br />
Quin<strong>di</strong> x ∈ R non pu ò comparire nella lista e R non numerabile
Il Metodo della <strong>di</strong>agonalizzazione<br />
{w1, w2, . . .} = Σ ∗ , {M1, M2, . . .} = MdT su Σ: numerabili
Il Metodo della <strong>di</strong>agonalizzazione<br />
{w1, w2, . . .} = Σ ∗ , {M1, M2, . . .} = MdT su Σ: numerabili<br />
w1 w2 w3 . . . wi wj<br />
M1 x1,1 · · · · ·<br />
M2 · x2,2 · · · ·<br />
· · · x3,3 · · ·<br />
· · · · x4,4 · ·<br />
Mi · · · · xi,i xi,j<br />
· · · · · · ·<br />
· · · · · · ·<br />
con xi,j = 1 se wj ∈ L(Mi), x = 0 altrimenti.
Il Metodo della <strong>di</strong>agonalizzazione<br />
{w1, w2, . . .} = Σ ∗ , {M1, M2, . . .} = MdT su Σ: numerabili<br />
w1 w2 w3 . . . wi wj<br />
M1 x1,1 · · · · ·<br />
M2 · x2,2 · · · ·<br />
· · · x3,3 · · ·<br />
· · · · x4,4 · ·<br />
Mi · · · · xi,i xi,j<br />
· · · · · · ·<br />
· · · · · · ·<br />
con xi,j = 1 se wj ∈ L(Mi), x = 0 altrimenti.<br />
Sia L = {wi ∈ Σ ∗ | wi ∈ L(Mi)}<br />
L è il “complemento della <strong>di</strong>agonale”:<br />
se l’elemento (Mi, wi) della <strong>di</strong>agonale è xi,i = 1, allora wi ∈ L;<br />
se l’elemento (Mi, wi) della <strong>di</strong>agonale è xi,i = 0, allora wi ∈ L
Il Metodo della <strong>di</strong>agonalizzazione<br />
w1 w2 w3 . . . wi wj<br />
M1 x1,1 · · · · ·<br />
M2 · x2,2 · · · ·<br />
· · · x3,3 · · ·<br />
· · · · x4,4 · ·<br />
Mi · · · · xi,i xi,j<br />
· · · · · · ·<br />
· · · · · · ·<br />
con xi,j = 1 se wj ∈ L(Mi), xi,j = 0 altrimenti.<br />
Sia L = {wi ∈ Σ ∗ | wi /∈ L(Mi)}<br />
Può L comparire nella lista?
Il Metodo della <strong>di</strong>agonalizzazione<br />
w1 w2 w3 . . . wi wj<br />
M1 x1,1 · · · · ·<br />
M2 · x2,2 · · · ·<br />
· · · x3,3 · · ·<br />
· · · · x4,4 · ·<br />
Mi · · · · xi,i xi,j<br />
· · · · · · ·<br />
· · · · · · ·<br />
con xi,j = 1 se wj ∈ L(Mi), xi,j = 0 altrimenti.<br />
Sia L = {wi ∈ Σ ∗ | wi /∈ L(Mi)}<br />
Può L comparire nella lista?<br />
Supponiamo L = L(Mh),<br />
◮ wh ∈ L ⇒ xh,h = 0 ⇒ wh /∈ L(Mh) = L contrad<strong>di</strong>zione<br />
◮ wh /∈ L ⇒ xh,h = 1 ⇒ wh ∈ L(Mh) = L contrad<strong>di</strong>zione
Il Metodo della <strong>di</strong>agonalizzazione<br />
“Esistono più linguaggi (problemi) che macchine <strong>di</strong> Turing<br />
(algoritmi)”
Il Metodo della <strong>di</strong>agonalizzazione<br />
“Esistono più linguaggi (problemi) che macchine <strong>di</strong> Turing<br />
(algoritmi)”<br />
Corollary<br />
Esistono linguaggi che non sono Turing riconoscibili
Macchina <strong>di</strong> Turing Universale<br />
Abbiamo visto cheè possibile co<strong>di</strong>ficare una MdT<br />
M con una stringa su un alfabeto Σ.
Macchina <strong>di</strong> Turing Universale<br />
Abbiamo visto cheè possibile co<strong>di</strong>ficare una MdT<br />
M con una stringa su un alfabeto Σ.<br />
È possibile anche co<strong>di</strong>ficare una MdT M e una stringa w con<br />
una stringa su un alfabeto Σ.<br />
Esempio: 〈M, w〉 = “co<strong>di</strong>fica <strong>di</strong> M ′′ #“co<strong>di</strong>fica <strong>di</strong> w ′′ .
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M<br />
◮ È chiamata universale perchè la computazione <strong>di</strong> una qualsiasi<br />
MdT può essere simulata da U
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M<br />
◮ È chiamata universale perchè la computazione <strong>di</strong> una qualsiasi<br />
MdT può essere simulata da U<br />
◮ Anticipò alcuni sviluppi fondamentali in informatica:
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M<br />
◮ È chiamata universale perchè la computazione <strong>di</strong> una qualsiasi<br />
MdT può essere simulata da U<br />
◮ Anticipò alcuni sviluppi fondamentali in informatica:<br />
- Compilatore Java (o C, C ++ ) in Java (o in C, C ++ )
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M<br />
◮ È chiamata universale perchè la computazione <strong>di</strong> una qualsiasi<br />
MdT può essere simulata da U<br />
◮ Anticipò alcuni sviluppi fondamentali in informatica:<br />
- Compilatore Java (o C, C ++ ) in Java (o in C, C ++ )<br />
- Programma eseguito da un computer
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M<br />
◮ È chiamata universale perchè la computazione <strong>di</strong> una qualsiasi<br />
MdT può essere simulata da U<br />
◮ Anticipò alcuni sviluppi fondamentali in informatica:<br />
- Compilatore Java (o C, C ++ ) in Java (o in C, C ++ )<br />
- Programma eseguito da un computer<br />
Teorema<br />
Esiste una MdT universale.
Macchina <strong>di</strong> Turing Universale<br />
◮ Una MdT universale U simula la computazione <strong>di</strong> una<br />
qualsiasi MdT M<br />
◮ U riceve in input una rappresentazione 〈M, w〉 <strong>di</strong> M e <strong>di</strong> un<br />
possibile input w <strong>di</strong> M<br />
◮ È chiamata universale perchè la computazione <strong>di</strong> una qualsiasi<br />
MdT può essere simulata da U<br />
◮ Anticipò alcuni sviluppi fondamentali in informatica:<br />
- Compilatore Java (o C, C ++ ) in Java (o in C, C ++ )<br />
- Programma eseguito da un computer<br />
Teorema<br />
Esiste una MdT universale.<br />
〈M, w〉 → Macchina Universale U →<br />
<br />
accetta se M accetta w<br />
rifiuta se M rifiuta w
AMdT è Turing riconoscibile<br />
Teorema<br />
Il linguaggio<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}<br />
è Turing riconoscibile.
AMdT è Turing riconoscibile<br />
Teorema<br />
Il linguaggio<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}<br />
è Turing riconoscibile.<br />
Dimostrazione.<br />
Definiamo una MdT U che accetta AMdT : sull’input 〈M, w〉 dove<br />
M è una MdT e w è una stringa
AMdT è Turing riconoscibile<br />
Teorema<br />
Il linguaggio<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}<br />
è Turing riconoscibile.<br />
Dimostrazione.<br />
Definiamo una MdT U che accetta AMdT : sull’input 〈M, w〉 dove<br />
M è una MdT e w è una stringa<br />
1. Simula M sull’input w.
AMdT è Turing riconoscibile<br />
Teorema<br />
Il linguaggio<br />
AMdT = {〈M, w〉 | M è una MdT che accetta la parola w}<br />
è Turing riconoscibile.<br />
Dimostrazione.<br />
Definiamo una MdT U che accetta AMdT : sull’input 〈M, w〉 dove<br />
M è una MdT e w è una stringa<br />
1. Simula M sull’input w.<br />
2. Se M accetta, accetta; se M rifiuta, rifiuta.
Dettagli: Simulazione <strong>di</strong> MdT input<br />
Abbiamo visto MdT che simula Automa<br />
Simulare MdT M con altra MdT risulta molto simile.
Dettagli: Simulazione <strong>di</strong> MdT input<br />
Abbiamo visto MdT che simula Automa<br />
Simulare MdT M con altra MdT risulta molto simile.<br />
1. Marca stato iniziale <strong>di</strong> M (stato corrente) e primo simbolo su<br />
nastro (posizione corrente testina)<br />
2. cerca prossima transizione (nella parte che descrive la funzione<br />
<strong>di</strong> transizione),<br />
sia (q, x) → (q ′ , x ′ , D)<br />
3. Esegui la transizione<br />
4. Aggiorna lo stato corrente (marca q ′ ) e la posizione corrente<br />
della testina (marca simbolo a D)<br />
5. Se lo stato corrente risulta qaccept/qreject deci<strong>di</strong> <strong>di</strong><br />
conseguenza, altrimenti ripeti da 2
Note<br />
1. Nota: U è detta MdT universale.
Note<br />
1. Nota: U è detta MdT universale.<br />
2. Nota: U riconosce AMdT : accetta ogni coppia<br />
〈M, w〉 ∈ AMdT
Note<br />
1. Nota: U è detta MdT universale.<br />
2. Nota: U riconosce AMdT : accetta ogni coppia<br />
〈M, w〉 ∈ AMdT<br />
3. Nota: U cicla su 〈M, w〉 se (e solo se) M cicla su w. Quin<strong>di</strong><br />
U non decide AMdT .
Indeci<strong>di</strong>bilità del problema della fermata<br />
Teorema<br />
AMdT = {〈M, w〉 | M è una MdT e w ∈ L(M)}<br />
Il linguaggio AMdT non è deci<strong>di</strong>bile.
Indeci<strong>di</strong>bilità del problema della fermata<br />
Prima <strong>di</strong> v<strong>ed</strong>ere la <strong>di</strong>mostrazione consideriamo un classico quesito<br />
<strong>di</strong> Bertrand Russell:<br />
In un paese vive un solo barbiere,<br />
Un uomo ben sbarbato, che rade tutti e soli gli uomini del villaggio<br />
che non si radono da soli.<br />
Chi sbarba il barbiere?
Indeci<strong>di</strong>bilità del problema della fermata<br />
Prima <strong>di</strong> v<strong>ed</strong>ere la <strong>di</strong>mostrazione consideriamo un classico quesito<br />
<strong>di</strong> Bertrand Russell:<br />
In un paese vive un solo barbiere,<br />
Un uomo ben sbarbato, che rade tutti e soli gli uomini del villaggio<br />
che non si radono da soli.<br />
Chi sbarba il barbiere?<br />
Autoreferenza può causare problemi!
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Supponiamo per assurdo che esiste una macchina <strong>di</strong> Turing H con<br />
due possibili risultati <strong>di</strong> una computazione (accettazione, rifiuto) e<br />
tale che:<br />
<br />
H =<br />
accetta<br />
rifiuta<br />
se M accetta w<br />
se M rifiuta w
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Supponiamo per assurdo che esiste una macchina <strong>di</strong> Turing H con<br />
due possibili risultati <strong>di</strong> una computazione (accettazione, rifiuto) e<br />
tale che:<br />
<br />
H =<br />
accetta<br />
rifiuta<br />
se M accetta w<br />
se M rifiuta w<br />
H : 〈M, w〉 → H →<br />
<br />
accetta<br />
rifiuta<br />
se M accetta w<br />
se M rifiuta w
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Costruiamo una nuova MdT D che usa H come sottoprogramma<br />
D sull’input 〈M〉, dove M è una MdT:<br />
1. Simula H sull’input 〈M, 〈M〉〉<br />
2. Fornisce come output l’opposto <strong>di</strong> H, cioè se H accetta,<br />
rifiuta e se H rifiuta, accetta
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Costruiamo una nuova MdT D che usa H come sottoprogramma<br />
D sull’input 〈M〉, dove M è una MdT:<br />
1. Simula H sull’input 〈M, 〈M〉〉<br />
2. Fornisce come output l’opposto <strong>di</strong> H, cioè se H accetta,<br />
rifiuta e se H rifiuta, accetta<br />
〈M〉 → D → 〈M, 〈M〉〉 → H →<br />
<br />
accetta<br />
rifiuta<br />
→ I →<br />
<br />
rifiuta<br />
accetta
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Costruiamo una nuova MdT D che usa H come sottoprogramma<br />
D sull’input 〈M〉, dove M è una MdT:<br />
1. Simula H sull’input 〈M, 〈M〉〉<br />
2. Fornisce come output l’opposto <strong>di</strong> H, cioè se H accetta,<br />
rifiuta e se H rifiuta, accetta<br />
〈M〉 → D → 〈M, 〈M〉〉 → H →<br />
Quin<strong>di</strong><br />
D(〈M〉) =<br />
<br />
accetta<br />
rifiuta<br />
→ I →<br />
<br />
rifiuta se M accetta 〈M〉,<br />
accetta se M rifiuta 〈M〉<br />
<br />
rifiuta<br />
accetta
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
1. Nota: MdT M deve essere in grado <strong>di</strong> accettare ogni stringa.<br />
2. Nota: La co<strong>di</strong>fica 〈M〉 <strong>di</strong> M è una stringa.
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
1. Nota: MdT M deve essere in grado <strong>di</strong> accettare ogni stringa.<br />
2. Nota: La co<strong>di</strong>fica 〈M〉 <strong>di</strong> M è una stringa.<br />
3. Nota: Operare una macchina sulla sua co<strong>di</strong>fica è analogo ad<br />
usare un compilatore Pascal per compilarlo<br />
(il compilatore Pascal è scritto in Pascal).
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Autoreferenzialità può essere pericolosa!
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Autoreferenzialità può essere pericolosa!<br />
Ora se <strong>di</strong>amo in input a D la sua stessa co<strong>di</strong>fica 〈D〉 abbiamo
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Autoreferenzialità può essere pericolosa!<br />
Ora se <strong>di</strong>amo in input a D la sua stessa co<strong>di</strong>fica 〈D〉 abbiamo<br />
<br />
rifiuta se D accetta 〈D〉,<br />
D(〈D〉) =<br />
accetta se D rifiuta 〈D〉
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Autoreferenzialità può essere pericolosa!<br />
Ora se <strong>di</strong>amo in input a D la sua stessa co<strong>di</strong>fica 〈D〉 abbiamo<br />
<br />
rifiuta se D accetta 〈D〉,<br />
D(〈D〉) =<br />
accetta se D rifiuta 〈D〉<br />
〈D〉 → D → 〈D, 〈D〉〉 → H →<br />
<br />
accetta<br />
rifiuta<br />
→ I →<br />
<br />
rifiuta<br />
accetta
Indeci<strong>di</strong>bilità del problema della fermata: Dimostrazione<br />
Autoreferenzialità può essere pericolosa!<br />
Ora se <strong>di</strong>amo in input a D la sua stessa co<strong>di</strong>fica 〈D〉 abbiamo<br />
<br />
rifiuta se D accetta 〈D〉,<br />
D(〈D〉) =<br />
accetta se D rifiuta 〈D〉<br />
〈D〉 → D → 〈D, 〈D〉〉 → H →<br />
<br />
accetta<br />
rifiuta<br />
Cioè D accetta 〈D〉 se e solo se D rifiuta 〈D〉<br />
Assurdo!<br />
Tutto causato dall’assunzione che esiste H!<br />
Quin<strong>di</strong> H non esiste!<br />
<br />
→ I →<br />
<br />
rifiuta<br />
accetta
Indeci<strong>di</strong>bilità del problema della fermata: Riepilogo della<br />
Dimostrazione<br />
1. Definiamo AMdT = {〈M, w〉 |M è MdT che accetta w}<br />
2. Assumiamo AMdT deci<strong>di</strong>bile; sia H MdT che lo decide<br />
3. Usiamo H per costruire MdT D che inverte le decisioni;<br />
D(〈M〉): accetta se M rifiuta 〈M〉 ; rifiuta se M accetta 〈M〉.<br />
4. Diamo in input a D la sua co<strong>di</strong>fica 〈D〉:<br />
D(〈D〉): accetta sse D rifiuta.<br />
Contrad<strong>di</strong>zione
Diagonalizzazione?<br />
Consideriamo la tavola<br />
〈M1〉 〈M2〉 〈M3〉 〈M4〉 . . .<br />
M1 acc acc . . .<br />
M2 acc acc acc acc . . .<br />
M3<br />
M2 acc acc . . .<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.
Diagonalizzazione?<br />
Consideriamo H: MdT H rifiuta se Mi va in loop<br />
〈M1〉 〈M2〉 〈M3〉 〈M4〉 . . .<br />
M1 acc rej acc rej . . .<br />
M2 acc acc acc acc . . .<br />
M3 rej rej rej rej . . .<br />
M2 acc acc rej rej . . .<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.
Diagonalizzazione?<br />
Consideriamo ora D e D(〈D〉):<br />
Dobbiamo considerare la <strong>di</strong>agonale!<br />
〈M1〉 〈M2〉 〈M3〉 〈M4〉 . . . 〈D〉 . . .<br />
M1 acc rej acc rej . . . . . . . . .<br />
M2 acc acc acc acc . . . . . . . . .<br />
M3 rej rej rej rej . . . . . . . . .<br />
M2 acc acc rej rej . . . . . . . . .<br />
. . . . . . . .<br />
D acc acc rej rej . . . ??? . . .<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.
Indeci<strong>di</strong>bilità<br />
◮ Nella prova prec<strong>ed</strong>ente è stato utilizzato il metodo della<br />
<strong>di</strong>agonalizzazione.
Indeci<strong>di</strong>bilità<br />
◮ Nella prova prec<strong>ed</strong>ente è stato utilizzato il metodo della<br />
<strong>di</strong>agonalizzazione.<br />
◮ In conclusione, AMdT è Turing riconoscibile ma è indeci<strong>di</strong>bile.
Indeci<strong>di</strong>bilità<br />
◮ Nella prova prec<strong>ed</strong>ente è stato utilizzato il metodo della<br />
<strong>di</strong>agonalizzazione.<br />
◮ In conclusione, AMdT è Turing riconoscibile ma è indeci<strong>di</strong>bile.<br />
◮ Che <strong>di</strong>fferenza c’è tra le due <strong>di</strong>mostrazioni?<br />
Cioè che <strong>di</strong>fferenza c’è tra U e D?<br />
◮ Sappiamo che esistono linguaggi che non sono Turing<br />
riconoscibili.<br />
◮ Vogliamo in<strong>di</strong>viduare uno specifico linguaggio non Turing<br />
riconoscibile (AMdT )
Un linguaggio che non è Turing riconoscibile<br />
Definizione<br />
Diciamo che un linguaggio L è co-Turing riconoscibile se L è<br />
Turing riconoscibile.
Un linguaggio che non è Turing riconoscibile<br />
Definizione<br />
Diciamo che un linguaggio L è co-Turing riconoscibile se L è<br />
Turing riconoscibile.<br />
Teorema<br />
Un linguaggio L è deci<strong>di</strong>bile se e solo se L è Turing riconoscibile e<br />
co-Turing riconoscibile.
Un linguaggio che non è Turing riconoscibile<br />
L è deci<strong>di</strong>bile ⇔ L e il suo complemento sono entrambi Turing<br />
riconoscibili.
Un linguaggio che non è Turing riconoscibile<br />
L è deci<strong>di</strong>bile ⇔ L e il suo complemento sono entrambi Turing<br />
riconoscibili.<br />
Dimostrazione<br />
(⇒) Se L è deci<strong>di</strong>bile allora esiste una macchina <strong>di</strong> Turing M<br />
con due possibili risultati <strong>di</strong> una computazione (accettazione,<br />
rifiuto) e tale che M accetta w se e solo se w ∈ L. Allora L è<br />
Turing riconoscibile. Inoltre è facile costruire una MdT<br />
M che accetta w se e solo se w ∈ L:
Un linguaggio che non è Turing riconoscibile<br />
L è deci<strong>di</strong>bile ⇔ L e il suo complemento sono entrambi Turing<br />
riconoscibili.<br />
Dimostrazione<br />
(⇒) Se L è deci<strong>di</strong>bile allora esiste una macchina <strong>di</strong> Turing M<br />
con due possibili risultati <strong>di</strong> una computazione (accettazione,<br />
rifiuto) e tale che M accetta w se e solo se w ∈ L. Allora L è<br />
Turing riconoscibile. Inoltre è facile costruire una MdT<br />
M che accetta w se e solo se w ∈ L:<br />
w → H →<br />
<br />
accetta<br />
rifiuta<br />
se w ∈ L<br />
se w ∈ L →<br />
<br />
rifiuta<br />
accetta<br />
se H accetta<br />
se H rifiuta
Un linguaggio che non è Turing riconoscibile<br />
(⇐) Supponiamo che L e il suo complemento siano entrambi<br />
Turing riconoscibili. Sia M1 una MdT<br />
che riconosce L e M2 una MdT<br />
che riconosce L. Definiamo una MdT<br />
N (a due nastri): sull’input x
Un linguaggio che non è Turing riconoscibile<br />
(⇐) Supponiamo che L e il suo complemento siano entrambi<br />
Turing riconoscibili. Sia M1 una MdT<br />
che riconosce L e M2 una MdT<br />
che riconosce L. Definiamo una MdT<br />
N (a due nastri): sull’input x<br />
1. Copia x sui nastri <strong>di</strong> M1 e M2
Un linguaggio che non è Turing riconoscibile<br />
(⇐) Supponiamo che L e il suo complemento siano entrambi<br />
Turing riconoscibili. Sia M1 una MdT<br />
che riconosce L e M2 una MdT<br />
che riconosce L. Definiamo una MdT<br />
N (a due nastri): sull’input x<br />
1. Copia x sui nastri <strong>di</strong> M1 e M2<br />
2. Simula M1 e M2 in parallelo (usa un nastro per M1, l’altro per<br />
M2
Un linguaggio che non è Turing riconoscibile<br />
(⇐) Supponiamo che L e il suo complemento siano entrambi<br />
Turing riconoscibili. Sia M1 una MdT<br />
che riconosce L e M2 una MdT<br />
che riconosce L. Definiamo una MdT<br />
N (a due nastri): sull’input x<br />
1. Copia x sui nastri <strong>di</strong> M1 e M2<br />
2. Simula M1 e M2 in parallelo (usa un nastro per M1, l’altro per<br />
M2<br />
3. Se M1 accetta, accetta; se M2 accetta, rifiuta
Un linguaggio che non è Turing riconoscibile<br />
x →<br />
M1 →accetta<br />
M2 → accetta →<br />
<br />
accetta se M1 accetta<br />
rifiuta se M2 accetta
Un linguaggio che non è Turing riconoscibile<br />
x →<br />
M1 →accetta<br />
M2 → accetta →<br />
<br />
accetta se M1 accetta<br />
rifiuta se M2 accetta<br />
N decide L. Infatti, per ogni stringa x abbiamo due casi:
Un linguaggio che non è Turing riconoscibile<br />
x →<br />
M1 →accetta<br />
M2 → accetta →<br />
<br />
accetta se M1 accetta<br />
rifiuta se M2 accetta<br />
N decide L. Infatti, per ogni stringa x abbiamo due casi:<br />
1. x ∈ L. Ma x ∈ L se e solo se M1 si arresta e accetta x. Quin<strong>di</strong><br />
N accetta x.
Un linguaggio che non è Turing riconoscibile<br />
x →<br />
M1 →accetta<br />
M2 → accetta →<br />
<br />
accetta se M1 accetta<br />
rifiuta se M2 accetta<br />
N decide L. Infatti, per ogni stringa x abbiamo due casi:<br />
1. x ∈ L. Ma x ∈ L se e solo se M1 si arresta e accetta x. Quin<strong>di</strong><br />
N accetta x.<br />
2. x ∈ L. Ma x ∈ L se e solo se M2 si arresta e accetta x. Quin<strong>di</strong><br />
N rifiuta x.
Un linguaggio che non è Turing riconoscibile<br />
x →<br />
M1 →accetta<br />
M2 → accetta →<br />
<br />
accetta se M1 accetta<br />
rifiuta se M2 accetta<br />
N decide L. Infatti, per ogni stringa x abbiamo due casi:<br />
1. x ∈ L. Ma x ∈ L se e solo se M1 si arresta e accetta x. Quin<strong>di</strong><br />
N accetta x.<br />
2. x ∈ L. Ma x ∈ L se e solo se M2 si arresta e accetta x. Quin<strong>di</strong><br />
N rifiuta x.<br />
Poichè una e solo una delle due MdT<br />
accetta x, N è una MdT<br />
con solo due possibili risultati <strong>di</strong> una computazione<br />
(accettazione, rifiuto) e tale che N accetta x se e solo se<br />
x ∈ L.
Un linguaggio che non è Turing riconoscibile<br />
Teorema<br />
AMdT non è Turing riconoscibile.<br />
Dimostrazione.
Un linguaggio che non è Turing riconoscibile<br />
Teorema<br />
AMdT non è Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che AMdT sia Turing riconoscibile.
Un linguaggio che non è Turing riconoscibile<br />
Teorema<br />
AMdT non è Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che AMdT sia Turing riconoscibile.<br />
Sappiamo che AMdT è Turing riconoscibile.
Un linguaggio che non è Turing riconoscibile<br />
Teorema<br />
AMdT non è Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che AMdT sia Turing riconoscibile.<br />
Sappiamo che AMdT è Turing riconoscibile.<br />
Quin<strong>di</strong> AMdT è Turing riconoscibile e co-Turing riconoscibile.
Un linguaggio che non è Turing riconoscibile<br />
Teorema<br />
AMdT non è Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che AMdT sia Turing riconoscibile.<br />
Sappiamo che AMdT è Turing riconoscibile.<br />
Quin<strong>di</strong> AMdT è Turing riconoscibile e co-Turing riconoscibile.<br />
Per il prec<strong>ed</strong>ente teorema, AMdT è deci<strong>di</strong>bile.
Un linguaggio che non è Turing riconoscibile<br />
Teorema<br />
AMdT non è Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che AMdT sia Turing riconoscibile.<br />
Sappiamo che AMdT è Turing riconoscibile.<br />
Quin<strong>di</strong> AMdT è Turing riconoscibile e co-Turing riconoscibile.<br />
Per il prec<strong>ed</strong>ente teorema, AMdT è deci<strong>di</strong>bile.<br />
Assurdo, poichè abbiamo <strong>di</strong>mostrato che AMdT è indeci<strong>di</strong>bile.
Riducibilità<br />
È importante riconoscere che un problema P è indeci<strong>di</strong>bile.
Riducibilità<br />
È importante riconoscere che un problema P è indeci<strong>di</strong>bile.<br />
Come? Due possibilità:
Riducibilità<br />
È importante riconoscere che un problema P è indeci<strong>di</strong>bile.<br />
Come? Due possibilità:<br />
◮ Supporre l’esistenza <strong>di</strong> una MdT<br />
che decide P e provare che questo conduce a una<br />
contrad<strong>di</strong>zione.
Riducibilità<br />
È importante riconoscere che un problema P è indeci<strong>di</strong>bile.<br />
Come? Due possibilità:<br />
◮ Supporre l’esistenza <strong>di</strong> una MdT<br />
che decide P e provare che questo conduce a una<br />
contrad<strong>di</strong>zione.<br />
◮ Considerare un problema P ′ <strong>di</strong> cui sia nota l’indeci<strong>di</strong>bilità e<br />
<strong>di</strong>mostrare che P ′ “non è più <strong>di</strong>fficile” del problema in<br />
questione P.
Riducibilità: un esempio<br />
Esempio Σ = {0, 1}.
Riducibilità: un esempio<br />
Esempio Σ = {0, 1}.<br />
EVEN = {w ∈ Σ ∗ | w è la rappresentazione binaria <strong>di</strong> n ∈ N pari}
Riducibilità: un esempio<br />
Esempio Σ = {0, 1}.<br />
EVEN = {w ∈ Σ ∗ | w è la rappresentazione binaria <strong>di</strong> n ∈ N pari}<br />
ODD = {w ∈ Σ ∗ | w è la rappresentazione binaria <strong>di</strong> n ∈ N <strong>di</strong>spari}
Riducibilità: un esempio<br />
Esempio Σ = {0, 1}.<br />
EVEN = {w ∈ Σ ∗ | w è la rappresentazione binaria <strong>di</strong> n ∈ N pari}<br />
ODD = {w ∈ Σ ∗ | w è la rappresentazione binaria <strong>di</strong> n ∈ N <strong>di</strong>spari}<br />
Sia w ∈ Σ∗ e sia n il corrispondente decimale <strong>di</strong> w. È facile<br />
costruire la MdT<br />
INCR:<br />
w → INCR → w ′<br />
(= rappresentazione binaria <strong>di</strong> n + 1)
Riducibilità: un esempio<br />
◮ EVEN “non è più <strong>di</strong>fficile” <strong>di</strong> ODD: se esiste una MdT<br />
R che decide ODD, la MdT<br />
S decide EVEN.
Riducibilità: un esempio<br />
◮ EVEN “non è più <strong>di</strong>fficile” <strong>di</strong> ODD: se esiste una MdT<br />
R che decide ODD, la MdT<br />
S decide EVEN.<br />
S : w → INCR → w ′ → R
Riducibilità: un esempio<br />
◮ EVEN “non è più <strong>di</strong>fficile” <strong>di</strong> ODD: se esiste una MdT<br />
R che decide ODD, la MdT<br />
S decide EVEN.<br />
S : w → INCR → w ′ → R<br />
◮ Viceversa se EVEN è indeci<strong>di</strong>bile proviamo così che anche<br />
ODD lo è: se per assurdo esistesse una MdT<br />
R che decide ODD, la MdT<br />
S deciderebbe EVEN.
Riducibilità: un esempio<br />
◮ EVEN “non è più <strong>di</strong>fficile” <strong>di</strong> ODD: se esiste una MdT<br />
R che decide ODD, la MdT<br />
S decide EVEN.<br />
S : w → INCR → w ′ → R<br />
◮ Viceversa se EVEN è indeci<strong>di</strong>bile proviamo così che anche<br />
ODD lo è: se per assurdo esistesse una MdT<br />
R che decide ODD, la MdT<br />
S deciderebbe EVEN.<br />
◮ Problema. Possiamo <strong>di</strong>re che ODD “non è più <strong>di</strong>fficile” <strong>di</strong><br />
EVEN? In che modo?
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :<br />
◮ Sia R una MdT che decide HALTMdT .
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :<br />
◮ Sia R una MdT che decide HALTMdT .<br />
◮ Costruiamo S che sull’input 〈M, w〉, dove M è una MdT e w<br />
è una stringa:
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :<br />
◮ Sia R una MdT che decide HALTMdT .<br />
◮ Costruiamo S che sull’input 〈M, w〉, dove M è una MdT e w<br />
è una stringa:<br />
- simula R su 〈M, w〉
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :<br />
◮ Sia R una MdT che decide HALTMdT .<br />
◮ Costruiamo S che sull’input 〈M, w〉, dove M è una MdT e w<br />
è una stringa:<br />
- simula R su 〈M, w〉<br />
- se R rifiuta, rifiuta; se R accetta (questo significa che M si<br />
ferma su w) simula M finchè M si arresta su w.
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :<br />
◮ Sia R una MdT che decide HALTMdT .<br />
◮ Costruiamo S che sull’input 〈M, w〉, dove M è una MdT e w<br />
è una stringa:<br />
- simula R su 〈M, w〉<br />
- se R rifiuta, rifiuta; se R accetta (questo significa che M si<br />
ferma su w) simula M finchè M si arresta su w.<br />
- Se M ha accettato, accetta; se M ha rifiutato, rifiuta.
Riducibilità: un altro esempio<br />
Esempio (il “vero” problema della fermata):<br />
HALTMdT = {〈M, w〉 | M è una MdT e M si arresta su w}<br />
Se HALTMdT fosse deci<strong>di</strong>bile potremmo decidere anche AMdT :<br />
◮ Sia R una MdT che decide HALTMdT .<br />
◮ Costruiamo S che sull’input 〈M, w〉, dove M è una MdT e w<br />
è una stringa:<br />
- simula R su 〈M, w〉<br />
- se R rifiuta, rifiuta; se R accetta (questo significa che M si<br />
ferma su w) simula M finchè M si arresta su w.<br />
- Se M ha accettato, accetta; se M ha rifiutato, rifiuta.<br />
Se R decide HALTMdT allora S decide AMdT . Poichè<br />
sappiamo che AMdT è indeci<strong>di</strong>bile allora anche HALTMdT<br />
deve essere indeci<strong>di</strong>bile.
Riducibilità: un altro esempio<br />
Analizziamo l’esempio prec<strong>ed</strong>ente:<br />
◮ A partire dalla MdT R che decide HALTMdT abbiamo<br />
costruito una MdT S decide AMdT .
Riducibilità: un altro esempio<br />
Analizziamo l’esempio prec<strong>ed</strong>ente:<br />
◮ A partire dalla MdT R che decide HALTMdT abbiamo<br />
costruito una MdT S decide AMdT .<br />
◮ Questa MdT S è ottenuta facendo seguire alla computazione<br />
<strong>di</strong> R e se R accetta, la computazione <strong>di</strong> una MdT M ′ :
Riducibilità: un altro esempio<br />
Analizziamo l’esempio prec<strong>ed</strong>ente:<br />
◮ A partire dalla MdT R che decide HALTMdT abbiamo<br />
costruito una MdT S decide AMdT .<br />
◮ Questa MdT S è ottenuta facendo seguire alla computazione<br />
<strong>di</strong> R e se R accetta, la computazione <strong>di</strong> una MdT M ′ :<br />
〈M, w〉 → M ′ : Simula M su w →<br />
<br />
accetta se M accetta w;<br />
cicla altrimenti
Riducibilità: un altro esempio<br />
Analizziamo l’esempio prec<strong>ed</strong>ente:<br />
◮ A partire dalla MdT R che decide HALTMdT abbiamo<br />
costruito una MdT S decide AMdT .<br />
◮ Questa MdT S è ottenuta facendo seguire alla computazione<br />
<strong>di</strong> R e se R accetta, la computazione <strong>di</strong> una MdT M ′ :<br />
〈M, w〉 → M ′ : Simula M su w →<br />
<br />
accetta se M accetta w;<br />
cicla altrimenti<br />
◮ M ′ si ferma su w se e solo se M accetta w, cioè:<br />
〈M, w〉 ∈ AMdT ⇔ 〈M ′ , w〉 ∈ HALTMdT
Riducibilità: un altro esempio<br />
Analizziamo l’esempio prec<strong>ed</strong>ente:<br />
◮ A partire dalla MdT R che decide HALTMdT abbiamo<br />
costruito una MdT S decide AMdT .<br />
◮ Questa MdT S è ottenuta facendo seguire alla computazione<br />
<strong>di</strong> R e se R accetta, la computazione <strong>di</strong> una MdT M ′ :<br />
〈M, w〉 → M ′ : Simula M su w →<br />
<br />
accetta se M accetta w;<br />
cicla altrimenti<br />
◮ M ′ si ferma su w se e solo se M accetta w, cioè:<br />
〈M, w〉 ∈ AMdT ⇔ 〈M ′ , w〉 ∈ HALTMdT<br />
◮ La stringa F (〈M, w〉) = 〈M ′ , w〉 può essere ottenuta me<strong>di</strong>ante<br />
una MdT G.
Riducibilità: un altro esempio<br />
Quin<strong>di</strong> due requisiti:
Riducibilità: un altro esempio<br />
Quin<strong>di</strong> due requisiti:<br />
1. La stringa F (〈M, w〉) = 〈M ′ , w〉 può essere ottenuta me<strong>di</strong>ante<br />
una MdT<br />
G.
Riducibilità: un altro esempio<br />
Quin<strong>di</strong> due requisiti:<br />
1. La stringa F (〈M, w〉) = 〈M ′ , w〉 può essere ottenuta me<strong>di</strong>ante<br />
una MdT<br />
G.<br />
2. M ′ si ferma su w se e solo se M accetta w, cioè:<br />
〈M, w〉 ∈ AMdT ⇔ 〈M ′ , w〉 ∈ HALTMdT
Riducibilità: un altro esempio<br />
Quin<strong>di</strong> due requisiti:<br />
1. La stringa F (〈M, w〉) = 〈M ′ , w〉 può essere ottenuta me<strong>di</strong>ante<br />
una MdT<br />
G.<br />
2. M ′ si ferma su w se e solo se M accetta w, cioè:<br />
〈M, w〉 ∈ AMdT ⇔ 〈M ′ , w〉 ∈ HALTMdT<br />
I due requisiti sono entrambi necessari:
Riducibilità: un altro esempio<br />
Quin<strong>di</strong> due requisiti:<br />
1. La stringa F (〈M, w〉) = 〈M ′ , w〉 può essere ottenuta me<strong>di</strong>ante<br />
una MdT<br />
G.<br />
2. M ′ si ferma su w se e solo se M accetta w, cioè:<br />
〈M, w〉 ∈ AMdT ⇔ 〈M ′ , w〉 ∈ HALTMdT<br />
I due requisiti sono entrambi necessari:<br />
1. Il primo assicura che possiamo costruire una MdT<br />
S : 〈M, w〉 → G → 〈M ′ , w〉 → MdT che decide HALTMdT
Riducibilità: un altro esempio<br />
Quin<strong>di</strong> due requisiti:<br />
1. La stringa F (〈M, w〉) = 〈M ′ , w〉 può essere ottenuta me<strong>di</strong>ante<br />
una MdT<br />
G.<br />
2. M ′ si ferma su w se e solo se M accetta w, cioè:<br />
〈M, w〉 ∈ AMdT ⇔ 〈M ′ , w〉 ∈ HALTMdT<br />
I due requisiti sono entrambi necessari:<br />
1. Il primo assicura che possiamo costruire una MdT<br />
S : 〈M, w〉 → G → 〈M ′ , w〉 → MdT che decide HALTMdT<br />
2. Il secondo che la MdT S deciderebbe AMdT
Schema <strong>di</strong> Riduzione<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile
Schema <strong>di</strong> Riduzione<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
2. Vogliamo provare che B è indeci<strong>di</strong>bile
Schema <strong>di</strong> Riduzione<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
2. Vogliamo provare che B è indeci<strong>di</strong>bile<br />
3. Assumiamo (per assurdo) B deci<strong>di</strong>bile <strong>ed</strong><br />
usiamo questa assunzione per provare A deci<strong>di</strong>bile
Schema <strong>di</strong> Riduzione<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
2. Vogliamo provare che B è indeci<strong>di</strong>bile<br />
3. Assumiamo (per assurdo) B deci<strong>di</strong>bile <strong>ed</strong><br />
usiamo questa assunzione per provare A deci<strong>di</strong>bile<br />
4. La contrad<strong>di</strong>zione ci fa concludere: B indeci<strong>di</strong>bile
Riepilogo per HALTMdT<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
Unico conosciuto: A = AMdT
Riepilogo per HALTMdT<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
Unico conosciuto: A = AMdT<br />
2. Vogliamo provare che B è indeci<strong>di</strong>bile<br />
HALTMdT gioca il ruolo <strong>di</strong> B
Riepilogo per HALTMdT<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
Unico conosciuto: A = AMdT<br />
2. Vogliamo provare che B è indeci<strong>di</strong>bile<br />
HALTMdT gioca il ruolo <strong>di</strong> B<br />
3. Assumiamo (per assurdo) B deci<strong>di</strong>bile <strong>ed</strong> usiamo questa<br />
assunzione per provare A deci<strong>di</strong>bile<br />
Proviamo HALTMdT deci<strong>di</strong>bile ⇒ AMdT deci<strong>di</strong>bile<br />
Sia R una MdT che decide HALTMdT .<br />
Costruiamo S che sull’input 〈M, w〉<br />
◮ simula R su 〈M, w〉<br />
◮ Se R accetta (M si ferma su w)<br />
◮ simula M finchè M si arresta su w.<br />
Se M ha accettato, accetta; se M ha rifiutato, rifiuta.<br />
Se R decide HALTMdT allora S decide AMdT !
Riepilogo per HALTMdT<br />
Dal problema A al Problema B<br />
1. Sappiamo che A risulta indeci<strong>di</strong>bile<br />
Unico conosciuto: A = AMdT<br />
2. Vogliamo provare che B è indeci<strong>di</strong>bile<br />
HALTMdT gioca il ruolo <strong>di</strong> B<br />
3. Assumiamo (per assurdo) B deci<strong>di</strong>bile <strong>ed</strong> usiamo questa<br />
assunzione per provare A deci<strong>di</strong>bile<br />
Proviamo HALTMdT deci<strong>di</strong>bile ⇒ AMdT deci<strong>di</strong>bile<br />
Sia R una MdT che decide HALTMdT .<br />
Costruiamo S che sull’input 〈M, w〉<br />
◮ simula R su 〈M, w〉<br />
◮ Se R accetta (M si ferma su w)<br />
◮ simula M finchè M si arresta su w.<br />
Se M ha accettato, accetta; se M ha rifiutato, rifiuta.<br />
Se R decide HALTMdT allora S decide AMdT !<br />
4. La contrad<strong>di</strong>zione ci fa concludere: B = HALTMdT<br />
indeci<strong>di</strong>bile
Problema del vuoto <strong>di</strong> MdT<br />
Consideriamo<br />
Teorema<br />
EMdT è indeci<strong>di</strong>bile.<br />
EMdT = {〈M〉 | M MdT tale che L(M) = ∅}<br />
1. Sappiamo che AMdT risulta indeci<strong>di</strong>bile
Problema del vuoto <strong>di</strong> MdT<br />
Consideriamo<br />
Teorema<br />
EMdT è indeci<strong>di</strong>bile.<br />
EMdT = {〈M〉 | M MdT tale che L(M) = ∅}<br />
1. Sappiamo che AMdT risulta indeci<strong>di</strong>bile<br />
2. Vogliamo provare che EMdT è indeci<strong>di</strong>bile
Problema del vuoto <strong>di</strong> MdT<br />
Consideriamo<br />
Teorema<br />
EMdT è indeci<strong>di</strong>bile.<br />
EMdT = {〈M〉 | M MdT tale che L(M) = ∅}<br />
1. Sappiamo che AMdT risulta indeci<strong>di</strong>bile<br />
2. Vogliamo provare che EMdT è indeci<strong>di</strong>bile<br />
3. Assumiamo (per assurdo) EMdT deci<strong>di</strong>bile <strong>ed</strong><br />
usiamo questa assunzione per provare AMdT deci<strong>di</strong>bile
Problema del vuoto <strong>di</strong> MdT<br />
Consideriamo<br />
Teorema<br />
EMdT è indeci<strong>di</strong>bile.<br />
EMdT = {〈M〉 | M MdT tale che L(M) = ∅}<br />
1. Sappiamo che AMdT risulta indeci<strong>di</strong>bile<br />
2. Vogliamo provare che EMdT è indeci<strong>di</strong>bile<br />
3. Assumiamo (per assurdo) EMdT deci<strong>di</strong>bile <strong>ed</strong><br />
usiamo questa assunzione per provare AMdT deci<strong>di</strong>bile<br />
4. La contrad<strong>di</strong>zione ci fa concludere: EMdT indeci<strong>di</strong>bile
Problema del vuoto <strong>di</strong> MdT<br />
Assumiamo (per assurdo) EMdT deci<strong>di</strong>bile, sia R MdT che lo decide<br />
Usiamo R per costruire una MdT S che decide AMdT :
Problema del vuoto <strong>di</strong> MdT<br />
Assumiamo (per assurdo) EMdT deci<strong>di</strong>bile, sia R MdT che lo decide<br />
Usiamo R per costruire una MdT S che decide AMdT :<br />
Data istanza 〈M, w〉 <strong>di</strong> AMdT ,<br />
Usiamo R su 〈M〉.
Problema del vuoto <strong>di</strong> MdT<br />
Assumiamo (per assurdo) EMdT deci<strong>di</strong>bile, sia R MdT che lo decide<br />
Usiamo R per costruire una MdT S che decide AMdT :<br />
Data istanza 〈M, w〉 <strong>di</strong> AMdT ,<br />
Usiamo R su 〈M〉.<br />
R accetta ⇒ L(M) = ∅ ⇒ M non accetta w<br />
⇒ Decider S per AMdT deve rifiutare 〈M, w〉.
Problema del vuoto <strong>di</strong> MdT<br />
Assumiamo (per assurdo) EMdT deci<strong>di</strong>bile, sia R MdT che lo decide<br />
Usiamo R per costruire una MdT S che decide AMdT :<br />
Data istanza 〈M, w〉 <strong>di</strong> AMdT ,<br />
Usiamo R su 〈M〉.<br />
R accetta ⇒ L(M) = ∅ ⇒ M non accetta w<br />
⇒ Decider S per AMdT deve rifiutare 〈M, w〉.<br />
R rifiuta 〈M, w〉 ⇒ L(M) = ∅<br />
Rimane la domanda: w ∈ L(M)?<br />
Mo<strong>di</strong>fichiamo M in M1
Problema del vuoto <strong>di</strong> MdT: M1<br />
Iniziamo con MdT t.c. L(M1) = L(M)
Problema del vuoto <strong>di</strong> MdT: M1<br />
Inseriamo filtro che controlla se l’input corrisponde a w:<br />
facendo un confronto carattere per carattere tra input x e stringa<br />
w (data)
Problema del vuoto <strong>di</strong> MdT: M1<br />
Descrizione formale <strong>di</strong> M1<br />
M1 su input x<br />
1. Se x = w, rifiuta<br />
2. Se x = w e M accetta w, accetta<br />
M rifiuta w sse L(M1) = ∅
Problema del vuoto <strong>di</strong> MdT: S<br />
Input <strong>di</strong> S corrisponde alla coppia 〈M, w〉<br />
Prima <strong>di</strong> ”usare” R (decider <strong>di</strong> EMdT ), S deve calcolare la co<strong>di</strong>fica<br />
〈M1〉 <strong>di</strong> M1 (deve aggiungere il filtro)
Problema del vuoto <strong>di</strong> MdT: S<br />
Input <strong>di</strong> S corrisponde alla coppia 〈M, w〉<br />
Prima <strong>di</strong> ”usare” R (decider <strong>di</strong> EMdT ), S deve calcolare la co<strong>di</strong>fica<br />
〈M1〉 <strong>di</strong> M1 (deve aggiungere il filtro)<br />
S su input 〈M, w〉<br />
1. Calcola la co<strong>di</strong>fica 〈M1〉 <strong>di</strong> M1<br />
2. Usa R su input 〈M1〉<br />
3. Se R rifiuta, accetta<br />
se R accetta (L(M1) = ∅), rifiuta
Problema del vuoto <strong>di</strong> MdT: S<br />
Input <strong>di</strong> S corrisponde alla coppia 〈M, w〉<br />
Prima <strong>di</strong> ”usare” R (decider <strong>di</strong> EMdT ), S deve calcolare la co<strong>di</strong>fica<br />
〈M1〉 <strong>di</strong> M1 (deve aggiungere il filtro)<br />
S su input 〈M, w〉<br />
1. Calcola la co<strong>di</strong>fica 〈M1〉 <strong>di</strong> M1<br />
2. Usa R su input 〈M1〉<br />
3. Se R rifiuta, accetta<br />
se R accetta (L(M1) = ∅), rifiuta<br />
Se R accetta (L(M1) = ∅ e quin<strong>di</strong> w /∈ L(M)) quin<strong>di</strong> S rifiuta
Problema del vuoto <strong>di</strong> MdT: S<br />
Input <strong>di</strong> S corrisponde alla coppia 〈M, w〉<br />
Prima <strong>di</strong> ”usare” R (decider <strong>di</strong> EMdT ), S deve calcolare la co<strong>di</strong>fica<br />
〈M1〉 <strong>di</strong> M1 (deve aggiungere il filtro)<br />
S su input 〈M, w〉<br />
1. Calcola la co<strong>di</strong>fica 〈M1〉 <strong>di</strong> M1<br />
2. Usa R su input 〈M1〉<br />
3. Se R rifiuta, accetta<br />
se R accetta (L(M1) = ∅), rifiuta<br />
Se R accetta (L(M1) = ∅ e quin<strong>di</strong> w /∈ L(M)) quin<strong>di</strong> S rifiuta<br />
Se R rifiuta (L(M1) = {w} e w ∈ L(M)) quin<strong>di</strong> S accetta<br />
Conclusione: Da R abbiamo costruito un decider S per AMdT ,<br />
quin<strong>di</strong> R non esiste.
Funzioni calcolabili<br />
Definizione<br />
Una funzione f : Σ ∗ → Σ ∗ è calcolabile se esiste una TM M tale<br />
che su ogni input w, M si arresta con f (w), e solo con f (w), sul<br />
suo nastro.
Funzioni calcolabili<br />
Definizione<br />
Una funzione f : Σ ∗ → Σ ∗ è calcolabile se esiste una TM M tale<br />
che su ogni input w, M si arresta con f (w), e solo con f (w), sul<br />
suo nastro.<br />
◮ Nota: questa definizione sottolinea la <strong>di</strong>fferenza tra definire<br />
una funzione f , cioè definire i valori <strong>di</strong> f e calcolare tali valori<br />
<strong>di</strong> f .
Funzioni calcolabili<br />
Definizione<br />
Una funzione f : Σ ∗ → Σ ∗ è calcolabile se esiste una TM M tale<br />
che su ogni input w, M si arresta con f (w), e solo con f (w), sul<br />
suo nastro.<br />
◮ Nota: questa definizione sottolinea la <strong>di</strong>fferenza tra definire<br />
una funzione f , cioè definire i valori <strong>di</strong> f e calcolare tali valori<br />
<strong>di</strong> f .<br />
◮ La funzione F : 〈M, w〉 → 〈M1, w〉 dell’esempio prec<strong>ed</strong>ente è<br />
calcolabile.
Funzioni calcolabili<br />
Le seguenti funzioni aritmetiche sono calcolabili (dove n, m ∈ N):<br />
◮ incr(n) = n + 1<br />
<br />
◮ dec(n) =<br />
n − 1<br />
0<br />
se n > 0;<br />
se n = 0<br />
◮ (m, n) → m + n;<br />
◮ (m, n) → m − n;<br />
◮ (m, n) → m · n
Riducibilità<br />
Definizione<br />
Un linguaggio A è riducibile a un linguaggio B (A ≤m B) se esiste<br />
una funzione calcolabile f : Σ ∗ → Σ ∗ tale che ∀w<br />
w ∈ A ⇔ f (w) ∈ B<br />
La funzione f è chiamata la riduzione <strong>di</strong> A a B.
Riducibilità<br />
Definizione<br />
Un linguaggio A è riducibile a un linguaggio B (A ≤m B) se esiste<br />
una funzione calcolabile f : Σ ∗ → Σ ∗ tale che ∀w<br />
w ∈ A ⇔ f (w) ∈ B<br />
La funzione f è chiamata la riduzione <strong>di</strong> A a B.<br />
◮ Una riduzione fornisce un modo per convertire<br />
problemi <strong>di</strong> appartenenza ad A in problemi <strong>di</strong> appartenenza a<br />
B.<br />
◮ Se un problema A è riducibile a B e sappiamo risolvere B<br />
allora sappiamo risolvere A<br />
⇒ A “non è più <strong>di</strong>fficile” <strong>di</strong> B.
Riduzioni<br />
Teorema<br />
Se A ≤m B e B è deci<strong>di</strong>bile, allora A è deci<strong>di</strong>bile.
Riduzioni<br />
Teorema<br />
Se A ≤m B e B è deci<strong>di</strong>bile, allora A è deci<strong>di</strong>bile.<br />
Siano: M il decider per B <strong>ed</strong> f la riduzione da A a B<br />
Costruiamo un decider N per A: su input w<br />
◮ Calcola f (w)<br />
◮ ”utilizza” M su f (w) e da lo stesso output.<br />
w ∈ A ⇔ f (w) ∈ B (f riduzione da A a B) ⇔ M accetta f (w)<br />
Quin<strong>di</strong> N decide A.
Riduzioni<br />
Teorema<br />
Se A ≤m B e B è deci<strong>di</strong>bile, allora A è deci<strong>di</strong>bile.<br />
Siano: M il decider per B <strong>ed</strong> f la riduzione da A a B<br />
Costruiamo un decider N per A: su input w<br />
◮ Calcola f (w)<br />
◮ ”utilizza” M su f (w) e da lo stesso output.<br />
w ∈ A ⇔ f (w) ∈ B (f riduzione da A a B) ⇔ M accetta f (w)<br />
Quin<strong>di</strong> N decide A.<br />
Teorema<br />
Se A ≤m B e B è Turing riconoscibile, allora A è Turing<br />
riconoscibile.<br />
RA riconoscitore per A, RB riconoscitore per B,<br />
RA : w → f → f (w) → RB
Riduzioni<br />
Corollario<br />
Se A ≤m B e A è indeci<strong>di</strong>bile, allora B è indeci<strong>di</strong>bile.
Riduzioni<br />
Corollario<br />
Se A ≤m B e A è indeci<strong>di</strong>bile, allora B è indeci<strong>di</strong>bile.<br />
(se B fosse deci<strong>di</strong>bile lo sarebbe anche A in virtù del teorema<br />
prec<strong>ed</strong>ente)
Riduzioni<br />
Corollario<br />
Se A ≤m B e A è indeci<strong>di</strong>bile, allora B è indeci<strong>di</strong>bile.<br />
(se B fosse deci<strong>di</strong>bile lo sarebbe anche A in virtù del teorema<br />
prec<strong>ed</strong>ente)<br />
Corollario<br />
Se A ≤m B e A non è Turing riconoscibile, allora B non è<br />
Turing riconoscibile.
Riduzioni<br />
Corollario<br />
Se A ≤m B e A è indeci<strong>di</strong>bile, allora B è indeci<strong>di</strong>bile.<br />
(se B fosse deci<strong>di</strong>bile lo sarebbe anche A in virtù del teorema<br />
prec<strong>ed</strong>ente)<br />
Corollario<br />
Se A ≤m B e A non è Turing riconoscibile, allora B non è<br />
Turing riconoscibile.<br />
(se B fosse Turing riconoscibile lo sarebbe anche A in virtù del<br />
teorema prec<strong>ed</strong>ente)
Esempi <strong>di</strong> riduzioni<br />
ATM = {〈M, w〉 | M è una TM e w ∈ L(M)}<br />
ETM = {〈M〉 | M è una TM e L(M) = ∅}<br />
ATM ≤m ETM
Esempi <strong>di</strong> riduzioni<br />
ATM = {〈M, w〉 | M è una TM e w ∈ L(M)}<br />
ETM = {〈M〉 | M è una TM e L(M) = ∅}<br />
ATM ≤m ETM<br />
Data una MT M e una stringa w, sia M1 la MdT tale che, su un<br />
input x:<br />
1. Se x = w allora M1 si ferma e rifiuta x.<br />
2. Se x = w allora M1 simula M su w e accetta x se M accetta<br />
x = w.
Esempi <strong>di</strong> riduzioni<br />
ATM = {〈M, w〉 | M è una TM e w ∈ L(M)}<br />
ETM = {〈M〉 | M è una TM e L(M) = ∅}<br />
ATM ≤m ETM<br />
Data una MT M e una stringa w, sia M1 la MdT tale che, su un<br />
input x:<br />
1. Se x = w allora M1 si ferma e rifiuta x.<br />
2. Se x = w allora M1 simula M su w e accetta x se M accetta<br />
x = w.<br />
La funzione: 〈M, w〉 → 〈M1〉 è una riduzione <strong>di</strong> ATM a ETM.<br />
Infatti, M accetta w (cioè 〈M, w〉 ∈ ATM) se e solo se L(M1) = ∅<br />
(cioè se e solo se 〈M1〉 ∈ ETM).
Esempi <strong>di</strong> riduzioni<br />
ATM ≤m ETM e AMdT indeci<strong>di</strong>bile ⇒ EMdT indeci<strong>di</strong>bile.
Esempi <strong>di</strong> riduzioni<br />
ATM ≤m ETM e AMdT indeci<strong>di</strong>bile ⇒ EMdT indeci<strong>di</strong>bile.<br />
Quin<strong>di</strong> anche EMdT è indeci<strong>di</strong>bile<br />
(deci<strong>di</strong>bilità non risente della complementazione)
Esempi <strong>di</strong> riduzioni<br />
ATM ≤m ETM e AMdT indeci<strong>di</strong>bile ⇒ EMdT indeci<strong>di</strong>bile.<br />
Quin<strong>di</strong> anche EMdT è indeci<strong>di</strong>bile<br />
(deci<strong>di</strong>bilità non risente della complementazione)<br />
Nota. Non esiste nessuna riduzione da AMdT a EMdT .
Esempi <strong>di</strong> riduzioni<br />
REGULARMdT = {〈M〉 | M è una MdT e L(M) è regolare }<br />
AMdT ≤m REGULARMdT
Esempi <strong>di</strong> riduzioni<br />
REGULARMdT = {〈M〉 | M è una MdT e L(M) è regolare }<br />
AMdT ≤m REGULARMdT<br />
Data una MT M e una stringa w, sia R la macchina <strong>di</strong> Turing tale<br />
che, su un input x:<br />
1. Se x ∈ {0 n 1 n | n ∈ N}, allora R si ferma e accetta x.<br />
2. Se x ∈ {0 n 1 n | n ∈ N} allora R simula M su w e accetta x se<br />
M accetta w.
Esempi <strong>di</strong> riduzioni<br />
REGULARMdT = {〈M〉 | M è una MdT e L(M) è regolare }<br />
AMdT ≤m REGULARMdT<br />
Data una MT M e una stringa w, sia R la macchina <strong>di</strong> Turing tale<br />
che, su un input x:<br />
1. Se x ∈ {0 n 1 n | n ∈ N}, allora R si ferma e accetta x.<br />
2. Se x ∈ {0 n 1 n | n ∈ N} allora R simula M su w e accetta x se<br />
M accetta w.<br />
f : 〈M, w〉 → 〈R〉 è riduzione da AMdT a REGULARMdT .<br />
Infatti, se M accetta w allora L(R) = Σ ∗ (regolare) e se M non<br />
accetta w allora L(R) = {0 n 1 n | n ∈ N} (non regolare)
Esempi <strong>di</strong> riduzioni<br />
REGULARMdT = {〈M〉 | M è una MdT e L(M) è regolare }<br />
AMdT ≤m REGULARMdT<br />
Data una MT M e una stringa w, sia R la macchina <strong>di</strong> Turing tale<br />
che, su un input x:<br />
1. Se x ∈ {0 n 1 n | n ∈ N}, allora R si ferma e accetta x.<br />
2. Se x ∈ {0 n 1 n | n ∈ N} allora R simula M su w e accetta x se<br />
M accetta w.<br />
f : 〈M, w〉 → 〈R〉 è riduzione da AMdT a REGULARMdT .<br />
Infatti, se M accetta w allora L(R) = Σ ∗ (regolare) e se M non<br />
accetta w allora L(R) = {0 n 1 n | n ∈ N} (non regolare)<br />
Quin<strong>di</strong> M accetta w (cioè 〈M, w〉 ∈ AMdT ) se e solo se L(R) è<br />
regolare (cioè se e solo se 〈R〉 ∈ REGULARMdT ).
Esempi <strong>di</strong> riduzioni<br />
EMdT = {〈M〉 | M è una MdT e L(M) = ∅}<br />
EQMdT = {〈M1, M2〉 | M1, M2 sono MdT e L(M1) = L(M2)}<br />
EMdT ≤m EQMdT
Esempi <strong>di</strong> riduzioni<br />
EMdT = {〈M〉 | M è una MdT e L(M) = ∅}<br />
EQMdT = {〈M1, M2〉 | M1, M2 sono MdT e L(M1) = L(M2)}<br />
EMdT ≤m EQMdT<br />
Sia M1 una macchina <strong>di</strong> Turing tale che L(M1) = ∅.<br />
f : 〈M〉 → 〈M, M1〉 è una riduzione <strong>di</strong> EMdT a EQMdT .<br />
Infatti, L(M) = ∅ (cioè 〈M〉 ∈ EMdT ) se e solo se<br />
L(M) = ∅ = L(M1) (cioè se e solo se 〈M, M1〉 ∈ EQMdT )
Esempi <strong>di</strong> riduzioni<br />
AMdT ≤m EQMdT
Esempi <strong>di</strong> riduzioni<br />
AMdT ≤m EQMdT<br />
Idea: Data 〈M, w〉, considerare una MT M1 che accetta Σ ∗ e<br />
una macchina M2 che accetta Σ ∗ se M accetta w:
Esempi <strong>di</strong> riduzioni<br />
AMdT ≤m EQMdT<br />
Idea: Data 〈M, w〉, considerare una MT M1 che accetta Σ ∗ e<br />
una macchina M2 che accetta Σ ∗ se M accetta w:<br />
Per ogni input x:<br />
M1 accetta x,<br />
M2 simula M su w. Se M accetta, M2 accetta.
Esempi <strong>di</strong> riduzioni<br />
AMdT ≤m EQMdT<br />
Idea: Data 〈M, w〉, considerare una MT M1 che accetta Σ ∗ e<br />
una macchina M2 che accetta Σ ∗ se M accetta w:<br />
Per ogni input x:<br />
M1 accetta x,<br />
M2 simula M su w. Se M accetta, M2 accetta.<br />
◮ f : 〈M, w〉 → 〈M1, M2〉 è riduzione da AMdT a EQMdT .<br />
Infatti, M accetta w (cioè 〈M, w〉 ∈ AMdT ) se e solo se<br />
L(M1) = Σ ∗ = L(M2) (cioè se e solo se 〈M1, M2〉 ∈ EQMdT )
Esempi <strong>di</strong> riduzioni<br />
◮ AMdT ≤m EQMdT
Esempi <strong>di</strong> riduzioni<br />
◮ AMdT ≤m EQMdT<br />
◮ Idea: Data 〈M, w〉, considerare una MT M1 che accetta<br />
l’insieme vuoto e una macchina M2 che accetta Σ ∗ se M<br />
accetta w:
Esempi <strong>di</strong> riduzioni<br />
◮ AMdT ≤m EQMdT<br />
◮ Idea: Data 〈M, w〉, considerare una MT M1 che accetta<br />
l’insieme vuoto e una macchina M2 che accetta Σ ∗ se M<br />
accetta w:<br />
Per ogni input x:<br />
M1 rifiuta x,<br />
M2 simula M su w. Se M accetta, M2 accetta.
Esempi <strong>di</strong> riduzioni<br />
◮ AMdT ≤m EQMdT<br />
◮ Idea: Data 〈M, w〉, considerare una MT M1 che accetta<br />
l’insieme vuoto e una macchina M2 che accetta Σ ∗ se M<br />
accetta w:<br />
Per ogni input x:<br />
M1 rifiuta x,<br />
M2 simula M su w. Se M accetta, M2 accetta.<br />
◮ f : 〈M, w〉 → 〈M1, M2〉 è riduzione da AMdT a EQMdT .
Esempi <strong>di</strong> riduzioni<br />
◮ AMdT ≤m EQMdT<br />
◮ Idea: Data 〈M, w〉, considerare una MT M1 che accetta<br />
l’insieme vuoto e una macchina M2 che accetta Σ ∗ se M<br />
accetta w:<br />
Per ogni input x:<br />
M1 rifiuta x,<br />
M2 simula M su w. Se M accetta, M2 accetta.<br />
◮ f : 〈M, w〉 → 〈M1, M2〉 è riduzione da AMdT a EQMdT .<br />
Infatti, M accetta w (cioè 〈M, w〉 ∈ AMdT )<br />
se e solo<br />
se L(M1) = ∅ = Σ ∗ = L(M2)<br />
(cioè se e solo se 〈M1, M2〉 ∈ EQMdT ).
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che EQMdT sia Turing riconoscibile.
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT<br />
Quin<strong>di</strong> AMdT sarebbe Turing riconoscibile: assurdo.
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT<br />
Quin<strong>di</strong> AMdT sarebbe Turing riconoscibile: assurdo.<br />
Supponiamo per assurdo che EQMdT sia co-Turing<br />
riconoscibile, cioè che EQMdT sia Turing riconoscibile.
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT<br />
Quin<strong>di</strong> AMdT sarebbe Turing riconoscibile: assurdo.<br />
Supponiamo per assurdo che EQMdT sia co-Turing<br />
riconoscibile, cioè che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT
Esempi <strong>di</strong> riduzioni<br />
Teorema<br />
EQMdT non è nè Turing riconoscibile nè co-Turing riconoscibile.<br />
Dimostrazione.<br />
Supponiamo per assurdo che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT<br />
Quin<strong>di</strong> AMdT sarebbe Turing riconoscibile: assurdo.<br />
Supponiamo per assurdo che EQMdT sia co-Turing<br />
riconoscibile, cioè che EQMdT sia Turing riconoscibile.<br />
AMdT ≤m EQMdT ⇒ AMdT ≤m EQMdT<br />
Quin<strong>di</strong> AMdT sarebbe Turing riconoscibile: assurdo.
Teorema <strong>di</strong> Rice<br />
Afferma che, per ogni proprietá non banale delle funzioni<br />
calcolabili, il problema <strong>di</strong> decidere quali funzioni sod<strong>di</strong>sfino tale<br />
proprietá e quali no, é indeci<strong>di</strong>bile.<br />
Propriet banale: proprietá che non effettua alcuna <strong>di</strong>scriminazione<br />
tra le funzioni calcolabili, cioé che vale o per tutte o per nessuna.<br />
Teorema <strong>di</strong> Rice. Sia<br />
P = {〈M〉 | M è una MdT che verifica la proprietà P}<br />
un linguaggio che sod<strong>di</strong>sfa le seguenti due con<strong>di</strong>zioni:
Teorema <strong>di</strong> Rice<br />
Afferma che, per ogni proprietá non banale delle funzioni<br />
calcolabili, il problema <strong>di</strong> decidere quali funzioni sod<strong>di</strong>sfino tale<br />
proprietá e quali no, é indeci<strong>di</strong>bile.<br />
Propriet banale: proprietá che non effettua alcuna <strong>di</strong>scriminazione<br />
tra le funzioni calcolabili, cioé che vale o per tutte o per nessuna.<br />
Teorema <strong>di</strong> Rice. Sia<br />
P = {〈M〉 | M è una MdT che verifica la proprietà P}<br />
un linguaggio che sod<strong>di</strong>sfa le seguenti due con<strong>di</strong>zioni:<br />
1. L’appartenenza <strong>di</strong> M a P <strong>di</strong>pende solo da L(M), cioè<br />
∀M1, M2 MdT tali che L(M1) = L(M2), 〈M1〉 ∈ P ⇔ 〈M2〉 ∈ P
Teorema <strong>di</strong> Rice<br />
Afferma che, per ogni proprietá non banale delle funzioni<br />
calcolabili, il problema <strong>di</strong> decidere quali funzioni sod<strong>di</strong>sfino tale<br />
proprietá e quali no, é indeci<strong>di</strong>bile.<br />
Propriet banale: proprietá che non effettua alcuna <strong>di</strong>scriminazione<br />
tra le funzioni calcolabili, cioé che vale o per tutte o per nessuna.<br />
Teorema <strong>di</strong> Rice. Sia<br />
P = {〈M〉 | M è una MdT che verifica la proprietà P}<br />
un linguaggio che sod<strong>di</strong>sfa le seguenti due con<strong>di</strong>zioni:<br />
1. L’appartenenza <strong>di</strong> M a P <strong>di</strong>pende solo da L(M), cioè<br />
∀M1, M2 MdT tali che L(M1) = L(M2), 〈M1〉 ∈ P ⇔ 〈M2〉 ∈ P<br />
2. P è un problema non banale, cioè<br />
∃M1, M2 MdT tali che 〈M1〉 ∈ P, 〈M2〉 ∈ P
Teorema <strong>di</strong> Rice<br />
Afferma che, per ogni proprietá non banale delle funzioni<br />
calcolabili, il problema <strong>di</strong> decidere quali funzioni sod<strong>di</strong>sfino tale<br />
proprietá e quali no, é indeci<strong>di</strong>bile.<br />
Propriet banale: proprietá che non effettua alcuna <strong>di</strong>scriminazione<br />
tra le funzioni calcolabili, cioé che vale o per tutte o per nessuna.<br />
Teorema <strong>di</strong> Rice. Sia<br />
P = {〈M〉 | M è una MdT che verifica la proprietà P}<br />
un linguaggio che sod<strong>di</strong>sfa le seguenti due con<strong>di</strong>zioni:<br />
1. L’appartenenza <strong>di</strong> M a P <strong>di</strong>pende solo da L(M), cioè<br />
∀M1, M2 MdT tali che L(M1) = L(M2), 〈M1〉 ∈ P ⇔ 〈M2〉 ∈ P<br />
2. P è un problema non banale, cioè<br />
P è indeci<strong>di</strong>bile.<br />
∃M1, M2 MdT tali che 〈M1〉 ∈ P, 〈M2〉 ∈ P
Teorema <strong>di</strong> Rice<br />
◮ Ogni proprietà non banale del linguaggio <strong>di</strong> una MdT è<br />
indeci<strong>di</strong>bile.
Teorema <strong>di</strong> Rice<br />
◮ Ogni proprietà non banale del linguaggio <strong>di</strong> una MdT è<br />
indeci<strong>di</strong>bile.<br />
◮ Nota la <strong>di</strong>fferenza tra una proprietà <strong>di</strong> L(M) e una proprietà <strong>di</strong><br />
M:
Teorema <strong>di</strong> Rice<br />
◮ Ogni proprietà non banale del linguaggio <strong>di</strong> una MdT è<br />
indeci<strong>di</strong>bile.<br />
◮ Nota la <strong>di</strong>fferenza tra una proprietà <strong>di</strong> L(M) e una proprietà <strong>di</strong><br />
M:<br />
- Esempio: L(M) = ∅ è una proprietà del linguaggio.
Teorema <strong>di</strong> Rice<br />
◮ Ogni proprietà non banale del linguaggio <strong>di</strong> una MdT è<br />
indeci<strong>di</strong>bile.<br />
◮ Nota la <strong>di</strong>fferenza tra una proprietà <strong>di</strong> L(M) e una proprietà <strong>di</strong><br />
M:<br />
- Esempio: L(M) = ∅ è una proprietà del linguaggio.<br />
- Esempio: “M ha almeno 1000 stati” è una proprietà della<br />
MdT.
Teorema <strong>di</strong> Rice<br />
◮ Ogni proprietà non banale del linguaggio <strong>di</strong> una MdT è<br />
indeci<strong>di</strong>bile.<br />
◮ Nota la <strong>di</strong>fferenza tra una proprietà <strong>di</strong> L(M) e una proprietà <strong>di</strong><br />
M:<br />
- Esempio: L(M) = ∅ è una proprietà del linguaggio.<br />
- Esempio: “M ha almeno 1000 stati” è una proprietà della<br />
MdT.<br />
- “L(M) = ∅” è indeci<strong>di</strong>bile; “M ha almeno 1000 stati” è<br />
facilmente deci<strong>di</strong>bile, basta guardare alla co<strong>di</strong>fica <strong>di</strong> M e<br />
contare.
Conseguenze del Teorema <strong>di</strong> Rice<br />
Non possiamo decidere se una MdT:<br />
- Accetta ∅.
Conseguenze del Teorema <strong>di</strong> Rice<br />
Non possiamo decidere se una MdT:<br />
- Accetta ∅.<br />
- Accetta un linguaggio finito.
Conseguenze del Teorema <strong>di</strong> Rice<br />
Non possiamo decidere se una MdT:<br />
- Accetta ∅.<br />
- Accetta un linguaggio finito.<br />
- Accetta un linguaggio regolare, ecc.