Qual é o significado das funções recursivas primitivas?

7

Eu estava estudando a prova de que a função de Ackermann era recursiva, mas não primitiva, e uma pergunta me ocorreu: "E daí?". Por que isso Importa? Qual é o significado das funções recursivas primitivas?

Sem título
fonte
Algumas questões relacionadas: 1 , 2 , 3 . Quanto à sua pergunta, em que direção você gostaria que nós interpretássemos "significado"? Historicamente, na teoria da computabilidade, na prática, ...?
Raphael
@Raphael Yuval Filmus fornece uma visão teórica do computador sobre o assunto, mas se você tiver conhecimento de seu significado histórico, isso também seria interessante.
Sem título

Respostas:

6

O problema da parada é indecidível, mas pode-se objetar que, para a maioria dos programas, é fácil verificar se eles são interrompidos ou não, procurando quaisquer loops infinitos óbvios. Por outro lado, se você quiser garantir que seu programa sempre termine, poderá fazê-lo limitando a priori o número de iterações de loop para cada loop. Por exemplo, considere o pseudocódigo para quadrados repetidos:

def power(x, y, p):
   "compute x^y mod p"
   assert y >= 0
   result = 1
   while y > 0:
     if x is odd: result = result * x (mod p)
     y = y div 2
     x = x * x
   return result

Como sabemos que esse procedimento sempre termina? Uma maneira seria a priori vincular o loop:

def power(x, y, p):
   "compute x^y mod p"
   assert y >= 0
   bound = y
   result = 1
   loop bound times:
     if x is odd: result = result * x (mod p)
     y = y div 2
     x = x * x
     if y == 0: break
   return result

Agora está claro que este programa termina e, se não cometermos um erro em outro lugar, os dois programas produziriam a mesma saída.

Funções recursivas primitivas são aquelas calculadas por programas nos quais todos os loops são limitados e não há recursão.

Embora não permitamos recursão (uma vez que não é limitada), podemos simulá-la com um loop. Podemos fazer várias perguntas agora:

  1. Toda função computável é apresentável neste formulário?
  2. Caso contrário, qual é a relação entre essa classe e todas as funções computáveis?

Para responder 1, pode-se mostrar que certas funções computáveis ​​que crescem "muito rápido" não são recursivas primitivas, por exemplo, a função Ackermann. Por outro lado, toda função cuja taxa de crescimento é "razoável" é recursiva primitiva. E toda função computável pode ser declarada na formaf(x)=ψ(minyϕ(x,y)) para recursivo primitivo ϕ,ψ, onde pensamos ϕ como um predicado.

Yuval Filmus
fonte
1) Cada um deles bounddeve ser calculado por funções recursivas primitivas. 2) Explicar o termo "recursão primitiva" dizendo "não usar recursão" é estranho. Nós podemos usar recursão, não apenas qualquer tipo.
Raphael
@ Rafael 1) Limitado por outra variável. 2) A recursão mencionada no nome é representada pelos loops . A terminologia não precisa ser coerente, depois que todas as funções computáveis ​​também são chamadas de funções recursivas , mas as máquinas de Turing não permitem recursão (aberta).
Yuval Filmus
1

Quando fiz meu curso de computabilidade, fomos apresentados a isso da seguinte maneira:

A recursão primitiva é uma maneira natural de definir uma computação (provavelmente óbvia se você tem uma mente matemática, para um programador é mais fácil entender que a recursão é um loop para trás).

Então, depois de dominar a recursão primitiva, você se pergunta: isso é tudo o que há na computação?

Bem, acontece que não é. Primeiro, você está perdendo valores indefinidos. Ok, então você pode estender a recursão primitiva para funções recursivas primitivas parciais.

Ainda assim, existem algumas funções computáveis ​​(completas) que não são recursivas primitivas. Bem, Ackermann é um deles. É por isso que a função Ackermann é importante. Acontece que 'recursão' é "recursão primitiva + minimização" e, embora não possa ser provado, ao que parece, é tudo o que há para computar.

Portanto, funções recursivas primitivas são importantes, pois são

  1. formalismo simples
  2. base para a definição de recursão

Não tenho certeza - talvez alguém mais saiba - mas acho que antes de Ackermann criar sua função, os matemáticos pensavam que computável = recursão primitiva + funções parciais.

Zane
fonte