La completezza di Turing dice solo una cosa e una sola cosa: un modello di calcolo è completo di Turing, se qualsiasi calcolo che può essere modellato da una Macchina di Turing può anche essere modellato da quel modello.
Quindi, quali sono i calcoli che una macchina di Turing può modellare? Bene, prima di tutto, Alan Turing e tutti i suoi colleghi erano sempre e solo interessati alle funzioni sui numeri naturali. Quindi, la Turing Machine (e il calcolo λ, il calcolo del combinatore SK, le funzioni ricorsive μ, ...) parlano solo della calcolabilità delle funzioni sui numeri naturali. Se non stai parlando di una funzione su numeri naturali, allora il concetto di completezza di Turing non ha nemmeno senso, semplicemente non è applicabile.
Si noti, tuttavia, che possiamo codificare molte cose interessanti come numeri naturali. Possiamo codificare stringhe come numeri naturali, possiamo codificare grafici come numeri naturali, possiamo codificare booleani come numeri naturali. Possiamo codificare le macchine di Turing come numeri naturali, il che ci consente di creare macchine di Turing che parlano di macchine di Turing!
E, naturalmente, non tutte le funzioni sui numeri naturali sono calcolabili. Una macchina di Turing può calcolare solo alcune funzioni su numeri naturali, il calcolo λ può calcolare solo alcune funzioni su numeri naturali, il calcolo del combinatore SK può calcolare solo alcune funzioni su numeri naturali, ... Sorprendentemente (o no), si scopre che ogni modello di calcolo (che è effettivamente realizzabile nel nostro universo fisico) può calcolare le stesse funzioni su numeri naturali (almeno per tutti i modelli che abbiamo trovato fino ad ora). [Nota: ovviamente, ci sono modelli di calcolo più deboli , ma non ne abbiamo ancora trovato uno più forte, ad eccezione di alcuni che sono ovviamente incompatibili con il nostro universo fisico, come modelli che utilizzano numeri reali o viaggi nel tempo.]
Questo fatto, che dopo molto tempo alla ricerca di molti modelli diversi, troviamo, ogni volta, che possono calcolare esattamente le stesse funzioni, è la base per la Church-Turing-Thesis, che dice (approssimativamente) che tutti i modelli di calcolo sono ugualmente potenti e tutti catturano la nozione "ideale" di cosa significhi essere "calcolabili". (C'è anche un secondo aspetto più filosofico della CTT, ovvero che un essere umano che segue un algoritmo può anche calcolare esattamente le stesse funzioni che una TM può calcolare e non di più.)
Tuttavia , nulla di tutto ciò dice nulla
- quanto sono efficienti i vari modelli
- quanto sono convenienti da usare
- che cosa altro si può fare oltre a funzioni di calcolo sui numeri naturali
E che è proprio dove le differenze tra i diversi modelli di calcolo (e di linguaggi di programmazione) entrano in gioco.
Come esempio di prestazioni diverse, sia una macchina ad accesso casuale che una macchina di Turing possono copiare un array. Ma una RAM ha bisogno di operazioni per farlo, mentre una TM ha bisogno di operazioni , poiché deve saltare elementi dell'array per copiare ogni elemento e ci sono elementi da copiare.O ( s i z e 2 a r r a y ) s i z e a r r a y s i z e a r r a yO(sizearray)O(size2array)sizearraysizearray
A titolo di esempio per convenienza diversa, puoi semplicemente confrontare il codice scritto in un linguaggio di alto livello, il codice scritto in assembly e la descrizione di una TM per risolvere lo stesso problema.
E il tuo interruttore della luce è un esempio del terzo tipo di differenza, cose che alcuni modelli possono fare che non funzionano sui numeri naturali e quindi non hanno nulla a che fare con la completezza di Turing.
Per rispondere a domande specifiche:
Ma un programma scritto in una lingua completa di Turing può essere riscritto in un'altra?
No. Solo se il programma calcola una funzione calcolabile di Turing su numeri naturali. E anche allora, potrebbe essere necessaria una codifica complessa. Ad esempio, λ-calculus non ha nemmeno numeri naturali, devono essere codificati usando le funzioni (perché le funzioni sono l'unica cosa che λ-calculus ha).
Questa codifica di input e output può essere molto complessa, così come l'espressione dell'algoritmo. Quindi, mentre è vero che qualsiasi programma può essere riscritto, il programma riscritto può essere molto più complesso, molto più grande, usare molta più memoria ed essere molto più lento.
Cosa succede se il mio assembly ha un codice operativo LIGHTBUTTON? Non riesco fisicamente a emulare quella lingua su un sistema (lingua) senza una lampadina.
Una lampadina non è una funzione calcolabile di Turing su numeri naturali. In realtà, una lampadina non è né una funzione né un calcolo. L'accensione e lo spegnimento di una lampadina è un effetto collaterale di I / O. Le macchine di Turing non modellano gli effetti collaterali I / O e il completamento di Turing non è rilevante per loro.
Su numeri reali arbitrari.
La completezza di Turing si occupa solo di funzioni calcolabili su numeri naturali, non si occupa di numeri reali.
La completezza di Turing non è semplicemente molto interessante quando si tratta di domande come la tua per due motivi:
- Non è un ostacolo molto alto. Tutto ciò che serve è
IF
, GOTO
, WHILE
, e una variabile singolo intero (assumendo che la variabile può contenere arbitrariamente grandi numeri interi). Oppure, ricorsione. Un sacco di cose è pieno di Turing. Il gioco di carte Magic: The Gathering è Turing completo. CSS3 è Turing completo. Il sendmail
file di configurazione è Turing completo. La MMU Intel x86 è Turing completa. Le MOV
istruzioni Intel x86 sono Turing complete. Le animazioni di PowerPoint sono complete di Turing. Excel (senza script, utilizzando solo le formule) è Turing-complete. Il protocollo di routing BGP è Turing completo. sed
è Turing completo. Le mod_rewrite
regole di Apache sono Turing complete. Google per " (accidentalmente o sorprendentemente) turing completato"per trovare altri esempi interessanti. Se quasi tutto è Turing completo, essere Turing completo non è più una proprietà interessante.
- Non è effettivamente necessario per essere utile. Molte cose utili non sono complete di Turing. CSS prima versione 3 non è Turing-complete (e il fatto che CSS3 è in realtà non è utilizzato da chiunque). SQL prima del 1999 non era completo di Turing, eppure era straordinariamente utile anche allora. Il linguaggio di programmazione C senza librerie aggiuntive non sembra essere completo di Turing . Le lingue tipicamente dipendenti sono, più o meno per definizione, non complete di Turing, tuttavia è possibile scrivere sistemi operativi, server Web e giochi in esse.
Edwin Brady, l'autore di Idris, usa il termine "Tetris-complete" per parlare di alcuni di questi aspetti. Essere completo su Tetris non è rigorosamente definito (a parte l'ovvio "può essere usato per implementare Tetris"), ma comprende cose come essere abbastanza di alto livello ed espressivo da poter scrivere un gioco senza impazzire, potendo interagire con il mondo esterno (input e output), essere in grado di esprimere effetti collaterali, essere in grado di scrivere un loop di eventi, essere in grado di esprimere la programmazione reattiva, asincrona e concorrente, essere in grado di interagire con il sistema operativo, essere in grado interagire con librerie straniere (in altre parole: essere in grado di chiamare ed essere chiamato con il codice C) e così via. Queste sono caratteristiche molto più interessanti di un linguaggio di programmazione generico rispetto alla completezza di Turing.
Potresti trovare interessante la mia risposta alla domanda che hai collegato , che tocca alcuni degli stessi punti anche se risponde a una domanda diversa.