L'ispirazione per questa domanda è la seguente (vaga) domanda: quali sono il linguaggio di programmazione / le basi logiche per avere un'intelligenza artificiale che potrebbe ragionare sul proprio codice sorgente e modificarlo?
Questo non è affatto rigoroso, quindi ecco il mio tentativo di estrarre una domanda concreta da esso. Ci sono due cose che mi interessano:
(A) Un linguaggio di programmazione P che può rappresentare e manipolare i propri programmi come un tipo di dati Programma (ad es. Come AST). (Se lo si desidera, un oggetto di tipo Programma può essere convertito in una stringa, che è il testo di un programma valido in quella lingua. Questo sarebbe l'opposto di quello che fa un compilatore.)
(B) Un metodo per ragionare su ciò che fa un programma in lingua P. Ecco due livelli a cui sto pensando:
- Un altro linguaggio Q (con capacità di dimostrazione del teorema) che modella ciò che fa un programma P. Dovrebbe essere in grado di esprimere e provare affermazioni come "il risultato dell'esecuzione del Programma p è foo".
- Un modo di ragionare su ciò che un programma p: Programma fa nella stessa lingua P. (Quindi stiamo prendendo P = Q sopra.)
In che misura è stato implementato qualcosa di simile o quali sono i progressi in questa direzione? Quali sono gli ostacoli pratici? Alla luce dell'intenzione originale della domanda, qual è il modo migliore per formalizzare il problema?
*
Come mostrano le risposte (grazie!), Sia (A) che (B1) possono essere fatti separatamente, anche se sembra che farli insieme sia più una domanda di ricerca.
Ecco alcuni dei miei primi pensieri sulla domanda (avvertimento: piuttosto vago). Vedi anche i miei commenti sulla risposta di Martin Berger.
Sono interessato al linguaggio di programmazione che modella lo stesso linguaggio di programmazione, piuttosto che un linguaggio più semplice (quindi P = Q sopra). Questa sarebbe una "prova di concetto" di un programma in grado di "ragionare sul proprio codice sorgente". I linguaggi di programmazione tipicamente dipendenti possono fornire garanzie sugli output delle sue funzioni, ma questo non conta come "ragionamento sul proprio codice sorgente" non più di un "Hello world!" conta come un quine in una lingua che stampa automaticamente una stringa nuda --- ci deve essere una sorta di citazione / autoreferenziazione. L'analogo qui sta avendo un tipo di dati che rappresenta il Programma.
Sembra un progetto piuttosto grande: più semplice è la lingua, più difficile è esprimere tutto al suo interno; più complicata è la lingua, maggiore è il lavoro da fare per modellare la lingua.
Nello spirito del Teorema della ricorsione, un programma può quindi "ottenere" il proprio codice sorgente e modificarlo (ovvero generare una versione modificata di se stesso). (B2) ci dice quindi che il programma dovrebbe essere in grado di esprimere una garanzia sul programma modificato (questo dovrebbe essere in grado di ricorrere, vale a dire, dovrebbe essere in grado di esprimere qualcosa su tutte le future modifiche-?).