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?
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?
Respostas:
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:
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 forma para recursivo primitivo , onde pensamos como um predicado.
bound
deve 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.
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
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.