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 不允许反转、析构等?

    When refine正在运行一个程序 我试图通过以下方式结束证明inversion on a False假设当目标是Type 这是我尝试做的证明的简化版本 Lemma strange1 forall T Type 0 gt 0 gt T
  • Coq 将不存在的语句转换为 forall 语句

    我是 Coq 的新手 这是我的问题 我有一个声明说 H forall x term exists y term P x y P y x 我猜它相当于 forall x y term P x y P y x gt false 但我可以使用哪种
  • Coq Proof Assistant 中依赖类型的问题

    考虑以下简单的表达语言 Inductive Exp Set EConst nat gt Exp EVar nat gt Exp EFun nat gt list Exp gt Exp 及其格式良好的谓词 Definition Env lis
  • 有没有办法禁用 Coq 中的特定符号?

    我希望在 Coqide 中 证明状态不使用某种符号 但仍使用所有其他符号 这可能吗 据我在文档中的理解 这是不可能的 您也许可以使用打开 关闭范围 但我不确定它是否有效 因为明确指出只要有可能 符号将用于打印
  • Coq - 在 if ... then ... else 中使用 Prop (True | False)

    我对 Coq 有点陌生 我正在尝试实现插入排序的通用版本 我正在实现一个以比较器作为参数的模块 该 Comparator 实现了比较运算符 如 is eq is le is neq 等 在插入排序中 为了插入 我必须比较输入列表中的两个元素
  • 仅数学证明助理

    大多数证明助手都是具有依赖类型的函数式编程语言 他们可以证明程序 算法 相反 我感兴趣的是最适合数学且仅适合数学 例如微积分 的证明助手 你能推荐一个吗 我听说过 Mizar 但我不喜欢源代码被关闭 但如果它最适合数学 我会使用它 Agda
  • 如何有效地查找 Coq 中定义标识符的位置?

    在大多数 IDE 或文本编辑器中 您可以右键单击某个术语 它会将您带到定义该术语的文件 CoqIDE好像没有这个 所以我一直在做coqdoc myfile v html 然后转到生成的 HTML 文档 但该文件中唯一可点击的术语是针对 Co
  • 伊莎贝尔证明加法的交换律

    我试图证明 Isabelle HOL 中自定义的交换律add功能 我设法证明了关联性 但我坚持这一点 的定义add fun add nat nat nat where add 0 n n add Suc m n Suc add m n 关联
  • coq 中的依赖模式匹配

    以下代码 当然不是完整的证明 尝试对依赖产品进行模式匹配 Record fail Set mkFail i nat f forall x x lt i gt nat Definition failomat forall m nat f fo
  • 如何查找 Coq 证明策略的定义或实现?

    我正在看this https github com coq coq blob cdfe69d6da6b32338ba74c9f599c74389089c9dd theories Numbers Natural Abstract NAdd v
  • 证明具有 n 个叶子的二叉树的高度至少为 log n

    我已经能够创建一个证明 显示树中的最大总节点数等于 n 2 h 1 1 并且从逻辑上我知道二叉树的高度是 log n 可以绘制它出来看看 但我很难构建一个正式的证明来证明一棵有 n 片叶子的树 至少 有 log n 我遇到或能够组合在一起的
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam
  • Prop 和 Type 的不同归纳原理

    我注意到 Coq 综合了关于 Prop 和 Type 等式的不同归纳原理 有人对此有解释吗 平等定义为 Inductive eq A Type x A A gt Prop eq refl x x 与之相关的归纳原理有以下类型 eq ind
  • 依赖类型的 Church 编码:从 Coq 到 Haskell

    在 Coq 中 我可以为长度为 n 的列表定义 Church 编码 Definition listn A Type nat gt Type fun m gt forall X nat gt Type X 0 gt forall m A gt
  • 可以在 Coq 的蕴涵中使用 destruct 吗?

    destruct可以用来分割and or在柯克 不过好像也可以用暗示 例如我想证明 P gt P Lemma test P P gt P Proof unfold not intro pffpf apply pffpf intro pff
  • 稳定的比较排序,时间复杂度为 O(n * log(n)),空间复杂度为 O(1)

    在经历的同时维基百科的排序算法列表 https secure wikimedia org wikipedia en wiki Sorting algorithm Comparison of algorithms我注意到没有稳定的比较排序 h
  • Coq 中 MSet 的使用示例

    MSets https coq inria fr library Coq MSets MSets html似乎是 OCaml 式有限集的最佳选择 可悲的是 我找不到示例用途 如何定义一个空的MSet或单身人士MSet 我怎样才能结合两个MS
  • 功能证明 (Haskell)

    我没能读懂 RWH 我命令没有人放弃Haskell 函数式编程的技巧 现在我对第 146 页上的这些功能证明很好奇 具体来说 我试图证明 8 5 1sum reverse xs sum xs 我可以做一些归纳证明 但后来我陷入困境 HYP
  • 我如何编写行为类似于“破坏...作为”的策略?

    在coq中 destruct https coq inria fr distrib current refman Reference Manual010 html hevea tactic65策略有一个接受 连接析取引入模式 的变体 该模式
  • 为什么较新的依赖类型语言没有采用 SSReflect 的方法?

    我在 Coq 的 SSReflect 扩展中发现了两个约定 它们似乎特别有用 但我还没有看到它们在较新的依赖类型语言 Lean Agda Idris 中得到广泛采用 首先 可能的谓词被表示为布尔返回函数而不是归纳定义的数据类型 默认情况下

随机推荐

  • 如何使用自动装配的 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