Por que as funções computáveis ​​também são chamadas de funções recursivas?


23

Na teoria da computabilidade, funções computáveis ​​também são chamadas de funções recursivas. Pelo menos à primeira vista, eles não têm nada em comum com o que você chama de "recursivo" na programação do dia-a-dia (isto é, funções que se denominam).

Qual é o significado real de recursivo no contexto da computabilidade? Por que essas funções são chamadas "recursivas"?

Em outras palavras: qual é a conexão entre os dois significados de "recursividade"?



3
Eles trapaceiam, porque incluem o operador μ . Este é um operador de minimização, mas é claro que a minimização tem muito pouco a ver com recursão. Parece que alguém (Kleene) achou que "recursivo" soaria legal, então ele inventou uma desculpa para usar esse nome. Muito mais tarde, Robert Soare explicou que "computável" soaria muito melhor e que "recursivo" acabara de ser um truque de marketing dos primeiros dias, e todos concordaram.
Thomas Klimpel

3
O que há sobre funções recursivas primitivas? Copiados da Wikipedia, eles são definidos como h(0,x1,,xk)=f(x1,,xk) e . Essa é uma função que se chama. h(S(y),x1,,xk)=g(y,h(y,x1,,xk),x1,,xk)
Hendrik Jan

3
@GoloRoden Observe que a descrição da tag 'computabilidade' (você a usou para esta pergunta) diz: "teoria da computabilidade, também conhecida como teoria da recursão". Gödel denominou funções recursivas , mas o termo evoluiu para computável . Provavelmente para evitar confusões como a sua. As pessoas que estudam a teoria da computabilidade (intensivamente) tendem a usar o termo teoria da recursão mais para "respeitar" suas raízes.
Auberon

1
porque eles são definidos recursivamente, ou seja, " funções mais complexas são definidas em termos de funções anteriormente definidas e mais simples "
Nikos M.

Respostas:


13

Defina algumas funções básicas:

  • função zero

    zero:NN:x0
  • função sucessora

    succ:NN:xx+1
  • função de projeção

pin:NnN:(x1,x2,,xn)xi

A partir de agora vou usar para denotar ( x 1 , x 2 , , x n )xn¯(x1,x2,,xn)

Defina uma composição:

Funções dadas

  • cada um com a assinatura N kNg1,g2,,gmNkN
  • f:NmN

Construa a seguinte função:

h:NkN:xk¯h(xk¯)=f(g1(xk¯),g2(xk¯),,gm(xk¯))

Defina recursão primitiva:

Funções dadas

  • f:NkN
  • g:Nk+2N

Construa a seguinte função (por partes):

h:Nk+1N:(xk¯,y+1){f(xk¯),y+1=0g(xk¯,y,h(xk¯,y)),y+1>0

Todas as funções que podem ser feitas usando composições e recursão primitiva em funções básicas são chamadas recursivas primitivas . É assim chamado por definição. Embora exista um link com funções que se autodenominam, não é necessário tentar vinculá-las. Você pode considerar a recursão um homônimo.

Essa definição e construção acima foram construídas por Gödel (algumas outras pessoas também estavam envolvidas) na tentativa de capturar todas as funções computáveis, ou seja, existe uma Máquina de Turing para essa função. Observe que o conceito de uma máquina de Turing ainda não foi descrito, ou era pelo menos muito vago.

Felizmente, alguém chamado Ackermann apareceu e definiu a seguinte função:

  • Ack:N2N
  • Ack(0,y)=y+1
  • Ack(x+1,0)=Ack(x,1)
  • Ack(x+1,y+1)=Ack(x,Ack(x+1,y))

Esta função é computável, mas não há como construí-la usando apenas as construções acima! (ie não é recursivo primitivo) Isso significa que Gödel e seu grupo falharam em capturar todas as funções computáveis ​​em sua construção!Ack

Gödel teve que expandir sua classe de funções de modo poderia ser construído. Ele fez isso definindo o seguinte:Ack

Minimização ilimitada

  • g:NkN
  • SE ENTÃO g ( ¯ x k ) = y ELSE g ( ¯ x k ) não está definido.[f(xk¯,y)=0 AND f(xk¯,z) is defined z<y AND f(xk¯,z)0]

    g(xk¯)=y

    g(xk¯)

Este último pode ser difícil de entender, mas basicamente significa que é a menor raiz de f (se existir uma raiz).g((x1,x2,,xk))f


Todas as funções que podem ser construídas com todas as construções definidas acima são chamadas recursivas . Novamente, o nome recursivo é apenas por definição e não necessariamente tem correlação com funções que se chamam. Na verdade, considere isso um homônimo.

Funções recursivas podem ser funções recursivas parciais ou funções recursivas totais . Todas as funções recursivas parciais são funções recursivas totais. Todas as funções recursivas primitivas são totais. Como exemplo de uma função recursiva parcial que não é total, considere a minimização da função sucessora. A função sucessora não tem raízes, portanto sua minimização não está definida. Um exemplo de uma função recursiva total (que usa minimização) é .Ack

Agora Gödel foi capaz de construir o função, bem com a sua classe alargada de funções. De fato, toda função que pode ser computada por uma máquina de Turing pode ser representada usando as construções acima e vice-versa, toda construção pode ser representada por uma máquina de Turing.Ack

Se você estiver intrigado, tente aumentar a classe de Gödel. Você pode tentar definir o 'oposto' da minimização ilimitada. Ou seja, maximização ilimitada , ou seja, a função que encontra a maior raiz. No entanto, você pode achar que calcular essa função é difícil (impossível). Você pode ler o problema Busy Beaver , que tenta aplicar a maximização ilimitada.


4
Eu sei que percebo que as definições dadas realmente não respondem à pergunta, mas minha resposta descreve a evolução da teoria da recursão / computabilidade. Pode valer a pena ler.
Auberon

Eu gosto, obrigado por seus esforços :-)
Golo Roden

h((x1,x2,...,xk),0)=f((x1,x2,...,xk))h((x1,x2,...,xk,0)). Além disso, não existe uma cláusula anterior à próxima cláusula else do ponto de marcador.
Eric Towers

2
μ

1
Existem algumas afirmações incorretas na sua resposta. Você não deve inventar uma história para obter uma resposta.
Kaveh

17

Os fundadores da teoria da computabilidade foram matemáticos. Eles fundaram o que agora é chamado de teoria da computabilidade antes de haver computadores. Como os matemáticos definiram as funções que poderiam ser computadas? Por definições recursivas!

Portanto, havia função recursiva antes de qualquer outro modelo de computação, como máquinas de Turing, máquinas de cálculo ou registradoras lambda. Então, as pessoas se referem a essas funções como funções recursivas. O fato de eles terem sido exatamente o que as máquinas de Turing e outros modelos podem calcular é um evento posterior (principalmente provado por Kleene).

μ

O nome do campo usado para a teoria da recursão. No entanto, houve um impulso bem-sucedido nas últimas décadas para mudar o nome para algo mais atraente, da teoria da recursão para algo mais científico (versus mathy). Como resultado, o campo agora é chamado de teoria da computabilidade. No entanto, se você olhar para livros, trabalhos, conferências, etc., nas primeiras décadas, eles serão chamados de teoria da recursão e não de teoria da computabilidade. Até o título do livro de 1987 de Soare (que foi a principal pessoa por trás do impulso de mudar o nome para a teoria da computabilidade) é "Conjuntos e graus recursivamente enumeráveis".

Se você quiser saber mais sobre a história, um lugar divertido e bom para ler sobre ela é o primeiro capítulo da Teoria da Recursão Clássica de Odifreddi.


7

Robert Soare escreveu um ensaio sobre esta questão. Segundo ele, o termo funções recursivas (gerais) foi cunhado por Gödel, que as definiu usando algum tipo de recursão mútua. O nome ficou preso, embora mais tarde outras definições equivalentes tenham sido encontradas.

Para mais informações, recomendo o ensaio de Soare.


0

em vez de colocar um longo comentário, decidiu adicionar uma resposta:

Como são definidas recursivamente , ou seja, " funções mais complexas são definidas em termos de funções mais simples definidas anteriormente "

Esse tipo de procedimento iterativo ou incremental cria funções bem definidas (no sentido matemático)

Este é o significado de recursividade na linguagem matemática. Veja abaixo como isso se relaciona com a recursão na linguagem de programação.

Compare este procedimento com técnicas e métodos como indução (matemática), que também é um exemplo de recursividade na matemática.

A programação tem uma veia matemática e também uma de engenharia.

Esse procedimento (geralmente construtivo) também é chamado de " bootstrapping " na linguagem dos sistemas operacionais.

No entanto, uma recursão em tempo de execução da mesma função (ou seja, se auto-calibrando durante o tempo de execução ), uma vez que deve (hmm, deveria) ocorrer em valores (ou argumentos) já calculados ou, em outras palavras, na parte do conjunto de resultados já calculado , também é recursivo no sentido acima, ou seja, " funções definidas previamente definidas (e seus valores) "

Outra coisa não está bem definida e leva a coisas como Stack Overflow :))))

Para dar um exemplo adicional de Sistemas operacionais, uma recursão de tempo de execução (chamada própria) pode ser tomada como o análogo de um sistema operacional reinicializado após uma certa atualização (por exemplo, atualização principal). Muitos sistemas operacionais fazem o seguinte procedimento:

  1. uma inicialização inicial para carregar rotinas de baixo nível (por exemplo, E / S)
  2. faça as atualizações necessárias (usando as rotinas de baixo nível)
  3. reinicialize (efetivamente, chamando a si mesmo), mas desta vez carregando as rotinas mais complexas (ou mesmo todo o sistema)

Auberon bela resposta de demonstra um procedimento desse tipo em mais detalhes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.