Fuga dal tarpit (poliziotti)


9

Questa è una sfida di 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 , 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 di P(anche se può essere).

  • Un "set di output" O, che sarà similmente un set infinitamente numerabile e potrebbe essere o meno uguale a PoI

  • Un deterministico, procedura meccanicistico per produrre un'uscita odal programma pe di ingresso i, dove p, ie ofanno parte della P, Ie Orispettivamente. 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 fda Ia O, esiste un programma pin modo Ptale che dato pe input i, l'output è f(i)se f(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.


9
Scusate ragazzi, ma il concorso di popolarità è un criterio vincente oggettivo. Essere un pop-con non costituisce una sfida fuori tema, e non l'ha mai fatto. La meta-discussione più recente ha un consenso di +27 a favore di questo, quindi sebbene voi cinque possiate preferire che sia diverso, in realtà non avete una gamba su cui resistere. Poiché questa domanda è stata chiusa contro la politica concordata, chiedo che venga riaperta.
Nathaniel,

2
(nota che WhatWizard l'ha chiuso per un motivo diverso.)
user202729

2
Ti preghiamo di non utilizzare i voti stretti come pulsante "Non sono d'accordo" o "Non mi piace". I voti stretti devono essere utilizzati per applicare la politica del sito. Se non sei d'accordo con una politica, portala a meta - non chiudere le sfide che sono sul tema per consenso della comunità.
Mego

1
@Mego Ho votato per chiudere questo come troppo ampio, ma penso anche che questo sia fuori tema dalle nostre regole esistenti per i pop-contro. Ci aspettiamo che i concorsi di popolarità abbiano "Una chiara specifica dell'obiettivo che deve essere raggiunto", questa domanda è una do X nel modo più creativo. È chiaro per me che non esiste altro obiettivo che quello di essere una risposta valida e che il tag pop-con sia collegato solo per tenerlo aperto.
Ad Hoc Garf Hunter

2
@WhatWizard l'obiettivo che deve essere raggiunto è il fatto che Turing non è ovviamente completo, con la non ovvietà valutata se non viene violato entro una settimana. Non è chiaro?
Nathaniel,

Risposte:


10

Aritmetica bendata

Forse una lingua abbastanza semplice con cui iniziare, relativamente parlando. (Ci sono dei limiti su quanto una lingua possa essere difficile da realizzare perché devo provarlo da solo!)

Per questa lingua, il set di programmi è l'insieme dei programmi di aritmetica bendata come indicato nella sezione "programma" di seguito, il set di input è il set di numeri interi positivi e il set di output è il set di numeri interi (l'intero set, non solo gli interi positivi).

Questo linguaggio è abbastanza interessante - forse anche praticamente utile - perché ha una mancanza più o meno totale di flusso di controllo, essendo interamente basato su calcoli su numeri che non puoi vedere. Ciò lo rende potenzialmente utile come linguaggio per l'implementazione di programmi all'interno di sistemi di crittografia omomorfa.

specificazione

L'aritmetica bendata è un linguaggio di programmazione esoterico con le seguenti specifiche:

Archivio dati

Lo stato di un programma aritmetico bendato in esecuzione è costituito da sei variabili, ognuna delle quali può memorizzare un numero intero. (Non ci sono limiti su come grande o piccolo questi numeri interi possono ottenere, in particolare, possono andare negativo.) Le variabili sono chiamati a, b, c, d, e, e i.

All'inizio del programma, aa einclusivo vengono inizializzati ciascuno a 0 e iviene inizializzato su un numero intero positivo prelevato dall'input dell'utente. (Se non è disponibile alcun input, iviene inizializzato su 1.)

Se il programma termina l'esecuzione (ciò può verificarsi solo a causa della divisione per zero), il valore di iimmediatamente prima del tentativo di divisione viene utilizzato come output del programma.

Programma

Un programma aritmetico bendato è un elenco di comandi, ognuno dei quali ha una delle seguenti forme (dove v può essere sostituito da qualsiasi nome di variabile, potenzialmente un nome diverso ogni volta che viene usato):

  • v = v + v
  • v = v - v
  • v = v * v
  • v = v / v

Notare che ogni operando dei comandi deve essere una variabile; questa lingua non consente l'uso di numeri interi letterali.

L'esecuzione del programma viene eseguita eseguendo ciascuno dei comandi in sequenza, quindi tornando indietro all'inizio e continuando a eseguire nuovamente i comandi in sequenza, all'infinito (o fino a quando non si tenta di dividere per zero, che termina il programma) .

Ogni comando ha la stessa semantica che ti aspetteresti dalla notazione, che non è diversa da quella usata dalla maggior parte dei linguaggi di programmazione pratica: vengono presi i valori della seconda e terza variabile citati nel comando, un'operazione aritmetica (aggiungi / sottrai / moltiplicare / dividere rispettivamente per le quattro forme di comando) viene applicato a esse e il valore risultante memorizzato nella prima variabile. La divisione qui è divisione intera, arrotondando verso 0.

Non esiste alcun flusso di controllo di alcun tipo, tranne l'uscita dal programma; i comandi scorrono sempre in sequenza, fino a quando si verifica una divisione per zero (se presente) e termina il programma. In particolare, non c'è modo di leggere direttamente le variabili, ma solo di usarle come fonte di calcoli i cui risultati influenzano i valori assegnati ad altre variabili.


Puoi verificare se nella mia risposta manca qualcosa?
user202729

@ user202729: (commentando qui perché non ho il rappresentante per commentare lì) Non puoi simulare uno "sposta se falso" fuori da un "capovolgere" e uno "sposta se vero" perché non puoi annullare il capovolgimento dopo che ti sposti. Quindi avrai bisogno di un altro modo per gestirlo (ad esempio un modo per invertire i test, che non dovrebbe essere difficile). Più in particolare, tuttavia, questa è una prova della completezza di Turing in termini di arresto del comportamento, ma la definizione nella domanda richiede che tu sia in grado di eseguire anche l'I / O, quindi devi dimostrare di poterlo fare.
ais523,

Spero che la parte I / O (ora) sia ok. Per quanto riguarda l'altro problema, mi rendo conto che gli stati intermedi, se non addirittura necessari, risolvono tutti i problemi (anche se non sono sicuro di come
esprimerlo

@utente202729: non è ancora perfettamente corretto (ad esempio, la domanda richiede che tu sia in grado di produrre numeri negativi, e dovresti anche cambiare lo scopo in imodo che il numero di stato - che sarà sempre "arrestato" - non lo farà essere parte dell'output), ma è abbastanza vicino che non lo segnerò come sicuro, dato che otterresti chiaramente una crepa completa con abbastanza tempo e con un sufficiente chiarimento delle regole. Non voglio vincere questa sfida sui tecnicismi.
ais523,

Questo è molto vicino alle restrizioni che de.ioccc.org/years-spoiler.html#1992_buzzard.1 utilizza. L'implementazione utilizza numeri interi di dimensioni fisse e quindi non è completa di Turing, e questa è seriamente limitata nel numero di variabili che hai, ma penso che la prova sia comunque simile.
b_jonas,
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.