像Coq这样的非图灵完整语言有哪些实际限制?

时间:2010-08-16 10:09:12

标签: programming-languages functional-programming turing-complete coq

因为那里有非图灵完整的语言,并且鉴于我没有在大学学习Comp Sci,有人可以解释一下Turing-incomplete语言(如Coq)不能做的事情吗?

或者是没有真正的实际兴趣的完整性/不完整性(即它在实践中没有太大的区别)?

编辑 - 我正在寻找一个答案,就像你因为X 而无法用非图灵完整语言构建哈希表,或类似的东西该!

4 个答案:

答案 0 :(得分:101)

答案 1 :(得分:5)

最直接的答案是:不是图灵完整的机器/语言不能用于实现/模拟图灵机。这来自图灵完整性的基本定义:如果机器/语言可以实现/模拟图灵机,那么它就是完整的。

那么,实际意义是什么?嗯,有一个证据表明任何可以显示为图灵完成的东西都可以解决所有可计算的问题。根据定义,这意味着任何不完整的东西都存在一些障碍,即它有一些无法解决的可计算问题。这些问题取决于缺少哪些功能使系统无法完成。

例如,如果某种语言不支持循环或递归,或者隐式循环不能完全图灵,因为图灵机可以编程为永久运行。因此,该语言无法解决需要循环的问题。

另一个例子是,如果某种语言不支持列表或数组(或允许您使用文件系统模拟它们),那么它就无法实现图灵机,因为图灵机需要随意随机访问内存。因此,该语言无法解决需要随意随机访问内存的问题。

因此,缺少将语言归类为非图灵完备的功能实际上限制了语言的有用性。所以答案是,这取决于:什么使语言非图灵完成?

答案 2 :(得分:3)

一类非常适合Coq等语言的问题是那些终止被推测或难以证明的问题。你可以在数论中找到很多例子,也许最着名的是Collatz conjecture

function collatz(n)
  while n > 1
    if n is odd then
      set n = 3n + 1
    else
      set n = n / 2
    endif
 endwhile

这种限制导致必须以不太自然的方式在Coq中表达这些问题。

答案 3 :(得分:2)

您无法编写模拟图灵机的功能。您可以编写一个模拟2^128(或2^2^2^2^128步骤)的图灵机的函数,并报告图灵机是否接受,拒绝或运行的时间超过允许的步数。

由于“在实践中”你将在你的计算机模拟图灵机进行2^128步骤之前就已经很久了,可以说图灵不完全并没有在“实践中”产生太大的影响。