Alguma idéia sobre a construção de um programa de Quine de ordem superior?

StackOverflow https://stackoverflow.com/questions/1347578

  •  20-09-2019
  •  | 
  •  

Pergunta

Aqui está um programa especial Haskell que gera um programa Python que gera um programa Ruby que gera o programa Haskell original (de http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.html)

Para ser mais exatamente, a saída é deste programa Haskell

q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"

é um programa Python,

$ runhaskell test.hs
def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'
q("def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'","def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']")

que produz um programa de rubi após a execução,

$ runhaskell test.hs | python
def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end
q("def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']","def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'")

E, finalmente, o programa Ruby imprime o programa Haskell original.

$ runhaskell test.hs | python | ruby
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"

Como um programa tradicional de Quine pode ser construído separando um programa em duas partes nas quais PartA contém uma descrição de Partb e Partb calcula A da descrição.

Mas como foi construída uma quina de três ordens?

Foi útil?

Solução

Primeiro, envolva sua cabeça Esta atribuição de programação. Acredite, na verdade, não é tão difícil quando você passa algum tempo nele. A idéia é que você possa escrever um programa que possa assumir outro programa como entrada e cuspir um terceiro programa como saída que combina os dois programas e também entende seu próprio texto. É uma espécie de Quine de ordem superior. Se você entender a estrutura das três linguagens de programação, poderá pegar as idéias desta tarefa e estendê -las ainda mais.

Outras dicas

Teorema da Recursão de Kleene Em teoria, torna possível construir uma queda em quase qualquer idioma. (Mais informações aqui.) Embora eu mesmo não tenha conseguido fazer com que funcione.

Para uma queda de ordem superior, a função a considerar é a composição dos mecanismos de avaliação dos idiomas. Se você conseguir obter um Quine básico do KRT, talvez você possa tentar obter um Quine de ordem mais alta.

No primeiro parágrafo desse artigo, escrevi uma breve explicação. Eu recomendo começar por aí.

Aprendi algumas dessas técnicas com o livro Vicious Circles by Barwise e Moss.

Eu não sou um programador (!) mas parece assim para mim:

... -> c -> a -> b -> c-> a-> b -> c -> ...

Um círculo (triângulo) cruel sem imploramento real ou final.

Program uma cointrain Uma descrição de B que contém uma descrição de C.

O Programa B co -andain Uma descrição de C que contém uma descrição de A.

Programa C co -andain Uma descrição de A que contém uma descrição de B.

Provavelmente se aprofundando, você pode fazer com muitos idiomas diferentes, obtendo mais cantos no círculo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top