Cos'è Turing Complete?


Risposte:


325

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.


18
Per ulteriori letture, vedere The Annotated Turing. Molto accessibile. amazon.com/Annotated-Turing-Through-Historic-Computability/dp/…
i_am_jorf

43
"spesso non in pratica" non è corretto. In pratica, nessun sistema è mai completo di Turing, poiché nessun sistema realizzabile ha un nastro infinito. Ciò che intendiamo veramente è che alcuni sistemi hanno la capacità di approssimare la completezza di Turing fino ai limiti della loro memoria disponibile.
Shelby Moore III,

22
Ma Vi è l'unico motore di calcolo mai necessario al mondo ... ;-)
Joe Edgar

4
Anche Emacs è un tornio? XD
alem0lars,

6
Qualcuno ha recentemente dimostrato che anche PowerPoint è Turing Complete.
Tagc,

193

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


5
L'idea che ci sarebbe anche un termine per questo tipo di macchina ha molto più senso quando ricordo che Turing e altri primi scienziati informatici avrebbero costruito una macchina specifica ogni volta che volevano risolvere un problema specifico. Siamo abituati a una macchina che può essere riprogrammata per sempre. Grazie per il contesto, Raja.
Jacob Ford,

Come JavaScript può essere Turing completo? Manca il file system, l'API multithreading corretta. Ha tonnellate di limitazioni, principalmente a causa della sua natura sandbox di sicurezza del browser. Difficilmente può essere chiamato "un linguaggio di programmazione". Vedi quante varianti di astrazione di scripting esistono (reagisci, dattiloscritto ... lo chiami), tutto ciò per compensare ciò che JS non ha. (asm.js dovrebbe essere menzionato qui). Java, Python o C ++ sono veri esempi "Turing Complete". Ma js? Io non la penso così.
Michele IV,

2
@MichaelIV Il touring machine non aveva neanche un file system / thread. JS è assolutamente in tournée completo.
Bax,

@MichaelIV Per aggiungere alla risposta di Bax, si potrebbe considerare un computer moderno costituito da diverse macchine Turing che lavorano insieme per consentire tutte quelle belle cose che menzioni. Ad esempio, la CPU produce "nastro" per la lettura della GPU in modo che possa scrivere "nastro" per il monitor in modo che il monitor possa scrivere "nastro" per l'utente. Allo stesso modo, la CPU potrebbe produrre "nastro" per i dischi rigidi, schede NIC, schede audio, ecc.

86

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 "".


4
In questo contesto, che cos'è un "dispositivo di elaborazione"?
dopatraman,

30
Come con la maggior parte degli articoli di Wikipedia, sebbene questa citazione sia tecnicamente corretta, non fornisce alcun valore a una persona che non ha conoscenza sull'argomento e sta cercando di capirlo. Essere in grado di spiegare correttamente le cose è una scienza a sé stante :)
Lacho Tomov,

76

Definizione informale

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.

Cose che possono rendere una lingua NON Turing completa

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 pushe le popoperazioni 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.

Esempi di lingue complete di Turing

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:

  • Calcolo lambda non tipizzato
  • Il gioco della vita di Conway
  • Modelli C ++
  • Prolog

11
SQL è decisamente completo. Ha funzionalità di scripting che consentono qualsiasi calcolo.
nzifnab,

53
No, stai confondendo SQL con estensioni come T-SQL / PL-SQL. ANSI SQL non è completo. Ma TSQL / PLSQL - lo è.
Agnius Vasiliauskas,

15
A quanto pare SQL è Turing-completo: stackoverflow.com/questions/900055/...
Newtang

2
Secondo la completezza di Turing - il sistema è Turing completo se può essere utilizzato per simulare qualsiasi macchina Turing a nastro singolo. Ma nell'esempio sopra, come ho capito, gli sviluppatori hanno costruito particolari cyclic tag systeme non universal cyclic tag system. Quindi - l'articolo non dimostra la completezza del turing SQL. (O ho frainteso qualcosa)
Agnius Vasiliauskas il

2
Non esiste un'implementazione realizzabile di un linguaggio completo di Turing, perché non ci sono nastri infiniti. Ciò che intendiamo veramente è che alcune lingue hanno la capacità di approssimare la completezza di Turing fino ai limiti della memoria disponibile della macchina host.
Shelby Moore III,

17

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.


Gli automi a stati finiti possono avere una ricorsione illimitata. Caso in questione: a*.

3
Gli FSM Rhhyid hanno una memoria limitata , il numero finito di stati, ma la ricorsione illimitata senza ottimizzazione della coda deve avere memoria illimitata. Non ho limitato la mia definizione al sottoinsieme di ricorsione illimitata solo con l'ottimizzazione della coda. Rimuovi gentilmente il tuo voto negativo.
Shelby Moore III,

hai mantenuto confusa la definizione di ricorsione illimitata. Intendi "ricorsione" nel senso di "ricorsione primitiva" e "illimitato" rendendolo "parziale" (o "generale", o "mu-")? Allora potresti avere ragione. Ma la tua attuale formulazione è troppo vicina alle affermazioni criticate in "On Folk Theorems" di David Harel. È importante essere rigorosi in matematica e, lasciando fuori definizioni precise, lo stai ignorando. A proposito: gli FSM possono essere generalizzati per modellare l'interazione; ciò che li distingue dalle TM è che anche l'ambiente di quest'ultimo è modellato (come il nastro).

L'enumerazione di remoide è l'antitesi della precisione, ad esempio enumera la massima precisione delle frazioni di un pollice. Ricorsione illimitata significa ogni possibile forma di ricorsione, impossibile senza un nastro infinito. La ricorsione completamente generalizzata (non solo generale all'interno del modello) è sempre Turing completa. Sto affermando l'equivalenza tra la ricorsione generalizzata e la capacità di eseguire qualsiasi calcolo possibile. Questa è un'importante equivalenza da notare.
Shelby Moore III,

"Ricorsione illimitata significa ogni possibile forma di ricorsione" Questa è la tua lettura. Per la maggior parte degli utenti SO, "ricorsione illimitata" significa 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.

13

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 ).


3
Si noti che tutto ciò non tiene conto del tempo di attesa. Dice solo "si può fare".
Thorbjørn Ravn Andersen,

@ ThorbjørnRavnAndersen in realtà, ignora del tutto la calcolabilità fisica. Non solo potrebbe richiedere più tempo dell'età dell'universo, ma potrebbe anche utilizzare più memoria di quella che può essere costruita con tutti i fermioni e bosoni nell'universo.
Waylon Flinn,

Probabilmente, non c'è limite alla quantità di bosoni e fermioni nell'universo. Non sappiamo, e probabilmente non lo sapremo mai, è la dimensione. Ogni volta che leggi il numero di X nell''universo ', le persone parlano in realtà dell'universo osservabile . Sebbene interessante, non è un limite fisico reale.
Stijn de Witt,

9

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.


2

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.


2

Quello che capisco in parole semplici:

Turing completo: un linguaggio / programma di programmazione in grado di eseguire calcoli è Turing completo.

Per esempio :

  1. Puoi aggiungere due numeri usando solo HTML . (Ans è ' No ', devi usare javascript per eseguire l'addizione.) Quindi HTML non è Turing Complete.

  2. 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.


0

È completo se può testare e diramare (ha un 'if')


1
Per una domanda così vecchia, varrebbe la pena verificare se altri hanno già fornito contributi simili o più sostanziali
alan ocallaghan,

Non sono sicuro della correttezza della risposta. Ma questa è una spiegazione davvero semplice che non avevo mai visto prima. Cosa divertente: molto tempo fa (dopo aver scritto il mio primo pezzo di codice) ho anche usato la stessa spiegazione per definire il processore più semplice possibile.
Victor Yarema,

È un eccellente primo tentativo di una definizione operativa incisiva, concisa e accurata. Tuttavia, la filiale deve consentire il looping, e non è vero che la macchina deve anche consentire chiamate di subroutine (es: ricorsione)? Esiste un programma appiattito di loop nidificati per ogni programma con ricorsione?
user3673

0

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".


-1

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 .


1
Penso che tu stia assumendo che la tesi di Church-Turing sia vera per arrivare a questa conclusione. Deve ancora essere provato. La proprietà che stai descrivendo si chiama "Turing equivalente".
Waylon Flinn,

1
@WaylonFlinn No, ha ragione. "Completezza" significa sia che è almeno forte come una cosa, ma anche non più forte. Confronta con "NP-Complete".
Devin Jeanpierre,

3
@DevinJeanpierre Non voglio iniziare una guerra di fiamme qui, ma sono quasi certo che la classe computazionale che stai descrivendo si chiama "Turing Equivalent". Turing Complete ha comunque una relazione simile a NP-Complete. NP-Complete è uguale a NP se e solo se P = NP. Allo stesso modo Turing Complete è uguale a Turing equivalente se e solo se la tesi di Church-Turing è corretta.
Waylon Flinn,

@Waylon Source? Nulla di ciò che ho letto è d'accordo (es. En.wikipedia.org/wiki/Turing_completeness )
Devin Jeanpierre,

4
@DevinJeanpierre Lo dice proprio lì nell'articolo di Wikipedia a cui ti colleghi. Citando la sezione Definizioni formali: "Un sistema computazionale che può calcolare ogni funzione calcolabile di Turing è chiamato Turing completo", "Un sistema completo di Turing è chiamato equivalente di Turing se ogni funzione che può calcolare è anche calcolabile di Turing"
Waylon Flinn

-2

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).


1
Un singolo ciclo while illimitato è sufficiente per simulare una macchina Turing.
masterxilo,

-8

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ì è.


10
Essere in grado di calcolare il percorso più breve tra i punti non è la definizione di Turing completa. C'è molto di più, oltre a questo solo esempio.
Eva,

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.