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 aP
oI
Un deterministico, procedura meccanicistico per produrre un'uscita
o
dal programmap
e di ingressoi
, dovep
,i
eo
fanno parte dellaP
,I
eO
rispettivamente. 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
, I
e O
devono 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
f
daI
aO
, esiste un programmap
in modoP
tale che datop
e 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 I
e O
siano i numeri della Chiesa . (Non è Turing completo se prendiamo I
e O
per 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.