我知道Idris具有依赖类型,但并没有完全完成。放弃图灵完整性不能做什么,这与拥有依赖类型有关吗?
我猜这是一个非常具体的问题,但是我对依赖类型和相关类型系统了解不多。
我知道Idris具有依赖类型,但并没有完全完成。放弃图灵完整性不能做什么,这与拥有依赖类型有关吗?
我猜这是一个非常具体的问题,但是我对依赖类型和相关类型系统了解不多。
Answers:
伊德里斯图灵完成了!它确实检查整体性(使用数据编程时终止,使用codata编程时生产率),但并不要求所有内容都是总计。
有趣的是,拥有数据和协数据足以对Turing完整性进行建模,因为您可以为部分函数编写monad。几年前,我在Coq做到了这一点-到现在它可能已经烂透了,但是这里仍然是:http ://eb.host.cs.st-andrews.ac.uk/Partial/partial.v 。
您确实需要一个转义才能实际运行这样的事情,但是Idris允许您这样做。
Idris不会在类型级别上减少部分函数,以确保确定类型检查。同样,只有整体程序可以被合理地认为是证明。
首先,我假设您已经听说过Church-Turing论文,该论文指出,我们称之为“计算”的任何事情都可以使用Turing机(或许多其他等效模型中的任何一种)来完成。因此,图灵完备的语言是可以表达任何计算的语言。相反,图灵不完整语言是其中某些计算无法表达的语言。
好的,那不是很有益。让我举个例子。使用任何图灵不完整的语言,您都无法做一件事:您无法编写图灵机模拟器(否则您可以在模拟的图灵机上对任何计算进行编码)。
好的,那仍然不是很有帮助。真正的问题是,哪些有用的程序不能用图灵不完整的语言编写?嗯,没有人提出“有用程序”的定义,其中包括某人为有用目的而编写的所有程序,并且不包括所有图灵机计算。因此,设计一种可以编写所有有用程序的图灵不完整语言仍然是一个长期的研究目标。
现在,有几种非常不同的图灵不完整语言,它们在不能做的事情上也有所不同。但是,有一个共同的主题:图灵完备的语言必须包括某种有条件地终止或继续运行的方式,该时间不受程序大小的限制,并且一种程序使用取决于输入的内存量的方式。 。具体而言,大多数命令式编程语言分别通过while循环和动态内存分配来提供这些功能。大多数功能性编程语言都通过递归和数据结构嵌套来提供这些功能。
伊德里斯受到了强烈的启发 阿格达的。阿格达(Agda)是一种用于证明定理的语言。现在证明定理和运行程序紧密相关,因此您可以像证明定理一样在Agda中编写程序。直观上,定理“ A意味着B”的证明是一个将定理A的证明作为参数并返回定理B的证明的函数。
由于系统的目标是证明定理,因此您不能让程序员编写任意函数。想象一下,该语言允许您编写一个愚蠢的递归函数,该函数仅调用自身:
oops : A -> B
oops x = oops x
您不能让这种函数的存在使您相信A意味着B,否则您将能够证明一切,而不仅仅是真实定理!因此,Agda(以及类似的定理证明)禁止任意递归。在编写递归函数时,必须证明它总是终止的,因此,每当在定理A的证明上运行它时,您就知道它将构造定理B的证明。
Agda的直接实际限制是您不能编写任意递归函数。由于系统必须能够拒绝所有非终止功能,因此无法确定暂停问题(或更一般而言,莱斯定理)确保了也存在终止函数。另一个实际的困难是您必须帮助系统证明您的功能确实终止。
正在进行大量研究,以使证明系统更像是编程语言,而又不损害它们的保证,即如果您具有从A到B的功能,则它与A暗示B的数学证明一样好。扩展系统以接受更多内容终止功能是研究的主题之一。其他扩展方向包括应对诸如输入/输出和并发之类的“现实世界”问题。另一个挑战是使凡人可以访问这些系统(或者说服凡人他们实际上是可以访问的)。
我对伊德里斯不熟悉。这是我刚才提到的挑战。据我粗略看一下2013年的预印本,伊德里斯(Idris)是图灵完备的,但其中包括总体检查器。总体检查器会验证每个用关键字注释的函数total
终止。仅包含Idris程序的语言片段(其中每个功能都相同)在表达能力上与Arda相似(由于类型理论上的差异,这可能不是精确匹配,但足够接近,除非您有意尝试,否则您不会注意到)。
有关其他以不同方式未实现图灵完备的语言的示例,请参见像Coq这样的非图灵完备语言的实际限制是什么?(此答案是从很大程度上获取的)。
sizeof(void*)
)中。在我的回答中,我以理想化的方式对待语言,因此SML或C将被视为图灵完备的。