Questa è una sfida di poliziotti e ladri basata sulla definizione delle lingue e sulla dimostrazione che sono Turing completi.
Questo è il filo della polizia. Il thread dei ladri è qui .
Cops
Come poliziotto, preparerai due cose:
Una specifica formale di un linguaggio di programmazione o altro sistema computazionale. (I sistemi computazionali sono definiti di seguito.)
Una prova che il tuo sistema è Turing completo, secondo la definizione alquanto rigida di seguito.
Pubblica la tua specifica della tua lingua e i ladri cercheranno di "decifrarla" dimostrando la sua completezza Turing. Se il tuo invio non viene infranto entro una settimana, puoi contrassegnarlo come sicuro e pubblicare la prova. (La tua risposta può essere invalidata se qualcuno trova un difetto nella tua prova, a meno che tu non possa risolverlo.)
Questo è un concorso di popolarità , quindi il vincitore sarà la risposta che ha il maggior numero di voti e che non viene crackato o invalidato. La sfida è a tempo indeterminato: non accetterò una risposta.
Per il bene di questa sfida, un sistema computazionale sarà definito come quattro cose:
Un "programma impostato"
P. Questo sarà un insieme numerabile infinito, ad esempio stringhe, numeri interi, alberi binari, configurazioni di pixel su una griglia, ecc. (Ma vedi le restrizioni tecniche di seguito).Un "set di input"
I, che sarà anche un set numerabile infinito, e non deve necessariamente essere lo stesso set diP(anche se può essere).Un "set di output"
O, che sarà similmente un set infinitamente numerabile e potrebbe essere o meno uguale aPoIUn deterministico, procedura meccanicistico per produrre un'uscita
odal programmape di ingressoi, dovep,ieofanno parte dellaP,IeOrispettivamente. Questa procedura dovrebbe essere tale da poter essere, in linea di principio, implementata su una macchina di Turing o su un altro modello astratto di calcolo. Naturalmente, la procedura potrebbe non arrestarsi, a seconda del programma e del suo input.
I set P, Ie Odevono essere tali che si possono esprimere come stringhe in modo calcolabile. (Per le scelte più sensate questo non ha importanza; questa regola esiste per impedirti di scegliere strane serie, come la serie di macchine di Turing che non si fermano.)
La completezza di Turing sarà definita come la seguente:
- Per qualsiasi funzione parziale calcolabile
fdaIaO, esiste un programmapin modoPtale che datope inputi, l'output èf(i)sef(i)ha un valore. (Altrimenti il programma non si ferma.)
La parola "calcolabile" nella definizione sopra significa "può essere calcolata usando una macchina di Turing".
Si noti che né la regola 110 né il tag ciclico bit a bit sono Turing completi con questa definizione, poiché non hanno la struttura input-output richiesta. Il calcolo Lambda è Turing completo, purché definiamo Ie Osiano i numeri della Chiesa . (Non è Turing completo se prendiamo Ie Oper essere espressioni lambda in generale.)
Tieni presente che non è necessario fornire un'implementazione della tua lingua, ma puoi aggiungerne una nella tua risposta, se lo desideri. Tuttavia, non dovresti fare affidamento sull'implementazione per definire la lingua in alcun modo: le specifiche dovrebbero essere complete in sé e, se c'è una contraddizione tra le specifiche e l'implementazione, questo dovrebbe essere trattato come un bug nell'implementazione.