Programming languages 像Coq这样的非图灵完全语言的实际局限性是什么?

Programming languages 像Coq这样的非图灵完全语言的实际局限性是什么?,programming-languages,functional-programming,turing-complete,coq,Programming Languages,Functional Programming,Turing Complete,Coq,由于存在非图灵完整语言,并且我在大学里没有学习Comp-Sci,有人能解释图灵不完整语言(比如)不能做的事情吗 或者,完整性/不完整性是否没有实际意义(即,在实践中是否没有太大区别) 编辑-我在寻找这样一个答案:由于X或类似的原因,您无法用非图灵完整语言构建哈希表 最直接的答案是:不完整的机器/语言不能用于实现/模拟图灵机器。这源于图灵完备性的基本定义:如果机器/语言能够实现/模拟图灵机器,那么它就是图灵完备性 那么,实际意义是什么呢?有证据表明,任何可以证明是图灵完备的东西都可以解决所有可计算

由于存在非图灵完整语言,并且我在大学里没有学习Comp-Sci,有人能解释图灵不完整语言(比如)不能做的事情吗

或者,完整性/不完整性是否没有实际意义(即,在实践中是否没有太大区别)


编辑-我在寻找这样一个答案:由于X或类似的原因,您无法用非图灵完整语言构建哈希表

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

那么,实际意义是什么呢?有证据表明,任何可以证明是图灵完备的东西都可以解决所有可计算的问题。根据定义,这意味着任何不是图灵完备的东西都有一个缺陷,即存在一些它无法解决的可计算问题。这些问题是什么取决于缺少哪些使系统非图灵完整的特性

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

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


因此,将一种语言分类为非图灵完全语言所缺少的特性实际上限制了该语言的实用性。所以答案是,这取决于:是什么使语言非图灵完整?

首先,我假设你已经听说了,它表明任何我们称之为“计算”的东西都可以用图灵机器(或任何其他等效模型)来完成。所以图灵完全语言是一种可以表达任何计算的语言。相反,图灵不完全语言是一种存在一些无法表达的计算的语言

好吧,那不是很有见地。让我举个例子。有一件事在任何图灵不完全语言中都无法做到:不能编写图灵机器模拟器(否则可以在模拟的图灵机器上对任何计算进行编码)

好吧,这仍然不是很有用。真正的问题是,什么有用的程序不能用图灵不完全语言编写?好吧,没有人提出“有用程序”的定义,包括某个地方为有用目的编写的所有程序,但不包括所有图灵机计算。因此,设计一种图灵不完全语言来编写所有有用的程序仍然是一个非常长期的研究目标

现在有几种非常不同的图灵不完全语言,它们在不能做的事情上有所不同。然而,有一个共同的主题。如果您正在设计一种语言,有两种主要方法可以确保该语言是图灵完整的:

  • 要求语言具有任意循环(
    while
    )和动态内存分配(
    malloc

  • 要求语言支持任意递归函数

让我们看一些非图灵完全语言的例子,尽管有些人可能称之为编程语言

  • FORTRAN的早期版本没有动态内存分配。您必须提前计算出您的计算需要多少内存,并分配这些内存。尽管如此,FORTRAN曾经是使用最广泛的编程语言

    明显的实际限制是,在运行程序之前,必须预测程序的内存需求。这可能很困难,如果输入数据的大小没有预先限定,这可能是不可能的。当时,输入数据的人通常是编写程序的人,所以这没什么大不了的。但对于今天编写的大多数程序来说,情况并非如此

  • Coq是一种为用户设计的语言。现在,你们可以用Coq编写程序,就像你们证明一个定理一样。直观地说,定理“a暗示B”的证明是一个函数,它将定理a的证明作为参数,并返回定理B的证明

    因为系统的目标是证明定理,所以不能让程序员编写任意函数。想象一下,该语言允许您编写一个只调用自身的愚蠢递归函数(选择使用您最喜欢的语言的行):

    你不能让这样一个函数的存在说服你a意味着B,否则你将能够证明任何东西,而不仅仅是真的定理!所以Coq(和类似的定理证明者)禁止任意递归。当你编写递归函数时,你必须证明它总是终止的,这样每当你在定理a的证明上运行它时,你就知道它将构造定理B的证明

    Coq的直接实际限制是不能编写任意递归函数。由于系统必须能够拒绝所有非终止功能,因此(或更一般地)的不可判定性确保也存在被拒绝的终止功能。另外一个实际困难是,您必须帮助系统证明您的功能确实终止

    有很多正在进行的研究是为了使证明系统更像编程语言,而不损害它们的保证,即如果你有一个函数f
    theorem_B boom (theorem_A a) { return boom(a); }
    let rec boom (a : theorem_A) : theorem_B = boom (a)
    def boom(a): boom(a)
    (define (boom a) (boom a))
    
    function collatz(n)
      while n > 1
        if n is odd then
          set n = 3n + 1
        else
          set n = n / 2
        endif
     endwhile