Questa non è una risposta generale alla tua domanda, ma dal teorema di programmazione strutturato , tutto ciò che serve è la capacità di fare selezione (ad esempio, if
in C / C ++) e ripetizione (ad esempio, while
in C / C ++). Modifica: come sottolineato da Dave Clarke nei commenti, anche il teorema di programmazione strutturato richiede una sequenza. Inizialmente non l'ho elencato da quando ho dato per scontato che il lettore avrebbe capito che erano necessari anche blocchi di base di altre istruzioni, come quelle a cui si fa riferimento in seguito per leggere e scrivere nell'archivio di memoria, ecc.). È ovviamente meglio essere espliciti; devi essere in grado di fare anche queste cose.
Dal momento che entrambi questi possono essere implementati usando un'istruzione di salto condizionale (ad esempio, JNZ
in x86), questo è anche sufficiente per l'equivalenza di Turing.
Si noti che sono necessarie altre cose, ovvero la possibilità di scrivere un numero illimitato di simboli (ad es. Bit ... 0 o 1) in una sorta di memoria esterna. In tal senso, i computer reali non sono equivalenti a Turing, poiché nessuno di essi ha una quantità infinita di spazio di archiviazione. Il modello di Turing è comunque utile, poiché la quantità di memoria è in genere enorme, e anche se qualsiasi problema che un vero computer può risolvere può essere risolto da un automa deterministico finito, l'utilizzo di quel modello di calcolo non è particolarmente utile (poiché il il numero di stati sarebbe assurdamente enorme).
Nota che questo non è necessariamente in contrasto con la risposta di sepp2k; questo è solo un modo diverso di pensare alla stessa domanda.
MODIFICARE:
Nota anche che non hai davvero bisogno di entrambi if
e while
in C / C ++. Puoi simulare if
usando while
come segue:
bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program
Il seguente codice è sempre equivalente:
bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program
Bene ... la costruzione dovrebbe funzionare ed essere possibile se stai attento, cioè. Si noti inoltre che se si dispone di funzioni ricorsive, alla fine è necessario anche la selezione; poiché le funzioni ricorsive senza selezione non possono realmente implementare casi base, quindi qualsiasi funzione ricorsiva comporterebbe una ricorsione infinita.
MODIFICARE:
Inoltre, riguardo alla tua domanda se la capacità di scrivere un programma che non si ferma è sufficiente per l'equivalenza di Turing, la risposta è no; è necessario, ma non sufficiente. Possiamo risolvere il problema dell'arresto per i programmi scritti in una lingua che non può esprimere programmi che non riescono ad arrestarsi; la risposta è "il programma si ferma" per tutte le istanze. Tuttavia, possiamo definire una lingua in cui l'unica istruzione fa sì che la macchina entri in un ciclo infinito ... tale lingua non è equivalente a Turing.