计算机科学-评估语言的“转换完整性”的实用准则是什么?

我已经阅读了“ what-is-turing-complete”和wikipedia页面,但是我对正式的证明兴趣不如对Turing Complete的实际意义感兴趣。

我实际上试图确定的是,我刚刚设计的玩具语言是否可以用作通用语言。 我知道我可以证明是否可以用它编写图灵机。 但是在我相当确定成功之前,我不希望进行该练习。

是否有最少的功能集,否则没有图灵完整性是不可能的?是否有实际上可以保证完整性的一组功能?

(我的猜测是条件分支和可读/可写内存存储将带给我大部分帮助)


编辑:

我想我已经说“完成”了。 我试图以合理的信心猜测具有某些功能集的新发明的语言(或者具有特定指令集的VM)将能够计算出任何值得计算的东西。 我知道证明用它构建图灵机是一种方法,但不是唯一的方法。

我所希望的是一组准则,例如:“如果它可以执行X,Y和Z,那么它可能可以执行任何操作”。

13个解决方案
44 votes

您需要某种形式的动态分配构造(mallocnewcons将要做)以及递归函数或某种其他方式来编写无限循环。 如果您有这些知识,并且可以做任何有趣的事情,那么您几乎可以肯定是图灵完备的。

lambda演算的功能与Turing机器相当,并且如果您实现lambda演算,编写lambda演算程序实际上非常有趣。 比为图灵机编写程序更有趣!

我知道的图灵完备性的唯一实际含义是,您可以编写不终止的程序。 我使用了几种特殊的语言来保证终止,因此它们不是图灵完整的。 有时放弃额外的表达能力以换取有保证的终止是有用的。

Norman Ramsey answered 2020-06-30T04:51:14Z
31 votes

“图灵完备性”描述了能够表达任意算法运算的属性,这首先是图灵机的要点。 如果语言或逻辑系统具有此属性,则可以将其描述为“转换完成”。 从实践的角度来看,所有通用编程语言(以及数量众多的特殊用途编程语言)都可以通过适当的宽松定义来做到这一点(请参见下文)。

但是,对图灵完整性的严格定义意味着无限的存储容量,这当然在物理上是不可能的。 鉴于此,没有物理机器可能是图灵完备的,但是在将图灵完备性归于编程语言时,通常会(至少非正式地)放松此约束。 对一种语言的图灵完整性的一项简单测试是,该语言是否可用于实现图灵机模拟器。

关系代数(Relational Algebra)是一个不是图灵完备的广泛系统的例子,这是SQL背后的理论基础,如Codd的论文《大型共享数据库的关系模型》中所述。 关系代数具有Godel完整性的特性,这意味着它可以表示可以根据一阶谓词演算(即普通逻辑表达式)定义的任何计算。 但是,它不是图灵完备的,因为它不能表示任意算法的计算。

注意,即使不是全部,大多数实用的SQL方言也将具有过程结构的纯关系模型扩展到某种程度,即按照通常应用于编程语言的定义,它们可以达到图灵完备的程度。 但是,单个SQL查询基本上不是。

图灵完备的特定于域的语言的一些更令人震惊的例子是TeX和sendmail.cf。 在后一种情况下,实际上有一个著名的例子,有人使用sendmail.cf实现通用的Turing Machine仿真器。

ConcernedOfTunbridgeWells answered 2020-06-30T04:51:54Z
10 votes

如果您可以使用您的语言编写Brainf $&#解释器,则它是图灵完备的。 LOLCODE正是以这种方式证明是图灵完备的。

Luke Woodward answered 2020-06-30T04:52:15Z
8 votes

非图灵完备的语言示例经常有界循环,例如:

for i=1 to N {...}

但是缺少检查更一般情况的无界循环,例如:

while bool_expr {...}

如果所有可能的循环构造都受到限制,则可以保证程序会终止。 并且,尽管无条件终止保证可能有用,但这也表明该语言不是图灵完备的。

还要注意,很难确定所有可能的循环结构。 例如,我很确定C ++模板不打算是图灵完备的...

comingstorm answered 2020-06-30T04:52:49Z
7 votes

我不确定是否有“最少的功能集”,但是要证明一种语言是图灵完整的,只需证明它可以仿真另一个图灵完整的系统(不一定是图灵机)即可。 已知其他系统是图灵完整的。 [http://en.wikipedia.org/wiki/Turing_complete#Examples]包含图灵完整系统的完整列表。 其中一些比图灵机更简单。

Nate879 answered 2020-06-30T04:53:10Z
3 votes

我想在诺曼·拉姆齐(Norman Ramsey)所说的话中加一个警告:图灵机具有无限的内存,因此仅在内存也无限的前提下,才被认为是图灵完整的编程语言。

Christian Lindig answered 2020-06-30T04:53:31Z
3 votes

Brainfuck已经完成了Turing,并且仅具有循环结构和内存增量/减量,因此就足够了。

另一方面,无法修改lambda演算中的任何值,但是它是Turing完整的,因此显然可以在没有可变内存的情况下进行。

不过,您编写的程序最有可能与lambda演算无关,因此对于实际的答案,最小值必须为

  1. 写入变量的方法
  2. 读取变量的方法
  3. 有条件的goto的一种形式(if语句,while循环等)
tomjen answered 2020-06-30T04:54:13Z
2 votes

我不记得看到图灵完整性的最低功能之类的东西。 但是,如果您的语言支持循环和条件分支,那么图灵完成的机会就很大。 但是,证明它的唯一方法仍然是模仿Turing Machine或另一种Turing Complete语言。

PolyThinker answered 2020-06-30T04:54:33Z
1 votes

如果您可以实现Turing机器(就它们可以实现的程度而言,因为它们是具有无限内存的数学结构[磁带大小是无限的]),那么您可以确定它已经完成了Turing。

一些迹象:

  • 您可以检查内存并根据当前值对其进行操作,也可以使用它来控制程序流。
  • 可以为该内存分配内存,可以附加到字符串的字符串,可以通过递归分配内存的堆栈等。
  • 程序流可以通过迭代或通过基于选择的递归进行。
answered 2020-06-30T04:55:11Z
1 votes

任何具有非终止能力的语言几乎都是图灵完备的。 您可以通过提供无限制的循环结构(如While循环或可以再次到达自身的Goto)或通过一般递归(让函数不受限制地调用自身)来使语言具有非终止能力。

完成学习后,您可以执行诸如解释其他图灵完成语言(包括您自己的语言)之类的事情。

真正的问题是“这有什么好处?” 如果要在特定领域中使用您的语言来解决特定问题,则最好找到一种方法以非图灵完整的语言来表达解决方案,从而保证给出答案。

您始终可以通过使用其他任何图灵完成语言编写“执行此操作,执行该操作或执行任何操作;但是使用X提供的结果来执行此操作”来添加图灵完成度,其中X由非图灵完成语言提供。

当然,如果您只想使用一种语言,最好选择图灵完备...

Retra answered 2020-06-30T04:55:50Z
1 votes

您可以尝试模拟OISC(一台指令集计算机)。 如果您可以在此处模拟其中一条指令,则由于可以使用这些单一指令来构成图灵完成机,因此您已经证明您的语言也必须是图灵完成。

Lie Ryan answered 2020-06-30T04:56:11Z
1 votes

是否有最少的功能集,否则没有图灵完整性是不可能的? 是否有实际上可以保证完整性的一组功能?

是的,您需要控制流取决于数据:通常表示为if。例如,+-*/袖珍计算器不是图灵完备的,因为无法表达条件。

您还需要能够表示跳回到程序中的较早点,在此点之前您可以实现循环。 例如,禁止向后跳转以确保程序终止的BPF也不是图灵完成的。

您需要一些可读可写且任意大的存储。 例如,只有两个32位变量的语言在计算能力上受到限制。 您有许多关于存储结构的选项:指针,数组,堆栈,cons单元,纯数据结构等寻址的存储器。

在这些基础之上,您可以构建所有其他编程语言:可能不容易也不很快,但是足够了。

poolie answered 2020-06-30T04:56:50Z
-4 votes

...而不是图灵完善的实际意义。

我怀疑图灵系统的完善是否有任何实际意义。

如果您查看一些图灵完整机器的示例,例如原始的图灵机,您会发现到目前为止,对于真正的计算而言,它们远非有用,因此该概念仅在理论上有意义。

David Norman answered 2020-06-30T04:57:20Z
translate from https://stackoverflow.com:/questions/449014/what-are-practical-guidelines-for-evaluating-a-languages-turing-completeness