第五章 归纳关系与规则归纳 Inductive Relations and Rule Induction

类似于在第 2 章讨论过的归纳定义的集合或类型定义(inductive set or type definitions),本章介绍以归纳方式定义relations关系(和predicates谓词,单个参数的relation的通俗名称),并给了一些简单的示例。

补充:
关系是定义在类型之上的一种特殊函数,它描述了类型中元素之间的某种关系。谓词是一种关系,它只描述单个元素的某种性质或特征。
使用归纳方式定义关系或谓词的基本思想是,先定义一个基础情况(即关系或谓词的初始状态),然后定义如何将该关系或谓词“递归”到更大的情况。这个递归定义通常包括一个归纳步骤和一个递归调用。
例如,假设我们想定义一个关系“大于”,它描述自然数之间的大小关系。我们可以先定义“大于”关系的基础情况为自然数0不大于任何自然数,然后定义如何将“大于”关系递归到更大的自然数上:对于任意自然数n,如果n大于m,则n+1也大于m+1。
类似地,我们可以使用归纳方式定义一个谓词“偶数”,它描述自然数是否为偶数。我们可以先定义基础情况为自然数0是偶数,然后定义如何将“偶数”谓词递归到更大的自然数上:对于任意自然数n,如果n-2是偶数,则n也是偶数。

5.1 定义为归纳谓词的有限集 Finite Sets as Inductive Predicates

补充:
在Coq中,使用Definition命令定义谓词,谓词是指定义在一个或多个变量上的布尔值函数。谓词常用于定义性质和限制条件,例如素数、偶数等。谓词也可以用于定义关系,例如等价关系、有限状态机等。

一个归纳谓词是一个描述特定集合的谓词,它可以通过一系列的规则(也称为构造子)来定义。

任何有限集finite set都很容易定义为谓词predicate,可以使用一组不包括前提的推理规则来表示。例如,如果最喜欢的数字是17、23和42,我们可以这样定义谓词favorites:

就像将inductive sets定义为满足给定推理规则的最小的集合一样,现在我们将inductive predicates定义为满足规则的最小谓词。上面这个例子给出的规则要求接受17、23和42,不能再多,因此这3个值正是这个谓词所接受的值。

任何归纳谓词定义都有相应的induction principle归纳原理,也就是之前讲过的结构归纳法:如果我们想证明归纳定义的任意P(x)都能推出Q(x),那么我们只需要根据P的归纳定义,证明Q(x)对所有原子形式的P(x)都成立,以及对P(x)的所有构造方法,Q(x)也保持成立。

补充:结构归纳

对于上面举的谓词favorites归纳定义的例子,由于它只有3个原子形式的构造子,是一个退化的归纳定义,它的原理不需要归纳假设,因此我们只需要证明Q(x)对所有原子构造子都成立就行了:

回顾:第二章讲过的结构归纳原理
https://blog.csdn.net/qq_53287459/article/details/127186625?spm=1001.2014.3001.5501#t6

通常,用在proofs of relations关系证明上面的归纳称为rule induction归纳规则,比如下面这个简单的定理证明:对于任意x,如果favorites(x)为真,那么x<50。

5.2 关系的传递闭包 Transitive Closure of Relations

补充:
传递闭包是一个关系的扩展,它包含了原始关系中所有可以通过一系列关系连接起来的元素对。例如,如果关系R表示“x可以到达y”,则R的传递闭包将包括所有可以通过一系列“可以到达”关系连接起来的元素对。传递闭包关系是传递性的,即如果R中有元素对(x, y)和(y, z),则传递闭包中必定包括元素对(x, z)。

如果R表示一个二元关系的话,那么它的传递闭包R+的定义如下:

也就是说,R+是满足这两个规则的最小关系,既包含 R 又是传递的。

要证明对任意的x,y,如果xy满足R的传递闭包关系,那么Q(x,y)成立,我们需要应用第二章讨论过的方法(改变规则结论并添加新的归纳假设)来得出 R+ 的归纳原理:

下面用自然数的小于关系作为传递闭包的例子:如果用向右开口的这个符号<表示x比y小1的关系,也就是x+1=y,那么这个关系的传递闭包<+就可以表示小于关系,也就是说第一个参数可以通过某个有限数量的增量到达第二个参数。

下面是几个小于关系传递闭包相关的定理证明:

定理5.2,如果任意自然数xy满足小于的传递闭包关系,那么x<y. 证明是利用结构归纳的方法,可以把上面说的Q(x,y)看成x<y的关系,来看看证明的中间过程:

第一步,由上面传递闭包的归纳原理定义我们知道,我们需要证明两个目标,一个是在xy满足x+1=y的前提H下证明Q(x,y),也就是x<y;另一个是在x y z满足Q(x,y)和Q(y,z)的前提下证明Q(x,z),也就是x<z。

对于第一个目标,我们把oneApart的定义在前提H中展开,就得到了x与y的关系是x+1=y,那么由线性运算的策略很容易证明x<y。

对于第二个目标,需要引入两个前提以及两个归纳假设,前提H表示xy满足传递闭包关系,前提H0表示yz满足传递闭包关系,归纳假设IHtc1表示x<y,归纳假设IHtc2表示y<z, 那么由线性运算可以得出x<z。

引理5.3:对于任意的自然数n k,n和(1+k)+n满足传递闭包关系。

证明方法是对k进行归纳证明,产生两个证明子目标,一个是k=0的情况,目标为证明n与n+1满足传递闭包关系;另一个是k=k+1的情况,目标变成证明n与1+(1+(k+n))满足传递闭包关系。

对于第一个目标,应用TcBase : forall x y, R x y -> tc R x y,匹配右端,得到需要继续证明n与S n满足n+1=S n的关系。

和之前一样,把oneApart的定义展开后进行线性算术化简即可得证。

对于第二个目标,需要引入归纳假设IHk: n与1+(k+n)满足传递闭包关系。

通过应用TcTrans : forall x y z, tc R x y -> tc R y z -> tc R x z,匹配右端,令y=1+(k+n),得到两个证明子目标:一是证明n与1+(k+n)满足传递闭包,二是证明1+(k+n)与1+(1+(k+n))满足传递闭包。

通过应用归纳假设IHk,第一个子目标得证。

对于第二个子目标,再次应用TcBase : forall x y, R x y -> tc R x y,匹配右端,得到需要继续证明1+(k+n)与1+(1+(k+n))满足1+(k+n) +1=1+(1+(k+n))的关系。

同样的,将oneApart的定义展开后用线性算术进行化简即可得证。

定理5.4:如果自然数n<m,那么n和m满足小于的传递闭包关系。

证明时通过把m替换为1+(m-n-1)+n的等价形式,结合上一个引理5.3,就可以把k看作等于m-n-1后直接应用引理5.3就得证了。

代码还提供了一个R+与R++的逻辑等价的证明练习,需要在证明的两个方向上进行rule induction。

5.3 排列 Permutations

补充:
一个列表(list)的permutation(排列)指的是对这个列表元素的重新排列,产生一个新的列表,使得原来列表中的每个元素在新列表中都有且只有一个对应位置。
例如,给定列表 [1, 2, 3],它的所有排列有 [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1],这些排列是由对原始列表的元素进行重新排列得到的。
通常,如果列表中有n个元素,它的所有排列的数量是n的阶乘,即n!,其中0!=1。因此,当n比较大时,列表的排列数量会非常庞大。

我们可以使用归纳关系来解释一个列表何时是另一个列表的排列,这里用中缀关系符~表示:

我们用之前一样的方法推导出它的归纳原理,表明对于任意的l和l',若l~l',那么Q(l,l')成立:

下面例举了一些合理的代数性质以及对应的证明。

引理5.5:对于任意的列表l,在表头加入元素a是在表尾连接一个元素a的排列。

证明方法是对列表l进行归纳证明,产生两个证明子目标,一种情况是列表l为空[],那么目标一是证明[a]是[a]的排列;另一种情况是列表可以表示为a0::ls,也就是列表至少有一个元素a0的情况,那么目标需要证明a::a0::ls是a0::ls++[a]的排列。

对于第一个子目标,应用perm_skip : forall x l l', Permutation l l' -> Permutation (x::l) (x::l'),匹配目标右端,得出需要继续证明[]是[]的排列。

应用perm_nil : Permutation [] [],第一个子目标即可得证。

对于第二个子目标,需要引入一个归纳假设IHls。用perm_trans : forall l l' l'', Permutation l l' -> Permutation l' l'' -> Permutation l l'',令l'为a0::a::ls,匹配目标右端,得出需要继续证明的两个子目标,分别是证明a::a0::ls和a0::a::ls是排列、证明a0::a::ls和a0::ls++[a]是排列。

对于第一个子目标,应用perm_swap : forall x y l, Permutation (y::x::l) (x::y::l)即可得证。

对于第二个子目标,应用perm_skip : forall x l l', Permutation l l' -> Permutation (x::l) (x::l'),匹配目标右端,得出需要继续证明a::ls和ls++[a]是排列。

使用归纳假设IHls,目标得证。

定理5.6:对于任意列表l,l是l的逆序的排列。

同理,对l进行归纳证明。

定理5.7:对于任意的列表l1、l2,如果l1是l2的一种排列,那么l1的元素个数等于l2的元素个数。

对排列关系的定义进行归纳证明,一共有4种情况,产生4个证明子目标,每个子目标都可以通过第二章提到过的带未解释函数的相等理论equality with uninterpreted functions(https://blog.csdn.net/qq_53287459/article/details/127186625#t7)进行证明。

引理5.8:列表l的排列包括自身。

对列表进行归纳证明,产生两个子目标。

引理5.9:如果l1和l2是排列关系,那么同时在l1和l2右端连接上一个相同的列表l后,二者依然满足排列关系。

引理5.10:如果l1和l2是排列关系,那么同时在l1和l2左端连接上一个相同的列表l后,二者依然满足排列关系。

定理5.11:如果l1与l1'满足排列关系、l2与l2'满足排列关系,那么l1与l2连接后的列表和l1'与l2'连接后的列表也满足排列关系。

5.4 最小命题逻辑 A Minimal Propositional Logic

补充:
命题逻辑和一阶逻辑(谓词逻辑)
命题逻辑、一阶逻辑和二阶逻辑

由于编程语言和逻辑之间存在着紧密的联系,编程语言里同样的技术也经常应用于逻辑公式的形式化语言。因此,这一节使用命题逻辑作为例子来体验形式化逻辑,同时继续练习归纳关系。

作为对逻辑公式的语法树进行推理的热身,下面是基本命题逻辑公式的定义:包含4个构造子,分别是真、假、合取、析取。

下面是predicate "proves"(谓词“证明”)的简单归纳定义:真显然为真,假不能证,证明合取需要同时证明两个合取,证明析取需要证明其中一个或另一个。

一个简单的解释器也可以用来解释这种语言:

接下来要证明这两种表达的一致性:

定理5.12:归纳谓词的可靠性。对于任意的命题逻辑公式p,如果p能够被证明,那么p就能够被解释。

定理5.13:归纳谓词的完备性。对于任意的命题逻辑公式p,如果p能够被解释,那么p就能够被证明。

对p进行归纳证明,按p的归纳定义产生4个证明子目标。蕴含的前件作为前提添加到证明中。

5.5 带有蕴含的命题逻辑 Propositional Logic with Implication

【Coq学习】Formal Reasoning About Programs 阅读笔记第五章相关推荐

  1. 深入理解 C 指针阅读笔记 -- 第五章

    Chapter5.h #ifndef __CHAPTER_5_ #define __CHAPTER_5_/*<深入理解C指针>学习笔记 -- 第五章*//*不应该修改的字符串就应该用 co ...

  2. js高级教程阅读笔记 第五章-引用类型(5.6)

    函数内部属性 函数中有两个特殊的对象. arguments:它包含了所有的参数,重要的是它的一个叫做callee的属性,用于指向拥有这个参数的函数.好处是什么呢 实例: function fa(num ...

  3. buc算法java实现,数据挖掘概念与技术(hanjiawei)阅读笔记--第五章(数据立方体技术)...

    BUC 1.BUC(Botom-Up Construction)概念 从顶点方体向下计算冰山立方体 计算稀疏冰山立方体的算法 基于先验性质进行剪枝 ### 2.算法计算 例A(a1,a2,a3),B( ...

  4. 《Deep Learning Techniques for Music Generation – A Survey》深度学习用于音乐生成——书籍阅读笔记(一)Chapter 1

    <Deep Learning Techniques for Music Generation – A Survey>深度学习用于音乐生成--书籍阅读笔记(一)Chapter 1 关于这本书 ...

  5. [置顶]人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)...

    这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...

  6. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  7. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  8. 《Python从入门到实践》读书笔记——第五章 if语句

    <Python从入门到实践>读书笔记--第五章 if语句 1. 一个简单示例 cars = ['audi', 'bwm', 'subaru', 'toyota']for car in ca ...

  9. 《Java 核心技术 卷1》 笔记 第五章 继承(3)

    5.1.6 抽象类 有时候我们无法说出具体是什么,只能用于标识一个类型,比如图形,就可作为抽象类.虽然无法具体描述图形,但是图形通常都有面积.周长.这种时候就可用抽象类标识. 抽象类使用abstrac ...

最新文章

  1. 谈谈 Docker 网络
  2. 实验6      VRRP网关备份(下)
  3. java的输出的例子_Java例子:万年历的输出
  4. 成功解决ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any(
  5. 153. 寻找旋转排序数组中的最小值 golang
  6. 怎样利用VNC远程连接LINUX桌面
  7. “命令终端”的实现4-优化之解耦
  8. ora-12154问题处理
  9. October CMS Vs Wordpress
  10. 5G NR的新特征—超低时延
  11. 基于ocanvas.js的饼图实例展示
  12. 项目实战-图像识别项目-通过QT制作图形界面并调用百度AI进行图像识别(一)
  13. python能做ppt吗_python可以写PPT吗
  14. 路由器专用计算机,AUX端口常是通过专用连线与计算机连接,用来对路由器进行基本配置.._简答题试题答案...
  15. adams数据导出matlab,adams数据导入matlab
  16. 软件工程——Beta冲刺(1/3)
  17. 有哪些免费好用的在线视频编辑工具?
  18. element ui加入甘特图
  19. BR系列罗氏线圈变送器 安科瑞 时丽花
  20. 天津理工大学计算机操作系统期末知识点复习

热门文章

  1. Razor视图引擎、控制器与路由机制学习
  2. 【CCF-GAIR特别报道】深度对话周志华教授和颜水成博士
  3. 【高级篇 / System】(7.0) ❀ 06. HA 下配置核心交换机 (上) ❀ FortiGate 防火墙
  4. 日语二级能力考试听力常见词汇
  5. ECharts+Bootstrap实现响应式中国地图
  6. 计算物理学(数值分析)上机实验答案1、误差分析
  7. 零基础学韩语nbsp;练习韩语口语发…
  8. 标准十进制ASCII码表
  9. 解决小程序button: text-align: center;不生效的问题
  10. 监考系统监视范围_医用内窥镜摄像系统解决方案