Answers:
我总是用 -recursive函数固定它。这是定义整个可计算函数集的内容。它是包含resp的最小函数集。禁止:
检查上面的链接了解详细信息;您会看到它构成了非常紧凑的编程语言。编程也太可怕了-没有免费的午餐。如果您放弃其中任何一个,您将失去全部力量,因此这是一组最小的公理。
您可以将这些文字转换为WHILE程序的基本语法元素,即
0
_ + 1
x
_; _
for ( x to 0 ) do _ end
while ( x != 0 ) do _ end
while
6中的循环与常数零进行比较,因此变量只能通过规则2递增,并且没有从(规则1)开始的负常数,因此while
6中的循环要么没有输入(x = 0)要么是无限的( x> 0,并且循环体无法减小它)。
_ - 1
并且如果没有,我将无法想到一种实现该模拟的方法for
。感谢您抓住这一点!(“更好”是什么?包括“ _ - 1
或” for
?)
是否存在需要以一种编程语言执行的一组计算才能被视为图灵完成?
是的,为了被视为图灵完整,一种编程语言需要能够执行可以由图灵机执行的任何计算。因此,至少有人可能会说,您需要能够在其中实现通用的Turing机器-或任何其他Turing完整语言的解释器。
据我从维基百科得知,该语言需要支持递归,或者看起来必须能够不间断地运行。这就是全部吗?
否。例如,仅允许递归操作的语言(即,您只能编写的唯一函数f(x) = f(x)
是)不是图灵完整的,因为您可以在其中编写的程序永远不会终止。需要能够实现Turing机器可以执行的任何计算,因此显然这是不够的。
同样,语言不必以您所想的方式支持递归。只是表达循环的一种不受限制的方式。那可能是递归,但也可能是while循环或goto。完全没有功能的语言仍然可以成为图灵完整的语言。同样,循环或递归函数也不是足够的条件。您仍然需要根据条件执行不同代码的方法,以及根据旧值计算新值的方法(否则,所有循环/递归要么是无限的,要么根本不会运行)。
至于是否有最少的必要和足够的操作集,以使支持这些操作的任何语言都可以图灵完成,而任何不支持的语言则不能:不,没有(除非您如此模糊地定义“操作” ,它变得毫无意义):
例如,正如我已经说过的,有一些图灵完整的语言不支持递归函数(或根本不支持任何函数)。如果它们具有goto
语句或while
循环(以及存储任意数量的数据的方法),它们仍然可以是图灵完整的。但是,具有递归功能的语言既不需要while
也不goto
是图灵完整的。因此goto
不会包含在必需的足够操作集中,但是如果您删除,那么某些语言将不再是图灵完整的goto
。因此,没有这样的设置。
goto
而有些则不支持,这似乎是因为某些语言使用它而有些则不支持,goto
因此这些语言不能成为图灵完整性所需的一组操作的一部分。我的观点是,这goto
只是实现特定的更通用操作(例如跳转)的语法方式。因此,我相信,如果您仅从特定的控制结构中抽象出来,那么您将更接近一组至少指向图灵完整性的操作。
有各种单一的指令可以生成图灵完整的语言。典型示例是“如果为零则减去并分支”。这些在汇编语言编程的上下文中是众所周知的。有关详细信息,请参见Wikipedia文章。
这导致了一个特征:一种语言只有在能够模拟在内存中提取和存储整数并对它们执行“减零并分支为零”的操作的情况下,图灵才是完整的。
这不是您问题的一般答案,但是根据结构化编程定理,所需要做的只是进行选择(例如,if
在C / C ++中)和重复(例如,while
在C / C ++中)的能力。编辑:正如Dave Clarke在评论中指出的那样,结构化编程定理也需要序列。我最初并没有列出它,因为我认为是理所当然的,读者会理解其他指令的基本块,例如后来提到的用于读取和写入内存等的基本块也是必要的。当然,最好明确一些;您还需要能够执行这些操作。
由于这两个都可以使用条件跳转指令(例如,JNZ
在x86中)实现,因此对于图灵等效性也足够了。
请注意,还需要其他条件,即能够将无数符号(例如,位... 0或1)写入某种外部存储器中。从这种意义上讲,实际的计算机与图灵不一样,因为它们都没有无限的存储量。不过,由于内存量通常很大,因此Turing模型仍然有用,并且即使确定的有限自动机可以解决实际计算机可以解决的任何问题,但使用该计算模型并不是特别有用(因为州的数量将会非常庞大)。
注意,这不一定与sepp2k的答案不一致。这只是思考同一问题的另一种方式。
编辑:
还请注意if
,while
在C / C ++中,您并不需要两者。您可以if
使用while
以下方法进行模拟:
bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program
以下代码始终等效:
bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program
好吧……如果您小心的话,该构造应该可以正常工作并且是可能的。还请注意,如果您具有递归函数,那么最终还需要选择;由于没有选择的递归函数不能真正实现基本情况,因此任何递归函数都将导致无限递归。
编辑:
另外,关于您的问题,即编写不停止程序的能力是否足以满足图灵等价问题,答案是否定的。这是必要的,但还不够。对于用无法表达无法停止的程序的语言编写的程序,我们可以解决停止的问题。答案是“程序确实停止了”。但是,我们可以定义一种语言,其中唯一的指令会导致机器进入无限循环……这种语言不是与图灵等效的。
组合器和其中,和足以表示任何(封闭的)λ项,因此可以表示任何可计算的函数。有关详细信息,请参见此Wikipedia页面。K(S x y z )= (x z (y z ))(K x y )= x
实际上,lambda项是表达所有lambda项的充分基础。稍后在同一Wikipedia页面中查看。