是否存在编程语言中的一组编程语言构造,以便将其视为图灵完成?

从我可以看出的 维基百科, ,该语言需要支持递归,或者看似必须能够在不停止的情况下运行。这就是全部吗?

有帮助吗?

解决方案

我总是那样 $ mu $ - 传动功能 搞定了。这是定义整个可计算函数集的原因;它是最小的包含resp的功能。封闭反对:

  1. 常量$ 0 $函数
  2. 后继功能
  3. 选择参数
  4. 功能组成
  5. 原始递归
  6. $ mu $ - 操作员(寻找最小的$ x $,这样...)

检查上面的链接以获取详细信息;您会发现它使得非常紧凑的编程语言。编程也很恐怖 - 没有免费午餐。如果您放下任何一个,您将失去全功率,因此它是一组最小的公理。

您可以将它们从字面上翻译成基本的句法元素 程序, ,即

  1. 常数 0
  2. 增量 _ + 1
  3. 可变访问 x
  4. 程序/声明串联 _; _
  5. 倒数循环 for ( x to 0 ) do _ end
  6. 循环 while ( x != 0 ) do _ end

其他提示

是否存在一组需要以编程语言执行的计算,以便将其视为图灵完成?

是的,为了被视为图丁,完成编程语言需要能够执行图灵机可以执行的任何计算。因此,正如人们可能会说的那样,您需要能够在其中实现通用图灵机 - 或其他任何图灵完整语言的解释器。

从我可以从维基百科中看出,该语言需要支持递归,或者看似必须能够在不停止的情况下运行。这就是全部吗?

否。例如,唯一允许操作的语言是递归(即,您可以写的唯一可能的功能是 f(x) = f(x), ,没有图灵完成,因为您可以在其中写的只是永不终止的程序。正如我之前说的那样,图灵完整的语言需要能够实施图灵机可以执行的任何计算。因此,很明显,这还不够。

同样,一种语言不必以您的思考方式支持递归。只是表达循环的一种不受限制的方式。那可能是递归,但也可能是一环或goto。根本没有功能的语言仍然可以完成。再次循环或递归功能不足以充分。您仍然需要一种方法来执行不同的代码,具体取决于条件和一种从旧值计算新值的方法(否则,所有循环/递归都是无限或根本不运行的)。


至于是否有一组最少的必要操作和足够的操作,因此任何支持这些操作的语言都是完整的,并且任何没有的语言都不是:不,没有(除非您定义“操作”如此模糊地定义了“操作”) ,它变得毫无意义):

例如,正如我已经说过的,有一些图灵完整的语言不支持递归功能(或根本没有任何功能)。如果它们有一个 goto 声明或 while 循环(以及一种存储任意数量数据的方法)。但是,具有递归功能的语言也不需要 while 也不 goto 图灵完成。所以 goto 不会在一组必要的足够操作中进行,但是如果您删除,有些语言不再完整 goto. 。因此没有这样的集合。

有多种单一说明导致图灵完整的语言。典型的示例是“减去和分支,如果零”。这些在汇编语言编程的背景下是众所周知的。看 Wikipedia文章 有关详细信息。

这导致了一个表征:当且仅当它能够模拟获取和存储整数的操作时,语言才能完成,并在记忆中存储整数并执行“减法和分支(如果为零”)操作。

这不是您问题的一般答案,而是 结构化编程定理, ,所需的只是进行选择的能力(例如, if 在C/C ++)和重复(例如, while 在C/C ++中)。 编辑:正如戴夫·克拉克(Dave Clarke)在评论中指出的那样,结构化编程定理也需要序列。我最初没有列出这一点,因为我认为理所当然的读者会明白,其他指示的基本块,例如以后提到的书,也需要阅读和写作,以及写入存储店等)。当然,最好是明确的。您也需要能够做这些事情。

由于这两者都可以使用有条件的跳跃指令实现(例如, JNZ 在x86中,这也足以使图灵等效性。

请注意,需要其他内容,即,将无限数量的符号(例如,位... 0或1)编写到某种外部存储器存储的能力。从这个意义上讲,真实的计算机并不相同,因为它们都没有无限的存储空间。但是,图灵模型仍然很有用,因为内存的量通常很大,即使真实计算机可以通过确定性有限的自动机解决任何问题,使用该计算模型并不特别有用(因为州的数量将是荒谬的)。

请注意,这不一定与Sepp2k的答案不一致;这只是思考同一问题的另一种方式。

编辑:

还请注意,您真的不需要两者 ifwhile 在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

好吧...构造应该有效,如果您小心的话,那就是可能的。还要注意,如果您具有递归功能,最终也需要选择;由于没有选择的递归功能无法真正实施基本案例,因此任何递归功能都会导致无限递归。

编辑:

另外,关于您的问题是否编写一个不停止的程序的能力是否足以使对等效性,答案是否定的;这是必要的,但不够。我们可以解决用无法表达无法停止程序的语言编写的程序的停止问题;答案是所有实例的“程序都停止”。但是,我们可以定义一种语言,其中唯一的指令导致机器进入无限循环...这种语言与图灵相等。

组合$ Mathbf {s} $和$ Mathbf {k} $ where,$( mathbf {s} x y z)=(x z z (y z))$ and $( Mathbf {K} X Y)= X $足以表达任何(封闭)lambda项,因此任何可计算的函数。看到这个 Wikipedia页面 有关详细信息。

实际上,lambda项$ mathbf {x} = lambda x。稍后见 Wikipedia页面.

语言构造是可以互换的

没有关于哪些构造必须的最低标准 本地 通过编程语言提供。如果它提供了一些怪异的构造,这些构造可以以某种方式令人费解以表达图灵完整的系统,那么显然,这些构造与其他任何构造一样合适。

证明这一点 - 一种提供的语言 只要 “如果零”操作完成图灵的“减法和分支”;存在Turing完整的语言,这些语言不会提供单独的“缩写和分支”,如果零”结构,则没有强制性的构造或一组构造。

任何TP完整语言构造的效果都可以通过任何其他TP完整语言的构造来模仿。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top