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

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

参考博客:https://www.cnblogs.com/TheFutureIsNow/p/11993851.html
目录

Coq中的命题类型语句

Coq是一种类型化语言,这意味着它的世界中的每个合理表达式都有一个相关的类型。逻辑声明也不例外,任何一个可以证明的语句都有一个类型,即Prop,命题类型。
可以使用check命令查看这个类型:

在这里插入图片描述

需要注意的是,任何符合命题语法定义的语句都是Prop类型的,不论它们是否成立
命题Prop的构建方法:
• 使用表达式
• 使用已经定义的命题
• 带参数的命题

 
Check 2= 2.
Check (3 = 3) : Prop.Definition plus_claim : Prop := 2 + 2 = 4.
Check plus_claim : Prop.
Theorem plus_claim_is_true :plus_claim.
Proof. reflexivity.  Qed.
Check (forall n m : nat, n + m = m + n) : Prop.Check @eq : forall A : Type, A -> A -> Prop.Definition plus_claim : Prop := 2 + 2 = 4.
Check plus_claim : Prop.

然后可以在其他使用命题类型语句的地方用这个名称,比如[Theorem]语句中:
Theorem plus_claim_is_true :
plus_claim.
Proof. reflexivity. Qed.

还可以定义一些“带参数”的命题:

Definition injective {A B} (f : A -> B) :=forall x y : A, f x = f y -> x = y.
Lemma succ_inj : injective S.
//证明S 运算具有单射性质Proof.intros n m H. injection H as H1. apply H1.
Qed.

合取

合取
假设含合取-destruct / intros 时直接写
目标含合取-split

命题A和命题B的合取,也称为逻辑与,记为A/\B,只有当A和B同时成立的时候A/\B才成立:

Example and_example :3+4=7/\2*2=4.

如果证明目标是一个合取表达式,则需要使用[split]策略,它用于从合取表达式生成两个子目标:

Proof.split.- (* 3 + 4 = 7 *)reflexivity.- (* 2 + 2 = 4 *)reflexivity.
Qed.

对于任何命题A和B,假设A是成立的,并且B也是成立的,则可以得出结论,A/\B也是成立的:
在这里插入图片描述

该lemma and_intro 等价于 split
在这里插入图片描述
在这里插入图片描述

二者效果相同

如果需要用到的假设是一个合取表达式,那么可以使用[destruct]策略。如果证明上下文包含一个假设H,其形式为A/\B,那么destruct H as [HA HB]将把H从上下文中除去,并增加两个新的假设:HA,表示A为真;HB,表示B为真。

写法1
在这里插入图片描述

也可以在使用[intro]关键字的时候直接将上下文中的假设写成两个新的假设:
使用 [] ,把它们变成a single conjunction 单一连词
在这里插入图片描述

也可不使用 []
在这里插入图片描述

使用 [] 扔掉destruct中不需要的假设
连接词的另一种常见情况是,我们知道[A /\ B],但在某些情况下我们只需要[A]或只需要[B]。在这种情况下,我们可以做一个[destruct](可能是作为[intros]的一部分),并使用下划线模式[
]来表示不需要的连接体应该被扔掉。
在这里插入图片描述

在这里插入图片描述

关于合取,一个必然成立的结论是:如果A/\B成立,那么A必然成立,或者B必然成立:
合取的性质
commutativity theorem 交换顺序
在这里插入图片描述

associativity theorem 结合律
在这里插入图片描述
在这里插入图片描述

此时必须使用 [] 分隔假设

析取

假设中含析取,可以用[destruct]显式地进行,也可以用[intros]模式隐式地进行。
目标中含析取,使用[left] and [right]
在这里插入图片描述

引入 [left] and [right]

只需要证明其中一边的情况
在这里插入图片描述

需要均证明 左右的情况
在这里插入图片描述

实例
在这里插入图片描述

假命题和否定 Falsehood and Negation

逻辑否定运算符¬ the logical negation operator

在前面的策略中有讲述过Coq中的[discriminate]策略时,提到过如果两个假设两个不同构造器构造的变量相等,那么就可以根据这个假设推导出任何结论,因为这个假设前提就是不成立的。
即不成立的前提可用于推导任何goal

Theorem ex_falso_quodlibet : forall (P:Prop),False -> P.

逻辑非~P定义成P->False,其中False是一个在Coq标准库中定义的一个矛盾命题 a contradictory proposition

Module MyNot.Definition not (P:Prop) := P -> False.Notation "~ x" := (not x) : type_scope.Check not : Prop -> Prop.End MyNot.

因为False是一个矛盾命题,那么根据前面所提到的那个原则,如果在证明过程中得到了一个矛盾命题False,那么可以直接使用[destruct]来完成整个证明目标:

在这里插入图片描述

同样的,可以 根据逻辑非 来定义不相等:

Notation "x <> y":= (~(x = y)).

证明否命题

在这里插入图片描述

Definition not (P:Prop) := P -> False.

恒真命题

除了前面提到的矛盾命题,在coq标准库中也定义了恒真命题True:

Lemma True_is_true : True.
Proof.
(*To prove it, we use the predefined constant I : True:*)apply I.
Qed.```![在这里插入图片描述](https://img-blog.csdnimg.cn/b836972bb2a846f1b406dbb89dccd4d6.png)逻辑等价 Logical Equivalence
常见的“当且仅当”if and only if 逻辑连词,意味着两个命题有着相同的真值,可以将其定义为两个蕴含的合取:![在这里插入图片描述](https://img-blog.csdnimg.cn/f7c432911ada40819713853b79f367d9.png)逻辑等价的证明![在这里插入图片描述](https://img-blog.csdnimg.cn/bc9a380da53e43329869251ef6186fef.png)## 存在量词 Existential Quantification
另外一个比较重要的逻辑连词是存在量词。如果说一个 T 类型的变量 x 满足属性 P,则记为 exists x:T, P。**goal 中有exist,则找出特例
假设中有exist,使用destruct ,得到x,把exists x:T, P 变成 已知x 证明 P 对x成立**
举例

Definition Even x :=
exists n : nat, x = double n.

为了证明形如exists x:T,P.类型的命题,必须要证明对于某个特定的x,P属性成立。这称为**存在的见证:**![在这里插入图片描述](https://img-blog.csdnimg.cn/a30b6935e2c14d80a0d70989ccb5e941.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7fb2708bed7e4367b31eb3e8e66c2b79.png)相反的,如果假设中有存在量词exists x:T,P,那么可以使用[destruct]来获取一个存在见证x以及假设x,P:![在这里插入图片描述](https://img-blog.csdnimg.cn/67f06a7ad9114fe08cfc2a91e6243eb5.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/21ce2d3607894864b87f85d602959de9.png)

http://chatgpt.dhexx.cn/article/8lbqpONR.shtml

相关文章

离散数学——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;那效果肯定更为显著。几何画板就是符合这样要求的教学辅助工具…

矩形可以切割多少个最大的正方形

本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 题目描述 小明有一些矩形的材料&#xff0c;他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时&#xff0c;他总是从中间切割一刀&#xff0c;切出一块最大的正…

画出一个正方形

1.新建TankFrame类继承Frame类方便重写里面的方法 2.创建一个构造方法 3.把Main方法里的设置剪切进刚刚定义的构造方法&#xff08;快捷键CtrlX&#xff09;并修改里面的方法&#xff0c;并把f.删掉 import java.awt.*; import java.awt.event.WindowAdapter; import java.awt…