coq学习笔记

article/2025/10/21 13:14:25

coq在设置里把这些都勾选上,写代码会好用很多

Check关键字输出待测类型的,可以输出一个十进制数,但是还是类型的显示罢了

Compute计算定义的函数的输出值

simpl关键字是为了化简的可视化罢了,即显示化简的中间过程,不用这个关键字,照样可以证明成功。

* coq中证明方式有这几个:化简证明方式(reflexivity,simple也有一定作用,化简就是指进一步运算一下或者变一个更简单表示形式),改写证明方式(rewrite):通过分类分析(destruct,这个不是数学归纳法,等等,其实这也跟我们在试卷上面做证明题一样的这些方法

reflexivity关键字是执行一些化简,比如一些函数的展开,然后进行等号两边相等性的判断(即真正的证明),如果不写这个关键字,是不行的,会提示错误“未完成的证明”。

最好看的字体是Segoe UI字体,这个不会中文乱码与英文注释显示产生括号显示不全的现象。

这里说的量词指的是plus_o_n这个定理(已经证明过的)是需要输入量词n的,这里是想来运用于第2行的0+n,所以这里自动匹配上了n这个数给了定理充当量词。很明显这里o+n通过这个定理算出得到n了,然后用定理中的,右边的n改写左边的0+n,那么两边就直接相等了。

coq中的单竖线表示并列匹配项的意思,如下图。

上面 这个自然数比较函数,效果,若n,m相等,那么返回true,否则返回false。

 

注:在coq软件看来,一切都只是一些没有任何意义字母符号罢了,reflexivity也只是机械的化简一下(实际上就是运用一些已证明定理的宏替换罢了)检验等号两边的字符是否完全一样,从而得证。

上面在需要的地方才引入一个引理的作用就是:方便coq进行指定的字符进行机械替换罢了。

 

定义一个类型有只有一种方式:归纳定义(递归定义)

其中主要可以分为两种性质的类型:1、类似c语音的枚举类型那种,可以有限的一个一个把成员列举出来,比如

2、有无穷多个成员,没法一一列举出来的这种类型,递归的方式定义出来的,比如,列表(其成员数量可以无限)的定义:

这里的形式cons : nat -> natlist -> natlist.是这样理解:cons为一个子构造函数(简称构造子),接收两个参数nat,natlist,输出一个结果natlist,其使用形式为cons nat natlist 为一个 natlist,其中这里的cons就是一个函数,注:这里cons nat natlist是一个整体,代表一个natlist,而不能省略掉cons这个构造函数名,例如下面图片的例子:primary就是color类型的一个构造子(就是一个函数)之一,而这个构造子有一个输入参数类型为rbg的元素(比如red,green,blue),输出一个结果color,所以primary red,primary green,primary blue都是color的一个成员,所以使用的时候应该是primary red等等这样连着写,不能省略掉primary或者red,green等,其使用例子如下。

               

继续讲列表的构造子nil : natlist形式的理解:nil也是一个子构造函数(简称构造子),代表没有输入参数,只有一个输出结果natlist。其使用形式为 nil 为一个 natlist。那么这里的nil只说是一个natlist,具体包含了几个元素呢,谁也不知道,此时只能看出nil是最基础(最原始)的一个natlist,而不能看出它是空列表(空列表只是coq内部自己指定了罢了,就像自然是的构造子O指定为了零0)。举例其使用:

这样就是人为的定义nil为空列表了。

Definition关键字是定义函数的,那么难道mylist是一个函数?这里我不太懂,但是cons,nil的用法已经体现出来了,就是当做构造器(也叫构造子,就是个函数)来使用。

 

再举一个自然数的定义的例子:

其实这里也只能看出O就是一个构造函数,没有输入参数,只有一个输出结果nat,既然没有输入参数(就跟列表定义的nil一样),那么就是最原始的自然数,也不能说它就是零0,coq是内置了代码把它当做数字0。而构造子S,有一个输入参数nat,输出结果为nat。那么其使用形式即:S O为一个nat,或者S (S O)为一个nat,其使用例子如下:

 

下面是一些进阶的定义和使用,做完最重要的科研内容,有空了继续研究吧,还有很多继续学习的地方,懂了上述说的内容,coq就入门了。做完最重要的科研内容,下次继续研究我收藏的两篇coq的CSDN博客。

我的测试代码:

(* Inductive day : Type :=| monday| tuesday| wednesday| thursday| friday| saturday| sunday.Definition next_weekday (d:day) : day :=match d with| monday    => tuesday| tuesday   => wednesday| wednesday => thursday| thursday  => friday| friday    => monday| saturday  => monday| sunday    => mondayend.Compute (next_weekday friday).
(* ==> monday : day *)
-
Compute (next_weekday (next_weekday saturday)). *)
Check (S(S(S(S O)))).
Check (S O).Definition minustwo(n:nat):nat:=match n with|O=>O|S O=>O|S(S n')=>n'
end.
Compute(minustwo 4).Fixpoint evenb(n:nat):bool:=match n with|O=>true|S O=>false|S(S n')=>evenb n'
end.
Compute(evenb 4).
Check (evenb 4).Definition oddb(n:nat):bool:=negb(evenb n).
Example test_oddb1:oddb 2=false.
Proof. simpl. reflexivity. Qed.Fixpoint minus(n m:nat):nat:=match n,m with|O,_=>O|S_,O=>n|S n',S m'=>minus n' m'end.
Notation "x - y":=(minus x y)(at level 50,left associativity).
Example testMinus:minus 5 3=2.
Proof. simpl. reflexivity. Qed.Fixpoint plus(n m:nat):nat:=match n with|O=>m|S n'=>S (plus n' m)end.
Notation "x + y":=(plus x y)(at level 50,left associativity).Theorem plus_n_O_firsttry : forall n:nat,n = n + 0.
Proof.intros n.simpl. (* Does nothing! *)
Abort.Theorem plus_n_O_secondtry : forall n:nat,n = n + 0.
Proof.intros n. destruct n as [| n'].- (* n = 0 *)reflexivity. (* so far so good... *)- (* n = S n' *)simpl.       (* ...but here we are stuck again *)
Abort.Theorem plus_n_O : forall n:nat, n = n + 0.
Proof.intros n. induction n as [| n' IHn'].- (* n = 0 *)    reflexivity.- (* n = S n' *) simpl. rewrite <- IHn'. reflexivity.  Qed.Theorem minus_diag : forall n,minus n n = 0.
Proof.(* WORKED IN CLASS *)intros n. induction n as [| n' IHn'].- (* n = 0 *)simpl. reflexivity.- (* n = S n' *)simpl. rewrite -> IHn'. reflexivity.  Qed.

 

参考文章 

* 通过《Software Foundation》学习Coq语言的基本用法——1.Basics

* 通过《Software Foundation》学习Coq语言的基本用法——2.Induction 3.Lists


http://chatgpt.dhexx.cn/article/S69B4PjZ.shtml

相关文章

coq使用笔记

Coq 使用笔记 Coq中可分三部分&#xff1a; 1、vernacular&#xff1a;用来处理定义&#xff0c;使用大写字母开头&#xff0c;例如Theorem、Proof、Qed 2、tactics&#xff1a;用作证明过程&#xff0c;以小写字母开头&#xff0c;例如intros、exact 3、Gallina&#xff1a;用…

【coq】函数语言设计 笔记 06 -logic

参考博客&#xff1a;https://www.cnblogs.com/TheFutureIsNow/p/11993851.html Coq中的命题类型语句 Coq是一种类型化语言&#xff0c;这意味着它的世界中的每个合理表达式都有一个相关的类型。逻辑声明也不例外&#xff0c;任何一个可以证明的语句都有一个类型&#xff0c…

离散数学——coq学习笔记(一)

Coq学习笔记&#xff08;一&#xff09; BASICS函数编程枚举类型引例&#xff1a;Days of the week&#xff08;定义一个类型&#xff09; 一些基础语法定义TypeCheck命令多元组ModulesCompute命令定义一个新常量 BOOLEANS布尔表达式的构造相关定义布尔表达式的相关运算律用Exa…

求网络号、子网号、主机号、子网网络地址、子网广播地址

例题&#xff1a;某计算机的IP地址为10.38.51.21&#xff0c;子网掩码为255.255.0.0&#xff0c;写出该计算机的网络号、子网号、主机号以及子网网络地址、子网广播地址。 网络号&#xff1a;10子网号&#xff1a;38主机号&#xff1a;51.21子网网络地址&#xff1a;10.38.0.0子…

根据子网掩码算出 IP 地址 的网络号和主机号

我们如何根据子网掩码算出 IP 地址 的网络号和主机号呢&#xff1f; 举个例子&#xff0c;比如 10.100.122.0/24&#xff0c;后面的/24表示就是 255.255.255.0 子网掩码&#xff0c;255.255.255.0 二进制是「11111111-11111111-11111111-00000000」&#xff0c;大家数数一共多…

关于IP地址、网络号、主机号、子网掩码之间的关系

IP地址类似于我们的身份证号码 国家为了唯一确定我们每个人的身份&#xff0c;会为我们每个人分配一个唯一确定身份的号码&#xff0c;同理&#xff1a; 为了确切地标识Internet&#xff08;互联网&#xff09;中的每一台主机和路由器&#xff0c;TCP/IP建立了一套编址方案&a…

关于IP网络号和主机号的原理

网络号和主机号具体怎么弄出来的? ? ? ? 1、标准分类的ip地址的网络号是&#xff0c; A类是前8位 B类是前16位 C类是前24位 举一个例子 如172.16.10.2&#xff0c;因为172.16.10.2是B类地址&#xff0c;所以172.16所代表的位就是网络号的位&#xff0c;后面10.2代表的…

子网划分以及网络号的计算

目录 一、子网划分的作用 1.计算网络号&#xff0c;通过网络号选择正确的网络设备连接终端设备 2.根据网络的规模&#xff0c;可以对局域网(内网)进行网络地址规划 二、IP地址 1.IP地址的组成部分 2.IP地址的版本 三、IP地址的分类 1.IP地址分类 2.IP地址分类总结思维…

网络号,网络标识,广播地址,有效主机范围计算

网络计算 IP 地址计算网络号&#xff0c;网络标识&#xff0c;有效主机范围IP地址分类 IP 地址 IP地址&#xff1a;网络部分主机部分 网络部分&#xff1a;确定终端是不是在同一网段 主机部分&#xff1a;用来确定终端的容量大小&#xff08;最多可以容纳多少台&#xff09; 同…

网络号、主机号、子网号--例题

已知 IP&#xff1a;195.169.20.50 子网掩码&#xff1a;255.255.255.224 求网络号 子网号 主机号。答&#xff1a; IP为C类&#xff0c;一知道子网掩码值是224 所以网络被划分为8个子网网络号是用将你的IP和子网掩码255.255.255.224的二进制进行逻辑与运算得到转换为十进制为…

计算机网络:根据IP和子网掩码计算网络号

题目感觉有误&#xff0c;但是解题思路是正确的。 已知B类地址的子网掩码为255.255.0.0&#xff0c;假设某B类地址为127.24.36.55&#xff0c;那么它的网络号为&#xff1a;&#xff08;&#xff09; A、127.24.0.0 B、0.0.36.55 C、255.255.36.55 D、127.24.36.55 解题思路&…

网络号和主机号具体计算原理-ipv4篇

来自之前163网易博客&#xff0c;因博客倒闭&#xff0c;放CSDN供 大家学习。 1、标准分类的ip地址的网络号是&#xff0c; A类是前8位 B类是前16位 C类是前24位 举一个例子 如172.16.10.2&#xff0c;因为172.16.10.2是B类地址&#xff0c;所以172.16所代表的位就是网络号的位…

网络号的计算

子网掩码和ip地址结合使用,可区分出一个网络的网络号和主机号. 例如: 有一个c类地址为: 192.9.200.12 默认子网掩码为: 255.255.255.0 ① 将IP地址转化为二进制: 11000000 00001001 11001000 00001100 ② 将子网掩码转换为二进制:11111111 11111111 11111111 00000000 ③ 将子…

计算机网络号的学习

目录 一、子网的划分 1.1子网划分的作用 二、相同网络与不同网络 1、相同网络 2、不同网络 三、IP地址的组成与作用 1、IP地址的组成 2、各组成的作用 四、IPV4地址与IPV6地址 五、IP地址的分类 六、IP地址按用途分类 七、网络号的计算方法 八、网络地址的划分 1…

计算机网络中的子网号和网络号

IP地址是一个32为的二进制数。 IP地址&#xff1d;网络id 主机id 网络号 网络号就是网络id&#xff0c;是某个互联网中子网的地址&#xff0c;通过子网掩码和IP地址按位“与”得到。 如192.9.200.13/24&#xff0c;子网掩码为255.255.255.0&#xff0c;该IP地址的网络号就是1…

认识网络号与子网划分

目录 一、计算机网络号 二、网络号的构成 1.认识网络号 &#xff08;1&#xff09;IP地址 &#xff08;2&#xff09;子网掩码 &#xff12;.IP地址用途分类 &#xff08;&#xff11;&#xff09;私有地址 &#xff08;&#xff12;&#xff09;公有地址 三、网络号的…

IP地址、网络号、主机号、网络地址、子网掩码、网关、192.168.0.1/24是什么意思

IP地址 IP地址通俗上讲&#xff0c;就是台电脑在网络世界的唯一标识&#xff0c;它由32的二进制数组成&#xff0c;也就是4个字节&#xff0c;就像人的身份证一样&#xff0c;它能够唯一标识一台电脑。 IP地址的组成 IP地址网络ID主机ID&#xff0c;同一个网络的IP地址能够公用…

正方形的展开图

记得这个题目是我小学竞赛的最后一个题目&#xff0c;当时这个题目没有做出来 (^_^) 正方形的展开图共有11种。 分下面的4种情况&#xff1a;

如何用几何画板作正方体的动态展开图

在教学中&#xff0c;为了增强教学效果&#xff0c;通常用折纸法演示正方体的展开与折叠过程&#xff0c;这样的做法对学生的理解还是起不了多大作用的。如果可以借助一些教学辅助工具制作模型进行演示&#xff0c;那效果肯定更为显著。几何画板就是符合这样要求的教学辅助工具…