通过放弃图灵完整性,Idris不能做什么?


35

我知道Idris具有依赖类型,但并没有完全完成。放弃图灵完整性不能做什么,这与拥有依赖类型有关吗?

我猜这是一个非常具体的问题,但是我对依赖类型和相关类型系统了解不多。


2
我想您正在寻找一个具体的例子?我对Idris并不熟悉,但是在Isabelle / HOL中,您无法编写(或更确切地说,是编译)并非总是终止的函数(更糟的是,您需要提供终止证明)。
拉斐尔

是的-我不完全确定是否会出现一些小众情况,例如您无法在类型系统中对具有某些属性的语言进行编码,或者是否会更通用(例如您所说的) ,则必须证明所有功能
都已

1
猜想这个错误的假设来自埃德温·布雷迪(Edwin Brady),他说伊德里斯(Idris)是“吃豆人”。我认为他要说的是“吃豆子完整的”而不是“变成完整的”,这是他的主要观点是,他想强调语言很容易被人的大脑编译的重要性,而不仅仅是机器!。图灵完备,但它可以利用人脑相当长的一段写在BrainFuck领悟代码,从而开发,以及更重要的是保持在一个BrainFuck吃豆子程序需要相当的努力..
Michelrandahl

@Mitzh不是。我认为这是因为我误解了我在谈话中听到他说的话。
乌贼

Answers:


50

伊德里斯图灵完成了!它确实检查整体性(使用数据编程时终止,使用codata编程时生产率),但并不要求所有内容都是总计。

有趣的是,拥有数据和协数据足以对Turing完整性进行建模,因为您可以为部分函数编写monad。几年前,我在Coq做到了这一点-到现在它可能已经烂透了,但是这里仍然是:http ://eb.host.cs.st-andrews.ac.uk/Partial/partial.v 。

您确实需要一个转义才能实际运行这样的事情,但是Idris允许您这样做。

Idris不会在类型级别上减少部分函数,​​以确保确定类型检查。同样,只有整体程序可以被合理地认为是证明。


4
男人本人。在这种情况下,生产率是多少?
2014年

5
对终止的双重:虽然归纳定义必须终止(通过使用其所有数据),但协合定义必须是有生产力的-实际上,这意味着任何递归调用都必须由构造函数来保护。我发现这种解释最清楚(ymmv):adam.chlipala.net/cpdt/html/Coinductive.html
Edwin Brady

14

首先,我假设您已经听说过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这样的非图灵完备语言的实际限制是什么?(此答案是从很大程度上获取的)。


3
“哪些有用的程序不能用图灵不完整的语言编写?” Java虚拟机。
David Richerby 2014年

@DavidRicherby不能吗?JVM真的是图灵完整的吗?单个对象的大小有限制,您可以安排分配和访问数量不受限制的对象吗?例如,在C语言中,答案似乎是否定的,因为只有有限多个指针值。
吉尔(Gilles)'所以

对于对此部分感兴趣的读者,我们还有另一篇文章介绍为什么不能为总是终止的语言提供编程语言。
拉斐尔

3
@Gilles我同意你的意思,但这是否等于或说没有一种实际的编程语言是图灵完备的?毕竟,任何实施都会遇到您提到的障碍。考虑到Idris因图灵不完整而失去的东西时,这似乎是一个很大的大象。例如,它的损失是否超过其他任何语言?如果您禁止无限制的外部存储(例如,程序停止说“请插入下一个/上一个磁盘”),那么任何语言都是图灵不完整的,因此有关该情况的任何疑问都是虚无的。
David Richerby 2014年

3
@DavidRicherby我的评论(但不是我的回答)处于编程语言理论怪胎模式下。例如,如果您采用SML的正式规范,则可以设计(但当然不是在物理世界中实现)可以模拟所有可计算程序的语言实现。在C语言中不是这样,因为内存的有限性已内置在语言(sizeof(void*))中。在我的回答中,我以理想化的方式对待语言,因此SML或C将被视为图灵完备的。
吉尔斯(Gillles)“所以-不要再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.