Il secondo della lista di ventitré problemi matematici elencati da Hilbert nel 1900, che avrebbero dovuto, come in effetti è stato, impegnare i matematici del XX secolo, è l’Entscheidungsproblem. Dato un sistema formale sufficientemente espressivo da contenere l’aritmetica, per esempio la logica del prim’ordine, e data una formula arbitrariamente complessa, espressa nei termini di tale logica, Hilbert domandava l’esistenza di una “procedura effettiva”, un algoritmo, in grado di decidere se la suddetta formula fosse o meno dimostrabile a partire dagli assiomi della logica. Risposta negativa al quesito venne da Church e Turing che, l’uno indipendentemente dall’altro, nel 1936, pubblicarono i lavori che stabilirono i limiti, universalmente accettati, della calcolabilità.
Fra gli anni ‘30 e ‘40 del secolo scorso vide la luce la maggior parte delle caratterizzazioni formali di ciò che è calcolabile: quella di Turing, basata sul modello di macchina omonimo, quella di Church, basata sul λ-calcolo, quella di Post, basata sui sistemi combinatori, e altri ancora. La semplicità delle assunzioni di base su cui tali formalismi si fondano, unitamente alla semplicità delle operazioni elementari che essi mettono a disposizione, condussero, i vari autori, a formulare la congettura secondo cui la loro nozione di calcolabilità fosse la più generale possibile: non esistono procedimenti di calcolo inesprimibili nei loro formalismi. Tale congettura, nota oggi col nome di tesi di Church-Turing, peraltro indimostrabile, data l’impossibilità di dimostrare l’equivalenza di tutti i possibili modelli di calcolo, è comunque ritenuta oggi universalmente valida.
La Macchina di Turing, in particolare, costituisce il modello di calcolo di riferimento sia nell’ambito della calcolabilità che in quello della complessità computazionale (che si occupa, invece, di studiare le risorse, in termini di tempo e spazio, necessarie per eseguire un algoritmo). È opportuno notare, come tra l’altro sottolineato da Vardi in [1], che quando il logico inglese Alan Turing introdusse tale modello di calcolo egli non si poneva l’obiettivo di formalizzare la nozione di algoritmo, problema tra l’altro ancora aperto, ma di formalizzare il concetto di calcolo. Nella fattispecie, l’intento di Turing era esprimere la capacità di operare calcoli, tipicamente umana, attraverso i passi elementari di un dispositivo di calcolo meccanico. Lo scopo, prefissato in un periodo in cui i calcolatori elettronici non avevano ancora fatto la propria comparsa, era stabilire l’esistenza di un algoritmo capace di dimostrare teoremi nell’ambito dell’aritmetica (Entscheidungsproblem). Come vedremo, tale problema, che è riconducibile al problema di stabilire l’esistenza di un algoritmo capace di determinare se una Macchina di Turing termina o meno la propria computazione su di un dato input, è indecidibile. In altre parole, un algoritmo siffatto è irrealizzabile.
La Macchina di Turing
Nella sua versione classica, apparsa per la prima volta nel 1936 in [2], una Macchina di Turing (MT) si configura come un dispositivo dotato di testina operante su di un nastro potenzialmente infinito. Tale nastro è diviso in celle ciascuna contenente un simbolo appartenente a un alfabeto finito ampliato con il carattere speciale blank, che rappresenta la situazione di cella vuota. La testina, con cui la macchina opera sul nastro, può scorrere su di esso in entrambe le direzioni e, su ogni cella, può leggere o scrivere simboli appartenenti all’alfabeto. In un dato istante, la macchina si trova in uno stato, appartenente a un insieme finito di stati, caratterizzato dalla configurazione corrente di simboli scritti sul nastro e dalla posizione corrente della testina. Il meccanismo che fa evolvere la computazione della macchina è una funzione di transizione che, dato uno stato, e dato il simbolo sulla cella del nastro su cui è correntemente posizionata la testina, determina la transizione in un nuovo stato, congiuntamente alla scrittura di un nuovo simbolo sulla cella e, eventualmente, allo spostamento della testina di una cella a destra o a sinistra. La figura sottostante, tratta da [3], illustra un passo computazionale di una Macchina di Turing la cui funzione di transizione, a partire dallo stato q3 e dalla lettura del simbolo b nella cella puntata dalla testina, determina la transizione nello stato q4, la scrittura del simbolo a nella cella correntemente puntata e lo spostamento della testina a destra. Come evidenziato dallo stesso Turing, tale modello di calcolo è in grado di rappresentare il ragionamento tipicamente umano seguito per fare calcoli: risultati parziali vengono “annotati”, quindi, grazie al carattere speciale blank, cancellati per fare posto al risultato finale.
Il modello di macchina presentato, poiché estremamente elementare, non è agevole per la risoluzione di problemi anche non complessi (la loro risoluzione risulta essere appunto “macchinosa”). Difatti, ne esistono numerose varianti: per esempio la variante multi-nastro, che utilizza più nastri cui possono accedere altrettante testine; quella non deterministica, in cui la transizione ad uno stato successivo non è più univocamente determinata; eccetera. Tali riformulazioni sono rilevanti in pratica, ma in teoria, rispetto alla formulazione originaria, sono equivalenti. Per gli scopi del presente articolo, una trattazione esaustiva di tutte le possibili varianti è inessenziale. È opportuno però rimarcare che esistono anche riduzioni di MT a versioni semplificate, senza che si perda nulla in potere espressivo, e che tali semplificazioni permettono di definire la cosiddetta Macchina di Turing Universale (MTU), che è in grado di simulare qualunque altra MT in input. Infatti è possibile fornire una cosiddetta descrizione linearizzata di una MT, mediante una stringa sull’alfabeto composto dei soli simboli 1 e blank, ed essa permette di definire una nuova macchina che, ricevendo in input tale descrizione, è in grado di simulare il comportamento della MT descritta. In altre parole, il concetto di MTU è riconducibile al concetto di calcolatore in grado di eseguire algoritmi opportunamente codificati. Una MT ha incorporato il programma da eseguire; la MTU, invece, è programmabile. Non a caso, la MTU condivide, con l’architettura di Von Neumann, su cui i calcolatori moderni si basano, il concetto di dispositivo operante su memoria (il nastro) su cui risiedono i programmi.
Il problema della fermata
Al fine di mostrare i limiti della calcolabilità, si considera il seguente problema decisionale noto come problema della fermata — nella teoria della computabilità un problema è decisionale se la sua possibile risoluzione prevede una risposta del tipo sì/no. Informalmente, il problema della fermata è così formulato: “data una Macchina di Turing M e dato un input x, la computazione di M su x, M(x), termina in un numero finito di passi?”. La formalizzazione dell’enunciato, insieme alla sua dimostrazione, si deve sempre a Turing [2]. La dimostrazione, di seguito solo schematizzata, si avvale della su menzionata rappresentazione di una MT come sequenza di simboli di un alfabeto, in ragione della quale è lecito usare la sequenza corrispondente a una MT come dato in input a un’altra MT o persino a se stessa (per calcolare cioè MT(cMT)).
Si dimostra per assurdo. Supponiamo che il problema della fermata sia decidibile e cioè che esista una MT H che, ricevuto in input una codifica cM di M, restituisce 1 se la computazione di M termina sull’input x, 0 altrimenti. Se esiste una tale macchina, allora è possibile definire un’altra MT H’ che, ricevuto in input cM, restituisce 1 se la computazione di M termina sull’input cM, 0 altrimenti. Se esiste H’, allora è possibile definire un’altra MT H’’ che, ricevuto in input cM, restituisce 0 se la computazione di M non termina sull’input cM; altrimenti, se M termina la propria computazione, H’’ non termina. Se fornissimo in input alla macchina H’’ la sua propria codifica, cH’’, otterremmo in ogni caso una contraddizione. Infatti, H’’(cH’’) si arresta se e solo se la computazione che essa effettua non termina, e viceversa. Da ciò deriva che H’’ non esiste, da cui deriva immediatamente che neanche H può esistere e quindi che il problema è indecidibile. Si noti che il problema della fermata, pur essendo non decidibile, è semi-decidibile, cioè è possibile rispondere affermativamente circa la terminazione di una MT, ma nulla si può dire sulla sua non terminazione.
Conclusioni. L’indecidibilità del problema della fermata ha un notevole impatto applicativo. Per la tesi di Church-Turing, non essendo il problema risolubile con una Macchina di Turing, esso non può essere risolto con alcun metodo algoritmico. Di conseguenza, non è possibile stabilire, in generale, se un dato programma, scritto in un qualunque linguaggio di programmazione, termina o meno su di un dato input. Il problema della fermata è stato solo il primo di una serie di problemi indecidibili, molti dei quali appartenenti alla teoria della programmazione; per esempio, non è possibile decidere se una data istruzione verrà o meno eseguita almeno una volta nel corpo di un programma, se un dato sottoprogramma verrà o meno invocato in un determinato punto, e così via. Ancor più in generale, non è possibile, matematicamente, essere certi che un dato programma sia o meno privo di difetti, o che esso svolga la funzione per cui è stato creato. Quanto dimostrato da Turing estende il Primo Teorema di Incompletezza di Gödel [4] che già aveva determinato l’impossibilità del programma di Hilbert. Gödel dimostrava che in ogni sistema formale sufficientemente espressivo da contenere l’aritmetica, è possibile costruire formule sintatticamente corrette che non possono però essere dimostrate né confutate all’interno del sistema stesso. Quanto dimostrato da Turing, invece, comporta che non esiste alcun metodo generale capace di affermare se una data formula sia o meno dimostrabile. Con in mente le teorie della relatività ristretta e generale di Einstein, e il principio di indeterminazione di Heisenberg, i risultati teorici raggiunti da Turing, Church e altri, insieme a quelli conseguiti da Gödel pochi anni prima nell’ambito della logica, ricalcano lo zeitgeist della prima parte del Novecento in cui molte delle precedenti convinzioni degli scienziati furono stravolte.
Riferimenti
- Y. Vardi: “What is an Algorithm?”. Communications of the ACM, 55(3), p. 5, 2012.
- M. Turing: “On Computable Numbers, with an Application to the Entscheidungsproblem”. Proceedings of the London Mathematical Society, (2)42, pp. 230-265, 1936.
- Ausiello, F. D’Amore, G. Gambosi: “Linguaggi, Modelli, Complessità”. Franco Angeli, 2011.
- Gödel: “Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I”. Monatshefte für Mathematik und Physik, 38, pp. 173-198, 1931.
Il presente articolo è basato principalmente sul capitolo 5 di [3].