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

第五章 归纳关系与规则归纳 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个构造子,分别是真、假、合取、析取。

命题的类型称为Prop
可以用谓词来构造带参数的命题。(所以谓词的类型也是Prop)例如,我们可以用谓词”是一个素数“构造命题”7是一个素数“,”1024是一个素数“等等。我们可以将该谓词看作一个函数,它的类型是nat->Prop。其他的例子,如谓词”是一个排序好的列表“的类型为(list Z) -> Prop,二元关系≤的类型为Z -> Z ->Prop。

通过枚举谓词的充分条件来定义一个谓词。

摘自《交互式定理证明和程序开发 Coq的艺术:归纳构造演算》

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

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

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

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

对”p能够被证明“的定义进行归纳证明,产生4个证明子目标。

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

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

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

接下来我们把命题逻辑公式的定义扩展到传统传统命题逻辑的形式,这需要我们在judgment中添加假设上下文hypothesis context。扩展后的公式定义如下:

下划线标示的是新添加的代表未知真值的命题变量p以及逻辑蕴含关系。

要实现蕴含关系,我们需要进行假设性推理hypothetical reasoning,就是试图用已知事实中的其他公式来证明一个新公式。继续用之前的谓词prove的例子,我们需要建立一系列的假设作为证明谓词的输入,用大写的希腊字母gamma(Γ)表示,并将它称为 context上下文。因此,上下文就包含我们已经给出的规则,这些规则称为introduction rules引入规则,因为每个规则都解释了如何使用特定的连接符证明一个事实(然后我们将该连接符引入当前的证明)。下面是谓词prove添加上下文gamma(Γ)之后的推理规则:

下面是肯定前件Modus ponens),它是应用蕴含的一个经典规则,也是消去规则(elimination rule)的一个例子,它解释了如何使用特定的连接词来利用一个已知事实。

一个假设规则(hypothesis rule)提供了利用上下文(Γ)内容的基本方法。

下面是应用蕴涵的引入规则在上下文中添加一个新的假设。

下面是合取连接词的消去规则(elimination rule)。

下面是使用分情况推理(reasoning by cases)消除析取,在每个情况中适当地扩展上下文。

如果上下文中引入了False,那么任何结论都能被证明。

最后是排中律(即“要么Ф要么非Ф”,不能同时为假,是形式逻辑的基本规律之一)。

这种归纳关系定义方式称为自然演绎(natural deduction)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值