【coq】函数语言设计 笔记 07 - indProp

article/2025/10/21 13:15:11

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

Inductively Defined Propositions    ( IndProp )

  • Inductively Defined Propositions

  • Inductive Definition of Evenness

  • Using Evidence in Proofs

  • Inversion on Evidence

  • Induction on Evidence

  • Inductive Relations

  • Case Study: Regular Expressions

  • The remember Tactic

  • Case Study: Improving Reflection

 

 
 
递归命题
在前面有介绍过几种说明自然数n是一个偶数的方法,比如:

  1. evenb n = true,或者
  2. exists k, n = double k

现在,可以通过一条递归的规则来判断一个整数n是否是偶数:

  • ev_0:数字0是偶数
  • ev_SS:如果n是偶数,那么S(S n)也是偶数

 
类似于证明规则
在这里插入图片描述

 
 
而推导类似于证明树
在这里插入图片描述

 
 
根据上面规则可以将整数的偶数性定义为:
TxP96BGEuiRvhVlFS2hksym9Op3pXtOdB2tVw3ikSAAANpCKx4AQFtrG+LVO2mEmbygCgDgtkFHDQCAttBRAwCgLYR4AABtIcQDAGgLIR4AQFsI8QAA2kKIBwDQFkI8AIC2EOIBALSFEA8AoC2EeAAAbSHEAwBoCyEeAEBbCPEAAJoi5P8caG6Z9xevIgAAAABJRU5ErkJggg==
 
证明规则
A2bcseYDR2REAAAAAElFTkSuQmCC
证明树举例
gAAAABJRU5ErkJggg==
使用 coq 语言证明 prop
( Theorem :prop )
B4CJVp8tHNfKAAAAAElFTkSuQmCC
 
类似的奇数(不减)的定义
I7cVeHEXWXimjSiEAAACcqyrZNgAAALSnUpM0AAAAaHPItgEAADoGwjYAAEDHQNgGAADoGAjbAAAAHQNhGwAAoENw3P8H4cGwOXsh7wMAAAAASUVORK5CYII=
 
 
当然,如果假设中也用到了这个性质,那么同样也可以使用这些规则:
( Theorem 名字: 量词,命题)
其中 { 命题 - 》命题)可以组合成大命题
2QW1ahoUtr8AAAAASUVORK5CYII=
 
 

在这里插入图片描述
在这里插入图片描述

 
 
 
在一个归纳式定义中,冒号左边的类型构造器的参数被称为 " 参数 " ,而右边的参数被称为 " 索引 " 或 " 注解 " 。
In an Inductive definition, an argument to the type constructor on the left of the colon is called a "parameter", whereas an argument on the right is called an "index" or "annotation."
举例
Jh1K8QtQAAAAASUVORK5CYII=
the X is a parameter;
 
xCmaA0NhjVUgTC8v7K2Ami0POOdgmz3AAAMM+EphgAAfxwI4gAADEMQBwBgGII4AADDEMQBABiGIA4AwDAEcQAAhiGIAwAwDEEcAIBhCOIAAAxDEAcAYBiCOAAAwxDEAQAYhiAOAMAwBHEAAIYhiAMAMAxBHACAYQjiAAAMQxAHAGAWIf8H0NBwWtsYfbsAAAAASUVORK5CYII=
the unnamed nat argument is an index.
 
证据 -
"evidence constructors" ev_0 : ev 0 and ev_SS : ∀ n, ev n → ev (S (S n)).
这些证据构造器可以被认为是 " 原始的均匀性证据 " ,它们可以像被证明的定理一样被使用。
 
在证明中使用 证据
上面所定义的递归类型的命 题在coq中被称为证据(evidence)
而上面递归定义的声明不仅告诉Coq通过上面那两种方法可以构造出一个偶数n,并且声明了只能 通过上面的两个构造器才能构造出一个整数
换句话说,如果给出一个假设E声称n是一个偶数,即even n,那么E必然是下面两种结构中的一种:

  • E is ev_0(and n is 0)
  • E is ev_SS n' E'(and n is S (S n)), E' is the evidence for even n'

 
 
 
 
 
[inversion] 策略
由于这个特性,就和自然数一样,可以针对even类型的命题使用[destruct]策略
在这里插入图片描述

 
 
关于 exist 的证明
在这里插入图片描述
在这里插入图片描述

 
 
 
 
举例 2
在这里插入图片描述

 
 
像这样的事实通常被称为 "反转定理"( inversion lemma ),因为它们允许我们 "反转 "一些给定的信息,以推理出它可能产生的所有不同方式。它们可以用 destruct 证明
 
然而[destruct]策略在下面这种情况下便行不通了:
0DwuKrTn1hkAAAAASUVORK5CYII=
Theorem evSS_ev : forall n,
even (S (S n)) -> even n.
Proof.
intros n E.
destruct E as [| n ' E' ].

  • (* E = ev_0. )
    (
    We must prove that n is even from no assumptions! *)
    Abort.
     
    到底发生了什么?调用destruct的效果是用每个构造函数所对应的值来替换所有出现的属性参数。这在ev_minus2的情况下是足够的,因为参数n在最终目标中被直接提到。然而,在evSS_ev的情况下,这并没有帮助,因为被替换的术语(S(S n))并没有在任何地方提到。
    如果我们记住这个术语S(S n),证明就会顺利进行。(我们将在下面详细讨论记忆的问题)。
    What happened, exactly? Calling destruct has the effect of replacing all occurrences of the property argument by the values that correspond to each constructor. This is enough in the case of ev_minus2 because that argument n is mentioned directly in the final goal. However, it doesn't help in the case of evSS_ev since the term that gets replaced (S  ( S n ) ) is not mentioned anywhere.
    If we  remember  that term  S  ( S n ) , the proof goes through
     
     
     
    假设我们正在证明一些涉及数字 n 的事实,并且我们得到了 ev n 作为一个 H 。我们已经知道如何使用 destruct 或 induction 对 n 进行分类讨论、归纳,为 n=O 的情况和 n=S n' 的情况生成单独的子目标。
    但是对于某些证明,我们可能反而想 直接分析 ev n 的证据。
     
    【 inversion 】
    有时你有一个假设,除非其他事情也是真的,否则就不可能是真的 。我们可以用反转法 来发现一个假设为真的其他必要条件。
     
    在这个例子中,
    在这里插入图片描述
    在这里插入图片描述

 
 
 
 
我们假设 H :S a = S b。然而,由于我们构造nats的方式,只有当a = b时,这才可能是真的。
我们使用反转法使Coq分析它可以构建a和b的方式,它意识到它们必须是相等的,并将其加入上下文。
 
反转策略做了相当多的工作。例如,当应用于一个平等假设时,它同时做了判别和注入的工作。此外,它还进行了通常在注入的情况下必须进行的介绍和改写。
在这里插入图片描述
在这里插入图片描述

 
 
 
 
 
某种情况和 discriminate 等价

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 
 
 
 
 
 
 

[induction]策略 **** **** 证据 -induction on evidence
和前面介绍[induction]策略时的处境一样,当使用[destruct]策略进行case analysis无法解决问题时,那么首选的解决方法就是[induction]策略
递归定义使用 induction 证明更容易
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 
 
 
 
 
 
 
 
 
 
 

递归关系 **** - Induction Relations
一个单参数命题 (A proposition parameterized by a number (such as ev)) 可以被认为是 一种属性( ** property**
即它定义了 nat 的一个子集,该命题对其可证明的那些数字。
 
 
一个双参数命题 (a two-argument proposition ) 可以被认为是一种关系 (relatio n) –
即它定义了一个命题可被证明的配对集合
it defines a set of pairs for which the proposition is provable.
 
 
就像属性一样,关系可以被归纳地定义
 
 
例子:
小于等于
wO+99cFu7lFIQAAAABJRU5ErkJggg==
 
nFEjp9gAAAABJRU5ErkJggg==
 
 
LsThakIwAAAABJRU5ErkJggg==
 
wMoN7+li4YCJAAAAABJRU5ErkJggg==
 
 
同样的,也可以对关系证明一些定理:
 
 
正则表达式
even属性提供了一个简单的例子来说明归纳定义和推理的基本技巧,但这些定理都是一些比较简单并且不是实用的
然而Coq中的递归证明的功能远不止如此,现在展示如何使用递归定义来建模计算机科学中的一个经典概念:正则表达式
正则表达式是一种用来描述字符串和集合的简单语言,其语法定义如下:
AIbEACQX6ABAQD5BRoQAJBfoAEBAPkFGhAAkFcY+3987BNae65LIQAAAABJRU5ErkJggg==
通过以下规则连接正则表达式和字符串,这些规则定义了正则表达式何时匹配某个字符串:

  • 表达式EmptySet不匹配任何字符串。
  • 表达式EmptyStr匹配空字符串[]。
  • 表达式Char x匹配一个字符的字符串[x]。
  • 如果re1匹配s1, re2匹配s2,则App re1 re2匹配s1 ++ s2。
  • 如果re1和re2中至少有一个匹配s,则Union re1 re2匹配s。
  • 最后,如果我们可以把一些字符串s写成一个字符串序列s = s_1 ++…++ s_k,表达式re匹配每个字符串s_i,然后* re匹配s。作为一个特例,字符串序列可能是空的,不论re是怎么样的,* re总是和空字符串匹配

根据上面的规则,可以定义一个函数如下:
DuDAAAAAElFTkSuQmCC
 
reserved natation 保留的记号
一些使用方法
wGZtqhAElo5EQAAAABJRU5ErkJggg==
 
 
 
 


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

相关文章

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

Proof Proof By SimplificationProof By RewritingProof by Case Analysisdestruct例1例2多重析构 参考书目练习答案basic部分 这部分内容写了快两个星期了,期末考试越来越近,紧张紧张 Proof By Simplification 之前的代码中出现过 Proof. simpl. refle…

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

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

coq程序编写好用的IDE推荐

编写coq程序需要一个后台coq库(负责证明过程推导等所有功能,提供coq的所有服务),一个界面编辑器组成。 可以编写coq的开发环境大概有3个: 1、coqIDE 这个是coq官方的,下载地址 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…