Risposte:
Ecco la spiegazione più breve:
Un sistema Turing Complete indica un sistema in cui è possibile scrivere un programma che troverà una risposta (sebbene senza garanzie in merito al runtime o alla memoria).
Quindi, se qualcuno dice "la mia novità è Turing Complete" ciò significa in linea di principio (anche se spesso non in pratica), potrebbe essere usato per risolvere qualsiasi problema di calcolo.
Qualche volta è uno scherzo ... un ragazzo ha scritto un simulatore di Turing Machine in vi, quindi è possibile dire che vi è l'unico motore di calcolo mai necessario al mondo.
Ecco la spiegazione più semplice
Alan Turing ha creato una macchina che può prendere un programma, eseguire quel programma e mostrare alcuni risultati. Ma poi ha dovuto creare macchine diverse per programmi diversi. Così ha creato "Universal Turing Machine" che può prendere QUALSIASI programma ed eseguirlo.
I linguaggi di programmazione sono simili a tali macchine (sebbene virtuali). Prendono i programmi e li eseguono. Ora, un linguaggio di programmazione è chiamato "Turing completo", se è in grado di eseguire qualsiasi programma (indipendentemente dalla lingua) che una macchina Turing può eseguire con sufficiente tempo e memoria.
Ad esempio: supponiamo che esista un programma che accetta 10 numeri e li aggiunge. La macchina di Turing può facilmente eseguire questo programma. Ma ora immagina che per qualche motivo il tuo linguaggio di programmazione non possa eseguire la stessa aggiunta. Ciò renderebbe "Turing incompleto" (per così dire). D'altra parte, se è in grado di eseguire qualsiasi programma eseguibile dalla macchina Turing universale, allora è Turing completo.
La maggior parte dei linguaggi di programmazione moderni (ad es. Java, JavaScript, Perl, ecc.) Sono tutti Turing completi perché implementano ciascuno tutte le funzionalità richieste per eseguire programmi come addizione, moltiplicazione, condizione if-else, dichiarazioni di ritorno, modi per memorizzare / recuperare / cancellare dati e così via.
Aggiornamento: puoi saperne di più sul mio post sul blog: "JavaScript è completo" - Spiegato
Da Wikipedia :
La completezza di Turing, che prende il nome da Alan Turing, è significativa in quanto ogni progetto plausibile per un dispositivo di elaborazione finora avanzato può essere emulato da una macchina universale di Turing, un'osservazione che è diventata nota come tesi Church-Turing. Pertanto, una macchina che può fungere da macchina di Turing universale può, in linea di principio, eseguire qualsiasi calcolo di cui sia capace qualsiasi altro computer programmabile. Tuttavia, ciò non ha nulla a che fare con lo sforzo richiesto per scrivere un programma per la macchina, il tempo impiegato dalla macchina per eseguire il calcolo o qualsiasi abilità che la macchina può possedere non correlata al calcolo.
Mentre le macchine veramente complete di Turing sono molto probabilmente fisicamente impossibili, poiché richiedono una memoria illimitata, la completezza di Turing è spesso vagamente attribuita a macchine fisiche o linguaggi di programmazione che sarebbero universali se avessero una memoria illimitata. Tutti i computer moderni sono Turing-completi in questo senso.
Non so come si possa essere più non tecnici di quello se non dicendo "turing complete significa" in grado di rispondere a problemi calcolabili dati abbastanza tempo e spazio "".
Un linguaggio completo di Turing è in grado di eseguire qualsiasi calcolo. La tesi di Church-Turing afferma che qualsiasi calcolo eseguibile può essere eseguito da una macchina di Turing. Una macchina Turing è una macchina con infinita memoria ad accesso casuale e un "programma" finito che determina quando dovrebbe leggere, scrivere e spostarsi attraverso quella memoria, quando dovrebbe terminare con un certo risultato e cosa dovrebbe fare dopo. L'input di una macchina Turing viene messo in memoria prima dell'avvio.
Una macchina di Turing può prendere decisioni basate su ciò che vede nella memoria - La 'lingua' che solo i supporti +
, -
, *
, e /
su interi non è Turing completa perché non può fare una scelta in base al suo ingresso, ma una macchina di Turing può.
Una macchina Turing può funzionare per sempre - Se prendessimo Java, Javascript o Python e rimuovessimo la possibilità di eseguire qualsiasi tipo di loop, GOTO o chiamata di funzione, non sarebbe Turing completo perché non può eseguire un calcolo arbitrario che non finisce mai. Coq è un teorema che non è in grado di esprimere programmi che non terminano, quindi non è Turing completo.
Una macchina Turing può usare una memoria infinita - Un linguaggio che era esattamente come Java ma che terminava una volta che utilizzava più di 4 Gigabyte di memoria non sarebbe completo come Turing, perché una macchina Turing può usare memoria infinita. Questo è il motivo per cui non possiamo effettivamente costruire una macchina Turing, ma Java è ancora un linguaggio completo Turing perché il linguaggio Java non ha restrizioni che gli impediscono di usare la memoria infinita. Questo è uno dei motivi per cui le espressioni regolari non sono complete.
Una macchina Turing ha una memoria ad accesso casuale - Un linguaggio che ti consente solo di lavorare con la memoria push
e le pop
operazioni su uno stack non sarebbero complete. Se ho un "linguaggio" che legge una stringa una volta e posso usare la memoria solo spingendo e saltando da uno stack, può dirmi se ogni (
stringa ha il suo in )
seguito spingendo quando vede (
e saltando quando vede )
. Tuttavia, non può dirmi se ognuno (
ha il suo in )
seguito e ognuno [
ha il suo in ]
seguito (nota che ([)]
soddisfa questi criteri ma ([]]
non lo fa). Una macchina Turing può usare la sua memoria ad accesso casuale per tenere traccia ()
di e[]
È separatamente, ma questa lingua con solo una pila non può.
Una macchina di Turing può simulare qualsiasi altra macchina di Turing - Una macchina di Turing, quando riceve un "programma" appropriato, può prendere un "programma" di un'altra macchina di Turing e simularla su input arbitrario. Se avessi un linguaggio a cui era proibito implementare un interprete Python, Turing non sarebbe completo.
Se la tua lingua ha memoria ad accesso casuale infinita, esecuzione condizionale e qualche forma di esecuzione ripetuta, è probabilmente Turing completo. Esistono sistemi più esotici che possono ancora ottenere tutto ciò che una macchina Turing può, il che rende anche Turing completa:
cyclic tag system
e non universal cyclic tag system
. Quindi - l'articolo non dimostra la completezza del turing SQL. (O ho frainteso qualcosa)
Fondamentalmente, la completezza di Turing è un requisito conciso, una ricorsione illimitata.
Nemmeno delimitato dalla memoria.
Ci ho pensato in modo indipendente, ma ecco alcune discussioni sull'asserzione. La mia definizione di LSP fornisce più contesto.
Le altre risposte qui non definiscono direttamente l'essenza fondamentale della completezza di Turing.
while (p) { /* ... */ }
. "Sto affermando l'equivalenza tra la ricorsione generalizzata e la capacità di eseguire qualsiasi calcolo possibile." La tesi della Chiesa è una questione molto diversa e dovrebbe davvero essere discussa separatamente.
Turing Complete significa che è almeno potente quanto una Turing Machine . Ciò significa che tutto ciò che può essere calcolato da una macchina di Turing può essere calcolato da un sistema di Turing Complete.
Nessuno ha ancora trovato un sistema più potente di una Turing Machine. Quindi, per il momento, dire che un sistema è Turing Complete equivale a dire che il sistema è potente come qualsiasi altro sistema informatico noto (vedi Tesi Church-Turing ).
In parole povere, un sistema completo di Turing può risolvere qualsiasi possibile problema computazionale.
Uno dei requisiti chiave è la dimensione dello scratchpad che non ha limiti e che è possibile riavvolgere per accedere a scritture precedenti sullo scratchpad.
Quindi in pratica nessun sistema è completo di Turing.
Piuttosto alcuni sistemi si avvicinano alla completezza di Turing modellando la memoria illimitata ed eseguendo ogni possibile calcolo che può adattarsi alla memoria del sistema.
Penso che l'importanza del concetto "Turing Complete" risieda nella capacità di identificare una macchina informatica (non necessariamente un "computer" meccanico / elettrico) che può far decostruire i suoi processi in istruzioni "semplici", composte da sempre più semplici istruzioni che una macchina universale potrebbe interpretare ed eseguire.
Consiglio vivamente The Annotated Turing
@Mark penso che quello che stai spiegando sia un mix tra la descrizione di Universal Turing Machine e Turing Complete.
Qualcosa che è Turing Complete, in senso pratico, sarebbe una macchina / processo / calcolo in grado di essere scritto e rappresentato come un programma, da eseguire da una macchina universale (un computer desktop). Anche se non tiene conto del tempo o dello spazio di archiviazione, come menzionato da altri.
Quello che capisco in parole semplici:
Turing completo: un linguaggio / programma di programmazione in grado di eseguire calcoli è Turing completo.
Per esempio :
Puoi aggiungere due numeri usando solo HTML . (Ans è ' No ', devi usare javascript per eseguire l'addizione.) Quindi HTML non è Turing Complete.
Lingue come Java, C ++, Python, Javascript, Solidity for Ethereum ecc. Sono Turing Complete perché puoi fare calcoli come aggiungere due numeri usando queste lingue.
Spero che sia di aiuto.
È completo se può testare e diramare (ha un 'if')
Una macchina di Turing richiede che qualsiasi programma possa eseguire test delle condizioni. Questo è fondamentale.
Considera un piano roll per giocatore. Il pianista può suonare un brano musicale molto complicato, ma non c'è mai alcuna logica condizionale nella musica. È Turing completo.
La logica condizionale è sia la potenza che il pericolo di una macchina che è Turing Complete.
Il piano roll è garantito per arrestarsi ogni volta. Non esiste tale garanzia per una TM. Questo si chiama "problema di arresto".
Come diceva Waylon Flinn :
Turing Complete significa che è almeno potente quanto una Turing Machine.
Credo che questo non sia corretto, un sistema è Turing completo se è esattamente potente quanto la Macchina Turing, cioè ogni calcolo fatto dalla macchina può essere fatto dal sistema, ma anche ogni calcolo fatto dal sistema può essere fatto dalla macchina Turing .
In termini linguistici pratici familiari alla maggior parte dei programmatori, il solito modo di rilevare la completezza di Turing è se il linguaggio consente o consente la simulazione di istruzioni while nidificate senza limiti (al contrario dello stile Pascal per le istruzioni, con limiti superiori fissi).
Un database relazionale può inserire latitudini e longitudini di luoghi e strade e calcolare il percorso più breve tra loro - no. Questo è un problema che mostra che SQL non è Turing completo.
Ma C ++ può farlo e può fare qualsiasi problema. Così è.