Cosa non può fare Idris rinunciando alla completezza di Turing?


35

So che Idris ha tipi dipendenti ma non è completo. Cosa non può fare rinunciando alla completezza di Turing, ed è correlato ad avere tipi dipendenti?

Immagino che questa sia una domanda piuttosto specifica, ma non conosco una grande quantità di tipi dipendenti e sistemi di tipi correlati.


2
Immagino che tu stia cercando un esempio concreto? Non ho familiarità con Idris, ma in Isabelle / HOL non è possibile scrivere (o piuttosto compilare) funzioni che non terminano sempre (peggio, è necessario fornire una prova di terminazione ).
Raffaello

Qualcosa del genere sì - non ero del tutto sicuro se ci sarebbe stato un caso piuttosto di nicchia come se non potessi codificare una lingua con determinate proprietà nel sistema dei tipi, o se sarebbe un po 'più generale (ad esempio, come hai detto , tutte le funzioni devono essere terminate)
Squidly

1
Immagino che questa errata assunzione provenga da Edwin Brady dicendo che Idris è "Pacman completo". Penso che il suo punto principale dicendo "Pacman completo" invece di "Turing completo", è che vuole sottolineare l'importanza che le lingue siano facilmente compilabili dal cervello umano e non solo dalle macchine! .. linguaggi sciocchi come BrainFuck sono sicuramente Turing completo, ma un cervello umano può impiegare un po 'di tempo a comprendere il codice scritto in BrainFuck, sviluppando e ancor più importante mantenere un programma Pacman in BrainFuck richiede un grande sforzo ..
Michelrandahl,

@Mitzh Non proprio. Penso che sia perché ho frainteso qualcosa che l'ho sentito dire in un discorso.
Squidly,

Risposte:


50

Idris è Turing completo! Controlla la totalità (terminazione durante la programmazione con dati, produttività durante la programmazione con codata) ma non richiede che tutto sia totale.

È interessante notare che avere dati e codata è sufficiente per modellare la completezza di Turing poiché è possibile scrivere una monade per funzioni parziali. L'ho fatto, anni fa, in Coq - probabilmente è stato bitrate ora ma qui è comunque: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .

Hai bisogno di una via di fuga per gestire effettivamente queste cose, ma Idris ti consente di farlo.

Idris non ridurrà le funzioni parziali a livello di tipo, al fine di mantenere decidibile il controllo del tipo. Inoltre, solo i programmi totali possono ragionevolmente essere considerati prove.


4
L'uomo stesso. Qual è la produttività in questo contesto?
Calamari

5
Doppia alla terminazione: mentre una definizione induttiva deve terminare (consumando tutti i suoi dati) una definizione coinduttiva deve essere produttiva - in pratica ciò significa, in breve, che qualsiasi chiamata ricorsiva deve essere protetta da un costruttore. Ho trovato questa spiegazione la più chiara (ymmv): adam.chlipala.net/cpdt/html/Coinductive.html
Edwin Brady,

14

In primo luogo, suppongo che tu abbia già sentito parlare della tesi di Church-Turing , che afferma che tutto ciò che chiamiamo "calcolo" è qualcosa che può essere fatto con una macchina di Turing (o con uno qualsiasi dei tanti altri modelli equivalenti). Quindi un linguaggio completo di Turing è un linguaggio in cui ogni calcolo può essere espresso. Al contrario, un linguaggio incompleto di Turing è un linguaggio in cui esiste un calcolo che non può essere espresso.

Ok, non è stato molto istruttivo. Lasciami fare un esempio. C'è una cosa che non puoi fare in nessun linguaggio incompleto di Turing: non puoi scrivere un simulatore della macchina di Turing (altrimenti potresti codificare qualsiasi calcolo sulla macchina di Turing simulata).

Ok, che ancora non è stato molto istruttivo. la vera domanda è: quale programma utile non può essere scritto in un linguaggio incompleto di Turing? Bene, nessuno ha trovato una definizione di "programma utile" che includa tutti i programmi che qualcuno ha scritto da qualche parte per uno scopo utile e che non include tutti i calcoli di Turing. Quindi progettare un linguaggio incompleto di Turing in cui è possibile scrivere tutti i programmi utili è ancora un obiettivo di ricerca a lungo termine.

Ora ci sono molti tipi molto diversi di lingue incomplete di Turing e differiscono per ciò che non possono fare. Tuttavia, esiste un tema comune: le lingue complete di Turing devono includere un modo per terminare in modo condizionale o andare avanti per un periodo non limitato dalle dimensioni del programma e un modo per il programma di utilizzare una quantità di memoria che dipende dall'input . Concretamente, la maggior parte dei linguaggi di programmazione imperativi forniscono queste abilità attraverso loop e allocazione dinamica della memoria rispettivamente. La maggior parte dei linguaggi di programmazione funzionale fornisce queste capacità attraverso la ricorsione e l'annidamento della struttura dei dati.

Idris è fortemente ispirato da Agda . Agda è un linguaggio progettato per dimostrare i teoremi . Ora i teoremi di dimostrazione e i programmi in esecuzione sono strettamente correlati , quindi puoi scrivere programmi in Agda proprio come provi un teorema. Intuitivamente, una dimostrazione del teorema "A implica B" è una funzione che accetta una dimostrazione del teorema A come argomento e restituisce una dimostrazione del teorema B.

Poiché l'obiettivo del sistema è dimostrare i teoremi, non è possibile lasciare che il programmatore scriva funzioni arbitrarie. Immagina che la lingua ti abbia permesso di scrivere una sciocca funzione ricorsiva che si è appena chiamata:

oops : A -> B
oops x = oops x

Non puoi lasciare che l'esistenza di una tale funzione ti convinca che A implica B, altrimenti potresti provare qualcosa e non solo veri teoremi! Quindi Agda (e simili dimostratori di teoremi) proibiscono la ricorsione arbitraria. Quando scrivi una funzione ricorsiva, devi dimostrare che termina sempre , in modo che ogni volta che la esegui su una dimostrazione del teorema A, sai che costruirà una dimostrazione del teorema B.

La limitazione pratica immediata di Agda è che non è possibile scrivere funzioni ricorsive arbitrarie. Poiché il sistema deve essere in grado di rifiutare tutte le funzioni non terminanti, l'indecidibilità del problema di interruzione (o più in generale il teorema di Rice ) assicura che ci siano anche funzioni terminanti che vengono respinte. Un'ulteriore difficoltà pratica è che devi aiutare il sistema a dimostrare che la tua funzione termina.

Ci sono molte ricerche in corso su come rendere i sistemi di prova più simili a un linguaggio di programmazione senza compromettere la loro garanzia che se si ha una funzione da A a B, è buona come una prova matematica che A implica B. Estendere il sistema per accettare di più terminare le funzioni è uno degli argomenti di ricerca. Altre direzioni di estensione includono la gestione di problemi del "mondo reale" come input / output e concorrenza. Un'altra sfida è rendere questi sistemi accessibili ai semplici mortali (o forse convincere i semplici mortali a essere effettivamente accessibili).

Non ho familiarità con Idris. È una visione delle sfide che ho appena menzionato. Per quanto ho capito da una rapida occhiata alla prestampa del 2013 , Idris è Turing-complete, ma include un controllo di totalità. Il controllo di totalità verifica che tutte le funzioni annotate con la parola chiave totalterminino. Il frammento di linguaggio che contiene solo programmi Idris in cui ogni funzione è totale è simile in potenza espressiva ad Arda (probabilmente non è una corrispondenza esatta a causa delle differenze nella teoria dei tipi, ma abbastanza vicina da non notarla se non si provasse deliberatamente).

Per altri esempi di lingue che non sono complete in Turing in diversi modi, vedi Quali sono i limiti pratici di un linguaggio completo senza turing come Coq? (da cui questa risposta è ampiamente presa).


3
"quale programma utile non può essere scritto in un linguaggio incompleto di Turing?" Una macchina virtuale Java.
David Richerby,

@DavidRicherby Non puoi? La JVM è davvero completa? C'è un limite alle dimensioni di un singolo oggetto, puoi organizzare l'allocazione e l'accesso a un numero illimitato di oggetti? Ad esempio, in C, la risposta sembra essere no perché ci sono solo finitamente molti valori di puntatore.
Gilles 'SO- smetti di essere cattivo'

Per i lettori interessati a quella parte, abbiamo un altro post sul perché non ci può essere un linguaggio di programmazione esattamente per i linguaggi che terminano sempre.
Raffaello

3
@Gilles Prendo il tuo punto, ma non è più o meno equivalente a dire che nessun linguaggio di programmazione reale è Turing completo? Dopotutto, qualsiasi implementazione si imbatterà nel tipo di barriere che menzioni. Sembra un elefante abbastanza grande da avere nella stanza considerando ciò che Idris perde non essendo completo di Turing. Perde più di qualsiasi altra lingua, per esempio? Se si proibisce l'archiviazione esterna illimitata (ad esempio, il programma si interrompe per dire "si prega di inserire il disco successivo / precedente"), qualsiasi lingua non è banalmente completa di Turing, quindi qualsiasi domanda su quel caso è vacua.
David Richerby,

3
@DavidRicherby I miei commenti (ma non la mia risposta) sono in modalità geek teoria dei linguaggi di programmazione. Se prendi le specifiche formali di SML (per esempio), è possibile progettare (ma ovviamente non implementare nel mondo fisico) un'implementazione del linguaggio in grado di simulare tutti i programmi calcolabili. Questo non è così in C, perché la finezza della memoria è incorporata nel linguaggio ( sizeof(void*)). Nella mia risposta, tratto le lingue in modo idealizzato, quindi SML o C sarebbero considerate Turing complete.
Gilles 'SO- smetti di essere malvagio' il
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.