Coq 中的案例分析证明

2024-03-20

我试图证明关于以下函数的命题:

Program Fixpoint division (m:nat) (n:nat) {measure m} : nat :=
match lt_nat 0 n with
  | false => 0
  | true => match leq_nat n m with
      | false => 0
      | true => S (division (menos m n) n)
  end
end.

menos是自然减法。

我试图证明一些涉及除法的事实。我写下了一个非正式的证明,我首先考虑在 lt_nat 0 n 中进行案例分析,然后在 lt_nat 为真时在 leq_nat n m 中进行进一步的案例分析。这是为了减少除法的定义。

但是我找不到如何在 Coq 中表达这个案例分析。我尝试过destruct (leq_nat n m)但它什么也没做。我期望 Coq 生成两个子目标:一个是我需要证明我的命题假设leq_nat n m = false和一个假设leq_nat n m = true.

此外,我无法在我的证明中展开除法的定义!当我尝试时unfold division I get: division_func (existT (fun _ : nat => nat) m n).

我如何进行案例分析leq_nat n m?为什么我不能像通常处理其他函数那样展开除法的定义?

谢谢。


一切都比平常更复杂,因为Program Fixpoint,它没有像您期望的那样定义您的函数Fixpoint,因为它需要找到一种结构递归的方式来定义它。什么division确实是,隐藏在division_func.

因此,要操纵您的函数,您需要证明基本引理,包括声明您的函数可以被其主体替换的引理。

Lemma division_eq : forall m n, division m n = match lt_nat 0 n with
| false => 0
  | true => match leq_nat n m with
      | false => 0
      | true => S (division (menos m n) n)
  end
end.

现在的问题是如何证明这个结果。这是我所知道的唯一解决方案,我认为它确实令人不满意。

我用的是战术fix_sub_eq位于Program.Wf, or fix_sub_eq_ext in Program.Wf.WfExtensionality.

这给出了类似的东西:

Proof.
  intros.
  unfold division. unfold division_func at 1.
  rewrite fix_sub_eq; repeat fold division_func.
  - simpl. destruct (lt_nat 0 n) eqn:H.
    destruct (leq_nat n m) eqn:H0. reflexivity.
    reflexivity. reflexivity.

但第二个目标就相当复杂了。解决这个问题的简单而通用的方法是使用公理proof_irrelevance and functional_extensionality。应该可以在没有任何公理的情况下证明这个特定的子目标,但我还没有找到正确的方法。您可以使用第二种策略,而不是手动应用公理fix_sub_eq_ext它直接调用它们,只留下一个目标。

Proof.
  intros.
  unfold division. unfold division_func at 1.
  rewrite fix_sub_eq_ext; repeat fold division_func.
  simpl. destruct (lt_nat 0 n) eqn:H.
  destruct (leq_nat n m) eqn:H0. reflexivity.
  reflexivity. reflexivity.
Qed.

我还没有找到更好的使用方法Program Fixpoint,这就是为什么我更喜欢使用Function,它有其他默认值,但直接生成方程引理。

Require Recdef.
Function division (m:nat) (n:nat) {measure (fun n => n) m} : nat :=
match lt_nat 0 n with
  | false => 0
  | true => match leq_nat n m with
      | false => 0
      | true => S (division (menos m n) n)
  end
end.
Proof.
  intros m n. revert m. induction n; intros.
  - discriminate teq.
  - destruct m. discriminate teq0.
    simpl. destruct n. destruct m; apply le_n.
    transitivity m. apply IHn. reflexivity. assumption. apply le_n.
Qed.

Check division_equation.

现在您有了方程引理,您可以用它重写并像往常一样进行推理。

关于您的问题destruct, destruct不展开定义。因此,如果您在目标或任何假设中没有出现要破坏的术语,destruct不会做任何有趣的事情,除非你保存它产生的方程。您可以使用destruct ... eqn:H以此目的。我不知道case_eq但它似乎做了同样的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Coq 中的案例分析证明 的相关文章

  • 如何在 Coq 中将一条线的公理定义为两个点

    我想找一个例子axiom in Coq类似于几何中的线公理 如果给定两个点 则这两点之间存在一条线 我想看看如何在 Coq 中定义它 本质上选择这个简单的直线公理来看看如何定义一些非常原始的东西 因为我很难在自然语言之外定义它 具体来说 我
  • 证明唯一的零长度向量为零

    我有一个类型定义为 Inductive bits nat gt Set bitsNil bits 0 bitsCons forall l bool gt bits l gt bits S l 我试图证明 Lemma emptyIsAlway
  • Ltac:通过回溯重复策略 n 次

    假设我有一个像这样的策略 取自 HaysTac 它搜索一个参数来专门化一个特定的假设 Ltac find specialize in H multimatch goal with v gt specialize H v end 然而 我想写
  • coqide - 无法从同一文件夹加载模块

    我无法加载 CoqIde 中同一文件夹中的模块 我正在尝试从 Software Foundations 加载源代码 我正在包含 SF 源代码的文件夹中运行 coqidecoqide or coqide 然后打开并运行该文件后 我收到此错误
  • 证明匹配语句

    为了解决一个练习 我有以下代表整数的定义 Inductive bin Type Zero bin Twice bin gt bin TwiceOne bin gt bin 这个想法是 Twice x is 2 x 两次一x is 2 x 1
  • 如何阅读 Coq 对 proj1_sig 的定义?

    In Coq sig定义为 Inductive sig A Type P A gt Prop Type exist forall x A P x gt sig P 我读为 sig P 是一种类型 其中 P 是一个接受 A 并返回 Prop
  • 伊莎贝尔证明加法的交换律

    我试图证明 Isabelle HOL 中自定义的交换律add功能 我设法证明了关联性 但我坚持这一点 的定义add fun add nat nat nat where add 0 n n add Suc m n Suc add m n 关联
  • 将数字排列成最大数 - 算法证明

    有众所周知的算法问题 http www programcreek com 2014 02 leetcode largest number java 给定数字数组 例如 1 20 3 14 在这种情况下 以尽可能形成最大数字的方式排列数字32
  • Coqide 错误:编译的库 Basics.vo 对库做出了不一致的假设

    我在 mac os X 上使用 CoqIDE 8 4pl5 当 CoqIDE 转发到此命令时 会弹出此错误消息 需要导入基础知识 错误 编译的库 Basics vo 对库做出了不一致的假设 Coq Init Notifications 当我
  • 我可以在“coqtop - nois”下定义策略吗?

    coqtop nois Welcome to Coq 8 7 0 October 2017 Coq lt Ltac i idtac Toplevel input characters 0 4 gt Ltac i idtac gt Error
  • Coq QArith 除以零就是零,为什么?

    我注意到在 Coq 的有理数定义中 零的倒数被定义为零 通常 除以零是没有明确定义 合法 允许的 Require Import QArith Lemma inv zero is zero 0 0 Proof unfold Qeq refle
  • Coq 中的案例分析证明

    我试图证明关于以下函数的命题 Program Fixpoint division m nat n nat measure m nat match lt nat 0 n with false gt 0 true gt match leq na
  • 在 Coq 中查找 ++ 等定义和符号

    我们如何获得这些符号的定义 类型 例如 or of List 我努力了 Search Search Search SearchAbout and Check Check Check 然而它们都不起作用 SearchAbout 确实显示了一些
  • 在 Coq 中,“if then else”允许非布尔第一个参数?

    我读过一些教程if a then b else c代表match a with true gt b false gt c end 然而 很奇怪的是 前者不检查类型a 而后者当然确保a是一个布尔值 例如 Coq lt Check if nil
  • 为什么coq互感类型必须具有相同的参数?

    下列的亚瑟的建议 https stackoverflow com a 17304209 403875 我改变了我的Fixpoint相互关系Inductive这种关系 建立 游戏之间的不同比较 而不是 深入研究 但现在我收到一条全新的错误消息
  • Coq案例分析和函数返回子集类型的重写

    我正在做一个关于使用子集类型编写经过认证的函数的简单练习 想法是先写一个前驱函数 pred forall n n nat n gt 0 m nat S m n 1 然后使用这个定义给定一个函数 pred2 forall n n nat n
  • 如何处理 Coq 中 Program Fixpoint 生成的非常大的项?

    我试图在 Coq 中定义并证明正确的函数 该函数可以有效地比较两个排序列表 由于它并不总是在结构较小的项上递归 第一个或第二个列表较小 Fixpoint不会接受它 所以我尝试使用Program Fixpoint反而 当尝试使用策略证明函数的
  • 没有可判定的相等性或排除中间值的鸽巢证明

    在软件基础中IndProp v https softwarefoundations cis upenn edu lf current IndProp html lab244一个人被要求证明鸽巢原理 并且可以使用排除中间 但有人提到这并不是绝
  • 我可以将 Coq 证明提取为 Haskell 函数吗?

    自从学了一点 Coq 以来 我就想学着写一个所谓的除法算法的 Coq 证明 它实际上是一个逻辑命题 forall n m nat exists q nat exists r nat n q m r 我最近利用我学到的知识完成了这项任务软件基
  • 证明依赖类型实例之间的相等性

    当尝试形式化对应于代数结构的类 例如所有幺半群的类 时 自然的设计是创建一个类型monoid a Type 作为对所有必需字段进行建模的产品类型 元素e a 一个操作员app a gt a gt a 证明幺半群定律得到满足等 在此过程中 我

随机推荐

  • 如何使用自动装配的 Spring Boot 监听多个队列?

    我是 Spring Boot 的新手 正在尝试它 目前我已经构建了一些应用程序 我希望能够通过队列相互通信 我目前有一个侦听器对象 可以从特定队列接收消息 Configuration public class Listener final
  • 最新R版本的dplyr汇总功能问题

    在我之前的 R 版本中从未发生过以下情况 mtcars gt dplyr group by carb gt dplyr summarise N sum am 1 Error in summarise impl data dots envir
  • 域组的 Windows 身份验证到 Oracle

    我知道可以使用 操作系统身份验证 来对 Oracle 数据库中的 Windows 用户进行身份验证 该过程基本上是将当前 Windows 用户 ID 传递给 Oracle 进行身份验证 问题是 是否可以在 Oracle 中对域组进行身份验证
  • WKWebView 和 NSURLProtocol 不起作用

    使用旧的 UIWebView 时 您可以通过实现自定义 NSURLProtocol 来捕获请求 我用它来处理需要身份验证的请求 我尝试了相同的代码 它不适用于新的 WKWebView 但我的协议类根本没有被调用 有人遇到同样的问题还是有更好
  • Tkinter filedialog.askdirectory() 找不到外部驱动器

    I have made some folder synchronization program in the last week that I wanted to primarily deploy to have an easy way t
  • Common Lisp 中的未绑定变量

    我是 Lisp 新手 正在阅读 ANSI Common Lisp 第 8 章中的文本生成器示例 我按照该示例并在 LET 变量 prec 的范围内定义了一个函数 see let prec defun see symb let pair as
  • JavaScript 中音频的波形可视化[重复]

    这个问题在这里已经有答案了 我正在尝试使用 JavaScript 显示音频文件的波形 但我什至不知道如何开始 我找到了音频数据API https wiki mozilla org Audio Data API Working Audio D
  • Hyperledger Fabric 中私有数据的历史

    有没有办法获取 Hyperledger Fabric 节点 SDK 中私有数据的历史记录 我尝试过使用getHistoryForKey key 它返回一个空对象 仅包含 done true 用于获取私有数据历史记录的 API 尚未实现 但计
  • Swift/https:NSURLSession/NSURLConnection HTTP 加载失败

    不幸的是 今天早上我的 XCode 更新到了版本 7 而我使用 http 开发的 iOS 应用程序现在需要 https 因此 根据许多教程 我配置了 MAMP 服务器 以便使用 https ssl 创建虚拟证书 现在我的 iOS 应用程序
  • 如何在不授予 Google 签名权限的情况下发送应用程序包?

    在米莱娜 尼科利奇的 Google Play 的新功能 https www youtube com watch v cMr b660Esw作为 Google 的一部分的演示文稿 android11发射 她说 随着我们不断改进 App Bun
  • 使用 Laravel 和 Passport 响应身份验证失败时返回状态代码 401?

    我正在配置 Laravel 项目以使用 Passport 令牌身份验证 一切似乎都正常 但是当auth api中间件失败 它以状态响应客户端200以及响应正文中的一堆 HTML 相反 我希望它以以下状态响应401 我在 Laravel Pa
  • 不变失败:您不应在 之外使用

    I use react router dom用于我的路由React应用 我的应用程序的一部分提取到另一个包中 依赖项列表如下所示 app dashboard package json dependencies app components
  • 您可以通过 Android studio 将 Android 应用程序作为 ARC 应用程序启动吗?

    我想知道是否有一种方法可以从 Android Studio 启动和 或构建 ARC 应用程序 而不必每次都手动使用 ARC 焊机 在开发过程中手动执行此操作可能非常麻烦 尤其是在发布过程中 您必须对同一应用程序的约 15 种不同风格执行相同
  • 从多个 SQL Server 表中选择 TOP 4 记录。使用vb.net

    我有大约 4 个不同的表 它们具有完全相同的列名 我想要做的是从所有这些按日期排序的表中选择前 4 条记录 因为日期是它们共享的列之一 我不断收到错误的语句 无论是语法问题还是不明确的记录等 本质上我的声明类似于 SELECT TOP 4
  • 如何在 AngularFire2 中获取 firebase.User

    我正在使用 AngularFire2 Ionic2 和 Firebase 身份验证 我在尝试获取当前用户时遇到问题 这对我有用 但不一致 有时它被填充 有时它为空 let user firebase User firebase auth c
  • 打开带有动态内容的窗口

    是否可以从 PHP 打开一个具有预定义内容的窗口 很明显 您可以从框架现有页面的 javascript 链接打开一个窗口 或者仅从引用现有页面的常规 a 标记执行 target blank 但我正在生成一些内容 并希望在新链接中打开该内容
  • 如何在命令行中从 .NET 程序集获取 IDL(或如何将 TLB 转换为 IDL)?

    我们有一个 NET 程序集 实际上是 Aspose Words 我们希望客户端能够从 COM 客户端轻松使用它 因此 我们随程序集提供了 TLB 以便客户端可以从 C 或 Delphi 等语言中使用它 而不必自己提取 TLB 我们还随程序集
  • 将所有对象从一个 Realm 复制到另一个 Realm

    我正在尝试添加使用领域将以前导出的数据库加载到手机应用程序中的功能 该数据库包含在一个 zip 文件中 我将其从电子邮件导入到应用程序中 将其提取 然后将领域文件写入应用程序本地存储 将其写入文件后 我将加载备份领域文件 查询对象 然后将它
  • SQLite3 Node.js JSON

    我正在使用sqlite3NPM 包 我想将 JSON 存储在我的数据库列之一中 据我所知 SQLite本身能够存储JSONhttps www sqlite org json1 html https www sqlite org json1
  • Coq 中的案例分析证明

    我试图证明关于以下函数的命题 Program Fixpoint division m nat n nat measure m nat match lt nat 0 n with false gt 0 true gt match leq na