5
Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito Ciclo infinito: per esempio, eseguire le istruzioni con numeri 1000, 1001, …, 1010, poi sempre tornare all’istruzione 1000, poi ripetere 1001, …, 1010, poi tornare all’istruzione 1000 … ecc. Supponiamo che un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito esiste Programma LC(P,x), dove P è un altro programma e x è l’input del programma P Il risultato di LC(P,x) è “Sì” se, quando P è eseguito su x, fa un ciclo infinito Altrimenti il risultato di LC(P,x) è “No”

Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le

Embed Size (px)

Citation preview

Page 1: Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le

Un problema

• Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito– Ciclo infinito: per esempio, eseguire le istruzioni con numeri

1000, 1001, …, 1010, poi sempre tornare all’istruzione 1000, poi ripetere 1001, …, 1010, poi tornare all’istruzione 1000 … ecc.

• Supponiamo che un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito esiste– Programma LC(P,x), dove P è un altro programma e x è

l’input del programma P– Il risultato di LC(P,x) è “Sì” se, quando P è eseguito su x, fa

un ciclo infinito– Altrimenti il risultato di LC(P,x) è “No”

Page 2: Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le

Un problema

• Supponiamo che esiste un programma CD(P):– Calcola LC(P,P)– Se il risultato di LC(P,P) è “Sì”, termina con il risultato “Sì”– Altrimenti, torna al punto del CD(P) dopo il calcolo di

LC(P,P)

Ans=LC(P,P)

Ans?Termina con risultato Ans

“No”“Sì”

CD(P)

Page 3: Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le

Un problema

• Eseguire CD su se stesso: che cos’è il risultato di CD(CD)?– Se il risultato di LC(CD,CD) è “No”: vuol dire che CD non ha un

ciclo infinito con input CD

– Poi CD(CD) fa un ciclo infinito (in rosso)

– Il risultato di LC è scorretto

Ans=LC(P,P)

Ans?Termina con risultato Ans

“No”“Sì”

CD(P)

Page 4: Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le

Un problema

• Eseguire CD su se stesso: che cos’è il risultato di CD(CD)?– Se il risultato di LC(CD,CD) è “Sì”: vuol dire che CD ha un ciclo

infinito con input CD

– Poi CD(CD) non fa un ciclo infinito (in rosso)

– Il risultato di LC è scorretto (di nuovo)

Ans=LC(P,P)

Ans?Termina con risultato Ans

“No”“Sì”

CD(P)

Page 5: Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le

Un problema

• Non è possibile trovare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito

• Per molti problemi che possono essere descritti formalmente, non possiamo trovare programmi per la loro soluzione

• Per altri problemi, possiamo trovare programmi per la loro soluzione, ma non programmi efficienti– Programma efficiente: il numero di istruzioni eseguiti è una funzione

polinomiale della dimensione del input al programma– Per esempio: non sì può trovare un programma efficiente per

trovare l’insieme meno costoso di biglietti aerei per fare un viaggio a n città