Teoria della computabilità Appunti tratti dal libro di testo M. Addomine, D. Pons INFORMATICA – Zanichelli pag.120-129
Teoria della computabilità Si occupa dell’esistenza o meno di algoritmi risolutivi di problemi (cosa può essere calcolato e cosa no) Si è sviluppata a partire dal secolo scorso con la nascita del computer Si basa sulla logica matematica o logica formale
Logica La logica è lo studio del ragionamento corretto. La possiamo considerare da almeno due punti di vista: la logica formale e la logica informale. La logica formale si propone di studiare le forme del ragionamento, ossia modelli generali comuni a molti ragionamenti, codificati in linguaggio simbolico. La logica informale, invece, s’impegna a individuare e analizzare i ragionamenti dei discorsi espressi, quindi nel linguaggio naturale corrente. L’obiettivo specifico della logica informale è lo studio di ragionamenti concreti.
La logica formale Si utilizzano i simboli consentiti dal contesto 3 + 5 = 7 Questa frase è corretta ma falsa La correttezza è fondamentale 3 + 5 = 8 Questa frase è corretta e vera Non è sufficiente utilizzare i simboli corretti 3 + = 5 8 Questa frase non è corretta e non ha senso parlare di verità o falsità
Tempo di calcolo Il tempo impiegato da un computer per eseguire un calcolo e fornire la risposta dipende anche dalla complessità dell’algoritmo utilizzato. X = problema da risolvere n = ordine del problema A = algoritmo utilizzato T = f(n, X, A)
«Dati X ed A, quanto vale T = f(n, X, A)?» Problema La teoria della computabilità cerca di trovare non solo la risposta al problema «Dati X ed A, quanto vale T = f(n, X, A)?» ma anche al problema «Dato un particolare X, quale A minimizza T = f(n, X, A) per tutti i valori di n?» Per definizione di algoritmo, il problema deve trovare soluzione in un numero finito di passi e quindi in un tempo finito
Algoritmi e problemi Non tutti gli algoritmi per risolvere un determinato problema sono equivalenti Il programmatore si rivolge all’analista e quest’ultimo al progettista di algoritmi
Domande Cosa significa computare? Cosa può essere computato? Un computer, se avesse abbastanza memoria e tempo, potrebbe risolvere qualsiasi problema? Quanto velocemente si può risolvere un problema? Quanta memoria sarà necessaria? Avendo a disposizione una certa quantità di memoria (e solo quella) quali problemi potranno essere risolti e quali no? Risponde la teoria della computabilità e la teoria della complessità
Qualcosa di non computabile Non esiste un metodo universale, cioè che possa essere applicato da un computer e quindi risolto attraverso la scrittura di un codice idoneo, che possa predire se un dato codice non banale – ad esempio in C – potrà funzionare comunque oppure se esistono casi in cui andrà in errore, per esempio entrando in un loop infinito.
Ricorsività Esiste un legame tra funzioni ricorsive e funzioni calcolabili? Sì Si definisce ricorsivo un algoritmo che viene definito in termini di se stesso. Esempio: funzione fattoriale 0! = 1 n! = n x (n – 1) x… 3 x 2 x 1 Si può riscrivere n! = n x (n – 1)! Definizione ricorsiva
Condizioni generali Si può ricondurre un qualsiasi algoritmo a funzioni ricorsive? NO Condizioni per ricondurre un algoritmo a funzioni ricorsive L’algoritmo deve essere espresso in funzione di se stesso Deve sempre esistere una condizione di terminazione (impedire un loop) L’algoritmo deve convergere, cioè deve avvicinarsi al valore limite della soluzione
Vantaggi e svantaggi della ricorsione Una funzione ricorsiva ha un codice compatto ed elegante Svantaggi Ingente utilizzo di risorse di calcolo Elevata occupazione di memoria (superamento dei limiti dello stack) Limitata efficienza: algoritmi più lenti
Conclusione Se una funzione f è ricorsiva, allora essa è computabile attraverso un algoritmo Alonzo Church (1903-1995)