Clojure的规格是否等同于Wadler的命题?

时间:2016-05-27 14:07:11

标签: clojure clojure.spec

Wadler写了一篇惊人的论文:Propositions as Types - 在那里他谈到了Howard-Curry对应关系,你可以根据程序的类型来检查程序的行为。 (对于给定的语言子集)。

最近Rich Hickey已发布Clojure spec,用于定义数据和功能规范。

此处the commentator writes

  来自Wadler的我们有道具≅类型,规格≅道具 - >类型ergo可以进行静态规范/合同/类型检查。

我的问题是: Clojure的规格是否等同于Wadler的提议?

1 个答案:

答案 0 :(得分:1)

定义条款

作为类型的命题是专门讨论自然演绎和简单类型Lambda演算(STLC)之间存在的同构,这两种形式分别是逻辑和编程语言。这意味着当您在STLC中进行编程时,您可以将程序转换为逻辑命题。

例如,这些是等价的:

(a -> b) -> a -> b

P implies Q
P
therefore Q

第一个是函数的类型签名,第二个是逻辑命题。现在当你和Clojure的规格等同于Wadler的命题时?"你问的是"我们可以将Clojure规范转换成逻辑语句吗?"或者由于同构,"我们可以将clojure规范转换为STLC吗?"

缺乏对等

规范允许我们使用任何和所有Clojure predicates。这使得规范非常灵活,但它也是看到规范不是命题的关键。

使STLC作为逻辑工作的一个关键特性是所有术语减少或换句话说,STLC中的所有程序终止。 Clojure没有这个属性,很容易编写永远不会终止的Clojure程序。为了使任何编程语言成为一致的逻辑,它必须具有这种终止属性,因为"非终止"相当于逻辑上的矛盾。由于规范可以使用任何Clojure函数,因此您可以编写一个不终止的规范,因此无法转换为STLC。所以Clojure规范并不等同于Wadler的命题。

有什么不同,有什么相似之处?

正如docs of Clojure spec所述,spec不是类型系统。规格不关心证据,但类型是。类型将我们可以编写的程序限制为可以被静态证明为“正确”的程序。类型系统具有不同级别的功能和表现力,但声音类型系统证明了代码的某些属性。

规范不会证明您的代码的属性,而是尝试让您确信您的代码可以正常运行,而不是。规范不能静态运行,它们基本上是关于运行时值以及它们之间的关系。

但即使存在这些差异,类型和Clojure规范也有类似的实用目的,它们都使我们对代码更有信心,它们允许我们将语义编码到我们的函数定义中,并且它们都可以帮助我们测试生成到帮助我们防止错误蔓延到我们的代码中。