是一种专门为不印刷昆斯而构建的语言,仍然是图灵完备的



"有可能在每种图灵完整语言中创建一个quine吗?">

任何编程语言图灵完备,并且能够输出任何字符串(通过可计算字符串作为程序的函数--这是一个技术条件对每一个程序都感到满意存在的语言)有一个quine程序(事实上,还有无限多quine程序,以及许多类似程序古玩)如下不动点定理。

如果我创建了具有以下输出处理程序的语言X:

public void outputHander( OutputEvent e ){
String msg = e.getMessage();
String src = Runtime.getSource();
if( msg.equals(src) ){
e.setMessage("");
}
}

这可以防止以任何方式输出源。

如果X语言的解释器一直在屏幕上检查其源代码,并且找到了源代码,那么在它出现在屏幕上之前就会将其删除。

假设一个空程序会抛出一个非空错误,那么X语言仍然是图灵完备的吗?为什么?

尽管可以防止quine,但它仍然可能模拟不需要I/O的图灵完整算法。X语言的图灵完备性是未知的。

如何证明您的语言不会被诱骗输出自己的源代码?为了实现这一点,您的语言无法运行外部程序,否则,可能会意外地将其源代码的适当编码版本发送到命令行工具,如uuencode或rot-13或其他工具。几乎任何UNIX工具都可以充当解码器。

你的语言也不能自己运行,它不能是一个解释器,它必须是一个编译器。否则,它可以修改自己以输出自己的源代码。最重要的是,你的编译器不能用于用任意语言创建解释器,否则,你就有麻烦了。

一旦你削弱了语言,使其无法用于创建任意语言的解释器,就很难看出在什么意义上你会称之为图灵完备。为了被证明无法输出quine,你的语言必须按照图灵标准非常弱,当然也不是图灵完备的。

编辑-这场对话已经开始类似于关于一个别针头上可以放多少天使的古老争论。因此,我将尝试以一种严谨的方式来解决这个问题。虚拟化是不相关的,因为图灵机是计算设备的抽象模型,而在原始图灵机模型上实现的唯一I/O是一个可移动的磁带,在上面打印符号。相同的磁带用作内存,既用于数据,也用于程序存储。整个对话似乎取决于图灵机是否必须能够输出任意字符串才能被视为图灵完备。我将通过定义一个输出语言X的源代码的图灵机(图灵机L)来证明这一点。一个只编译代码的机器可能不符合图灵全的条件,因为该代码可能永远不会运行。因此,我们将把X语言的实现定义为解释器,而不是编译器。

如果X语言的源代码与程序代码/其他数据/其他输出混合,那么输出源代码是否有效,这是一个自然的问题。所以我们将定义这个图灵机在它的磁带上有一个零点。零点左边的任何东西要么是代码,要么是数据。零点右侧的所有内容都用于输出。图灵机L有许多(无限)不同的实现。但它们都有一个预定义的代码段,可以包含零个或多个字节的程序代码和/或数据。

它在所有方面都是一个具有一组正常指令的正常图灵机,除了添加两个数字的指令是以特殊方式实现的。该指令的代码实际上包含X语言源代码的适当编码版本。在正常情况下,添加功能的行为与典型图灵机的行为相同。但是每当磁带磁头遇到字符串"时;祝你生日快乐"在数据部分,加法指令的行为有所不同。在这种情况下,它将解码后的源代码打印到磁带输出部分的Language X"祝你生日快乐"可以很好地存在于磁带的代码/数据部分,而不会触发添加指令的替代行为。只有当磁带磁头实际遇到"时;祝你生日快乐"触发了替代行为。这意味着X语言必须解决停止问题,以防止图灵机L在不改变其行为的情况下将源代码输出到X语言-这是它永远无法做到的。这意味着,如果X语言是图灵完备的,那么它必须能够运行无限数量的图灵机L实现,将源代码输出到X语言,并且不能干扰,否则它将无法正确模拟X语言。

现在,我们仍然可以问,仅仅从内存中擦除输出的字符串是否有资格阻止图灵机L强制X语言(应该是图灵完备的)输出自己的源代码,同时保持X语言的图灵完备性。我坚持认为事实并非如此——我也会证明这一点。我们将简单地定义图灵机L的一个导数:图灵机L'。这一个几乎与图灵机L相同,并且与图灵机器L一样,它有许多不同的实现。唯一的区别是图灵机L'带有一个验证其输出部分完整性的机制。如果磁带磁头遇到";祝你生日快乐"则除了触发加法的交替行为之外;生日快乐登记簿";将其位从0翻转到1(它也可以翻转回来)。翻转这个比特后,图灵机L'将读取磁带的输出部分,寻找X语言的解码源代码。如果找到它,一切都正常。但如果没有,那么机器的JZ(如果为零则跳转)指令将表现出不同的行为(它将以一种不太可预测的方式移动磁头,就像它发生了故障一样),但只有一次;生日快乐登记簿";已翻转回来。此外,每当这种验证无法找到所需的源代码时,加法指令也会表现得不稳定,有时进行加法,有时使用将源代码输出到X语言的替代行为。现在,因为通过擦除图灵机L'(X语言的源代码)的输出,你已经改变了它的行为,现在,您必须解决停止问题,以便正确地模拟它,同时每次出现时仍将源代码擦除为X语言。这是不可能的。更糟糕的是,X语言无法提前知道图灵机L'是如何实现的,因为图灵机L和图灵机L'有无限多个有效实现。因此,X语言必须在图灵完备和拒绝输出自己的源代码之间做出选择。它不能两者兼得。

第2版-另一个证明。图灵机被定义为具有符号带、非空符号集和在这些符号的子集上定义的非空转换函数集(指令)的机器(移动带、加法、乘法,等等)。如果图灵机可以模拟任何其他图灵机,那么它就是图灵完备。一个图灵机可以被定义为只有两个符号,并且仍然可以是图灵完备的。例如,这些符号可以是<blank>1。现在,我们假设任何用符号<blank>1定义的全功能图灵机(无限多个图灵机,有些图灵机是完全的,有些不是),但我们使用X语言的源代码来代替1。因此,原则上,这个图灵机可以做任何任务。它可以计算斐波那契数;你好世界";,下棋,计算轨道上卫星的轨道参数等。每当它进行任何这些计算时,它都会向X语言输出(到其内部数据存储中)一些源代码副本,用空格分隔。X语言要么能够模拟这整类图灵机,要么就不能。如果X语言可以模拟这整类图灵机,那么它就可以是图灵完备的。如果不能,那就不是。每一个图灵机都可以在图灵机的整个可能性空间中模拟每一个图灵机。图灵机的不可计数的无穷大。

最新更新