É impossível escrever uma linguagem de programação que permita todas as máquinas que param em todas as entradas e nenhuma outra. No entanto, parece ser fácil definir uma linguagem de programação para qualquer classe de complexidade padrão. Em particular, podemos definir uma linguagem na qual podemos expressar todos os cálculos eficientes e apenas cálculos eficientes.
Por exemplo, para algo como : pegue sua linguagem de programação favorita e depois de escrever seu programa (correspondente à Máquina de Turing ), adicione três valores ao cabeçalho: um número inteiro , e número , e uma saída padrão . Quando o programa é compilado, imprima uma máquina de Turing que, dada a entrada do tamanho execute em para etapas . Se não parar antes que as etapas sejam executadas, faça a saída padrãoM ′ c k d M x n M ′ x c n k M ′ c n k d P. A menos que eu esteja enganado, essa linguagem de programação nos permitirá expressar todos os cálculos em e nada mais. No entanto, essa linguagem proposta é inerentemente não interessante.
Minha pergunta: existem linguagens de programação que capturam subconjuntos de funções computáveis (como todas as funções eficientemente computáveis) de uma maneira não trivial? Se não houver, existe uma razão para isso?
fonte
Respostas:
Um idioma que tenta expressar apenas cálculos de tempo polinomial é o cálculo lambda suave . Seu sistema de tipos está enraizado na lógica linear. Uma tese recente trata dos cálculos polinomiais de tempo e fornece um bom resumo dos desenvolvimentos recentes com base nessa abordagem. Martin Hofmann trabalha no assunto há algum tempo. Uma lista antiga de artigos relevantes pode ser encontrada aqui ; Muitos de seus documentos continuam nessa direção.
Outros trabalhos adotam a abordagem de verificar se o programa usa uma certa quantidade de recursos, usando Tipos dependentes ou Linguagem de montagem digitada .
Ainda outras abordagens são baseadas em cálculos formais limitados por recursos , como variantes do cálculo ambiental.
Essas abordagens têm a propriedade de que programas bem digitados atendem a alguns limites de recursos pré-especificados. O recurso vinculado pode ser tempo ou espaço e, geralmente, pode depender do tamanho das entradas.
Os primeiros trabalhos nesta área são sobre cálculos fortemente normalizados, o que significa que todos os programas bem digitados são interrompidos. O sistema F , também conhecido como cálculo lambda polimórfico, está fortemente normalizando. Ele não possui um operador de ponto fixo, mas é bastante expressivo, embora eu não pense que se saiba a que classe de complexidade ela corresponde. Por definição, qualquer cálculo fortemente normalizador expressa alguma classe de cálculos finais.
A linguagem de programação Charity é uma linguagem funcional bastante expressiva que para em todas as entradas. Não sei que classe de complexidade ela pode expressar, mas a função Ackermann pode ser escrita em Charity.
fonte
Dê uma olhada no artigo de Guillaume Bonfante, que propôs duas caracterizações para o espaço de log e o tempo polinomial usando linguagens de programação.
Guillaume Bonfante, Algumas linguagens de programação para Logspace e Ptime, AMAST 2006, LNCS 4019, pp. 66-80, 2006
fonte
Eu também gostaria de mencionar a Teoria da Complexidade Implícita como uma abordagem para isso, já que eu a vi surgir em várias questões um pouco relacionadas. Para citar esta resposta de Neel Krishnaswami :
fonte
Estou surpreso que ninguém tenha mencionado recursão primitiva. Ao restringir a loops limitados (ou seja, o número de iterações para cada loop deve ser calculado antes do início do loop), o programa resultante é recursivo primitivo e, portanto, total. Douglas Hofstadter propôs uma linguagem de programação, BLOOP, que permitia todas e apenas funções recursivas primitivas.
fonte
Veja também Pola, uma linguagem para programação PTIME e obras de Japaridze sobre aritmética PTIME, por exemplo, http://arxiv.org/abs/0902.2969
fonte