C'è una lingua in grado di esprimere il proprio compilatore Turing-complete?


12

Un commento su tex.SE mi ha fatto meravigliare. La dichiarazione è essenzialmente:

Se riesco a scrivere un compilatore per la lingua X nella lingua X, allora X è Turing completo.

In termini di calcolabilità e linguaggi formali, questo è:

Se decide e , allora .L L T MM L F L = R EMLLTMMLFL=RE

Qui indica la lingua di tutte le codifiche macchina Turing e denota l'insieme di funzioni calcolate dalle macchine a . F L LLTMFLL

È vero?


chiudi, pensa / accetta che ci deve essere qualcosa di simile a questo tipo, qualsiasi linguaggio "non banale" o "sufficientemente complesso" che può esprimere il proprio simulatore è TM completo. un compilatore è generalmente parte di un simulatore. è in effetti un "modello di progettazione" trovato in molte prove di completezza della MT ma forse non è stato generalizzato / formalizzato. forse un argomento per ulteriori analisi / discussioni in Computer Science Chat . sospetto / congettura ce n'è qualche altra interessante in qualche modo simile a "ogni linguaggio non banale / sufficientemente complesso ricorsivo e ricorsivamente enumerabile può essere mappato / ridotto a ogni altro".
vzn,

1
Ho creato un linguaggio esoterico chiamato InterpretMe, che non può fare altro che esprimere il proprio interprete, quindi certamente non è Turing completo.
Ortografia non contestuale

Puoi spiegare la seconda affermazione? Che cos'è ? In che modo questa affermazione è correlata alla prima? M
reinierpost,

@reinierpost indica in genere il numero di , data la codifica (ammissibile). Quindi, . Con l'insieme di funzioni calcolate dalla lingua delle macchine di Turing. M L T M = { M | M  è una macchina di Turing } F L LMMLTM={MM is a Turing machine}FLL
Raffaello

Un modo migliore per affermare l'affermazione sarebbe: "Se c'è una TM con e , allora .M L L M = L F L = R EMMLLM=LFL=RE
Raffaello

Risposte:


13

L'affermazione informale non è vera, come mostrato dal seguente linguaggio di programmazione. Qualsiasi stringa di, diciamo, caratteri ASCII è un programma valido e il significato di ogni programma è "Emetti un programma che produce solo una copia del suo input". Pertanto, ogni programma in questa lingua è un compilatore per la lingua ma la lingua non è completa di Turing.

Non sono sicuro che la tua "versione della teoria della computabilità" sia equivalente ma non è nemmeno vera. Secondo il secondo teorema di ricorsione di Kleene , per qualsiasi codifica delle macchine di Turing, esiste una TM che accetta la propria codifica e rifiuta tutti gli altri. 1 Questa macchina è un controesempio alla proposta. Più concretamente, possiamo ottenere il risultato scegliendo una codifica. Ad esempio, lascia che ogni numero dispari codifichi la macchina  definita da "Se il mio input è dispari, accettalo; altrimenti, rifiuta" e lascia che il numero  codifichi la macchina codificata da  nel tuo schema di codifica preferito per le macchine Turing.  è nella lingua  accettata da  ma2 x x M L M F LM2xxMLMFL  non è Turing completo.


1 Il secondo teorema di ricorsione di Kleene afferma che, per ogni enumerazione delle funzioni ricorsive parziali (cioè, per qualsiasi codifica di programmi come numeri interi) e qualsiasi funzione ricorsiva parziale  , esiste un numero intero  tale che  è la funzione che mappa su . Quindi, in particolare, lascia che sia la funzione che accetta se e rifiuta diversamente. Secondo il teorema, esiste un numero intero  che codifica il programma . Cioè, accetta la propria codifica (ϕi)i0Q(x,y)pϕpyQ(p,y)Qx=ypϕp(y)=Q(p,y)ϕpp e rifiuta tutti gli altri input.


1
In che senso ogni programma in quella lingua è un compilatore per quella lingua? Ogni programma è un programma che inserisce un programma in quella lingua e produce un programma diverso in quella lingua, sì, ma i quines generalmente non sono considerati compilatori.
user253751,

1
Penso @immibis ha un punto: il compilatore è , mentre tutti i programmi in lingua sono , quindi non è chiaramente nella lingua. Mi sto perdendo qualcosa? c ( P ) = { x r e t u r n P } P ( x ) = P ccc(P)={xreturn P}P(x)=Pc
Raffaello

1
@immibis (tardivamente) penso che tu abbia ragione. Sembra che ciò che intendevo scrivere fosse che la semantica di ogni programma è semplicemente "emettere il tuo input". Sembra abbastanza vicino a quello che ho scritto che probabilmente era quello che intendevo dire in primo luogo. O forse sono stato molto fortunato che la distanza di modifica dalla mia risposta sbagliata alla risposta corretta fosse così piccola. :-)
David Richerby

1
La risposta ora dice "ignora il suo input e genera una copia del suo input" - non puoi fare entrambe le cose.
user253751

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.