是否专门为不打印quins而构建的语言仍然完整?

时间:2017-08-18 16:16:00

标签: output semantics turing-complete quine

This question说:

  

任何编程语言   图灵完成,并且能够   输出任何字符串(由可计算的   函数的字符串作为程序 -   这是一个技术条件   满意每一个节目   存在的语言)有一个quine   程序(实际上,无限多   quine程序,和许多类似的   好奇心如下   定点定理。

现在,我说创建语言X ..语言X有以下输出处理程序:

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

正如您所看到的,这可以防止源以任何形式或形式输出。这很简单。假设语言X的口译员在屏幕上一直检查它的来源。如果找到了源,则在它到达屏幕之前将其删除。鉴于一个空程序将抛出一个非空白错误,语言x仍然是完整的吗?为什么呢?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如何证明您的语言不会被欺骗来输出其自身的源代码?为此,您的语言将无法运行外部程序,否则,可能会意外地将其源代码的适当编码版本发送至命令行工具,例如uuencode或rot-13等。几乎任何UNIX工具都可以充当解码器。

您的语言也将无法运行,不能是解释器,必须是编译器。否则,它可以修改自身以输出自己的源代码。最重要的是,您的编译器无法用于创建任意语言的解释器,否则,您将面临困境。

一旦您限制了该语言以致于不能使用它来创建任意语言的解释器,那么很难看出您在某种意义上将其称为图灵完成。为了避免因输出奎因而造成残障,根据图灵标准,您的语言必须极其虚弱,当然,图灵也不完整。

编辑-对话已经开始像一个古老的争论,即在一个大头针上可以放置多少个天使。因此,我将尝试以严格的方式解决这个问题。虚拟化是无关紧要的,因为图灵机是计算设备的抽象模型,并且在原始图灵机模型上实现的唯一I / O是可移动的磁带,可在其上打印符号。相同的磁带用作存储器-既用于数据又用于程序存储。整个对话似乎取决于图灵机是否必须能够输出任意字符串才能使图灵完整。我将通过定义输出语言X的源代码的Turing机器(Turing机器L)来证明它可以做到。仅编译代码的机器可能不符合Turing的要求,因为该代码可能永远不会运行。因此,我们将定义语言X的实现为解释器,而不是编译器。

关于语言X的源代码是否与程序代码/其他数据/其他输出混合在一起是否计数,存在一个自然的问题。因此,我们将图灵机定义为在其磁带上具有零点。零点左侧的任何内容都是代码或数据。零点右边的所有内容均用于输出。图灵机L具有许多(无限)不同的实现方式。但是它们都有一个预定义的代码段,可以包含零个或多个字节的程序代码和/或数据。

在所有方面,具有正常指令集的普通图灵机,只是以特殊方式实现将两个数字相加的指令。该指令的代码实际上包含语言X源代码的适当编码版本。在正常情况下,添加功能的行为与典型的图灵机一样。但是,只要磁带头在数据部分遇到字符串“祝您生日快乐...”,添加指令的行为就会有所不同。在这种情况下,它将在磁带的输出部分中将解码后的源代码输出为LanguageX。磁带的代码/数据部分中可能存在“祝您生日快乐...”,而不会触发添加指令的替代行为。只有当磁带头实际上遇到“祝您生日快乐...”时,才会触发替代行为。这意味着语言X必须解决停止问题,以防止图灵机L将源代码输出到语言X而不改变其行为-这是它永远不会做的。语言X必须能够运行(模拟)图灵机L才能完成图灵测试。这意味着,如果Language X已完成Turing,则它必须能够运行无数Turing机器L实现,这些实现会将源代码输出到Language X,并且不能干涉,否则将无法正确模拟LanguageX。

现在,询问是否仅从内存中删除输出的字符串是否有资格阻止Turing机器L强迫Language X(假定为Turing完成)输出其自己的源代码-同时保持Language X的Turing完整性仍然有效。 。我坚持认为并非如此,我也将证明这一点。我们将简单定义图灵机L的导数:图灵机L'。这与图灵机L几乎相同,并且像图灵机L一样,它具有许多不同的实现方式。唯一的区别是,图灵机L'带有用于验证其输出部分完整性的机制。如果磁带头遇到“祝您生日快乐...”,那么除了触发加法的替代行为外,名为“祝生日快乐寄存器”的特殊寄存器会将其位从0翻转为1(它也可以翻转)。翻转该位后,图灵机L'将读取磁带的输出部分,以查找语言X的解码源代码。如果找到它,则一切正常。但是,如果不是这样,则机器的JZ(如果为零则跳转)指令的行为将有所不同(它将以不太可预测的方式移动磁带头,就好像它在发生故障一样)-但只有一次“生日快乐寄存器”已经倒退了。此外,每当此验证未能找到所需的源代码时,加法指令也将不正常地运行,有时会做加法,有时还会使用将源代码输出到Language X的替代行为。现在,因为擦除了Turing的输出您已经更改了机器L'(语言X的源代码)的行为,现在必须解决暂停问题,以便正确模拟它,同时每次出现时仍将其擦除为语言X。这是不可能的。更糟糕的是,语言X 无法提前知道图灵机L'的实现方式,因为存在无限数量的图灵机L和图灵机L'有效实现。因此,语言X必须在图灵完整和拒绝输出其自己的源代码之间进行选择。它不能同时做到。

EDIT2-另一个证明。图灵机被定义为具有符号带,非空符号集和在这些符号子集上定义的非空过渡函数(指令)集的机器(移动带,加,乘,随便什么) 。如果图灵机可以模拟任何其他图灵机,则它是 Turing complete 。可以将图灵机定义为仅具有两个符号,并且仍然可以完成图灵。例如,这些符号可以是<blank>1。现在,我们假设我们使用符号<blank>1定义的所有功能完备的图灵机(无限数量的图灵机,有的图灵机完成,有的没有图灵机),而不是1我们将源代码用于语言X。因此,该Turing机器原则上可以完成任何任务。它可以计算斐波纳契数,打印“世界你好”,下棋,计算轨道上卫星的轨道参数等,等等。无论何时进行这些计算,它都会输出一定数量的副本(到其内部数据存储区)源代码为X语言,中间用空格分隔。语言X能够模拟整个图灵机类,或者不是。如果语言X可以模拟整个图灵机类,那么可以是图灵完整的。如果不能,则不能。每台图灵完整机器都可以在图灵机的整个可能性空间中模拟每台图灵机。图灵机无穷无尽。