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

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

Inductively Defined Propositions    ( IndProp )

 

 
 
递归命题
在前面有介绍过几种说明自然数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==
 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值