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

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

Proof

  • Proof By Simplification
  • Proof By Rewriting
  • Proof by Case Analysis
    • destruct
      • 例1
      • 例2
      • 多重析构
  • 参考书目练习答案
    • basic部分

这部分内容写了快两个星期了,期末考试越来越近,紧张紧张

Proof By Simplification

之前的代码中出现过

Proof. simpl. reflexivity. Qed.

simpl是将方程的两边简化,reflexivity使用自反性检查两边是否包含相同的值
例如:

Theorem plus_0_n:forall n:nat,0+n=n.
Proof.
intros n. simpl. reflexivity. Qed.

实际上自反性可以在检查两边式子的时候自动实现一些简化,我们可以省略simpl的过程(simpl相当于将中间过程展示了出来)

Theorem plus_O_n' : ∀n : nat, 0 + n = n.
Proof.intros n. reflexivity. Qed.

以上的证明过程使用了Theorem引出需要证明的结论(实际上和exmaple差不多)

intros n. simpl. reflexivity.

以上是一个tatics的例子,tatics后续会详细介绍,这里我们只需要知道intro n.是将forall一般化

Proof By Rewriting

Theorem plus_id:forall n m:nat,n=m->n+n=m+m.

上述定理描述只有在n=m时,后续的定理才成立,并且需要对m和n一般化,intro. 可以实现上述三个目标
由于n和m是任意数,我们不能用simpl直接简化,需要利用条件n=m,将所有的n用m替换,再证明式子,这个过程用rewrite实现(是不是很像命题逻辑中的替换和代入规则)

Theorem plus_id:forall n m:nat,n=m->n+n=m+m.
Proof.
intros n m. 
intros H. (*将前提引入到证明环境中*)
rewrite->H. 
reflexivity. 
Qed.

rewrite->H.代表将前提从左到右重写,n->m说明将n全部用m代替,也可以写成rewrite<-H,表示n<-m将m全部替换为n
在这里插入图片描述

Proof by Case Analysis

然而在一些未知条件过多的证明中,仅仅使用上述策略无法实现证明

Theorem plus_1_neq_0_firsttry : ∀n : nat,(n + 1) =? 0 = false.
Proof.intros n.simpl. (* does nothing! *)
Abort.

原因是n+1=0无法再进行简化
那样我们就需要考虑所有n的情况,利用枚举法证明结论

destruct

我们提到了关于表示出n所有可能性的想法,coq中用destruct函数来实现列举可能的情况

例1

Theorem plus_1_neq_0 : ∀n : nat,eqb (n + 1)  0 = false.
Proof.intros n. destruct n as [| n']- reflexivity.- reflexivity. Qed.

ps:我没找到coq里面关于eqb函数的notation,这里直接用函数表示了

  • destruct函数为我们生成两个子目标:n=O,n=S n’,我们需要分别证明其正确性
  • destruct n as [| n']表示对每种情况需要引入的变量名,在这个证明中coq不会自动分类,需要根据引入的变量名修改子目标,[ ]表示一个参数列表,参数之间用“|”分割
  • 我们使用“-”来使代码的分类证明更加有序

例2

我们也可以利用析构函数的策略证明相关的布尔表达式

Theorem negb_involutive:forall b:bool,negb (negb b)=b.
Proof.intros b.destruct b.
- reflexivity.
- reflexivity. Qed.

多重析构

有时我们需要对子目标继续进行析构,这时我们需要用不同的项目符号标记目标

Theorem andb_communtive:forall b c,(andb b c)=(andb c b).
(*定律描述*)
Proof.intros b c.destruct b.- destruct c.+ reflexivity.+ reflexivity.- destruct c.+ reflexivity.+ reflexivity.
Qed.

遇到三重以上证明时,可以用*作为第三层析构
我们也可以用括号包含析构内容,使代码更清晰

Theorem andb_commutative' : ∀b c, andb b c = andb c b.
Proof.intros b c. destruct b eqn:Eb.{ destruct c eqn:Ec.{ reflexivity. }{ reflexivity. } }{ destruct c eqn:Ec.{ reflexivity. }{ reflexivity. } }
Qed.

参考书目练习答案

basic部分

  • EX5:standard (plus_id_exercise)
Theorem plus_id_exercise : forall n m o : nat,n = m -> m = o -> n + m = m + o.
Proof.
intros n m o.
intros H1 H2.
rewrite->H1.
rewrite<-H2.reflexivity. Qed.
Theorem mult_0_plus : forall n m : nat,(0 + n) * m = n * m.
Proof.intros n m.rewrite -> plus_O_n.reflexivity. Qed.

//其中第二个证明展示了用已知结论重写待证明的式子

  • EX6:standard (mult_S_1)
Theorem mult_S_1 : forall n m : nat,m = S n -> m * (1 + n) = m * m.
Proof.
intros n m.
intros H.
rewrite->H.
reflexivity.
Qed.

注意这里不能用<-,因为无法找到需要被代替的S n

  • EX7:standard (andb_true_elim2)
Theorem andb_true_elim2 : forall b c : bool,andb b c = true -> c = true.
Proof.intros b c.destruct b.-destruct c.+ simpl.intros H.reflexivity.+ simpl.intros H.rewrite->H.reflexivity.-destruct c.+ simpl. intros H.reflexivity.+ simpl.intros H.rewrite->H.reflexivity.
Qed.

有几步不太好想,关键是把明确什么时候引入前提,什么时候结论为真不需要证明,什么时候结论为假需要说明前提也为假(利用替换)

  • EX8:standard (zero_nbeq_plus_1)
Fixpoint eqb (n m:nat):bool:=
match n with
|O=>match m with |O=>true|S m'=>falseend
|S n'=>match m with|O=>false|S m'=>(eqb n' m')end
end.Theorem zero_nbeq_plus_1 : forall n : nat,eqb 0 (n + 1) = false.
Proof.intros n.destruct n as [|n'].- reflexivity.- reflexivity.
Qed.
  • More exercise答案
    1 indentity_fn_applied_twice
Theorem identity_fn_applied_twice :forall(f : bool -> bool),(forall(x : bool), f x = x) ->forall(b : bool), f (f b) = b.
Proof.intros f.destruct b.(*如果不将x进行析构和引入,x代表任意数,可以直接代换*)- rewrite H. rewrite H. reflexivity.- rewrite H. rewrite H. reflexivity. Qed.

2 (negation_fn_applied_twice)

Theorem negation_fn_applied_twice:
forall (f: bool->bool),(forall x:bool,f x=negb x)->forall b,f(f b)=b.
Proof.intros f.destruct b.- rewrite H. rewrite H. reflexivity. - rewrite H. rewrite H. reflexivity. 
Qed.

3 andb_eq_orb

Theorem andb_eq_orb :forall (b c : bool),(andb b c = orb b c) ->b = c.
Proof.intros b.destruct b.-simpl. intros c. intros H. rewrite->H. reflexivity.-simpl. intros c. intros H. rewrite->H. reflexivity.
Qed.

这里没有选择将可能的结果全部析构,而是析构一个变量后直接将式子化简(不要小看simpl的化简能力)


http://chatgpt.dhexx.cn/article/2h9uHJOE.shtml

相关文章

【Coq学习】Formal Reasoning About Programs 阅读笔记第一章第二章

《Formal Reasoning About Programs》是MIT的一个计算机科学的教授Adam Chlipala写的&#xff0c;是一本非常经典的关于程序形式化推理的书&#xff0c;阅读本书需要一定的数学和计算机科学基础。此外&#xff0c;这本书是使用 Coq 作为主要的形式化推理工具&#xff0c;因此在…

coq程序编写好用的IDE推荐

编写coq程序需要一个后台coq库&#xff08;负责证明过程推导等所有功能&#xff0c;提供coq的所有服务&#xff09;&#xff0c;一个界面编辑器组成。 可以编写coq的开发环境大概有3个&#xff1a; 1、coqIDE 这个是coq官方的&#xff0c;下载地址 Install Coq | The Coq Pr…

coq 的一点体会

用coq做了一个作业&#xff0c;所以现在会一点点证明了。不过这只是coq中的很小很小的一部分&#xff0c;现在把我的理解写出来。 首先隆重介绍命题逻辑的5种基本连接词&#xff1a; ~ 非 /\ 合取 \/ 析取 -> 蕴含 <-> 等价 每种连接都有两种基本规则&#xff1a; int…

形式化方法 | Proof Engineering in Coq——Coq tatics 在命题逻辑证明中的应用

一、Coq的安装与使用 1、Coq简介 Coq是一款交互式证明辅助工具&#xff0c;提供一套证明系统&#xff0c;可以编写证明、检查证明&#xff1b;也提供一套形式化语言&#xff0c;可编写数学算法、定义、定理&#xff1b;它还可以用于程序的正确性证明。 2、Coq的安装 Coq-8.1…

coq学习笔记

coq在设置里把这些都勾选上&#xff0c;写代码会好用很多 Check关键字输出待测类型的&#xff0c;可以输出一个十进制数&#xff0c;但是还是类型的显示罢了 Compute计算定义的函数的输出值 simpl关键字是为了化简的可视化罢了&#xff0c;即显示化简的中间过程&#xff0c;不…

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…