Clojure 的规范是否等同于 Wadler 的命题?
Are Clojure's specs equivalent to Wadler's propositions?
Wadler wrote an amazing paper: Propositions as Types - where he talks about the Howard-Curry 对应关系,您可以根据程序类型检查程序行为。 (对于给定的语言子集)。
最近Rich Hickey released Clojure spec,用于定义数据和函数规范。
from Wadler we have that props ≅ types, specs ≅ props -> types ergo can do static spec/contract/type checking.
我的问题是:Clojure 的规范是否等同于 Wadler 的命题?
定义术语
Propositions as Types 专门讨论存在于自然演绎和简单类型 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 不是类型系统。规范与证明无关,但类型才是。类型将我们可以编写的程序限制为可以静态证明为 'go right' 的程序。类型系统具有不同级别的功能和表现力,但可靠的类型系统证明了您的代码的某些属性。
规范不会证明您的代码的属性,而是试图让您相信您的代码可以正常工作,并在不正常时提供可见性。规范不能是 运行 静态的,它们基本上是关于 运行 时间值和它们之间的关系。
但即使存在这些差异,类型和 Clojure 规范也有类似的实用目的,它们都让我们对代码更有信心,它们允许我们将语义编码到我们的函数定义中,并且都可以帮助我们进行测试帮助我们防止错误进入我们的代码。
Wadler wrote an amazing paper: Propositions as Types - where he talks about the Howard-Curry 对应关系,您可以根据程序类型检查程序行为。 (对于给定的语言子集)。
最近Rich Hickey released Clojure spec,用于定义数据和函数规范。
from Wadler we have that props ≅ types, specs ≅ props -> types ergo can do static spec/contract/type checking.
我的问题是:Clojure 的规范是否等同于 Wadler 的命题?
定义术语
Propositions as Types 专门讨论存在于自然演绎和简单类型 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 不是类型系统。规范与证明无关,但类型才是。类型将我们可以编写的程序限制为可以静态证明为 'go right' 的程序。类型系统具有不同级别的功能和表现力,但可靠的类型系统证明了您的代码的某些属性。
规范不会证明您的代码的属性,而是试图让您相信您的代码可以正常工作,并在不正常时提供可见性。规范不能是 运行 静态的,它们基本上是关于 运行 时间值和它们之间的关系。
但即使存在这些差异,类型和 Clojure 规范也有类似的实用目的,它们都让我们对代码更有信心,它们允许我们将语义编码到我们的函数定义中,并且都可以帮助我们进行测试帮助我们防止错误进入我们的代码。