20.05.2013 Views

Decidibilità - Dipartimento di Informatica ed Applicazioni

Decidibilità - Dipartimento di Informatica ed Applicazioni

Decidibilità - Dipartimento di Informatica ed Applicazioni

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!