Primeiro, suponho que você já tenha ouvido falar da tese de Church-Turing , que afirma que qualquer coisa que chamamos de “computação” é algo que pode ser feito com uma máquina de Turing (ou qualquer um dos muitos outros modelos equivalentes). Portanto, uma linguagem completa de Turing é aquela em que qualquer cálculo pode ser expresso. Por outro lado, uma linguagem incompleta de Turing é aquela em que há algum cálculo que não pode ser expresso.
Ok, isso não foi muito informativo. Deixe-me dar um exemplo. Há uma coisa que você não pode fazer em qualquer linguagem incompleta de Turing: não é possível escrever um simulador de máquina de Turing (caso contrário, você pode codificar qualquer cálculo na máquina de Turing simulada).
Ok, isso ainda não foi muito informativo. a verdadeira questão é: que programa útil não pode ser escrito em um idioma incompleto de Turing? Bem, ninguém elaborou uma definição de "programa útil" que inclua todos os programas que alguém escreveu em algum lugar para uma finalidade útil, e que não inclua todos os cálculos das máquinas de Turing. Portanto, projetar uma linguagem incompleta de Turing na qual você possa escrever todos os programas úteis ainda é um objetivo de pesquisa a longo prazo.
Agora, existem vários tipos muito diferentes de idiomas incompletos em Turing, e eles diferem no que não podem fazer. No entanto, existe um tema comum: as linguagens completas de Turing devem incluir uma maneira de terminar condicionalmente ou continuar por um tempo que não seja limitado pelo tamanho do programa, e uma maneira de o programa usar uma quantidade de memória que depende da entrada . Concretamente, a maioria das linguagens de programação imperativas fornece essas habilidades através de loops while e alocação dinâmica de memória, respectivamente. A maioria das linguagens de programação funcionais fornece essas habilidades por meio de recursão e aninhamento de estrutura de dados.
Idris é fortemente inspirado pela Agda . Agda é uma linguagem projetada para provar teoremas . Agora, provar que teoremas e executar programas estão intimamente relacionados , portanto, você pode escrever programas no Agda da mesma maneira que prova um teorema. Intuitivamente, uma prova do teorema "A implica B" é uma função que pega uma prova do teorema A como argumento e retorna uma prova do teorema B.
Como o objetivo do sistema é provar teoremas, você não pode deixar o programador escrever funções arbitrárias. Imagine que o idioma permitiu que você escrevesse uma função recursiva boba que apenas se denominava:
oops : A -> B
oops x = oops x
Você não pode deixar a existência de uma função assim convencê-lo de que A implica B, ou então você seria capaz de provar qualquer coisa e não apenas verdadeiros teoremas! Portanto, a Agda (e provadores de teoremas semelhantes) proíbe a recursão arbitrária. Ao escrever uma função recursiva, você deve provar que ela sempre termina , de modo que sempre que executá-la em uma prova do teorema A você sabe que ela construirá uma prova do teorema B.
A limitação prática imediata da Agda é que você não pode escrever funções recursivas arbitrárias. Como o sistema deve ser capaz de rejeitar todas as funções que não terminam, a indecidibilidade do problema de parada (ou mais geralmente o teorema de Rice ) garante que também existam funções terminadas que também são rejeitadas. Uma dificuldade prática adicional é que você precisa ajudar o sistema a provar que sua função termina.
Há muita pesquisa em andamento para tornar os sistemas de prova mais parecidos com a linguagem de programação, sem comprometer a garantia de que, se você tem uma função de A a B, é tão boa quanto uma prova matemática de que A implica B. Estendendo o sistema para aceitar mais funções de encerramento é um dos tópicos de pesquisa. Outras instruções de extensão incluem lidar com preocupações do “mundo real” como entrada / saída e simultaneidade. Outro desafio é tornar esses sistemas acessíveis a meros mortais (ou talvez convencer os meros mortais de que eles são de fato acessíveis).
Eu não estou familiarizado com Idris. É uma visão dos desafios que acabei de mencionar. Tanto quanto eu entendo, de uma olhada superficial na pré-impressão de 2013 , Idris é Turing-completo, mas inclui um verificador de totalidade. O verificador de totalidade verifica se todas as funções anotadas com a palavra-chave total
terminam. O fragmento de linguagem que contém apenas os programas Idris, onde todas as funções são totais, é semelhante em poder expressivo ao Arda (provavelmente não uma correspondência exata devido a diferenças na teoria dos tipos, mas perto o suficiente para que você não notasse a menos que tentasse deliberadamente).
Para outros exemplos de idiomas que não são completos para o Turing de maneiras diferentes, consulte Quais são as limitações práticas de um idioma completo que não seja o turing como o Coq? (da qual essa resposta é amplamente retirada).