我已经创建了一种图灵完备的编程语言(已经过验证),因此必须可以为它编写quine,对吗?
但我知道的所有quines都将其源代码存储在一个字符串中,然后使用chr
和ord
之类的内容替换其中的特殊字符。
我的语言只有以下
我不知道如何编写一个quine,因为我有没有真正的字符串操作,我只能输出常量字符串。然而,它是100%图灵完成。
答案 0 :(得分:3)
如果你有整数,你可以编码或解码字符串(方案简单如A = 1,B = 2等就足够了)。您只需要能够比较常量字符串或比较int。因此似乎没有根本问题。
您使用数字并编写
之类的内容if (n == 1) print "A"
if (n == 2) print "B"
...
可能存在一些实际困难。带字符串的东西不是你有字符,而是它们相当于非常大的数字。您需要的是访问无限精度数字或某种固定大小的数字或其他大型数据结构。一个数字数组将为您提供字符串可以执行的操作。但是如果你的语言是图灵完成的,它应该有办法轻松访问一些大块的内存
图灵完整语言仅限于32位磁带(或者你必须为32位的每个不同存储空间赋予一个新名称)将是一个遗憾,不确定你是否可以编写具有这种限制的quine。顺便说一下,如果你没有数组或类似的结构,知道你的语言是如何完成图灵会很有趣。我通常使用的常用方法是使用我的语言实现一些图灵机。但要做到这一点,我需要某种数组来模拟乐队。
这种编码基本上是哥德尔在其不完整定理中所做的,找到一些方法将逻辑表达式编码为整数然后推理。
如果你提供一些更多的语法元素,我们甚至可以尝试这样做(如果你没有函数但只有gotos,这也是一个问题,但你也可以模拟它)。基本问题是你必须找到一种“压缩”编码源代码的方法。如果你有长串常量可用,它可能会有所帮助。
答案 1 :(得分:3)
如果您的语言图灵完整并且有一个quine,那么很可能是无限多的。这是构建其中一些的方法:
X1<brainfuck source>Y1
在运行时解释Brainfuck程序。string f(string a, string b)
,当给出任何a
和b
输出一个Brainfuck程序时,运行时输出字符串a
,整个Brainfuck源代码,然后是字符串b
。你可以调整现有的Brainfuck quine来做到这一点。f(X1, Y1)
,然后将生成的Brainfuck程序从1嵌入到您的程序中。第一步是最困难的,但你可能已经完成了,因为证明Turing完成某事的最简单方法之一就是为另一种语言实现解释,这种语言已被证明是图灵完成的。
第二步已被证明是可能的,并且与您的程序语言无关。
第三步是一个简单的计算。
答案 2 :(得分:0)
显然,编程语言中的程序是一个字符串。 quine的输出是一个程序。
因此,quine的输出是一个字符串。如果你没有任何字符串操作,就不可能写一个。
您应该用数字编码程序(而不是简单的人类可读文本编码)或实现字符串操作。