近年来,不仅在Haskell圈子中,而且在基于CiC的证明助理从业者(Coq,Lean等)中都广泛讨论了Curry-Howard的对应关系。简而言之,它使" programs& #34; (通常是某种类型的lambda演算的术语)和" proofs" (这些程序是它们类型的证明,或者更确切地说,它们是它们类型被居住的见证)。最基本的示例是id x = x,在Haskell中,这将是$ \ forall a的证明。 \ rightarrow a $,命题逻辑的平凡定理。
一切都很好,但是我的意思是,在实践中,对等并不像它最初看起来那样有趣。
真正的程序(即被编写为要执行并执行有用操作的程序)实际上并不是任何有趣的证明,而就学上而言,haskell程序的类型为IO(),这实际上不是有效的主张。但是即使如此,如果我们只是在main的表面下方看,也没有什么有趣的类型:
人们使用的经典的Haskell程序是pandoc。它所做的大部分工作都可以描述为Doc Markdown->。 Doc Html(或类似的一对文档格式)。所以您有一个“证明”这两棵树可以以某种方式相互映射。没有数学家会为此讨好。
用Haskell编写的服务器(如Web服务器)的类型为request->如果您在服务器循环内部查看,则IO响应(或接近响应的响应,也许会请求-> M响应某些自定义monad M)。同样,这在数学上并不是很有趣。
只有在查看组合器库(例如Parsec)时,类型才变得更通用,并开始看起来更像公式。像翻转这样的东西:(a-> b-> c)-> b-> ->尽可能多地关心……并证明了超微不足道的命题逻辑定理。事实上,您甚至无法在Haskell中陈述太多,任何真实的数学陈述至少都需要一阶逻辑(对应于从属类型,否)主流语言还提供了这些功能,例如er,C ++)。如果Idris被设计为证明助手,而不是功能强大的编程语言,则它可能会有一些有趣的证明,它们也是真实的程序。
如果有人使用的实用程序实际上也证明了某些琐碎的事情,我很乐意被证明是错误的。
对应于&#34的证据的程序是什么;存在无限数量的素数"?如果我运行这个程序,它需要什么输入,以及我作为Anoutput达到什么?
我没有直接回答这个问题。如果您在COQ中开发此证明,请使用PROP类型语句,我甚至认为它可以提取到ocamland编译。
对于大多数数学,我不知道"程序"对应于教科书中的验证看起来像是他们会计算的。这些证据的虚拟性λ术语,但它们计算了胰岛素。
一个域,Ch确实对我有意义,是用作某些属性的存在证人的算法(用函数)。例如,EuclID GCD算法在非常真实的意义上,证明Thatwo Natural Numbers有一个GCD。您可以编写一些COQ或精益代码,即拖累两个数字的GCD,并证明它确实是他们最大的除法。
那说,我不知道以这种方式写入的任何大型程序。它'甚至与whewhive的替代方案的劳动意义,甚至与why3的替代方案相比,您可以清洁代码和规范,并要求自动proversto对您尽可能多地证明。
让'看看CoMcert,着名的是在Coq.i中写的最大值之一假设主要类型是编译:C_program - >选项ASM_PRAGGOR这样的东西(我' m没有专家在COMPCERT上,所以我可能是非常错误的)。但是,据我所知,它'没有用纯粹的依赖风格写作:从&#aresperation aresperated 34;实际代码"部分发展。这意味着易于' t得到$ \ forall x:\ text {c_procraph} \ lightarrow选项\ set {y:\ text {asm_procum} | r(x,y)} $ where $ r(x,y)$意味着$ x $和$ y $具有相同的语义;相反,你是c_program - > asm_prick和侧面上的证明,函数保存输入' s语义。
当然,标题是点击八分之一。但我确实认为CH过度炒作,因为信件只是抽象地兴趣;在实践中,符合(有趣)的程序,或(有趣的)证明,但同时不是两个人。