评估语言"图灵完整性"的实用指南是什么?

ASh*_*lly 46 computer-science language-design turing-complete

我读过"什么是图灵完整"和维基百科页面,但我对正式证据不太感兴趣,而不是图灵完全的实际意义.

我实际上要确定的是,我刚刚设计的玩具语言是否可以用作通用语言.我知道我可以证明我是否可以用它来编写图灵机.但是,在我确信成功之前,我不想进行这项运动.

有没有最低限度的功能,没有图灵完整性是不可能的?是否有一系列功能几乎可以保证完整性?

(我的猜测是条件分支和可读/可写的内存存储将使我的大部分方式)


编辑:

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

我所期待的是一套类似的准则:"如果可以做X,Y和Z,它可以或许做任何事情".

Nor*_*sey 44

你需要某种形式的动态分配结构(的mallocnewcons会做),要么递归函数或写一个无限循环的其他方式.如果你有这些并且可以做任何有趣的事情,你几乎肯定是图灵完成的.

lambda演算与图灵机相当,如果你实现lambda演算,写lambda演算程序实际上非常有趣. 比图灵机编写程序的更多乐趣!

我所知道的图灵完全性的唯一实际意义是你可以编写不终止的程序.我使用了一些保证终止的特殊用途语言,因此不是图灵完备的.有时放弃额外的表达能力以换取有保证的终止是有用的.

  • 需要动态分配的确不是这样.最终的思想实验图灵机只有一个位数组.一个足够大的可索引阵列就足够了.显然,如果你愿意,你可以在语言中编写动态分配. (4认同)
  • @poolie - 从技术上讲,数组需要无限的"图灵完整性"的真正定义.能够动态分配存储类型近似于此属性. (3认同)
  • 使用`malloc`,内存有限的事实不再是语言的一部分.内存仅受实现/目标计算机对的限制.这是一个重要的区别.请参阅https://esolangs.org/wiki/Bounded-storage_machine (3认同)
  • @concerned,如果您要坚持“无限”,那么您也需要能够分配无限内存,并且没有实际的系统实际上允许这样做。但出于实用目的,我们仍然说它们是图灵完备的,只要有足够的空间来进行计算。这就是为什么我说“足够大”。 (2认同)

Con*_*lls 31

"图灵完整性"描述了能够表达任意算法计算的属性,这首先是图灵机器的重点.如果语言或逻辑系统具有此属性,则可将其描述为"图灵完成".从实际角度来看,所有通用编程语言 - 以及令人惊讶的大量特殊目的 - 都可以通过适当宽松的定义来实现(见下文).

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

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

请注意,大多数(如果不是全部)所有实用SQL方言都将纯关系模型与过程构造扩展到通常应用于编程语言的定义为图灵完成的程度.但是,单个SQL查询基本上不是.

Turing Complete特定于域的语言的一些更令人震惊的例子是TeXsendmail.cf , . 在后一种情况下,实际上有一个着名的例子,有人使用sendmail.cf来实现通用的图灵机模拟器.

  • 这里有很多好消息.不知道为什么你的回答是在-1时我来到它. (2认同)

Luk*_*ard 10

如果你能用你的语言写一个Brainf $&# interpreter,那就是Turing-complete. 事实证明,LOLCODE正是以图灵完成的方式完成的.

  • @HophatAbc"我的生活是**图灵**完成." FTFY (6认同)
  • 显然有人需要为HQ9 ++添加另一个扩展来解释Brainf $&#.... (5认同)
  • 我找到了.HQ9 + B.我的生活是完整的.http://esolangs.org/wiki/HQ9%2BB (3认同)

com*_*orm 8

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

for i=1 to N {...}
Run Code Online (Sandbox Code Playgroud)

但缺乏无限循环,检查更一般的条件,如:

while bool_expr {...}
Run Code Online (Sandbox Code Playgroud)

如果所有可能的循环结构都有界限,那么您的程序将保证终止.并且,尽管无条件终止保证可能有用,但它也表明该语言不是图灵完备的.

还要注意,确定所有可能的循环结构可能很困难; 例如,我很确定C++模板并不打算成为Turing-complete ......


Nat*_*879 7

我不确定是否存在"最小功能集",但为了证明语言是图灵完整的,您只需要证明它可以模拟另一个图灵完整系统(不一定是图灵机),只要已知其他系统是图灵完整的.http://en.wikipedia.org/wiki/Turing_complete#Examples列出了图灵完整系统的完整列表.其中一些比图灵机更简单.


tom*_*jen 5

Brainfuck 是图灵完备的,只有循环结构和内存递增/递减,所以这就足够了。

另一方面,没有办法修改 lambda 演算中的任何值,但它是图灵完备的,因此显然可以在没有可变内存的情况下做到这一点。

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

  1. 一种写入变量的方法
  2. 一种读取变量的方法
  3. 条件 goto 的一种形式(if 语句、while 循环等)