O feto, se você nunca ouviu falar, pode ser lido aqui . Ele usa um sistema de 'matrizes de chamada' e 'gráficos de chamada' para encontrar todos os 'comportamentos de recursão' de chamadas recursivas em uma função. Para mostrar que uma função termina, mostra que todos os comportamentos de recursão das chamadas recursivas feitas a uma função obedecem a uma certa "ordem lexicográfica". Seu verificador de terminação permite todas as funções recursivas primitivas e funções como a função Ackermann. Basicamente, permite recursão primitiva com vários argumentos. Este também é basicamente o verificador de rescisão da Agda; Acredito que a Coq também tenha algumas instalações semelhantes, embora talvez mais gerais.
Da leitura do artigo "Programação Funcional Total", de DA Turner . Ele explica que sua linguagem proposta seria capaz de expressar todos os "funcionais recursivos primitivos", como visto no Sistema T estudado por Godel. Ele continua dizendo que esse sistema "é conhecido por incluir todas as funções recursivas cuja totalidade pode ser provada na lógica de primeira ordem".
O Dose Fetus permite todos os funcionais recursivos primitivos? Em caso afirmativo, ele permite funções que não são funcionais recursivas primitivas? Pode ser fornecida uma citação para a resposta? (isso não é realmente necessário, pois estou apenas interessado; apenas algumas leituras conjugais sobre o assunto seriam boas)
Pergunta do bônus: Os funcionais recursivos primitivos têm uma definição muito concisa em termos de combinadores: digitados S e K (que não podem expressar os combinadores de ponto fixo), zero, a função sucessora e a função de iteração; é isso aí. Existem outras linguagens mais gerais que possuem uma definição concisa e em que todas as expressões terminam?
Respostas:
Sim, o verificador Fetus pode verificar tudo em T. do Goedel. Você pode mostrar isso usando o verificador para mostrar que o operador de iteração em T está terminando. Por exemplo, a seguinte definição funcionará:
É muito fácil para o verificador Fetus (ou quase qualquer outro verificador de terminação) verificar, porque é uma definição obviamente estruturalmente recursiva.
A Agda e a Coq permitem provar o término de funções que vão muito além do que é comprovadamente total na aritmética de primeira ordem. O recurso que permite isso é que eles permitem definir tipos por recursão nos dados, que é chamada de "grande eliminação". (Na teoria dos conjuntos ZF, o esquema axioma de substituição serve aproximadamente ao mesmo propósito.)
Um exemplo fácil de algo que vai além de T é a consistência do próprio T de Goedel! Podemos fornecer a sintaxe como um tipo de dados:
Observe que a dependência de tipo nos permite definir um tipo de dados com termos contendo apenas os termos bem digitados de T. Podemos então fornecer uma função de interpretação para os tipos:
Isso indica que
N
devem ser os números naturais do Agda, e a seta de T deve ser interpretada como o espaço de funções do Agda. Esta é uma eliminação "grande", porque definimos um conjunto por recursão na estrutura do tipo de dados T.Podemos então definir uma função de interpretação, mostrando que todos os termos do T de Goedel podem ser interpretados por um termo da Agda:
(Eu não tenho o Agda nesta máquina, portanto, sem dúvida, existem algumas importações ausentes, declarações de fixidez e erros de digitação. Correção é um exercício para o leitor, que também pode ser um editor, se quiser.)
Não sei qual é a força da consistência da Agda, mas Benjamin Werner mostrou que o Cálculo de Construções Indutivas (cálculo de núcleo da Coq) é equiconsistente ao ZFC, além de inúmeros cardeais inacessíveis.
fonte
Como meio de esclarecimento, devo observar que o Fetus é desenvolvido por Andreas Abel , que também desenvolveu o verificador de terminação original da Agda e trabalhou em técnicas de terminação mais avançadas desde então.
A resposta para sua pergunta pode ser um pouco decepcionante: a classe de funções de a é exatamente as funções que podem ser definidas no sistema . A razão para isso: a classe mencionada acima é igual às funções prováveis de terminação na aritmética de segunda ordem ( ), que por sua vez é igual às funções definíveis no sistema (consulte, por exemplo, provas e tipos , capítulo 11) Além disso, se você remover o polimorfismo, cairá nas funções definíveis em , que coincidem com as definíveis em system .N F P A 2 F P A TN N F P A2 F P A T
Novamente, a razão para isso é que a diminuição capturada pelas "matrizes de chamada" é comprovadamente bem fundamentada e essa prova pode ser realizada inteiramente em .P A
No entanto, isso não significa que o Fetus não seja mais útil que o sistema ! Na prática, são necessárias análises de terminação mais complexas para poder aceitar determinadas apresentações de funções computáveis. Você não precisa fazer uma prova complicada na aritmética do Peano toda vez que escreve uma função de unificação, por exemplo. Portanto, nesse aspecto, o Fetus é muito poderoso e permite definir funções de uma maneira que não seria aceita pela Coq, pela Agda ou por qualquer outro sistema de prova comum.T
fonte
Se por funções recursivas primitivas você quer dizer funções recursivas primitivas e sabe que o Fetus contém a função Ackermann, o Fetus não coincide com a classe de funções pr, pois a função Ackermann não é recursiva primitiva. Isso foi demonstrado por Ackermann e, mais tarde, uma prova simplificada foi dada por Rosza Peter em " Konstruktion nichtrekursiver Funktionen " 1935 (infelizmente apenas em alemão, até onde eu sei).
Se você procurar classes maiores de funções recursivas com garantia de término que possam coincidir com a classe de funções capturadas pelo Fetus, algum outro trabalho de Rosza Peter poderá interessá-lo.
[edit] Funções recursivas primitivas não são iguais a funcionais recursivas primitivas, conforme observado no comentário abaixo. No entanto, acho que se poderia transferir o conceito de recursão transfinita para funcionais. No entanto, não está claro se ainda é mais poderoso criar uma configuração funcional.
fonte