TEORIA DELLA COMPUTABILITÀ
Partiamo dalla TESI DI CHURCH-TURING
Se un problema è umanamente calcolabile, allora esisterà una macchina di Turing in grado di risolverlo (cioè di calcolarlo)
Da questo si deduce che se la MdT non può risolvere un dato problema quel problema e irresolubile
Ma cosa succede se una MdT non e in grado di risolvere un problema? essa stessa si blocca in un loop e non produce output di conseguenza si può dare una definizione di PROBLEMA RISOLUBILE come segue
PROBLEMA RISOLUBILE
un problema la cui soluzione può essere espressa da una MdT (o formalismo equivalente)
Ma la MdT computa funzioni non problemi, occorre quindi definire formalmente il concetto di funzione caratteristica di un problema per colmare il divario
Dato un problema e detti
- l’insieme dei suoi dati di ingresso
- l’insieme delle risposte corrette
si dice funzione caratteristica del problema
Con questo formalismo definito si può traslare la il problema della ricerca dei problemi risolubili su quello delle funzioni computabili e, riprendendo la tesi di Church-Turing:
FUNZIONE COMPUTABILE
Una funzione è computabile se esiste una MdT che
- data sul nastro una rappresentazione di dopo un numero finito di passi
- produce sul nastro una rappresentazione di
Date le definizioni viene spontaneo chiedersi se tutte le funzioni siano computabili o se esistano invece funzioni definibili ma non computabili per far cio occorre confrontare i due insiemi
Si fa presto dato che l’insieme delle funzioni dai naturali ai naturali
non e numerabile a differenza di quello delle funzioni computabili, dato che la cardinalità dei simboli di ingresso, di uscita e di stati di una MdT è finito
Di conseguenza la gran parte delle funzioni definibili non e computabile, tuttavia questo non risulta essere un problema dato che le funzioni che sono interessanti per una macchina che deve riconoscere un linguaggio sono quelle definite su un insieme finito di simboli, tuttavia neanche questo sottoinsieme e ‘fortunato’
PROBLEMA DELL’ HALT DELLA MACCHINA DI TURING
Stabilire se una data macchina di Turing , con un generico ingresso , si ferma oppure no.
Tale problema, perfettamente definibile e tuttavia non computabile
Ma allora come deve essere un linguaggio per far si che la MdT possa computarlo?
Poiché un linguaggio è un insieme di frasi, ci interessa indagare in generale il problema della generabilità vs. decidibilità di un insieme.
INSIEME NUMERABILE
Insieme per cui esiste una funzione (mappa l’insieme dei naturali in elementi dell’insieme)
Tuttavia non e sufficiente, la funzione deve essere computabile
INSIEME RICORSIVAMENTE NUMERABILE (SEMI-DECIDIBILE)
Un insieme si dice ricorsivamente numerabile se puo essere computata da una macchina di touring.
In questo caso l’automa esecutore e in grado di rispondere affermativamente quando una determinata frase appartiene al linguaggio, ma non e in grado di stabilire se una frase non vi appartiene (esempio dei numeri pari e dispari)
INSIEME DECIDIBILE
Un insieme e’ detto decidibile se sia che il complemento sono semidecidibili.
Questo per un automa significa essere in grado di elencare sia gli elementi che fanno parte sia quelli che non fanno parte di un determinato linguaggio
E proprio qui che sta la chiave del problema, dato che i linguaggi di programmazione sono costruiti a partire da un alfabeto finito ma sono caratterizzati dall’insieme (infinito) delle frasi lecite Non basta che tale insieme possa essere generato, è indispensabile poter decidere se una frase è giusta o sbagliata senza entrare in ciclo infinito
In questo modo un compilatore e in grado di arrestarsi e segnalare errore se una frase non appartiene al linguaggio