Ogni algoritmo automodificante può essere modellato da un algoritmo non automodificante?


12

Se abbiamo qualche programma informatico arbitrario che può modificare le sue istruzioni, è possibile simulare quel programma con un programma che non può modificare le sue istruzioni?


Modificare:

Sono nuovo di StackExchange, quindi non sono sicuro di poter fare una NUOVA domanda qui, ma qui va: Ok, quindi la prova che è possibile è in realtà molto semplice, come avete dimostrato. Ora, mi chiedo: ci sono problemi per i quali è più efficiente (e in che misura) utilizzare l'algoritmo di automodificazione più efficiente per risolvere il problema, rispetto all'algoritmo di non automodificazione più efficiente equivalente in input-output?

Risposte:


29

Si è possibile. Puoi simulare il programma usando un interprete per la lingua in cui è scritto. Ora, il programma (l'interprete) è fisso e la cosa che era un programma che si auto-modifica ora è i dati dell'interprete.

In particolare, potresti perfettamente avere una macchina Turing universale che ha permesso alla TM che simula di modificare la propria descrizione. (Voglio dire la descrizione della macchina simulata; non l'UTM.)


11
Non hai nemmeno bisogno dell'ipotetico interprete. Una CPU che esegue il tuo algoritmo di auto-modifica è essa stessa una macchina che esegue un algoritmo fisso (che determina come esegue le istruzioni)
Alexander - Reinstate Monica

1
@AlexanderMomchliov esistono CPU in grado di modificare al volo parti del loro set di istruzioni (ma sì, l'idea è la stessa - la parte programmabile è dati, il microcontrollore che lo esegue è l'interprete - anche se punta a un microcontrollore all'interno di una cella FPGA potrebbe essere difficile)
John Dvorak il

per rispondere a: "potresti perfettamente avere una macchina Turing universale che ha permesso alla TM che simula di modificare la propria descrizione". Sto pensando: questo non pone la domanda? perché ora devi ancora dimostrare che la TM che viene simulata può effettivamente modellare l'algoritmo di automodificazione, giusto? Potrebbe ancora essere il caso che esista un programma di auto-modifica che NON è esso stesso una macchina di Turing, quindi non possiamo usare la completezza di Turing per dimostrare che può essere simulato, poiché la completezza di Turing si riferisce alla simulazione di TM e all'auto-modifica algo non è una TM.
user56834

@ Programmer2134 Non pone affatto la domanda. Qualunque CPU pensi di eseguire il tuo programma di auto-modifica, posso simulare quella CPU su una macchina Turing. Per spiegarlo in modo diverso, il programma iniziale è una sequenza finita di istruzioni, alcune delle quali accadono modificano il programma stesso. Ciascuna delle istruzioni può essere simulata dall'UTM, ciascuna delle modifiche può essere simulata e ciascuna delle istruzioni modificate può essere simulata. Non c'è nulla, in nessuna fase di questo processo, che vada oltre il potere delle macchine Turing.
David Richerby,

10

Qualsiasi modello computazionale completo di Turing che non ha codice di modifica (o "codice") serve come prova di tale affermazione. Non so che uno qualsiasi dei modelli standard (TM, RAM, ...) fanno avere la modifica del codice, in modo che non c'è bisogno di guardare troppo lontano.

Per ottenere un programma in qualunque lingua tu abbia in mente, compila da un tale modello (e assicurati che il compilatore non introduca la modifica del codice).


Questo è, naturalmente, un argomento esistenziale: non è un programma equivalente. Ma sappiamo anche che ci sono compilatori ricorsivi (cioè calcolabili) tra due lingue complete di Turing, quindi è così che ottieni un programma del modulo (leggi: nella lingua) che desideri.


4

Per aggiungere alla risposta di David Richerby :

Se fosse vero che nessun algoritmo auto-modificante non può essere modellato da algoritmi non auto-modificanti, quegli algoritmi dovrebbero essere eseguiti su qualcosa che si auto-modifica. Dovrebbero essere le tartarughe fino in fondo.

Come ho detto nel mio commento, un algoritmo auto-modificante può essere eseguito su un processore che si attiene alle regole di un algoritmo statico (codificato nel suo design) che "dice" come eseguire le istruzioni della macchina.


1
Penso che potrebbe essere un'interessante linea di demarcazione. Penso che si possa sostenere che la "vita" è un algortihm che si auto-modifica che non può essere modellato da algoritmi non auto-modificanti, ma che, di nuovo, la "vita" non è in genere considerata un algoritmo.
Cort Ammon,

2
@CortAmmon: Se consideriamo la "vita" come un algoritmo, qual è il suo input e il suo output? Come si può dimostrare che qualsiasi algoritmo equivalente (ovvero qualsiasi algoritmo che produce lo stesso output quando viene fornito lo stesso input) deve essere auto-modificante?
Ruakh,

@ruakh Se dovessi sostenere che la vita fosse un algoritmo auto-modificante, gli input sarebbero se stessi e i suoi output sarebbero se stessi. Provare che non può essere ridotto a un algoritmo non auto-modificante sarebbe più complicato, ma penso che sia un'ipotesi popolare. Dopotutto, quante persone vogliono credere di poter essere ridotte a un algoritmo che può essere eseguito su un computer?
Cort Ammon,

1
@CortAmmon: non posso essere ridotto a un algoritmo che gira su un computer perché quell'algoritmo non è più "me"; Sono più dei miei input e output. Ma se partiamo dal presupposto che io sono solo un algoritmo, allora puntare su "che può essere eseguito su un computer" in realtà non cambia nulla. Ri: "Se dovessi sostenere che la vita fosse un algoritmo auto-modificante, gli input sarebbero se stessi, e i suoi output sarebbero se stessi": In tal caso, penso che verrai ben al di fuori di CS, e pericolosamente vicino al crackpottery.
Ruakh

1
@CortAmmon Un programma che si emette dato se stesso come input è giusto cat. (Nessun gioco di
parole
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.