随笔分类 -  计算机科学 / 函数语言编程

摘要:除了能用Coq完成前面所介绍过的各种数学证明,还可以用Coq研究一些其他的事情。Coq中包含一种简单的命令式编程语言Imp,它包含了传统主流语言(如C和Java)的一小部分核心。 下面是一个用Imp语言编写的一个熟悉的数学函数: 而这里只是对Imp编程语言的语法和语义进行简单的介绍 算术和布尔表达式 阅读全文
posted @ 2019-12-28 00:25 2hYan9 阅读(823) 评论(0) 推荐(0)
摘要:递归命题 在前面有介绍过几种说明自然数n是一个偶数的方法,比如: 1. evenb n = true,或者 2. exists k, n = double k 现在,可以通过一条递归的规则来判断一个整数n是否是偶数: + ev_0:数字0是偶数 + ev_SS:如果n是偶数,那么S(S n)也是偶数 阅读全文
posted @ 2019-12-26 16:53 2hYan9 阅读(1104) 评论(0) 推荐(0)
摘要:Coq中的命题类型语句 Coq是一种类型化语言,这意味着它的世界中的每个合理表达式都有一个相关的类型。逻辑声明也不例外,任何一个可以证明的语句都有一个类型,即Prop,命题类型。 可以使用check命令查看这个类型: 需要注意的是,任何符合命题语法定义的语句都是Prop类型的,不论它们是否成立,关键 阅读全文
posted @ 2019-12-23 23:47 2hYan9 阅读(893) 评论(0) 推荐(0)
摘要:在前面的 "Proof in Coq" 中介绍了几种简单的证明方法以及常用的策略(tactics),而这里则是介绍几种更为复杂的证明策略: [apply]策略 在进行证明的时候经常遇到这样的情况,即要证明的目标与上下文中的某个假设或某个先前已证明的引理完全相同。 有时候可以使用[rewrite]然后 阅读全文
posted @ 2019-11-30 17:12 2hYan9 阅读(1336) 评论(0) 推荐(0)
摘要:多态 在前面所定义的链表中,链表的元素都是自然数,(或者PartitialMap中以一个二元元组为元素),但这些都存在着一个问题:所有类型的链表都在定义的都限制了链表的元素为某一个确定的类型,这样就不太灵活了,如果需要定义的链表类型比较多的话,那么就需要为每一种类型的链表单独写一段声明代码。 比如, 阅读全文
posted @ 2019-10-23 21:06 2hYan9 阅读(545) 评论(0) 推荐(0)
摘要:定义元组 其实在Coq基础(一)中的NewTypeFromOld中就已经定义过一个叫做nybble类型的元组了,那个类型的元组有四个bit类型的成员,构造器为bits。而这里再次定义一个只有两个自然数类型成员的元组: Inductive natprod : Type := | pair (n1 n2 阅读全文
posted @ 2019-10-12 11:36 2hYan9 阅读(767) 评论(0) 推荐(0)
摘要:Proof By Simplification 在前面定义数据类型以及函数的时候有使用过Example语句来说明和证明数据的属性。 所使用的证明方法都是一样的:使用关键字simpl来化简等式两边的表达式,然后再使用reflexivity来验证等式两边是否相等。 此外,还可以使用proof by si 阅读全文
posted @ 2019-09-23 20:19 2hYan9 阅读(2100) 评论(0) 推荐(0)
摘要:定义一个类型 在coq中,一个变量的类型往往表示为 var_name : var_type,即变量名后面的一个冒号后是变量的类型 Inductive type_name : Type := constructor 1 constructor 2 ... constructor n. (*注意最后一个 阅读全文
posted @ 2019-09-22 22:45 2hYan9 阅读(2919) 评论(0) 推荐(0)
摘要:lambda abstraction(lambda abstraction) 在lambda运算中,函数的表达式与平常的不同: f(x)=M,应该表示成λx.M(带函数名的写法为,f≡λx.M)的形式,这样左到目的是为了省略函数的名称,从而更加简洁 lambda abstraction中点号的后面包 阅读全文
posted @ 2019-09-09 11:29 2hYan9 阅读(483) 评论(0) 推荐(0)