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 total
terminino. 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).