Escrevendo função recursiva universal [fechada]

9

Existe uma construção explícita curta de uma função recursiva universal ? Todas as definições que eu vi envolvem a numeração de máquinas de Turing de alguma forma, o que é possível, mas parece difícil e incontrolável escrever em uma linguagem de programação de nível superior (como Python, Haskell etc.)

sdcvvc
fonte
A pergunta foi originalmente feita na SO , parece mais apropriada aqui.
sdcvvc
11
Meu entendimento é que o que uma função recursiva universal faz é exatamente fornecer uma numeração de funções recursivas (ou máquinas de Turing equivalentes) para que o resultado possa ser calculado a partir do índice de uma função recursiva e da entrada. Portanto, "uma função recursiva universal sem numerar as máquinas de Turing" não me parece plausível.
Tsuyoshi Ito
3
Não é nível de pesquisa. Qualquer intérprete para uma linguagem completa de Turing é uma função recursiva universal.
Warren Schudy

Respostas:

13

Certo. Escreva rotinas que computem cada uma das funções recursivas primitivas de Godel e escreva uma rotina para um operador de pesquisa ilimitado. O conjunto de funções que você pode calcular dessa maneira é equivalente ao conjunto de funções que as máquinas de Turing podem calcular. Mais informações aqui .

A desvantagem é que qualquer entrada em seu programa universal precisaria ser estruturada em termos dessas operações simples. Claro, é para isso que servem os compiladores.

Aaron Sterling
fonte
10

Qualquer intérprete para qualquer idioma que seja completo em Turing é uma função recursiva universal. Existem interpretadores para linguagens de alto nível como C ++ ou Python.

A numeração de Godel existe, mas implicitamente. Por exemplo, o código C ++ calculando uma função recursivag é um índice para g.

Kaveh
fonte
Um intérprete para Turing Machines (ou Register Machines, ou funções recursivas) também é uma função recursiva universal e não é difícil implementá-las. Eu os implementei em C ++ há alguns anos e tenho certeza de que seria ainda mais simples em Python. Use o Google, existem muitos simuladores gratuitos na Internet e alguns deles são de código aberto.
Kaveh
8

Uma função universal upode ser escrita facilmente em uma linguagem semelhante a Haskell (sem efeitos colaterais, funções de ordem superior), a saber:

u f x = f x

A função ué universal porque aceita (a descrição) um programa fe uma fita de entrada x, e diz-lhe o resultado da execução fde x.

Embora essa resposta não seja totalmente séria, ela mostra que um compilador ou intérprete para uma linguagem semelhante a Haskell já contém todas as partes necessárias para uma função universal. A moral da história é que é melhor gastar tempo estudando como os compiladores e intérpretes funcionam do que se preocupar em implementar uma função universal em termos de máquinas de Turing.

Andrej Bauer
fonte
No entanto, uassume uma função - eu chamaria de função de ordem superior. Eu gostaria ude pegar um número inteiro ou um tipo de dados algébrico regular. Não forço nenhum modelo específico de computação, desde que o argumento to useja tangível - por exemplo, ele pode ser serializado de / para uma string.
Sdcvvc
Em uma máquina real (uma vez que o código é compilado) ufaz um fechamento, que é uma sequência finita de bytes. Mesmo no teorema utm usual, o número inteiro que urepresenta representa uma função.
Andrej Bauer
5

Veja também este artigo de John Tromp, usando lógica combinatória. Um artigo anterior, aparentemente não mais disponível, foi ainda mais organizado.

Yuval Filmus
fonte