我已经阅读了"what-is-turing-complete"和维基百科页面,但我对正式证据的兴趣不如对图灵完全的实际含义感兴趣。
我实际上要确定的是,我刚刚设计的玩具语言是否可以用作通用语言。我知道我可以证明我是否可以用它来编写图灵机。但是,在我确信成功之前,我不想进行这项运动。
是否有最低限度的功能,如果没有图灵完整性是不可能的? 是否有一系列功能几乎可以保证完整性?
(我的猜测是条件分支和可读/可写内存存储器会让我大部分都在那里)
编辑:
我想我已经说过“图灵完成”了。我试图以合理的信心猜测具有特定功能集的新发明的语言(或者具有特定指令集的VM)将能够计算任何值得计算的东西。我知道证明你可以用它建立图灵机是一种方式,但不是唯一的方法。
我所希望的是一系列指导方针,如:“如果它可以做X,Y和Z,它可以可能做任何事情。”
答案 0 :(得分:43)
您需要某种形式的动态分配构造(malloc
或new
或cons
将会这样做)以及递归函数或其他一些编写无限循环的方法。如果你有这些并且可以做任何有趣的事情,你几乎肯定是图灵完成的。
lambda演算与图灵机相当,如果你实现了lambda演算,那么编写lambda演算程序实际上非常有趣。 Way 比为图灵机编写程序更有趣!
图灵完全性的唯一实际意义我知道你可以编写不终止的程序。我使用了一些保证终止的特殊用途语言,因此不图灵完整。有时放弃额外的表达能力以换取有保证的终止是有用的。
答案 1 :(得分:31)
'Turing Completeness'描述了能够表达algorithmic computation,的任意Turing's Machine的属性。如果语言或逻辑系统具有此属性,则可将其描述为“图灵完成”。从实际角度来看,所有通用编程语言 - 以及令人惊讶的大量特殊目的 - 都可以通过适当宽松的定义来实现(见下文)。
然而,图灵完整性的严格定义意味着无限的存储容量,这当然在物理上是不可能的。鉴于此,没有物理机器可能是图灵完成,但是当将图灵完整性归因于编程语言时,这种约束通常是放松的(至少是非正式的)。对语言的图灵完整性的一个微不足道的测试是该语言是否可用于实现图灵机模拟器。
一个非图灵完备的广泛系统的例子是关系代数,这是Codd的论文A relational model for large shared data banks.中描述的SQL背后的理论基础。关系代数具有Godel Completeness的属性,这意味着它可以表达可以用first-order predicate calculus定义的任何计算(即普通逻辑表达式)。但是,它不是Turing-Complete,因为它无法表达任意算法计算。
请注意,大多数(如果不是全部)所有实用的SQL方言都会将纯关系模型与过程构造一起扩展到通常应用于编程语言的定义为图灵完成的程度。但是,单个SQL查询基本上不是。
Turing Complete特定领域语言的一些更令人震惊的例子是TeX和sendmail.cf,。在后一种情况下,实际上有一个着名的例子,有人使用sendmail.cf来implement a universal Turing Machine simulator.
答案 2 :(得分:10)
答案 3 :(得分:8)
非图灵完备的语言示例经常有有界循环,如:
for i=1 to N {...}
但缺少无界循环,它检查更一般的条件,例如:
while bool_expr {...}
如果所有可能的循环结构都有界限,那么您的程序将保证终止。并且,尽管无条件终止保证可能有用,但它也表明该语言不是图灵完备。
另请注意,确定所有可能的循环结构可能很困难;例如,我很确定C ++模板并不打算成为Turing-complete ......
答案 4 :(得分:7)
我不确定是否存在“最小功能集”,但为了证明语言是图灵完整的,您只需要证明它可以模拟另一个图灵完整系统(不一定是图灵机),如只要知道其他系统是图灵完整的。 http://en.wikipedia.org/wiki/Turing_complete#Examples列出了图灵完整系统的完整列表。其中一些比图灵机更简单。
答案 5 :(得分:3)
我想对Norman Ramsey所说的内容添加一个警告:图灵机具有无限的内存,因此被认为是图灵完备的编程语言只是假设内存也是无限的。
答案 6 :(得分:3)
Brainfuck是图灵完成的,只有循环结构和内存递增/递减,所以这就足够了。
另一方面,没有办法修改lambda演算中的任何值,但它是Turing完成的,因此很明显可以在没有可变内存的情况下进行。
你的程序很可能与lambda演算无关,所以对于一个实际的答案,最小值必须是
答案 7 :(得分:2)
我记不起用于图灵完整性的最小功能。但是,如果您的语言支持循环和条件分支,则图灵完成的可能性很大。然而,证明它的唯一方法仍然是模拟图灵机或其他图灵完整语言。
答案 8 :(得分:1)
如果你可以实现图灵机(只要它们可以实现,因为它们是具有无限内存的数学结构[磁带大小是infinte]),那么你可以确定图灵完成。
一些迹象:
答案 9 :(得分:1)
任何能够不终止的语言都是图灵完全。您可以通过赋予无限循环结构(如While循环或可以再次访问自身的Goto),或通过赋予它一般递归(通过让函数调用自身而不受限制)来使语言不具有终止能力。
一旦完成,您就可以执行其他图灵完整语言的解释,包括您自己的语言。
真正的问题是“它有什么用处?”如果您的语言将用于特定领域以解决特定问题,那么最好找到一种方法,用非图灵完备的语言来表达解决方案,从而保证给出答案。
你总是可以通过在任何其他图灵完备语言中写“做这个,那个或者其他;但用X提供的结果做”来添加图灵完整性,其中X由非图灵完整语言提供。< / p>
当然,如果你只想使用一种语言,最好是Turing Complete ......
答案 10 :(得分:1)
您可以尝试模拟OISC(一台指令集计算机)。如果您可以在那里模拟其中一条指令,那么由于这些单指令可以用于组成图灵完备机器,那么您已经证明您的语言也必须是图灵完成。
答案 11 :(得分:1)
是否有最低限度的功能,如果没有图灵完整性是不可能的? 是否有一系列功能几乎可以保证完整性?
是的,您需要以数据为条件进行控制:通常表示为if
。例如,+-*/
袖珍计算器不是图灵完备的,因为无法表达条件。
您还需要能够表达跳回到程序中的早期点,您可以在其上实现循环。例如,禁止向后跳转以保证程序将终止的BPF也不是图灵完成。
您需要一些既可读又可写且任意大的存储空间。例如,只有两个32位变量的语言受限于它可以计算的内容。对于存储的结构方式,您有很多选择:由指针,数组,堆栈,缺陷单元,纯数据结构等处理的内存。
除此之外,您还可以构建其他所有编程语言:它可能不容易或快速,但它已经足够了。
答案 12 :(得分:-4)
...而不是图灵完全的实际意义。
我怀疑图灵完成有任何实际意义。
如果你看一下Turing完整机器的一些例子,例如原始的Turing machine,你会发现这对于真正的计算是远远不够用的,这个概念必须只是理论上的兴趣