Cosa rende completo un linguaggio Turing?


79

Qual è l'insieme minimo di funzionalità / strutture linguistiche che lo rendono Turing completo?


21
Non sarebbe meglio semplicemente cercarlo su Google? en.wikipedia.org/wiki/Turing_completeness
aml90

2
Ciao gatto curioso, benvenuto da programmatori! Le chiamate per elenchi non sono in argomento qui: ho rimosso quella parte dalla tua domanda. Detto questo, questa ricerca è estremamente ampia: c'è un problema specifico su cui stai lavorando che ti sta pensando alla completezza di Turing?


Per una prospettiva informatica, vedi qui .
Raffaello,

Risposte:


73

Un tarpit di Turing è un tipo di linguaggio di programmazione esoterico che si sforza di essere Turing completo mentre utilizza il minor numero possibile di elementi. Brainfuck è forse il tarpit più noto, ma ce ne sono molti.

  • Iota e Jot sono linguaggi funzionali con due e tre simboli, rispettivamente, basati sul calcolo del combinatore SK (I) .

  • OISC ( One Instruction Set Computer ) indica un tipo di calcolo imperativo che richiede solo un'istruzione di uno o più argomenti, in genere "sottrarre e ramificare se inferiore o uguale a zero" o "invertire sottrai e saltare se prendere in prestito". La MMU x86 implementa l'istruzione precedente ed è quindi Turing-complete.

In generale, affinché un linguaggio imperativo sia completo di Turing, è necessario:

  1. Una forma di ripetizione condizionale o salto condizionale (ad es. while, if+ goto)

  2. Un modo per leggere e scrivere una forma di archiviazione (ad es. Variabili, nastro)

Perché un linguaggio funzionale basato su lambda-calcolo sia TC, ha bisogno di:

  1. La capacità di astrarre funzioni su argomenti (ad esempio, lambda astrazione, citazione)

  2. La capacità di applicare funzioni agli argomenti (ad es. Riduzione)

Esistono ovviamente altri modi di considerare il calcolo, ma questi sono modelli comuni per i tarp di Turing. Si noti che i computer reali non sono macchine Turing universali perché non dispongono di memoria illimitata. A rigor di termini, sono "macchine di archiviazione limitate". Se dovessi continuare ad aggiungere memoria a loro, si avvicinerebbero asintoticamente alle macchine di Turing al potere. Tuttavia, anche le macchine di archiviazione limitate e le macchine a stati finiti sono utili per il calcolo; semplicemente non sono universali .

A rigor di termini, l'I / O non è richiesto per la completezza di Turing; TC afferma solo che una lingua può calcolare la funzione desiderata, non che può mostrarti il risultato. In pratica, ogni lingua utile ha in qualche modo un modo di interagire con il mondo.


Per le lingue imperative, sono sufficienti variabili semplici? Avevo l'impressione che sarebbe stato necessario un qualche tipo di raccolta (ad esempio array o elenchi collegati).
luiscubal,

1
@luiscubal devi essere in grado di specificare una quantità arbitraria di dati. Con variabili semplici puoi rappresentare la quantità di dati che le variabili stesse hanno. E se fosse necessario rappresentare N + 1 diversi pezzi di dati. Si potrebbe sostenere che con trucchi come le giocate di Fractran, si potrebbe fare anche in semplici variabili ... ma non è proprio quello che stai chiedendo.

Non è necessario che la lingua supporti i loop ENDLESS ?
sergiol,

Ri, "ogni lingua utile ha un modo di interagire con il mondo". Algol 60 non aveva un modo definito di interagire con il mondo. Tutto il tuo I / O in un programma Algol 60 è stato fatto chiamando le funzioni di libreria e le funzioni di libreria potrebbero essere completamente diverse nelle diverse implementazioni. Ma, con la presente, mi rifiuto di qualsiasi discussione sull'opportunità o meno di "utile" Algol 60.
Solomon Slow

15

Da un punto di vista più pratico: se riesci a tradurre tutti i programmi in una lingua completa di Turing nella tua lingua, quindi (per quanto ne so), la tua lingua deve essere completa di Turing. Pertanto, se si desidera verificare se una lingua progettata è Turing-completa, è possibile semplicemente scrivere un Brainf *** nel compilatore YourLanguage e dimostrare / dimostrare che può compilare tutti i programmi BF legali.

Per chiarire, intendo che oltre a un interprete per YourLanguage, scrivi un compilatore (in qualsiasi lingua) in grado di compilare qualsiasi programma BF su YourLanguage (mantenendo la stessa semantica, ovviamente).


11
Sì, sarebbe sicuramente il modo più pratico per affrontarlo. </sarcasm>
Robert Harvey,

13
@RobertHarvey ha ragione, ma l'idea generale è piuttosto vitale. Brainfuck ha dimostrato di essere completo e molto semplice man mano che i linguaggi di programmazione vanno. Per i linguaggi di programmazione non esoterici, l'implementazione di un interprete brainfuck può essere molto più semplice e veloce che fornire una prova rigorosa dal nulla (posso implementare BF in un paio di righe di Python, ma non sono sicuro da dove iniziare con un formale prova che Python è completo); e dozzine di lingue esoteriche ispirate a Brainfuck sono conosciute per essere complete perché è noto come si associano a Brainfuck.

7
@RobertHarvey: Perché no? Sicuramente qualcuno che progettasse la propria lingua sarebbe in grado di scrivere un compilatore BF (se fosse un imperativo, e trovare altrimenti un'altra lingua adatta).
Anton Golov,

5
@delnan: Si dovrà dimostrare, tuttavia, che il vostro interprete BF implementa correttamente le specifiche BF, IOW si dovrà dimostrare che il vostro interprete BF è, infatti, un interprete BF e non un interprete per un linguaggio di BF-like che potrebbe essere o non essere completo di Turing.
Jörg W Mittag,

2
@ DarekNędza, questa è solo una conseguenza naturale della definizione di Turing Completezza; qualsiasi estensione di una lingua Turing Complete sarà comunque Turing Complete.
Anton Golov,

8

Un sistema può essere considerato completo di Turing solo se può fare qualsiasi cosa una macchina universale di Turing. Poiché si dice che la macchina universale di Turing sia in grado di risolvere qualsiasi funzione calcolabile in un determinato momento, anche i sistemi completi di Turing possono farlo.

Per verificare se qualcosa è Turing completo, vedere se è possibile implementare una macchina Turing al suo interno. In altre parole, controlla se è in grado di simulare quanto segue:

  1. La capacità di leggere e scrivere "variabili" (o dati arbitrari) : praticamente autoesplicativo.
  2. La capacità di simulare lo spostamento della testina di lettura / scrittura : non è sufficiente essere in grado di recuperare e archiviare le variabili. Deve anche essere possibile simulare la capacità di spostare la testa del nastro per fare riferimento ad altre variabili. Questo può spesso essere simulato all'interno di linguaggi di programmazione con l'uso di strutture di dati di array (o equivalenti) o, nel caso di determinati linguaggi come il codice macchina, la possibilità di fare riferimento ad altre variabili mediante l'uso di "puntatori" (o equivalenti).
  3. La capacità di simulare una macchina a stati finiti : anche se non menzionate spesso, le macchine di Turing sono in realtà una variazione delle macchine a stati finiti spesso utilizzate nello sviluppo dell'IA. Alan Turing ha affermato che lo scopo degli stati è di simulare le "varie modalità di risoluzione dei problemi" di una persona.
  4. Uno stato di "arresto" : sebbene sia spesso menzionato un insieme di regole deve essere in grado di ripetersi per essere considerato Turing completo, questo non è in realtà un buon criterio poiché la definizione formale di ciò che un algoritmo è algoritmi di stato deve sempre alla fine concludere. Se non riescono a concludere in alcun modo, o non è Turing completo o detto algoritmo non è una funzione calcolabile. I sistemi completi che tecnicamente non possono concludere a causa del modo in cui funzionano (come le console di gioco, per esempio) aggirano questa limitazione essendo in grado di "simulare" uno stato di arresto in qualche modo. Da non confondere con il "problema di arresto", una funzione indecidibile che lo dimostra '

Questi sono i veri requisiti minimi per un sistema da considerare Turing completo. Niente di più, niente di meno. Se non riesce a simulare nessuno di questi in qualche modo, non è Turing completo. I metodi proposti da altre persone sono solo mezzi per raggiungere il fine in quanto ci sono diversi sistemi completi di Turing che non hanno quelle caratteristiche.

Si noti che non esiste un modo noto per costruire effettivamente un vero sistema completo Turing. Questo perché non esiste un modo noto per simulare sinceramente la sconfinatezza del nastro della macchina Turing nello spazio fisico.


4

Un linguaggio di programmazione è in fase di completamento se è possibile eseguire qualsiasi calcolo con esso. Non esiste un solo set di funzionalità che completa il turing della lingua, quindi le risposte che dicono che hai bisogno di loop o che hai bisogno di variabili sono sbagliate poiché ci sono lingue che non hanno né il turing completo.

Alan Turing ha creato la macchina turing universale e se puoi tradurre qualsiasi programma progettato per funzionare sulla macchina universale per funzionare nella tua lingua, anche Turing è completo. Questo funziona anche indirettamente, quindi puoi dire che la lingua X è completa se tutti i programmi per la lingua completa Y possono essere tradotti per X poiché tutti i programmi universali della macchina turing possono essere tradotti in un programma Y.

La complessità del tempo, la complessità dello spazio, la facilità del formato di input / output e la facilità di scrittura di qualsiasi programma non sono inclusi nell'equazione, quindi tale macchina può teoricamente fare tutti i calcoli se i calcoli non sono fermati dalla perdita di potenza o se la Terra viene ingoiata dal sole.

Di solito per dimostrare la completezza turing fanno di un interprete qualsiasi linguaggio provato turing completo ma per farlo funzionare sono necessari mezzi di input e output, due cose che in realtà non sono necessarie per un linguaggio turing completo. È sufficiente che il programma possa modificare il suo stato all'avvio e che sia possibile ispezionare la memoria dopo l'interruzione del programma.

Per rendere un linguaggio di successo è necessario ben altro che completezza turing e questo è vero anche per tarpit turing. Non credo che BrainFuck sarebbe stato popolare senza ,e ..


2
"Un linguaggio di programmazione è in fase di completamento se è possibile eseguire qualsiasi calcolo con esso." Questa è la tesi di Church-Turing, non ciò che rende completa una lingua di Turing.
Rhymoid,

@Rhymoid Quindi vuoi dire che niente è completo se non riesci a creare un interprete? Vale a dire. il calcolo lambda non è completo completo anche se è uguale uguale?
Sylwester,

1
Sto ancora cercando una definizione autorevole dei termini Turing-equivalente e Turing-completo (e Turing-potente). Ho già visto troppi casi, dalle persone alle bacheche dei messaggi ai ricercatori nei loro stessi documenti, che interpretano questi termini in modo diverso.
Rhymoid,

In ogni caso, interpreto "Turing-complete" come una simulazione equivalente a una Universal Turing Machine (UTM; che, a sua volta, è in grado di simulare qualsiasi macchina di Turing - quindi "universale"). Nel documento di Turing del 1936, dove presentò le sue macchine, definì la nozione di UTM e fornì uno schizzo di una prova che gli UTM sono simulazioni equivalenti al calcolo lambda di Church. In tal modo, ha dimostrato di avere lo stesso potere computazionale. La tesi di Church-Turing afferma, in parole povere, che "questo è tutto il potere computazionale che avrai mai".
Rhymoid,

Ha due definizioni formali per la pagina di completezza di Turing di Wikipedia . Uno richiede I / O l'altro no. Quello che non dice che una macchina è in fase di completamento se è in grado di calcolare ogni funzione calcolabile di Turing. Ciò riporta il calcolo lambda al completamento del turing poiché è possibile creare facilmente un programma uguale nel calcolo lambda che calcola lo stesso di qualsiasi programma di turing machine.
Sylwester,

4

Non puoi dire se si ripeterà all'infinito o si fermerà.

-------------

Spiegazione: Dato qualche input, è impossibile dire in ogni caso (usando un'altra macchina di Turing) se la cosa sta andando all'infinito o alla fine si fermerà, tranne eseguendola (che ti dà una risposta se si ferma, ma non se scorre!).

Ciò significa che devi essere in grado di memorizzare una quantità potenzialmente illimitata di dati in qualche modo: deve esserci un equivalente del nastro infinito, non importa quanto contorto! (Altrimenti ci sono solo un numero finito di stati e quindi puoi verificare se hai attraversato quello stato in precedenza e alla fine fermarti). In generale, le macchine di Turing possono aumentare o ridurre le dimensioni del loro stato con mezzi controllabili.

Poiché la macchina Turing universale originale di Turing presenta un problema di arresto irrisolvibile, anche la tua macchina completa Turing deve avere un problema di arresto irrisolvibile.

I sistemi completi di Turing possono emulare qualsiasi altro sistema completo di Turing, quindi se puoi creare un emulatore per qualche sistema completo Turing ben noto nel tuo sistema, ciò dimostra che anche il tuo sistema è Turing completo.

Ad esempio, supponiamo che tu voglia dimostrare che Snakes & Ladders è Turing completo, dato un tabellone con uno schema a griglia ripetuto all'infinito (con una versione diversa sul lato superiore e sinistro). Sapendo che la macchina Minsky a 2 contatori è Turing completa (che ha 2 segnalini illimitati e 1 stato fuori da un numero finito), puoi costruire una tavola equivalente dove la posizione X e Y sulla griglia è il valore corrente dei 2 contatori e il percorso corrente è lo stato corrente. Scoppio! Hai appena dimostrato che Snakes & Ladders sono Turing completi.


1
Non compro questa discussione. Solo perché il problema di arresto è indecidibile per le macchine Turing non implica direttamente che ogni notazione che consente di specificare un programma per il quale il problema di arresto è indecidibile sia Turing completa. Ovviamente è vero solo il contrario: se la notazione è Turing completa, è ovviamente possibile scrivere programmi per i quali il problema di arresto è indecidibile.
5gon12eder

È una condizione necessaria. Se puoi decidere per ogni programma se si ferma, allora la lingua non è Turing completa.
gnasher729,

4

Una condizione necessaria è un loop con un conteggio di iterazione massimo non determinato prima dell'iterazione o ricorsione in cui la profondità di ricorsione massima non è determinata in anticipo. Ad esempio, per ... in ... i loop come li trovi in ​​molte lingue più recenti non sono sufficienti per completare il turing della lingua (ma avranno altri mezzi). Si noti che ciò non significa un numero limitato di iterazioni o profondità di ricorsione limitata, ma che le iterazioni massime e la profondità di ricorsione devono essere calcolate in anticipo.

Ad esempio, la funzione Ackermann non può essere calcolata in una lingua senza queste funzionalità. D'altra parte, è possibile scrivere molti software estremamente complessi e molto utili senza richiedere queste funzionalità.

D'altra parte, con ogni conteggio delle iterazioni e ogni profondità di ricorsione calcolati in anticipo, non solo si può decidere se un programma si arresterà o meno, ma si fermerà .


-1

so che questa non è la risposta formalmente corretta, ma una volta estratto il "minimo" da "Turing-complete" e riportato "pratico" al suo posto, vedrai le caratteristiche più importanti che distinguono un linguaggio di programmazione da un linguaggio di markup sono

  • variabili
  • condizionali (se / quindi ...)
  • loopage (loop / break, mentre ...)

il prossimo arrivato

  • funzioni anonime e nominate

per testare queste affermazioni, inizia con un linguaggio di markup, ad esempio HTML. potremmo inventare un HTML + solo con variabili o solo condizionali (lo ha fatto MS con commenti condizionali) o un qualche tipo di costrutto loop (che in assenza di condizionali probabilmente finirebbe come qualcosa del genere <repeat n='4'>...</repeat>). fare uno di questi renderà HTML + significativamente (?) più potente del semplice HTML, ma sarebbe comunque più un markup che un linguaggio di programmazione; con ogni nuova funzionalità, la rendi meno un linguaggio dichiarativo e più un linguaggio imperativo.

la ricerca della minimalità nella logica e nella programmazione è sicuramente importante e interessante, ma se dovessi insegnare a n00bies giovani o vecchi "cosa sta programmando" e "come imparare a programmare", difficilmente inizierei con tutta la larghezza e la larghezza delle basi teoriche della completezza di Turing. tutta l'essenza della cucina e della programmazione sta facendo le cose, nell'ordine giusto, ripetendo fino a quando non è pronto, come ha fatto tua madre. che per riassumere per me.

poi di nuovo, non ho mai finito il mio CS.


2
Se non sei sicuro, dovresti prima fare delle ricerche. fractran è al completo , così come brainf * ck . Nota anche che HTML 5 + CSS 3 è Turing completo perché può implementare la regola 110 .

1
sì, lo so. ma tutti gli esempi forniti sono più o meno esoterici (anche se forse interessanti o sorprendenti), la mia risposta è stata pragmatica e molto probabilmente non minimale. penso che sia importante precisarlo: questa pagina era la numero 1 durante la ricerca della completezza di Turing su Google, le risposte qui sono IMHO di scarsa utilità, diciamo, per un n00bie che vuole sapere cosa distingue HTML da PHP o Python. voglio dire, brainf ck non si chiama brainf ck senza motivo.
flusso
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.