所有图灵语言是否可以互换


26

注意,虽然我知道如何编程,但我还是CS理论的初学者。

根据这个答案

图灵完整性是可计算性的抽象概念。如果一种语言是图灵完备的语言,那么它就可以进行任何其他图灵完备的语言可以进行的计算。

写在任何图灵完备的语言的任何程序可以在另一个被改写

好。这很有道理。我可以将C转换(编译)为Assembly(并且每天都做!),也可以将Assembly转换为C(您可以使用C编写虚拟机)。同样适用于任何其他语言-您可以将任何一种语言编译为Assembly,然后在用另一种其他语言编写的VM中运行它。

但是,可以任意写在一个图灵完备的语言程序重新编写的另一个?

如果我的部件具有LIGHTBUTTON操作码怎么办?在没有灯泡的情况下,我实际上无法在系统(语言)上模拟该语言。

好。因此,您会说,由于我们正在处理计算机理论,因此我们不在讨论物理设备限制。

但是,没有乘法的设备呢?师?据我所知(尽管这更多是关于math.SE的问题),无法模拟加法和减法的乘法(绝对不是除法)[1]。

那么,“图灵完整语言”(可以添加,减去和跳转)如何模仿另一种可以添加,减去,乘法和跳转的语言呢?

编辑

[1]。关于任意实数。


33
实数属于Hyper-Turing-Computation领域。图灵机无法处理实数,因此,它们与图灵完备性无关。
约尔格W¯¯米塔格

3
相关:只有一条指令的汇编语言指令集仍然足够强大,可以构建通用计算机:en.wikipedia.org/wiki/One_instruction_set_computer。例如,使用内存操作数“如果小于或等于零,则减去并分支”。与现代的x86相比,它的速度较慢,但是任何程序的性能比都是有限的。
彼得·科德斯

1
图灵完备性没有物理(实际上存在的)机器,也永远不可能如此,因为图灵完备性需要无限的存储,而宇宙也不是无限的。因此,对于两个抽象机是否相等的肯定回答并不能帮助您回答这些机器的两个物理近似值是否相等的问题。

2
@PeterCordes:我假设当您说比率是有限的时,您只是意味着任何在有限的时间内完成的任务都将在两者中的有限时间内完成,而不是针对任何特定的机器(不包括输入)对于某些输入而言,该比率可能有多高的任何有限限制。我认为可以构造图灵完备的机器,为其选择可以使比率任意高的输入的图灵完备机器,甚至可能不是输入大小的可计算函数。
超级猫

6
我不知道您的想法是“一个人不能用加法和减法来模拟乘法(绝对不是除法)”。当我们学习如何繁殖时,它是从小学教来的
phuclv '18

Answers:


55

图灵完备性只说一件事:计算模型是图灵完备,如果可以用图灵机建模的任何计算也可以用该模型建模。

那么,图灵机可以模拟哪些计算?嗯,首先,艾伦·图灵和他的所有同事只对自然数函数感兴趣。因此,图灵机(以及λ演算,SK组合器演算,μ递归函数等)仅谈论自然数上函数的可计算性。如果您不是在谈论自然数的函数,那么图灵完备性的概念甚至没有意义,根本就不适用。

但是请注意,我们可以将许多有趣的事物编码为自然数。我们可以将字符串编码为自然数,可以将图形编码为自然数,可以将布尔值编码为自然数。我们可以将图灵机编码为自然数,这使我们能够创建谈论图灵机的图灵机!

而且,当然,并非自然数上的所有函数都是可计算的。图灵机只能对自然数计算某些函数,λ演算只能对自然数计算某些函数,SK组合器演算只能对自然数计算某些函数,…。令人惊讶地(或并非如此),事实证明,每个计算模型(实际上可以在我们的物理宇宙中实现)都可以在自然数上计算相同的函数(至少对于迄今为止我们找到的所有模型)。[注:显然,存在较弱的计算模型,但我们尚未找到一个更强大的模型,但其中一些显然与我们的物理宇宙不兼容,例如使用实数或时间旅行的模型。]

事实证明,经过很长时间的搜索,我们发现每一次它们都可以计算出完全相同的函数,这是Church-Turing-Thesis的基础。计算模型同样强大,并且所有模型都体现了“可计算”的“理想”概念。(CTT还有第二个更哲学的方面,即遵循算法的也可以计算出TM可以计算出的功能完全相同,而仅此而已。)

但是,这些都没有说明

  • 各种模型的效率如何
  • 他们使用起来有多方便
  • 什么别的,他们能做的,除了在自然数计算功能

恰恰是计算(和编程语言)的不同型号之间的差异开始发挥作用。

作为不同性能的示例,随机存取机和图灵机都可以复制阵列。但是,一个RAM需要操作来做到这一点,而TM需要的操作,因为它需要跨跳过用于复制每个元素的数组的元素,还有要复制的元素。Ô 小号Ž ë 2 - [R [R Ý小号Ž Ë 一个ř ř 一个ý小号Ž Ë 一个ř ř 一个ÿO(sizearray)O(sizearray2)sizearraysizearray

作为提供不同便利的示例,您可以仅比较用高级语言编写的代码,用汇编编写的代码以及用于解决同一问题的TM的描述。

而且您的电灯开关就是第三种差异的一个例子,某些模型可以完成的事情与自然数无关,因此与图灵完备性无关。

要回答您的特定问题:

但是,可以任意写在一个图灵完备的语言程序重新编写的另一个?

否。仅当程序对自然数计算图灵可计算函数时。即使那样,它可能仍需要复杂的编码。例如,λ演算甚至没有自然数,它们需要使用函数进行编码(因为函数是λ演算唯一的东西)。

输入和输出的这种编码可能非常复杂,就像表达算法一样。因此,尽管可以重写任何程序都是正确的,但是重写后的程序可能更复杂,更大,使用更多的内存并且运行更慢。

如果我的部件具有LIGHTBUTTON操作码怎么办?在没有灯泡的情况下,我实际上无法在系统(语言)上模拟该语言。

灯泡不是自然数上的图灵可计算函数。实际上,灯泡既不是函数也不是计算。打开和关闭灯泡是I / O的副作用。图灵机不对I / O副作用建模,图灵完成度与它们无关。

关于任意实数。

图灵完备只处理自然数上的可计算函数,而不涉及实数。

当涉及像您这样的问题时,图灵完整性根本不是很有趣,这有两个原因:

  1. 这不是一个很高的障碍。所有你需要的是IFGOTOWHILE,和一个整数变量(假设变量可以持有任意大的整数)。或者,递归。图灵完成了很多很多东西。纸牌游戏《魔术:聚会》完成。CSS3是图灵完备的。该sendmail配置文件是图灵完备。英特尔x86 MMU已完成图灵化。英特尔x86 MOV指令是图灵完成的。PowerPoint动画是图灵完整的。Excel(不带脚本,仅使用公式)是图灵完备的。BGP路由协议是Turing-complete。sed是图灵完成的。Apache mod_rewrite规则是图灵完备的。Google“ (偶然或令人惊讶地)完成了巡回演出”以查找其他一些有趣的示例。如果几乎所有内容都是图灵完备的,那么图灵完备就不再是一个有趣的属性。
  2. 实际上没有必要有用。很多有用的东西并不完整。3版本之前CSS不是图灵完备的(而事实上,CSS3 不实际使用人)。1999年之前的SQL还不是图灵完整的,但是,即使在那时,它还是非常有用的。没有其他库的C编程语言似乎不是图灵完备的。从定义上讲,依存类型的语言或多或少不是图灵完备的,但是,您可以在其中编写操作系统,Web服务器和游戏。

Idris的作者Edwin Brady使用“俄罗斯方块完全”一词来谈论这些方面。对Tetris-complete的定义不严格(除了显而易见的“可以用来实现Tetris”),但它包含诸如足够高水平和足够表现力的内容,使您可以编写游戏而不会发疯,能够与外界交互(输入和输出),能够表达副作用,能够编写事件循环,能够表达响应式,异步和并发编程,能够与操作系统交互,能够与外部库进行交互(换句话说:能够调用并被C代码调用)等等。与图灵完备性相比,这些是通用编程语言更有趣的功能。


您可能会发现我对您链接的问题的回答很有趣,即使回答了不同的问题,它也涉及到一些相同的观点。


7
我真的很喜欢这个答案,但我认为值得注意的是,我们可以用自然数来表示各种有趣的事物。例如,我们可以用自然数表示字符串,我们可以用自然数表示图形,我们可以用自然数表示计算机内存的整个状态。实数可以被编码为自然数的函数,而自然数上的(许多)函数可以被自然数编码。因此,限制从自然数到自然数的功能并不是一个很大的限制-除非天黑了,并且您希望计算机打开灯。
Theodore Norvell '18

3
很好的答案,但这是:“成为图灵完备的人不再是一个有趣的财产”,这是完全错误的。如果某件事情是图灵完备的,则其停顿问题是通过可计算地减少图灵机的停顿问题来解决的。例如,纸牌游戏《魔术:聚会》是图灵完成的。这意味着它的规则是不确定的,也就是说,在一般情况下,不可能以可计算的方式推断出接下来的游戏状态,这是一个非常有趣的特性。更严重的是,我们使用图灵完备性和约简来证明问题无法确定。
quicksort

Turing和他的同事对自然数的功能很感兴趣,但是Turing 机器并不真正处理数字,而是处理符号字符串。显然,您可以简单地将已知有限字母中符号的有限界限解释为自然数,但是TM不会直接用输入来做“数字”操作,它们只是操纵“数字”。从TM的标准描述到“自然数函数”,实际上需要一点逻辑。使用TM时,您将自然数编码为字符串,而不是字符串编码为数字。

这显然是一个很好的答案,但我担心这超出了OP的理解。OP已经对在实数(的有限子集)上实现乘法感到困惑。鉴于此,您的回答似乎暗示着图灵完备的编程语言实际上不能交换用于纯粹的计算目的,而实际上却是可以交换的(因为现代CPU所做的一切 -不仅仅是某些事情-都可以被编码为自然的)数字)。
康拉德·鲁道夫'18

9
@TheodoreNorvell关于用自然数编码实数的主题。实际上,几乎所有实数都不能用自然数编码。可以通过自然数编码的实数集最多可数为无限。而且因为它只有无限多个,所以该集合的度量为零。说我们可以用自然数来表示实数通常有点不屑一顾,因为我们只能代表其中的无穷小部分,或更准确地说:0%。
Shufflepants,

9

当然,您可以使用加法和减法来实现乘法:

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

您可能不会这样做的事实并不会减少它的可能性。

除法再难不过了:

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

您如何看待乘法和除法实际上是由CPU电路执行的?提示:它不是一个巨大的查找表。由于还使用了移位,因此它比上述方法更有效,但是从根本上实现了加法和减法。


4
@touring:它对浮点运算很好。首先,对尾数进行归一化,以使分子具有尾随二进制0。然后,您进行整数除法。最后,您修复了指数:原始指数的差加上归一化的校正。2precision
rici

7
@touring:您知道,在有浮点协处理器之前就可以使用浮点算法。
rici

6

图灵完备性没有物理(实际上存在的)机器,也永远不可能如此,因为图灵完备性需要无限的存储,而宇宙也不是无限的。

因此,对于两个抽象机是否相等的肯定回答并不能帮助您回答这些机器的两个物理近似值是否相等的问题。

因此,(例如)两种语言的抽象模型的图灵等效性并不意味着每种语言都可以计算另一种语言在实践中可以计算的一切。一个人可能比另一个人先于身体上的限制。


但是问题是关于语言的。它提到特定的机器,但这只是因为他没有意识到几乎没有真正的机器以实数进行运算。
Shufflepants

3

您可以将乘法和除法分别实现为重复加法和减法,注意和。nm=n+n(m1)m/n=1+(mn)/n

实际上,操作“加1”,“减1”和“如果指定的寄存器为零,则有条件跳转”足以使计算模型图灵完备(请参阅2计数器机器作为参考)。非常小的图灵完备的计算模型)。

也可以通过保留计算复杂性的方式来实现它们。首先,请注意乘以是“自由的”()。使用乘,循环和减法,我们可以轻松实现欧几里得算法(用于除以2)。通过乘以二除,我们可以实现俄语乘法,观察到和。使用任意乘法,我们最终可以实现完整的欧几里得除法算法。22n=n+n2m×2n=2m×nm×(2n+1)=m+2m×n


3

TL;博士 - 图灵机只是一般逻辑系统的操作的基本逻辑描述。他们可以完成我们可以描述的大多数工作,包括调用专用操作码和构造数学运算。


如果我的部件具有LIGHTBUTTON操作码怎么办?在没有灯泡的情况下,我实际上无法在系统(语言)上模拟该语言。

在图灵模型中,诸如LIGHTBUTTON操作码之类的符号仅仅是图灵计算机使用的任何字母的字符串。

因此,图灵机将负责产生字符串"LIGHTBUTTON"或对应于该操作码的一些整数值;外部实体是否对其采取行动不是Turing计算机的业务。

C程序具有相同的限制。这LIGHTBUTTON就是说,C程序只能为调用操作码,但是CPU是否实际执行与该操作码相关的操作取决于CPU。


但是,没有乘法的设备呢?师?据我所知(尽管这更多是关于math.SE的问题),无法模拟对任意实数进行加减运算的乘法(绝对不是除法)。

是的,图灵机可以做到这些事情,即使是实数,也可以达到任何人类可描述的逻辑所能达到的程度。图灵机可以像规则110蜂窝自动化一样简单。

诀窍是利用机器自然具备的物理能力来构建逻辑系统。例如,主流CPU可以进行乘法和除法,因为它们具有算术逻辑单元(ALU)。但是ALU并不是魔术。它们本身只是简单的逻辑门。那些逻辑门由晶体管制成。这些晶体管是用掺杂的沙子制成的。

因此,要让图灵完备的设备进行数学运算,只需以这种方式进行编程即可。

实际上,您可以在图灵机上进行真正的计算!为了证明这一点,这里是WolframAlpha计算。我的意思是,当然,图灵机不能在有限时间内无限扩展,但这没关系;没有人可以无限扩展,包括人类。但是,如果我们将人类用实数进行数学运算(例如归功于人类,那么我们就必须给予图灵机同样的功劳。ππ=0π π - π = 0ππππ=0


3

但是,可以将用图灵完整语言编写的程序改写成另一种语言吗?

如果程序的输入是任意长的位序列,而输出也是任意长的位序列,则为“是”。假设您有时间和精力来重写它,并且您不关心性能,并且对于这两种实现都有足够的物理内存。

意味着两种图灵完备的语言不可互换的实际考虑因素包括:

  • 它们支持不同类型的输入和输出(例如,SQL数据库访问)

  • 它们具有不同的数据类型库(例如,对Unicode字符串的支持)

  • 它们提供了针对不同任务(例如对象,线程,协程,一流功能)而优化的不同编程范例。

  • 它们提供了不同的函数库(例如XML解析和序列化)


1

不。图灵完备性与程序无关,它与数学函数(或算法)有关。您可以使用C语言进行任何算法-任何计算 -都可以使用任何其他图灵完备的语言(这很明显)进行。但是图灵完整性实际上并没有说您可以进行I / O。它根本没有谈论硬件。只是计算。

您可以扩展你想要的任何硬件操作的图灵完备的语言(从技术上说,这是怎么fputcfgetc工作在C)。如果您使用两种图灵完备的语言,并使用相同的硬件特定操作对其进行扩展,则它们将保持可互换性。因此,带有LIGHTBULB操作的汇编语言比图灵完备功能强大。您可以说图灵完成了LIGHTBULB。为了使任何其他语言与之相同,它还需要在图灵上完成LIGHTBULB。最简单的方法是向其添加LIGHTBULB原语/指令/函数/等。

这就是为什么C实现通常支持内联汇编程序,或记录一种调用用汇编程序编写的函数的方法的原因,以及为什么其他语言的实现通常提供一种调用用C语言编写的函数的原因的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.