L'esistenza di algoritmi auto-referenziali non è una caratteristica limitata a un linguaggio di programmazione specifico, come C, ma è possibile in praticamente qualsiasi linguaggio computazionale. I lettori sono invitati a cercare esempi online per esplorare ulteriormente questa idea. La dimostrazione dell'esistenza di algoritmi auto-referenziali si basa su assunzioni di malleabilità, che implicano che una funzione possa riferirsi a se stessa in un contesto computazionale.

Il teorema che segue, noto come Teorema V.57 (Teorema della Diagonale per gli Algoritmi), formalizza questa idea. Supponiamo che M sia un algoritmo che prende un unico input wΣw \in \Sigma^*. Esiste un algoritmo DMD_M con numero di Gödel DM\langle D_M \rangle tale che, per qualsiasi input ww, l'esecuzione di DM(w)D_M(w) produce lo stesso risultato dell'esecuzione di M(DM)M(\langle D_M \rangle). Si noti che l'input ww per DMD_M viene ignorato. La sola ragione per cui è presente l'input ww è che, per convenzione, ogni funzione deve prendere almeno un input.

Per dimostrare questa affermazione, consideriamo le funzioni computabili ff e ff', descritte nel contesto del teorema precedente, che, rispettivamente, producono il numero di Gödel di un algoritmo MwM_w che ignora il suo input e restituisce ww, e l'algoritmo che applica M2M_2 all'output di M1M_1. Per costruire l'algoritmo EME_M, facciamo in modo che esegua M(f(f(w),w))M(f'(f(w), w)), ottenendo quindi lo stesso risultato che si avrebbe eseguendo MM sul numero di Gödel di un algoritmo che ignora il proprio input e calcola N(N)N(\langle N \rangle).

Definiamo l'algoritmo DMD_M come l'algoritmo con numero di Gödel DM\langle D_M \rangle uguale a f(f(EM),EM)f'(f(\langle E_M \rangle), \langle E_M \rangle). L'algoritmo DMD_M agisce eseguendo prima la costruzione di EM\langle E_M \rangle, per poi eseguire EM(EM)E_M(\langle E_M \rangle), che, a sua volta, esegue MM sull'input f(f(EM),EM)f'(f(\langle E_M \rangle), \langle E_M \rangle). Questo processo dimostra il teorema della diagonale, ovvero che un algoritmo auto-referenziale esiste e può essere formalizzato.

Questo tipo di costruzione è di grande importanza nella teoria della computabilità, poiché consente di formulare una nuova prova della non decidibilità del problema di Halt0, senza necessitare della non decidibilità di HaltSelf. Se supponiamo che esista un algoritmo NN che risolve il problema di Halt0, possiamo modificarlo per ottenere un algoritmo NN' che cambia comportamento a seconda che N(w)N(w) accetti o rifiuti. In particolare, se N(w)N(w) rifiuta, NN' si fermerà, mentre se N(w)N(w) accetta, NN' entrerà in un ciclo infinito. Questa contraddizione dimostra che il problema di Halt0 è indecidibile.

Un altro interessante esempio dell'applicazione del teorema della diagonale è il concetto di separazione computabile. Se due insiemi computabili XX e YY sono disgiunti e non separabili computazionalmente, significa che non esiste un insieme decidibile ZZ tale che XZX \subseteq Z e YZ=Y \cap Z = \emptyset. Un esempio pratico di due insiemi non separabili computabilmente sono i numeri di Gödel di algoritmi che rispettivamente accettano o rifiutano una determinata sequenza. La non separabilità computabile implica che nessun algoritmo può decidere se un dato numero di Gödel appartiene a uno dei due insiemi. Questo porta alla conclusione che alcuni insiemi computabili non possono essere separati in modo computabile, dimostrando la complessità e i limiti intrinseci della computazione.

L'idea di separabilità computabile è anche utile per comprendere l'affermazione del teorema di Rice, che stabilisce che non è decidibile se un algoritmo enumera un membro di una proprietà non banale di insiemi computabili enumerabili. In altre parole, non esiste un algoritmo che, dato un numero di Gödel di un algoritmo, possa determinare se l'insieme enumerato da quell'algoritmo possiede una proprietà specifica. Questo risultato ha implicazioni significative nella teoria della programmazione e nell'analisi automatica dei programmi, come nel caso del controllo della correttezza di un programma o della verifica della presenza di virus, rendendo evidenti i limiti teorici nell'automazione di certi processi.

Un altro concetto centrale è l'idea che esistano proprietà non banali di insiemi computabili che sono indecidibili. Ad esempio, la proprietà di appartenere a un sottoinsieme non vuoto di numeri naturali è non banale, poiché non tutti gli insiemi computabili la soddisfano. Secondo il teorema di Rice, dato un insieme PP di insiemi computabili enumerabili, se PP è non banale, non esiste un algoritmo che possa decidere se un dato algoritmo enumera un membro di PP. Questo sottolinea la natura fondamentalmente limitata della computazione in relazione alla caratterizzazione e alla verifica automatica delle proprietà degli algoritmi.

La teoria di Rice implica che esaminare un programma per determinare la sua funzionalità o per verificare le sue proprietà generali, come l'assenza di errori, è fondamentalmente impossibile in un contesto generale. La mancanza di un procedimento algoritmico che può analizzare un programma e determinare automaticamente certe sue caratteristiche è una delle sfide principali nella ricerca di tecniche di verifica formale dei programmi.

La rappresentabilità e le funzioni ricorsive: un'analisi approfondita

Nel contesto della logica matematica, in particolare della teoria della computabilità e della teoria dei modelli, il concetto di rappresentabilità assume un'importanza cruciale per comprendere le relazioni tra le funzioni e i sistemi formali. Una funzione è rappresentabile se esiste una formula che descrive il suo comportamento in modo tale che essa possa essere verificata all'interno di un sistema logico, come il sistema Peano Arithmetics (PA), utilizzando tecniche di codifica di sequenze di Gödel.

Un esempio significativo riguarda la concatenazione di sequenze. Se consideriamo la funzione di concatenazione di due sequenze finite, ad esempio ⌢ ⟪n1, ..., nk⟫ e ⌢ ⟪m1, ..., mℓ⟫, possiamo definire una nuova sequenza combinando gli elementi delle due originali. La concatenazione può essere formalizzata come ⟪n1, ..., nk, m1, ..., mℓ⟫. La rappresentabilità di questa funzione può essere dimostrata utilizzando le tecniche di codifica delle sequenze di Gödel, ma senza fare uso del teorema VII.20. In altre parole, esiste una formula che permette di ottenere la sequenza concatenata a partire da due sequenze date, utilizzando la logica aritmetica di base.

Le funzioni ricorsive primitive giocano un ruolo centrale nella rappresentabilità delle funzioni aritmetiche. Se una funzione k-aria g è rappresentabile, e un'altra funzione h di arità k+2 è anch'essa rappresentabile, allora è possibile definire una funzione f di arità k+1 tramite ricorsione primaria. La definizione di f può essere espressa come segue:

  1. f(n,0)=g(n)f(\overrightarrow{n}, 0) = g(\overrightarrow{n})

  2. f(n,m+1)=h(n,m,f(n,m))f(\overrightarrow{n}, m+1) = h(\overrightarrow{n}, m, f(\overrightarrow{n}, m))

Questa costruzione mostra come le funzioni possono essere collegate tra loro per generare funzioni più complesse, mantenendo la proprietà di essere rappresentabili, e l'argomento di rappresentabilità è cruciale per comprendere la generazione di funzioni attraverso operazioni di ricorsione primitiva.

Il concetto di "semi-rappresentazione" emerge quando si considera una relazione k-aria S. Un sistema formale T semirepresenta S se esiste una formula AS(x1,...,xk)A_S(x_1, ..., x_k) tale che per ogni tupla di numeri naturali n1,...,nkn_1, ..., n_k, la relazione tra S e ASA_S è verificata nel seguente modo:

  1. Se S(n1,...,nk)S(n_1, ..., n_k) è vero, allora TAS(n1,...,nk)T \vdash A_S(n_1, ..., n_k).

  2. Se S(n1,...,nk)S(n_1, ..., n_k) è falso, allora TAS(n1,...,nk)T \nvdash A_S(n_1, ..., n_k).

In altre parole, la relazione S è semidecidibile se esiste una formula che rappresenta esattamente questa relazione all'interno del sistema T. Questo risultato è importante per capire come una teoria formale possa descrivere proprietà computabili di insiemi numerici, e come questi insiemi possano essere semidecisi tramite la codifica e la rappresentazione formale.

Per quanto riguarda la decidibilità e la separabilità computabile, si può dimostrare che se una teoria T è consistente e assiomatizzabile, allora le teorie T={A:AT}T = \{ A : A \in T \} e {A:¬AT}\{ A : \neg A \in T \} sono separabili computabilmente, a meno che non ci siano contraddizioni insorte da autointerferenze. Un esercizio fondamentale in questo contesto riguarda la costruzione di una formula che dimostra che esistono teorie che non possono essere separabili computabilmente, il che implica che l'assunzione di consistenza non può essere semplificata sostituendo la condizione di ω-consistenza.

Un altro tema importante nella teoria della rappresentabilità è l'analisi delle formule autoreferenti. Un esempio è la formula E, che può essere definita come "sono refutabile da PA". La sua verità o falsità dipende dalla capacità di PA di dimostrarla o confutarla. Le teorie autoreferenti, come quelle che si manifestano in teoremi come il Teorema di Löb, mettono in luce le complicazioni e le sfide nel trattare formule che si riferiscono a se stesse, specialmente quando si cerca di determinarne la verità nel modello standard degli interi.

Infine, un concetto cruciale da comprendere è la relazione tra provabilità e indipendenza dalle teorie. Ad esempio, una formula G, che afferma "PA non può confutare la mia negazione", porta a una situazione in cui la verità di G dipende dalla capacità di PA di confutare la negazione di G. La soluzione a questa problematica spesso si trova nell'uso del Teorema di Löb, che fornisce gli strumenti necessari per trattare tali formulazioni autoreferenti e determinare se una determinata formula sia indipendente o meno dal sistema PA.

La comprensione della rappresentabilità e dei concetti ad essa correlati è essenziale per navigare nel campo della logica formale, della computabilità e della teoria dei modelli. Senza questa comprensione, è difficile affrontare questioni più avanzate come l'indipendenza di una formula, la semidecidibilità e la separabilità computabile, che sono alla base di molte discussioni teoriche nel campo della matematica logica e della filosofia della matematica.