Sono interessato al concetto di "completezza di r-Turing", come definito da Axelsen e Glück (2011) . Un sistema è completo di r-Turing se è in grado di calcolare lo stesso insieme di funzioni di una macchina di Turing reversibile, senza produrre dati "immondizia". Ciò equivale a poter calcolare ogni funzione che è sia (a) calcolabile, sia (b) iniettiva.
Vorrei esplorare computazionalmente lo spazio delle funzioni iniettive calcolabili. Per fare questo sto cercando il linguaggio di programmazione reversibile "più minimale" --- qualcosa che può svolgere il ruolo equivalente per la calcolabilità r-Turing che il calcolo lambda svolge per la calcolabilità di Turing.
So che ci sono molte lingue reversibili che le persone hanno sviluppato e dimostrato di essere complete. Tuttavia, questi sono stati sviluppati pensando alle applicazioni pratiche, quindi i loro autori si concentrano nel dare loro caratteristiche espressive piuttosto che nel renderle minime.
Qualcuno sa se è stato descritto un linguaggio invertibile così minimo, o se c'è qualche ricerca in tale direzione? Sono abbastanza nuovo nella letteratura su questo argomento, quindi avrei potuto facilmente perderlo. In alternativa, qualcuno ha qualche idea su come una tale lingua potrebbe essere creata?
Di seguito è riportato un riepilogo di ciò che sto cercando. Non so se possa essere creato modificando il calcolo lambda stesso o se si debba usare un tipo di linguaggio completamente diverso.
- Linguaggio completo r-Turing: calcola tutte le funzioni invertibili calcolabili e può solo calcolare le funzioni invertibili
- Sintassi e semantica il minimo possibile. (Ad esempio il calcolo Lambda ha solo definizioni e applicazioni di funzioni e nient'altro.) Non è necessario che la sintassi o la semantica siano correlate a quelle del calcolo lambda, sebbene possano esserlo.
- Programma = dati. Cioè, i programmi operano su espressioni piuttosto che su qualsiasi altro tipo di dati. Ciò garantisce che l'output di un programma possa sempre essere interpretato come un programma. Ciò implica probabilmente che deve essere uno stile di linguaggio funzionale piuttosto che imperativo.
- Esiste un modo sistematico per convertire un programma nel suo inverso, che non comporta un calcolo sostanzialmente maggiore di quello coinvolto nell'esecuzione effettiva del calcolo inverso. (Non tutte le lingue invertibili hanno questa proprietà, ma alcune lo fanno.)
Dovrei sottolineare che l'approccio di Axelsen e Glück al calcolo reversibile è abbastanza diverso dall'approccio ben noto dovuto a Bennett, in cui un programma (in generale non invertibile) è reso invertibile restituendo alcune informazioni sulla storia del calcolo insieme all'output. La completezza di r-Turing riguarda la capacità di calcolare le funzioni iniettive senza alcun output aggiuntivo. Ci sono molte cose chiamate variazioni di "calcolo lambda reversibile" che sono reversibili nel senso di Bennet - quelle non sono ciò che sto cercando.