Есть идеи о создании программы Куайна более высокого порядка? - PullRequest
5 голосов
/ 28 августа 2009

Вот специальная программа на Haskell, которая выводит программу на Python, которая выводит программу на Ruby, которая выводит исходную программу на Haskell (из http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.html)

Точнее, вывод этой программы на 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"

- это программа на 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 ++ [')']")

, которая выводит программу Ruby после запуска,

$ 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)+')'")

и, наконец, программа Ruby печатает оригинальную программу на Haskell.

$ 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"

Поскольку традиционная программа quine может быть построена путем разделения программы на две части, в которой partA содержит описание partB, а partB вычисляет A из описания.

Но как была построена такая хина трех порядков?

Ответы [ 4 ]

2 голосов
/ 30 сентября 2009

Теорема Клини о рекурсии в теории позволяет построить квайн почти на любом языке. ( Больше информации здесь. ) Хотя мне самому пока не удалось заставить его работать.

Для квин более высокого порядка, функция, которую необходимо рассмотреть, является составом механизмов оценки языков. Если вы можете получить базовую квин из КРТ, возможно, вам стоит попробовать получить из нее квин более высокого порядка.

2 голосов
/ 29 августа 2009

Сначала оберните голову вокруг этого программного задания . Поверьте мне, на самом деле это не так сложно, если вы потратите на это некоторое время. Идея состоит в том, что вы можете написать программу, которая может принять другую программу в качестве входных данных и выплюнуть третью программу в качестве выходных данных, которая объединяет две программы и также понимает свой собственный текст. Это своего рода квиня высшего порядка. Если вы понимаете структуру всех трех языков программирования, вы можете взять идеи из этого задания и расширить их.

1 голос
/ 28 января 2011

В первом абзаце этой статьи я написал краткое объяснение. Я рекомендую начать там.

Я изучил некоторые из этих техник из книги «Порочные круги» Барвуса и Мосса.

0 голосов
/ 01 октября 2011

Я не программист (! ), но для меня это звучит так:

... -> C -> A -> B -> C-> A-> B -> C -> ...

Круг (треугольник) порочный без реального начала или конца.

Программа A содержит описание B, которое содержит описание C.

Программа B содержит описание C, которое содержит описание A.

Программа C содержит описание A, которое содержит описание B.

Вероятно, углубляясь, вы можете сделать это, используя много разных языков, получая больше углов по кругу.

...