5

这是一个特殊的 Haskell 程序,它输出一个 Python 程序,该程序输出一个输出原始 Haskell 程序的 Ruby 程序(来自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

4 回答 4

2

首先,围绕这个编程任务。相信我,一旦你花一些时间,它实际上并没有那么难。这个想法是,您可以编写一个程序,该程序可以将另一个程序作为输入,并吐出第三个程序作为输出,该程序结合了这两个程序并且还可以理解它自己的文本。这是一种高阶奎因。如果您了解所有三种编程语言的结构,则可以从本作业中汲取思想并进一步扩展它们。

于 2009-08-29T01:50:51.110 回答
2

Kleene 的递归定理在理论上使得用几乎任何语言构造一个quine 成为可能。(更多信息在这里。)虽然我自己到目前为止还没有设法让它工作。

对于更高阶的 quine,要考虑的功能是语言评估机制的组成。如果您可以从 KRT 中获得基本的 quine,也许您可​​以尝试从中获得更高阶的 quine。

于 2009-09-30T09:21:06.700 回答
1

在那篇文章的第一段,我写了一个简短的解释。我建议从那里开始。

我从 Barwise 和 Moss 的《恶性循环》一书中学到了其中的一些技巧。

于 2011-01-27T22:41:44.597 回答
0

我不是程序员(),但对我来说是这样的:

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

一个(三角形)恶性循环,没有真正的开始或结束。

程序 A 包含对 B 的描述,其中包含对 C 的描述。

程序 B 包含对 C 的描述,其中包含对 A 的描述。

程序 C 包含对 A 的描述,其中包含对 B 的描述。

可能更深入,您可以使用许多不同的语言在圈子上获得更多的角落。

于 2011-10-01T16:02:15.577 回答