Software Foundations Vol.I : 归纳证明(Induction)

news/2025/10/6 1:36:48/文章来源:https://www.cnblogs.com/mesonoxian/p/19127209

Software Foundations Vol.I : 归纳证明(Induction)


归纳法证明

我们在上一章中通过基于化简的简单论据证明了 0 是 + 的左幺元。 我们也观察到,当我们打算证明 0 也是 + 的 '右' 幺元时事情就没这么简单了

Theorem plus_n_O_firsttry : ∀ n:nat,n = n + 0.
Proof.intros n.simpl. (* Does nothing! *)
Abort.

只应用 reflexivity 的话不起作用,因为 n + 0 中的 n 是任意未知数,所以在 + 的定义中 match 匹配无法被化简。

即便用 destruct n 分类讨论也不会有所改善:诚然,我们能够轻易地证明 n = 0 时的情况;但在证明对于某些 n' 而言 n = S n' 时,我们又会遇到和此前相同的问题。

Theorem plus_n_O_secondtry : ∀ n:nat,n = n + 0.
Proof.intros n. destruct n as [| n'] eqn:E.- (* n = 0 *)reflexivity. (* 虽然目前还没啥问题... *)- (* n = S n' *)simpl. (* ...不过我们又卡在这儿了 *)
Abort.

虽然还可以用 destruct n' 再推进一步,但由于 n 可以任意大, 如果照这个思路继续证明的话,我们永远也证不完。

为了证明这种关于数字、列表等归纳定义的集合的有趣事实, 我们通常需要一个更强大的推理原理:'归纳'。

自然数的归纳法则:

  • 证明 P(O) 成立;
  • 证明对于任何 n',若 P(n') 成立,那么 P(S n') 也成立。
  • 最后得出 P(n) 对于所有 n 都成立的结论。
Theorem plus_n_O : ∀ n:nat, n = n + 0.
Proof.intros n. induction n as [| n' IHn'].- (* n = 0 *) reflexivity.- (* n = S n' *) simpl. rewrite <- IHn'. reflexivity. 
Qed.

induction: 通过数学归纳法对命题进行证明的策略.

Coq中也同样,以证明 P(n) 对于所有 n 都成立的目标开始, 然后(通过应用 induction 策略)把它分为两个子目标:一个是我们必须证明 P(O) 成立,另一个是我们必须证明 P(n') → P(S n')。

和 destruct 一样,induction 策略也能通过 as... 从句为引入到 子目标中的变量指定名字。由于这次有两个子目标,因此 as... 有两部分,用 | 隔开。

Theorem minus_diag : ∀ n,minus n n = 0.
Proof.(* 课上已完成 *)intros n. induction n as [| n' IHn'].- (* n = 0 *)simpl. reflexivity.- (* n = S n' *)simpl. rewrite → IHn'. reflexivity. 
Qed.

(其实在这些证明中我们并不需要 intros:当 induction 策略被应用到包含量化变量的目标中时,它会自动将需要的变量移到上下文中。)

证明中的证明

和在非形式化的数学中一样,在 Coq 中,大的证明通常会被分为一系列定理, 后面的定理引用之前的定理。但有时一个证明会需要一些繁杂琐碎的事实, 而这些事实缺乏普遍性,以至于我们甚至都不应该给它们单独取顶级的名字。

如果能仅在需要时简单地陈述并立即证明所需的“子定理”就会很方便。 我们可以用 assert 策略来做到。

Theorem mult_0_plus' : ∀ n m : nat,(0 + n) × m = n × m.
Proof.intros n m.assert (H: 0 + n = n). { reflexivity. }rewrite → H.reflexivity. 
Qed.

assert 策略引入两个子目标。第一个为断言本身,通过给它加前缀 H: 我们将该断言命名为 H。(当然也可以用 as 来命名该断言,例如 assert (0 + n = n) as H。

第二个目标 与之前执行 assert 时一样,只是这次在上下文中,我们有了名为 H 的前提 0 + n = n。

举例来说,假如我们要证明 (n + m) + (p + q) = (m + n) + (p + q)。

Theorem plus_rearrange_firsttry : ∀ n m p q : nat,(n + m) + (p + q) = (m + n) + (p + q).
Proof.intros n m p q.(* 我们只需要将 (m + n) 交换为 (n + m)... 看起来 plus_comm 能搞定!*)rewrite → plus_comm.(* 搞不定... Coq 选错了要改写的加法! *)
Abort.

为了在需要的地方使用 plus_comm,我们可以(为此这里讨论的 m 和 n) 引入一个局部引理来陈述 n + m = m + n,之后用 plus_comm 证明它, 并用它来进行期望的改写。

Theorem plus_rearrange : ∀ n m p q : nat,(n + m) + (p + q) = (m + n) + (p + q).
Proof.intros n m p q.assert (H: n + m = m + n). { rewrite → plus_comm. reflexivity. }rewrite → H. reflexivity. 
Qed.

我们不难发现,相比起上面的例子,这里的例子将引理中的符号指定为特定的m与n,解决了问题.

形式化证明 vs 非形式化证明

“'非形式化证明是算法,形式化证明是代码。'”

由于我们在本课程中使用 Coq,因此会重度使用形式化证明。但这并不意味着我们 可以完全忽略掉非形式化的证明过程!形式化证明在很多方面都非常有用, 不过它们对人类之间的思想交流而言 '并不' 十分高效。

例如,下面是一段加法结合律的证明:

Theorem plus_assoc' : forall n m p : nat,n + (m + p) = (n + m) + p.
Proof. intros n m p. induction n as [| n' IHn']. - reflexivity.- simpl. rewrite → IHn'. reflexivity. 
Qed.

Coq 对此表示十分满意。然而人类却很难理解它。

一个(迂腐的)数学家可能把证明写成这样:

'定理': 对于任何 n、m 和 p,
$$n + (m + p) = (n + m) + p.$$

'证明': 对 n 使用归纳法。
首先,设 n = 0。我们必须证明
$$ 0 + (m + p) = (0 + m) + p.$$
此结论可从 + 的定义直接得到。
然后,设 n = S n',其中
$$ n' + (m + p) = (n' + m) + p.$$
我们必须证明
$$ (S n') + (m + p) = ((S n') + m) + p.$$
根据 + 的定义,该式可写成
$$ S (n' + (m + p)) = S ((n' + m) + p),$$
它由归纳假设直接得出。'证毕'。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外贸网站建设和seo海淀网站建设多少钱

本质上, 这两种方式都是加载CSS文件, 但还是存在着细微的差别 import 机制不同于link&#xff0c;link是加载页面前css加载完毕&#xff0c;import 是先读取文件再加载import是css2.0里的 ie5以上不支持用js控制dom时改变样式&#xff0c;只能用link&#xff0c;import不是dom…

广州网站建设app开发哈尔滨网页模板建站

首先思考一个问题&#xff1a;如果 Dubbo 应用使用 ZooKeeper 作为注册中心&#xff0c;现在需要切换到新的 ZooKeeper 实例&#xff0c;如何做到流量无损&#xff1f; 本文提供解决这个问题的一种方案。 场景 有两个基于 Dubbo 的微服务应用&#xff0c;一个是服务提供者&…

Software Foundations Vol.I : Coq函数式编程(Basics)

好久没写随笔了,随便投投.这里的内容主要取至《软件基础》第一卷https://coq-zh.github.io/. 我补充了一部分习题的答案,在https://github.com/mesonoxian-yao/softwareFoudations-volume1-coqLearn可以看看. Software…

Python 在自然语言处理中的应用与发展

一、引言 🗣️ 自然语言处理(NLP)是人工智能的重要分支,旨在让计算机理解、生成和处理人类语言。它广泛应用于 搜索引擎、机器翻译、智能客服、情感分析、舆情监测 等场景。Python 作为 AI 研究和工程实现的主流语…

专业的深圳网站建设公司排名深圳网站制作公司在那

文章目录 解决TensorRT加速推理SDXL出现黑图问题1. fp162. 更换vae 解决TensorRT加速推理SDXL出现黑图问题 一般产生黑图&#xff0c;仅需要修改下面两个问题即可解决。 1. fp16 将pipeline中的fp16修改为fp32。 在使用稳定扩散&#xff08;Stable Diffusion&#xff09;生…

影响网站可用性的因素青州网站设计

文章目录 协议局域网通信IP 地址网络通信的本质tcp 和 udp 协议网络字节序网络主机数据转化接口 协议 协议&#xff1a;收到数据后&#xff0c;多出来的那一部分&#xff0c;也叫一种 “约定”&#xff0c;一整套的自硬件到软件&#xff0c;都有协议&#xff0c;需要有人定制&a…

Python 在网络爬虫与数据采集中的应用

一、引言 🌐 在大数据时代,数据已成为企业与科研的核心资产。然而,很多数据并不以结构化形式直接提供,需要通过网络爬虫和采集技术来获取。Python,凭借其简洁的语法、强大的第三方库和活跃的社区支持,已经成为网…

开通网站主机站长统计网站统计

栅格数据是一种从远处表示地球表面和大气的地理空间数据,通常使用卫星或航空传感器。它是一种基于网格的数据结构,其中网格中的每个单元或像素代表地球表面的特定位置。这些像素可以存储各种类型的信息,例如海拔、温度、土地覆盖、降水量或与该位置相关的任何其他连续或分类…

做网站和seo哪个好网站制作的收费标准

虚拟机Linux系统网络配置&#xff1a; 1、Vmware网络设置 虚拟机设置->网路适配器->网络连接 桥接模式&#xff1a;能提供独立的IP地址的情况下使用NAT模式&#xff1a;一台计算机只能使用一个IP&#xff0c;主机与虚拟机共享IP&#xff0c;外部网络无法发现虚拟机&#…

wordpress 企业整站源码岳阳网站建设网站

点击访问体验 之前有体验过github的代码助手&#xff0c;奈何收费了&#xff0c;上周发现有一个免费的代码助手。 下载安装 vscode 搜索扩展 TONGYI Lingma 安装完成后登陆即可体验 写注释让他写代码 根据上下文自动补充 这里我只写了一个方法名&#xff0c;getAgencyList…

15_spring_data_neo4j简单教程

Spring Data Neo4j 简单教程 简介 Spring Data Neo4j 是 Spring Data 项目的一部分,它提供了对 Neo4j 图数据库的集成支持。通过 Spring Data Neo4j,开发者可以轻松地在 Spring Boot 应用中使用 Neo4j 数据库,利用图…

珠海网站制作哪家便宜久久建筑网 百度网盘

认证与权限频率组件 身份验证是将传入请求与一组标识凭据&#xff08;例如请求来自的用户或其签名的令牌&#xff09;相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。 简单来说就是&#xff1a; 认证确定了你是谁权限确定你能不能访问某个接口限制确定你访问某…

成都网站建设制作设计内蒙古最新消息今天

Python是一种高级编程语言&#xff0c;广泛用于数据科学、人工智能、网络编程等领域。 Python提供了许多内置函数和标准库&#xff0c;可以完成各种任务&#xff1a; 1、print()函数&#xff1a;将文本输出到控制台。可以将字符串、数字和变量等输出到控制台。 2、input()函…

创建自己的网站怎么弄宁乡市住房和城乡建设局网站

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由&#xff0c;然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较&#xff0c;从而决定是否将该最优…

重庆商家网站农村自建房设计师哪里找

目录 Python基础&#xff08;八&#xff09;--迭代&#xff0c;生成器&#xff0c;装饰器与元类 1 迭代 1.1 可迭代对象与迭代器 1.2 自定义迭代类型 1.3 迭代合体 2 生成器 2.1 什么是生成器 2.2 生成器表达式 2.3 生成器函数 3 装饰器 3.1 闭包 3.2 什么是装饰器 …

如何向百度举报网站国外网站怎么上

2019独角兽企业重金招聘Python工程师标准>>> 安装。。。后查看 import django django.VERSION #输出版本号&#xff0c;目前自己是py2.7.9和django1.8 1&#xff0c;新建一个django-project django-admin.py startproject project-name 一个project一般为一个项目 …

网站制作费用申请移动互联网开发记事本项目告别

这一篇讲解消费者 文章目录一、依赖配置1. 引入依赖2. 配置文件3. 主配置二、代码Conding2.1. 消费者代码一、依赖配置 1. 引入依赖 <!--springboot整合RabbitMQ依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>sp…

济南seo外贸网站建设小型公司网站建设

AV1 屏幕内容编码 为了提高屏幕捕获内容的压缩性能&#xff0c;AV1采用了几种编码工具&#xff0c;例如用于处理屏幕画面中重复模式的内帧内块复制&#xff08;IntraBC&#xff09;&#xff0c;以及用于处理颜色数量有限的屏幕块的调色板模式。 帧内块拷贝 AV1 编码中的 Intra …

锦州做网站哪家好cloudfare wordpress

文章目录 Spring Boot 约定大于配置&#xff1a;实现自定义配置引言1. Spring Boot 的约定大于配置2. 自定义配置的需求3. 实现自定义配置的步骤4. 示例&#xff1a;自定义 Spring MVC 配置4.1 创建自定义配置类4.2 创建自定义拦截器4.3 测试自定义配置 5. 其他自定义配置场景5…

CF2152G Query Jungle(线段树,重链剖分,*)

CF2152G Query Jungle 子树翻转,求没有黑色子孙的黑色点个数。套上 mincnt 标签和双生 rev 标签即可。不明白提交记录里的人都在写什么鬼。 Code const int inf = 1 << 30;struct Node {int m1 = inf, mc1 = 0,…